@import url("./tokens.css?v=20261006"); /* ========================================================================== 궤도 우주공학 — ORBIT-75 사양서. 표제 + 전폭 도면 무대, 오른쪽 측면 색인, 다열 색인 푸터. ========================================================================== */ *, *::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-normal); -webkit-font-smoothing: antialiased; } /* 한글 조판 정본(typography §6-5) */ :lang(ko) { word-break: keep-all; overflow-wrap: anywhere; line-break: strict; } :lang(ko) :is(em, i, cite, dfn, var, address) { font-style: normal; } :lang(ko) a { text-underline-position: under; } h1 { font-family: var(--font-display); font-weight: 400; font-size: var(--step-display); line-height: var(--leading-tight); letter-spacing: -0.01em; word-spacing: -0.3em; /* Orbit은 띄어쓰기도 한 칸 전각이라 낱말 사이가 벌어진다. 실측 후 줄였다 */ text-wrap: balance; } h2 { font-weight: var(--weight-strong); font-size: var(--step-2); line-height: var(--leading-heading); letter-spacing: -0.01em; max-width: 24em; text-wrap: balance; } :where(p, th, td, dd, dt, figcaption, li) { text-wrap: pretty; } p { max-width: var(--measure); } .muted { color: var(--ink-muted); } a { color: inherit; } :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; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .wrap { width: min(100% - 2 * var(--pad-inline), var(--container)); margin-inline: auto; } /* ── 측면 색인 — 좁은 화면에서는 위쪽 차례 띠, 넓은 화면에서는 오른쪽 고정 레일 ───── */ .index { padding: var(--space-3) var(--pad-inline) 0; } .wordmark { display: inline-block; font-weight: var(--weight-strong); font-size: var(--step-1); text-decoration: none; white-space: nowrap; } .index-list { list-style: none; padding: 0; margin-top: var(--space-2); display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-3); font-size: var(--step--1); } .index-list a { display: inline-flex; align-items: center; gap: 0.4em; min-height: 32px; padding-block: 2px; color: var(--ink-muted); text-decoration: none; border-bottom: 1px solid transparent; transition: color var(--dur-quick) var(--ease-soft), border-color var(--dur-quick) var(--ease-soft); } .index-no { font-family: var(--font-display); font-size: 0.75rem; color: var(--ink-faint); letter-spacing: 0.02em; } .index-list a:hover { color: var(--ink); } .index-list a[aria-current="true"] { color: var(--accent); border-bottom-color: var(--accent); } .index-list a[aria-current="true"] .index-no { color: var(--accent); } /* ── 히어로: 표제 + 사실 목록 → 전폭 무대 ──────────────────────────────── */ .hero { position: relative; isolation: isolate; padding-top: var(--space-7); } .hero-head { display: grid; gap: var(--space-5); } .facts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-3) var(--space-4); } .facts > div { min-width: 0; padding-top: var(--space-2); border-top: 1px solid var(--line-strong); } .facts dt { font-size: var(--step--1); color: var(--ink-faint); } .facts dd { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 var(--space-2); } .fact-value { font-weight: var(--weight-strong); font-size: var(--step-2); line-height: 1.2; color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; } .fact-cond { font-size: var(--step--1); color: var(--ink-muted); } /* 전폭 무대 — 유리판 위의 도면. 뒤에는 시안 글로우가 있어 흐림이 보인다 */ .stage { position: relative; margin-top: var(--space-6); margin-inline: var(--space-3); padding: var(--space-4) var(--space-4) var(--space-3); /* 모눈은 도면 표면에만 */ background-image: linear-gradient(color-mix(in srgb, var(--line) 85%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--line) 85%, transparent) 1px, transparent 1px); background-size: 2.5rem 2.5rem; background-position: center; } .hero::before { content: ""; position: absolute; inset: 0; z-index: -1; background: radial-gradient(60% 50% at 70% 70%, var(--accent-glow), transparent 70%), radial-gradient(40% 40% at 20% 90%, rgb(24 155 220 / 0.12), transparent 70%); pointer-events: none; } .bp { display: block; width: 100%; height: auto; } .bp-tall { display: none; max-width: 24rem; margin-inline: auto; } .stage-cap, .panel-cap { display: flex; gap: var(--space-3); align-items: baseline; margin-top: var(--space-3); font-size: var(--step--1); color: var(--ink-on-glass); /* 유리·모눈 위 텍스트는 대비를 올린다(svg-glass §3 vibrancy). 실측 4.0 → 재측정 */ } .cap-no { font-family: var(--font-display); font-size: 0.75rem; color: var(--accent); white-space: nowrap; } /* 도면 선 */ .bp-wall { fill: none; stroke: var(--ink); stroke-width: 2; } .bp-wall.inner { stroke-width: 1.25; } .bp-wall.thin { stroke-width: 1; } .bp-cool { fill: none; stroke: var(--accent-stroke); stroke-width: 1.5; stroke-dasharray: 1; stroke-dashoffset: 0; } .bp-block { fill: none; stroke: var(--ink-muted); stroke-width: 1.2; } .bp-axis { stroke: var(--ink-faint); stroke-width: 0.75; stroke-dasharray: 10 4 2 4; } .bp-flow path { fill: none; stroke: var(--accent); stroke-width: 1.2; } .bp-flow path[pathLength] { stroke-dasharray: 1; stroke-dashoffset: 0; } .bp-label text { font-family: var(--font-body); font-size: 18px; fill: var(--ink); } .bp-tall .bp-label text { font-size: 16px; } .bp-lead { stroke: var(--accent); stroke-width: 1; } .bp-dim path { fill: none; stroke: var(--ink-faint); stroke-width: 0.8; } .bp-dim text { font-family: var(--font-body); font-variant-numeric: tabular-nums; font-size: 16px; fill: var(--ink-muted); } .bp-tall .bp-dim text { font-size: 14px; } /* 스크롤에 따라 유로가 그어진다 — 가드 안에 초기 상태를 둔다(motion §3 코드 B). 도면 한 곳만 */ @supports (animation-timeline: scroll()) { .bp-cool, .bp-flow path[pathLength] { animation: bp-draw 1ms linear both; animation-timeline: scroll(root block); animation-range: 0 60vh; } @keyframes bp-draw { from { stroke-dashoffset: 0.55; } to { stroke-dashoffset: 0; } } } @media (prefers-reduced-motion: reduce) { .bp-cool, .bp-flow path[pathLength] { animation: none; stroke-dashoffset: 0; } } /* ── 유리 패널(svg-glass §1 헤어라인, §3 위계) ───────────────────────────── */ .glass { position: relative; background-color: var(--glass-fill); border-radius: var(--radius); box-shadow: var(--glass-shadow), inset 0 1px 0 rgb(255 255 255 / 0.05); backdrop-filter: blur(var(--glass-blur)) saturate(1.25); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.25); } .glass::after { content: ""; position: absolute; inset: 0; padding: 1px; border-radius: inherit; background: var(--glass-rim); -webkit-mask: linear-gradient(black 0 0) content-box, linear-gradient(black 0 0); mask: linear-gradient(black 0 0) content-box, linear-gradient(black 0 0); -webkit-mask-composite: xor; mask-composite: exclude; pointer-events: none; } @media (prefers-reduced-transparency: reduce) { .glass { background-color: var(--surface-raised); backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } } .panel { padding: var(--space-3); } .panel img { display: block; width: 100%; height: auto; border-radius: var(--radius); } /* ── 섹션 공통 ────────────────────────────────────────────────────────── */ .section { padding-block: var(--space-8); } .section + .section { border-top: 1px solid var(--line); } .hero + .section { border-top: 0; } /* 사양표와 시험 기록은 같은 "기록" 묶음 — 사이를 좁히고 선을 긋지 않는다(묶음 안 < 묶음 사이) */ #fires { border-top: 0; padding-top: 0; } /* ── 표 ───────────────────────────────────────────────────────────────── */ .table-wrap { margin-top: var(--space-5); overflow-x: auto; } table { width: 100%; border-collapse: collapse; } thead th { text-align: left; font-weight: var(--weight-strong); font-size: var(--step--1); color: var(--ink-faint); padding: var(--space-2) var(--space-3); border-bottom: 1px solid var(--line-strong); } tbody th { font-weight: var(--weight-strong); text-align: left; white-space: nowrap; } tbody td, tbody th { padding: var(--space-3); border-bottom: 1px solid var(--line); vertical-align: baseline; /* 자동 폭 셀에서 anywhere는 열을 글자 단위로 쪼갠다(typography §6-5 예외) */ overflow-wrap: break-word; } tbody td:not(.num, .date) { min-width: 12em; } .date { white-space: nowrap; font-variant-numeric: tabular-nums; } tbody td:not(.num) { color: var(--ink-muted); font-size: var(--step--1); } .num { font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; } tbody .num { color: var(--accent); } tr:target { background: color-mix(in srgb, var(--accent) 10%, transparent); } tr:target th { color: var(--accent); } .measure-note { margin-top: var(--space-3); font-size: var(--step--1); color: var(--ink-faint); } /* ── 시험 기록 2단 ────────────────────────────────────────────────────── */ .fires-grid { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); gap: var(--space-5) var(--space-7); align-items: start; } .fires-text p { margin-top: var(--space-3); color: var(--ink-muted); max-width: 26em; } .fires-grid .table-wrap { margin-top: 0; } /* ── 재생냉각 2단: 글 + 3:4 사진 유리 패널 ───────────────────────────────── */ .two { display: grid; grid-template-columns: minmax(0, 6fr) minmax(0, 5fr); gap: var(--space-6) var(--space-7); align-items: center; } .two-text p + p { margin-top: var(--space-4); } .two-text h2 + p { margin-top: var(--space-4); } .cooling { position: relative; isolation: isolate; } .cooling::before { content: ""; position: absolute; inset: 0; z-index: -1; background: radial-gradient(45% 60% at 80% 50%, var(--accent-glow), transparent 70%); pointer-events: none; } /* ── 연소 장면: 16:9 유리 패널 ──────────────────────────────────────────── */ .plate { position: relative; isolation: isolate; } .plate::before { content: ""; position: absolute; inset: 0; z-index: -1; background: radial-gradient(50% 50% at 50% 70%, rgb(24 155 220 / 0.14), transparent 70%); pointer-events: none; } .plate-fig { margin-top: var(--space-5); } /* ── 자료 요청 ───────────────────────────────────────────────────────── */ .contact-grid { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: var(--space-4) var(--space-7); align-items: center; } .contact-grid p { color: var(--ink-muted); max-width: 34em; } .btn { display: inline-flex; align-items: center; min-height: 44px; border: 1px solid var(--accent); color: var(--accent); text-decoration: none; font-weight: var(--weight-strong); padding: 0.7rem 1.4rem; border-radius: var(--radius); transition: background var(--dur-quick) var(--ease-soft), color var(--dur-quick) var(--ease-soft); } .btn:hover { background: var(--accent); color: var(--surface); } /* ── 다열 색인 푸터 ───────────────────────────────────────────────────── */ .site-foot { border-top: 1px solid var(--line-strong); padding-block: var(--space-6) var(--space-7); font-size: var(--step--1); color: var(--ink-muted); } .foot-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-5) var(--space-4); } .foot-h { font-size: var(--step--1); font-weight: var(--weight-strong); color: var(--ink); letter-spacing: 0; } .foot-col ul { list-style: none; padding: 0; margin-top: var(--space-3); } .foot-col li { padding-block: 0.15rem; } .foot-col li:not(:has(a)) { padding-block: 0.4rem; /* 링크 행(패딩 포함)과 같은 행 높이 */ } .foot-col a { display: inline-block; padding-block: 0.25rem; color: var(--ink-muted); text-decoration: none; border-bottom: 1px solid transparent; transition: color var(--dur-quick) var(--ease-soft), border-color var(--dur-quick) var(--ease-soft); } .foot-col a:hover { color: var(--ink); border-bottom-color: var(--accent); } /* ── 반응형 ───────────────────────────────────────────────────────────── */ @media (min-width: 72rem) { /* 레일: 오른쪽 고정. 긴 문서에서 현재 위치가 늘 보여야 하므로 고정한다(layout §2-c) */ .index { position: fixed; top: var(--space-5); right: var(--space-4); bottom: var(--space-5); width: var(--rail-w); padding: 0; display: flex; flex-direction: column; align-items: flex-end; text-align: right; z-index: 20; } .index-list { margin-top: auto; margin-bottom: auto; flex-direction: column; align-items: flex-end; gap: 0; } .index-list a { flex-direction: row-reverse; border-bottom: 0; border-right: 2px solid transparent; padding-right: var(--space-2); min-height: 36px; } .index-list a[aria-current="true"] { border-right-color: var(--accent); } .wrap { width: min(100% - 2 * var(--pad-inline) - var(--rail-w), var(--container)); margin-left: max(var(--pad-inline), calc((100% - var(--container) - var(--rail-w)) / 2)); } .stage { margin-inline: var(--space-4) calc(var(--rail-w) + var(--space-5)); } .hero { padding-top: var(--space-8); } } @media (max-width: 56rem) { .facts { grid-template-columns: repeat(2, minmax(0, 1fr)); } .fires-grid, .two, .contact-grid { grid-template-columns: 1fr; gap: var(--space-5); } .two-photo { max-width: 26rem; } .section { padding-block: var(--space-6); } .foot-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 40rem) { .hero { padding-top: var(--space-5); } .bp-wide { display: none; } .bp-tall { display: block; } .stage { margin-inline: 0; margin-top: var(--space-5); padding: var(--space-3); } .facts { grid-template-columns: 1fr; } .fact-value { font-size: var(--step-1); } .index-list a { min-height: 36px; } .foot-grid { grid-template-columns: 1fr; gap: var(--space-4); } }