Some checks are pending
ci / build (push) Waiting to run
Measured convergence before: split hero 13/19, top-bar nav 19/19, one-line notice footer 14/19, body Pretendard 17/21, 10 similarity pairs above 0.78. Each showcase got a pre-assigned hero family, nav form, footer form, type pair, background, accent hue, radius, motion grammar and material from outputs/rework-2026-10-06/plan.md; direction cards and the chosen reason are recorded in every design.md. After: 0 similarity warnings, 19 distinct display faces, 7 hero families, 5 nav forms, 5 footer forms, no scroll reveals, 5 showcases with SVG filter materials. Example contact values replace bracket placeholders under the existing fictional-brand notices. Thumbnails, OG images, card copy and three e2e assertions updated; dead CSS in dure-enrollment and hannam-jari removed; similarity.mjs learns the new font families.
693 lines
16 KiB
CSS
693 lines
16 KiB
CSS
@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);
|
|
}
|
|
}
|