designpaca/apps/site/public/work/lumina-optics/styles/main.css
Yun Chan 8e3cdb0d3b
Some checks are pending
ci / build (push) Waiting to run
feat(site): rework 19 marketing showcases for composition diversity
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.
2026-10-06 16:55:50 +09:00

666 lines
13 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 url("./tokens.css?v=20261002");
/* ==========================================================================
Lumina Optics — 회색 카드 위의 시험 상자.
구도: 표제가 화면 폭을 가로지르고, 그 아래 검은 시험 상자 하나가 첫 화면의
시각 주체다. 조작부는 상자 바로 아래 가로 레일에 붙어 '같은 장치'로 읽힌다.
========================================================================== */
*,
*::before,
*::after {
box-sizing: border-box;
}
* {
margin: 0;
}
html {
-webkit-text-size-adjust: 100%;
scroll-behavior: smooth;
background: var(--surface);
color-scheme: light;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
body {
word-break: keep-all;
overflow-wrap: break-word;
font-synthesis: none;
background: var(--surface);
color: var(--ink);
font-family: var(--font-body);
font-size: var(--step-0);
line-height: var(--leading-normal);
font-variant-numeric: tabular-nums;
}
:where(h1, h2, h3) {
line-height: var(--leading-tight);
text-wrap: balance;
}
h2 {
font-size: var(--step-2);
font-weight: 800;
letter-spacing: 0;
}
h3 {
font-size: var(--step-1);
font-weight: 700;
}
:where(p, th, td, figcaption, li, dd) {
text-wrap: pretty;
}
a {
color: inherit;
}
:focus-visible {
outline: 3px solid var(--ink);
outline-offset: 3px;
}
.skip {
position: absolute;
left: -9999px;
top: 0;
background: var(--ink);
color: var(--ink-on-dark);
padding: var(--space-3) var(--space-4);
z-index: 100;
}
.skip:focus {
left: var(--space-3);
top: var(--space-3);
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.wrap {
width: min(100% - 2 * var(--pad-inline), var(--container));
margin-inline: auto;
}
/* ── 머리 ── */
.site-head {
border-bottom: 1px solid var(--line);
}
.head-inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-4);
min-height: 4rem;
flex-wrap: wrap;
}
.wordmark {
display: inline-flex;
align-items: center;
gap: 0.55em;
font-weight: 800;
font-size: 1.125rem;
text-decoration: none;
white-space: nowrap;
}
.wordmark-lens {
width: 1.15em;
height: 1.15em;
border-radius: 50%;
border: 2px solid var(--ink);
position: relative;
}
.wordmark-lens::after {
content: "";
position: absolute;
inset: 50% -0.15em auto -0.5em;
height: 2px;
margin-top: -1px;
background: var(--accent);
}
.nav {
display: flex;
gap: var(--space-1);
overflow-x: auto;
scrollbar-width: none;
}
.nav a {
display: inline-flex;
align-items: center;
min-height: 44px;
padding-inline: 0.85rem;
border-radius: var(--radius-pill);
text-decoration: none;
font-size: 0.9375rem;
font-weight: 600;
white-space: nowrap;
transition: background-color var(--dur-quick) var(--ease-out);
}
.nav a:hover {
background: var(--surface-raised);
}
.scope-note {
border-bottom: 1px solid var(--line);
font-size: var(--step--1);
color: var(--ink-muted);
}
.scope-note p {
padding-block: 0.6rem;
}
/* ── 히어로 ── */
.hero {
padding-top: var(--space-5);
}
.hero-grid {
display: grid;
grid-template-columns: repeat(12, minmax(0, 1fr));
column-gap: var(--space-4);
row-gap: var(--space-4);
align-items: end;
}
.hero-kicker {
grid-column: 1 / -1;
display: flex;
align-items: center;
gap: var(--space-3);
font-weight: 700;
font-size: 0.9375rem;
}
.hero-kicker::before {
content: "";
width: 3.5rem;
height: 2px;
background: var(--accent);
}
.hero h1 {
grid-column: 1 / span 9;
font-size: var(--step-3);
font-weight: 900;
letter-spacing: -0.01em;
}
.hero .lead {
grid-column: 10 / -1;
font-size: var(--step-0);
color: var(--ink-muted);
padding-bottom: 0.4em;
}
/* ── 시험 상자 ── */
.bench {
position: relative;
margin-top: var(--space-4);
}
.bench-stage {
position: relative;
aspect-ratio: 16 / 6.4;
border-radius: var(--radius);
overflow: hidden;
/* 감사 도구가 조상 배경색으로 대비를 재므로 그라디언트 아래에 단색을 깐다. */
background-color: var(--surface-chamber);
background-image:
radial-gradient(ellipse 60% 70% at 50% 50%, #151a1b 0%, var(--surface-chamber) 70%);
}
.bench-stage canvas,
.bench-fallback {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
display: block;
}
.bench-fallback {
object-fit: cover;
}
.bench-stage canvas {
cursor: grab;
}
.bench-stage canvas:active {
cursor: grabbing;
}
.stage-label {
position: absolute;
left: var(--space-4);
top: var(--space-4);
display: flex;
gap: var(--space-3);
color: var(--ink-on-dark-muted);
font-size: var(--step--1);
font-weight: 600;
pointer-events: none;
}
.stage-label span:first-child {
color: var(--ink-on-dark);
}
.rail {
display: grid;
grid-template-columns: 1fr 1fr minmax(0, 0.9fr);
gap: var(--space-4) var(--space-5);
padding: var(--space-4) var(--space-2) 0;
align-items: end;
}
.control-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--space-3);
}
.control-head label {
font-weight: 700;
}
.control output {
font-size: var(--step-num);
font-weight: 900;
line-height: 1;
letter-spacing: -0.02em;
}
.control input[type="range"] {
width: 100%;
margin-top: var(--space-3);
height: 44px;
background: transparent;
appearance: none;
-webkit-appearance: none;
}
.control input[type="range"]::-webkit-slider-runnable-track {
height: 6px;
border-radius: var(--radius-pill);
background: var(--ink);
}
.control input[type="range"]::-moz-range-track {
height: 6px;
border-radius: var(--radius-pill);
background: var(--ink);
}
.control input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
width: 28px;
height: 28px;
margin-top: -11px;
border-radius: 50%;
border: 3px solid var(--ink);
background: var(--surface-raised);
}
.control input[type="range"]::-moz-range-thumb {
width: 22px;
height: 22px;
border-radius: 50%;
border: 3px solid var(--ink);
background: var(--surface-raised);
}
.control-hint {
font-size: var(--step--1);
color: var(--ink-muted);
}
.hud-note {
font-size: 0.9375rem;
color: var(--ink-muted);
padding-bottom: 0.9rem;
}
/* ── 섹션 공통 ── */
.section {
padding-block: var(--space-8);
}
.section-head {
display: grid;
grid-template-columns: repeat(12, minmax(0, 1fr));
gap: var(--space-4);
margin-bottom: var(--space-5);
}
.section-head .index {
grid-column: 1 / span 2;
font-weight: 800;
font-size: var(--step-1);
}
.section-head h2 {
grid-column: 3 / span 6;
}
.section-head p {
grid-column: 9 / -1;
color: var(--ink-muted);
}
/* ── 단면 ── */
.anatomy-grid {
display: grid;
grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
gap: var(--space-6);
align-items: center;
}
.lens-disc {
aspect-ratio: 1;
border-radius: 50%;
overflow: hidden;
background: var(--surface-chamber);
outline: 2px solid var(--ink);
outline-offset: 10px;
}
.lens-disc img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.lens-figure figcaption {
margin-top: var(--space-5);
font-size: var(--step--1);
color: var(--ink-muted);
text-align: center;
}
.element-list {
list-style: none;
padding: 0;
margin-top: var(--space-5);
border-top: 2px solid var(--ink);
}
.element-list li {
display: grid;
grid-template-columns: 4.5rem minmax(0, 1fr);
gap: var(--space-3);
padding-block: var(--space-3);
border-bottom: 1px solid var(--line);
}
.element-list b {
font-size: var(--step-1);
font-weight: 900;
}
.anatomy-text > p {
max-width: 34em;
}
/* ── MTF ── */
.mtf-panel {
display: grid;
grid-template-columns: minmax(0, 8fr) minmax(0, 4fr);
gap: var(--space-5);
padding: var(--space-5);
border-radius: var(--radius);
background: var(--surface-raised);
}
.mtf-plot svg {
width: 100%;
height: auto;
display: block;
}
.mtf-plot figcaption {
margin-top: var(--space-3);
font-size: var(--step--1);
color: var(--ink-muted);
}
.chart-grid line {
stroke: var(--line);
stroke-width: 1;
}
.chart-grid .axis {
stroke: var(--ink);
stroke-width: 1.5;
}
.axis-labels text {
fill: var(--ink-muted);
font-size: 13px;
font-family: var(--font-body);
}
.mtf {
fill: none;
stroke-width: 2.5;
stroke-linecap: round;
stroke-linejoin: round;
}
.mtf-10s {
stroke: var(--ink);
}
.mtf-10m {
stroke: var(--accent);
}
.mtf-30s {
stroke: var(--ink);
stroke-dasharray: 8 6;
}
.mtf-30m {
stroke: var(--accent);
stroke-dasharray: 8 6;
}
.mtf-legend {
list-style: none;
padding: 0;
display: grid;
gap: var(--space-3);
align-content: start;
}
.mtf-legend li {
display: flex;
align-items: center;
gap: var(--space-3);
font-weight: 600;
}
.key {
width: 2.5rem;
height: 0;
border-top: 3px solid var(--ink);
flex: none;
}
.key-m {
border-top-color: var(--accent);
}
.key-dash {
border-top-style: dashed;
}
.mtf-read {
margin-top: var(--space-4);
padding-top: var(--space-4);
border-top: 1px solid var(--line);
color: var(--ink-muted);
font-size: 0.9375rem;
}
/* ── 사양 ── */
.spec-table {
width: 100%;
border-collapse: collapse;
}
.spec-table th,
.spec-table td {
text-align: left;
padding: var(--space-3) var(--space-2);
border-bottom: 1px solid var(--line);
vertical-align: baseline;
}
.spec-table thead th {
font-size: var(--step--1);
font-weight: 700;
color: var(--ink-muted);
border-bottom: 2px solid var(--ink);
}
.spec-table tbody th {
font-weight: 600;
width: 28%;
}
.spec-table .num {
font-size: var(--step-2);
font-weight: 900;
white-space: nowrap;
}
.spec-table td:last-child {
color: var(--ink-muted);
}
.table-wrap {
overflow-x: auto;
}
/* ── 마무리 ── */
.closing {
padding-block: var(--space-7);
border-top: 2px solid var(--ink);
}
.closing-grid {
display: flex;
flex-wrap: wrap;
align-items: end;
justify-content: space-between;
gap: var(--space-4);
}
.closing h2 {
font-size: var(--step-3);
font-weight: 900;
max-width: 11em;
}
.btn {
display: inline-flex;
align-items: center;
gap: 0.6em;
min-height: 52px;
padding: 0 1.6rem;
border-radius: var(--radius-pill);
background: var(--ink);
color: var(--ink-on-dark);
text-decoration: none;
font-weight: 700;
white-space: nowrap;
transition: transform var(--dur-quick) var(--ease-out);
}
.btn::before {
content: "";
width: 1.4rem;
height: 2px;
background: var(--accent-on-dark);
}
.btn:hover {
transform: translateX(4px);
}
.site-foot {
border-top: 1px solid var(--line);
padding-block: var(--space-4);
font-size: var(--step--1);
color: var(--ink-muted);
}
.foot-inner {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: var(--space-3);
}
/* 넓은 화면: 조작 레일을 시험 상자 아래쪽 안으로 넣어 첫 화면에 상자와 손잡이가
함께 들어오게 한다(1440×900 실측: 레일을 상자 밖에 두면 폴드 아래로 밀렸다). */
@media (min-width: 961px) {
.rail {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: var(--space-5) var(--space-5) var(--space-4);
border-radius: 0 0 var(--radius) var(--radius);
background-color: var(--surface-chamber);
color: var(--ink-on-dark);
}
/* 레일 위쪽만 상자 속으로 녹아들게 한다. 글자가 놓이는 면은 단색이다. */
.rail::before {
content: "";
position: absolute;
left: 0;
right: 0;
bottom: 100%;
height: var(--space-6);
background: linear-gradient(to top, var(--surface-chamber), rgb(7 8 8 / 0));
pointer-events: none;
}
.rail .control-hint,
.rail .hud-note {
color: var(--ink-on-dark-muted);
}
.rail input[type="range"]::-webkit-slider-runnable-track {
background: var(--ink-on-dark-muted);
}
.rail input[type="range"]::-moz-range-track {
background: var(--ink-on-dark-muted);
}
.rail input[type="range"]::-webkit-slider-thumb {
border-color: var(--ink-on-dark);
background: var(--accent);
}
.rail input[type="range"]::-moz-range-thumb {
border-color: var(--ink-on-dark);
background: var(--accent);
}
.rail :focus-visible {
outline-color: var(--ink-on-dark);
}
}
/* ── 반응형 ── */
@media (max-width: 960px) {
.bench-stage {
aspect-ratio: 16 / 9;
}
.hero h1,
.hero .lead {
grid-column: 1 / -1;
}
.rail {
grid-template-columns: 1fr 1fr;
}
.hud-note {
grid-column: 1 / -1;
padding-bottom: 0;
}
.section-head .index,
.section-head h2,
.section-head p {
grid-column: 1 / -1;
}
.anatomy-grid,
.mtf-panel {
grid-template-columns: minmax(0, 1fr);
}
.lens-figure {
max-width: 26rem;
margin-inline: auto;
}
}
@media (max-width: 600px) {
.hero {
padding-top: var(--space-5);
}
.bench-stage {
aspect-ratio: 4 / 3;
min-height: 0;
border-radius: 20px;
}
.rail {
grid-template-columns: minmax(0, 1fr);
padding-inline: 0;
}
.mtf-panel {
padding: var(--space-4);
border-radius: 20px;
}
.nav {
width: 100%;
margin-inline: calc(-1 * var(--space-2));
}
.head-inner {
padding-block: var(--space-2);
gap: var(--space-1);
}
.spec-table .num {
font-size: var(--step-1);
}
}
.anatomy-text h2 {
margin-bottom: var(--space-4);
}