/* 히어로. 값은 전부 tokens.css 에서 온다. */ *, *::before, *::after { box-sizing: border-box; } html { -webkit-text-size-adjust: 100%; } body { margin: 0; background: var(--surface); color: var(--ink); font-family: var(--font-body); font-size: var(--step-0); line-height: var(--leading-normal); letter-spacing: var(--tracking-body); font-variant-numeric: tabular-nums; /* dark-instrument: 수치가 흔들리면 계기판이 아니다 */ } /* layout.md §1 — 하나의 그리드에서 전부 나온다 */ .page { display: grid; grid-template-columns: [full-start] minmax(var(--gutter), 1fr) [main-start] minmax(0, var(--container)) [main-end] minmax(var(--gutter), 1fr) [full-end]; } .page > * { grid-column: main; } .page > .full { grid-column: full; } /* ---------------------------------------------------------------- 내비 */ .nav { display: flex; flex-wrap: wrap; /* 320px 에서 밀려 가로 스크롤이 생겼다 */ align-items: center; gap: var(--space-2) var(--space-4); padding-block: var(--space-4); } .nav__mark { font-family: var(--font-display); font-size: var(--step-2); letter-spacing: var(--tracking-display); margin: 0; margin-inline-end: auto; } .nav__link { display: inline-flex; align-items: center; justify-content: center; min-height: 44px; /* 터치 타깃 44×44 */ min-width: 44px; color: var(--ink-muted); font-size: var(--step--1); text-decoration: none; border-bottom: 1px solid transparent; } .nav__link:hover { color: var(--ink); border-bottom-color: var(--line); } /* ---------------------------------------------------------------- 히어로 */ .hero { /* 100vh 금지(하드게이트 #9). dvh 를 쓰고 min-height 로만 잡는다 */ min-height: min(84dvh, 46rem); display: grid; /* 비대칭 7:5. layout.md — 중앙 정렬 히어로는 쓰지 않는다 */ grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: var(--space-6) var(--space-7); align-items: start; padding-block: var(--space-7) var(--space-8); } .hero__headline { font-family: var(--font-display); font-size: var(--display-1); line-height: var(--leading-tight); letter-spacing: var(--tracking-display); font-weight: 400; margin: 0 0 var(--space-4); text-wrap: balance; } .hero__sub { max-width: var(--measure); color: var(--ink-muted); font-size: var(--step-1); margin: 0 0 var(--space-5); } .hero__actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-4); } /* 주 CTA — 감수한 리스크: 강조색을 쓰지 않고 잉크 반전으로만 만든다 */ .cta { display: inline-block; background: var(--cta-bg); color: var(--cta-ink); font-size: var(--step-0); font-weight: 600; line-height: 1.2; text-decoration: none; padding: var(--space-3) var(--space-5); border: 0; border-radius: var(--radius-md); white-space: nowrap; /* 하드게이트 #6 — 라벨이 2줄로 접히지 않는다 */ /* 하드게이트 #8 — transform/opacity 만 트랜지션한다 */ transition: transform var(--dur-instant) var(--ease-out); } .cta:hover { transform: translateY(-1px); } .cta:active { transform: translateY(0); } .link-quiet { display: inline-flex; align-items: center; min-height: 44px; /* 터치 타깃 */ color: var(--accent); /* 강조색은 오직 글자에만 */ font-size: var(--step-0); text-decoration: underline; /* 색만으로 구분하지 않는다 */ text-underline-offset: 0.25em; } /* ---------------------------------------------------------------- 제품 화면 * 하드게이트 #12 — div 로 만든 가짜 스크린샷 금지. * 브리프가 실제 스크린샷을 제공하므로 를 쓴다. * aspect-ratio 로 자리를 미리 잡아 CLS 를 막는다. */ .shot { display: block; width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: cover; object-position: left top; background: var(--surface-raised); /* 로드 전/실패 시의 자리 */ border-radius: var(--radius-md); } .shot-caption { display: block; margin-top: var(--space-2); color: var(--ink-muted); font-size: var(--step--1); font-family: var(--font-mono); } /* ---------------------------------------------------------------- 설치 명령 */ .install { grid-column: main; display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); background: var(--surface-raised); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); font-family: var(--font-mono); font-size: var(--step-0); } .install__prompt { color: var(--ink-muted); user-select: none; } .install__cmd { color: var(--ink); } .install__copy { margin-inline-start: auto; min-height: 44px; min-width: 44px; background: transparent; color: var(--ink-muted); border: 1px solid var(--line); border-radius: var(--radius-sm); font: inherit; font-size: var(--step--1); padding: var(--space-1) var(--space-3); cursor: pointer; transition: transform var(--dur-instant) var(--ease-out); } .install__copy:hover { color: var(--ink); transform: translateY(-1px); } /* ---------------------------------------------------------------- 테마 토글 */ .theme-toggle { min-height: 44px; min-width: 44px; background: transparent; color: var(--ink-muted); border: 1px solid var(--line); border-radius: var(--radius-sm); font: inherit; font-size: var(--step--1); padding: var(--space-1) var(--space-3); cursor: pointer; } .theme-toggle:hover { color: var(--ink); } .visually-hidden { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; } /* ---------------------------------------------------------------- 포커스 */ :where(a, button):focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: var(--radius-sm); } /* ---------------------------------------------------------------- 반응형 */ /* 콘텐츠가 깨지는 지점에서만. 기기 크기를 가정하지 않는다 */ @media (max-width: 54rem) { .hero { grid-template-columns: minmax(0, 1fr); } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; } }