/* ---- tokens.css ---- */
@font-face { font-family: 'Cossette Titre'; src: url('/assets/fonts/cossette-titre-latin-400-normal.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: 'Cossette Titre'; src: url('/assets/fonts/cossette-titre-latin-700-normal.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; }
@font-face { font-family: 'DM Mono'; src: url('/assets/fonts/dm-mono-latin-400-normal.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: 'DM Mono'; src: url('/assets/fonts/dm-mono-latin-500-normal.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; }

:root {
  --gutter: 40px;
  --gap: 24px;
  --header-h: 100px;
  --vgutter: 100px;

  --bg: #f7f7f7;
  --ink: #000;
  --ink-faded: rgba(0, 0, 0, 0.15);
  --ink-soft: rgba(0, 0, 0, 0.55);
  --white: #fff;
  --white-faded: rgba(255, 255, 255, 0.15);
  --dark: #0c0c0c;
  --accent: #b8862b;        /* brass, proposed from the Hawks signage */
  --placeholder: #2b2b2b;

  --font-display: 'Cossette Titre', 'Arial Narrow', Impact, sans-serif;
  --font-mono: 'DM Mono', ui-monospace, SFMono-Regular, Menlo, monospace;

  --title-size: clamp(1.2rem, 1.2rem + 8vw, 9rem);
  --title-lh: 1em;
  --title-ls: -0.02em;
  --h1-size: clamp(2rem, 1.5rem + 4vw, 5.5rem);
  --h2-size: clamp(1.75rem, 1.25rem + 3vw, 4.5rem);
  --h3-size: clamp(1.75rem, 1.1rem + 2vw, 3rem);
  --h4-size: clamp(1.35rem, 1rem + 1.2vw, 2.25rem);
  --h5-size: clamp(1.1rem, 0.95rem + 0.6vw, 1.6rem);

  --body-size: 1rem;
  --body-lh: 20px;
  --body-w: 500;
  --body-ls: -0.005em;

  /* Reading text: case-study paragraphs, captions, the About story and how-I-work bodies, the Now
     columns, the hero right paragraph, the Also subtitles. One face for all of it, swapped here. */
  --font-body: var(--font-mono);
  --prose-size: 1rem;
  --prose-lh: 1.6;
  --prose-w: 400;
  --prose-ls: 0;
  --measure: 66ch;          /* about 66 characters a line in the mono face */

  --ease-out: cubic-bezier(0.19, 1, 0.22, 1);
  --ease-inout: cubic-bezier(0.77, 0, 0.175, 1);
  --dur: 0.6s;
}

/* Breakpoint ladder: tablets keep the 100px header and lose 10px of gutter; phones
   get 20px gutters, a 12px gap, an 80px header and an 80px vertical gutter. */
@media (max-width: 1024px) {
  :root { --gutter: 30px; }
}
@media (max-width: 767px) {
  :root { --gutter: 20px; --gap: 12px; --header-h: 80px; --vgutter: 80px; }
}

/* ---- base.css ---- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: auto; }
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: hidden; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-mono);
  font-size: var(--body-size);
  line-height: var(--body-lh);
  font-weight: var(--body-w);
  letter-spacing: var(--body-ls);
  text-transform: uppercase;
  -webkit-font-smoothing: antialiased;
  overflow-x: clip;
  min-height: 100vh;
}
body.is-dark { background: var(--dark); color: var(--white); }
img, picture, video, svg { display: block; max-width: 100%; }
picture { background: var(--ink-faded); background-image: var(--ph); background-size: cover; background-position: center; }
picture img { width: 100%; height: auto; }
a { color: inherit; text-decoration: none; }
ul, ol { list-style: none; margin: 0; padding: 0; }
p, h1, h2, h3, h4, h5, h6, figure, dl, dd, blockquote { margin: 0; }
button { font: inherit; letter-spacing: inherit; text-transform: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
.visually-hidden { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
:focus { outline: none; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
.skip-link { position: fixed; top: 8px; left: 8px; z-index: 1000; padding: 8px 12px; background: var(--ink); color: var(--white); transform: translateY(-200%); }
.skip-link:focus-visible { transform: none; }

.display { font-family: var(--font-display); font-weight: 400; text-transform: uppercase; letter-spacing: var(--title-ls); line-height: 1; }
.mono { font-family: var(--font-mono); font-size: var(--body-size); line-height: var(--body-lh); font-weight: var(--body-w); letter-spacing: var(--body-ls); }
.h1 { font-size: var(--h1-size); line-height: 1.05; letter-spacing: -0.015em; }
.h2 { font-size: var(--h2-size); line-height: 1.05; letter-spacing: -0.02em; }
.h3 { font-family: var(--font-display); font-weight: 400; text-transform: uppercase; font-size: var(--h3-size); line-height: 1.1; letter-spacing: -0.02em; }
.h4 { font-size: var(--h4-size); line-height: 1.1; letter-spacing: -0.02em; }
.h5 { font-size: var(--h5-size); line-height: 1.15; letter-spacing: -0.01em; }

/* Reading text in sentence case. Labels, nav, buttons, meta lists, headings and display type stay
   uppercase from the body rule above; these long-text blocks opt out and take the reading face. */
.project-text p, .about-text p, .how-list p, .now-col, .hero-col p, .small-item p, .project-figure figcaption {
  font-family: var(--font-body); text-transform: none; overflow-wrap: break-word;
}
.project-text p, .about-text p, .how-list p, .now-col, .hero-col p, .small-item p {
  font-size: var(--prose-size); line-height: var(--prose-lh); font-weight: var(--prose-w); letter-spacing: var(--prose-ls);
  max-width: var(--measure);
}

.bullet { display: inline-flex; align-items: center; gap: 12px; }
.bullet i { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex: 0 0 auto; }
.shuffle { display: inline-block; }
.nav-link .shuffle, .pill .shuffle { white-space: nowrap; }
/* Underline hover: the resting line wipes out to the right at once; a second line wipes in from the
   left 0.3 s later. On leave the second line wipes out at once and the first comes back after 0.3 s. */
.underline-link { position: relative; display: inline-block; }
.underline-link::before, .underline-link::after { content: ''; position: absolute; left: 0; bottom: -1px; width: 100%; height: 7%; background: currentColor; }
.underline-link::before { transform: scaleX(1); transform-origin: left; transition: transform 0.735s cubic-bezier(0.625, 0.05, 0, 1) 0.3s; }
.underline-link::after { transform: scaleX(0); transform-origin: right; transition: transform 0.735s cubic-bezier(0.625, 0.05, 0, 1) 0s; }
.underline-link:hover::before, .underline-link:focus-visible::before { transform: scaleX(0); transform-origin: right; transition-delay: 0s; }
.underline-link:hover::after, .underline-link:focus-visible::after { transform: scaleX(1); transform-origin: left; transition-delay: 0.3s; }
.arrow-link { display: inline-flex; align-items: center; gap: 10px; border-bottom: 1px solid currentColor; padding-bottom: 2px; }
.arrow-link .arrow { transition: transform 0.4s var(--ease-out); }
.arrow-link:hover .arrow, .arrow-link:focus-visible .arrow { transform: translateX(6px); }
.pill { display: inline-flex; align-items: center; padding: 0 24px; height: 36px; border-radius: 4px; background: var(--ink); color: var(--white); white-space: nowrap; }

.img-placeholder, .img-missing { position: relative; width: 100%; aspect-ratio: 3 / 2; background: var(--placeholder); color: var(--white); display: grid; place-items: center; text-align: center; }
.img-placeholder .mono, .img-missing .mono { opacity: 0.6; padding: 24px; }
.img-missing { background: #8a1c1c; }

.scroll-progress { position: fixed; top: 0; left: 0; right: 0; height: 3px; z-index: 900; pointer-events: none; }
.scroll-progress i { display: block; height: 100%; width: 100%; background: var(--accent); transform-origin: left; transform: scaleX(0); }

.site-main { position: relative; z-index: 1; }
.line { display: block; overflow: hidden; }
.line-inner { display: block; }

/* Cover with a looping clip: the clip sits exactly over its poster picture. */
.media-stack { position: relative; display: block; width: 100%; height: 100%; }
.media-stack .cover-video { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity 0.4s ease-out; }
.media-stack .cover-video.is-playing { opacity: 1; }
.reduce-motion .media-stack .cover-video { display: none; }

/* ---- header.css ---- */
/* Header: a fixed band the height of --header-h that lets clicks through except on its controls.
   Colour flips to white over dark sections (body.header-light, set by the showcase) and while the
   menu is open. The scroll-driven flip is instant; the menu flip eases while body.menu-anim is on. */
.site-header { position: fixed; top: 0; left: 0; right: 0; height: var(--header-h); z-index: 1000; color: var(--ink); pointer-events: none; }
.site-header::before { content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none; background: linear-gradient(var(--bg), transparent); }
body.header-light .site-header::before, body.menu-open .site-header::before { opacity: 0; }
body.header-light .site-header, body.menu-open .site-header { color: var(--white); }
body.menu-anim .site-header { transition: color 0.3s cubic-bezier(0.455, 0.03, 0.515, 0.955); }
.header-inner { position: relative; height: 100%; padding: 20px var(--gutter); display: flex; align-items: center; justify-content: space-between; }
@media (max-width: 1466px) { .header-inner { padding: 10px var(--gutter); } }
.brand, .site-nav li, .header-cta, .menu-button { pointer-events: auto; }

/* Brand */
.brand { position: relative; z-index: 2; display: inline-flex; align-items: center; gap: 12px; }
.brand-mark { width: auto; height: 50px; display: block; }
.brand-mark img { width: auto; height: 100%; }
@media (max-width: 767px) { .brand-mark { height: 40px; } }

/* Primary nav: starts at the right content column (50% + half a gap).
   Hover slides a solid pill with an inverted label up under the link; the current page keeps
   its pill until another link is hovered. Pure CSS, so it works with JavaScript off. */
.site-nav { position: absolute; inset: 0; display: flex; align-items: center; padding-left: calc(50% + var(--gap) / 2); pointer-events: none; }
.site-nav ul { display: flex; }
.site-nav li { padding: 0 15px; }
.site-nav li:first-child { padding-left: 0; }
.site-nav li:last-child { padding-right: 0; }
.nav-link { position: relative; display: block; overflow: hidden; line-height: 24px; white-space: nowrap; }
.nav-label { position: relative; display: block; padding: 0 10px; transition: transform 0.2s; }
.nav-label::before { content: ''; position: absolute; top: 100%; left: 0; width: 100%; height: 100%; background: currentColor; border-radius: 3px; }
.nav-hover { position: absolute; top: 100%; left: 0; width: 100%; height: 100%; padding: 0 10px; filter: invert(1); }
.site-nav li:hover .nav-label, .nav-link:focus-visible .nav-label, .nav-link[aria-current="page"] .nav-label { transform: translateY(-100%); }
.site-nav ul:hover .nav-link[aria-current="page"]:not(:hover):not(:focus-visible) .nav-label { transform: translateY(0); }
.nav-link:focus-visible { outline-offset: 2px; }

/* Rolling label: the text rolls up and its copy rolls in from below */
.roll { position: relative; display: inline-flex; transition: transform 0.8s cubic-bezier(0.2, 1.33, 0.25, 1); }
.roll::before { content: attr(data-hover); position: absolute; top: 0; left: 0; width: auto; transform: translateY(150%); }
.header-cta:hover .roll, .header-cta:focus-visible .roll, .menu-button:hover .roll, .menu-button:focus-visible .roll { transform: translateY(-150%); }

/* Header button: a 34px solid box in the header colour. On hover the label shifts left and an
   arrow scales in on the right; the custom cursor glides onto the arrow box (cursor.js). */
.header-cta { position: relative; z-index: 2; display: inline-flex; align-items: center; height: 34px; border: 2px solid currentColor; border-radius: 5px; background: currentColor; overflow: hidden; white-space: nowrap; transition: background-color 0.2s ease-out; }
.header-cta::after { content: ''; position: absolute; inset: 0; border-radius: inherit; opacity: 0.3; box-shadow: inset 0 0 15px currentColor; pointer-events: none; }
.header-cta:focus-visible { outline-offset: 4px; }
.cta-inner { display: inline-flex; align-items: center; height: 100%; transform: translateX(0); transition: transform 0.2s ease-out; }
.header-cta:hover .cta-inner, .header-cta:focus-visible .cta-inner { transform: translateX(-5px); transition: none; }
.btn-text-wrap { display: block; padding: 0 0 0 20px; transition: padding 0.3s ease-out; }
.header-cta:hover .btn-text-wrap, .header-cta:focus-visible .btn-text-wrap { padding: 0 6px 0 14px; }
.btn-text { display: block; overflow: hidden; font-size: 85%; line-height: 30px; }
.btn-text .roll { filter: invert(1); }
.btn-icon-wrap { display: block; transform: scale(0); transform-origin: 50% center; transition: transform 0.3s ease-out; }
.header-cta:hover .btn-icon-wrap, .header-cta:focus-visible .btn-icon-wrap { transform: scale(1); }
.btn-icon-fx { display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; border-radius: 3px; }
.btn-icon { display: block; width: 10px; height: 10px; color: currentColor; filter: invert(1); }
.btn-icon svg { width: 100%; height: 100%; }

/* Menu button (1024px and below): three round dots that fold into a cross, with a rolling
   'Menu' label beside them on tablets. */
.menu-button { position: relative; z-index: 2; display: none; align-items: center; height: 44px; margin-right: -10px; }
.menu-label { display: block; overflow: hidden; margin-right: 14px; line-height: 44px; }
.menu-icon-box { display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 44px; }
.dots { position: relative; display: block; width: 25px; height: 25px; }
.dots i { position: absolute; top: 10px; left: 0; width: 5px; height: 5px; border-radius: 5px; background: currentColor; display: block; transition: left 0.2s ease-in-out, top 0.2s ease-in-out, width 0.2s ease-in-out, height 0.2s ease-in-out, transform 0.2s ease-in-out; }
.dots i:nth-child(2) { left: 10px; }
.dots i:nth-child(3) { left: 20px; }
.menu-button[aria-expanded="true"] .dots i:nth-child(1) { top: 12px; left: 3px; width: 20px; height: 2px; transform: rotate(45deg); }
.menu-button[aria-expanded="true"] .dots i:nth-child(2) { transform: scale(0); }
.menu-button[aria-expanded="true"] .dots i:nth-child(3) { top: 12px; left: 3px; width: 20px; height: 2px; transform: rotate(-45deg); }

/* Fullscreen menu: a dark panel under the header; links centred, dimmed as a group on hover.
   Entrance and exit are timed in menu.js; hidden stays display:none with JavaScript off. */
.fullscreen-menu { position: fixed; inset: 0; z-index: 990; background: var(--dark); color: var(--white); display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: var(--header-h) var(--gutter) var(--gutter); }
.fullscreen-menu[hidden] { display: none; }
.fullscreen-menu ul { display: flex; flex-direction: column; align-items: center; }
.fullscreen-menu a.display { display: block; overflow: hidden; padding: 0 50px; font-size: clamp(2rem, 1.5rem + 4vw, 5.5rem); line-height: 1.05; letter-spacing: -0.02em; transition: opacity 0.1s ease-in-out; }
.fullscreen-menu .menu-link-inner { display: block; }
.fullscreen-menu .menu-link-label { display: block; transform: translateY(-5px); }
.fullscreen-menu ul:hover a.display, .fullscreen-menu.is-leaving a.display { opacity: 0.3; }
.fullscreen-menu li:hover a.display, .fullscreen-menu.is-leaving li.is-target a.display { opacity: 1; }
.fullscreen-menu a.display:focus-visible { outline-offset: -2px; }
.fullscreen-menu-foot { position: absolute; left: var(--gutter); right: var(--gutter); bottom: var(--gutter); }
body.menu-open { overflow: hidden; }

@media (max-width: 1024px) {
  .site-nav, .header-cta { display: none; }
  .menu-button { display: flex; }
}
@media (max-width: 767px) {
  .menu-label { display: none; }
  .fullscreen-menu a.display { padding: 0 20px; }
}

/* ---- hero.css ---- */
.hero { position: relative; padding: calc(var(--header-h) + 60px) var(--gutter) 0; min-height: 100svh; display: flex; flex-direction: column; }
.hero-caption { flex: 1 0 auto; display: flex; flex-direction: column; justify-content: space-between; gap: 48px; padding-bottom: 40px; }
.hero-title { font-size: var(--title-size); line-height: var(--title-lh); letter-spacing: var(--title-ls); margin-left: -0.04em; }
.hero-title .line { white-space: nowrap; }
@media (max-width: 600px) { .hero-title .line { white-space: normal; } }
.hero-center .hero-title { text-align: center; margin: 0 auto; max-width: none; }
.hero-cols { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); align-items: end; }
.hero-col p, .hero-col .col-line { display: block; }
.hero-col .col-line { max-width: 32em; }
.hero-subtitle { text-align: center; max-width: 36em; margin: 0 auto; }
/* The footer's line sits on its bottom edge and draws from the centre once the footer is in. */
.hero-footer { position: relative; display: grid; grid-template-columns: 1fr 1fr 1fr; align-items: center; gap: var(--gap); height: 100px; }
.hero-footer::before { content: ''; position: absolute; left: 0; bottom: 0; width: 100%; height: 1px; background: currentColor; opacity: 0.15; }
.js:not(.reduce-motion) .hero-footer::before { opacity: 0; transform: scaleX(0); transform-origin: center; transition: opacity 0.5s ease-out, transform 0.5s ease-out; }
.js:not(.reduce-motion) .hero-footer.is-visible::before { opacity: 0.15; transform: scaleX(1); }
.hero-note { text-align: center; }
.hero-note-right { text-align: right; }
.scroll-cue { display: inline-flex; align-items: center; gap: 28px; }
.scroll-cue .arrow { display: inline-block; }
.hero-project { min-height: 0; padding-bottom: 0; }
.hero-project .hero-caption { padding-top: 0; gap: 90px; min-height: calc(100svh - var(--header-h) - 160px); justify-content: flex-start; }
.hero-project .hero-title { padding-top: 0; }
.hero-project .hero-subtitle { margin-top: auto; }
.hero-center .hero-subtitle { text-align: center; }
/* Project hero media: a full viewport block below the caption (100dvh), cropped so the
   1.1 entrance scale and the 30% scroll drift stay inside it. */
.hero-media { position: relative; margin: 0 calc(-1 * var(--gutter)); overflow: hidden; }
.hero-media .media-stack, .hero-media picture, .hero-media .img-placeholder { width: 100%; height: 100vh; height: 100dvh; aspect-ratio: auto; }
.hero-media img { width: 100%; height: 100%; object-fit: cover; }
#after-hero { position: relative; top: -1px; }

/* Phones only (the layout collapses at 767; tablets keep the desktop layout with a 30px gutter). */
@media (max-width: 767px) {
  .hero { padding-top: calc(var(--header-h) + 24px); min-height: 0; }
  .hero-caption { gap: 40px; }
  .hero-cols { grid-template-columns: 1fr; gap: 24px; }
  .hero-col:first-child { order: 2; }
  .hero-footer { grid-template-columns: auto 1fr; height: 80px; }
  .hero-footer > div:empty { display: none; }
  .hero-note:not(.hero-note-right) { display: none; }
  .hero-note-right { text-align: right; }
  .scroll-cue .shuffle { display: none; }
  .hero-project .hero-caption { min-height: 0; gap: 40px; padding-bottom: 32px; }
}

/* ---- showcase.css ---- */
/* Base: slides stack. JS pins the track and drives the dissolve. */
.showcase { position: relative; background: var(--dark); color: var(--white); }
.showcase-track { position: relative; }
.slide { position: relative; height: 100svh; min-height: 480px; overflow: hidden; background: var(--dark); }
.slide-link { position: absolute; inset: 0; display: block; color: var(--white); }
.slide-media { position: absolute; inset: 0; margin: 0; }
.slide-media .media-stack, .slide-media picture, .slide-media .img-placeholder { width: 100%; height: 100%; aspect-ratio: auto; }
.slide-media img { width: 100%; height: 100%; object-fit: cover; }
.slide-caption { position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 120px var(--gutter); text-align: center; pointer-events: none; }
.slide-title { position: relative; font-size: var(--title-size); line-height: 1; text-align: center; text-shadow: 0 2px 40px rgba(0,0,0,0.25); }
/* type on its own line, then tags and date in one centred row */
.slide-meta { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 4px 24px; max-width: 100%; }
.slide-meta .slide-type { flex: 0 0 100%; }
.slide-meta > :empty { display: none; }
.slide-placeholder .img-placeholder .mono { display: none; }

/* JS mode */
.js .showcase.is-ready { height: calc(var(--slides) * 100svh); }
.js .showcase.is-ready .showcase-track { position: sticky; top: 0; height: 100svh; overflow: hidden; }
.js .showcase.is-ready .slide { position: absolute; inset: 0; height: 100%; }
.js .showcase.is-ready .slide:not(.is-active):not(.is-next) { opacity: 0; pointer-events: none; }
.js .showcase.is-ready .slide.is-next { z-index: 1; }
.js .showcase.is-ready .slide.is-active { z-index: 2; }
.js .showcase.is-ready .slide.is-next .slide-caption { visibility: hidden; }
.showcase-fx { display: none; }
.showcase-canvas { position: absolute; inset: 0; z-index: 3; pointer-events: none; width: 100%; height: 100%; display: block; opacity: 0; }
.showcase-captions { position: absolute; inset: 0; z-index: 4; pointer-events: none; }
.showcase-captions .slide-caption { position: absolute; inset: 0; }
/* only the settled caption's title takes the pointer (click centres the slide, then opens it) */
.showcase-captions .slide-caption.is-active .slide-title { pointer-events: auto; cursor: pointer; }

.see-all { padding: 48px var(--gutter); text-align: center; }

/* ---- sections.css ---- */
.statement { padding: var(--vgutter) var(--gutter); }
.statement .h3, .project-intro .h3 { max-width: 28ch; }
/* .has-fill: the scroll fill is applied by fill.js at runtime (gradient sweep); nothing to undo here */

/* Giant words: each line is a flex row; JS grows the first (or middle) word boxes to spread the words
   to the column edges, so the first word sits flush left and the last flush right while spread */
.giant { padding: var(--vgutter) var(--gutter); overflow: hidden; }
.giant-line { position: relative; left: -0.04em; display: flex; justify-content: center; gap: 0.2em; font-size: var(--title-size); line-height: 1; white-space: nowrap; }
.giant-line li { display: flex; justify-content: center; }
.giant-line li:first-child { justify-content: flex-start; }
.giant-line li:last-child { justify-content: flex-end; }

/* Now */
.now { padding: 0 var(--gutter) var(--vgutter); }
.now-grid { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: var(--gap); }
.now-grid > :first-child { grid-column: span 2; }
.now-col { max-width: var(--measure); }
.now-grid-link { margin-top: 32px; }
.now-grid-link > :first-child { grid-column: span 2; }

/* Page nav (page variant): intro row, then the next title in the right half, one word per line.
   The link is an overlay on a wrapper that hugs the title; pagenav.js narrows it to the two
   visible letters while the rest of the title is hidden. */
.page-nav { position: relative; padding: var(--vgutter) var(--gutter) 0; border-top: 1px solid var(--ink-faded); }
.page-nav-intro { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: var(--gap); align-items: start; }
.page-nav-intro .page-nav-note { grid-column: 4; text-align: right; }
.page-nav-caption { display: block; margin-top: -0.2em; }
.page-nav:not(.page-nav-project) .page-nav-caption { padding-left: calc(50% + var(--gap) / 2); }
.page-nav-wrap { position: relative; display: inline-flex; max-width: 100%; }
.page-nav-inner { position: relative; display: block; }
.page-nav-link { position: absolute; top: 0; left: 0; z-index: 10; width: 100%; height: 100%; }
body.is-loading-page .page-nav-link { pointer-events: none; }
.next-title { display: block; font-size: var(--title-size); line-height: 1; letter-spacing: var(--title-ls); margin-left: -0.04em; }
.next-word { display: block; }
.next-title .cloned-char { display: inline-block; }

/* Page nav (project variant): a full-viewport preview of the next case study laid out like its
   hero, title centred above a viewport-tall image. On desktop the section is two viewports tall and
   pagenav.js pins the inner block for the second one while the image grows from half size; at the
   end of that the page advances by itself. With JavaScript off, or under reduced motion, it is one
   viewport with the full image and a plain link. */
.page-nav-project { height: 100svh; min-height: 480px; padding: 0; border-top: 0; overflow: hidden; }
.js:not(.reduce-motion) .page-nav-project { opacity: 0; }
.page-nav-project.is-pinned { height: 200svh; min-height: 960px; }
.page-nav-pin { position: relative; width: 100%; height: 100svh; min-height: 480px; }
.page-nav-project .page-nav-intro { position: absolute; top: var(--header-h); left: var(--gutter); right: var(--gutter); z-index: 2; }
.page-nav-project .page-nav-caption { position: relative; z-index: 2; display: flex; justify-content: center; text-align: center; padding: calc(var(--header-h) + 60px) var(--gutter) 120px; margin: 0; }
.page-nav-project .next-title { margin-left: 0; }
.next-subtitle { margin-top: 40px; }
.next-subtitle-word { display: inline-block; }
.no-js .next-subtitle, .reduce-motion .next-subtitle { display: none; }
.page-nav-project .next-media { position: relative; z-index: 1; height: 100svh; min-height: 480px; margin: 0; overflow: hidden; }
.next-media-inner { position: absolute; inset: 0; will-change: transform; }
.next-media picture, .next-media .img-placeholder { width: 100%; height: 100%; aspect-ratio: auto; }
.next-media img { width: 100%; height: 100%; object-fit: cover; }
.js:not(.reduce-motion) .page-nav-project .page-nav-link { pointer-events: none; }

/* About, contact */
.about-grid { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: var(--gap); padding: 0 var(--gutter); margin-bottom: var(--vgutter); }
.about-text p + p, .how-list li + li { margin-top: 20px; }
.about-text p { max-width: var(--measure); }
.history li { display: grid; grid-template-columns: 1fr 1fr auto; gap: var(--gap); padding: 14px 0; border-top: 1px solid var(--ink-faded); }
.history li:last-child { border-bottom: 1px solid var(--ink-faded); }
.history-years { text-align: right; white-space: nowrap; }
.how-list li + li { margin-top: 40px; }
.how-list h3 { margin-bottom: 10px; }
/* Contact: the contact rows sit a full vertical gutter below the hero footer */
.contact-block { padding-top: var(--vgutter); }
.contact-email { display: inline-block; text-transform: lowercase; word-break: break-all; }
.draft-note { opacity: 0.55; }

@media (max-width: 767px) {
  .now-grid, .page-nav-intro, .about-grid { grid-template-columns: minmax(0,1fr); }
  .now-grid > :first-child, .now-grid-link > :first-child { grid-column: auto; }
  .now-grid-link { grid-template-columns: 1fr; }
  .now-grid-link > :first-child { display: none; }
  .page-nav-intro .page-nav-note { grid-column: auto; text-align: left; }
  .page-nav:not(.page-nav-project) .page-nav-caption { padding-left: 0; margin-top: 40px; }
  .page-nav-project .page-nav-intro { display: flex; flex-wrap: wrap; gap: 4px var(--gap); }
  .page-nav-project .page-nav-caption { padding-top: calc(var(--header-h) + 64px); padding-bottom: 80px; }
  .history li { grid-template-columns: 1fr; gap: 4px; }
  .history-years { text-align: left; }
}

/* ---- project.css ---- */
.project-intro { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: var(--gap); padding: var(--vgutter) var(--gutter); }
.project-meta { display: flex; flex-direction: column; gap: 20px; }
.meta-item dt { opacity: 0.55; }
/* Image blocks stack 24px apart (the group gap); text and quotes carry their own vertical
   padding so a text block sits the full vertical gutter from its neighbours. */
.project-body { padding: 0 var(--gutter) var(--vgutter); display: flex; flex-direction: column; gap: var(--gap); }
.project-text { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: var(--gap); padding: calc(var(--vgutter) - var(--gap)) 0; }
.project-text:first-child, .project-quote:first-child { padding-top: 0; }
.project-text:last-child, .project-quote:last-child { padding-bottom: 0; }
.project-text-inner { grid-column: 2; max-width: var(--measure); min-width: 0; }
.project-heading { opacity: 0.55; margin-bottom: 12px; }
.project-text p + p { margin-top: 20px; }
.project-figure { position: relative; margin: 0; }
.project-figure.full { margin-left: calc(-1 * var(--gutter)); margin-right: calc(-1 * var(--gutter)); }
/* Captions are a small translucent label over the image's bottom right corner. */
.project-figure figcaption { position: absolute; right: 0; bottom: 0; z-index: 10; padding: 3px 12px; font-size: 10px; line-height: 20px; font-weight: 400; color: #fff; background: rgba(0, 0, 0, 0.3); }
.project-figure figcaption:empty { display: none; }
.project-row { display: grid; gap: var(--gap); }
.project-row.cols-2 { grid-template-columns: 1fr 1fr; }
.project-row.cols-3 { grid-template-columns: 1fr 1fr 1fr; }
.project-quote { padding: calc(var(--vgutter) - var(--gap)) var(--gutter); }

@media (max-width: 767px) {
  .project-intro, .project-text, .project-row.cols-2, .project-row.cols-3 { grid-template-columns: minmax(0,1fr); }
  .project-text-inner { grid-column: auto; }
}

/* ---- diagram.css ---- */
/* Diagram blocks in a case study body (build.js diagramBlock). A full-width figure between hairline
   rules. The horizontal SVG shows on desktop; tablets and phones get the vertical one, which sits in
   the text column on tablets. The SVG takes its colours from here: ink is currentColor, the
   contradiction flag is the accent, and knocked-out labels are cut from the page background. */
.project-diagram { margin: 0; padding: calc(var(--vgutter) - var(--gap)) 0; }
.project-diagram:first-child { padding-top: 0; }
.project-diagram:last-child { padding-bottom: 0; }
.dg-frame { border-top: 1px solid var(--ink-faded); border-bottom: 1px solid var(--ink-faded); padding: 48px 0; }
.dg-svg { width: 100%; height: auto; overflow: visible; color: var(--ink); }
.dg-v { display: none; }
.dg-caption { margin-top: 16px; margin-left: calc(50% + var(--gap) / 2); max-width: 36em; opacity: 0.55; }

.dg-svg text { font-family: var(--font-mono); font-weight: 500; letter-spacing: 0.02em; fill: currentColor; }
.dg-t { font-size: 15px; }
.dg-num { font-size: 12px; fill-opacity: 0.55; }
.dg-small { font-size: 12px; }
.dg-knock { fill: var(--bg); stroke: none; }
.dg-box, .dg-tag { fill: var(--bg); stroke: currentColor; stroke-width: 1; }
.dg-tag { stroke-opacity: 0.35; }
.dg-line, .dg-head, .dg-tick, .dg-flag-pole, .dg-link { fill: none; stroke: currentColor; stroke-width: 1; }
.dg-head { stroke-linejoin: miter; }
.dg-dash { stroke-dasharray: 4 4; }
.dg-tick { stroke-dasharray: 2 3; stroke-opacity: 0.55; }
.dg-flag { fill: var(--accent); }
.dg-note-flag .dg-tag { stroke: var(--accent); stroke-opacity: 1; }

@media (max-width: 1024px) {
  .dg-h { display: none; }
  /* Tablet: the vertical flow lines up with the text column. */
  .dg-v { display: block; width: 100%; margin: 0 0 0 calc(50% + var(--gap) / 2); max-width: calc(50% - var(--gap) / 2); }
  .dg-frame { padding: 40px 0; }
}
@media (max-width: 767px) {
  .dg-v { margin: 0 auto; max-width: 420px; }
  .dg-caption { margin-left: 0; }
  .dg-frame { padding: 32px 0; }
}

/* ---- work.css ---- */
/* Work grid: three 100:65 thumbs per row bleeding 12px past the
   gutter, 100px between rows, the caption overlaid bottom left. */
.work-grid-section { padding: var(--vgutter) var(--gutter) calc(2 * var(--vgutter) - var(--gap)); }
.work-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); column-gap: 24px; row-gap: 100px; padding-top: 80px; margin: 0 -12px; }
.work-item { position: relative; }
.work-link { display: block; position: relative; }
.work-media { position: relative; overflow: hidden; }
.work-media picture, .work-media .img-placeholder { aspect-ratio: 100 / 65; width: 100%; }
.work-media img { width: 100%; height: 100%; object-fit: cover; }
.work-media img, .work-media .img-placeholder { transform: scale(1); transition: transform 1s var(--ease-out); }
@media (hover: hover) and (pointer: fine) {
  .work-link:hover .work-media img, .work-link:focus-visible .work-media img, .work-link:hover .work-media .img-placeholder, .work-link:focus-visible .work-media .img-placeholder { transform: scale(1.025); }
}
.thumb-band { position: absolute; top: 0; left: 0; display: block; pointer-events: none; }
.work-caption { position: absolute; inset: 0; z-index: 10; display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-end; padding: 25px 30px; pointer-events: none; }
.work-caption .work-title, .work-caption .work-meta { display: block; line-height: 30px; overflow: hidden; }
.work-caption .work-meta > span { display: block; }
.work-small { padding: 0 var(--gutter) var(--vgutter); }
.work-small-head { margin-bottom: 24px; }
.small-list { display: grid; grid-template-columns: 1fr 1fr; gap: 40px var(--gap); }
.small-item p { margin: 10px 0; max-width: 36em; }
.small-item .work-meta { display: flex; justify-content: space-between; }
@media (max-width: 1024px) {
  .work-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .small-list { grid-template-columns: 1fr; }
}
@media (max-width: 767px) {
  .work-grid { column-gap: 16px; row-gap: 30px; margin: 0 -8px; }
}
@media (max-width: 479px) {
  .work-grid { grid-template-columns: minmax(0, 1fr); row-gap: 20px; margin: 0; }
}
.work-item.is-placeholder .work-caption, .work-item.is-dark .work-caption { color: var(--white); }

/* Work index hero: the caption is not full height, so the grid
   (and the filter panel) start inside the first viewport. */
.page-work .hero { min-height: 0; }
.page-work .hero-caption { gap: 120px; }
.work-caption .work-meta:has(> span:empty) { display: none; }

/* Hero footer controls. The centre and right cells line up like the plain notes on other pages. */
.hero-footer-center { display: flex; justify-content: center; }
.hero-footer-right { display: flex; justify-content: flex-end; }
.hero-btn { display: inline-flex; align-items: center; gap: 16px; height: 40px; }
.hero-btn-icon { display: inline-flex; width: 12px; height: 12px; }
.hero-btn-icon[hidden] { display: none; }
.hero-btn-icon svg { width: 100%; height: 100%; }
.filters-toggle { flex-direction: row; gap: 28px; }
.view-switch { display: flex; gap: 40px; }
.view-option { opacity: 0.2; transition: opacity 0.2s ease-in-out; }
.view-option[aria-pressed="true"] { opacity: 1; }
.view-switch:hover .view-option:not(:hover), .view-option:focus-visible { opacity: 1; }
.view-switch:hover .view-option:not(:hover):not([aria-pressed="true"]), .view-switch:has(.view-option[aria-pressed="false"]:hover) .view-option[aria-pressed="true"] { opacity: 0.2; }
.view-option:hover { opacity: 1; }
.js .work-nojs-note { display: none; }
.no-js .hero-btn, .no-js .view-switch, .no-js .work-filters { display: none; }

/* Filter panel: a band over the top of the grid in the page colour, fading out at the bottom.
   Closed it has no height and is inert; worklist.js opens it to its own height. */
.work-grid-section { position: relative; }
.work-filters { position: absolute; top: 0; left: 0; z-index: 20; width: 100%; height: 0; overflow: hidden; padding: 0; background: var(--bg); -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 50%, transparent 100%); mask-image: linear-gradient(to bottom, #000 0%, #000 50%, transparent 100%); opacity: 0; visibility: hidden; pointer-events: none; }
.work-filters.is-open { visibility: visible; pointer-events: auto; }
.work-filters-list { display: flex; flex-wrap: wrap; font-size: var(--h3-size); line-height: 1.1; letter-spacing: -0.02em; padding: 60px var(--gutter) 280px; }
.work-filters-list li { display: inline-flex; padding: 4px 0; }
.work-filters-list li::after { content: ','; opacity: 0.2; margin-right: 0.3em; }
.work-filters-list li:last-child::after { content: ''; }
.work-filters-list.is-animating li { overflow: hidden; }
.filter-option { display: block; text-transform: uppercase; line-height: inherit; opacity: 0.2; transition: opacity 0.15s ease-out; }
.filter-option[aria-pressed="true"], .filter-option:hover, .filter-option:focus-visible { opacity: 1; }
.filter-option:focus-visible { outline-offset: 2px; }
.work-item[hidden] { display: none; }

/* List view: one full-width row per project, title, tags and year in three columns, a line under
   each row running the full viewport width. The image becomes a 280px square that follows the
   pointer (worklist.js); without a fine pointer it stays hidden. */
.work-grid.is-list { display: block; row-gap: 0; margin: 0; }
.work-grid.is-list .work-item { border: 0; }
.work-grid.is-list .work-link { display: flex; align-items: center; min-height: 100px; padding: 20px 0; }
.work-grid.is-list .work-item::after { content: ''; position: absolute; left: 50%; bottom: 0; width: 100vw; height: 1px; background: currentColor; opacity: 0.15; transform: translateX(-50%); pointer-events: none; }
.work-grid.is-list .work-media { position: fixed; top: 0; left: 0; z-index: -1; width: 280px; height: 280px; opacity: 0; pointer-events: none; transform: translate3d(var(--fx, -999px), var(--fy, -999px), 0); }
.work-grid.is-list .work-media picture, .work-grid.is-list .work-media .img-placeholder { width: 100%; height: 100%; aspect-ratio: auto; }
.work-grid.is-list .work-media .img-placeholder .mono { display: none; }
.work-grid.is-list .work-caption { position: static; flex-direction: row; align-items: center; justify-content: space-between; gap: var(--gap); width: 100%; padding: 0; pointer-events: none; }
.work-grid.is-list .work-item .work-caption { color: inherit; }
.work-grid.is-list .work-caption > * { flex: 1 1 33.333%; min-width: 0; }
.work-grid.is-list .work-caption > :last-child { text-align: right; }
.work-grid.is-list .work-meta:has(> span:empty) { display: block; }
.work-grid.is-list .work-title { font-size: 30px; line-height: 33px; }
.work-grid.is-list .work-item.is-placeholder .work-caption { color: inherit; }
@media not all and (hover: hover) and (pointer: fine) { .work-grid.is-list .work-media { display: none; } }

@media (max-width: 767px) {
  .page-work .hero-caption { gap: 40px; }
  .view-switch, .page-work .hero-footer-right { display: none; }
  .page-work .hero-footer { grid-template-columns: auto 1fr; }
  .hero-footer-center { justify-content: flex-end; }
  .work-filters-list { padding: 40px var(--gutter) 200px; }
  .work-grid.is-list .work-title { font-size: 20px; line-height: 24px; }
  .work-grid.is-list .work-caption > .work-tags { display: none; }
}

/* ---- footer.css ---- */
.site-footer { padding: var(--vgutter) var(--gutter) var(--gutter); }
.footer-top { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); margin-bottom: 40px; }
.footer-block { display: flex; flex-direction: column; }
.footer-bottom { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap); }
.bar { display: flex; align-items: center; gap: 14px; height: 40px; padding: 0 24px; background: var(--ink); color: var(--white); }
.bar-link { justify-content: flex-end; }
.bar-link .arrow { margin-right: auto; }
@media (max-width: 767px) {
  .footer-top, .footer-bottom { grid-template-columns: 1fr; gap: 24px; }
  .footer-top { margin-bottom: 24px; }
}

/* ---- preloader.css ---- */
.preloader { position: fixed; inset: 0; z-index: 2000; color: var(--white); display: flex; align-items: center; justify-content: center; overflow: hidden; }
.no-js .preloader, .skip-preloader .preloader, .preloader.is-done { display: none; }
/* The black panel squashes from the top on exit; the glyphs live inside it so they squash with it. */
.preloader-panel { position: absolute; inset: 0; background: #000; transform-origin: top; transform: scaleX(1.01); will-change: transform; }
.preloader-ascii { position: absolute; inset: 0; font-family: var(--font-mono); font-size: 10.8px; line-height: 1; color: #3a3a3a; pointer-events: none; }
.preloader-ascii span { position: absolute; display: block; }
.preloader-captions { position: relative; display: grid; width: 100%; padding: 0 var(--gutter); font-size: var(--h1-size); line-height: 1.05; letter-spacing: -0.015em; text-align: center; }
.preloader-caption { grid-area: 1 / 1; align-self: center; opacity: 0; visibility: hidden; }
.preloader-count { position: absolute; left: 0; right: 0; bottom: var(--gutter); z-index: 10; display: flex; justify-content: center; height: 1em; line-height: 1em; overflow: hidden; }
.preloader-count .count-row { display: flex; height: 1em; line-height: 1em; }
.preloader-count .count-col, .preloader-count .count-col span { display: block; height: 1em; line-height: 1em; text-align: center; }
.preloader-count .count-col:first-child span:last-child { text-align: right; transform: translateX(15%); }

/* ---- cursor.css ---- */
/* Custom cursor. A small square in the accent colour trails the native pointer (the native pointer
   stays visible). States are classes on .cursor-ball, set from data-cursor on the hovered element.
   Shown only with a fine pointer at desktop widths; never under reduced motion (cursor.js). */
.cursor { position: fixed; top: 0; left: 0; z-index: 1500; pointer-events: none; display: none; }
@media (hover: hover) and (pointer: fine) and (min-width: 1025px) {
  .js:not(.reduce-motion) .cursor { display: block; }
}
.cursor-ball {
  position: absolute; top: 0; left: 0;
  width: 16px; height: 16px;
  border: 2px solid var(--accent); border-radius: 0;
  background: var(--accent); color: #999;
  display: flex; align-items: center; justify-content: center;
  white-space: nowrap; will-change: transform;
  transition-property: width, height, margin, border-radius, border-color, background-color, color, opacity;
  transition-duration: 0.2s;
  transition-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
.cursor-ball.is-hold { transition-duration: 0.3s; }
/* Icon and label sit centred on the ball, out of its layout, so they never push each other */
.cursor-icon, .cursor-text { position: absolute; top: 50%; left: 50%; opacity: 0; transform: translate(-50%, -50%) scale(0.5); transition: opacity 0.15s, transform 0.15s; color: currentColor; line-height: 1; }
.cursor-icon { display: block; width: 18px; height: 18px; }
.cursor-icon svg { width: 100%; height: 100%; }
.cursor-text { display: block; height: 40px; padding: 0 20px; font-size: 16px; font-weight: 500; line-height: 40px; text-align: center; }
.cursor-ball.is-small .cursor-text { height: 24px; padding: 0 10px; font-size: 12px; line-height: 24px; }

/* highlight: a soft grey disc over plain links (nav, footer, underline links) */
.cursor-ball.is-highlight { width: 70px; height: 70px; border-radius: 50%; border-color: #999; background: #999; opacity: 0.2; }
/* hide: over the logo and form fields */
.cursor-ball.is-hide { width: 10px; height: 10px; border-radius: 50%; border-color: transparent; background: transparent; opacity: 0; }
/* thumb: over showcase slides and work cards, a small dark rounded square with an arrow */
.cursor-ball.is-thumb { width: 40px; height: 40px; border-radius: 3px; border-color: transparent; background: #000; color: #fff; }
.cursor-ball.is-thumb.is-primary { background: var(--accent); color: #000; }
.cursor-ball.is-thumb .cursor-icon { opacity: 1; transform: translate(-50%, -50%) scale(1); transition-duration: 0.2s; }
/* text: a label pill (width set inline from the measured label) */
.cursor-ball.is-text { height: 40px; border-radius: 3px; border-color: transparent; background: var(--accent); color: #000; }
.cursor-ball.is-text.is-small { height: 24px; }
.cursor-ball.is-text.is-blur { -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px); }
.cursor-ball.is-text .cursor-text { opacity: 1; transform: translate(-50%, -50%) scale(1); transition-duration: 0.2s; }
/* outline: held over a button icon while the follow motion is paused (size and colour set inline) */
.cursor-ball.is-outline { background: transparent; }
/* loader: while a page transition is in flight */
.cursor-ball.is-loader { width: 40px; height: 40px; border-radius: 40px; border-color: #999; color: #999; background: transparent; opacity: 1; transition-delay: 0.05s; }
.cursor-ball.is-loader::after {
  content: ''; position: absolute; top: 50%; left: 50%;
  width: calc(100% + 12px); height: calc(100% + 12px);
  border: 2px solid transparent; border-bottom-color: currentColor; border-radius: 50%;
  transform: translate(-50%, -50%) rotate(0deg);
  animation: cursor-rotating 0.8s ease-in-out infinite, cursor-fade-in 0.2s ease-in-out;
}
@keyframes cursor-rotating {
  0% { transform: translate(-50%, -50%) rotate(0deg); }
  95% { transform: translate(-50%, -50%) rotate(350deg); }
  100% { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes cursor-fade-in { from { opacity: 0; } to { opacity: 1; } }

/* ---- motion.css ---- */
/* Initial states for JS-driven reveals. Only applied when JS is on and motion is allowed. */
.js:not(.reduce-motion) [data-split]:not(.is-ready) { opacity: 0; }
.js:not(.reduce-motion) .site-main:not(.is-in) > #after-hero ~ *:not(.page-nav-project) { opacity: 0; }
.js:not(.reduce-motion) [data-reveal]:not(.is-in) { opacity: 0; }
.js:not(.reduce-motion) [data-thumb]:not(.is-in) picture, .js:not(.reduce-motion) [data-thumb]:not(.is-in) .img-placeholder { clip-path: inset(0 0 100% 0); }
.js:not(.reduce-motion) .next-title .char { opacity: 0; }
.js:not(.reduce-motion) [data-parallax] img { will-change: transform; }
.cap-line { display: block; }

/* Page transition states */
.site-main.is-leaving { pointer-events: none; }
.transition-frame { position: fixed; z-index: 950; overflow: hidden; background: var(--dark); pointer-events: none; }
.transition-frame img, .transition-frame picture, .transition-frame .img-placeholder { width: 100%; height: 100%; object-fit: cover; aspect-ratio: auto; }
.transition-cover { position: fixed; inset: 0; z-index: 900; pointer-events: none; }
.transition-cover canvas { display: block; width: 100%; height: 100%; }
.transition-stage { position: fixed; inset: 0; z-index: 700; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 80px; pointer-events: none; }
.transition-stage.is-centred { text-align: center; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; transition-duration: 0.001ms !important; scroll-behavior: auto !important; }
}

