@import url("./tokens.css?v=20261006"); /* ──────────────────────────────────────────────────────── 리셋 — 필요한 것만 ──────────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; } * { margin: 0; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; font-synthesis-style: none; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } body { background: var(--surface); color: var(--ink); font-family: var(--font-body); font-size: var(--step-body); line-height: var(--leading-body); font-weight: var(--weight-regular); letter-spacing: var(--track-body); } img { display: block; max-width: 100%; height: auto; } /* 한글 조판(typography §6-5). keep-all 은 anywhere 와 반드시 짝이다 */ :lang(ko) { word-break: keep-all; overflow-wrap: anywhere; line-break: strict; } :lang(ko) :is(p, li, dd, dt, figcaption, address) { letter-spacing: 0; } :lang(ko) :is(h1, h2, h3) { line-height: var(--leading-tight); text-wrap: balance; } :lang(ko) :is(em, i, cite, address) { font-style: normal; } :lang(ko) a { text-underline-position: under; } p { text-wrap: pretty; } a { color: inherit; } /* 키보드 사용자를 위한 것. 어떤 이펙트보다 우선한다 */ :focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; } .skip { position: absolute; left: -9999px; top: 0; background: var(--ink); color: var(--surface); padding: var(--space-3) var(--space-4); border-radius: var(--radius); z-index: 100; } .skip:focus { left: var(--gutter); top: var(--space-3); } /* ──────────────────────────────────────────────────────── 타이포그래피 — 부리는 표제·꽃 이름, 고딕은 나머지 전부 ──────────────────────────────────────────────────────── */ h1, h2 { font-family: var(--font-display); font-weight: var(--weight-regular); letter-spacing: var(--track-display); } h1 { font-size: var(--step-title); } h2 { font-size: var(--step-h2); } .lead { font-size: var(--step-lead); color: var(--ink-muted); max-width: var(--measure); } .label { font-size: var(--step-small); font-weight: var(--weight-strong); color: var(--ink-muted); } h2 + p, h2 + .lead, h2 + .sub-text, h2 + address { margin-top: var(--space-4); } /* ── 링크 ── */ .link { display: inline-block; /* 터치 타깃 24px 이상(WCAG 2.5.8) — 줄 높이만으로는 19px 이었다 */ padding-block: var(--space-1); color: var(--accent); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 0.2em; transition: color var(--dur) var(--ease-out); } .link:hover { color: var(--accent-deep); } /* ── 버튼: 예약 하나. 잎 녹색 채움은 여기에만 ── */ .btn { display: inline-flex; align-items: center; justify-content: center; min-height: 3rem; padding: 0 var(--space-4); background: var(--accent); color: var(--on-accent); font-size: var(--step-body); font-weight: var(--weight-medium); text-decoration: none; border: 1px solid var(--accent); border-radius: var(--radius); white-space: nowrap; transition: background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out), color var(--dur) var(--ease-out); } .btn:hover { background: var(--accent-deep); border-color: var(--accent-deep); } .btn-quiet { background: transparent; color: var(--accent); border-color: var(--accent); } .btn-quiet:hover { background: var(--accent-soft); color: var(--accent-deep); } /* ──────────────────────────────────────────────────────── 레이아웃 ──────────────────────────────────────────────────────── */ .wrap { max-width: var(--container); margin-inline: auto; padding-inline: var(--gutter); } .section { padding-block: var(--space-8); } .section[id], .hero[id], .site-foot[id] { /* 하단 고정 바가 앵커 도착 지점을 가리지 않게(A12) */ scroll-margin-bottom: var(--action-bar-h); } /* ── 머리: 워드마크 + 행동 하나. 고정하지 않는다(화면 서너 개 길이) ── */ .site-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); padding-top: var(--space-4); } .wordmark { font-family: var(--font-display); font-size: 1.25rem; letter-spacing: 0.02em; white-space: nowrap; } /* ── 히어로: 격자가 주인 ─────────────────────────────── */ .hero { padding-top: var(--space-6); } .hero-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-5); padding-bottom: var(--space-4); border-bottom: 1px solid var(--line); } .hero-h { max-width: 24em; } .hero-facts { display: flex; gap: var(--space-5); flex-shrink: 0; } .hero-facts div { display: grid; gap: var(--space-1); } .hero-facts dt { font-size: var(--step-small); color: var(--ink-muted); } .hero-facts dd { font-weight: var(--weight-medium); font-variant-numeric: tabular-nums; } .flower-grid { list-style: none; padding: 0; margin-top: var(--space-5); display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-6) var(--space-5); } .cell { min-width: 0; } .name { margin-top: var(--space-3); font-size: var(--step-name); transition: color var(--dur) var(--ease-out); } .note { margin-top: var(--space-1); color: var(--ink-muted); } /* 아치 창. 원본은 사각으로 두고 마스크로만 자른다(images §2) */ .arch { position: relative; overflow: hidden; border-radius: var(--arch); aspect-ratio: var(--arch-ratio); background: var(--surface-deep); } .arch img { width: 100%; height: 100%; object-fit: cover; object-position: 50% 40%; transition: transform calc(var(--dur) * 2) var(--ease-out); } /* 아치 테두리. 크림 바탕 사진은 분홍 위에서 윗선이 사라져 1px 안쪽 선을 둔다 */ .arch::after { content: ""; position: absolute; inset: 0; border-radius: inherit; box-shadow: inset 0 0 0 1px var(--arch-ring); pointer-events: none; } /* 넓은 원본(작업대·손질)은 꽃 한 송이가 작다. object-view-box 로 그 송이만 창에 넣는다 — transform 확대는 320px 에서 이미지 박스가 뷰포트를 넘어 감사에 걸렸다(showcase-audit 실측). 미지원 엔진은 object-position 크롭으로 떨어진다. 원본 파일은 그대로다 */ .arch-dahlia img { object-position: 100% 25%; } .arch-scabiosa img { object-position: 100% 0%; } @supports (object-view-box: inset(0)) { .arch-dahlia img { object-view-box: inset(8% 2% 33.7% 63%); } .arch-scabiosa img { object-view-box: inset(0 0 43.75% 40%); } } .arch-empty { display: grid; place-items: center; } .leaf { width: 28%; height: auto; fill: var(--accent-soft); stroke: var(--accent); stroke-width: 1.5; } /* hover: 사진이 아치 안에서 조금 커지고 이름이 녹색으로 ── */ @media (hover: hover) { .cell:hover .arch img { transform: scale(1.04); } .cell:hover .name { color: var(--accent); } } .hero-foot { margin-top: var(--space-6); max-width: var(--measure); color: var(--ink-muted); } /* ── 등장: 첫 화면의 칸이 한 번 순서대로 떠오른다 ──────── 스크롤 리빌이 아니다 — 페이지 로드에 한 번뿐이고, 감소 모션이면 정지다. */ @media (prefers-reduced-motion: no-preference) { .cell { animation: rise var(--dur-enter) var(--ease-out) both; animation-delay: calc(var(--i, 0) * var(--stagger)); } .hero-head { animation: rise var(--dur-enter) var(--ease-out) both; } } @keyframes rise { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } } /* ── 목요일: 글 + 아치 작업실 ─────────────────────────── */ .two { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr); gap: var(--space-7); align-items: start; } .two-text > p + p { margin-top: var(--space-3); } .two-text p { max-width: var(--measure); } .two-photo { margin: 0; } .two-photo img { width: 100%; aspect-ratio: var(--arch-ratio); object-fit: cover; object-position: 18% 50%; border-radius: var(--arch); background: var(--surface-deep); } .two-photo figcaption { margin-top: var(--space-3); font-size: var(--step-small); color: var(--ink-muted); } .facts { margin-top: var(--space-5); display: grid; gap: var(--space-2); max-width: var(--measure); } .facts > div { display: grid; grid-template-columns: 8rem 1fr; gap: var(--space-3); padding-top: var(--space-2); border-top: 1px solid var(--line); } .facts dt { font-size: var(--step-small); color: var(--ink-muted); padding-top: 0.2rem; } .facts dd { font-variant-numeric: tabular-nums; } /* ── 구독: 한 단 어두운 분홍 띠 ─────────────────────── */ .band { background: var(--surface-deep); } .sub-inner { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--space-6); align-items: start; } .sub-inner h2 { max-width: 14em; } .sub-text { margin-top: 0; } .sub-text p + p, .sub-text p + .link { margin-top: var(--space-3); } .sub-text .link { display: inline-block; } /* ── 예약·문의 ──────────────────────────────────────── */ .contact h2 { max-width: 22em; } .contact-list { list-style: none; padding: 0; margin-top: var(--space-5); display: grid; gap: var(--space-2); max-width: var(--measure); } .contact-list li { display: grid; grid-template-columns: 8rem 1fr; gap: var(--space-3); align-items: baseline; padding-top: var(--space-2); border-top: 1px solid var(--line); } /* ── 푸터: 연락처·영업시간 카드 ────────────────────── */ .site-foot { padding-block: var(--space-6) var(--space-7); } .foot-card { background: var(--surface-card); border: 1px solid var(--line); border-radius: var(--radius); padding: var(--space-5); display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--space-6); } .foot-h { font-size: var(--step-name); } .foot-address { color: var(--ink-muted); } .foot-hours { display: grid; gap: var(--space-2); align-content: start; } .foot-hours > div { display: grid; grid-template-columns: 9rem 1fr; gap: var(--space-3); padding-top: var(--space-2); border-top: 1px solid var(--line); } .foot-hours dt { font-size: var(--step-small); color: var(--ink-muted); padding-top: 0.2rem; } .foot-hours dd { font-variant-numeric: tabular-nums; } .foot-mark { margin-top: var(--space-5); font-family: var(--font-display); font-size: var(--step-small); color: var(--ink-muted); } /* ── 모바일 하단 고정 행동 바 — 768px 이하에서만 ────── */ .action-bar { display: none; } /* ════════════════════════════════════════════════════════ 좁은 화면 ════════════════════════════════════════════════════════ */ @media (max-width: 1023px) { .two, .sub-inner, .foot-card { grid-template-columns: 1fr; gap: var(--space-5); } .two-photo { max-width: 28rem; } } @media (max-width: 767px) { html { /* 앵커 도착·포커스 스크롤이 고정 바 아래로 들어가지 않게(A12) */ scroll-padding-bottom: calc(var(--action-bar-h) + var(--safe-bottom)); } body { /* 하단 바가 마지막 내용을 가리지 않게 */ padding-bottom: calc(var(--action-bar-h) + var(--safe-bottom)); } .head-cta { display: none; /* 행동은 하단 바로 내려간다 */ } .hero { padding-top: var(--space-5); } .hero-head { flex-direction: column; align-items: flex-start; gap: var(--space-3); } .hero-facts { gap: var(--space-4); } /* 2열. 첫 화면에 두 점 이상 보이게 한다(layout §2-b) */ .flower-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-5) var(--space-3); margin-top: var(--space-4); } .name { margin-top: var(--space-2); } .facts > div, .contact-list li, .foot-hours > div { grid-template-columns: 1fr; gap: 0; } .foot-card { padding: var(--space-4); } .action-bar { position: fixed; inset-inline: 0; bottom: 0; z-index: 50; display: grid; grid-template-columns: 1fr auto; gap: var(--space-2); padding: var(--space-2) var(--space-3); padding-bottom: max(var(--space-2), var(--safe-bottom)); background: var(--surface); border-top: 1px solid var(--line); } .btn-bar { min-height: 3.25rem; } .btn-bar-phone { min-height: 3.25rem; min-width: 4.5rem; } } /* ── 초광폭: 격자는 컨테이너 안에서만 넓어진다(layout §4-d) ── */ @media (min-width: 1600px) { .flower-grid { gap: var(--space-7) var(--space-6); } }