Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
98b423c28This file is pinned to the selected release. Download the original to open it in your design tool.
@import "tailwindcss";
@font-face {
font-family: 'Pretendard';
font-weight: 400;
font-style: normal;
font-display: swap;
src: url('/fonts/Pretendard-Regular.woff2') format('woff2');
}
@font-face {
font-family: 'Pretendard';
font-weight: 700;
font-style: normal;
font-display: swap;
src: url('/fonts/Pretendard-Bold.woff2') format('woff2');
}
:root {
--pretendard: 'Pretendard', ui-sans-serif, system-ui, -apple-system, sans-serif;
--cream: #F4EFE6;
--cream-2: #EDE7DB;
--ink: #141414;
--ink-muted: #6B655A;
--ink-faint: #A69F90;
--rule: #D9D1C0;
--sans: 'Inter', 'Pretendard', ui-sans-serif, system-ui, sans-serif;
--mono: 'JetBrains Mono', ui-monospace, monospace;
--serif: 'Newsreader', Georgia, serif;
--led-hex: #E8552E;
--pf-cream: #F4EFE6;
--pf-cream-2: #EDE7DB;
--pf-ink: #141414;
--pf-ink-muted: #6B655A;
--pf-ink-faint: #A69F90;
--pf-ink-ghost: #C9C2B0;
--pf-rule: #D9D1C0;
--pf-rule-soft: #E5DDC9;
--pf-led: #E8552E;
/* Destructive/error only. Kept distinct from --pf-led so the accent stays
reserved for "live" signals, per the style guide. */
--pf-danger: #A02020;
/* ── Community: the dark room ──
The community — and ONLY the community — flips the site's cream ground
to near-black, so an LED pattern is the only light on the page. The
marketing site stays cream; these tokens are namespaced --pfc-* so the
two palettes can sit in one stylesheet without either one leaking.
The accent and the cream are the same two colours as the light site,
swapped in role: cream becomes the ink, and the ground becomes the
screen the panels are cut out of. */
--pfc-ground: #0B0B0C;
--pfc-panel: #101012;
/* Behind every pattern canvas — the unlit matrix itself. */
--pfc-well: #09090B;
/* A well that carries no pattern (an "+n" overflow cell). */
--pfc-well-2: #141416;
--pfc-ink: #F4EFE6;
--pfc-ink-2: #C6C0B4;
--pfc-ink-muted: #9A9488;
--pfc-ink-faint: #6B6558;
--pfc-led: #E8552E;
/* Text ON the accent: the ground, not white — orange/white is unreadable
at the mono label sizes this palette leans on. */
--pfc-on-led: #0B0B0C;
--pfc-hair: rgba(244, 239, 230, 0.12);
--pfc-hair-soft: rgba(244, 239, 230, 0.08);
--pfc-edge: rgba(244, 239, 230, 0.22);
--pfc-edge-strong: rgba(244, 239, 230, 0.3);
--pfc-led-edge: rgba(232, 85, 46, 0.5);
--pfc-led-wash: rgba(232, 85, 46, 0.08);
--pfc-danger: #E86B5E;
--pf-sans: 'Inter', 'Pretendard', ui-sans-serif, system-ui, -apple-system, sans-serif;
--pf-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
--pf-serif: 'Newsreader', Georgia, serif;
--pf-fs-h2: 34px;
--pf-fs-sub: 16px;
--pf-fs-body: 15px;
--pf-fs-row: 18px;
--pf-fs-row-d: 14px;
--pf-fs-mono: 13px;
--pf-fs-card: 15.5px;
--pf-fs-ghost: 96px;
--pf-fs-ghost-row: 64px;
--pf-track-mono: 0.14em;
--pf-track-tight: -0.025em;
--pf-rule-w: 1px;
--pf-section-pad: 48px 40px 56px;
--pf-block-pad-y: 24px;
--pf-row-pad-y: 18px;
--pf-marquee-dur: 80s;
/* Mobile section view: 3D preview height + divider/nav bar height */
--mb-viewer-h: 44vh;
--mb-nav-h: 52px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
background: var(--cream);
color: var(--ink);
font-family: var(--sans);
font-weight: 400;
font-size: 16px;
line-height: 1.45;
-webkit-font-smoothing: antialiased;
text-rendering: geometricPrecision;
}
a { color: inherit; text-decoration: none; }
a:hover { text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
.mono { font-family: var(--mono); font-size: var(--pf-fs-mono); letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-muted); }
em.wordmark { font-family: var(--pretendard); font-style: normal; font-weight: 700; }
/* header removed */
/* ───── App Layout ───── */
.app-layout {
display: flex;
}
.mobile-page-links {
display: none;
}
.viewer-panel {
position: sticky;
top: 0;
width: 48vw;
height: 100vh;
flex-shrink: 0;
}
.content-panel {
flex: 1;
min-width: 0;
}
#three-canvas {
width: 100%; height: 100%;
display: block;
}
/* Fade-through wrapper for swapping the product scene ↔ globe (Inside). */
.viewer-fade {
width: 100%;
height: 100%;
opacity: 1;
transition: opacity 0.2s ease;
}
.viewer-fade.is-fading {
opacity: 0;
}
.viewer-hint {
top: 40px;
}
@media (max-width: 900px) {
.app-layout { flex-direction: column; }
.viewer-panel { display: none; }
.content-panel { width: 100%; }
.viewer-hint { display: none; }
/* Page links (Journal / Contact) live as a fixed, layered header in the
top-right — independent of the 3D preview, sitting above everything. */
.mobile-page-links {
display: none;
}
/* The 3D preview is hidden while the hero is full-screen, then "drops down"
and pins to the top once a section tab is opened from the bottom nav.
The nav bar (below) rises up to sit just under it as the divider. */
.viewer-panel.is-open {
display: block;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: var(--mb-viewer-h);
z-index: 5;
background: var(--cream);
animation: viewer-drop 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
}
.viewer-panel.is-open .viewer-hint {
display: block;
}
}
@keyframes viewer-drop {
from { transform: translateY(-100%); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
/* ───── Hero ───── */
.hero {
min-height: 100vh;
display: flex;
align-items: center;
padding: 80px 60px;
}
.hero-copy { max-width: 580px; }
.hero-viewer .meta {
position: absolute;
bottom: 0; left: 0;
display: flex; gap: 24px;
}
.hero-copy { max-width: 580px; }
.hero-copy h1 {
font-weight: 500;
font-size: 88px;
line-height: 1;
letter-spacing: -0.035em;
margin-bottom: 20px;
}
.hero-copy h1 em {
font-family: var(--pretendard);
font-style: normal;
font-weight: 700;
}
.hero-copy .kicker {
font-family: var(--pretendard);
font-size: 28px;
font-weight: 400;
color: var(--ink);
/* Tight, because .hero-spec below is a continuation of this line rather
than a new thought. (This used to say 66px, but an inline style on the
element had been overriding it with 24px for as long as it existed.) */
margin-bottom: 10px;
letter-spacing: -0.015em;
line-height: 1.15;
}
/* What you actually do with it — the concrete beat between the one-line
definition above and the video below. */
.hero-spec {
font-size: 15px;
line-height: 1.55;
color: var(--ink-muted);
margin: 0 0 18px;
max-width: 44ch;
}
/* L3, on its own. It used to carry the Paik passage above it as well, which
ran six lines at this size and pushed the CTA off the fold on any laptop. */
.hero-copy p.lede {
font-size: 21px;
font-weight: 500;
line-height: 1.5;
max-width: 580px;
margin-bottom: 14px;
text-wrap: pretty;
}
/* Signpost to L5, which does not run in the hero — see manifesto §11. Mono
and small on purpose: it closes the column rather than competing with it. */
.hero-footnote {
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.06em;
text-transform: uppercase;
line-height: 1.6;
color: var(--ink-muted);
margin: 0 0 26px;
max-width: 580px;
}
/* The whole line is the link, so it carries no rule until hover — a 56-char
underline at this size would weigh more than the sentence above it. */
.hero-footnote a {
color: var(--ink-muted);
border-bottom: 1px solid transparent;
padding-bottom: 1px;
transition: color 0.15s ease, border-color 0.15s ease;
}
.hero-footnote a:hover {
color: var(--ink);
border-color: var(--ink);
text-decoration: none;
}
.hero-footnote em {
font-style: italic;
}
@media (max-width: 900px) {
.hero {
display: flex;
flex-direction: column;
align-items: stretch;
padding: 36px 0 60px;
gap: 24px;
min-height: auto;
}
.hero-viewer { height: 50vh; min-height: 320px; order: -1; }
.hero-copy h1 { font-size: 50px; margin-bottom: 12px; }
.hero-copy .kicker { font-size: 20px; margin-bottom: 8px; }
.hero-spec { font-size: 14.5px; margin: 0 0 20px; }
.hero-copy p.lede { font-size: 17.5px; margin-bottom: 12px; }
.hero-footnote { font-size: 10px; margin: 0 0 20px; }
}
/* ───── Vertical Navigation Layout ───── */
.right-panel-layout {
flex: 1;
display: flex;
flex-direction: row;
height: 100vh;
min-width: 0;
}
.vertical-nav {
width: 60px;
flex-shrink: 0;
background: var(--cream);
border-left: 1px solid var(--rule);
border-right: 1px solid var(--rule);
display: flex;
flex-direction: column;
}
.v-tab-btn {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background: none;
border: none;
border-bottom: 1px solid var(--rule);
font-family: var(--mono);
font-size: 18px;
text-transform: uppercase;
color: #555; /* Slightly darker than muted */
font-weight: 500; /* slightly bolder to match the size */
cursor: pointer;
transition: color 0.2s ease, background-color 0s 0.25s;
letter-spacing: 0.1em;
position: relative;
}
.v-tab-btn:last-child {
border-bottom: none;
}
.tab-text {
writing-mode: vertical-rl;
transform: rotate(180deg);
}
.close-icon {
position: absolute;
top: 24px;
left: 50%;
transform: translateX(-50%);
font-size: 14px;
color: var(--ink);
}
.v-tab-btn:hover {
color: var(--ink);
background-color: #ffffff; /* 하얗게 변하는 호버 효과 */
transition: color 0.2s ease, background-color 0s 0s;
}
.v-tab-btn.active {
color: var(--ink);
background-color: #ffffff; /* 활성화 시 하얀색 유지 */
transition: color 0.2s ease, background-color 0s 0s;
}
.v-tab-btn::before {
content: '';
position: absolute;
right: -1px; /* 우측 구분선 가리기 */
top: 0;
width: 2px;
height: 100%;
background: #ffffff;
z-index: 10;
opacity: 0;
transition: opacity 0s 0.25s; /* 닫힐 때 0.25초 대기 후 경계선 표시 */
}
.v-tab-btn.active::before {
opacity: 1;
transition: opacity 0s 0s; /* 열릴 때는 즉시 가림 */
}
@media (max-width: 900px) {
.right-panel-layout {
flex-direction: column;
height: auto;
min-height: auto;
}
.vertical-nav {
display: none;
}
}
.content-panel {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
min-width: 0;
}
.deck-content {
animation: fadeIn 0.4s ease-out;
position: relative;
z-index: 1;
min-height: 100vh;
}
.panel-wrapper {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 0;
overflow: hidden;
opacity: 0;
pointer-events: none;
transform: translateY(16px);
transition: opacity 0.5s cubic-bezier(0.4, 0, 0.2, 1), transform 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}
.panel-wrapper.active {
position: relative;
height: auto;
overflow: visible;
opacity: 1;
pointer-events: auto;
transform: translateY(0);
}
.deck-content::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ffffff;
opacity: 0;
transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1);
z-index: -1;
pointer-events: none;
}
.content-panel.bg-white .deck-content::before {
opacity: 1;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── Pretext Animation ── */
.panel-wrapper:not(.active) .pretext-line {
opacity: 0;
transform: translateY(20px);
animation: none;
}
.panel-wrapper.active .pretext-line {
opacity: 0;
transform: translateY(20px);
animation: slideUpFadeIn 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}
@keyframes slideUpFadeIn {
0% { opacity: 0; transform: translateY(20px); }
100% { opacity: 1; transform: translateY(0); }
}
/* ── Panel Content ── */
.panel-content {
display: block;
padding: 80px 60px;
min-height: 100vh;
}
.panel-header {
margin-bottom: 40px;
}
.panel-header h2 {
font-weight: 500;
font-size: 64px;
line-height: 1;
letter-spacing: -0.035em;
margin-bottom: 18px;
color: var(--ink);
}
.panel-header .sub {
font-size: 20px;
color: var(--ink-muted);
max-width: 500px;
line-height: 1.45;
}
.panel-body {
display: block;
}
/* Version tag top-left */
.version-tag {
position: fixed; top: 24px; left: 32px; z-index: 40;
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.14em;
color: var(--ink-muted);
text-transform: uppercase;
pointer-events: none;
}
.version-tag .dot {
display: inline-block; width: 5px; height: 5px; border-radius: 50%;
background: var(--led-hex, #E8552E); margin-right: 8px; vertical-align: 1px;
box-shadow: 0 0 6px var(--led-hex, #E8552E);
}
@media (max-width: 720px) { .version-tag { top: 16px; left: 20px; } }
/* Hover tooltip */
.has-tip { position: relative; }
.has-tip:hover { z-index: 200; }
a.has-tip:hover { text-decoration: none; }
.has-tip::after {
content: attr(data-tip);
position: absolute;
left: 50%; top: calc(100% + 10px);
transform: translateX(-50%) translateY(-4px);
background: var(--ink); color: var(--cream);
font-family: var(--mono); font-size: 10px;
letter-spacing: 0.08em; text-transform: uppercase;
padding: 6px 10px;
white-space: nowrap;
opacity: 0; pointer-events: none;
transition: opacity .18s ease, transform .18s ease;
z-index: 100;
}
.has-tip:hover::after { opacity: 1; transform: translateX(-50%) translateY(0); }
/* Spec tables — minimal rule-based lists */
.spec {
margin-top: 20px;
max-width: 560px;
border-top: 1px solid var(--rule);
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.01em;
}
.spec-row {
display: grid;
grid-template-columns: 1.1fr 1.6fr 0.7fr;
gap: 20px;
padding: 10px 0;
border-bottom: 1px solid var(--rule);
color: var(--ink);
}
.spec-row .muted { color: var(--ink-muted); }
.spec-row .num { text-align: right; color: var(--ink-muted); }
.spec-total {
display: flex; justify-content: space-between;
padding: 12px 0 0;
font-family: var(--mono); font-size: 12px;
letter-spacing: 0.1em; text-transform: uppercase;
color: var(--ink-muted);
}
/* Stack diagram — thin lines */
.stack {
margin-top: 18px;
max-width: 560px;
font-family: var(--mono); font-size: var(--pf-fs-mono);
}
.stack-layer {
display: grid;
grid-template-columns: 40px 1fr 1fr;
gap: 20px;
padding: 14px 0;
border-top: 1px solid var(--rule);
align-items: baseline;
}
.stack-layer:last-child { border-bottom: 1px solid var(--rule); }
.stack-layer .n {
font-size: 10px; letter-spacing: 0.1em;
color: var(--ink-muted);
}
.stack-layer .lbl { color: var(--ink); font-weight: 500; }
.stack-layer .note { color: var(--ink-muted); font-size: 12px; }
/* Roadmap — horizontal version track */
.track {
margin-top: 20px;
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 24px;
max-width: 720px;
font-family: var(--mono); font-size: 12px;
position: relative;
}
.track::before {
content: ''; position: absolute;
top: 10px; left: 0; right: 0; height: 1px;
background: var(--rule);
}
.track-dot {
position: relative; padding-top: 26px;
}
.track-dot::before {
content: ''; position: absolute;
top: 6px; left: 0;
width: 9px; height: 9px;
background: var(--cream); border: 1px solid var(--ink);
border-radius: 50%;
}
.track-dot.is-now::before { background: var(--ink); }
.track-dot .v {
font-size: var(--pf-fs-mono); color: var(--ink); font-weight: 500;
letter-spacing: -0.005em; margin-bottom: 4px;
}
.track-dot .when {
font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase;
color: var(--ink-muted); margin-bottom: 8px;
}
.track-dot .what { color: var(--ink-muted); line-height: 1.45; font-size: 12px; }
@media (max-width: 720px) {
.track { grid-template-columns: 1fr 1fr; }
.spec-row { grid-template-columns: 1fr 1.2fr 0.5fr; gap: 12px; font-size: 12px; }
}
/* Placeholder blocks — future guide doc / video / web uploader */
.placeholder {
margin-top: 16px;
max-width: 560px;
border: 1px dashed var(--rule);
padding: 24px 22px;
display: flex; flex-direction: column; gap: 4px;
font-family: var(--mono);
color: var(--ink-muted);
background: color-mix(in oklab, var(--cream-2) 50%, transparent);
}
.placeholder .ph-label {
font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase;
}
.placeholder .ph-title {
font-family: var(--sans); font-size: 18px; color: var(--ink);
letter-spacing: -0.01em; margin: 4px 0 2px; font-weight: 500;
}
.placeholder .ph-note { font-size: 12px; line-height: 1.5; }
.placeholder.is-media {
aspect-ratio: 16/9;
justify-content: center; align-items: flex-start;
padding: 28px;
}
.placeholder a { color: var(--ink); border-bottom: 1px solid var(--ink); padding-bottom: 1px; }
.key-points {
margin-top: 10px;
max-width: 560px;
border-top: 1px solid var(--rule);
}
.key-points .kp {
display: grid; grid-template-columns: 40px 1fr; gap: 20px;
padding: 18px 0;
border-bottom: 1px solid var(--rule);
align-items: baseline;
}
.key-points .kp .n {
font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em;
color: var(--ink-muted); padding-top: 4px;
}
.key-points .kp h4 {
font-weight: 500; font-size: 20px; letter-spacing: -0.01em;
margin-bottom: 6px; color: var(--ink);
}
.key-points .kp p {
font-size: 15px; line-height: 1.55; color: var(--ink-muted);
margin: 0; max-width: none;
}
.panel-body p {
font-size: 20px;
line-height: 1.55;
margin-bottom: 28px;
max-width: 560px;
text-wrap: pretty;
}
.panel-body h3 {
font-weight: 500;
font-size: 24px;
margin-top: 48px;
margin-bottom: 10px;
letter-spacing: -0.015em;
}
.panel-body h3:first-child { margin-top: 0; }
@media (max-width: 900px) {
.tab-bar { padding: 20px 24px 16px; gap: 20px; }
.deck-content { padding: 0 24px 60px; }
.panel-header h2 { font-size: 42px; }
.panel-header .sub { font-size: 16px; }
.panel-body p { font-size: 17px; }
.panel-content { padding: 40px 0; min-height: auto; }
}
/* Patternflow editorial design system */
.pf-section-panel {
background: #ffffff;
border: 0;
color: var(--pf-ink);
font-family: var(--pf-sans);
font-size: var(--pf-fs-body);
line-height: 1.55;
padding: var(--pf-section-pad);
}
.pf-section-panel .panel-header { margin: 0 0 36px; }
.pf-h2 {
margin: 0 0 12px;
color: var(--pf-ink);
font-family: var(--pf-sans);
font-size: var(--pf-fs-h2);
font-weight: 500;
letter-spacing: var(--pf-track-tight);
line-height: 1.05;
}
.pf-sub {
max-width: 30ch;
margin: 0;
color: var(--pf-ink-muted);
font-size: var(--pf-fs-sub);
line-height: 1.45;
}
.pf-block {
padding: var(--pf-block-pad-y) 0;
border-top: var(--pf-rule-w) solid var(--pf-rule);
}
.pf-block:first-child { padding-top: 0; border-top: 0; }
.pf-head {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 20px;
margin-bottom: 30px;
}
.pf-kicker,
.pf-count,
.pf-mono {
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
color: var(--pf-ink-muted);
}
.pf-kicker { display: block; margin-bottom: 16px; }
.pf-head .pf-kicker { margin-bottom: 0; }
.pf-prose {
display: grid;
gap: 14px;
max-width: 620px;
}
.pf-prose p {
margin: 0;
max-width: none;
color: var(--pf-ink-muted);
font-size: var(--pf-fs-body);
line-height: 1.65;
}
.pf-link {
width: fit-content;
color: var(--pf-ink);
border-bottom: var(--pf-rule-w) solid currentColor;
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
text-decoration: none;
}
.pf-link:hover { color: var(--pf-ink-muted); text-decoration: none; }
.pf-row {
display: grid;
grid-template-columns: 1fr;
width: 100%;
padding: var(--pf-row-pad-y) 0;
border: 0;
border-bottom: var(--pf-rule-w) solid var(--pf-rule);
background: transparent;
color: var(--pf-ink-muted);
text-align: left;
position: relative;
overflow: hidden;
}
.pf-row:first-of-type { border-top: var(--pf-rule-w) solid var(--pf-rule); }
.pf-row.on,
.pf-row:hover,
.pf-row:focus-visible { color: var(--pf-ink); }
.pf-row .pf-ghost {
position: absolute;
right: -2px;
top: 50%;
transform: translateY(-50%);
color: var(--pf-ink-ghost);
font-family: var(--pf-sans);
font-size: var(--pf-fs-ghost-row);
font-weight: 300;
letter-spacing: -0.04em;
line-height: 1;
pointer-events: none;
}
.pf-row.on .pf-ghost { color: var(--pf-ink); }
.pf-row-t,
.pf-row-d { position: relative; z-index: 1; }
.pf-row-t {
color: inherit;
font-size: var(--pf-fs-row);
font-weight: 500;
letter-spacing: -0.01em;
line-height: 1.3;
}
.pf-row-d {
max-width: 28ch;
margin-top: 3px;
color: var(--pf-ink-muted);
font-size: var(--pf-fs-row-d);
line-height: 1.45;
}
.pf-marquee {
position: relative;
width: 100%;
overflow: hidden;
border-block: var(--pf-rule-w) solid var(--pf-rule);
}
.pf-marquee.fade {
-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 5%, #000 95%, transparent 100%);
mask-image: linear-gradient(90deg, transparent 0, #000 5%, #000 95%, transparent 100%);
}
.pf-track {
display: flex;
width: max-content;
align-items: stretch;
padding: 30px 0 28px;
animation: pf-slide var(--pf-marquee-dur) linear infinite;
}
.pf-marquee:hover .pf-track { animation-play-state: paused; }
.pf-track.pf-track-manual {
animation: none !important;
}
@keyframes pf-slide {
from { transform: translate3d(0, 0, 0); }
to { transform: translate3d(-50%, 0, 0); }
}
.pf-comment {
width: 320px;
flex-shrink: 0;
display: flex;
flex-direction: column;
gap: 14px;
padding: 0 28px;
border-right: var(--pf-rule-w) solid var(--pf-rule);
color: var(--pf-ink);
overflow: hidden;
position: relative;
}
.pf-comment .pf-ghost {
position: absolute;
right: 14px;
bottom: -4px;
color: var(--pf-ink-ghost);
font-family: var(--pf-sans);
font-size: var(--pf-fs-ghost);
font-weight: 300;
letter-spacing: -0.04em;
line-height: 1;
pointer-events: none;
}
.pf-comment p {
display: -webkit-box;
margin: 0;
max-width: none;
overflow: hidden;
color: var(--pf-ink);
font-size: var(--pf-fs-card);
line-height: 1.45;
position: relative;
z-index: 1;
-webkit-box-orient: vertical;
-webkit-line-clamp: 5;
}
.pf-comment-meta {
display: flex;
gap: 10px;
color: var(--pf-ink-muted);
font-family: var(--pf-mono);
font-size: 10px;
letter-spacing: 0.12em;
text-transform: uppercase;
position: relative;
z-index: 1;
}
@media (prefers-reduced-motion: reduce) {
.pf-track { animation: none; }
}
@media (max-width: 760px) {
:root {
--pf-fs-h2: 28px;
--pf-fs-ghost: 72px;
--pf-fs-ghost-row: 52px;
}
.pf-section-panel { padding: 36px 22px 44px; }
.pf-comment { width: 280px; padding: 0 22px; }
}
/* swipe dots removed — panels are stacked now */
.swipe-indicator { display: none; }
/* ───── Build steps (4 hand-drawn diagrams) ───── */
.steps {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 32px;
margin-top: 40px;
max-width: 560px;
}
.step figure {
display: flex; flex-direction: column;
gap: 12px;
}
.step svg {
width: 100%;
height: 90px;
color: var(--ink);
}
.step figcaption {
font-family: var(--mono);
font-size: 10.5px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink);
}
.step figcaption span {
display: block;
color: var(--ink-muted);
margin-top: 3px;
text-transform: none;
letter-spacing: 0.02em;
font-size: var(--pf-fs-mono);
}
@media (max-width: 540px) {
.steps { grid-template-columns: repeat(2, 1fr); gap: 24px; }
}
/* ───── "Inside" panel list ───── */
.inside-list {
display: flex; gap: 32px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-top: 60px;
color: var(--ink);
}
.inside-panel {
--inside-bg: #0a0a0a;
--inside-text: #e5e5e5;
--inside-heading: #ffffff;
--inside-accent: #FFD466;
--inside-wire: #444444;
}
.inside-panel .panel-header {
margin-bottom: 28px;
}
.inside-panel .panel-header h2 {
color: var(--ink);
letter-spacing: 0;
}
.inside-panel .panel-header .sub {
margin: 0;
color: var(--ink-muted);
}
.inside-body {
max-width: 620px;
}
.inside-intro {
display: grid;
gap: 0.45rem;
margin-bottom: 1.5rem;
color: var(--ink);
}
.inside-intro p,
.inside-story p,
.inside-tagline,
.inside-build-card p,
.reddit-comment-card p {
max-width: none;
}
.inside-intro p,
.inside-story p {
margin: 0;
font-size: 20px;
line-height: 1.5;
}
.inside-stats {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 0.65rem;
}
.inside-stats span {
display: inline-flex;
align-items: center;
min-height: 32px;
padding: 6px 10px;
border: 1px solid var(--ink);
background: var(--ink);
color: #ffffff;
font-family: var(--mono);
font-size: 12px;
letter-spacing: 0;
text-transform: uppercase;
}
.reddit-comment-band {
width: min(100%, 720px);
margin: 1.5rem 0;
overflow-x: auto;
overflow-y: hidden;
cursor: grab;
scrollbar-width: none;
touch-action: pan-y;
user-select: none;
}
.reddit-comment-band:active {
cursor: grabbing;
}
.reddit-comment-band::-webkit-scrollbar {
display: none;
}
.reddit-comment-track {
display: flex;
width: max-content;
gap: 12px;
padding: 2px 0;
}
.reddit-comment-card {
width: clamp(240px, 27vw, 320px);
min-height: 172px;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 18px;
padding: 16px;
border: 1px solid var(--rule);
background: #ffffff;
color: var(--ink);
text-decoration: none;
transition: border-color 0.16s ease, transform 0.16s ease;
}
.reddit-comment-card:hover {
border-color: var(--inside-accent);
text-decoration: none;
transform: translateY(-1px);
}
.reddit-comment-card p {
margin: 0;
font-size: 14px;
line-height: 1.45;
color: var(--ink);
}
.reddit-comment-card div {
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0;
text-transform: uppercase;
color: var(--ink-muted);
}
.reddit-comment-card .reddit-upvotes {
color: var(--inside-accent);
}
.inside-story {
display: grid;
gap: 1rem;
margin: 1.5rem 0;
}
.inside-story p {
color: var(--ink);
}
.inside-journal-link {
width: fit-content;
color: var(--ink);
border-bottom: 1px solid currentColor;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0;
text-transform: uppercase;
}
.inside-journal-link:hover {
color: var(--inside-accent);
text-decoration: none;
}
.inside-globe-shell {
width: min(60%, 360px);
min-width: 260px;
aspect-ratio: 1;
margin: 1.5rem 0;
background: var(--inside-bg);
border: 1px solid #1f1f1f;
overflow: hidden;
}
.inside-globe-shell canvas {
display: block;
background: transparent;
}
.inside-globe-tooltip {
display: grid;
gap: 3px;
min-width: 138px;
padding: 8px 10px;
border: 1px solid var(--pf-rule);
background: #ffffff;
color: var(--pf-ink);
font-family: var(--pf-mono);
font-size: 10px;
letter-spacing: 0;
white-space: nowrap;
pointer-events: none;
}
.inside-globe-tooltip strong {
font-family: var(--pf-sans);
font-size: var(--pf-fs-mono);
font-weight: 500;
letter-spacing: 0;
}
.inside-globe-tooltip span {
color: var(--pf-ink-muted);
}
.inside-tagline {
margin: 0 0 1.5rem;
color: var(--ink);
font-size: 18px;
line-height: 1.5;
}
.inside-build-card-wrap {
display: grid;
grid-template-rows: 0fr;
opacity: 0;
transition: grid-template-rows 0.32s ease, opacity 0.24s ease;
}
.inside-build-card-wrap.is-open {
grid-template-rows: 1fr;
opacity: 1;
margin-bottom: 1.5rem;
}
.inside-build-card {
position: relative;
min-height: 0;
overflow: hidden;
border: 1px solid var(--rule);
background: #ffffff;
padding: 1rem;
}
.inside-card-close {
position: absolute;
top: 8px;
right: 8px;
z-index: 3;
width: 28px;
height: 28px;
display: grid;
place-items: center;
border: 1px solid rgba(255, 255, 255, 0.5);
background: rgba(10, 10, 10, 0.62);
color: #ffffff;
font-family: var(--mono);
font-size: 18px;
line-height: 1;
cursor: pointer;
}
.inside-carousel {
position: relative;
aspect-ratio: 16 / 10;
overflow: hidden;
background: var(--inside-bg);
}
.inside-carousel img {
object-fit: cover;
}
.inside-image-placeholder {
width: 100%;
height: 100%;
display: grid;
place-items: center;
align-content: center;
gap: 8px;
background:
linear-gradient(90deg, rgba(255, 212, 102, 0.12) 1px, transparent 1px),
linear-gradient(0deg, rgba(255, 212, 102, 0.12) 1px, transparent 1px),
var(--inside-bg);
background-size: 24px 24px;
color: var(--inside-text);
text-align: center;
}
.inside-image-placeholder span,
.inside-image-placeholder small {
font-family: var(--mono);
letter-spacing: 0;
}
.inside-image-placeholder span {
font-size: var(--pf-fs-mono);
color: var(--inside-heading);
}
.inside-image-placeholder small {
font-size: 10px;
color: var(--inside-accent);
}
.inside-carousel-arrow {
position: absolute;
top: 50%;
width: 32px;
height: 32px;
transform: translateY(-50%);
border: 1px solid rgba(255, 255, 255, 0.45);
background: rgba(10, 10, 10, 0.58);
color: var(--inside-heading);
font-family: var(--mono);
cursor: pointer;
opacity: 0;
transition: opacity 0.16s ease;
}
.inside-carousel:hover .inside-carousel-arrow,
.inside-carousel-arrow:focus-visible {
opacity: 1;
}
.inside-carousel-arrow.is-prev {
left: 10px;
}
.inside-carousel-arrow.is-next {
right: 10px;
}
.inside-carousel-dots {
display: flex;
justify-content: center;
gap: 8px;
margin: 12px 0 16px;
}
.inside-carousel-dots button {
width: 7px;
height: 7px;
border: 0;
border-radius: 50%;
background: var(--ink-faint);
cursor: pointer;
}
.inside-carousel-dots button.is-active {
background: var(--inside-accent);
}
.inside-build-card h3 {
margin: 0 0 6px;
font-size: 22px;
letter-spacing: 0;
}
.inside-build-meta {
margin: 0 0 10px;
font-family: var(--mono);
font-size: 12px;
letter-spacing: 0;
text-transform: uppercase;
color: var(--ink-muted);
}
.inside-build-note {
margin: 0;
font-size: 14px;
line-height: 1.5;
font-style: italic;
color: var(--ink-muted);
}
.inside-cta-row {
display: flex;
flex-wrap: wrap;
gap: 1rem;
margin: 1.5rem 0 10vh;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0;
text-transform: uppercase;
}
.inside-cta-row a {
color: var(--ink);
padding-bottom: 2px;
border-bottom: 1px solid currentColor;
}
.inside-cta-row a:hover {
color: var(--inside-accent);
text-decoration: none;
}
@media (max-width: 900px) {
.inside-body {
max-width: none;
}
.inside-intro p {
font-size: 17px;
}
.inside-story p {
font-size: 17px;
}
.inside-stats span {
font-size: var(--pf-fs-mono);
}
.reddit-comment-band {
width: 100%;
}
.reddit-comment-card {
width: min(78vw, 300px);
}
.inside-globe-shell {
width: min(100%, 340px);
min-width: 0;
}
.inside-tagline {
font-size: 16px;
}
.inside-carousel-arrow {
opacity: 1;
}
}
/* ───── Sponsor ───── */
/* 60px horizontal, matching .hero — these sit directly under it in the same
column, and at 80px their content started 20px right of the wordmark. */
/* ───── Milestones: the story so far, under the hero ───── */
.milestones {
padding: 0 60px 40px;
}
.milestones-label {
display: block;
font-family: var(--mono);
font-size: 11px;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--ink-muted);
margin-bottom: 14px;
}
.milestones-list {
list-style: none;
margin: 0;
padding: 0;
max-width: 580px;
border-top: 1px solid var(--pf-rule);
}
.milestone {
padding: 10px 0;
border-bottom: 1px solid var(--pf-rule);
font-size: 15px;
line-height: 1.5;
}
.milestone-body { text-wrap: pretty; }
.milestone-body a {
color: var(--ink);
border-bottom: 1px solid var(--pf-rule);
padding-bottom: 1px;
transition: border-color 0.15s ease;
}
.milestone-body a:hover { border-color: var(--ink); text-decoration: none; }
.milestone-who { color: var(--ink-muted); }
@media (max-width: 900px) {
.milestones { padding: 0 0 32px; }
.milestone { font-size: 14.5px; }
}
.sponsor {
background: var(--cream);
padding: 34px 60px 24px;
border-top: 1px solid var(--rule);
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 14px;
text-align: left;
}
.sponsor-label {
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-muted);
}
.sponsor-logos {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-start;
gap: 32px 56px;
}
.sponsor-logo {
display: inline-flex;
opacity: 0.8;
transition: opacity 0.2s ease;
}
.sponsor-logo:hover { opacity: 1; }
.sponsor-logo img { display: block; width: auto; height: 34px; }
/* Below 900px .deck-content supplies the 24px gutter and .hero drops its own
horizontal padding, so this has to drop its own on the same breakpoint or
it sits 60px right of the wordmark. Must come after the base rule above:
a media query adds no specificity, so source order decides. */
@media (max-width: 900px) {
.sponsor { padding-left: 0; padding-right: 0; }
}
@media (max-width: 640px) {
/* Vertical only — the gutter comes from .deck-content down here. */
.sponsor { padding: 28px 0 20px; }
.sponsor-logos { gap: 24px 40px; }
}
/* ───── Footer ───── */
footer {
/* Matches .hero and .sponsor — see the note on .sponsor. */
padding: 38px 60px 42px;
font-size: 14px;
color: var(--ink-muted);
line-height: 1.6;
background: var(--cream);
}
footer .foot-row {
display: grid;
grid-template-columns: 1fr auto;
gap: 40px;
align-items: end;
}
footer .series {
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
margin-top: 28px;
color: var(--ink-muted);
}
footer em { font-style: italic; font-weight: 400; }
/* Same reasoning as .sponsor above — matches .hero dropping to a 0 gutter. */
@media (max-width: 900px) {
footer { padding-left: 0; padding-right: 0; }
}
@media (max-width: 640px) {
footer { padding: 30px 0 34px; }
footer .foot-row { grid-template-columns: 1fr; }
}
/* ───── Tweaks ───── */
.tw {
position: fixed; bottom: 20px; right: 20px;
background: var(--cream);
border: 1px solid var(--ink);
padding: 14px 16px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.06em;
text-transform: uppercase;
display: none;
z-index: 30;
min-width: 220px;
}
.tw.open { display: block; }
.tw-head { margin-bottom: 12px; color: var(--ink-muted); }
.tw-row { margin-bottom: 10px; }
.tw-row label { display: block; color: var(--ink-muted); margin-bottom: 6px; font-size: 10px; }
.tw-row .opts { display: flex; gap: 4px; flex-wrap: wrap; }
.tw-row button {
font-family: var(--mono);
font-size: 10px;
padding: 4px 8px;
background: transparent;
border: 1px solid var(--rule);
color: var(--ink);
cursor: pointer;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.tw-row button.on { background: var(--ink); color: var(--cream); border-color: var(--ink); }
/* Journal */
.hero {
position: relative;
}
.hero-top-links {
position: absolute;
top: 24px;
right: 42px;
z-index: 3;
display: flex;
align-items: flex-end;
gap: 18px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-muted);
}
.hero-top-links a {
color: inherit;
text-decoration: none;
padding-bottom: 2px;
}
.hero-top-links a:hover {
color: var(--ink);
text-decoration: underline;
}
.hero-top-links .instagram-link {
display: inline-flex;
align-items: center;
padding-bottom: 0;
}
.hero-top-links .instagram-link:hover {
text-decoration: none;
}
.hero-top-links .instagram-link svg {
width: 28px;
height: 28px;
fill: currentColor;
display: block;
}
/* Business */
.business-page {
min-height: 100vh;
background: var(--cream);
color: var(--ink);
padding: 80px 48px 140px;
}
.business-head {
width: min(100%, 1180px);
margin: 0 auto 56px;
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 24px;
padding-bottom: 14px;
border-bottom: 1px solid var(--pf-rule);
}
.business-lockup {
font-size: 18px;
font-weight: 500;
letter-spacing: -0.01em;
text-decoration: none;
}
.business-lockup:hover {
text-decoration: none;
color: var(--pf-ink-muted);
}
.business-meta,
.business-contact-link,
.business-email {
font-family: var(--pf-mono);
font-size: var(--pf-fs-mono);
letter-spacing: var(--pf-track-mono);
text-transform: uppercase;
}
.business-contact-link,
.business-email {
letter-spacing: 0.08em;
text-transform: none;
}
.business-meta {
color: var(--pf-ink-muted);
}
.business-panel {
width: min(100%, 1180px);
margin: 0 auto;
background: #ffffff;
padding: 72px 60px 76px;
}
.business-hero {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 48px;
align-items: end;
padding-bottom: 36px;
border-bottom: 1px solid var(--pf-rule);
}
.business-hero h1 {
margin: 0 0 36px;
color: var(--pf-ink);
font-size: 64px;
font-weight: 500;
letter-spacing: -0.035em;
line-height: 0.98;
}
.business-hero p {
max-width: 26ch;
margin: 0;
color: var(--pf-ink);
font-size: clamp(22px, 2.5vw, 32px);
line-height: 1.28;
letter-spacing: -0.02em;
}
.business-contact-link,
.business-email {
width: fit-content;
color: var(--pf-ink);
border-bottom: 1px solid currentColor;
text-decoration: none;
white-space: nowrap;
}
.business-contact-link {
font-size: clamp(18px, 1.8vw, 28px);
letter-spacing: 0.02em;
}
.business-email {
font-size: clamp(22px, 3vw, 40px);
letter-spacing: 0.01em;
line-height: 1.15;
}
.business-contact-link:hover,
.business-email:hover {
color: var(--pf-ink-muted);
text-decoration: none;
}
.business-intro-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 48px;
max-width: 920px;
padding: 44px 0 56px;
}
.business-intro-grid p {
margin: 0;
color: var(--pf-ink);
font-size: 17px;
line-height: 1.55;
}
.business-intro-grid p + p {
color: var(--pf-ink-muted);
}
.business-decks {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 56px;
}
.business-decks .pf-block {
padding-top: 0;
border-top: 0;
}
.business-decks .pf-row-d {
max-width: 34ch;
}
.business-contact-block {
margin-top: 44px;
}
.business-contact-block .pf-kicker {
margin-bottom: 22px;
font-size: 12.5px;
}
.business-contact-block p {
max-width: 42ch;
margin: 0 0 26px;
color: var(--pf-ink);
font-size: clamp(22px, 2.5vw, 34px);
line-height: 1.25;
letter-spacing: -0.02em;
}
.business-contact-links {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 14px;
}
.business-contact-block .pf-mono {
margin-top: 20px;
font-size: 12px;
}
.journal-lang-switch {
position: fixed;
top: 28px;
right: 34px;
z-index: 30;
display: flex;
gap: 10px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-faint);
}
.journal-lang-switch a {
color: inherit;
text-decoration: none;
}
.journal-lang-switch a.active {
color: var(--ink);
}
.journal-lang-switch a:hover {
color: var(--ink);
text-decoration: none;
}
.journal-shell {
min-height: 100vh;
background: var(--cream);
color: var(--ink);
padding: 80px 48px 140px;
}
.journal-index {
width: min(100%, 1180px);
margin: 0 auto;
padding: 0;
background: transparent;
}
.journal-panel {
background: #ffffff;
padding: 72px 60px 76px;
position: relative;
}
.journal-panel .journal-lang-switch {
position: absolute;
top: 30px;
right: 34px;
}
.journal-masthead {
display: flex;
flex-direction: column;
gap: 0;
margin-bottom: 24px;
padding-bottom: 18px;
border-bottom: 1px solid var(--pf-rule);
}
.journal-lockup,
.journal-featured-meta,
.journal-archive-label,
.journal-list-number,
.journal-list-meta,
.journal-index-footer,
.journal-back-link,
.journal-dateline,
.journal-article-footer {
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.journal-lockup {
display: inline-block;
text-decoration: none;
font-family: var(--pretendard);
font-size: 88px;
font-weight: 700;
line-height: 1;
letter-spacing: -0.035em;
text-transform: none;
color: var(--ink);
}
.journal-lockup:hover {
color: var(--pf-ink-muted);
text-decoration: none;
}
.journal-section-label {
font-family: var(--pretendard);
font-size: 44px;
font-weight: 700;
line-height: 1.1;
letter-spacing: -0.035em;
color: var(--pf-ink-muted);
}
.journal-featured {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(320px, 42%);
gap: 32px;
align-items: start;
margin-bottom: 64px;
color: var(--ink);
text-decoration: none;
}
.journal-featured-copy {
min-width: 0;
}
.journal-featured-text-only {
grid-template-columns: minmax(0, 760px);
}
.journal-featured h1 {
font-family: var(--serif);
font-size: 44px;
font-weight: 400;
line-height: 1.06;
letter-spacing: -0.022em;
margin: 0 0 16px;
text-wrap: balance;
}
.journal-featured p {
max-width: 580px;
margin: 0 0 22px;
font-family: var(--serif);
font-size: 20px;
font-style: italic;
line-height: 1.45;
color: var(--ink-muted);
}
.journal-featured-meta {
display: flex;
flex-wrap: wrap;
gap: 14px;
color: var(--ink-muted);
}
.journal-featured-meta span + span::before {
content: "·";
margin-right: 14px;
color: var(--ink-faint);
}
.journal-index-thumb {
position: relative;
display: block;
overflow: hidden;
border: 1px solid var(--rule);
background: var(--cream-2);
aspect-ratio: 16 / 9;
}
.journal-index-thumb::before {
content: "";
position: absolute;
inset: 0;
background-image: repeating-linear-gradient(
135deg,
transparent 0,
transparent 14px,
rgba(20, 20, 20, 0.035) 14px,
rgba(20, 20, 20, 0.035) 15px
);
}
.journal-index-thumb span {
position: relative;
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--ink-muted);
}
.journal-index-thumb img {
position: relative;
z-index: 1;
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.journal-cover-slot {
position: relative;
margin-top: 28px;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
border: 1px solid var(--rule);
background: var(--cream-2);
}
.journal-cover-slot::before {
content: none;
}
.journal-cover-slot span {
position: relative;
font-family: var(--mono);
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--ink-muted);
}
.journal-cover-slot img {
position: relative;
z-index: 1;
max-width: 100%;
max-height: min(64vh, 560px);
width: auto;
height: auto;
object-fit: contain;
display: block;
}
.journal-archive-label {
margin-bottom: 16px;
color: var(--ink-faint);
}
.journal-post-list {
list-style: none;
border-top: 0;
}
.journal-post-list li {
border-bottom: 0;
}
.journal-post-list a {
display: grid;
grid-template-columns: 1fr 120px 80px;
gap: 24px;
align-items: baseline;
padding-right: 104px;
color: var(--pf-ink-muted);
text-decoration: none;
}
.journal-post-list a.pf-row:first-of-type {
border-top: 0;
}
.journal-post-list li:first-child a.pf-row {
border-top: 1px solid var(--pf-rule);
}
.journal-post-list a .pf-ghost {
right: 0;
}
.journal-list-number {
color: var(--ink-faint);
}
.journal-list-body {
display: grid;
gap: 4px;
min-width: 0;
}
.journal-list-body strong {
font-family: var(--pf-sans);
}
.journal-new-badge {
display: inline-block;
margin-left: 8px;
font-family: var(--sans);
font-size: 12px;
font-weight: 500;
line-height: 1;
letter-spacing: 0;
text-transform: uppercase;
vertical-align: 0.2em;
color: var(--ink-muted);
}
.journal-list-body span,
.journal-list-meta {
color: var(--ink-muted);
position: relative;
z-index: 1;
}
.journal-list-body .journal-new-badge {
color: var(--ink);
}
.journal-list-meta {
text-align: right;
}
.journal-list-body .pf-row-d {
max-width: none;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.journal-post-list a.journal-anchor-post .pf-ghost,
.journal-post-list a.journal-anchor-post .journal-list-meta:last-child {
color: var(--pf-led);
}
.journal-index-footer {
margin-top: 32px;
padding-top: 14px;
border-top: 1px solid var(--pf-rule);
display: flex;
justify-content: flex-start;
align-items: baseline;
gap: 18px;
color: var(--ink-muted);
}
.journal-index-footer span span {
color: var(--ink-faint);
margin: 0 6px;
}
.journal-index-footer a {
color: var(--ink-muted);
text-decoration: none;
border-bottom: 1px solid currentColor;
padding-bottom: 2px;
}
.journal-index-footer a:hover {
text-decoration: none;
color: var(--ink);
}
.journal-article {
width: min(100%, 948px);
margin: 0 auto;
padding: 72px 64px 104px;
background: #ffffff;
}
.journal-back-link {
margin-bottom: 32px;
color: var(--ink-muted);
}
.journal-back-link a::before {
content: "←";
margin-right: 8px;
}
.journal-article-header {
width: 100%;
margin-bottom: 36px;
}
.journal-article-header h1 {
font-family: var(--serif);
font-size: 58px;
font-weight: 400;
line-height: 1.02;
letter-spacing: -0.022em;
margin: 0 0 28px;
text-wrap: balance;
}
.journal-article-header > p {
max-width: 691px;
margin: 0 0 32px;
font-family: var(--serif);
font-size: 22px;
font-style: italic;
line-height: 1.4;
color: var(--ink-muted);
}
.journal-dateline {
display: flex;
justify-content: space-between;
gap: 16px;
padding-top: 14px;
border-top: 1px solid var(--pf-rule);
color: var(--ink-muted);
}
.journal-hero-cover {
width: min(100%, 608px);
margin: 0 auto 40px;
text-align: center;
}
.journal-hero-cover .journal-cover-slot {
margin-top: 0;
min-height: 0;
padding: 0;
border: 0;
background: transparent;
display: block;
overflow: visible;
text-align: center;
}
.journal-hero-cover .journal-cover-slot::before {
content: none;
display: none;
}
.journal-hero-cover .journal-cover-slot img {
display: block;
width: auto;
height: auto;
max-width: 100%;
margin: 0 auto;
cursor: zoom-in;
}
.journal-hero-cover figcaption {
display: block;
margin-top: 10px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.06em;
color: var(--ink-muted);
text-align: center;
}
.journal-reading {
width: 100%;
font-family: var(--serif);
font-size: 18px;
line-height: 1.72;
letter-spacing: -0.005em;
color: var(--ink);
}
.journal-reading p {
margin: 0 0 1.1em;
}
.journal-reading h1,
.journal-reading h2,
.journal-reading h3 {
font-family: var(--sans);
font-weight: 500;
line-height: 1.15;
letter-spacing: -0.015em;
}
.journal-reading h1,
.journal-reading h2 {
font-size: 24px;
margin: 56px 0 18px;
}
.journal-reading h3 {
font-size: 17px;
margin: 36px 0 10px;
}
.journal-reading a {
color: var(--ink);
text-decoration: underline;
text-underline-offset: 3px;
}
.journal-reading blockquote {
margin: 28px 0;
padding: 4px 0 4px 24px;
border-left: 1px solid var(--ink);
font-family: var(--sans);
font-size: 20px;
font-style: normal;
font-weight: 500;
letter-spacing: -0.015em;
line-height: 1.3;
color: var(--ink);
}
.journal-reading code {
font-family: var(--mono);
font-size: 14px;
background: var(--cream-2);
padding: 1px 5px;
}
.journal-reading pre {
overflow: auto;
margin: 28px 0;
padding: 20px 22px;
background: var(--ink);
color: var(--cream);
font-family: var(--mono);
font-size: var(--pf-fs-mono);
line-height: 1.55;
}
.journal-md-figure {
width: min(100%, 608px);
margin: 44px auto;
text-align: center;
}
.journal-md-figure img {
max-width: 100%;
max-height: min(70vh, 544px);
width: auto;
height: auto;
display: block;
margin: 0 auto;
border: 1px solid var(--rule);
background: var(--cream-2);
cursor: zoom-in;
}
.journal-md-figure iframe {
display: block;
width: 100%;
aspect-ratio: 16 / 9;
height: auto;
border: 0;
}
.journal-md-figure figcaption {
margin-top: 10px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.06em;
color: var(--ink-muted);
text-align: center;
}
.journal-md-figure:has(+ .journal-md-figure) {
display: inline-block;
width: calc(50% - 12px);
margin: 44px 20px 44px 0;
vertical-align: top;
}
.journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure {
display: inline-block;
width: calc(50% - 12px);
margin: 44px 0;
vertical-align: top;
}
.journal-md-figure:has(+ .journal-md-figure) img,
.journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure img {
max-height: 360px;
}
.journal-figure-row {
width: 100%;
margin: 44px 0;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
align-items: start;
}
.journal-figure-row .journal-md-figure,
.journal-figure-row .journal-md-figure:has(+ .journal-md-figure),
.journal-figure-row .journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure {
display: block;
width: 100%;
margin: 0;
}
.journal-figure-row .journal-md-figure img,
.journal-figure-row .journal-md-figure:has(+ .journal-md-figure) img,
.journal-figure-row .journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure img {
max-width: 100%;
max-height: 360px;
width: auto;
height: auto;
margin: 0 auto;
}
.journal-reading table {
width: 100%;
margin: 32px 0;
border-collapse: collapse;
border-top: 1px solid var(--rule);
border-bottom: 1px solid var(--rule);
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.04em;
}
.journal-reading th,
.journal-reading td {
padding: 14px 14px 14px 0;
border-top: 1px solid var(--rule);
text-align: left;
}
.journal-reading th {
color: var(--ink-muted);
font-weight: 400;
text-transform: uppercase;
}
.journal-reading hr {
height: 1px;
margin: 72px 0 20px;
border: 0;
background: var(--rule);
}
.journal-figure {
margin: 36px 0;
}
.journal-figure-wide {
width: min(82vw, 1312px);
margin-left: 50%;
transform: translateX(-50%);
}
.journal-figure-full {
width: 100vw;
margin-left: 50%;
transform: translateX(-50%);
}
.journal-figure img,
.journal-figure video {
width: 100%;
height: auto;
display: block;
border: 1px solid var(--rule);
background: var(--cream-2);
}
.journal-lightbox {
position: fixed;
inset: 0;
z-index: 1000;
display: grid;
place-items: center;
padding: 40px;
background: rgba(20, 20, 20, 0.88);
cursor: zoom-out;
}
.journal-lightbox figure {
max-width: min(96vw, 1440px);
max-height: 92vh;
margin: 0;
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
cursor: default;
}
.journal-lightbox img {
max-width: min(96vw, 1440px);
max-height: calc(92vh - 44px);
width: auto;
height: auto;
object-fit: contain;
display: block;
}
.journal-lightbox figcaption {
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
color: var(--cream);
text-align: center;
}
.journal-lightbox-close {
position: fixed;
top: 24px;
right: 28px;
border: 0;
background: transparent;
color: var(--cream);
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
cursor: pointer;
}
.journal-figure figcaption {
margin-top: 10px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.06em;
color: var(--ink-muted);
}
.journal-end-mark {
margin-top: 80px;
display: flex;
justify-content: center;
align-items: center;
gap: 12px;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-muted);
}
.journal-end-mark span:first-child,
.journal-end-mark span:last-child {
width: 24px;
height: 1px;
background: var(--ink-faint);
}
.journal-article-footer {
width: min(100%, 948px);
margin: 34px auto 0;
display: grid;
gap: 18px;
color: var(--ink-muted);
}
.journal-context-list {
list-style: none;
border-top: 1px solid var(--pf-rule);
/* Undo the footer's mono/uppercase label styling so titles and dates
render like the journal index list. */
font-family: var(--pf-sans);
letter-spacing: normal;
text-transform: none;
}
.journal-context-list .pf-row {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 24px;
align-items: baseline;
padding-right: 56px;
border-top: 0;
color: var(--ink-muted);
text-decoration: none;
}
/* Title + date inherit uppercase/mono from .journal-article-footer; reset
them directly so they read like the journal index list. */
.journal-context-list .pf-row-t {
font-family: var(--pf-sans);
font-size: var(--pf-fs-row);
letter-spacing: -0.01em;
text-transform: none;
}
.journal-context-list .pf-ghost {
right: 0;
}
.journal-context-list a.pf-row:hover,
.journal-context-list a.pf-row:focus-visible {
color: var(--pf-ink);
}
.journal-context-list a.pf-row:hover .pf-row-t,
.journal-context-list a.pf-row:focus-visible .pf-row-t,
.journal-all-writing-link:hover,
.journal-all-writing-link:focus-visible {
text-decoration: underline;
text-underline-offset: 4px;
text-decoration-thickness: 1px;
}
.journal-context-list .is-current-row {
color: var(--ink);
cursor: default;
}
.journal-context-list .is-current .pf-ghost {
color: var(--ink);
}
.journal-context-list .journal-list-meta {
text-align: right;
white-space: nowrap;
font-family: var(--pf-sans);
font-size: var(--pf-fs-row-d);
letter-spacing: normal;
text-transform: none;
}
.journal-all-writing-link {
width: fit-content;
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-muted);
text-decoration: none;
border-bottom: 1px solid currentColor;
padding-bottom: 2px;
}
.signal-lost {
min-height: 100vh;
display: grid;
place-items: center;
background: var(--cream);
color: var(--ink);
}
.signal-lost h1 {
font-size: clamp(120px, 20vw, 200px);
font-weight: 500;
line-height: 1;
letter-spacing: -0.035em;
}
.signal-lost a {
position: fixed;
bottom: 32px;
left: 50%;
transform: translateX(-50%);
font-family: var(--mono);
font-size: var(--pf-fs-mono);
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-muted);
}
@media (max-width: 720px) {
.business-page { padding: 48px 18px 96px; }
.business-head {
margin-bottom: 32px;
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.business-panel {
padding: 40px 24px 48px;
}
.business-hero,
.business-intro-grid,
.business-decks {
grid-template-columns: 1fr;
}
.business-hero {
gap: 22px;
align-items: start;
}
.business-hero h1 {
font-size: 42px;
}
.business-hero p {
font-size: 21px;
}
.business-intro-grid p {
font-size: 15.5px;
}
.business-contact-block p {
font-size: 22px;
line-height: 1.3;
}
.business-intro-grid {
gap: 16px;
padding: 34px 0 44px;
}
.business-decks {
gap: 40px;
}
.business-contact-link,
.business-email {
white-space: normal;
overflow-wrap: anywhere;
}
.business-contact-link {
font-size: 17px;
line-height: 1.4;
}
.business-email {
font-size: 17px;
line-height: 1.3;
}
.journal-lang-switch {
top: 18px;
right: 22px;
}
.journal-shell {
padding: 36px 24px 96px;
}
.journal-index {
width: 100%;
}
.journal-panel,
.journal-article {
width: 100%;
padding: 24px 24px 72px;
}
.journal-panel .journal-lang-switch {
position: static;
margin-bottom: 20px;
}
.journal-index-footer {
flex-direction: column;
align-items: flex-start;
gap: 12px;
}
.journal-lockup {
font-size: 50px;
}
.journal-section-label {
font-size: 25px;
}
.journal-featured h1 {
font-size: 36px;
}
.journal-featured {
grid-template-columns: 1fr;
gap: 24px;
}
.journal-index-thumb {
width: 100%;
}
.journal-article-header h1 {
font-size: 42px;
}
.journal-article-header > p {
font-size: 18px;
}
.journal-reading {
font-size: 15px;
line-height: 1.68;
}
.journal-reading h1,
.journal-reading h2 {
font-size: 19px;
}
.journal-reading h3 {
font-size: 16px;
}
.journal-reading blockquote {
font-size: 16px;
}
.journal-post-list a {
display: block;
position: relative;
padding: 14px 54px 14px 0;
min-height: auto;
}
.journal-post-list a .pf-ghost {
position: absolute;
right: 0;
top: 50%;
bottom: auto;
transform: translateY(-50%);
font-size: 42px;
line-height: 1;
color: var(--pf-ink-ghost);
}
.journal-list-body {
max-width: calc(100% - 10px);
}
.journal-list-body strong {
display: block;
max-width: 100%;
font-size: 18px;
line-height: 1.25;
}
.journal-list-body .pf-row-d {
display: block;
max-width: 100%;
margin-top: 6px;
font-size: var(--pf-fs-row-d);
line-height: 1.4;
white-space: normal;
}
.journal-new-badge {
display: inline-block;
margin: 0 0 0 8px;
font-size: 11px;
vertical-align: middle;
}
.journal-list-meta {
display: inline-block;
margin-top: 8px;
font-size: 10.5px;
line-height: 1;
text-transform: uppercase;
color: var(--ink-muted);
}
.journal-list-meta + .journal-list-meta {
position: static;
margin-left: 12px;
}
.journal-list-meta + .journal-list-meta::before {
content: "·";
margin-right: 12px;
color: var(--pf-ink-muted);
}
.journal-figure-wide,
.journal-figure-full {
width: 100%;
margin-left: 0;
transform: none;
}
.journal-md-figure,
.journal-md-figure:has(+ .journal-md-figure),
.journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure {
display: block;
width: 100%;
margin: 36px auto;
}
.journal-figure-row {
display: block;
width: 100%;
margin: 36px 0;
}
.journal-figure-row .journal-md-figure,
.journal-figure-row .journal-md-figure:has(+ .journal-md-figure),
.journal-figure-row .journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure {
width: 100%;
margin: 36px auto;
}
.journal-md-figure img,
.journal-md-figure:has(+ .journal-md-figure) img,
.journal-md-figure:has(+ .journal-md-figure) + .journal-md-figure img {
max-height: min(70vh, 544px);
}
.journal-context-list .pf-row {
display: block;
padding: 14px 54px 14px 0;
}
.journal-context-list .journal-list-meta {
text-align: left;
}
}
/* ───── Mobile-only: Section nav / divider bar ─────
Sits at the screen bottom over the full-screen hero. When a section opens,
it rides up to pin just below the 3D preview, acting as the partition
between the preview scene (above) and the page content (below). */
.mobile-bottom-nav {
display: none;
}
@media (max-width: 900px) {
.mobile-bottom-nav {
display: grid;
grid-template-columns: repeat(3, 1fr);
position: fixed;
left: 0;
right: 0;
top: 0;
height: var(--mb-nav-h);
z-index: 50;
background: var(--cream);
border-top: 1px solid var(--rule);
border-bottom: 1px solid var(--rule);
/* Parked at the bottom of the viewport while the hero is full-screen. */
transform: translateY(calc(100dvh - var(--mb-nav-h) - env(safe-area-inset-bottom, 0px)));
transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
}
/* Risen up to become the divider directly beneath the 3D preview. */
.mobile-bottom-nav.is-open {
transform: translateY(var(--mb-viewer-h));
}
.mobile-bottom-nav .mb-tab {
appearance: none;
-webkit-appearance: none;
background: none;
border: 0;
border-right: 1px solid var(--rule);
font-family: var(--mono);
font-size: 12px;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--ink-muted);
cursor: pointer;
transition: color 0.2s ease, background-color 0.2s ease;
}
.mobile-bottom-nav .mb-tab:last-child {
border-right: 0;
}
.mobile-bottom-nav .mb-tab.active {
color: var(--cream);
background: var(--ink);
}
/* Hero (closed): keep the footer clear of the parked nav at the bottom. */
.content-panel {
padding-bottom: calc(var(--mb-nav-h) + env(safe-area-inset-bottom, 0px));
}
/* Section open: make room for the fixed preview + divider stacked on top. */
.content-panel.viewer-open {
padding-top: calc(var(--mb-viewer-h) + var(--mb-nav-h));
padding-bottom: 40px;
}
/* Force mobile override for top header links by placing it at the end of the file */
.hero-top-links {
position: absolute !important;
top: 14px !important;
right: -8px !important;
font-size: 11px !important;
gap: 12px !important;
}
.hero-top-links .instagram-link svg {
width: 20px !important;
height: 20px !important;
}
}