@import "./tokens.css"; /* ========================================================================== 청온 케어 (CHEONG-ON CARE · 淸溫) — 메인 스타일시트 SSOT 프리셋: clinical-sanitation + transparent-calculator + high-end-visual-design ========================================================================== */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; scroll-behavior: smooth; background-color: var(--surface); color: var(--ink); font-family: var(--font-body); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: hidden; } body { min-height: 100dvh; line-height: var(--leading-normal); overflow-x: hidden; background: var(--surface); color: var(--ink); } img { display: block; max-width: 100%; height: auto; } a { color: inherit; text-decoration: none; transition: color var(--dur-fast); } a:hover { color: var(--accent); } button, input, select, textarea { font: inherit; color: inherit; } button { cursor: pointer; border: none; background: none; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border-width: 0; } .mono { font-family: var(--font-mono); } .wrap { width: min(100% - 2 * var(--pad-inline), var(--container)); margin-inline: auto; } /* ── 접근성 스킵 링크 ── */ .skip-link { position: fixed; top: 1rem; left: 1rem; z-index: 1000; padding: 0.5rem 1rem; background: var(--surface-inverse); color: var(--ink-inverse); border-radius: var(--radius-sm); transform: translateY(-200%); transition: transform var(--dur-fast); text-decoration: none; font-weight: 500; } .skip-link:focus { transform: translateY(0); } /* ── 헤더 & 뷰 모드 스위처 (GNB SSOT) ── */ .site-head { position: sticky; top: 0; z-index: 100; background: rgba(248, 250, 249, 0.94); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-bottom: 1px solid var(--line); padding-block: var(--space-3); } .head-inner { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); min-width: 0; } .wordmark { display: inline-flex; align-items: center; gap: var(--space-2); font-size: var(--step-1); font-weight: 800; color: var(--ink); text-decoration: none; letter-spacing: -0.02em; white-space: nowrap; flex-shrink: 0; } .wordmark-badge { background: var(--accent); color: #fff; font-size: 11px; font-weight: 700; padding: 2px 6px; border-radius: var(--radius-xs); } .wordmark-han { font-size: var(--step--1); color: var(--accent); font-weight: 600; letter-spacing: 0.05em; } .nav { display: flex; align-items: center; gap: var(--space-5); list-style: none; } .nav a { text-decoration: none; color: var(--ink-muted); font-size: var(--step--1); font-weight: 500; transition: color var(--dur-fast); white-space: nowrap; } .nav a:hover, .nav a.active { color: var(--ink); } .head-actions { display: flex; align-items: center; gap: var(--space-2); flex-shrink: 0; min-width: 0; } .mode-toggle { display: inline-flex; background: var(--surface-subtle); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 2px; gap: 2px; } .mode-btn { padding: 4px 10px; border-radius: calc(var(--radius-sm) - 2px); font-size: 12px; font-weight: 600; color: var(--ink-muted); display: inline-flex; align-items: center; gap: 5px; transition: all var(--dur-fast); white-space: nowrap; } .mode-btn.is-active { background: var(--surface-raised); color: var(--ink); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06); } .mode-btn .badge-dot { width: 6px; height: 6px; border-radius: 50%; background: #10b981; } .head-actions .btn { display: inline-flex; align-items: center; justify-content: center; background: var(--accent); color: #fff; font-weight: 700; font-size: var(--step--1); padding: 6px 14px; border-radius: var(--radius-xs); transition: opacity var(--dur-fast); } .head-actions .btn:hover { opacity: 0.9; } /* ── 버튼 시스템 & 뱃지 ── */ .btn-primary { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); background: var(--accent); color: #ffffff; padding: 10px 20px; border-radius: var(--radius-sm); font-weight: 700; font-size: var(--step--1); text-decoration: none; white-space: nowrap; transition: transform var(--dur-fast), background var(--dur-fast); border: none; } .btn-primary:hover { background: var(--accent-hover); color: #ffffff; transform: translateY(-1px); } .btn-outline { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-2); background: transparent; color: var(--ink); border: 1px solid var(--line); padding: 10px 18px; border-radius: var(--radius-sm); font-weight: 600; font-size: var(--step--1); text-decoration: none; white-space: nowrap; transition: border-color var(--dur-fast), color var(--dur-fast); } .btn-outline:hover { border-color: var(--accent); color: var(--accent); } .eyebrow { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: var(--radius-xs); background: var(--accent-light); color: var(--accent); font-size: 11px; font-family: var(--font-mono); font-weight: 700; letter-spacing: 0.06em; margin-bottom: var(--space-3); text-transform: uppercase; } /* ── 히어로 섹션 ── */ .hero-section { padding-block: var(--space-7); position: relative; } .hero-grid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.95fr); gap: var(--space-7); align-items: center; } .hero-title { font-size: clamp(2.4rem, 1.8rem + 2.2vw, 3.8rem); font-weight: 800; line-height: 1.18; letter-spacing: -0.035em; color: var(--ink); margin-bottom: var(--space-4); text-wrap: balance; word-break: keep-all; } .hero-title em { font-style: normal; color: var(--accent); } .hero-desc { font-size: clamp(1.05rem, 0.98rem + 0.35vw, 1.2rem); color: var(--ink-muted); max-width: 48ch; line-height: 1.75; margin-bottom: var(--space-5); text-wrap: pretty; word-break: keep-all; } .hero-ctas { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; } .hero-trust { display: flex; align-items: center; gap: var(--space-2); font-size: var(--step--1); color: var(--ink-muted); } .hero-trust-stars { color: #f59e0b; font-size: 13px; } .hero-visual { position: relative; } .bezel-outer { background: rgba(15, 118, 110, 0.05); border: 1px solid var(--line); padding: 6px; border-radius: var(--radius-md); } .hero-frame { border-radius: calc(var(--radius-md) - 4px); overflow: hidden; border: 1px solid var(--line); box-shadow: 0 16px 40px -12px rgba(0, 0, 0, 0.08); background: #ffffff; } .hero-frame img { width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block; } .hero-stat-floating { position: absolute; bottom: -14px; left: 16px; background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 8px 14px; box-shadow: 0 8px 24px -4px rgba(0, 0, 0, 0.08); display: flex; align-items: baseline; gap: var(--space-2); } /* ── 투명 정찰제 실시간 견적 산정 섹션 ── */ .calculator-section { padding-block: var(--space-8); border-top: 1px solid var(--line); } .section-head { text-align: center; max-width: 680px; margin-inline: auto; margin-bottom: var(--space-6); } .section-title { font-size: clamp(1.8rem, 1.4rem + 1.2vw, 2.25rem); font-weight: 800; letter-spacing: -0.025em; color: var(--ink); margin-bottom: var(--space-2); text-wrap: balance; word-break: keep-all; } .section-sub { font-size: var(--step-0); color: var(--ink-muted); line-height: 1.6; text-wrap: pretty; word-break: keep-all; } .calc-grid { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.75fr); gap: var(--space-5); align-items: start; min-width: 0; } .calc-card { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-md); padding: var(--space-5); min-width: 0; } .form-group { margin-bottom: var(--space-4); } .form-label { display: block; font-size: var(--step--1); font-weight: 700; color: var(--ink); margin-bottom: var(--space-2); letter-spacing: -0.01em; } .type-selector { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2); min-width: 0; } .type-btn { padding: 10px 8px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface); color: var(--ink-muted); font-weight: 600; font-size: var(--step--1); text-align: center; transition: all var(--dur-fast); white-space: normal; word-break: keep-all; } .type-btn.is-active { border-color: var(--accent); background: var(--accent-light); color: var(--accent); } .slider-header { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: var(--space-2); } .slider-value { font-family: var(--font-mono); font-size: var(--step-1); font-weight: 700; color: var(--accent); } .range-slider { width: 100%; accent-color: var(--accent); height: 6px; cursor: pointer; } .addon-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2); min-width: 0; } .addon-label { display: flex; align-items: center; gap: var(--space-2); padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface); font-size: var(--step--1); color: var(--ink-muted); cursor: pointer; transition: all var(--dur-fast); } .addon-label:has(input:checked) { border-color: var(--accent); background: var(--accent-light); color: var(--ink); font-weight: 600; } /* 실시간 견적 영수증 요약 패널 */ .calc-summary { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-md); padding: var(--space-5); min-width: 0; } .summary-title { font-size: var(--step-1); font-weight: 700; margin-bottom: var(--space-4); padding-bottom: var(--space-2); border-bottom: 1px solid var(--line); } .summary-row { display: flex; justify-content: space-between; margin-bottom: var(--space-2); font-size: var(--step--1); color: var(--ink-muted); } .summary-row .mono { color: var(--ink); font-weight: 600; } .summary-total { display: flex; justify-content: space-between; align-items: baseline; padding-top: var(--space-3); border-top: 1px solid var(--line); margin-block: var(--space-4) var(--space-5); } .summary-total span:first-child { font-size: var(--step-0); font-weight: 700; } .summary-total .total-amount { font-family: var(--font-mono); font-size: var(--step-2); font-weight: 800; color: var(--accent); } .calc-submit { width: 100%; padding: 14px; background: var(--accent); color: #fff; font-weight: 700; font-size: var(--step-0); border-radius: var(--radius-sm); transition: background var(--dur-fast); } .calc-submit:hover { background: var(--accent-hover); } /* ── 6단계 위생 프로토콜 섹션 ── */ .protocol-section { padding-block: var(--space-8); border-top: 1px solid var(--line); } .protocol-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-4); } .protocol-card { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: var(--space-5); display: flex; flex-direction: column; gap: var(--space-2); } .protocol-num { font-family: var(--font-mono); font-size: 11px; font-weight: 700; color: var(--accent); letter-spacing: 0.06em; } .protocol-card h3 { font-size: var(--step-0); font-weight: 700; color: var(--ink); } .protocol-card p { font-size: var(--step--1); color: var(--ink-muted); line-height: 1.6; } /* ── 전문 장비 & Before/After 섹션 ── */ .equipment-section { padding-block: var(--space-8); border-top: 1px solid var(--line); background: var(--surface-card); } .equip-grid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--space-6); align-items: center; } .equip-specs { display: flex; flex-direction: column; gap: var(--space-3); } .spec-item { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 12px 16px; display: flex; justify-content: space-between; align-items: center; } .spec-key { font-size: var(--step--1); font-weight: 600; color: var(--ink-muted); } .spec-val { font-family: var(--font-mono); font-size: var(--step--1); font-weight: 700; color: var(--accent); } .ba-container { position: relative; border-radius: var(--radius-md); overflow: hidden; border: 1px solid var(--line); box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.08); } .ba-container img { width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block; } .ba-badge { position: absolute; bottom: 12px; padding: 4px 10px; border-radius: var(--radius-xs); font-size: 11px; font-family: var(--font-mono); font-weight: 700; } .ba-badge.before { left: 12px; background: rgba(15, 23, 42, 0.85); color: #fff; } .ba-badge.after { right: 12px; background: var(--accent); color: #fff; } /* =================================================================== 2. 관리자 관제 콘솔 뷰 (Admin Console View) =================================================================== */ .admin-view { display: none; padding-block: var(--space-6) var(--space-8); } [data-view="admin"] .client-view { display: none; } [data-view="admin"] .admin-view { display: block; } .admin-header { display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: var(--space-5); flex-wrap: wrap; gap: var(--space-3); } .admin-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-3); margin-bottom: var(--space-5); } .kpi-card { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: var(--space-4); } .kpi-label { font-size: 12px; color: var(--ink-muted); font-weight: 600; } .kpi-val { font-family: var(--font-mono); font-size: var(--step-2); font-weight: 800; color: var(--ink); margin-top: 4px; } .kpi-val.accent { color: var(--accent); } .admin-table-card { background: var(--surface-raised); border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; } .table-header { display: flex; justify-content: space-between; align-items: center; padding: 12px 16px; border-bottom: 1px solid var(--line); background: var(--surface-card); } .table-title { font-size: var(--step--1); font-weight: 700; color: var(--ink); } .table-filter-tabs { display: flex; gap: 4px; } .filter-tab { padding: 3px 8px; border-radius: var(--radius-xs); font-size: 11px; font-weight: 600; background: var(--surface); border: 1px solid var(--line); color: var(--ink-muted); } .filter-tab.is-active { background: var(--accent); color: #fff; border-color: var(--accent); } .admin-table { width: 100%; border-collapse: collapse; font-size: 13px; text-align: left; white-space: nowrap; } .admin-table th { background: var(--surface-card); padding: 10px 14px; font-weight: 600; color: var(--ink-muted); border-bottom: 1px solid var(--line); font-family: var(--font-mono); font-size: 12px; } .admin-table td { padding: 12px 14px; border-bottom: 1px solid var(--line); } .status-pill { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: var(--radius-xs); font-size: 11px; font-weight: 700; } .status-pill.new { background: #fef3c7; color: #92400e; } .status-pill.progress { background: #ccfbf1; color: #0f766e; } .status-pill.done { background: #dbeafe; color: #1e40af; } .action-btn { padding: 4px 10px; border: 1px solid var(--line); border-radius: var(--radius-xs); font-size: 12px; font-weight: 600; background: var(--surface); cursor: pointer; transition: all var(--dur-fast); } .action-btn:hover { border-color: var(--accent); color: var(--accent); } /* ── 32개 QC 모달 다이얼로그 ── */ .qc-dialog { position: fixed; inset: 0; margin: auto; width: min(90vw, 560px); background: #ffffff; border: 1px solid var(--line); border-radius: var(--radius-md); padding: var(--space-5); box-shadow: 0 24px 64px rgba(0, 0, 0, 0.15); outline: none; } .qc-dialog::backdrop { background: rgba(0, 0, 0, 0.5); backdrop-filter: blur(4px); } /* ── 푸터 (SSOT 정본) ── */ .site-foot { border-top: 1px solid var(--line); padding-block: var(--space-6); background: var(--surface); font-size: var(--step--1); color: var(--ink-muted); } .foot-inner { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--space-4); } /* ── 반응형 미디어 쿼리 ── */ @media (max-width: 860px) { .nav { display: none; } .hero-grid, .calc-grid, .equip-grid, .protocol-grid { grid-template-columns: 1fr; gap: var(--space-5); } .admin-kpis { grid-template-columns: 1fr 1fr; } } @media (max-width: 600px) { .type-selector, .addon-grid { grid-template-columns: 1fr; } .admin-kpis { grid-template-columns: 1fr; } .wordmark-han { display: none; } .mode-btn { padding: 3px 6px; font-size: 11px; } }