/* ========================================================================== 새벽청과 — 메인 스타일시트 (2026-10-06 재작업) 시세표가 이 페이지의 주인이다. 바탕은 새벽빛 한 가지(#e4e8f4)이고, 표·패널만 한 단계 밝은 면(--surface-2)에 올린다. 어두운 띠는 없다. 섹션 사이의 전환은 색이 아니라 간격과 선, 가장자리로 흘리는 사진이 만든다. 토큰은 tokens.css 한 곳에만 있다. 여기서 --surface 같은 토큰을 재정의하지 않는다. ========================================================================== */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; scroll-behavior: smooth; background: var(--surface); font-synthesis-style: none; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { min-height: 100dvh; font-family: var(--font-body); font-size: var(--step-0); line-height: var(--leading-normal); background: var(--surface); color: var(--ink); word-break: keep-all; overflow-wrap: anywhere; overflow-x: clip; } img { display: block; max-width: 100%; } button, input, select, textarea { font: inherit; color: inherit; } a { color: inherit; text-underline-position: under; } h1, h2, h3, h4 { font-weight: 700; line-height: var(--leading-tight); letter-spacing: 0; text-wrap: balance; } /* 표제·섹션 제목·낙찰가 숫자만 Gasoek One. 본문·표 셀은 전부 Noto Sans KR */ h1, h2, .wordmark, .price, .lot-price-value, .order-total, .foot-name { font-family: var(--font-display); font-weight: 400; } strong { font-weight: 700; color: var(--ink); } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; } .wrap { width: min(100% - 2 * var(--pad-inline), var(--container)); margin-inline: auto; } @media (min-width: 120rem) { .wrap { width: min(100% - 2 * var(--pad-inline), var(--container-wide)); } } /* ── 접근성 ─────────────────────────────────────────────────────── */ .skip-link { position: fixed; top: var(--space-3); left: var(--space-3); z-index: 200; padding: var(--space-2) var(--space-3); border-radius: var(--radius); background: var(--ink); color: var(--surface); text-decoration: none; transform: translateY(-250%); transition: transform var(--dur-quick) var(--ease); } .skip-link:focus-visible { transform: translateY(0); } :where(a, button, input, select, [tabindex]):focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; } .placeholder { color: var(--ink-faint); border-bottom: 1px dotted var(--line-strong); } /* ── 머리줄 — 상호와 날짜 도장. 내비가 아니다. 고정하지 않는다 ─── */ .site-head { border-bottom: 1px solid var(--line); } .head-inner { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); min-height: 60px; padding-block: var(--space-2); } .wordmark { display: inline-flex; align-items: center; min-height: 44px; font-size: var(--step-2); text-decoration: none; white-space: nowrap; line-height: 1; } .hero-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); font-size: var(--step--1); color: var(--ink-muted); font-variant-numeric: tabular-nums; } .hero-meta time { color: var(--ink); font-weight: 500; } /* ── 1 · 시세표 ─────────────────────────────────────────────────── */ .board-section > .wrap { padding-block: var(--space-5) var(--space-7); } .board-head { display: grid; gap: var(--space-2) var(--space-6); align-items: end; } @media (min-width: 56rem) { .board-head { grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); } } /* 표제는 작다 — 낙찰가 숫자(--num-lg)보다 작게 둔다 */ .board-section h1 { font-size: var(--step-2); line-height: 1.2; } .board-lead { font-size: var(--step--1); color: var(--ink-muted); max-width: var(--measure); line-height: var(--leading-normal); } /* 탭·세그먼트 — 같은 표를 다른 축으로 본다. 페이지 이동이 아니다 */ .tabs { display: inline-flex; margin-top: var(--space-4); border: 1px solid var(--line-strong); border-radius: var(--radius); background: var(--surface-2); padding: 2px; } .tab { min-height: 40px; padding-inline: var(--space-4); border: 0; border-radius: calc(var(--radius) - 1px); background: transparent; color: var(--ink-muted); font-size: var(--step--1); font-weight: 500; cursor: pointer; transition: background-color var(--dur-quick) var(--ease), color var(--dur-quick) var(--ease); } .tab[aria-selected="true"] { background: var(--accent); color: var(--accent-ink); } .tab:not([aria-selected="true"]):hover { color: var(--ink); } .tab:focus-visible { outline-offset: 2px; } .panel { margin-top: var(--space-3); border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface-2); } /* position: relative — 셀 안의 sr-only(absolute)가 스크롤 컨테이너 밖으로 나가 문서 폭을 늘리지 않게 한다(실측: 320px에서 +223px 가로 오버플로) */ .board-scroll { position: relative; overflow-x: auto; } .board { width: 100%; border-collapse: collapse; text-align: left; font-size: var(--step--1); font-variant-numeric: tabular-nums; } .board th, .board td { padding: var(--space-3) var(--space-3); border-bottom: 1px solid var(--line); vertical-align: middle; } .board thead th { padding-block: var(--space-2); background: var(--surface-3); color: var(--ink-muted); font-weight: 500; white-space: nowrap; } .board thead th:first-child { border-top-left-radius: var(--radius); } .board thead th:last-child { border-top-right-radius: var(--radius); } .board tbody tr:last-child th, .board tbody tr:last-child td { border-bottom: 0; } .board tbody th { font-size: var(--step-1); font-weight: 500; white-space: nowrap; } .board td { color: var(--ink-muted); } .board-select { min-height: 40px; margin-inline: calc(-1 * var(--space-2)); padding-inline: var(--space-2); border: 0; border-radius: var(--radius); background: transparent; color: inherit; font-weight: 500; cursor: pointer; text-align: left; } .board tbody tr:has(.board-select[aria-pressed="true"]) { background: var(--accent-wash); box-shadow: inset 3px 0 var(--accent); } .board-select[aria-pressed="true"] { color: var(--accent); font-weight: 700; } .c-num { text-align: right; white-space: nowrap; } .unit { margin-left: 2px; font-size: 0.85em; } /* 낙찰가 — 이 페이지에서 가장 큰 글자. 열 폭은 고정해 카운터가 돌 때 흔들리지 않게 한다 */ .col-price { width: 9.5rem; } .price { display: inline-block; min-width: 6ch; color: var(--ink); font-size: var(--num-lg); line-height: 1.1; letter-spacing: -0.01em; } .board-dates .price { font-size: var(--step-2); } /* 등락은 기호가 먼저다. 색은 상승에만 보조로 쓴다 */ .delta { color: var(--ink-faint); } .delta.up { color: var(--accent); font-weight: 500; } .delta.down { color: var(--ink-muted); font-weight: 500; } .blank { color: var(--ink-faint); } /* 선택 로트 — 표 아래에서 고른 행의 값을 다시 읽는다. 좁은 화면에서 숨긴 열이 여기서 보인다 */ .lot-inspector { display: grid; gap: var(--space-4) var(--space-6); padding: var(--space-4) var(--space-3); border-top: 2px solid var(--line-strong); } @media (min-width: 56rem) { .lot-inspector { grid-template-columns: minmax(11rem, 1fr) minmax(0, 2.2fr) auto; align-items: start; } } .lot-label, .lot-spec dt, .lot-price-label { font-size: var(--step--1); color: var(--ink-faint); } .lot-name { margin-top: var(--space-1); font-size: var(--step-2); font-weight: 700; line-height: 1.2; } .lot-origin { color: var(--ink-muted); font-size: var(--step--1); } .lot-spec { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3); } @media (min-width: 56rem) { .lot-spec { grid-template-columns: 1.5fr 1fr 1fr 1fr; } } .lot-spec > div { min-width: 0; padding-left: var(--space-3); border-left: 1px solid var(--line); } .lot-spec dd { margin-top: var(--space-1); color: var(--ink); font-size: var(--step-0); font-variant-numeric: tabular-nums; } .lot-price { display: grid; gap: var(--space-1); text-align: right; } .lot-price-value { font-size: var(--num-xl); line-height: 1; letter-spacing: -0.01em; font-variant-numeric: tabular-nums; } .board-note, .board-notes { margin-top: var(--space-4); font-size: var(--step--1); color: var(--ink-muted); line-height: var(--leading-loose); max-width: 44em; } .board-note { padding: 0 var(--space-3) var(--space-3); margin-top: var(--space-3); } .board-notes { list-style: none; display: grid; gap: var(--space-2); } .board-notes li { position: relative; padding-left: var(--space-4); } .board-notes li::before { content: ""; position: absolute; left: 0; top: 0.75em; width: var(--space-3); height: 1px; background: var(--line-strong); } /* ── 섹션 공통 — 띠가 아니라 선 하나와 간격으로 나눈다 ─────────── */ .section { border-top: 1px solid var(--line); padding-block: var(--space-8); } .section h2 { font-size: var(--step-3); line-height: 1.25; max-width: 24em; } .section h3 { font-size: var(--step-1); font-weight: 700; max-width: 34em; } .lead { max-width: var(--measure); color: var(--ink-muted); font-size: var(--step-1); line-height: var(--leading-loose); } /* 흘림 격자 — 가운데 두 칸은 .wrap 과 같은 선에 서고, 바깥 두 칸이 화면 가장자리까지 간다 */ .bleed-row { display: grid; grid-template-columns: [full-start] minmax(var(--pad-inline), 1fr) [wrap-start] minmax(0, calc(var(--container) / 2)) [mid] minmax(0, calc(var(--container) / 2)) [wrap-end] minmax(var(--pad-inline), 1fr) [full-end]; align-items: center; column-gap: 0; row-gap: var(--space-4); } @media (min-width: 120rem) { .bleed-row { grid-template-columns: [full-start] minmax(var(--pad-inline), 1fr) [wrap-start] minmax(0, calc(var(--container-wide) / 2)) [mid] minmax(0, calc(var(--container-wide) / 2)) [wrap-end] minmax(var(--pad-inline), 1fr) [full-end]; } } .bleed { grid-row: 1; min-width: 0; } .bleed img { width: 100%; height: auto; aspect-ratio: 16 / 10; object-fit: cover; background: var(--surface-3); } /* 세로 원본(포도)은 가로 띠로 잘라 쓴다 — 4:5 그대로 두면 720px 폭에서 900px 높이가 된다(실측) */ .bleed-portrait img { aspect-ratio: 5 / 4; object-position: 50% 45%; } .bleed-left { grid-column: full-start / mid; } .bleed-right { grid-column: mid / full-end; } .bleed-body { grid-row: 1; min-width: 0; } .bleed-left + .bleed-body { grid-column: mid / wrap-end; padding-left: clamp(var(--space-4), 4vw, var(--space-7)); } .bleed-right + .bleed-body { grid-column: wrap-start / mid; padding-right: clamp(var(--space-4), 4vw, var(--space-7)); } .bleed figcaption { padding: var(--space-2) var(--pad-inline) 0; font-size: var(--step--1); color: var(--ink-faint); } @media (max-width: 55.99rem) { .bleed-row { row-gap: var(--space-3); } .bleed, .bleed-left, .bleed-right { grid-column: full-start / full-end; grid-row: auto; } .bleed img, .bleed-portrait img { aspect-ratio: 16 / 9; } .bleed-body, .bleed-left + .bleed-body, .bleed-right + .bleed-body { grid-column: wrap-start / wrap-end; grid-row: auto; padding: 0; } } /* ── 2 · 읽는 법 + 유통 단계 ───────────────────────────────────── */ .section-grade { padding-top: 0; border-top: 0; } .section-grade .bleed-row { align-items: start; } .section-grade .bleed-body { padding-top: var(--space-8); } @media (max-width: 55.99rem) { .section-grade .bleed-body { padding-top: 0; } } .terms { margin-top: var(--space-5); border-top: 1px solid var(--line-strong); } .terms > div { padding-block: var(--space-4); border-bottom: 1px solid var(--line); } .terms dt { display: flex; align-items: baseline; gap: var(--space-3); flex-wrap: wrap; font-size: var(--step-1); font-weight: 700; } .term-en { font-size: var(--step--1); font-weight: 400; color: var(--ink-faint); } .terms dd { margin-top: var(--space-2); color: var(--ink-muted); max-width: 32em; line-height: var(--leading-loose); } .route-wrap { padding-top: var(--space-7); } .route { margin-top: var(--space-5); list-style: none; counter-reset: step; display: grid; gap: var(--space-4); } @media (min-width: 56rem) { .route { grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--space-4); } } .route li { counter-increment: step; padding-top: var(--space-3); border-top: 2px solid var(--line-strong); } .route li::before { content: counter(step, decimal-leading-zero); display: block; font-size: var(--step--1); color: var(--ink-faint); font-variant-numeric: tabular-nums; } .route h4 { margin-top: var(--space-1); font-size: var(--step-0); } .route li > p { margin-top: var(--space-2); color: var(--ink-muted); font-size: var(--step--1); line-height: var(--leading-loose); } /* 다섯 중 하나만 강조해야 강조가 된다 */ .route-here { border-top-color: var(--accent); } .route-here::before, .route-here h4 { color: var(--accent); } /* ── 3 · 오늘 입고 + 제철 ──────────────────────────────────────── */ .section-today > .wrap:first-child { padding-bottom: var(--space-5); } .bleed-figure + .bleed-figure { margin-top: var(--space-6); } .card-name { display: flex; align-items: baseline; gap: var(--space-3); flex-wrap: wrap; font-size: var(--step-2); font-weight: 700; line-height: 1.2; } .card-origin { font-size: var(--step--1); font-weight: 400; color: var(--ink-faint); } .card-spec { margin-top: var(--space-3); display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-4); padding-block: var(--space-2); border-block: 1px solid var(--line); font-size: var(--step--1); font-variant-numeric: tabular-nums; } .card-spec > div { display: flex; gap: var(--space-2); } .card-spec dt { color: var(--ink-faint); } .card-note { margin-top: var(--space-3); color: var(--ink-muted); line-height: var(--leading-loose); max-width: 30em; } .season-wrap { padding-top: var(--space-8); } .season-control { margin-top: var(--space-4); display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); padding-bottom: var(--space-3); border-bottom: 1px solid var(--line-strong); } .season-buttons { display: flex; gap: var(--space-2); } .season-buttons button { min-height: 40px; padding-inline: var(--space-3); border: 1px solid var(--line-strong); border-radius: var(--radius); background: var(--surface-2); color: var(--ink-muted); cursor: pointer; font-size: var(--step--1); transition: color var(--dur-quick) var(--ease), border-color var(--dur-quick) var(--ease); } .season-buttons button:hover { color: var(--ink); border-color: var(--accent); } .season-status { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-3); color: var(--ink-muted); font-size: var(--step--1); text-align: right; } .season-status output { color: var(--accent); font-weight: 700; } .season-scroll { position: relative; margin-top: var(--space-3); overflow-x: auto; } .season { width: 100%; min-width: 34rem; border-collapse: collapse; font-size: var(--step--1); text-align: center; font-variant-numeric: tabular-nums; } .season th, .season td { border: 1px solid var(--line); padding: var(--space-2) var(--space-1); } .season thead th { color: var(--ink-faint); font-weight: 500; border-bottom: 1px solid var(--line-strong); } .season tbody th { text-align: left; padding-inline: var(--space-2) var(--space-3); border-left: 0; white-space: nowrap; font-weight: 500; } .season .season-item { text-align: left; width: 6rem; padding-inline: var(--space-2); } .season td.on { background: var(--ink-muted); } /* 이번 달 — 배경 대신 테두리로 표시한다. 칸이 찬 것과 이번 달이 겹쳐도 둘 다 읽혀야 한다 */ .season .is-focus { border-inline: 2px solid var(--accent); } .season thead .is-focus { color: var(--accent); border-top: 2px solid var(--accent); } .season-note { margin-top: var(--space-4); font-size: var(--step--1); color: var(--ink-faint); line-height: var(--leading-loose); max-width: var(--measure); } /* ── 4 · 납품 + 계산 ───────────────────────────────────────────── */ .ws-grid { margin-top: var(--space-5); display: grid; gap: var(--space-6); } @media (min-width: 56rem) { .ws-grid { grid-template-columns: minmax(0, 6fr) minmax(0, 5fr); gap: var(--space-7); align-items: start; } } .ws-rows { margin-top: var(--space-5); border-top: 1px solid var(--line-strong); } .ws-rows > div { display: grid; gap: var(--space-1) var(--space-4); padding-block: var(--space-3); border-bottom: 1px solid var(--line); } @media (min-width: 40rem) { .ws-rows > div { grid-template-columns: 6rem 1fr; } } .ws-rows dt { font-size: var(--step--1); color: var(--ink-faint); } .ws-rows dd { color: var(--ink-muted); line-height: var(--leading-loose); } .order-draft { padding: var(--space-4); border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface-2); } .order-draft h3 { font-size: var(--step-1); } .order-controls { margin-top: var(--space-4); display: grid; grid-template-columns: minmax(0, 3fr) minmax(7rem, 1fr); gap: var(--space-3); } .order-controls label { display: grid; gap: var(--space-2); color: var(--ink-faint); font-size: var(--step--1); } .order-controls select, .order-controls input { min-width: 0; min-height: 44px; padding-inline: var(--space-3); border: 1px solid var(--line-strong); border-radius: var(--radius); background: var(--surface); color: var(--ink); } .order-summary { margin-top: var(--space-4); display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-3); align-items: end; padding-block: var(--space-3); border-block: 1px solid var(--line); } .order-summary dt, .order-fine, .order-status { color: var(--ink-faint); font-size: var(--step--1); } .order-summary dd { margin-top: var(--space-1); color: var(--ink); font-variant-numeric: tabular-nums; } .order-summary > div:last-child { text-align: right; } .order-total { font-size: var(--num-lg); line-height: 1.1; letter-spacing: -0.01em; } .order-fine { margin-top: var(--space-3); line-height: var(--leading-loose); } .order-actions { margin-top: var(--space-4); display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-3); } .order-status { min-height: 1.7em; color: var(--ink-muted); } .btn { display: inline-block; min-height: 44px; padding: var(--space-2) var(--space-5); border: 0; border-radius: var(--radius); background: var(--accent); color: var(--accent-ink); font-weight: 700; text-decoration: none; white-space: nowrap; cursor: pointer; transition: background-color var(--dur-quick) var(--ease); } .btn:hover { background: var(--accent-hover); } /* ── 푸터 — 연락처·영업시간 카드 ──────────────────────────────── */ .site-foot { border-top: 1px solid var(--line); } .site-foot > .wrap { padding-block: var(--space-7) var(--space-6); } .foot-card { display: grid; gap: var(--space-5); padding: var(--space-5); border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface-2); } @media (min-width: 56rem) { .foot-card { grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: var(--space-7); } } .foot-name { font-size: var(--step-3); line-height: 1; } .foot-line { margin-top: var(--space-3); color: var(--ink-muted); max-width: 20em; } .foot-rows { display: grid; grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr)); gap: var(--space-4) var(--space-4); } .foot-rows > div { padding-left: var(--space-3); border-left: 1px solid var(--line); } .foot-rows dt { font-size: var(--step--1); color: var(--ink-faint); } .foot-rows dd { margin-top: var(--space-1); color: var(--ink); line-height: 1.6; font-variant-numeric: tabular-nums; } .foot-fine { margin-top: var(--space-4); font-size: var(--step--1); color: var(--ink-faint); line-height: var(--leading-loose); max-width: 48em; } /* ── 좁은 화면 ──────────────────────────────────────────────────── */ @media (max-width: 45rem) { .head-inner { flex-wrap: wrap; } .tabs { display: flex; width: 100%; } .tab { flex: 1; min-height: 44px; } /* 표는 일곱 칸이라 좁은 화면에서 다 못 보인다. 비교에 쓰는 열(품목·등급·낙찰가·전일 대비)만 남기고 산지·당도·규격은 선택 로트에서 읽게 한다(component-systems §11-5 열 우선순위) */ .board .col-origin, .board .col-pack, .board .col-brix { display: none; } .board th, .board td { padding-inline: var(--space-2); } .board tbody th { font-size: var(--step-0); } .board-select { min-height: 44px; } .col-price { width: auto; } .price { font-size: 1.5rem; } .board-dates .price { font-size: var(--step-1); } .lot-inspector { padding-inline: var(--space-2); } .lot-price { text-align: left; } .order-controls, .order-summary { grid-template-columns: 1fr; } .order-summary > div:last-child { text-align: left; } .season-control { align-items: flex-start; flex-direction: column; } .season-buttons button { min-height: 44px; } .season-status { text-align: left; } .foot-card { padding: var(--space-4); } } @media (max-width: 22rem) { .board .col-grade { display: none; } .price { font-size: 1.375rem; } } /* ── 모션을 줄이는 설정 — 카운터는 스크립트가 건너뛴다 ─────────── */ @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } *, *::before, *::after { transition-duration: 0.01ms !important; } } /* ── 인쇄 — 시세표는 종이에서도 표여야 한다 ────────────────────── */ @media print { .skip-link, .tabs, .btn, .season-control, .order-controls, .order-actions, .bleed { display: none; } .panel[hidden] { display: block; } html, body, .panel, .order-draft, .foot-card { background: Canvas; color: CanvasText; } .board { break-inside: avoid; } }