/* ========================================================================== 오버톤 사운드랩 — 비대칭 콜라주 한 장. 파형·듀오톤 사진·수치 조각이 크기 차를 두고 겹치고, 표제가 그 위를 지난다. 내비는 없고, 푸터는 워드마크 한 줄이다. 토큰은 tokens.css 한 곳에만 있다. 이 파일에는 색·radius 리터럴을 쓰지 않는다. ========================================================================== */ *, *::before, *::after { box-sizing: border-box; } * { margin: 0; } html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; background: var(--surface); color-scheme: dark; 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-weight: var(--weight-body); font-size: var(--step-0); line-height: var(--leading-body); -webkit-font-smoothing: antialiased; } /* ── 한글 조판 정본 ──────────────────────────────────────────────────── */ :lang(ko) { word-break: keep-all; overflow-wrap: anywhere; line-break: strict; } :where(:lang(ko)) :where(p, li, dd, dt, figcaption) { line-height: var(--leading-body); letter-spacing: 0; text-wrap: pretty; } :where(:lang(ko)) :where(h1, h2, h3) { line-height: var(--leading-heading); text-wrap: balance; } :lang(ko) :is(em, i, cite, dfn, address) { font-style: normal; } :lang(ko) a { text-underline-position: under; } :where(h1, h2, h3) { font-weight: var(--weight-strong); letter-spacing: -0.01em; } h3 { font-size: var(--step-2); } a { color: inherit; } .num { font-variant-numeric: tabular-nums; } :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); z-index: 100; } .skip:focus { left: 0; } .wrap { width: min(100% - 2 * var(--pad-inline), var(--container)); margin-inline: auto; } /* ── 히어로 머리 — 브랜드 표기와 행동 하나. 내비 없음 ────────────────── */ .hero-head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-4); padding-block: var(--space-4); } .brand { font-size: var(--step-1); font-weight: var(--weight-strong); letter-spacing: -0.01em; white-space: nowrap; } .hero-link { display: inline-flex; align-items: center; min-height: 2.75rem; padding-inline: var(--space-2); font-size: var(--step--1); font-weight: var(--weight-strong); color: var(--ink-muted); text-decoration: none; border-bottom: var(--border) solid var(--line-strong); transition: color var(--dur-quick) var(--ease-soft), border-color var(--dur-quick) var(--ease-soft); } .hero-link:hover { color: var(--accent); border-color: var(--accent); } /* ── 콜라주 — 12열 격자 위에서 세 조각과 표제가 겹친다 ───────────────── */ .collage { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); grid-template-rows: repeat(10, minmax(0, 1fr)); height: clamp(34rem, 78vh, 46rem); margin-top: var(--space-3); margin-bottom: var(--space-7); } .hero-h { grid-column: 1 / 11; grid-row: 3 / 6; align-self: center; z-index: 3; font-family: var(--font-display); font-weight: var(--weight-body); font-size: var(--step-hero); line-height: var(--leading-tight); letter-spacing: 0; max-width: 14em; text-shadow: 0 0 0.35rem rgb(var(--surface-rgb) / 0.85); } .piece { position: relative; min-width: 0; min-height: 0; } .piece-tag { position: absolute; left: var(--space-3); bottom: var(--space-2); font-size: var(--step--1); color: var(--ink-faint); white-space: nowrap; line-height: 1.5; } /* 조각 1 — 파형(가장 큰 조각). 오른쪽 위. */ .piece-wave { grid-column: 5 / 13; grid-row: 1 / 7; z-index: 1; background: var(--surface-raised); border: var(--border) solid var(--line); } .piece-wave .piece-tag { left: auto; right: var(--space-3); bottom: auto; top: var(--space-2); } .wave { display: block; width: 100%; height: 100%; } /* 조각 2 — 듀오톤 사진(중간). 왼쪽 아래, 파형 왼쪽 아래 모서리를 덮는다. */ .piece-photo { grid-column: 1 / 7; grid-row: 6 / 11; z-index: 2; margin-top: calc(-1 * var(--space-5)); } .duotone { position: relative; isolation: isolate; height: 100%; background: var(--surface-sunken); overflow: hidden; } .duotone img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: 18% 50%; filter: grayscale(1) contrast(1.2) brightness(1.1); mix-blend-mode: screen; } .duotone::after { content: ""; position: absolute; inset: 0; background: var(--accent); mix-blend-mode: multiply; pointer-events: none; } .piece-photo .piece-tag { left: auto; right: 0; bottom: auto; top: 100%; padding-top: var(--space-2); } /* 조각 3 — 수치(가장 작은 조각). 로즈 면 위 어두운 숫자. */ .piece-figures { grid-column: 7 / 12; grid-row: 7 / 11; z-index: 2; display: grid; grid-template-columns: repeat(auto-fit, minmax(10rem, 1fr)); gap: var(--space-3) var(--space-4); align-content: center; padding: var(--space-4); background: var(--accent); color: var(--accent-on); } .figure dt { font-size: var(--step--1); font-weight: var(--weight-strong); line-height: 1.5; } .figure dd { font-size: var(--step--1); font-weight: var(--weight-strong); line-height: 1.3; } .figure .num { display: inline-block; margin-right: 0.1em; white-space: nowrap; font-family: var(--font-display); font-size: var(--step-figure); font-weight: var(--weight-body); line-height: 1.05; letter-spacing: 0; } /* ── 섹션 공통 ────────────────────────────────────────────────────────── */ .section { padding-block: var(--space-8); } .section-h { font-family: var(--font-display); font-weight: var(--weight-body); font-size: var(--step-3); letter-spacing: 0; max-width: 22em; } .section-lead { margin-top: var(--space-3); max-width: var(--measure); color: var(--ink-muted); } /* ── 작업 네 건 — 연도 · 본문 · 조건 세 열 ──────────────────────────── */ .works { border-top: var(--border) solid var(--line); } .archive { list-style: none; padding: 0; margin-top: var(--space-6); border-top: var(--border) solid var(--line); } .work { display: grid; grid-template-columns: minmax(5rem, 0.2fr) minmax(0, 0.55fr) minmax(10rem, 0.25fr); column-gap: var(--space-5); align-items: start; padding-block: clamp(1.5rem, 3vw, 2.75rem); border-bottom: var(--border) solid var(--line); } .work-year { font-family: var(--font-display); font-size: var(--step-2); line-height: 1.3; letter-spacing: 0; color: var(--accent); font-variant-numeric: tabular-nums; } .work-body { min-width: 0; } .work-body p { margin-top: var(--space-2); max-width: var(--measure); color: var(--ink-muted); } .work-meta { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: var(--space-2); justify-self: end; font-size: var(--step--1); font-weight: var(--weight-strong); font-variant-numeric: tabular-nums; color: var(--ink-muted); } .work-meta li { padding: var(--space-1) var(--space-2); border: var(--border) solid var(--line-strong); white-space: nowrap; line-height: 1.5; } /* ── 작업 방식 — 한 문장이 가장 큰 목소리다 ─────────────────────────── */ .method { background: var(--surface-raised); border-block: var(--border) solid var(--line); } .method-grid { display: grid; gap: var(--space-5); } .method-h { font-family: var(--font-display); font-weight: var(--weight-body); font-size: var(--step-manifesto); line-height: 1.12; letter-spacing: 0; } .method-note { max-width: var(--measure); margin-left: min(42%, 34rem); /* 표제 아래에서 한 번 더 어긋난 여백 */ padding-top: var(--space-4); border-top: var(--border) solid var(--accent); color: var(--ink-muted); } /* ── 마퀴 — 흐르는 공간 목록. 상자 자체가 가로 스크롤 영역이라 키보드로도 끝까지 간다 ── */ .marquee { overflow-x: auto; overflow-y: hidden; scrollbar-width: none; padding-block: var(--space-4); border-bottom: var(--border) solid var(--line); } .marquee::-webkit-scrollbar { display: none; } .marquee-track { list-style: none; padding: 0; display: flex; width: max-content; animation: marquee var(--marquee-duration) linear infinite; } .marquee-track li { padding-right: var(--space-8); font-family: var(--font-display); font-size: var(--step-3); line-height: 1.2; letter-spacing: 0; color: var(--ink-faint); white-space: nowrap; } .marquee:hover .marquee-track, .marquee:focus-visible .marquee-track { animation-play-state: paused; } @keyframes marquee { to { transform: translateX(-50%); } } @media (prefers-reduced-motion: reduce) { .marquee-track { width: 100%; flex-wrap: wrap; gap: var(--space-2) 0; animation: none; } .marquee-track li[aria-hidden] { display: none; } } /* ── 푸터 — 워드마크 한 줄 ───────────────────────────────────────────── */ .site-foot { padding-top: var(--space-6); overflow: hidden; } .foot-row { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-3) var(--space-5); flex-wrap: wrap; font-size: var(--step--1); color: var(--ink-muted); } .foot-note { max-width: var(--measure); } .foot-top { display: inline-flex; align-items: center; min-height: 2.75rem; font-weight: var(--weight-strong); text-decoration: none; border-bottom: var(--border) solid var(--line-strong); transition: color var(--dur-quick) var(--ease-soft), border-color var(--dur-quick) var(--ease-soft); } .foot-top:hover { color: var(--accent); border-color: var(--accent); } .foot-mark { margin-top: var(--space-5); padding-inline: var(--pad-inline); font-family: var(--font-display); font-size: var(--step-wordmark); line-height: 0.98; letter-spacing: -0.015em; white-space: nowrap; color: var(--ink); transform: translateY(0.06em); } /* ── 반응형 — 좁을수록 겹침을 풀고 순서를 준다 ──────────────────────── */ @media (max-width: 1100px) { .hero-h { grid-column: 1 / 13; } .piece-wave { grid-column: 4 / 13; } .work { grid-template-columns: 4.5rem minmax(0, 1fr); row-gap: var(--space-3); } .work-meta { grid-column: 2; justify-self: start; } .method-note { margin-left: 0; } } @media (max-width: 720px) { .collage { display: block; height: auto; margin-top: var(--space-4); margin-bottom: var(--space-6); } .hero-h { max-width: none; text-shadow: none; } .piece-wave { height: 12rem; margin-top: var(--space-5); } .piece-photo { width: 82%; margin-left: auto; margin-top: calc(-1 * var(--space-4)); height: auto; } .duotone { aspect-ratio: 4 / 3; } .piece-photo .piece-tag { position: static; padding-top: var(--space-2); white-space: normal; text-align: right; } .piece-figures { width: 88%; margin-top: var(--space-4); } .hero-head { padding-block: var(--space-3); } .section { padding-block: var(--space-6); } .work { grid-template-columns: 1fr; row-gap: var(--space-2); } .work-meta { grid-column: 1; } .marquee-track li { padding-right: var(--space-6); } .foot-row { flex-direction: column; align-items: flex-start; } }