@font-face {
font-family: "Bricolage Grotesque";
font-style: normal;
font-weight: 200 800;
font-display: swap;
src: url("../fonts/bricolage-grotesque-display.woff2") format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "Space Grotesk";
font-style: normal;
font-weight: 300 700;
font-display: swap;
src: url("../fonts/space-grotesk.woff2") format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 400;
font-display: swap;
src: url("../fonts/ibm-plex-mono-400.woff2") format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "IBM Plex Mono";
font-style: normal;
font-weight: 500;
font-display: swap;
src: url("../fonts/ibm-plex-mono-500.woff2") format("woff2");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
font-family: "Caveat";
font-style: normal;
font-weight: 600;
font-display: swap;
src: url("../fonts/caveat-hand.woff2") format("woff2");
unicode-range: U+0020-007E;
}
:root {
--paper: #09090b;
--paper-2: #131316;
--paper-3: #1c1c21;
--ink: #f4f4f6;
--ink-2: #b4b4bd;
--muted: #8e8e99;
--faint: #4b4b55;
--line: rgba(244, 244, 246, 0.1);
--line-strong: rgba(244, 244, 246, 0.22);
--accent: #8b3dff;
--accent-ink: #b794ff;
--accent-soft: rgba(139, 61, 255, 0.14);
--on-accent: #ffffff;
--panel: #141418;
--on-panel: #f4f4f6;
--on-panel-2: #b4b4bd;
--font-display: "Bricolage Grotesque", system-ui, sans-serif;
--font-sans: "Space Grotesk", system-ui, -apple-system, "Segoe UI", sans-serif;
--font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
--font-hand: "Caveat", "Segoe Print", cursive;
--gutter: clamp(20px, 5.5vw, 120px);
--maxw: 1920px;
--header-h: 80px;
--radius-pill: 999px;
--radius-field: 8px;
--radius-media: 12px;
--radius-panel: 16px;
--ease: cubic-bezier(0.23, 1, 0.32, 1);
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
--shadow-lift: 0 24px 60px -30px rgba(0, 0, 0, 0.9);
color-scheme: dark;
}
:root[data-theme="xray"] {
--paper: #f5f5f7;
--paper-2: #eaeaee;
--paper-3: #dedee4;
--ink: #0b0b0e;
--ink-2: #45454f;
--muted: #63636e;
--faint: #a0a0aa;
--line: rgba(11, 11, 14, 0.12);
--line-strong: rgba(11, 11, 14, 0.26);
--accent: #7e1fcc;
--accent-ink: #6a12b5;
--accent-soft: rgba(126, 31, 204, 0.08);
--panel: #0b0b0e;
--shadow-lift: 0 24px 60px -30px rgba(0, 0, 0, 0.35);
color-scheme: light;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
-webkit-text-size-adjust: 100%;
scroll-behavior: smooth;
scroll-padding-top: 24px;
}
body {
margin: 0;
background: var(--paper);
color: var(--ink);
font-family: var(--font-sans);
font-size: 17px;
line-height: 1.55;
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transition: background-color 0.5s var(--ease), color 0.5s var(--ease);
}
img,
svg,
video {
display: block;
max-width: 100%;
}
h1, h2, h3, h4, p, figure, blockquote {
margin: 0;
}
ul, ol {
margin: 0;
padding: 0;
list-style: none;
}
a {
color: inherit;
text-decoration: none;
}
button,
input,
textarea {
font: inherit;
color: inherit;
}
button {
cursor: pointer;
background: none;
border: 0;
padding: 0;
}
::selection {
background: var(--accent);
color: var(--on-accent);
}
:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 3px;
border-radius: 4px;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
border: 0;
}
.skip-link {
position: fixed;
left: 16px;
top: -80px;
z-index: 1000;
padding: 10px 16px;
border-radius: var(--radius-pill);
background: var(--ink);
color: var(--paper);
font-size: 14px;
}
.skip-link:focus {
top: 16px;
}
.container {
width: 100%;
max-width: var(--maxw);
margin-inline: auto;
padding-inline: var(--gutter);
}
.sec {
position: relative;
min-height: 100vh;
min-height: 100svh;
display: flex;
flex-direction: column;
justify-content: center;
padding-block: calc(var(--header-h) + 24px) clamp(64px, 8vw, 112px);
}
.sec > .container {
width: 100%;
}
.display-xl,
.display-l,
.display-m {
font-family: var(--font-display);
font-weight: 500;
color: var(--ink);
font-optical-sizing: auto;
}
.display-xl {
font-size: clamp(52px, 7.2vw, 120px);
line-height: 0.96;
letter-spacing: -0.035em;
}
.display-l {
font-size: clamp(40px, 5.2vw, 76px);
line-height: 1;
letter-spacing: -0.035em;
}
.display-m {
font-size: clamp(24px, 2.4vw, 34px);
line-height: 1.12;
letter-spacing: -0.02em;
}
.tone-2 {
color: var(--muted);
}
.lead {
font-size: clamp(19px, 1.6vw, 23px);
line-height: 1.45;
color: var(--ink-2);
}
.mono {
font-family: var(--font-mono);
font-size: 13px;
line-height: 1.5;
letter-spacing: 0;
}
.mono-caps {
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.5;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
}
.muted {
color: var(--muted);
}
.hand {
font-family: var(--font-hand);
font-weight: 600;
font-size: 26px;
line-height: 1;
color: var(--accent);
}
.dot {
color: var(--accent);
}
.label-index {
display: inline-flex;
align-items: center;
gap: 10px;
font-family: var(--font-mono);
font-size: 13px;
color: var(--muted);
}
.label-index > :first-child {
color: var(--accent-ink);
}
.label-index::after {
content: none;
}
.label-index .rule {
display: inline-block;
width: 24px;
height: 1px;
background: var(--line-strong);
}
.btn-pill {
--btn-bg: var(--ink);
--btn-fg: var(--paper);
--btn-icon-bg: var(--accent);
--btn-icon-fg: var(--on-accent);
display: inline-flex;
align-items: center;
gap: 14px;
min-height: 52px;
padding: 6px 6px 6px 24px;
border: 1px solid transparent;
border-radius: var(--radius-pill);
background: var(--btn-bg);
color: var(--btn-fg);
font-family: var(--font-sans);
font-size: 15px;
font-weight: 500;
line-height: 1;
white-space: nowrap;
transition: transform 0.4s var(--ease), background-color 0.3s, color 0.3s, border-color 0.3s;
}
.btn-pill:hover {
transform: translateY(-1px);
}
.btn-pill:active {
transform: translateY(1px) scale(0.99);
}
.btn-icon {
display: grid;
place-items: center;
flex: none;
width: 40px;
height: 40px;
border-radius: 50%;
background: var(--btn-icon-bg);
color: var(--btn-icon-fg);
overflow: hidden;
}
.btn-icon .i-arrow {
transition: transform 0.45s var(--ease);
}
.btn-pill:hover .btn-icon .i-arrow,
.link-arrow:hover .i-arrow,
.btn-pill--outline {
--btn-bg: transparent;
--btn-fg: var(--ink);
--btn-icon-bg: var(--paper-2);
--btn-icon-fg: var(--ink);
border-color: var(--line-strong);
}
.btn-pill--outline:hover {
border-color: var(--ink);
}
.btn-pill[disabled] {
opacity: 0.6;
cursor: progress;
transform: none;
}
.i-arrow {
width: 16px;
height: 16px;
fill: none;
stroke: currentColor;
stroke-width: 1.6;
stroke-linecap: round;
stroke-linejoin: round;
}
.i-arrow--up,
.i-arrow--down {
transform: none !important;
}
.link-arrow {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 15px;
font-weight: 500;
color: var(--ink);
background-image: linear-gradient(currentColor, currentColor);
background-size: 0% 1px;
background-position: 0 100%;
background-repeat: no-repeat;
transition: background-size 0.45s var(--ease);
}
.link-arrow:hover {
background-size: 100% 1px;
}
.link-arrow .i-arrow {
width: 14px;
height: 14px;
transition: transform 0.45s var(--ease);
}
.chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 3px 8px;
border: 1px solid var(--line-strong);
border-radius: 4px;
background: var(--paper);
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.5;
color: var(--ink);
white-space: nowrap;
}
.spec-label {
display: inline-block;
padding: 1px 6px;
background: var(--accent);
color: var(--on-accent);
font-family: var(--font-mono);
font-size: 11px;
line-height: 1.6;
white-space: nowrap;
}
.crop {
position: relative;
}
.crop::before {
content: "";
position: absolute;
inset: -10px;
pointer-events: none;
background:
linear-gradient(var(--accent), var(--accent)) top left / 10px 1px,
linear-gradient(var(--accent), var(--accent)) top left / 1px 10px,
linear-gradient(var(--accent), var(--accent)) top right / 10px 1px,
linear-gradient(var(--accent), var(--accent)) top right / 1px 10px,
linear-gradient(var(--accent), var(--accent)) bottom left / 10px 1px,
linear-gradient(var(--accent), var(--accent)) bottom left / 1px 10px,
linear-gradient(var(--accent), var(--accent)) bottom right / 10px 1px,
linear-gradient(var(--accent), var(--accent)) bottom right / 1px 10px;
background-repeat: no-repeat;
opacity: 0.7;
}
.frame {
position: relative;
border: 1px solid var(--line-strong);
border-radius: var(--radius-media);
background: var(--paper);
overflow: hidden;
}
.frame-bar {
display: flex;
align-items: center;
gap: 6px;
height: 36px;
padding-inline: 16px;
border-bottom: 1px solid var(--line-strong);
}
.frame-bar i {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--faint);
opacity: 0.6;
}
.panel-dark {
background: var(--panel);
color: var(--on-panel);
border-radius: var(--radius-panel);
}
.js .reveal {
opacity: 0;
filter: blur(8px);
transform: translateY(18px);
transition:
opacity 0.9s var(--ease),
filter 0.9s var(--ease),
transform 0.9s var(--ease);
transition-delay: var(--reveal-delay, 0ms);
}
.js .reveal.is-in {
opacity: 1;
filter: none;
transform: none;
}
.site-header {
position: fixed;
top: 12px;
left: 12px;
right: 12px;
z-index: 100;
}
.nav-bar {
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: center;
gap: 16px;
height: 56px;
padding: 0 8px 0 10px;
border: 1px solid var(--line);
border-radius: 10px;
background: color-mix(in srgb, var(--paper-2) 82%, transparent);
-webkit-backdrop-filter: blur(16px) saturate(1.2);
backdrop-filter: blur(16px) saturate(1.2);
transition: border-color 0.3s, background-color 0.3s;
}
.site-header.is-open .nav-bar {
border-color: var(--line-strong);
}
.nav-brand {
display: inline-flex;
align-items: center;
gap: 12px;
justify-self: start;
}
.nav-logo {
display: grid;
place-items: center;
width: 36px;
height: 36px;
border-radius: 6px;
background: var(--paper-3);
color: var(--accent);
}
.nav-logo svg {
width: 20px;
height: 20px;
}
.nav-links {
display: flex;
align-items: center;
gap: clamp(18px, 2.4vw, 40px);
}
.nav-links a,
.nav-more {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 15px;
font-weight: 500;
color: var(--ink);
}
.roll {
position: relative;
display: inline-block;
height: 1.3em;
overflow: hidden;
line-height: 1.3;
}
.roll > span {
display: block;
transition: transform 0.45s var(--ease);
}
.nav-links a:hover .roll > span,
.nav-links a:focus-visible .roll > span,
.nav-more:hover .roll > span,
.nav-cta:hover .roll > span {
transform: translateY(-100%);
}
.nav-chev {
width: 14px;
height: 14px;
fill: none;
stroke: currentColor;
stroke-width: 1.6;
stroke-linecap: round;
stroke-linejoin: round;
transition: transform 0.35s var(--ease);
}
.nav-more[aria-expanded="true"] .nav-chev {
transform: rotate(180deg);
}
.nav-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 10px;
}
.nav-cta {
display: inline-flex;
align-items: center;
gap: 10px;
height: 40px;
padding: 0 6px 0 14px;
border-radius: 6px;
background: var(--accent);
color: var(--on-accent);
font-size: 14px;
font-weight: 500;
white-space: nowrap;
transition: transform 0.4s var(--ease), filter 0.3s;
}
.nav-cta:hover {
filter: brightness(1.12);
}
.nav-cta-ico {
display: grid;
place-items: center;
width: 28px;
height: 28px;
border-radius: 4px;
background: rgba(0, 0, 0, 0.35);
}
.nav-cta-ico .i-arrow {
width: 14px;
height: 14px;
transition: transform 0.45s var(--ease);
}
.nav-cta:hover .nav-cta-ico .i-arrow {
transform: rotate(45deg);
}
.nav-panel {
display: grid;
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
gap: 24px;
margin-top: 10px;
padding: 28px;
border: 1px solid var(--line-strong);
border-radius: 10px;
background: color-mix(in srgb, var(--paper-2) 94%, transparent);
-webkit-backdrop-filter: blur(20px);
backdrop-filter: blur(20px);
box-shadow: var(--shadow-lift);
animation: nav-panel-in 0.45s var(--ease) both;
}
.nav-panel[hidden] {
display: none;
}
@keyframes nav-panel-in {
from { opacity: 0; transform: translateY(-8px); clip-path: inset(0 0 100% 0 round 10px); }
to { opacity: 1; transform: none; clip-path: inset(0 0 0 0 round 10px); }
}
.nav-panel-h {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 20px;
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.18em;
text-transform: uppercase;
color: var(--muted);
}
.nav-panel-h span {
width: 5px;
height: 5px;
background: var(--accent);
}
.nav-pages {
display: grid;
gap: 4px;
}
.nav-pages a {
display: grid;
gap: 2px;
padding: 10px 12px;
margin: 0 -12px;
border-radius: 6px;
transition: background-color 0.25s;
}
.nav-pages a:hover {
background: var(--paper-3);
}
.nav-pages b {
font-weight: 500;
color: var(--ink);
}
.nav-pages span {
font-size: 14px;
color: var(--muted);
}
.nav-cards {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
.nav-card {
position: relative;
display: flex;
flex-direction: column;
justify-content: flex-end;
gap: 8px;
min-height: 220px;
padding: 16px;
border: 1px solid var(--line);
border-radius: 8px;
overflow: hidden;
color: #f4f4f6;
isolation: isolate;
}
.nav-card img {
position: absolute;
inset: 0;
z-index: -1;
width: 100%;
height: 100%;
object-fit: cover;
filter: brightness(0.7);
transition: transform 0.8s var(--ease);
}
.nav-card:hover img {
transform: scale(1.05);
}
.nav-card-t {
font-size: 16px;
font-weight: 500;
line-height: 1.25;
}
.nav-card-m {
display: flex;
align-items: center;
justify-content: space-between;
font-size: 11px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: #c4c4cc;
}
.nav-card-m .i-arrow {
width: 14px;
height: 14px;
}
.nav-scrim {
position: fixed;
inset: 0;
z-index: 99;
background: rgba(9, 9, 11, 0.35);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
opacity: 0;
visibility: hidden;
transition: opacity 0.35s var(--ease), visibility 0.35s;
}
.nav-scrim.is-on {
opacity: 1;
visibility: visible;
}
.wordmark {
font-family: var(--font-sans);
font-size: 20px;
font-weight: 600;
letter-spacing: -0.03em;
line-height: 1;
color: var(--ink);
}
.wordmark--xl {
display: inline-block;
font-size: clamp(72px, 11vw, 168px);
letter-spacing: -0.05em;
}
.xray-toggle {
display: inline-flex;
align-items: center;
gap: 8px;
height: 40px;
padding: 0 14px;
border-radius: var(--radius-pill);
font-size: 15px;
font-weight: 500;
white-space: nowrap;
transition: background-color 0.3s, color 0.3s;
}
.xray-toggle .i {
width: 16px;
height: 16px;
fill: none;
stroke: currentColor;
stroke-width: 1.6;
stroke-linecap: round;
}
.xray-toggle:hover {
background: var(--paper-2);
}
.xray-toggle[aria-pressed="true"] {
background: var(--accent);
color: var(--on-accent);
}
.menu-btn,
.menu-close {
position: relative;
display: grid;
place-content: center;
gap: 4px;
width: 40px;
height: 40px;
border-radius: 50%;
background: var(--ink);
transition: transform 0.4s var(--ease);
}
.menu-btn span,
.menu-close span {
display: block;
width: 14px;
height: 1.6px;
border-radius: 2px;
background: var(--paper);
transition: transform 0.4s var(--ease);
}
.menu-btn:hover {
transform: scale(1.06);
}
.menu-close span:first-child {
transform: translateY(2.8px) rotate(45deg);
}
.menu-close span:last-child {
transform: translateY(-2.8px) rotate(-45deg);
}
.menu {
position: fixed;
inset: 0;
z-index: 200;
background: var(--paper);
overflow-y: auto;
animation: menu-in 0.6s var(--ease) both;
}
.menu[hidden] {
display: none;
}
@keyframes menu-in {
from { clip-path: inset(0 0 100% 0); }
to { clip-path: inset(0 0 0 0); }
}
.menu-inner {
min-height: 100%;
display: flex;
flex-direction: column;
gap: 48px;
padding-bottom: 40px;
}
.menu-top {
height: var(--header-h);
display: flex;
align-items: center;
justify-content: space-between;
}
.menu-nav ol {
display: grid;
gap: 4px;
}
.menu-nav a {
display: inline-flex;
align-items: baseline;
gap: 18px;
font-family: var(--font-display);
font-size: clamp(40px, 7vw, 88px);
font-weight: 500;
line-height: 1.05;
letter-spacing: -0.035em;
transition: color 0.3s, transform 0.5s var(--ease);
}
.menu-nav a .mono {
color: var(--accent-ink);
letter-spacing: 0;
transform: translateY(-0.2em);
}
.menu-nav a:hover {
color: var(--muted);
transform: translateX(8px);
}
.menu-nav li {
animation: menu-item 0.7s var(--ease) both;
animation-delay: calc(var(--i, 0) * 45ms + 120ms);
}
@keyframes menu-item {
from { opacity: 0; transform: translateY(24px); filter: blur(6px); }
to { opacity: 1; transform: none; filter: none; }
}
.menu-foot {
margin-top: auto;
display: flex;
flex-wrap: wrap;
gap: 32px 80px;
padding-top: 32px;
border-top: 1px solid var(--line);
}
.menu-foot .mono-caps {
margin-bottom: 10px;
}
.inline-links {
display: flex;
flex-wrap: wrap;
gap: 6px 20px;
}
.inline-links a:hover,
.menu-foot a:hover {
color: var(--accent-ink);
}
.rail {
position: fixed;
top: 80px;
bottom: 24px;
right: 0;
z-index: 90;
width: 14px;
pointer-events: none;
background-image:
repeating-linear-gradient(to bottom, var(--faint) 0 1px, transparent 1px 8px),
repeating-linear-gradient(to bottom, var(--faint) 0 1px, transparent 1px 64px);
background-size: 6px 100%, 12px 100%;
background-position: right top, right top;
background-repeat: no-repeat;
opacity: 0.75;
}
.rail-dot {
position: absolute;
right: 4px;
top: 0;
width: 8px;
height: 8px;
margin-top: -4px;
border-radius: 50%;
background: var(--accent);
transform: translateY(var(--rail-y, 0px));
will-change: transform;
}
.rail-chip {
position: absolute;
right: 16px;
top: 50%;
transform: translateY(-50%);
padding: 2px 8px;
border: 1px solid var(--line-strong);
border-radius: 4px;
background: var(--paper);
font-family: var(--font-mono);
font-size: 12px;
line-height: 1.5;
color: var(--ink);
white-space: nowrap;
opacity: 1;
}
.ruler {
position: fixed;
top: 76px;
bottom: 0;
left: 0;
z-index: 85;
display: none;
width: 48px;
pointer-events: none;
overflow: hidden;
}
.ruler-ticks {
position: absolute;
inset: -128px 0 -128px 0;
background-image:
linear-gradient(to bottom, var(--faint) 0 1px, transparent 1px),
linear-gradient(to bottom, var(--faint) 0 1px, transparent 1px),
linear-gradient(to bottom, var(--muted) 0 1px, transparent 1px);
background-size: 6px 8px, 10px 64px, 16px 128px;
background-repeat: repeat-y;
opacity: 0.7;
transform: translate3d(0, var(--ruler-shift, 0px), 0);
will-change: transform;
}
.ruler-label {
position: absolute;
left: 20px;
top: 0;
margin-top: -6px;
font-family: var(--font-mono);
font-size: 10px;
line-height: 1;
color: var(--muted);
font-variant-numeric: tabular-nums;
will-change: transform;
}
.ruler-y {
position: absolute;
left: 50%;
bottom: 24px;
transform: translateX(-50%) rotate(180deg);
writing-mode: vertical-rl;
font-family: var(--font-mono);
font-size: 11px;
color: var(--muted);
white-space: nowrap;
background: var(--paper);
padding: 6px 0;
}
.ruler-y b {
font-weight: 500;
color: var(--accent-ink);
font-variant-numeric: tabular-nums;
}
@media (min-width: 1200px) {
.ruler {
display: block;
}
}
.site-footer {
position: relative;
min-height: 100vh;
min-height: 100svh;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: clamp(48px, 8vh, 96px);
padding: clamp(40px, 7vh, 80px) 0 28px;
border-top: 1px solid var(--line);
background: var(--paper);
overflow: hidden;
}
.ft-marquee {
display: block;
overflow: hidden;
color: var(--ink);
}
.ft-track {
display: flex;
width: max-content;
animation: ft-scroll 28s linear infinite;
}
.ft-marquee:hover .ft-track {
animation-play-state: paused;
}
.ft-group {
display: flex;
align-items: center;
}
.ft-word {
padding: 0 0.12em;
font-family: var(--font-sans);
font-size: clamp(88px, 13.5vw, 260px);
font-weight: 500;
line-height: 1;
letter-spacing: -0.055em;
white-space: nowrap;
transition: color 0.4s;
}
.ft-marquee:hover .ft-word {
color: var(--accent-ink);
}
.ft-slash {
padding: 0 0.22em;
font-family: var(--font-sans);
font-size: clamp(100px, 15vw, 290px);
font-weight: 300;
line-height: 1;
color: var(--faint);
transform: skewX(-8deg);
}
@keyframes ft-scroll {
from { transform: translateX(0); }
to { transform: translateX(-50%); }
}
.ft-body {
display: grid;
grid-template-columns: minmax(160px, 1.4fr) repeat(4, minmax(0, 1fr)) auto;
gap: 40px clamp(24px, 3vw, 56px);
align-items: start;
padding: 0 var(--gutter);
}
.ft-mark {
display: block;
width: clamp(120px, 11vw, 200px);
color: var(--accent);
transition: transform 0.8s var(--ease);
}
.ft-mark:hover {
transform: rotate(-12deg);
}
.ft-mark svg {
width: 100%;
height: auto;
}
.ft-h {
margin-bottom: 24px;
font-size: 17px;
font-weight: 500;
color: var(--ink);
}
.ft-col p:not(.ft-h),
.ft-col ul {
font-size: 16px;
line-height: 1.75;
color: var(--muted);
}
.ft-col ul {
display: grid;
gap: 12px;
line-height: 1.4;
}
.ft-col a {
color: var(--muted);
transition: color 0.3s;
}
.ft-col a:hover {
color: var(--ink);
}
.ft-top {
display: grid;
place-items: center;
width: 52px;
height: 84px;
border: 1px solid var(--ink);
border-radius: var(--radius-pill);
color: var(--ink);
transition: background-color 0.3s, color 0.3s, transform 0.5s var(--ease);
}
.ft-top:hover {
background: var(--ink);
color: var(--paper);
transform: translateY(-4px);
}
.ft-bottom {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 12px 32px;
padding: 0 calc(var(--gutter) + 120px) 0 var(--gutter);
font-size: 16px;
color: var(--ink);
}
.ft-bottom .mono {
color: var(--muted);
}
@media (max-width: 1100px) {
.ft-body {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.ft-mark {
grid-column: 1 / -2;
}
.ft-top {
grid-column: -2 / -1;
grid-row: 1;
justify-self: end;
}
}
@media (max-width: 640px) {
.ft-body {
grid-template-columns: 1fr 1fr;
}
.ft-col:last-of-type {
grid-column: 1 / -1;
}
}
@media (prefers-reduced-motion: reduce) {
.ft-track {
animation: none;
}
}
.flags {
position: fixed;
right: 28px;
bottom: 20px;
z-index: 95;
}
.flags-pill {
display: inline-flex;
align-items: center;
gap: 8px;
height: 32px;
padding: 0 12px;
border: 1px solid var(--line-strong);
border-radius: var(--radius-pill);
background: color-mix(in srgb, var(--paper) 88%, transparent);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
font-family: var(--font-mono);
font-size: 12px;
color: var(--ink-2);
transition: border-color 0.3s;
}
.flags-pill:hover {
border-color: var(--ink);
}
.flags-ring {
width: 9px;
height: 9px;
border: 1.5px solid var(--accent);
border-radius: 50%;
}
.flags.is-complete .flags-ring {
background: var(--accent);
}
.flags-panel {
position: absolute;
right: 0;
bottom: calc(100% + 10px);
width: min(320px, calc(100vw - 40px));
padding: 18px;
border: 1px solid var(--line-strong);
border-radius: var(--radius-media);
background: var(--paper);
box-shadow: var(--shadow-lift);
}
.flags-panel[hidden] {
display: none;
}
.flags-intro {
margin: 6px 0 14px;
font-size: 14px;
color: var(--ink-2);
}
.flags-list {
display: grid;
gap: 10px;
font-size: 14px;
}
.flags-list li {
display: grid;
grid-template-columns: 18px 1fr;
gap: 8px;
align-items: start;
}
.flags-list li::before {
content: "";
width: 9px;
height: 9px;
margin-top: 6px;
border: 1.5px solid var(--faint);
border-radius: 50%;
}
.flags-list li.is-found::before {
border-color: var(--accent);
background: var(--accent);
}
.flags-list code {
font-family: var(--font-mono);
font-size: 12px;
color: var(--accent-ink);
}
.flags-list .hint {
color: var(--muted);
}
.toast {
position: fixed;
right: 28px;
bottom: 62px;
z-index: 96;
max-width: calc(100vw - 40px);
padding: 9px 16px;
border-radius: var(--radius-pill);
background: var(--ink);
color: var(--paper);
font-size: 14px;
line-height: 1.3;
opacity: 0;
transform: translateY(8px);
pointer-events: none;
transition: opacity 0.4s var(--ease), transform 0.4s var(--ease);
}
.toast.is-on {
opacity: 1;
transform: none;
}
.xray-layer {
position: fixed;
inset: 0;
overflow: hidden;
z-index: 80;
pointer-events: none;
}
.xray-box {
position: absolute;
left: 0;
top: 0;
border: 1px solid var(--accent);
animation: xray-in 0.5s var(--ease) both;
will-change: transform;
}
.xray-box i {
position: absolute;
width: 6px;
height: 6px;
border: 1px solid var(--accent);
background: var(--paper);
}
.xray-box i:nth-child(1) { left: -3.5px; top: -3.5px; }
.xray-box i:nth-child(2) { right: -3.5px; top: -3.5px; }
.xray-box i:nth-child(3) { left: -3.5px; bottom: -3.5px; }
.xray-box i:nth-child(4) { right: -3.5px; bottom: -3.5px; }
.xray-tag {
position: absolute;
left: -1px;
bottom: calc(100% + 4px);
display: grid;
gap: 3px;
justify-items: start;
}
.xray-note {
max-width: 34ch;
padding-left: 6px;
border-left: 2px solid var(--accent);
background: var(--paper);
font-family: var(--font-mono);
font-size: 11px;
line-height: 1.5;
color: var(--ink);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
@keyframes xray-in {
from { opacity: 0; clip-path: inset(0 100% 0 0); }
to { opacity: 1; clip-path: inset(-40px -400px -10px -10px); }
}
.xray-hud {
position: fixed;
left: 50%;
bottom: 24px;
transform: translateX(-50%);
z-index: 95;
display: none;
gap: 18px;
font-size: 12px;
color: var(--muted);
pointer-events: none;
}
.xray-hud b {
font-weight: 500;
color: var(--ink);
}
:root[data-theme="xray"] .xray-hud {
display: flex;
}
.loader {
display: none;
}
.is-loading,
.is-loading body {
overflow: hidden;
}
.is-loading .loader {
display: block;
position: fixed;
inset: 0;
z-index: 1000;
background-color: #09090b;
cursor: pointer;
transition: background-color 0.7s var(--ease-in-out) 0.15s;
}
.loader canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
transition: opacity 0.4s;
}
.loader-count {
position: absolute;
left: var(--gutter);
bottom: 28px;
color: #8e8e99;
}
.loader-count b {
font-weight: 500;
color: #f4f4f6;
}
.loader.is-leaving {
background-color: rgba(9, 9, 11, 0);
}
.loader.is-leaving canvas,
.loader.is-leaving .loader-count {
opacity: 0;
}
.scr-w {
display: inline-block;
white-space: nowrap;
}
.scr-c {
display: inline-block;
text-align: center;
}
.scr-c.is-glyph {
color: var(--accent-ink);
}
.scr-c.is-hidden {
visibility: hidden;
}
.scr-on [data-scramble]:not(.scr-done):not(.is-scrambling) {
visibility: hidden;
animation: scr-failsafe 0s linear 4s forwards;
}
@keyframes scr-failsafe {
to { visibility: visible; }
}
.sec-head {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
gap: 16px 48px;
margin-bottom: clamp(40px, 5vw, 72px);
}
.sec-head-aside {
max-width: 34ch;
color: var(--muted);
text-align: right;
}
a.sec-head-aside {
color: var(--ink);
}
@media (max-width: 640px) {
.sec-head-aside {
text-align: left;
}
}
.ripple-canvas {
position: absolute;
inset: 0;
z-index: 1;
width: 100%;
height: 100%;
pointer-events: none;
opacity: 0;
transition: opacity 0.25s;
}
.ripple-canvas.is-on {
opacity: 1;
}
.view-cursor {
position: fixed;
left: 0;
top: 0;
z-index: 150;
display: flex;
align-items: stretch;
gap: 2px;
pointer-events: none;
will-change: transform;
}
.view-cursor .vc-label,
.view-cursor .vc-icon {
display: grid;
place-items: center;
height: 34px;
background: var(--accent);
color: var(--on-accent);
transform: scale(0.4);
opacity: 0;
transition: transform 0.35s var(--ease), opacity 0.25s;
}
.view-cursor .vc-label {
padding: 0 12px;
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.06em;
text-transform: uppercase;
white-space: nowrap;
transform-origin: left center;
}
.view-cursor .vc-icon {
width: 34px;
transition-delay: 0.04s;
}
.view-cursor .vc-icon svg {
width: 14px;
height: 14px;
fill: none;
stroke: currentColor;
stroke-width: 1.6;
stroke-linecap: round;
stroke-linejoin: round;
}
.view-cursor {
margin: 14px 0 0 14px;
}
.view-cursor.is-on .vc-label,
.view-cursor.is-on .vc-icon {
transform: none;
opacity: 1;
}
.has-fx-cursor [data-cursor] {
cursor: none;
}
.fluid-canvas {
position: fixed;
inset: 0;
width: 100%;
height: 100%;
z-index: 70;
pointer-events: none;
mix-blend-mode: screen;
}
:root[data-theme="xray"] .fluid-canvas {
mix-blend-mode: normal;
}
.page-404 {
min-height: 100vh;
min-height: 100svh;
display: flex;
flex-direction: column;
}
.page-404 main {
flex: 1;
display: flex;
align-items: flex-end;
padding-block: calc(var(--header-h) + 48px) clamp(48px, 8vw, 96px);
}
.page-404 .code-line {
margin-bottom: 20px;
color: var(--muted);
}
.page-404 .code-line b {
color: var(--accent-ink);
font-weight: 500;
}
.page-404 .lead {
max-width: 28em;
margin-top: 28px;
}
.page-404 .actions {
margin-top: 36px;
}
@media (max-width: 1023px) {
.rail {
display: none;
}
.nav-links,
.nav-panel {
display: none !important;
}
.nav-bar {
grid-template-columns: 1fr auto;
}
}
@media (min-width: 1024px) {
.site-header .menu-btn {
display: none;
}
}
@media (min-width: 1024px) and (max-width: 1279px) {
.xray-toggle {
padding: 0 10px;
}
.xray-toggle span {
display: none;
}
}
@media (max-width: 640px) {
:root {
--header-h: 64px;
}
.site-header {
top: 8px;
left: 8px;
right: 8px;
}
.nav-cta {
display: none;
}
.xray-toggle {
padding: 0 10px;
}
.xray-toggle span {
display: none;
}
.flags {
right: 16px;
bottom: 16px;
}
.toast {
right: 16px;
bottom: 56px;
}
.xray-hud {
display: none !important;
}
.btn-pill {
font-size: 15px;
}
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
*,
*::before,
*::after {
animation-duration: 0.001ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.001ms !important;
transition-delay: 0ms !important;
}
.js .reveal {
opacity: 1;
filter: none;
transform: none;
}
}
.is-glitch body {
animation: glitch 0.9s steps(2) both;
}
@keyframes glitch {
0%, 100% { filter: none; transform: none; }
20% { filter: invert(1) hue-rotate(180deg); transform: translateX(-3px); }
40% { filter: none; transform: translateX(3px) skewX(-2deg); }
60% { filter: invert(1); transform: translateX(-2px); }
80% { filter: none; transform: none; }
}
.sec--hero {
position: relative;
min-height: 100vh;
min-height: 100svh;
display: flex;
flex-direction: column;
justify-content: flex-end;
overflow: hidden;
isolation: isolate;
}
.sec--hero .hero-globe {
position: absolute;
inset: 0;
z-index: -2;
width: 100%;
height: 100%;
opacity: 0;
transition: opacity 1.4s var(--ease);
cursor: grab;
}
.sec--hero .hero-globe.is-on {
opacity: 1;
}
.sec--hero .hero-globe.is-scanning {
cursor: grabbing;
}
.sec--hero .hero-shade {
position: absolute;
inset: auto 0 0 0;
z-index: -1;
height: 70%;
background: linear-gradient(to top, var(--paper) 8%, color-mix(in srgb, var(--paper) 70%, transparent) 45%, transparent);
pointer-events: none;
}
.sec--hero .hero-inner {
position: relative;
padding-top: calc(var(--header-h) + 40px);
padding-bottom: 112px;
pointer-events: none;
}
.sec--hero .hero-inner a,
.sec--hero .hero-inner button {
pointer-events: auto;
}
.sec--hero .hero-kicker {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-bottom: 24px;
color: var(--ink-2);
}
.sec--hero .hero-dot {
display: inline-block;
flex: none;
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 0 0 var(--accent);
animation: hero-pulse 2.4s var(--ease) infinite;
}
@keyframes hero-pulse {
0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--accent) 60%, transparent); }
70%, 100% { box-shadow: 0 0 0 8px transparent; }
}
.sec--hero .hero-title {
max-width: 14.5em;
font-family: var(--font-display);
font-size: clamp(34px, 4.1vw, 64px);
font-weight: 500;
line-height: 1.02;
letter-spacing: -0.035em;
color: var(--ink);
font-optical-sizing: auto;
}
.sec--hero .hero-title .tone-2 {
color: var(--ink-2);
}
.sec--hero .hero-actions {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-top: 36px;
}
.sec--hero .hero-bar {
position: absolute;
left: 0;
right: 0;
bottom: 26px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px clamp(20px, 4vw, 64px);
color: var(--muted);
}
.sec--hero .hero-bar [data-hero-clock] {
color: var(--ink);
font-variant-numeric: tabular-nums;
}
.sec--hero .hero-status {
display: inline-flex;
align-items: center;
gap: 8px;
}
.sec--hero .hero-scroll {
display: inline-flex;
align-items: center;
gap: 6px;
margin-left: auto;
margin-right: 110px;
color: var(--ink);
}
.sec--hero .hero-scroll .i-arrow {
width: 14px;
height: 14px;
animation: hero-nudge 1.8s var(--ease-in-out) infinite;
}
@keyframes hero-nudge {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(3px); }
}
.sec--hero .hero-hint {
position: absolute;
right: var(--gutter);
top: calc(var(--header-h) + 24px);
display: none;
color: var(--muted);
}
@media (hover: hover) and (pointer: fine) {
.sec--hero .hero-hint {
display: block;
}
}
@media (max-width: 900px) {
.sec--hero .hero-shade {
height: 78%;
}
.sec--hero .hero-inner {
padding-bottom: 96px;
}
}
@media (max-width: 640px) {
.sec--hero .hero-inner {
padding-bottom: 88px;
}
.sec--hero .hero-kicker .muted {
display: none;
}
.sec--hero .hero-actions .btn-pill {
flex: 1 1 100%;
justify-content: space-between;
}
.sec--hero .hero-bar {
gap: 6px 16px;
font-size: 12px;
}
.sec--hero .hero-bar > :nth-child(2),
.sec--hero .hero-scroll {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.sec--hero .hero-globe {
opacity: 1;
}
}
.sec--process .pr-head {
display: flex;
flex-direction: column;
gap: 18px;
margin-bottom: clamp(48px, 6vw, 88px);
}
.sec--process .pr-eyebrow {
color: var(--muted);
}
.sec--process .pr-title {
max-width: 12em;
text-wrap: balance;
}
.sec--process .pr-canvas,
.sec--process .pr-meter,
.sec--process .pr-skip,
.sec--process .pr-fg,
.sec--process .pr-xray {
display: none;
}
.sec--process .pr-steps {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 56px 32px;
}
.sec--process .pr-step {
display: grid;
align-content: start;
gap: 14px;
padding-top: 20px;
border-top: 1px solid var(--line);
}
.sec--process .pr-step-desc {
max-width: 30em;
font-size: 16px;
color: var(--ink-2);
}
.sec--process .pr-final {
margin-top: clamp(64px, 8vw, 112px);
}
.sec--process .pr-select {
position: relative;
display: inline-flex;
padding: 12px;
box-shadow: inset 0 0 0 1px var(--line-strong);
}
.sec--process .pr-handle {
position: absolute;
width: 7px;
height: 7px;
border: 1px solid var(--accent);
background: var(--paper);
}
.sec--process .pr-handle--tl { left: -3px; top: -3px; }
.sec--process .pr-handle--tr { right: -3px; top: -3px; }
.sec--process .pr-handle--bl { left: -3px; bottom: -3px; }
.sec--process .pr-handle--br { right: -3px; bottom: -3px; }
.sec--process .pr-cta-spec {
position: absolute;
left: -1px;
top: calc(100% + 8px);
}
.sec--process .pr-cta-arrow {
position: absolute;
left: calc(100% + 6px);
top: calc(50% - 46px);
width: 64px;
height: 64px;
overflow: visible;
}
.sec--process .pr-cta-arrow path,
.sec--process .pr-note-arrow path {
fill: none;
stroke: var(--accent);
stroke-width: 1.8;
stroke-linecap: round;
stroke-linejoin: round;
}
.sec--process .pr-cta-note {
position: absolute;
left: calc(100% + 58px);
bottom: calc(100% + 6px);
font-size: 30px;
white-space: nowrap;
transform: rotate(-4deg);
transform-origin: left bottom;
}
@media (max-width: 1023px) {
.sec--process .pr-steps {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 640px) {
.sec--process .pr-steps {
grid-template-columns: minmax(0, 1fr);
gap: 36px;
}
.sec--process .pr-final {
display: flex;
justify-content: center;
padding-top: 64px;
}
.sec--process .pr-cta-arrow {
left: auto;
right: 18px;
top: auto;
bottom: calc(100% + 2px);
width: 52px;
height: 52px;
transform: rotate(-90deg);
}
.sec--process .pr-cta-note {
left: auto;
right: 72px;
bottom: calc(100% + 36px);
font-size: 28px;
transform: rotate(-3deg);
transform-origin: right bottom;
}
}
@media (prefers-reduced-motion: no-preference) and (min-height: 560px) {
.js .sec--process {
display: block;
min-height: 0;
height: 560vh;
padding-block: 0;
}
.js .sec--process .pr-stage {
--t1: 0;
--t2: 0;
--t3: 0;
--t4: 0;
--t5: 0;
--t6: 0;
--t7: 0;
--t8: 0;
--clear: clamp(0, var(--t8) * 3.4, 1);
--canvas-pt: 8px;
--canvas-pb: 28px;
--canvas-px: var(--gutter);
--dim-h: 30px;
position: sticky;
top: 0;
height: 100vh;
height: 100svh;
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
grid-template-areas: "head" "canvas" "captions";
overflow: hidden;
isolation: isolate;
}
.js .sec--process .pr-stage::before {
content: "";
position: absolute;
inset: 0;
z-index: -1;
background-image: radial-gradient(color-mix(in srgb, var(--ink) 9%, transparent) 1px, transparent 1.3px);
background-size: 16px 16px;
background-position: center top;
-webkit-mask-image: linear-gradient(transparent, #000 18%, #000 82%, transparent);
mask-image: linear-gradient(transparent, #000 18%, #000 82%, transparent);
pointer-events: none;
}
.js .sec--process .pr-head {
grid-area: head;
flex-direction: row;
align-items: flex-start;
justify-content: space-between;
gap: 24px;
margin: 0 auto;
padding-top: calc(var(--header-h) + 16px);
}
.js .sec--process .pr-kicker {
display: grid;
gap: 2px;
}
.js .sec--process .pr-title {
max-width: none;
font-family: var(--font-mono);
font-size: 13px;
font-weight: 400;
line-height: 1.5;
letter-spacing: 0;
}
.js .sec--process .pr-meter {
display: grid;
justify-items: end;
text-align: right;
}
.js .sec--process .pr-meter-label {
color: var(--muted);
}
.js .sec--process .pr-count {
display: flex;
align-items: flex-end;
margin-top: 6px;
margin-right: -0.04em;
font-family: var(--font-display);
font-size: clamp(44px, 5.4vw, 84px);
font-weight: 600;
line-height: 0.86;
letter-spacing: 0;
color: var(--faint);
opacity: 0.5;
font-variant-numeric: tabular-nums;
}
.js .sec--process .pr-digit {
display: inline-block;
width: 0.6em;
text-align: center;
}
.js .sec--process .pr-unit {
margin-left: 0.06em;
font-size: 0.4em;
line-height: 1.2;
}
.js .sec--process .pr-canvas {
grid-area: canvas;
display: grid;
place-items: center;
min-height: 0;
padding: var(--canvas-pt) var(--canvas-px) var(--canvas-pb);
container-type: size;
}
.js .sec--process .pr-framewrap {
position: relative;
width: min(922px, 100cqw, (100cqh - var(--dim-h)) * 1.6);
aspect-ratio: 1.6;
margin-top: var(--dim-h);
opacity: calc(1 - var(--clear));
transform: scale(calc(1 - var(--clear) * 0.04));
}
.js .sec--process .pr-dim {
position: absolute;
left: 0;
right: 0;
top: -21px;
height: 9px;
display: flex;
align-items: center;
justify-content: center;
border-inline: 1px solid var(--accent);
}
.js .sec--process .pr-dim::before {
content: "";
position: absolute;
left: 0;
right: 0;
top: 4px;
height: 1px;
background: var(--accent);
}
.js .sec--process .pr-dim span {
position: relative;
padding: 0 8px;
background: var(--paper);
font-family: var(--font-mono);
font-size: 11px;
line-height: 1;
color: var(--accent-ink);
white-space: nowrap;
}
.js .sec--process .pr-frame {
display: flex;
flex-direction: column;
height: 100%;
}
.js .sec--process .pr-frame .frame-bar {
position: relative;
flex: none;
}
.js .sec--process .pr-bar-title {
position: absolute;
left: 50%;
transform: translateX(-50%);
font-family: var(--font-mono);
font-size: 11px;
color: var(--muted);
}
.js .sec--process .pr-body {
position: relative;
flex: 1;
min-height: 0;
}
.js .sec--process .pr-art {
--k: 1;
--mx: 24px;
--my: 24px;
--aw: 760px;
--ah: 430px;
--x0: 100px;
--y0: 80px;
--cw: 28px;
--rh: 30px;
--hh: 24px;
--mid: 12px;
--wx: 40px;
--hfs: 13px;
--hx: calc(var(--x0) + 2 * var(--cw));
--hy: calc(var(--y0) + 7 * var(--rh) + (var(--rh) - var(--hh)) / 2);
--ax: calc(var(--x0) + 16 * var(--cw) + var(--mid) + 32px);
--lw: calc(5 * var(--cw) + var(--mid) - 4px);
position: absolute;
left: 50%;
top: 50%;
width: var(--aw);
height: var(--ah);
transform: translate(-50%, -50%) scale(var(--k));
}
.js .sec--process .pr-art > * {
position: absolute;
margin: 0;
}
.js .sec--process .pr-file {
left: calc(var(--x0) - 56px);
top: 24px;
font-family: var(--font-mono);
font-size: 12px;
line-height: 24px;
color: var(--muted);
}
.js .sec--process .pr-file::before {
content: "";
display: inline-block;
width: 6px;
height: 6px;
margin-right: 8px;
border-radius: 50%;
background: var(--accent);
vertical-align: 1px;
}
.js .sec--process .pr-wire {
left: var(--wx);
right: var(--wx);
top: calc(var(--y0) + 4 * var(--rh));
height: 6px;
background:
linear-gradient(var(--ink-2), var(--ink-2)) 0 0 / 100% 1px no-repeat,
repeating-linear-gradient(90deg, var(--faint) 0 1px, transparent 1px 32px) 0 1px / 100% 5px no-repeat;
clip-path: inset(0 calc((1 - var(--t1)) * 100%) 0 0);
opacity: calc(1 - var(--t2));
}
.js .sec--process .pr-pkt {
left: var(--wx);
top: calc(var(--y0) + 4 * var(--rh));
width: 11px;
height: 11px;
margin: -5px 0 0 -5px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 0 6px var(--accent-soft);
transform: translateX(calc(var(--t1) * (var(--aw) - 2 * var(--wx))));
opacity: calc(1 - var(--t2));
}
.js .sec--process .pr-wire-a,
.js .sec--process .pr-wire-b {
top: calc(var(--y0) + 4 * var(--rh) - 30px);
font-family: var(--font-mono);
font-size: 12px;
line-height: 18px;
color: var(--muted);
}
.js .sec--process .pr-wire-a {
left: var(--wx);
opacity: calc(1 - var(--t2));
}
.js .sec--process .pr-wire-b {
right: var(--wx);
opacity: calc(clamp(0, (var(--t1) - 0.8) * 5, 1) * (1 - var(--t2)));
}
.js .sec--process .pr-hex {
left: 0;
top: var(--y0);
width: 100%;
height: calc(8 * var(--rh));
font-family: var(--font-mono);
font-size: var(--hfs);
line-height: var(--rh);
color: var(--muted);
opacity: calc(1 - var(--t7) * 0.55);
}
.js .sec--process .pr-row {
--k2: clamp(0, var(--t2) * 2.4 - var(--r) * 0.2, 1);
position: absolute;
left: 0;
right: 0;
top: calc(var(--r) * var(--rh));
height: var(--rh);
opacity: var(--k2);
transform: translateY(calc((1 - var(--k2)) * 10px));
}
.js .sec--process .pr-off {
position: absolute;
right: calc(var(--aw) - var(--x0) + 16px);
color: var(--faint);
}
.js .sec--process .pr-bytes {
position: absolute;
left: var(--x0);
display: flex;
}
.js .sec--process .pr-bytes i {
width: var(--cw);
font-style: normal;
text-align: center;
}
.js .sec--process .pr-bytes i:nth-child(9) {
margin-left: var(--mid);
}
.js .sec--process .pr-bytes .z {
color: var(--faint);
}
.js .sec--process .pr-ascii {
position: absolute;
left: var(--ax);
white-space: pre;
color: var(--faint);
}
.js .sec--process .pr-hit {
--k3: clamp(0, var(--t3) * 4, 1);
left: var(--hx);
top: var(--hy);
width: var(--cw);
height: var(--hh);
display: grid;
place-items: center;
border-radius: 2px;
background: var(--accent);
color: var(--on-accent);
font-family: var(--font-mono);
font-size: var(--hfs);
font-weight: 500;
line-height: 1;
opacity: var(--k3);
transform: scale(calc(1.8 - 0.8 * var(--k3)));
}
.js .sec--process .pr-hit-ascii {
left: calc(var(--ax) + 2ch);
top: calc(var(--y0) + 7 * var(--rh));
font-family: var(--font-mono);
font-size: var(--hfs);
line-height: var(--rh);
color: var(--accent-ink);
background: var(--paper);
box-shadow: 0 -5px 0 -3px var(--accent) inset;
opacity: clamp(0, var(--t3) * 4, 1);
}
.js .sec--process .pr-hit-label {
--kl: clamp(0, (var(--t3) - 0.55) * 3.5, 1);
left: calc(var(--hx) + 3 * var(--cw) + 2px);
top: calc(var(--hy) + var(--hh) / 2);
width: var(--lw);
text-align: center;
box-shadow: 0 0 0 3px var(--paper);
opacity: calc(var(--kl) * (1 - var(--t7)));
transform: translate(calc((1 - var(--kl)) * -10px), -50%);
}
.js .sec--process .pr-g {
--kg: clamp(0, (var(--t3) - 0.12) / 0.5, 1);
background: var(--accent);
opacity: calc(1 - var(--t4) * 0.5);
}
.js .sec--process .pr-g--h {
height: 1px;
transform: scaleX(var(--kg));
}
.js .sec--process .pr-g--v {
width: 1px;
transform: scaleY(var(--kg));
}
.js .sec--process .pr-g--htl,
.js .sec--process .pr-g--hbl {
left: calc(-1 * var(--mx));
width: calc(var(--hx) + var(--mx));
transform-origin: left center;
}
.js .sec--process .pr-g--htr,
.js .sec--process .pr-g--hbr {
left: calc(var(--hx) + var(--cw));
right: calc(-1 * var(--mx));
transform-origin: right center;
}
.js .sec--process .pr-g--htl,
.js .sec--process .pr-g--htr {
top: var(--hy);
}
.js .sec--process .pr-g--hbl,
.js .sec--process .pr-g--hbr {
top: calc(var(--hy) + var(--hh) - 1px);
}
.js .sec--process .pr-g--vlt,
.js .sec--process .pr-g--vrt {
top: calc(-1 * var(--my));
height: calc(var(--hy) + var(--my));
transform-origin: center top;
}
.js .sec--process .pr-g--vlb,
.js .sec--process .pr-g--vrb {
top: calc(var(--hy) + var(--hh));
bottom: calc(-1 * var(--my));
transform-origin: center bottom;
}
.js .sec--process .pr-g--vlt,
.js .sec--process .pr-g--vlb {
left: var(--hx);
}
.js .sec--process .pr-g--vrt,
.js .sec--process .pr-g--vrb {
left: calc(var(--hx) + var(--cw) - 1px);
}
.js .sec--process .pr-group {
--k4: clamp(0, var(--t4) * 3, 1);
left: calc(var(--x0) - 3px);
top: calc(var(--hy) - 3px);
width: calc(4 * var(--cw) + 6px);
height: calc(var(--hh) + 6px);
border: 1px dashed var(--accent);
border-radius: 4px;
background: var(--accent-soft);
opacity: var(--k4);
transform: scale(calc(1.06 - 0.06 * var(--k4)));
}
.js .sec--process .pr-bracket {
left: calc(var(--x0) + 1px);
top: calc(var(--hy) + var(--hh) + 12px);
width: calc(4 * var(--cw) - 2px);
height: 9px;
border-inline: 1px solid var(--accent);
transform: scaleX(clamp(0, (var(--t4) - 0.15) / 0.35, 1));
}
.js .sec--process .pr-bracket::before {
content: "";
position: absolute;
left: 0;
right: 0;
top: 4px;
height: 1px;
background: var(--accent);
}
.js .sec--process .pr-bracket-label {
left: calc(var(--x0) + 2 * var(--cw));
top: calc(var(--hy) + var(--hh) + 26px);
padding: 0 4px;
background: var(--paper);
font-family: var(--font-mono);
font-size: 11px;
line-height: 16px;
color: var(--accent-ink);
white-space: nowrap;
opacity: clamp(0, (var(--t4) - 0.4) * 4, 1);
transform: translateX(-50%);
}
.js .sec--process .pr-note-arrow {
left: calc(var(--x0) + 4 * var(--cw) + 8px);
top: calc(var(--hy) + var(--hh) + 8px);
width: 64px;
height: 48px;
overflow: visible;
opacity: calc(1 - var(--t7));
}
.js .sec--process .pr-note-arrow path {
stroke-dasharray: 100 100;
stroke-dashoffset: calc(100 - 100 * clamp(0, (var(--t4) - 0.45) / 0.35, 1));
}
.js .sec--process .pr-note {
--kn: clamp(0, (var(--t4) - 0.62) * 3.5, 1);
left: calc(var(--x0) + 4 * var(--cw) + 72px);
top: calc(var(--hy) + var(--hh) + 34px);
font-size: 30px;
white-space: nowrap;
opacity: calc(var(--kn) * (1 - var(--t7)));
transform: rotate(-4deg) translateY(calc((1 - var(--kn)) * 6px));
}
.js .sec--process .pr-tools {
top: 22px;
right: calc(var(--aw) - var(--ax) - 16 * 0.6 * var(--hfs));
display: flex;
gap: 8px;
}
.js .sec--process .pr-tool {
--kc: clamp(0, var(--t5) * 2.2 - var(--i) * 0.3, 1);
gap: 7px;
padding: 4px 10px 4px 8px;
opacity: var(--kc);
transform: translateY(calc((1 - var(--kc)) * 10px)) scale(calc(0.92 + 0.08 * var(--kc)));
}
.js .sec--process .pr-ico {
flex: none;
width: 14px;
height: 14px;
background: currentColor;
-webkit-mask: var(--ico) center / contain no-repeat;
mask: var(--ico) center / contain no-repeat;
}
.js .sec--process .pr-ico--wireshark { --ico: url("../icons/1_wireshark.svg"); }
.js .sec--process .pr-ico--burp { --ico: url("../icons/1_burpsuite.svg"); }
.js .sec--process .pr-ico--msf { --ico: url("../icons/1_metasploit.svg"); }
.js .sec--process .pr-ico--bash { --ico: url("../icons/1_bash.svg"); }
.js .sec--process .pr-code {
--kp: clamp(0, var(--t6) * 5, 1);
left: 404px;
top: 122px;
width: 348px;
padding-bottom: 14px;
border-radius: var(--radius-media);
box-shadow: var(--shadow-lift);
font-family: var(--font-mono);
font-size: 12px;
line-height: 20px;
opacity: var(--kp);
transform: translateY(calc((1 - var(--kp)) * 24px));
}
.js .sec--process .pr-code-bar {
display: flex;
align-items: center;
gap: 8px;
height: 34px;
padding: 0 16px;
border-bottom: 1px solid color-mix(in srgb, var(--on-panel) 12%, transparent);
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--on-panel-2);
}
.js .sec--process .pr-code-bar i {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent);
}
.js .sec--process .pr-code-lines {
padding: 12px 16px 0;
counter-reset: pr-ln;
color: var(--on-panel);
}
.js .sec--process .pr-code-lines li {
height: 20px;
white-space: pre;
}
.js .sec--process .pr-code-lines li::before {
display: inline-block;
width: 2ch;
margin-right: 1.5ch;
text-align: right;
vertical-align: top;
color: var(--on-panel-2);
opacity: 0.45;
}
.js .sec--process .pr-code-lines .c::before {
counter-increment: pr-ln;
content: counter(pr-ln);
}
.js .sec--process .pr-code-lines .t::before {
content: "";
}
.js .sec--process .pr-code-lines .sep {
height: 13px;
margin: 0 -16px 8px;
border-bottom: 1px solid color-mix(in srgb, var(--on-panel) 12%, transparent);
}
.js .sec--process .pr-cl {
display: inline-block;
vertical-align: top;
max-width: calc(var(--n, 0) * 1ch);
overflow: hidden;
white-space: pre;
}
.js .sec--process .pr-cl b {
font-weight: inherit;
}
.js .sec--process .pr-cl .k,
.js .sec--process .pr-cl .p {
color: var(--accent);
}
.js .sec--process .pr-cl .s,
.js .sec--process .pr-cl .n {
color: var(--on-panel-2);
}
.js .sec--process .pr-cl .o {
color: var(--on-panel);
font-weight: 500;
}
.js .sec--process .pr-code-lines li.is-typing::after {
content: "";
display: inline-block;
width: 1ch;
height: 14px;
margin-top: 3px;
vertical-align: top;
background: var(--accent);
opacity: 0;
}
.js .sec--process .pr-stage[data-active="6"] .pr-code-lines li.is-typing::after {
opacity: 1;
animation: pr-caret 1.05s steps(1) infinite;
}
.js .sec--process .pr-report {
--kr: clamp(0, var(--t7) * 3, 1);
left: 36px;
top: 80px;
width: 336px;
padding: 18px 22px 22px;
border: 1px solid var(--line-strong);
border-radius: var(--radius-media);
background: var(--paper);
box-shadow: var(--shadow-lift);
opacity: var(--kr);
transform: translateY(calc((1 - var(--kr)) * 40px)) scale(calc(0.96 + 0.04 * var(--kr)));
}
.js .sec--process .pr-report-top {
display: flex;
justify-content: space-between;
gap: 12px;
padding-bottom: 12px;
border-bottom: 1px solid var(--line);
font-family: var(--font-mono);
font-size: 11px;
line-height: 1.5;
color: var(--muted);
}
.js .sec--process .pr-report-status {
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--accent-ink);
}
.js .sec--process .pr-report-status::before {
content: "";
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent);
}
.js .sec--process .pr-report-title {
margin-top: 16px;
font-family: var(--font-display);
font-size: 24px;
font-weight: 500;
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--ink);
text-wrap: balance;
}
.js .sec--process .pr-report-meta {
display: grid;
margin: 14px 0 0;
font-family: var(--font-mono);
font-size: 12px;
}
.js .sec--process .pr-report-meta div {
display: flex;
justify-content: space-between;
padding: 6px 0;
border-bottom: 1px dashed var(--line);
}
.js .sec--process .pr-report-meta dt {
color: var(--muted);
}
.js .sec--process .pr-report-meta dd {
margin: 0;
color: var(--ink);
}
.js .sec--process .pr-report-lines {
display: grid;
gap: 8px;
margin-top: 16px;
}
.js .sec--process .pr-report-lines i {
height: 6px;
border-radius: 3px;
background: var(--paper-3);
}
.js .sec--process .pr-report-lines i:last-child {
width: 52%;
}
.js .sec--process .pr-stamp {
--ks: clamp(0, (var(--t7) - 0.5) * 5, 1);
position: absolute;
right: 20px;
bottom: 22px;
padding: 4px 12px;
border: 2px solid var(--accent);
border-radius: 6px;
background: var(--paper);
color: var(--accent);
font-family: var(--font-mono);
font-size: 15px;
font-weight: 500;
line-height: 1.4;
letter-spacing: 0.16em;
text-transform: uppercase;
opacity: var(--ks);
transform: rotate(-9deg) scale(calc(1.9 - 0.9 * var(--ks)));
}
.js .sec--process .pr-captions {
grid-area: captions;
position: relative;
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 32px;
padding-bottom: 60px;
}
.js .sec--process .pr-steps {
flex: 0 1 640px;
min-width: 0;
grid-template-columns: minmax(0, 1fr);
gap: 0;
}
.js .sec--process .pr-step {
grid-area: 1 / 1;
align-content: end;
gap: 12px;
padding-top: 0;
border-top: 0;
opacity: 0;
filter: blur(8px);
transform: translateY(14px);
pointer-events: none;
transition:
opacity 0.6s var(--ease),
filter 0.6s var(--ease),
transform 0.6s var(--ease);
}
.js .sec--process .pr-step.is-active {
opacity: 1;
filter: none;
transform: none;
pointer-events: auto;
}
.js .sec--process .pr-step .label-index {
margin-bottom: 2px;
}
.js .sec--process .pr-step-title {
font-size: clamp(34px, 3.4vw, 52px);
line-height: 1;
letter-spacing: -0.035em;
}
.js .sec--process .pr-step-desc {
max-width: 32em;
font-size: clamp(16px, 1.25vw, 18px);
line-height: 1.5;
}
.js .sec--process .pr-skip {
display: inline-flex;
flex: none;
font-family: var(--font-mono);
font-size: 13px;
font-weight: 400;
}
.js .sec--process .pr-final {
--kf: clamp(0, (var(--t8) - 0.3) / 0.32, 1);
grid-area: canvas;
display: grid;
place-items: center;
max-width: none;
margin: 0;
padding: calc(var(--canvas-pt) + var(--dim-h)) var(--canvas-px) var(--canvas-pb);
pointer-events: none;
}
.js .sec--process .pr-select {
box-shadow: none;
opacity: var(--kf);
transform: scale(calc(0.94 + 0.06 * var(--kf)));
}
.js .sec--process .pr-stage.is-final .pr-select {
pointer-events: auto;
}
.js .sec--process .pr-fg {
--kg: clamp(0, (var(--t8) - 0.3) / 0.45, 1);
display: block;
position: absolute;
background: var(--line-strong);
pointer-events: none;
}
.js .sec--process .pr-fg--t,
.js .sec--process .pr-fg--b {
left: -100vw;
right: -100vw;
height: 1px;
transform: scaleX(var(--kg));
-webkit-mask-image: linear-gradient(90deg, transparent, #000 30%, #000 70%, transparent);
mask-image: linear-gradient(90deg, transparent, #000 30%, #000 70%, transparent);
}
.js .sec--process .pr-fg--t { top: 0; }
.js .sec--process .pr-fg--b { bottom: 0; }
.js .sec--process .pr-fg--l,
.js .sec--process .pr-fg--r {
top: -60vh;
bottom: -60vh;
width: 1px;
transform: scaleY(var(--kg));
-webkit-mask-image: linear-gradient(180deg, transparent 8%, #000 34%, #000 62%, transparent 86%);
mask-image: linear-gradient(180deg, transparent 8%, #000 34%, #000 62%, transparent 86%);
}
.js .sec--process .pr-fg--l { left: 0; }
.js .sec--process .pr-fg--r { right: 0; }
.js .sec--process .pr-handle {
--kh: clamp(0, (var(--t8) - 0.55) * 4, 1);
opacity: var(--kh);
transform: scale(calc(0.3 + 0.7 * var(--kh)));
}
.js .sec--process .pr-cta-spec {
opacity: clamp(0, (var(--t8) - 0.62) * 4, 1);
}
.js .sec--process .pr-cta-arrow path {
stroke-dasharray: 100 100;
stroke-dashoffset: calc(100 - 100 * clamp(0, (var(--t8) - 0.66) / 0.26, 1));
}
.js .sec--process .pr-cta-note {
opacity: clamp(0, (var(--t8) - 0.8) * 6, 1);
}
.js .sec--process .pr-xray {
position: absolute;
inset: 0;
z-index: 3;
pointer-events: none;
}
:root[data-theme="xray"].js .sec--process .pr-xray {
display: block;
}
@media (min-width: 1200px) {
.js .sec--process .pr-stage {
--canvas-pt: calc(var(--header-h) + 18px);
--canvas-px: max(var(--gutter) + 236px, (100vw - var(--maxw)) / 2 + var(--gutter) + 236px);
--canvas-pb: 36px;
grid-template-rows: minmax(0, 1fr) auto;
grid-template-areas: "canvas" "captions";
}
.js .sec--process .pr-head {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 2;
pointer-events: none;
}
}
@media (max-width: 640px) {
.js .sec--process .pr-stage {
--canvas-pt: 10px;
--canvas-pb: 18px;
--dim-h: 26px;
}
.js .sec--process .pr-head {
align-items: flex-end;
gap: 16px;
padding-top: calc(var(--header-h) + 12px);
}
.js .sec--process .pr-kicker {
min-width: 0;
}
.js .sec--process .pr-eyebrow,
.js .sec--process .pr-title,
.js .sec--process .pr-meter-label {
font-size: 11px;
text-wrap: balance;
}
.js .sec--process .pr-count {
font-size: 44px;
}
.js .sec--process .pr-framewrap {
width: 100cqw;
height: min(100cqh - var(--dim-h), 640px);
aspect-ratio: auto;
}
.js .sec--process .pr-dim {
top: -19px;
}
.js .sec--process .pr-art {
--aw: 340px;
--ah: 404px;
--x0: 44px;
--y0: 84px;
--cw: 18px;
--rh: 24px;
--hh: 20px;
--mid: 0px;
--wx: 18px;
--hfs: 10.5px;
--lw: calc(9 * var(--cw) - 4px);
}
.js .sec--process .pr-file,
.js .sec--process .pr-ascii,
.js .sec--process .pr-hit-ascii {
display: none;
}
.js .sec--process .pr-off {
right: calc(var(--aw) - var(--x0) + 8px);
}
.js .sec--process .pr-note-arrow {
left: calc(var(--x0) + 4 * var(--cw) + 4px);
}
.js .sec--process .pr-note {
left: calc(var(--x0) + 4 * var(--cw) + 70px);
font-size: 27px;
}
.js .sec--process .pr-tools {
top: 8px;
left: 0;
right: 0;
flex-wrap: wrap;
justify-content: center;
gap: 6px;
}
.js .sec--process .pr-tool {
padding: 3px 8px 3px 7px;
font-size: 11px;
}
.js .sec--process .pr-code {
left: 6px;
top: 196px;
width: 328px;
font-size: 10.5px;
line-height: 17px;
}
.js .sec--process .pr-code-bar {
height: 30px;
padding: 0 12px;
}
.js .sec--process .pr-code-lines {
padding: 10px 12px 0;
}
.js .sec--process .pr-code-lines li {
height: 17px;
}
.js .sec--process .pr-code-lines li::before {
margin-right: 1ch;
}
.js .sec--process .pr-code-lines .sep {
height: 10px;
margin: 0 -12px 6px;
}
.js .sec--process .pr-code-lines li.is-typing::after {
height: 12px;
margin-top: 2px;
}
.js .sec--process .pr-report {
left: 18px;
top: 58px;
width: 304px;
padding: 16px 18px 18px;
}
.js .sec--process .pr-report-title {
font-size: 21px;
}
.js .sec--process .pr-stamp {
right: 16px;
bottom: 18px;
font-size: 13px;
}
.js .sec--process .pr-captions {
display: block;
padding-bottom: 22px;
}
.js .sec--process .pr-step {
gap: 8px;
}
.js .sec--process .pr-step-title {
font-size: 30px;
}
.js .sec--process .pr-step-desc {
max-width: calc(100% - 112px);
font-size: 15px;
}
.js .sec--process .pr-skip {
position: absolute;
top: 0;
right: var(--gutter);
font-size: 12px;
}
}
}
@keyframes pr-caret {
0%, 49% { opacity: 1; }
50%, 100% { opacity: 0; }
}
.sec--about {
--ab-gap: clamp(32px, 6vw, 96px);
}
.sec--about .ab-top {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(240px, 0.48fr);
column-gap: var(--ab-gap);
align-items: stretch;
}
.sec--about .ab-intro {
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 48px;
min-width: 0;
}
.sec--about .ab-statement {
max-width: 28ch;
font-size: clamp(34px, 4.2vw, 76px);
line-height: 1.02;
letter-spacing: -0.035em;
text-wrap: balance;
}
.sec--about .ab-facts {
display: flex;
flex-wrap: wrap;
gap: 24px clamp(32px, 4vw, 64px);
margin: 0;
padding-top: 24px;
border-top: 1px solid var(--line);
}
.sec--about .ab-fact {
display: grid;
gap: 8px;
align-content: start;
}
.sec--about .ab-fact dd {
margin: 0;
min-height: 24px;
display: flex;
align-items: center;
}
.sec--about .ab-fact .link-arrow {
font-size: 16px;
}
.sec--about .ab-home {
font-size: 15px;
color: var(--ink);
}
.sec--about .ab-fig {
align-self: start;
width: 100%;
max-width: 440px;
justify-self: end;
margin-top: clamp(6px, 0.95vw, 14px);
}
.sec--about .ab-media {
aspect-ratio: 896 / 1195;
background: var(--paper-2);
border-radius: 3px;
}
.sec--about .ab-media img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 3px;
background: var(--paper-2);
}
.sec--about .ab-chip {
position: absolute;
top: 16px;
left: 16px;
z-index: 1;
}
.sec--about .ab-caption {
display: flex;
flex-wrap: wrap;
gap: 4px 8px;
margin-top: 20px;
font-size: 12px;
color: var(--muted);
}
.sec--about .ab-caption-tag {
color: var(--accent-ink);
}
.sec--about .ab-principles {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 40px 48px;
margin-top: clamp(80px, 9vw, 128px);
}
.sec--about .ab-principle {
position: relative;
padding-top: 24px;
border-top: 1px solid var(--line-strong);
}
.sec--about .ab-num {
display: block;
font-size: 12px;
color: var(--accent-ink);
}
.sec--about .ab-p-title {
margin-top: 32px;
font-family: var(--font-display);
font-size: clamp(21px, 1.75vw, 25px);
font-weight: 500;
line-height: 1.15;
letter-spacing: -0.02em;
color: var(--ink);
}
.sec--about .ab-p-text {
max-width: 34ch;
margin-top: 12px;
font-size: 16px;
line-height: 1.55;
color: var(--ink-2);
}
@media (max-width: 1100px) {
.sec--about .ab-principles {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 48px clamp(32px, 5vw, 64px);
}
}
@media (max-width: 760px) {
.sec--about .ab-top {
grid-template-columns: minmax(0, 1fr);
row-gap: 56px;
}
.sec--about .ab-statement {
font-size: clamp(32px, 8.6vw, 48px);
line-height: 1.04;
}
.sec--about .ab-intro {
gap: 40px;
}
.sec--about .ab-fig {
justify-self: start;
max-width: min(100%, 420px);
}
}
@media (max-width: 560px) {
.sec--about .ab-principles {
grid-template-columns: minmax(0, 1fr);
gap: 40px;
margin-top: 72px;
}
.sec--about .ab-p-title {
margin-top: 20px;
}
.sec--about .ab-facts {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 24px;
}
.sec--about .ab-fact:first-child {
grid-column: 1 / -1;
}
}
.sec--experience .ex-head {
margin-bottom: clamp(32px, 5vh, 56px);
}
.sec--experience .ex-kicker {
display: inline-flex;
align-items: center;
gap: 10px;
color: var(--ink-2);
letter-spacing: 0.18em;
}
.sec--experience .ex-sq {
width: 7px;
height: 7px;
background: var(--accent);
}
.sec--experience .ex-title {
max-width: 20em;
margin-top: 22px;
font-family: var(--font-display);
font-size: clamp(36px, 4.2vw, 68px);
font-weight: 500;
line-height: 1.02;
letter-spacing: -0.035em;
color: var(--ink);
}
.sec--experience .ex-title .tone-2 {
color: var(--ink-2);
}
.sec--experience .ex-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
}
.sec--experience .ex-card {
position: relative;
display: flex;
flex-direction: column;
padding: clamp(22px, 2.2vw, 30px);
border: 1px solid var(--line-strong);
border-radius: var(--radius-media);
background:
radial-gradient(120% 90% at 85% 0%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 60%),
var(--paper-2);
transition: border-color 0.4s, transform 0.6s var(--ease);
}
.sec--experience .ex-card:hover {
border-color: color-mix(in srgb, var(--accent) 55%, transparent);
transform: translateY(-3px);
}
.sec--experience .ex-top {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
}
.sec--experience .ex-ico {
display: grid;
place-items: center;
width: 52px;
height: 52px;
border: 1px solid var(--line-strong);
border-radius: var(--radius-field);
background: var(--paper);
color: var(--accent-ink);
}
.sec--experience .ex-ico svg {
width: 22px;
height: 22px;
fill: none;
stroke: currentColor;
stroke-width: 1.6;
stroke-linecap: round;
stroke-linejoin: round;
}
.sec--experience .ex-label {
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
text-align: right;
}
.sec--experience .ex-name {
margin-top: auto;
padding-top: 32px;
font-family: var(--font-display);
font-size: clamp(24px, 2vw, 30px);
font-weight: 500;
line-height: 1.1;
letter-spacing: -0.025em;
color: var(--ink);
}
.sec--experience .ex-desc {
max-width: 38em;
margin-top: 10px;
color: var(--ink-2);
}
.sec--experience .ex-tags {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-top: 18px;
}
.sec--experience .ex-tags li {
padding: 3px 9px;
border: 1px solid var(--line-strong);
border-radius: 3px;
font-size: 11px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--ink-2);
}
.sec--experience .ex-link {
align-self: flex-start;
margin-top: 16px;
font-size: 14px;
}
@media (min-width: 1200px) {
.sec--experience .ex-grid {
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.sec--experience .ex-card {
min-height: min(440px, 52vh);
}
}
@media (max-width: 760px) {
.sec--experience .ex-grid {
grid-template-columns: 1fr;
}
}
.sec--skills {
--sk-h: 440px;
--sk-gap: 8px;
--sk-pad: 24px;
--sk-grow: 3.4;
}
.sec--skills .sk-head-row {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
gap: 16px 48px;
margin-bottom: clamp(48px, 5vw, 72px);
}
.sec--skills .sk-title {
text-wrap: balance;
}
.sec--skills .sk-count {
padding-bottom: 6px;
font-size: 12px;
color: var(--muted);
}
.sec--skills .sk-count:empty {
display: none;
}
.sec--skills .sk-status {
padding: 24px 0;
font-size: 13px;
color: var(--muted);
}
.sec--skills .sk-acc {
--sk-n: 4;
container-type: inline-size;
display: flex;
gap: var(--sk-gap);
}
.js .sec--skills .sk-acc {
height: var(--sk-h);
}
.js .sec--skills .sk-acc.is-error {
height: auto;
}
.sec--skills .sk-panel {
position: relative;
isolation: isolate;
flex: 1 1 0;
min-width: 0;
overflow: hidden;
border: 1px solid var(--line);
border-radius: var(--radius-media);
background: var(--paper-2);
transition:
flex-grow 0.7s var(--ease),
border-color 0.3s,
opacity 0.9s var(--ease) var(--reveal-delay, 0ms),
filter 0.9s var(--ease) var(--reveal-delay, 0ms),
transform 0.9s var(--ease) var(--reveal-delay, 0ms);
}
.sec--skills .sk-panel.is-open {
flex-grow: var(--sk-grow);
}
.sec--skills .sk-panel:hover {
border-color: var(--line-strong);
}
.sec--skills .sk-bg {
position: absolute;
inset: 0;
z-index: 0;
pointer-events: none;
}
.sec--skills .sk-pattern {
position: absolute;
inset: 0;
opacity: 0.55;
-webkit-mask-image: linear-gradient(to bottom, #000 0%, rgba(0, 0, 0, 0.7) 35%, transparent 72%);
mask-image: linear-gradient(to bottom, #000 0%, rgba(0, 0, 0, 0.7) 35%, transparent 72%);
transition: opacity 0.7s var(--ease);
}
.sec--skills .is-open .sk-pattern {
opacity: 1;
}
.sec--skills .sk-panel--grid .sk-pattern {
background-image:
linear-gradient(var(--line) 1px, transparent 1px),
linear-gradient(90deg, var(--line) 1px, transparent 1px);
background-size: 24px 24px;
}
.sec--skills .sk-panel--hex .sk-pattern {
background-image:
radial-gradient(circle, var(--line-strong) 1.2px, transparent 1.8px),
radial-gradient(circle, var(--line-strong) 1.2px, transparent 1.8px);
background-size: 20px 34.64px;
background-position: 0 0, 10px 17.32px;
}
.sec--skills .sk-panel--scan .sk-pattern {
background-image: repeating-linear-gradient(to bottom, var(--line) 0 1px, transparent 1px 6px);
}
.sec--skills .sk-panel--rings .sk-pattern {
background-image: repeating-radial-gradient(circle at 300px 96px, transparent 0 23px, var(--line) 23px 24px);
}
.sec--skills .sk-glyph {
position: absolute;
top: 64px;
right: -16px;
width: 220px;
height: 220px;
background: var(--ink);
opacity: 0.03;
-webkit-mask-size: contain;
mask-size: contain;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-position: center;
mask-position: center;
transform: translateX(24px);
transition: opacity 0.7s var(--ease), transform 0.9s var(--ease);
}
.sec--skills .is-open .sk-glyph {
opacity: 0.06;
transform: none;
}
.sec--skills .sk-mark {
position: absolute;
opacity: 0;
transform: scale(0.4);
transition: opacity 0.25s var(--ease), transform 0.25s var(--ease);
}
.sec--skills .is-open .sk-mark {
opacity: 1;
transform: none;
transition: opacity 0.6s var(--ease) 0.35s, transform 0.8s var(--ease) 0.35s;
}
.sec--skills .sk-panel--grid .sk-mark {
left: 289px;
top: 73px;
width: 23px;
height: 23px;
background: var(--accent);
}
.sec--skills .sk-panel--hex .sk-mark {
left: 286px;
top: 83px;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 0 5px var(--accent-soft);
}
.sec--skills .sk-panel--scan .sk-mark {
left: 216px;
top: 96px;
width: 144px;
height: 1px;
background: var(--accent);
transform-origin: left center;
}
.sec--skills .sk-panel--scan .sk-mark::before {
content: "";
position: absolute;
left: -3px;
top: -3px;
width: 7px;
height: 7px;
background: var(--accent);
}
.sec--skills .sk-panel--rings .sk-mark {
left: 296px;
top: 92px;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 0 6px var(--accent-soft);
}
.sec--skills .sk-h {
margin: 0;
font: inherit;
}
.sec--skills .sk-btn {
position: absolute;
inset: 0;
z-index: 2;
display: block;
width: 100%;
text-align: left;
color: var(--ink);
-webkit-tap-highlight-color: transparent;
}
.sec--skills .sk-btn:focus-visible {
outline: 2px solid var(--accent);
outline-offset: -2px;
border-radius: var(--radius-media);
}
.sec--skills .is-open .sk-btn {
pointer-events: none;
cursor: default;
}
.sec--skills .sk-num {
position: absolute;
top: var(--sk-pad);
left: var(--sk-pad);
font-size: 13px;
line-height: 20px;
color: var(--muted);
transition: color 0.4s;
}
.sec--skills .is-open .sk-num {
color: var(--accent-ink);
}
.sec--skills .sk-name {
position: absolute;
left: calc(var(--sk-pad) - 4px);
bottom: var(--sk-pad);
font-family: var(--font-display);
font-size: clamp(20px, 1.8vw, 26px);
font-weight: 500;
line-height: 1.2;
letter-spacing: -0.02em;
white-space: nowrap;
writing-mode: vertical-rl;
transform: rotate(180deg);
transition: opacity 0.5s var(--ease) 0.3s, transform 0.7s var(--ease) 0.3s;
}
.sec--skills .is-open .sk-name {
opacity: 0;
transform: rotate(180deg) translateY(-16px);
transition-duration: 0.2s;
transition-delay: 0s;
}
.sec--skills .sk-plus {
position: absolute;
top: calc(var(--sk-pad) - 5px);
right: calc(var(--sk-pad) - 5px);
width: 30px;
height: 30px;
border: 1px solid var(--line-strong);
border-radius: 50%;
background: var(--paper);
transition: opacity 0.3s var(--ease), transform 0.5s var(--ease), border-color 0.3s;
}
.sec--skills .sk-plus::before,
.sec--skills .sk-plus::after {
content: "";
position: absolute;
left: 50%;
top: 50%;
width: 10px;
height: 1.5px;
border-radius: 1px;
background: var(--ink);
transform: translate(-50%, -50%);
}
.sec--skills .sk-plus::after {
transform: translate(-50%, -50%) rotate(90deg);
}
.sec--skills .sk-btn:hover .sk-plus {
border-color: var(--ink);
}
.sec--skills .is-open .sk-plus {
opacity: 0;
transform: rotate(45deg) scale(0.8);
}
.sec--skills .sk-body {
position: absolute;
top: 0;
bottom: 0;
left: 0;
z-index: 1;
width: 100%;
width: calc((100cqw - (var(--sk-n) - 1) * var(--sk-gap)) * var(--sk-grow) / (var(--sk-grow) + var(--sk-n) - 1) - 2px);
visibility: hidden;
opacity: 0;
transition: opacity 0.2s var(--ease), visibility 0s 0.2s;
}
.sec--skills .is-open .sk-body {
visibility: visible;
opacity: 1;
transition: opacity 0.6s var(--ease) 0.25s, visibility 0s;
}
.sec--skills .sk-body-in {
height: 100%;
}
.sec--skills .sk-content {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: var(--sk-pad);
}
.sec--skills .sk-meta {
align-self: flex-end;
font-size: 12px;
line-height: 20px;
color: var(--muted);
}
.sec--skills .sk-main {
transform: translateY(12px);
transition: transform 0.3s var(--ease);
}
.sec--skills .is-open .sk-main {
transform: none;
transition: transform 0.8s var(--ease) 0.25s;
}
.sec--skills .sk-group {
margin: 0;
}
.sec--skills .sk-desc {
max-width: 36ch;
margin-top: 12px;
font-size: 17px;
line-height: 1.5;
color: var(--ink-2);
}
.sec--skills .sk-tools {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
column-gap: 24px;
margin-top: 24px;
}
.sec--skills .sk-tool {
display: flex;
align-items: center;
gap: 12px;
min-width: 0;
padding: 10px 0;
border-top: 1px solid var(--line);
font-size: 15px;
font-weight: 500;
line-height: 1.3;
color: var(--ink);
}
.sec--skills .sk-tool-name {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.sec--skills .sk-tile {
flex: none;
display: grid;
place-items: center;
width: 36px;
height: 36px;
border: 1px solid var(--line);
border-radius: var(--radius-field);
background: var(--paper);
}
.sec--skills .sk-tile img {
width: 20px;
height: 20px;
}
:root:not([data-theme="xray"]) .sec--skills .sk-tile {
border-color: transparent;
background: var(--on-panel);
}
@media (max-width: 900px) {
.sec--skills {
--sk-pad: 20px;
}
.sec--skills .sk-acc {
container-type: normal;
flex-direction: column;
}
.js .sec--skills .sk-acc {
height: auto;
min-height: calc(4 * 74px + 3 * var(--sk-gap));
}
.sec--skills .sk-panel {
flex: none;
}
.sec--skills .sk-btn {
position: relative;
inset: auto;
display: flex;
align-items: center;
gap: 16px;
min-height: 72px;
padding: 12px var(--sk-pad);
}
.sec--skills .is-open .sk-btn {
pointer-events: auto;
cursor: pointer;
}
.sec--skills .sk-num {
position: static;
flex: none;
}
.sec--skills .sk-name,
.sec--skills .is-open .sk-name {
position: static;
min-width: 0;
font-size: 22px;
white-space: normal;
writing-mode: horizontal-tb;
opacity: 1;
transform: none;
}
.sec--skills .sk-plus {
position: relative;
top: auto;
right: auto;
flex: none;
margin-left: auto;
}
.sec--skills .is-open .sk-plus {
opacity: 1;
transform: rotate(45deg);
}
.sec--skills .sk-body {
position: relative;
top: auto;
bottom: auto;
width: auto;
display: grid;
grid-template-rows: 0fr;
opacity: 1;
transition: grid-template-rows 0.6s var(--ease), visibility 0s 0.6s;
}
.sec--skills .is-open .sk-body {
grid-template-rows: 1fr;
transition: grid-template-rows 0.6s var(--ease), visibility 0s;
}
.sec--skills .sk-body-in {
height: auto;
min-height: 0;
overflow: hidden;
}
.sec--skills .sk-content {
height: auto;
display: flex;
flex-direction: column;
padding: 0 var(--sk-pad) var(--sk-pad);
}
.sec--skills .sk-main {
order: 1;
}
.sec--skills .sk-meta {
order: 2;
align-self: flex-start;
margin-top: 16px;
}
.sec--skills .sk-group {
display: none;
}
.sec--skills .sk-desc {
margin-top: 0;
font-size: 16px;
}
.sec--skills .sk-tools {
grid-template-columns: repeat(2, minmax(0, 1fr));
column-gap: 16px;
margin-top: 20px;
}
.sec--skills .sk-pattern {
-webkit-mask-image: linear-gradient(to bottom, #000 0, rgba(0, 0, 0, 0.5) 72px, transparent 160px);
mask-image: linear-gradient(to bottom, #000 0, rgba(0, 0, 0, 0.5) 72px, transparent 160px);
}
.sec--skills .sk-glyph {
top: auto;
bottom: -32px;
right: -32px;
width: 180px;
height: 180px;
}
.sec--skills .is-open .sk-glyph {
opacity: 0.05;
}
.sec--skills .sk-mark {
display: none;
}
}
@media (min-width: 700px) {
.sec--skills .sk-title .tone-2 {
display: block;
}
}
@media (max-width: 360px) {
.sec--skills .sk-tools {
grid-template-columns: minmax(0, 1fr);
}
}
.sec--path {
display: block;
min-height: 0;
padding: 0;
height: 300vh;
height: 300svh;
}
.sec--path .path-pin {
position: sticky;
top: 0;
height: 100vh;
height: 100svh;
overflow: hidden;
background: #0a0a0c;
color: #f2f1ed;
}
.sec--path .path-bgs {
position: absolute;
inset: 0;
}
.sec--path .path-bg {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
filter: grayscale(1) contrast(1.05) brightness(0.42) blur(1px);
opacity: 0;
transform: scale(1.06);
transition: opacity 1.1s var(--ease), transform 2.4s var(--ease);
}
.sec--path .path-bg.is-on {
opacity: 0.55;
transform: scale(1);
}
.sec--path .path-bgs::after {
content: "";
position: absolute;
inset: 0;
background:
linear-gradient(90deg, #0a0a0c 0%, rgba(10, 10, 12, 0.88) 38%, rgba(10, 10, 12, 0.35) 75%, rgba(10, 10, 12, 0.6) 100%),
radial-gradient(60% 50% at 75% 50%, rgba(139, 61, 255, 0.12), transparent 70%);
}
.sec--path .path-lines {
position: absolute;
inset: 8% 0 8% 30%;
width: 70%;
height: 84%;
fill: none;
stroke: #f2f1ed;
stroke-width: 1;
opacity: 0.12;
filter: blur(0.6px);
}
.sec--path .path-grain {
position: absolute;
inset: -50%;
z-index: 1;
opacity: 0.12;
background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
animation: path-grain 0.9s steps(4) infinite;
pointer-events: none;
}
@keyframes path-grain {
0% { transform: translate(0, 0); }
25% { transform: translate(-3%, 2%); }
50% { transform: translate(2%, -3%); }
75% { transform: translate(-1%, 3%); }
100% { transform: translate(0, 0); }
}
.sec--path .path-frame {
position: relative;
z-index: 2;
height: 100%;
display: grid;
grid-template-rows: auto 1fr auto;
padding-top: calc(var(--header-h) + 16px);
padding-bottom: clamp(32px, 5vh, 56px);
}
.sec--path .path-top {
display: flex;
align-items: baseline;
justify-content: space-between;
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: #8e8e99;
}
.sec--path .path-title {
font-family: var(--font-mono);
font-size: 12px;
font-weight: 500;
letter-spacing: 0.12em;
color: #f2f1ed;
}
.sec--path .path-top b {
font-weight: 500;
color: #b794ff;
}
.sec--path .path-stages {
position: relative;
align-self: center;
min-height: 420px;
}
.sec--path .path-stage {
position: absolute;
left: 0;
top: 50%;
width: min(640px, 100%);
transform: translateY(-50%);
opacity: 0;
visibility: hidden;
transition: opacity 0.6s var(--ease), visibility 0.6s;
}
.sec--path .path-stage.is-on {
opacity: 1;
visibility: visible;
}
.sec--path .path-stage > * {
transform: translateY(20px);
filter: blur(6px);
transition: transform 0.9s var(--ease), filter 0.9s var(--ease);
}
.sec--path .path-stage.is-on > * {
transform: none;
filter: none;
}
.sec--path .path-stage.is-on > :nth-child(2) { transition-delay: 0.05s; }
.sec--path .path-stage.is-on > :nth-child(3) { transition-delay: 0.1s; }
.sec--path .path-stage.is-on > :nth-child(4) { transition-delay: 0.15s; }
.sec--path .path-stage-n {
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: #8e8e99;
}
.sec--path .path-stage-title {
margin-top: 18px;
font-family: var(--font-display);
font-size: clamp(64px, 9vw, 148px);
font-weight: 500;
line-height: 0.92;
letter-spacing: -0.045em;
text-transform: uppercase;
color: #f2f1ed;
}
.sec--path .path-stage-desc {
max-width: 30em;
margin-top: 24px;
font-size: clamp(18px, 1.5vw, 22px);
line-height: 1.45;
color: #c4c4cc;
}
.sec--path .path-table {
max-width: 520px;
margin: 32px 0 0;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.sec--path .path-table div {
display: grid;
grid-template-columns: 110px 1fr;
gap: 16px;
padding: 12px 0;
border-top: 1px solid rgba(242, 241, 237, 0.14);
}
.sec--path .path-table div:last-child {
border-bottom: 1px solid rgba(242, 241, 237, 0.14);
}
.sec--path .path-table dt {
color: #6f6f78;
}
.sec--path .path-table dd {
margin: 0;
color: #f2f1ed;
}
.sec--path .path-foot {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
justify-content: space-between;
gap: 16px 40px;
}
.sec--path .path-progress {
position: relative;
width: 240px;
height: 1px;
background: rgba(242, 241, 237, 0.2);
}
.sec--path .path-progress i {
position: absolute;
inset: 0;
background: #b794ff;
transform-origin: 0 50%;
transform: scaleX(var(--path-p, 0));
}
.sec--path .path-quote {
max-width: 44ch;
font-size: 12px;
color: #8e8e99;
text-align: right;
}
.sec--path.is-static {
height: auto;
}
.sec--path.is-static .path-pin {
position: relative;
height: auto;
min-height: 100svh;
}
.sec--path.is-static .path-stages {
display: grid;
gap: 72px;
min-height: 0;
padding: 48px 0;
}
.sec--path.is-static .path-stage {
position: static;
transform: none;
opacity: 1;
visibility: visible;
}
.sec--path.is-static .path-stage > * {
transform: none;
filter: none;
}
.sec--path.is-static .path-bg:first-child {
opacity: 0.4;
}
@media (max-width: 640px) {
.sec--path .path-quote {
text-align: left;
}
.sec--path .path-table div {
grid-template-columns: 88px 1fr;
}
}
@media (prefers-reduced-motion: reduce) {
.sec--path .path-grain {
animation: none;
}
}
.sec--cert {
justify-content: flex-start;
}
.sec--cert .cert-layout {
display: grid;
grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
gap: clamp(40px, 6vw, 120px);
align-items: start;
}
.sec--cert .cert-panel {
position: sticky;
top: calc(var(--header-h) + 24px);
display: flex;
flex-direction: column;
min-height: calc(100svh - var(--header-h) - 64px);
}
.sec--cert .cert-kicker {
display: inline-flex;
align-items: center;
gap: 10px;
color: var(--ink-2);
letter-spacing: 0.18em;
}
.sec--cert .cert-sq {
width: 7px;
height: 7px;
background: var(--accent);
}
.sec--cert .cert-title {
margin-top: 28px;
font-family: var(--font-display);
font-size: clamp(40px, 4.4vw, 72px);
font-weight: 500;
line-height: 1.02;
letter-spacing: -0.035em;
color: var(--ink);
}
.sec--cert .cert-title .tone-2 {
color: var(--ink-2);
}
.sec--cert .cert-lede {
max-width: 30em;
margin-top: 28px;
font-size: 18px;
color: var(--ink-2);
}
.sec--cert .cert-index {
margin-top: auto;
padding-top: 40px;
max-width: 460px;
counter-reset: none;
}
.sec--cert .cert-index li {
border-top: 1px solid var(--line);
}
.sec--cert .cert-index li:last-child {
border-bottom: 1px solid var(--line);
}
.sec--cert .cert-index a {
display: flex;
align-items: center;
gap: 14px;
padding: 12px 0;
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
transition: color 0.3s, padding 0.4s var(--ease);
}
.sec--cert .cert-index a::before {
content: "";
flex: none;
width: 7px;
height: 7px;
background: var(--accent);
transform: scale(0);
transition: transform 0.35s var(--ease);
}
.sec--cert .cert-index a:hover {
color: var(--ink-2);
}
.sec--cert .cert-index a.is-active {
color: var(--ink);
}
.sec--cert .cert-index a.is-active::before {
transform: none;
}
.sec--cert .cert-count {
margin-top: 20px;
color: var(--muted);
}
.sec--cert .cert-count b {
font-weight: 500;
color: var(--accent-ink);
}
.sec--cert .cert-stack {
display: grid;
gap: 24px;
}
.sec--cert .cert-card {
position: relative;
display: flex;
flex-direction: column;
min-height: min(78svh, 680px);
padding: clamp(24px, 2.6vw, 36px);
border: 1px solid var(--line-strong);
border-radius: var(--radius-media);
background:
radial-gradient(120% 80% at 80% 0%, color-mix(in srgb, var(--accent) 16%, transparent), transparent 60%),
var(--paper-2);
color: var(--ink);
overflow: hidden;
transform-origin: 50% 0;
transition: border-color 0.4s;
}
.sec--cert a.cert-card:hover {
border-color: color-mix(in srgb, var(--accent) 60%, transparent);
}
.sec--cert .cert-card-top {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
}
.sec--cert .cert-ico {
display: grid;
place-items: center;
width: 56px;
height: 56px;
border: 1px solid var(--line-strong);
border-radius: var(--radius-field);
background: var(--paper);
font-family: var(--font-mono);
font-size: 14px;
color: var(--accent-ink);
}
.sec--cert .cert-label {
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted);
}
.sec--cert .cert-media {
position: relative;
display: block;
flex: 1;
min-height: 220px;
margin: 28px 0;
overflow: hidden;
border-radius: var(--radius-media);
background: #ffffff;
isolation: isolate;
}
.sec--cert .cert-media img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: contain;
padding: 0;
transform: scale(1.25);
transition: transform 0.9s var(--ease), opacity 0.3s;
}
.sec--cert .cert-card:hover .cert-media img {
transform: scale(1.3);
}
.sec--cert .cert-media.is-rippling img {
opacity: 0;
}
.sec--cert .cert-card-title {
max-width: 18em;
font-family: var(--font-display);
font-size: clamp(26px, 2.3vw, 36px);
font-weight: 500;
line-height: 1.1;
letter-spacing: -0.025em;
}
.sec--cert .cert-card-desc {
max-width: 34em;
margin-top: 12px;
font-size: 17px;
color: var(--ink-2);
}
.sec--cert .cert-card-foot {
display: flex;
align-items: center;
gap: 14px;
margin-top: 20px;
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--muted);
}
.sec--cert .cert-card-foot b {
font-weight: 500;
letter-spacing: 0.04em;
color: var(--accent-ink);
}
.sec--cert .cert-card-foot .i-arrow {
width: 14px;
height: 14px;
transition: transform 0.45s var(--ease);
}
.sec--cert a.cert-card:hover .cert-card-foot .i-arrow {
transform: rotate(45deg);
}
.sec--cert .cert-empty {
color: var(--muted);
}
@media (max-width: 1023px) {
.sec--cert .cert-layout {
grid-template-columns: 1fr;
}
.sec--cert .cert-panel {
position: static;
min-height: 0;
}
.sec--cert .cert-index,
.sec--cert .cert-count {
display: none;
}
.sec--cert .cert-card {
min-height: 0;
}
.sec--cert .cert-media {
flex: none;
aspect-ratio: 16 / 10;
}
}
.sec--work {
display: block;
min-height: 0;
padding: 0;
}
.sec--work .work-pin {
position: relative;
height: 100vh;
height: 100svh;
overflow: hidden;
background: var(--paper);
}
.sec--work.is-pinned .work-pin {
position: sticky;
top: 0;
}
.sec--work .work-contours {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
opacity: 0.95;
pointer-events: none;
transform: translate3d(calc(var(--work-p, 0) * -6%), 0, 0) scale(1.12);
}
.sec--work.is-pinned .work-viewport {
position: absolute;
inset: 0;
-webkit-mask-image: linear-gradient(to right, transparent calc(var(--gutter) + 60px), #000 26vw);
mask-image: linear-gradient(to right, transparent calc(var(--gutter) + 60px), #000 26vw);
}
.sec--work .work-side {
position: absolute;
left: var(--gutter);
top: calc(var(--header-h) + 24px);
bottom: 40px;
z-index: 2;
display: flex;
flex-direction: column;
gap: 14px;
width: 22vw;
pointer-events: none;
}
.sec--work .work-side a {
pointer-events: auto;
}
.sec--work .work-label {
font-size: 15px;
font-weight: 500;
letter-spacing: 0.08em;
color: var(--ink);
}
.sec--work .work-hint {
color: var(--muted);
}
.sec--work .work-hint span {
color: var(--accent-ink);
}
.sec--work .work-gh {
margin-top: auto;
align-self: flex-start;
}
.sec--work .work-track {
position: absolute;
top: 50%;
left: 0;
display: flex;
gap: clamp(32px, 4vw, 80px);
padding-left: max(28vw, calc(var(--gutter) + 260px));
padding-right: var(--gutter);
transform: translate3d(var(--work-x, 0px), -50%, 0);
will-change: transform;
}
.sec--work .work-card {
flex: none;
display: grid;
grid-template-rows: auto auto 1fr;
width: min(56vw, 900px);
padding: 14px;
background: #f1f1f2;
color: #0b0b0e;
box-shadow: 0 40px 80px -40px rgba(0, 0, 0, 0.6);
}
.sec--work .work-media {
position: relative;
display: block;
aspect-ratio: 1200 / 620;
overflow: hidden;
background: #efefef;
isolation: isolate;
}
.sec--work .work-media img {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 1s var(--ease), opacity 0.3s;
}
.sec--work .work-card:hover .work-media img {
transform: scale(1.03);
}
.sec--work .work-media.is-rippling img {
opacity: 0;
}
.sec--work .work-tag {
position: absolute;
left: 0;
top: 0;
z-index: 2;
padding: 10px 14px;
background: #f1f1f2;
font-size: 15px;
color: #0b0b0e;
}
.sec--work .work-title {
margin: 26px 14px 0;
font-family: var(--font-display);
font-size: clamp(34px, 3.4vw, 56px);
font-weight: 500;
line-height: 1;
letter-spacing: -0.035em;
}
.sec--work .work-cols {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 32px;
align-self: end;
margin: 36px 14px 12px;
font-size: 12px;
line-height: 1.6;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #3a3a42;
}
.sec--work:not(.is-pinned) .work-pin {
height: auto;
min-height: 100svh;
display: flex;
flex-direction: column;
justify-content: center;
padding: calc(var(--header-h) + 16px) 0 48px;
}
.sec--work:not(.is-pinned) .work-side {
position: relative;
inset: auto;
width: auto;
margin: 0 var(--gutter) 28px;
}
.sec--work:not(.is-pinned) .work-gh {
margin-top: 0;
}
.sec--work:not(.is-pinned) .work-track {
position: relative;
top: auto;
transform: none;
padding-left: var(--gutter);
overflow-x: auto;
scroll-snap-type: x mandatory;
-webkit-overflow-scrolling: touch;
scrollbar-width: none;
}
.sec--work:not(.is-pinned) .work-track::-webkit-scrollbar {
display: none;
}
.sec--work:not(.is-pinned) .work-card {
width: min(84vw, 560px);
scroll-snap-align: start;
}
@media (max-width: 640px) {
.sec--work .work-cols {
grid-template-columns: 1fr;
gap: 10px;
}
}
.sec--journal {
display: block;
min-height: 0;
padding: 0;
}
.sec--journal .jr-pin {
position: relative;
min-height: 100vh;
min-height: 100svh;
display: flex;
flex-direction: column;
background: #000;
color: #f4f4f6;
overflow: hidden;
}
.sec--journal.is-pinned {
height: 300vh;
height: 300svh;
}
.sec--journal.is-pinned .jr-pin {
position: sticky;
top: 0;
height: 100vh;
height: 100svh;
}
.sec--journal .jr-head {
display: flex;
align-items: baseline;
justify-content: space-between;
padding-top: calc(var(--header-h) + 24px);
}
.sec--journal .jr-label {
font-size: 15px;
font-weight: 500;
letter-spacing: 0.08em;
color: #f4f4f6;
}
.sec--journal .jr-head .link-arrow {
color: #f4f4f6;
}
.sec--journal .jr-count {
padding-bottom: 32px;
color: #8e8e99;
}
.sec--journal .jr-count b {
font-weight: 500;
color: #b794ff;
}
.sec--journal .jr-stage {
--jr-w: min(1240px, 84vw);
--jr-h: min(66svh, 600px);
flex: 1;
display: grid;
place-items: center;
perspective: 2200px;
}
.sec--journal .jr-cube {
position: relative;
width: var(--jr-w);
height: var(--jr-h);
transform-style: preserve-3d;
transform: translateZ(calc(var(--jr-h) / -2)) rotateX(var(--jr-rot, 0deg));
will-change: transform;
}
.sec--journal .jr-face {
position: absolute;
inset: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
transform: rotateX(calc(var(--i) * 90deg)) translateZ(calc(var(--jr-h) / 2));
color: #000;
}
.sec--journal .jr-face:nth-child(1) { --i: 0; }
.sec--journal .jr-face:nth-child(2) { --i: -1; }
.sec--journal .jr-face:nth-child(3) { --i: -2; }
.sec--journal .jr-card {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
padding: 7% 7% 6%;
background: #ffffff;
overflow: hidden;
}
.sec--journal .jr-cross {
position: absolute;
inset: 0;
pointer-events: none;
background:
linear-gradient(#000, #000) 50% 0 / 1px 9% no-repeat,
linear-gradient(#000, #000) 50% 13% / 86% 1px no-repeat;
opacity: 0.85;
}
.sec--journal .jr-num {
margin-top: 4%;
font-family: var(--font-sans);
font-size: clamp(96px, 13vw, 220px);
font-weight: 700;
line-height: 0.9;
letter-spacing: -0.06em;
}
.sec--journal .jr-title {
margin-top: 6%;
font-family: var(--font-sans);
font-size: clamp(22px, 2.4vw, 40px);
font-weight: 700;
line-height: 1;
letter-spacing: -0.04em;
text-align: center;
text-transform: uppercase;
}
.sec--journal .jr-table {
display: grid;
width: 100%;
margin-top: auto;
font-size: 15px;
}
.sec--journal .jr-table > span {
display: grid;
grid-template-columns: 1fr 1fr;
border-bottom: 1px solid #000;
}
.sec--journal .jr-table i,
.sec--journal .jr-table b {
padding: 6px 12px;
font-style: normal;
font-weight: 400;
}
.sec--journal .jr-table i {
text-align: right;
border-right: 1px solid #000;
}
.sec--journal .jr-media {
position: relative;
display: block;
overflow: hidden;
background: #111;
isolation: isolate;
}
.sec--journal .jr-media img {
width: 100%;
height: 100%;
object-fit: cover;
filter: grayscale(1) contrast(1.1);
transition: transform 1s var(--ease), opacity 0.3s;
}
.sec--journal a.jr-face:hover .jr-media img {
transform: scale(1.04);
}
.sec--journal .jr-media.is-rippling img {
opacity: 0;
}
.sec--journal .jr-media--blank {
background:
repeating-linear-gradient(45deg, rgba(255, 255, 255, 0.05) 0 1px, transparent 1px 14px),
#0d0d10;
}
.sec--journal:not(.is-pinned) .jr-stage {
perspective: none;
padding: 32px var(--gutter);
}
.sec--journal:not(.is-pinned) .jr-cube {
width: 100%;
height: auto;
display: grid;
gap: 24px;
transform: none;
}
.sec--journal:not(.is-pinned) .jr-face {
position: relative;
transform: none;
min-height: 420px;
}
@media (max-width: 760px) {
.sec--journal .jr-face {
grid-template-columns: 1fr;
}
.sec--journal .jr-media {
aspect-ratio: 4 / 3;
}
.sec--journal .jr-card {
min-height: 380px;
}
}
.sec--hobbies .hb-wrap {
display: flex;
flex-direction: column;
gap: clamp(32px, 5vh, 64px);
}
.sec--hobbies .hb-head {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 12px 32px;
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
}
.sec--hobbies .hb-label {
font-family: var(--font-mono);
font-size: 15px;
font-weight: 500;
letter-spacing: 0.08em;
color: var(--ink);
}
.sec--hobbies .hb-list {
border-top: 1px solid var(--line-strong);
}
.sec--hobbies .hb-row {
position: relative;
display: grid;
grid-template-columns: 72px minmax(0, 1fr) auto;
align-items: center;
gap: 16px 32px;
padding: clamp(10px, 1.6vh, 20px) 0;
border-bottom: 1px solid var(--line-strong);
transition: opacity 0.4s var(--ease);
}
.sec--hobbies .hb-row::before {
content: "";
position: absolute;
inset: 0;
z-index: -1;
background: var(--accent-soft);
transform: scaleY(0);
transform-origin: 50% 100%;
transition: transform 0.5s var(--ease);
}
.sec--hobbies .hb-n {
color: var(--accent-ink);
}
.sec--hobbies .hb-name {
font-family: var(--font-display);
font-size: clamp(48px, 8.4vw, 156px);
font-weight: 500;
line-height: 0.95;
letter-spacing: -0.05em;
text-transform: uppercase;
color: var(--ink);
transition: transform 0.6s var(--ease), color 0.4s;
}
.sec--hobbies .hb-meta {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 10px;
font-size: 12px;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.sec--hobbies .hb-badge {
padding: 4px 10px;
border: 1px solid var(--line-strong);
border-radius: 3px;
color: var(--ink-2);
}
.sec--hobbies .hb-meta .link-arrow {
font-family: var(--font-mono);
font-size: 12px;
}
@media (hover: hover) {
.sec--hobbies .hb-list:hover .hb-row {
opacity: 0.3;
}
.sec--hobbies .hb-list .hb-row:hover {
opacity: 1;
}
.sec--hobbies .hb-row:hover::before {
transform: none;
}
.sec--hobbies .hb-row:hover .hb-name {
transform: translateX(24px);
color: var(--accent-ink);
}
}
@media (max-width: 640px) {
.sec--hobbies .hb-row {
grid-template-columns: 36px minmax(0, 1fr);
}
.sec--hobbies .hb-meta {
grid-column: 2;
flex-direction: row;
align-items: center;
justify-content: flex-start;
}
}
.sec--contact .contact-panel {
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
gap: 48px clamp(40px, 6vw, 96px);
padding: clamp(40px, 6vw, 88px);
overflow: hidden;
isolation: isolate;
border: 1px solid rgba(244, 244, 246, 0.08);
}
.sec--contact .contact-orb {
position: absolute;
right: -14%;
top: -38%;
z-index: -1;
width: min(62vw, 760px);
aspect-ratio: 1;
border-radius: 50%;
background: radial-gradient(circle at 35% 35%, #a66bff 0%, #8b3dff 45%, #5b21b6 100%);
opacity: 0.9;
filter: saturate(1.05);
}
.sec--contact .contact-intro {
display: flex;
flex-direction: column;
gap: 24px;
}
.sec--contact .contact-title {
max-width: 11em;
font-family: var(--font-display);
font-size: clamp(38px, 4.6vw, 68px);
font-weight: 500;
line-height: 1;
letter-spacing: -0.035em;
color: #f4f4f6;
}
.sec--contact .contact-title .dot {
color: #b794ff;
}
.sec--contact .contact-lede {
max-width: 26em;
font-size: 18px;
color: #c9c9d1;
}
.sec--contact .contact-mail {
align-self: flex-start;
margin-top: auto;
font-family: var(--font-mono);
font-size: 15px;
color: #f4f4f6;
border-bottom: 1px solid rgba(244, 244, 246, 0.35);
padding-bottom: 2px;
}
.sec--contact .contact-mail:hover {
border-color: #b794ff;
}
.sec--contact .contact-form {
display: grid;
gap: 22px;
padding: clamp(24px, 3vw, 36px);
border: 1px solid rgba(244, 244, 246, 0.12);
border-radius: var(--radius-media);
background: rgba(12, 10, 18, 0.72);
-webkit-backdrop-filter: blur(18px);
backdrop-filter: blur(18px);
}
.sec--contact .cf-field {
display: grid;
gap: 6px;
}
.sec--contact .cf-field label {
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.06em;
text-transform: uppercase;
color: #b4b4bd;
}
.sec--contact .cf-field label span {
text-transform: none;
letter-spacing: 0;
color: #8e8e99;
}
.sec--contact .cf-field input,
.sec--contact .cf-field textarea {
width: 100%;
padding: 10px 0;
border: 0;
border-bottom: 1px solid rgba(244, 244, 246, 0.24);
border-radius: 0;
background: transparent;
color: #f4f4f6;
font-size: 17px;
transition: border-color 0.3s;
}
.sec--contact .cf-field textarea {
resize: vertical;
min-height: 96px;
}
.sec--contact .cf-field input:focus,
.sec--contact .cf-field textarea:focus {
outline: none;
border-bottom-color: #b794ff;
box-shadow: 0 1px 0 #b794ff;
}
.sec--contact .cf-field input:user-invalid,
.sec--contact .cf-field textarea:user-invalid {
border-bottom-color: #ff8a8a;
}
.sec--contact .cf-hp {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}
.sec--contact .cf-foot {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-top: 6px;
}
.sec--contact .cf-status {
flex: 1 1 200px;
color: #b4b4bd;
}
.sec--contact .cf-status.is-ok {
color: #b794ff;
}
.sec--contact .cf-status.is-err {
color: #ff9a9a;
}
.sec--contact .btn-pill {
--btn-bg: #f4f4f6;
--btn-fg: #09090b;
--btn-icon-bg: #8b3dff;
--btn-icon-fg: #ffffff;
}
@media (max-width: 900px) {
.sec--contact .contact-panel {
grid-template-columns: 1fr;
}
.sec--contact .contact-orb {
right: -40%;
top: -18%;
width: 110vw;
}
}
@media (max-width: 640px) {
.sec--contact .container {
padding-inline: 12px;
}
.sec--contact .contact-panel {
padding: 32px 20px;
}
.sec--contact .cf-foot .btn-pill {
width: 100%;
justify-content: space-between;
}
}
