designpaca/apps/site/public/work/rfs-cfd/styles/main.css
Yun Chan e09d4efb1c
Some checks failed
ci / build (push) Has been cancelled
feat: strengthen design skill and refresh all showcases
2026-09-12 18:16:33 +09:00

1290 lines
28 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.

/* ==========================================================================
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);
}
.scenario-strip {
margin-top: var(--space-5);
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--space-2);
max-width: 760px;
}
.scenario-label {
margin-right: var(--space-2);
font-family: var(--font-mono);
font-size: var(--step--1);
color: var(--band-ink-faint);
}
.scenario-btn,
.vis-tab {
min-height: 40px;
padding-inline: var(--space-3);
border: 1px solid var(--band-line-strong);
background: transparent;
color: var(--band-ink-muted);
cursor: pointer;
font-size: var(--step--1);
}
.scenario-btn:hover,
.vis-tab:hover {
color: var(--band-ink);
border-color: var(--band-accent);
}
.scenario-btn[aria-pressed="true"],
.vis-tab[aria-pressed="true"] {
color: var(--band-accent-ink);
background: var(--band-accent);
border-color: var(--band-accent);
}
.hero-controls {
margin-top: var(--space-4);
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;
}
.field-readout {
margin-top: var(--space-5);
max-width: 880px;
border-block: 1px solid var(--band-line-strong);
}
.field-readout-head {
display: grid;
gap: var(--space-2);
padding-block: var(--space-3);
border-bottom: 1px solid var(--band-line);
}
.field-readout-label,
.field-readout-grid dt {
font-size: var(--step--1);
color: var(--band-ink-faint);
}
.field-readout-state {
color: var(--band-ink);
}
.field-readout-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.field-readout-grid > div {
min-width: 0;
padding-block: var(--space-3);
}
.field-readout-grid > div + div {
padding-left: var(--space-3);
border-left: 1px solid var(--band-line);
}
.field-readout-grid dd {
margin-top: var(--space-1);
color: var(--band-ink-muted);
font-size: var(--step--1);
line-height: var(--leading-normal);
}
@media (min-width: 720px) {
.field-readout-head {
grid-template-columns: 9rem minmax(0, 1fr);
align-items: baseline;
}
}
.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));
}
/* 초광폭에서는 사양 표와 실물 렌더가 답답해지지 않도록 정보 표면만 넓힌다.
본문 측정폭은 각 블록의 max-width가 계속 제어한다. */
@media (min-width: 120rem) {
.band > .wrap {
width: min(100% - 2 * var(--pad-inline), var(--container-wide));
}
}
@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-3);
min-width: 0;
}
.vis-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
border-bottom: 1px solid var(--band-line-strong);
padding-bottom: var(--space-2);
}
.vis-tabs {
display: flex;
}
.vis-tab + .vis-tab {
border-left: 0;
}
.vis-source {
color: var(--band-ink-faint);
font-size: var(--step--1);
text-align: right;
}
.vis-frame {
min-width: 0;
}
.vis-shots figure {
display: grid;
grid-template-rows: minmax(0, 1fr) auto;
border: 1px solid var(--band-line);
background: var(--band-surface-2);
min-height: clamp(360px, 42vw, 540px);
}
.vis-shots figure[hidden] {
display: none;
}
.vis-shots img {
width: 100%;
height: 100%;
min-height: 0;
object-fit: contain;
}
.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);
}
.temp-key {
display: flex;
flex-wrap: wrap;
gap: var(--space-3);
color: var(--band-ink-muted);
font-family: var(--font-mono);
font-size: var(--step--1);
}
.temp-key span {
display: inline-flex;
align-items: center;
gap: var(--space-2);
}
.temp-key i {
width: 1.5rem;
height: 2px;
background: var(--temp-cold);
}
.temp-key .temp-mid {
background: var(--temp-mid);
}
.temp-key .temp-hot {
background: var(--temp-hot);
}
.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);
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;
}
.scenario-strip {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.scenario-label {
grid-column: 1 / -1;
}
.scenario-btn,
.vis-tab {
min-height: 44px;
padding-inline: calc(var(--space-2) + 2px);
}
.req th,
.req td {
padding-inline: var(--space-2);
}
.field-readout-grid {
grid-template-columns: 1fr;
}
.field-readout-grid > div + div {
padding-left: 0;
border-left: 0;
border-top: 1px solid var(--band-line);
}
.vis-shots figure {
min-height: 320px;
}
.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;
}
}
/* ── 인쇄 ───────────────────────────────────────────────────────── */
/* 첫 화면에서는 운전 조건과 결과를 한 계기면에서 읽는다. 캔버스는 조작 면의 옆에 두고,
WebGL·감소 모션 폴백도 같은 영역을 그대로 사용한다. */
@media (min-width: 900px) {
.hero {
display: grid;
grid-template-columns: minmax(0, 0.96fr) minmax(26rem, 1.04fr);
align-items: start;
min-height: 39rem;
padding-bottom: var(--space-6);
}
.hero-stage {
grid-column: 2;
grid-row: 1;
align-self: start;
height: clamp(26.25rem, 31vw, 30rem);
margin-top: var(--space-5);
border-left: 1px solid var(--dark-line);
border-bottom: 1px solid var(--dark-line);
}
.hero-copy {
grid-column: 1;
grid-row: 1;
min-width: 0;
padding: var(--space-5) var(--space-5) 0 max(var(--pad-inline), calc((100vw - var(--container)) / 2));
}
.hero h1 {
max-width: 11ch;
font-size: clamp(2.45rem, 3.6vw, 4.25rem);
line-height: 0.98;
}
.hero-lead {
max-width: 36rem;
font-size: var(--step-0);
line-height: 1.65;
}
.scenario-strip {
margin-top: var(--space-4);
}
.hero-controls {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--space-3);
margin-top: var(--space-3);
max-width: none;
}
.field-readout {
margin-top: var(--space-4);
}
.hero-note {
margin-top: var(--space-3);
font-size: 0.8125rem;
}
}
@media print {
.site-head,
.hero-stage,
.hero-controls,
.scenario-strip,
.field-readout,
.skip-link {
display: none;
}
.band {
background: #fff;
color: #000;
}
.band > .wrap {
padding-block: var(--space-4);
}
}