1290 lines
28 KiB
CSS
1290 lines
28 KiB
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);
|
||
}
|
||
|
||
.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);
|
||
}
|
||
}
|