designpaca/apps/site/public/work/rfs-cfd/styles/main.css
Yun Chan 4d813420dc
Some checks failed
ci / build (push) Failing after 1m52s
feat(showcase): 신규 쇼케이스 3종 — RFS · 트웬티온스 · 새벽청과
각 워크를 서로 다른 클라이언트로 보고 0~6단계를 따로 돌았다(토큰 체계 신규 정의 =
전체 경로). 셋 모두 라이트/다크 반전을 .band-light / .band-dark 가 --band-* 를
재정의하는 규칙으로 정의해 하드 게이트 4를 통과시켰다 — 반전이 섹션마다의 기분이
아니라 두 클래스가 만드는 규칙이다.

RFS — 실시간 유체 시뮬레이터 (rfs-cfd)
  프리셋 darkroom-spec · 컨셉 "암실과 사양서"
  R1 luminary.ai · R2 teenage.engineering EP-133 · 보조 simscale.com (전부 실측)
  히어로에서 브라우저가 실제로 Navier–Stokes 를 푼다. 순수 WebGL2, three.js 미사용.
  이류 → 온도 소스 → 부력·설비 힘 → 발산 → 압력 Jacobi → 투영 → 파티클 전진.
  격자 224×126 / 파티클 26,000 / Jacobi 22회, 좁은 화면은 절반으로 줄인다.
  prefers-reduced-motion 이면 시작하지 않고 그 자리에 RFS 실물 파티클 렌더가 남는다.
  단위계로 세 번 실패했다: dt 를 프레임 단위로 넘겨 파티클이 0.2초 만에 소멸했고,
  전부 급기구에서만 재생성해 실 한 가닥이 됐으며, 랙이 위로 뿜어 핫/콜드 아일이
  갈라지지 않았다. dt 를 초로 못박고 속도를 초당 격자 셀로 통일해 해결했다.
  수치는 전부 RFS 저장소 README 출처. 정확도 지표는 싣지 않았다 — 사내 검증 자료이고
  현재 통과 상태가 아니다.

트웬티온스 (twentyoz-corp)
  프리셋 field-record · 컨셉 "네 개의 현장"
  R1 samsara.com · R2 lars-mueller-publishers.com · R3 = 현행 twentyoz.kr 감사
  현행 사이트 실측: 대비 실패 172개 요소(9~11px 가 3.61:1), 한글 폰트 미지정으로
  한글이 시스템 기본으로 떨어짐, h1 자간 −0.06em(한글 상한의 세 배), 배경 #020202.
  'Digital Genetics' 은유가 산업용 IoT 사업을 가리고 있었다.
  유지한 자산은 radius 0 과 무채색·모노 기조.
  첫 화면에 회사 이름 대신 현장 선택기를 뒀다 — 라디오 그룹이라 JS 0바이트이고
  좌우 화살표 키가 그냥 먹는다. 파트너 19곳은 원본에 도메인 표기가 없어 나누지 않았다.

새벽청과 (saebyeok-cheonggwa)
  프리셋 market-board · 컨셉 "오늘 새벽 두 시의 값"
  R1 natoora.com · R2 phillips.com · R3 제철 12개월 띠
  커머스가 감추는 시세 변동을 히어로의 주인공으로 삼았다. 상품 사진은 아래로 내렸다.
  경매 시각·경락가격·등급·당도 표시 규정을 조사해 카피의 근거로 썼다.
  무화과 당도를 "—" 로 두고 값이 없는 게 아니라 표시가 허용되지 않는 품목이라고 적었다.
  등락은 색이 아니라 ▲▼보합 기호가 먼저다.
  표의 숫자가 예시임을 판 아래와 푸터 두 곳에 명시하고, 주소·전화는 비웠다(게이트 11).
  사진 4장은 codex 내장 image_gen 생성물이며 합계 341KB.

검증: Astro 빌드 통과, verify 체인 L0~L6 10계층 전부 통과,
showcase-audit 신규 3종 12/12 통과(320/390/768/1440).
성능 실측(RFS): JS 24KB · 총 704KB. 폰트만 530KB 로 예산(200KB) 초과 —
한글 웹폰트 자체가 원인이고 기존 cheongon-care 는 650KB 로 더 크다.
저장소 공통 baseline 이라 이번 판은 기록만 남기고 넘어간다.

기존 16종에서 발견된 70건(대비 미달·히어로 줄 수 초과)은 이번 범위를 넘어
design.md 에 목록만 남겼다.
2026-08-24 12:51:48 +09:00

1029 lines
23 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@import "./tokens.css";
/* ==========================================================================
RFS — 메인 스타일시트
구조 원칙 하나: 페이지가 두 체제를 오간다.
.band-dark = 암실. 유동·파티클·수치가 있는 곳
.band-light = 사양서. 읽고 결정하는 곳
반전은 섹션마다 기분대로 뒤집는 것이 아니라 아래 두 클래스가 토큰을
재정의하는 **규칙**이다. 그래서 하드 게이트 4 를 통과한다.
========================================================================== */
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
font-size: 16px;
scroll-behavior: smooth;
overflow-x: hidden;
background: var(--dark-surface);
-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: break-word;
overflow-x: hidden;
}
img,
picture,
canvas,
svg {
display: block;
max-width: 100%;
}
a {
color: inherit;
text-decoration: none;
}
button,
input,
select,
textarea {
font: inherit;
color: inherit;
}
h1,
h2,
h3 {
font-weight: 600;
line-height: var(--leading-tight);
letter-spacing: -0.015em; /* 한글은 -0.02em 이 하한이다 */
text-wrap: balance;
}
.mono {
font-family: var(--font-mono);
font-variant-numeric: tabular-nums;
}
.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;
}
/* ── 두 체제 ────────────────────────────────────────────────────── */
.band {
position: relative;
background: var(--band-surface);
color: var(--band-ink);
}
.band-light {
--band-surface: var(--surface);
--band-surface-2: var(--surface-2);
--band-surface-3: var(--surface-3);
--band-line: var(--line);
--band-line-strong: var(--line-strong);
--band-ink: var(--ink);
--band-ink-muted: var(--ink-muted);
--band-ink-faint: var(--ink-faint);
--band-accent: var(--accent);
--band-accent-hover: var(--accent-hover);
--band-accent-ink: var(--accent-ink);
--band-accent-wash: var(--accent-wash);
}
.band-dark {
--band-surface: var(--dark-surface);
--band-surface-2: var(--dark-surface-2);
--band-surface-3: var(--dark-surface-3);
--band-line: var(--dark-line);
--band-line-strong: var(--dark-line-strong);
--band-ink: var(--dark-ink);
--band-ink-muted: var(--dark-ink-muted);
--band-ink-faint: var(--dark-ink-faint);
--band-accent: var(--dark-accent);
--band-accent-hover: var(--dark-accent-hover);
--band-accent-ink: var(--dark-accent-ink);
--band-accent-wash: var(--dark-accent-wash);
}
.band a:not(.btn):hover {
color: var(--band-accent);
}
/* ── 접근성 ─────────────────────────────────────────────────────── */
.skip-link {
position: fixed;
top: var(--space-3);
left: var(--space-3);
z-index: 200;
padding: var(--space-2) var(--space-3);
background: var(--ink);
color: var(--surface);
transform: translateY(-250%);
transition: transform var(--dur-quick) var(--ease);
}
.skip-link:focus-visible {
transform: translateY(0);
}
:where(a, button, input, [tabindex]):focus-visible {
outline: 2px solid var(--band-accent, var(--accent));
outline-offset: 3px;
}
/* ── 헤더 ───────────────────────────────────────────────────────── */
.site-head {
position: sticky;
top: 0;
z-index: 100;
/* 반투명으로 두면 밝은 밴드 위를 지날 때 배경이 섞여 헤더 글자가 4.48:1 로 떨어진다.
페이지가 라이트/다크를 오가는 구조라 유리 헤더는 이 페이지에서 성립하지 않는다 */
background: var(--dark-surface);
border-bottom: 1px solid var(--dark-line);
color: var(--dark-ink);
}
.head-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
min-height: 56px;
min-width: 0;
}
.wordmark {
display: inline-flex;
align-items: center;
gap: var(--space-2);
flex-shrink: 0;
color: var(--dark-ink);
}
.wordmark-mark {
display: block;
width: 28px;
color: var(--dark-accent);
}
.wordmark-text {
font-weight: 600;
letter-spacing: 0.04em;
}
.nav {
display: flex;
gap: clamp(var(--space-3), 2.4vw, var(--space-5));
min-width: 0;
}
.nav a {
color: var(--dark-ink-muted);
font-size: var(--step--1);
white-space: nowrap;
padding-block: var(--space-2);
transition: color var(--dur-quick) var(--ease);
}
.nav a:hover {
color: var(--dark-ink);
}
.head-meta {
color: var(--dark-ink-faint);
font-size: var(--step--1);
white-space: nowrap;
flex-shrink: 0;
}
/* ── 히어로 ─────────────────────────────────────────────────────── */
.hero {
padding-bottom: var(--space-7);
}
.hero-stage {
position: relative;
width: 100%;
/* R1(luminary) 은 시뮬레이션이 첫 화면을 100% 덮는다. 우리는 CTA 대신
조작 슬라이더가 아래에 있어야 하므로 62% 로 잡았다 */
height: clamp(320px, 62dvh, 620px);
overflow: clip;
background:
radial-gradient(120% 80% at 12% 82%, #101a20 0%, transparent 62%),
radial-gradient(90% 70% at 62% 8%, #17181a 0%, transparent 58%),
var(--dark-surface);
border-bottom: 1px solid var(--dark-line);
}
#thermalField {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
opacity: 0;
transition: opacity var(--dur-slow) var(--ease);
}
[data-field-state="live"] #thermalField {
opacity: 1;
}
.hero-fallback {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: 50% 46%;
opacity: 0.72;
mix-blend-mode: screen;
transition: opacity var(--dur-slow) var(--ease);
}
/* 캔버스가 실제로 돌기 시작하면 실물 렌더는 물러난다.
둘이 겹쳐 보이면 무엇이 실시간인지 알 수 없다 */
[data-field-state="live"] .hero-fallback {
opacity: 0;
}
.hero-grid {
position: absolute;
inset: 0;
background-image:
linear-gradient(to right, var(--dark-line) 1px, transparent 1px),
linear-gradient(to bottom, var(--dark-line) 1px, transparent 1px);
background-size: 64px 64px;
opacity: 0.4;
pointer-events: none;
}
.hero-scrim {
position: absolute;
inset: 0;
background: linear-gradient(to bottom, color-mix(in srgb, var(--dark-surface) 46%, transparent) 0%, transparent 34%, color-mix(in srgb, var(--dark-surface) 84%, transparent) 100%);
pointer-events: none;
}
/* 장비 형상 — 셰이더 상수와 같은 좌표다.
랙 x 44%–56% · y 12%–62% FWU x 5.5% 부터 · y 10%–34% */
.stage-solid {
position: absolute;
pointer-events: none;
border: 1px solid var(--dark-line-strong);
}
.stage-rack {
left: 44%;
right: 44%;
bottom: 12%;
top: 38%;
background: repeating-linear-gradient(
to bottom,
color-mix(in srgb, var(--dark-surface) 92%, transparent) 0 6px,
color-mix(in srgb, var(--dark-surface-3) 92%, transparent) 6px 8px
);
}
.stage-fwu {
left: 3%;
width: 2.5%;
bottom: 10%;
height: 24%;
background: color-mix(in srgb, var(--dark-surface-3) 88%, transparent);
border-right: 2px solid var(--dark-accent);
}
.stage-tag {
position: absolute;
display: flex;
align-items: center;
gap: var(--space-2);
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--dark-ink-muted);
pointer-events: none;
}
.stage-tag span {
background: color-mix(in srgb, var(--dark-surface) 82%, transparent);
padding: 2px var(--space-2);
border-left: 2px solid var(--dark-accent);
}
/* 캔버스 안 FWU 는 x 0.055 / y 0.10–0.34, 랙은 x 0.44–0.56 · y 0.12–0.62 다.
표식은 그 좌표를 따라간다 — 그림과 라벨이 어긋나면 라벨이 거짓말이 된다 */
.stage-tag-fwu {
left: 5.5%;
bottom: 34%;
}
.stage-tag-rack {
left: 44%;
bottom: 62%;
}
.hero-copy {
padding-top: var(--space-5);
}
.hero h1 {
font-size: var(--display);
max-width: 18ch;
}
.hero-lead {
margin-top: var(--space-3);
max-width: var(--measure);
font-size: var(--step-1);
color: var(--band-ink-muted);
}
.hero-controls {
margin-top: var(--space-5);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: var(--space-4);
max-width: 640px;
}
.ctl-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--space-3);
font-size: var(--step--1);
color: var(--band-ink-muted);
margin-bottom: var(--space-2);
}
.ctl-head output {
color: var(--band-ink);
}
input[type="range"] {
width: 100%;
accent-color: var(--band-accent);
background: transparent;
}
.hero-note {
margin-top: var(--space-5);
padding-top: var(--space-3);
border-top: 1px solid var(--band-line);
max-width: var(--measure);
font-size: var(--step--1);
color: var(--band-ink-muted);
line-height: var(--leading-loose);
}
.hero-note strong {
color: var(--band-ink);
font-weight: 600;
}
/* ── 섹션 공통 ──────────────────────────────────────────────────── */
.band > .wrap {
padding-block: var(--space-8);
}
.hero > .wrap {
padding-block: 0;
}
.eyebrow {
font-family: var(--font-mono);
font-size: var(--step--1);
letter-spacing: 0.02em;
color: var(--band-accent);
margin-bottom: var(--space-3);
}
.band h2 {
font-size: var(--step-3);
max-width: 20ch;
}
.section-lead {
margin-top: var(--space-4);
max-width: var(--measure);
color: var(--band-ink-muted);
font-size: var(--step-1);
line-height: var(--leading-loose);
}
/* ── 레이아웃 패밀리 A · 비대칭 2열 ─────────────────────────────── */
.split {
display: grid;
gap: var(--space-6);
}
@media (min-width: 900px) {
.split {
grid-template-columns: 5fr 7fr;
gap: var(--space-7);
align-items: start;
}
}
.split-lead h2 {
position: sticky;
top: calc(56px + var(--space-5));
}
@media (max-width: 899px) {
.split-lead h2 {
position: static;
}
}
.split-body > * + * {
margin-top: var(--space-4);
}
.split-body p {
max-width: var(--measure);
color: var(--band-ink-muted);
}
.split-body strong {
color: var(--band-ink);
font-weight: 600;
}
/* ── 레이아웃 패밀리 B · 대조 목록 ──────────────────────────────── */
.contrast {
margin-top: var(--space-5);
border-top: 1px solid var(--band-line-strong);
}
.contrast > div {
display: grid;
gap: var(--space-1) var(--space-4);
padding-block: var(--space-3);
border-bottom: 1px solid var(--band-line);
}
@media (min-width: 640px) {
.contrast > div {
grid-template-columns: 12rem 1fr;
}
}
.contrast dt {
font-weight: 600;
color: var(--band-ink);
}
.contrast dd {
color: var(--band-ink-muted);
font-size: var(--step--1);
line-height: var(--leading-loose);
}
.contrast > div:last-child dt {
color: var(--band-accent);
}
/* ── 레이아웃 패밀리 C · 사양 원장 (행 문법) ────────────────────── */
.spec-ledger {
margin-top: var(--space-6);
list-style: none;
border-top: 1px solid var(--band-line-strong);
}
.spec-ledger li {
display: grid;
gap: var(--space-1) var(--space-4);
padding-block: var(--space-3);
border-bottom: 1px solid var(--band-line);
}
@media (min-width: 720px) {
.spec-ledger li {
grid-template-columns: 10rem 14rem 1fr;
align-items: baseline;
}
}
.spec-name {
color: var(--band-ink-faint);
font-size: var(--step--1);
}
.spec-value {
font-family: var(--font-mono);
color: var(--band-ink);
}
.spec-note {
color: var(--band-ink-muted);
font-size: var(--step--1);
line-height: var(--leading-loose);
}
/* ── 레이아웃 패밀리 D · 수치 판 ────────────────────────────────── */
.figures {
margin-top: var(--space-7);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 210px), 1fr));
border-top: 1px solid var(--band-line-strong);
border-left: 1px solid var(--band-line);
}
.figures figure {
padding: var(--space-4);
border-right: 1px solid var(--band-line);
border-bottom: 1px solid var(--band-line);
}
.fig-num {
font-size: var(--step--1);
color: var(--band-ink-faint);
}
.fig-title {
margin-top: var(--space-3);
font-size: var(--step--1);
color: var(--band-ink-muted);
}
.fig-val {
margin-top: var(--space-1);
font-size: var(--step-3);
line-height: 1.05;
color: var(--band-ink);
letter-spacing: -0.02em;
}
.fig-val span {
font-size: var(--step-1);
color: var(--band-accent);
}
.fig-note {
margin-top: var(--space-2);
font-size: var(--step--1);
color: var(--band-ink-faint);
line-height: var(--leading-loose);
}
/* ── 레이아웃 패밀리 E · 장비 목록 ─────────────────────────────── */
.equip-list {
margin-top: var(--space-6);
display: grid;
gap: var(--space-5);
border-top: 1px solid var(--band-line-strong);
padding-top: var(--space-5);
}
@media (min-width: 760px) {
.equip-list {
grid-template-columns: repeat(2, 1fr);
column-gap: var(--space-7);
}
/* 다섯 개다. 마지막 하나가 홀로 남으므로 두 칸을 쓰게 해서
'3열이 예뻐서 3열' 이 되는 것을 피한다 */
.equip-list article:last-child {
grid-column: 1 / -1;
border-top: 1px solid var(--band-line);
padding-top: var(--space-5);
}
}
.equip-list h3 {
font-size: var(--step-1);
display: flex;
align-items: baseline;
gap: var(--space-2);
flex-wrap: wrap;
}
.equip-list p {
margin-top: var(--space-2);
color: var(--band-ink-muted);
max-width: 42ch;
line-height: var(--leading-loose);
}
.tag {
font-size: var(--step--1);
font-weight: 400;
color: var(--band-accent);
border: 1px solid var(--band-line-strong);
padding: 1px var(--space-2);
}
/* ── 레이아웃 패밀리 F · 시각화 (목록 + 실물) ──────────────────── */
.vis-layout {
margin-top: var(--space-6);
display: grid;
gap: var(--space-6);
}
@media (min-width: 960px) {
.vis-layout {
grid-template-columns: 6fr 5fr;
gap: var(--space-7);
align-items: start;
}
}
.vis-list {
list-style: none;
counter-reset: vis;
border-top: 1px solid var(--band-line-strong);
}
.vis-list li {
counter-increment: vis;
padding-block: var(--space-4);
border-bottom: 1px solid var(--band-line);
display: grid;
grid-template-columns: 2.5rem 1fr;
gap: var(--space-2) var(--space-3);
}
.vis-list li::before {
content: counter(vis, decimal-leading-zero);
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--band-ink-faint);
grid-row: 1 / span 2;
padding-top: 0.35em;
}
.vis-list h3 {
font-size: var(--step-1);
}
.vis-list p {
color: var(--band-ink-muted);
font-size: var(--step--1);
line-height: var(--leading-loose);
grid-column: 2;
}
.vis-list .mono {
color: var(--band-ink);
}
.vis-shots {
display: grid;
gap: var(--space-4);
}
.vis-shots figure {
border: 1px solid var(--band-line);
background: var(--band-surface-2);
}
.vis-shots img {
width: 100%;
height: auto;
}
.vis-shots figcaption {
padding: var(--space-2) var(--space-3);
border-top: 1px solid var(--band-line);
font-size: var(--step--1);
color: var(--band-ink-muted);
font-family: var(--font-mono);
}
.shots-note {
font-size: var(--step--1);
color: var(--band-ink-faint);
line-height: var(--leading-loose);
}
/* ── 기능 행 ────────────────────────────────────────────────────── */
.feature-rows {
border-top: 1px solid var(--band-line-strong);
}
.feature-rows > div {
display: grid;
gap: var(--space-1) var(--space-4);
padding-block: var(--space-3);
border-bottom: 1px solid var(--band-line);
}
@media (min-width: 640px) {
.feature-rows > div {
grid-template-columns: 9rem 1fr;
}
}
.feature-rows dt {
font-weight: 600;
}
.feature-rows dd {
color: var(--band-ink-muted);
font-size: var(--step--1);
line-height: var(--leading-loose);
}
.keys {
margin-top: var(--space-5);
padding: var(--space-4);
background: var(--band-surface-2);
border: 1px solid var(--band-line);
}
.keys-title {
font-size: var(--step--1);
color: var(--band-ink-faint);
margin-bottom: var(--space-3);
}
.keys ul {
list-style: none;
display: flex;
flex-wrap: wrap;
gap: var(--space-2) var(--space-4);
font-size: var(--step--1);
color: var(--band-ink-muted);
}
.keys li {
display: inline-flex;
align-items: center;
gap: var(--space-2);
}
kbd {
font-family: var(--font-mono);
font-size: 0.8125rem;
padding: 2px 7px;
background: var(--band-surface);
border: 1px solid var(--band-line-strong);
border-bottom-width: 2px;
color: var(--band-ink);
}
/* ── 레이아웃 패밀리 G · 계층 ──────────────────────────────────── */
.layers {
margin-top: var(--space-6);
list-style: none;
border: 1px solid var(--band-line-strong);
}
.layers li {
display: grid;
gap: var(--space-1) var(--space-4);
padding: var(--space-4);
border-bottom: 1px solid var(--band-line);
}
.layers li:last-child {
border-bottom: 0;
}
@media (min-width: 760px) {
.layers li {
grid-template-columns: 3rem 13rem 1fr;
align-items: baseline;
}
}
/* 아래로 갈수록 물리 계층에 가까워진다는 것을 배경 농도로 말한다 */
.layers li:nth-child(1) { background: color-mix(in srgb, var(--band-surface-2) 22%, transparent); }
.layers li:nth-child(2) { background: color-mix(in srgb, var(--band-surface-2) 44%, transparent); }
.layers li:nth-child(3) { background: color-mix(in srgb, var(--band-surface-2) 66%, transparent); }
.layers li:nth-child(4) { background: color-mix(in srgb, var(--band-surface-2) 84%, transparent); }
.layers li:nth-child(5) { background: var(--band-surface-2); }
.layer-id {
color: var(--band-accent);
font-size: var(--step--1);
}
.layer-name {
font-weight: 600;
}
.layer-body {
color: var(--band-ink-muted);
font-size: var(--step--1);
line-height: var(--leading-loose);
}
/* ── 요구사양 표 ────────────────────────────────────────────────── */
.req {
width: 100%;
border-collapse: collapse;
font-size: var(--step--1);
}
.req caption {
text-align: left;
}
.req th,
.req td {
text-align: left;
padding: var(--space-3) var(--space-3) var(--space-3) 0;
border-bottom: 1px solid var(--band-line);
vertical-align: top;
}
.req thead th {
color: var(--band-ink-faint);
font-weight: 400;
border-bottom: 1px solid var(--band-line-strong);
}
.req tbody th {
font-weight: 600;
width: 7rem;
}
.req td {
color: var(--band-ink-muted);
font-family: var(--font-mono);
}
/* ── CTA ────────────────────────────────────────────────────────── */
.adopt-cta {
margin-top: var(--space-6);
padding-top: var(--space-5);
border-top: 1px solid var(--band-line-strong);
}
.btn {
display: inline-block;
margin-top: var(--space-4);
padding: var(--space-3) var(--space-5);
background: var(--band-accent);
color: var(--band-accent-ink);
font-weight: 600;
white-space: nowrap;
border: 1px solid var(--band-accent);
transition: background-color var(--dur-quick) var(--ease);
}
.btn:hover {
background: var(--band-accent-hover);
border-color: var(--band-accent-hover);
color: var(--band-accent-ink);
}
.adopt-fine {
margin-top: var(--space-3);
font-size: var(--step--1);
color: var(--band-ink-faint);
}
/* ── 푸터 ───────────────────────────────────────────────────────── */
.site-foot {
border-top: 1px solid var(--dark-line);
}
.foot-inner {
display: grid;
gap: var(--space-5);
}
@media (min-width: 760px) {
.foot-inner {
grid-template-columns: 1fr auto;
align-items: start;
}
}
.foot-name {
font-weight: 600;
}
.foot-line {
margin-top: var(--space-2);
color: var(--band-ink-muted);
font-size: var(--step--1);
}
.foot-meta {
display: grid;
gap: var(--space-2);
font-size: var(--step--1);
}
.foot-meta > div {
display: grid;
grid-template-columns: 5rem 1fr;
gap: var(--space-3);
}
.foot-meta dt {
color: var(--band-ink-faint);
}
.foot-meta dd {
color: var(--band-ink-muted);
}
.foot-fine {
padding-bottom: var(--space-6);
}
.foot-fine p {
padding-top: var(--space-4);
border-top: 1px solid var(--band-line);
font-size: var(--step--1);
color: var(--band-ink-faint);
line-height: var(--leading-loose);
max-width: 60ch;
}
/* ── 좁은 화면 ──────────────────────────────────────────────────── */
@media (max-width: 640px) {
.head-inner {
flex-wrap: wrap;
padding-block: var(--space-2);
row-gap: var(--space-2);
}
.nav {
order: 3;
width: 100%;
justify-content: space-between;
gap: var(--space-2);
border-top: 1px solid var(--dark-line);
padding-top: var(--space-2);
}
.stage-tag {
font-size: 0.6875rem;
}
.figures {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 380px) {
.figures {
grid-template-columns: 1fr;
}
}
/* ── 모션을 줄이는 설정 ─────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
.split-lead h2 {
position: static;
}
}
/* ── 인쇄 ───────────────────────────────────────────────────────── */
@media print {
.site-head,
.hero-stage,
.hero-controls,
.skip-link {
display: none;
}
.band {
background: #fff;
color: #000;
}
.band > .wrap {
padding-block: var(--space-4);
}
}