/* ============================================
   PORTFOLIO — Visual Designer
   Style System
   ============================================ */

/* --- 0. Custom Properties --- */
:root {
  --color-bg: #FFFFFF;
  --color-bg-alt: #FFFFFF;
  --color-surface: #FFFFFF;
  --color-text: #1A1A1A;
  --color-text-secondary: #575C70;
  --color-text-light: #6C7185;
  --color-border: #DEE2F2;
  --color-inverse: #F8F9FF;
  --color-inverse-muted: rgba(248, 249, 255, 0.55);

  --font-display: var(--font-body);
  --font-body: 'Inter', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', 'Heiti SC', sans-serif;

  --space-2xs: 0.25rem;
  --space-xs: 0.5rem;
  --space-sm: 1rem;
  --space-md: 2rem;
  --space-lg: 4rem;
  --space-xl: 6rem;
  --space-2xl: 10rem;

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --duration-fast: 0.3s;
  --duration-normal: 0.6s;
  --duration-slow: 1s;
  --duration-slower: 1.4s;

  --nav-height: 72px;
  --max-width: 1360px;
  --radius: 4px;

  --ease-curtain: cubic-bezier(0.76, 0, 0.24, 1);
  --color-accent: #4C5DFA;
  --color-accent-strong: #3949D8;
  --menu-accent: var(--color-accent);
}

/* --- 1. Reset & Base --- */
*, *::before, *::after {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html {
  font-size: 16px;
  scrollbar-gutter: stable;
  scroll-behavior: smooth;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

body {
  font-family: var(--font-body);
  font-weight: 400;
  line-height: 1.6;
  color: var(--color-text);
  background-color: var(--color-bg);
  overflow-x: hidden;
}

a {
  color: inherit;
  text-decoration: none;
}

ul, ol { list-style: none; }
img, svg { display: block; max-width: 100%; }
button { font: inherit; color: inherit; cursor: pointer; border: none; background: none; }
fieldset { border: 0; min-width: 0; }
[hidden] { display: none !important; }

::selection {
  background: var(--color-text);
  color: var(--color-bg);
}

:focus-visible {
  outline: 2px solid var(--color-text);
  outline-offset: 3px;
  border-radius: 2px;
}

.skip-link {
  position: fixed;
  top: var(--space-xs);
  left: var(--space-xs);
  z-index: 2000;
  padding: var(--space-xs) var(--space-sm);
  background: var(--color-text);
  color: var(--color-bg);
  font-size: 0.875rem;
  border-radius: var(--radius);
  transform: translateY(-200%);
  transition: transform var(--duration-fast) var(--ease-out);
}

.skip-link:focus { transform: translateY(0); }

/* --- 2. Typography --- */
h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 400;
  line-height: 1.15;
}

h1 { font-size: clamp(2.5rem, 6vw, 5.5rem); }
h2 { font-size: clamp(2rem, 4vw, 3.5rem); }
h3 { font-size: clamp(1.5rem, 2.5vw, 2rem); }
h4 { font-size: clamp(1.125rem, 1.5vw, 1.5rem); }

p {
  font-size: 1rem;
  line-height: 1.75;
  color: var(--color-text-secondary);
}

.text-large {
  font-size: clamp(1.125rem, 1.8vw, 1.375rem);
  line-height: 1.65;
}

.text-small {
  font-size: 0.875rem;
  letter-spacing: 0.02em;
}

.text-label {
  font-family: var(--font-body);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  color: var(--color-text-light);
}

/* Chinese has no true italic; emphasis is carried by weight instead of a faux slant. */
em {
  font-style: normal;
  font-weight: 900;
}

/* Line-mask headline: each .line clips its inner span, which slides up on load */
.line {
  display: block;
  overflow: hidden;
  padding-bottom: 0.08em;
  margin-bottom: -0.08em;
}

.line > span {
  display: block;
}

/* --- 3. Layout --- */
.container {
  width: 100%;
  max-width: var(--max-width);
  margin: 0 auto;
  padding: 0 var(--space-lg);
}

.section {
  padding: var(--space-2xl) 0;
}

.section--compact {
  padding: var(--space-xl) 0;
}

.section--bordered {
  border-top: 1px solid var(--color-border);
}

/* --- 4. Navigation --- */
.nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: var(--nav-height);
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 var(--space-lg);
  z-index: 1000;
  view-transition-name: site-nav;
  transition: background-color var(--duration-fast) ease,
              box-shadow var(--duration-fast) ease,
              transform var(--duration-normal) var(--ease-out);
}

.nav--scrolled {
  background-color: rgba(255, 255, 255, 0.92);
  backdrop-filter: blur(20px);
  -webkit-backdrop-filter: blur(20px);
  box-shadow: 0 1px 0 var(--color-border);
}

.nav--hidden {
  transform: translateY(-100%);
}

.nav--menu-open {
  transform: none;
}

/* Kept on until the dark curtain has cleared the top of the screen */
.nav--on-dark {
  background-color: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  box-shadow: none;
}

.scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 2px;
  background: var(--color-text);
  z-index: 1002;
  transform: scaleX(0);
  transform-origin: left;
  pointer-events: none;
}

.nav__logo {
  font-family: var(--font-body);
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  position: relative;
  z-index: 1010;
  transition: color var(--duration-fast) ease;
}

.nav--on-dark .nav__logo {
  color: var(--color-inverse);
  transition-delay: 0.2s;
}

.nav__meta {
  display: flex;
  align-items: center;
  gap: var(--space-md);
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  color: var(--color-text-secondary);
  transition: opacity var(--duration-fast) ease;
}

.nav--on-dark .nav__meta {
  opacity: 0;
  pointer-events: none;
}

.nav__time {
  font-variant-numeric: tabular-nums;
  color: var(--color-text-light);
}

.nav__status {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--color-text);
  font-weight: 500;
}

.status-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #10B981;
  position: relative;
}

.status-dot::after {
  content: '';
  position: absolute;
  inset: -2px;
  border-radius: 50%;
  border: 1px solid #10B981;
  animation: pulseDot 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

@keyframes pulseDot {
  0% { transform: scale(1); opacity: 1; }
  100% { transform: scale(2.2); opacity: 0; }
}

.nav__menu-btn {
  position: relative;
  z-index: 1010;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  height: 44px;
  padding: 0 0 0 var(--space-xs);
  margin-right: -4px;
  color: var(--color-text);
  transition: color var(--duration-fast) ease;
}

.nav--on-dark .nav__menu-btn {
  color: var(--color-inverse);
  transition-delay: 0.2s;
}

/* Both words stacked in a one-line mask; opening slides to the second */
.nav__menu-label {
  display: block;
  height: 1.25em;
  overflow: hidden;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  line-height: 1.25;
}

.nav__menu-label span {
  display: block;
  transition: transform var(--duration-normal) var(--ease-out);
}

.nav--menu-open .nav__menu-label span {
  transform: translateY(-100%);
}

.nav__menu-icon {
  position: relative;
  width: 28px;
  height: 12px;
}

.nav__menu-icon span {
  position: absolute;
  left: 0;
  top: calc(50% - 0.75px);
  width: 100%;
  height: 1.5px;
  background: currentColor;
  transition: transform var(--duration-normal) var(--ease-out);
}

.nav__menu-icon span:nth-child(1) { transform: translateY(-5px); }
.nav__menu-icon span:nth-child(2) { transform: translateY(5px); }

.nav__menu-btn:hover .nav__menu-icon span:nth-child(1) { transform: translateY(-5px) scaleX(0.6); }

.nav--menu-open .nav__menu-icon span:nth-child(1),
.nav--menu-open .nav__menu-btn:hover .nav__menu-icon span:nth-child(1) { transform: rotate(45deg); }
.nav--menu-open .nav__menu-icon span:nth-child(2) { transform: rotate(-45deg); }

.nav--on-dark :focus-visible { outline-color: var(--color-inverse); }

/* --- 5. Full-screen Menu --- */
/* Sits under the nav (z 1000) so the logo and close button stay on top. */
.menu-overlay {
  position: fixed;
  inset: 0;
  z-index: 990;
  visibility: hidden;
  color: var(--color-inverse);
}

.menu-overlay.is-open,
.menu-overlay.is-closing {
  visibility: visible;
}

.menu-overlay :focus-visible { outline-color: var(--color-inverse); }

.menu-overlay p { color: inherit; }

/* Two blue curtains: the darker one leads on open and trails on close */
.menu-overlay__bg {
  position: absolute;
  inset: 0;
  background: var(--color-accent);
  clip-path: inset(0 0 100% 0);
}

.menu-overlay__bg--accent {
  background: var(--color-accent-strong);
}

.menu-overlay.is-open .menu-overlay__bg {
  clip-path: inset(0 0 0 0);
  transition: clip-path 0.85s var(--ease-curtain) 0.08s;
}

.menu-overlay.is-open .menu-overlay__bg--accent { transition-delay: 0s; }

.menu-overlay.is-closing .menu-overlay__bg {
  transition: clip-path 0.7s var(--ease-curtain) 0.22s;
}

.menu-overlay.is-closing .menu-overlay__bg--accent { transition-delay: 0.32s; }

.menu-overlay__inner {
  position: relative;
  z-index: 1;
  height: 100%;
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  grid-template-rows: 1fr auto;
  column-gap: var(--space-xl);
  padding: calc(var(--nav-height) + var(--space-sm)) var(--space-lg) var(--space-md);
  overflow-y: auto;
  overscroll-behavior: contain;
}

.menu-overlay__nav {
  align-self: center;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  padding: var(--space-md) 0;
}

.menu-overlay__link {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: var(--space-xs);
  padding: 0.06em 0;
  font-family: var(--font-display);
  font-size: clamp(2.75rem, min(8vw, 11vh), 6.5rem);
  line-height: 1.1;
  transition: opacity var(--duration-fast) ease,
              transform var(--duration-normal) var(--ease-out);
}

/* Right padding leaves room for the current-page dot so every description lines up */
.menu-overlay__link-mask {
  display: block;
  overflow: hidden;
  padding: 0.04em 0.3em 0.1em 0;
  margin: -0.04em 0 -0.1em;
}

.menu-overlay__link-text {
  display: block;
  position: relative;
  transform: translateY(110%);
}

.menu-overlay.is-open .menu-overlay__link-text {
  transform: none;
  transition: transform 0.95s var(--ease-out);
  transition-delay: calc(0.42s + var(--i, 0) * 0.07s);
}

.menu-overlay.is-closing .menu-overlay__link-text {
  transform: translateY(-110%);
  transition: transform 0.45s cubic-bezier(0.7, 0, 0.84, 0);
  transition-delay: calc(var(--i, 0) * 0.03s);
}

/* Current page: a small dot in the blue curtain tone */
.menu-overlay__link.active .menu-overlay__link-text::after {
  content: '';
  position: absolute;
  top: 0.2em;
  right: -0.22em;
  width: 0.12em;
  height: 0.12em;
  border-radius: 50%;
  background: var(--menu-accent);
}

.menu-overlay__link-desc {
  font-family: var(--font-body);
  font-size: 0.875rem;
  letter-spacing: 0.02em;
  line-height: 1.5;
  color: var(--color-inverse-muted);
  opacity: 0;
  transform: translateX(-8px);
}

.menu-overlay.is-open .menu-overlay__link-desc {
  opacity: 1;
  transform: none;
  transition: opacity 0.6s ease, transform 0.8s var(--ease-out);
  transition-delay: calc(0.7s + var(--i, 0) * 0.07s);
}

.menu-overlay.is-closing .menu-overlay__link-desc {
  transition: opacity 0.2s ease;
}

@media (hover: hover) {
  .menu-overlay__nav:hover .menu-overlay__link:not(:hover) { opacity: 0.32; }
  .menu-overlay__link:hover { transform: translateX(0.12em); }
}

/* Preview of the page behind the hovered link */
.menu-overlay__preview {
  align-self: center;
  position: relative;
  height: min(58vh, 560px);
  aspect-ratio: 4 / 5;
  border-radius: var(--radius);
  overflow: hidden;
  clip-path: inset(100% 0 0 0);
}

.menu-overlay.is-open .menu-overlay__preview {
  clip-path: inset(0);
  transition: clip-path 1.1s var(--ease-curtain) 0.45s;
}

.menu-overlay.is-closing .menu-overlay__preview {
  clip-path: inset(0 0 100% 0);
  transition: clip-path 0.5s var(--ease-curtain);
}

.menu-overlay__preview-item {
  position: absolute;
  inset: 0;
  opacity: 0;
  transform: scale(1.08);
  transition: opacity 0.5s ease, transform 1.2s var(--ease-out);
}

.menu-overlay__preview-item.is-active {
  opacity: 1;
  transform: none;
}

.menu-overlay__preview-item .placeholder {
  position: absolute;
  inset: 0;
  min-height: 0;
}

/* Works preview flips through the case studies */
.menu-overlay__preview-cycle > .placeholder {
  opacity: 0;
  animation: menuCycle 3.6s linear infinite paused;
}

.menu-overlay__preview-cycle > .placeholder:first-child { opacity: 1; }
.menu-overlay__preview-cycle > .placeholder:nth-child(2) { animation-delay: 1.2s; }
.menu-overlay__preview-cycle > .placeholder:nth-child(3) { animation-delay: 2.4s; }

.menu-overlay__preview-cycle.is-active > .placeholder { animation-play-state: running; }

@keyframes menuCycle {
  0%, 33.32% { opacity: 1; }
  33.33%, 100% { opacity: 0; }
}

.menu-overlay__info {
  grid-column: 1 / -1;
  position: relative;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--space-sm) var(--space-md);
  padding-top: var(--space-md);
}

.menu-overlay__info::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: rgba(248, 249, 255, 0.18);
  transform: scaleX(0);
  transform-origin: left;
}

.menu-overlay.is-open .menu-overlay__info::before {
  transform: none;
  transition: transform 1.2s var(--ease-out) 0.55s;
}

.menu-overlay.is-closing .menu-overlay__info::before {
  transform-origin: right;
  transition: transform 0.4s ease-in;
}

.menu-overlay__info-col {
  opacity: 0;
  transform: translateY(12px);
}

.menu-overlay.is-open .menu-overlay__info-col {
  opacity: 1;
  transform: none;
  transition: opacity 0.6s ease, transform 0.8s var(--ease-out);
  transition-delay: calc(0.8s + var(--i, 0) * 0.06s);
}

.menu-overlay.is-closing .menu-overlay__info-col {
  transition: opacity 0.2s ease;
}

.menu-overlay .menu-overlay__info-label {
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  margin-bottom: 6px;
  color: var(--color-inverse-muted);
}

.menu-overlay__info-label [data-time] {
  font-variant-numeric: tabular-nums;
}

.menu-overlay__info a,
.menu-overlay__status {
  font-size: 0.9375rem;
  line-height: 1.6;
}

.menu-overlay__info a {
  background: linear-gradient(currentColor, currentColor) left bottom / 0% 1px no-repeat;
  transition: background-size var(--duration-normal) var(--ease-out);
}

.menu-overlay__info a:hover { background-size: 100% 1px; }

.menu-overlay__status {
  display: flex;
  align-items: center;
  gap: 8px;
}

.menu-overlay__social {
  display: flex;
  flex-wrap: wrap;
  gap: 4px var(--space-sm);
}

body.menu-open { overflow: hidden; }

/* --- 6. Hero (Homepage) --- */
.hero {
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  align-items: center;
  position: relative;
  padding-top: var(--nav-height);
  overflow: hidden;
}

.hero__content {
  position: relative;
  z-index: 2;
  padding: var(--space-lg);
  max-width: 65%;
}

.hero__title {
  margin-bottom: var(--space-md);
}

.hero__subtitle {
  font-size: 1rem;
  color: var(--color-text-secondary);
  letter-spacing: 0.02em;
}

.hero__scroll-hint {
  position: absolute;
  bottom: var(--space-lg);
  left: var(--space-lg);
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  color: var(--color-text-light);
  z-index: 2;
}

.hero__scroll-line {
  width: 40px;
  height: 1px;
  background: var(--color-text-light);
  transform-origin: left;
  animation: scrollHint 2s ease-in-out infinite;
}

@keyframes scrollHint {
  0%, 100% { transform: scaleX(1); }
  50% { transform: scaleX(0.5); }
}

.hero__geo {
  position: absolute;
  top: 50%;
  right: 5%;
  width: 45vw;
  height: 45vw;
  max-width: 600px;
  max-height: 600px;
  z-index: 1;
  opacity: var(--geo-opacity, 0.55);
  transform: translateY(calc(-50% + var(--scroll-y, 0px)));
}

.hero__geo-shape {
  position: absolute;
  border-radius: 50%;
  will-change: transform, translate;
}

.hero__geo-shape:nth-child(1) {
  width: 65%;
  height: 65%;
  background: var(--color-accent);
  top: 5%;
  right: 0;
  animation: geoFloat1 8s ease-in-out infinite;
}

.hero__geo-shape:nth-child(2) {
  width: 45%;
  height: 45%;
  background: #99A5FF;
  bottom: 10%;
  left: 5%;
  animation: geoFloat2 10s ease-in-out infinite;
}

.hero__geo-shape:nth-child(3) {
  width: 30%;
  height: 30%;
  background: #3648DB;
  top: 40%;
  left: 25%;
  border-radius: 4px;
  transform: rotate(15deg);
  animation: geoFloat3 12s ease-in-out infinite;
}

.hero__geo-shape:nth-child(4) {
  width: 18%;
  height: 18%;
  border: 2px solid var(--color-accent);
  background: transparent;
  top: 15%;
  left: 15%;
  animation: geoFloat4 9s ease-in-out infinite;
}

@keyframes geoFloat1 {
  0%, 100% { transform: translate(0, 0); }
  50% { transform: translate(-15px, 20px); }
}
@keyframes geoFloat2 {
  0%, 100% { transform: translate(0, 0); }
  50% { transform: translate(20px, -15px); }
}
@keyframes geoFloat3 {
  0%, 100% { transform: translate(0, 0) rotate(15deg); }
  50% { transform: translate(-10px, -20px) rotate(25deg); }
}
@keyframes geoFloat4 {
  0%, 100% { transform: translate(0, 0) scale(1); }
  50% { transform: translate(10px, 10px) scale(1.1); }
}

/* --- 7. Inner Page Heroes --- */
.page-hero {
  padding-top: calc(var(--nav-height) + var(--space-2xl));
  padding-bottom: var(--space-xl);
}

.page-hero .text-large {
  max-width: 560px;
  margin-top: var(--space-md);
}

.about-hero__intro {
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 3vw, 2.5rem);
  line-height: 1.45;
  max-width: 820px;
  color: var(--color-text);
}

/* --- 8. Section Headers --- */
.section-label {
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  color: var(--color-text-light);
  margin-bottom: var(--space-sm);
}

.section-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: var(--space-md);
  margin-bottom: var(--space-md);
}

.section-head h2 {
  font-size: clamp(1.75rem, 3vw, 2.5rem);
}

.section-intro {
  max-width: 560px;
  margin-top: var(--space-sm);
}

.section-cta {
  margin-top: var(--space-lg);
}

.text-link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  padding-bottom: 2px;
  background: linear-gradient(currentColor, currentColor) left bottom / 100% 1px no-repeat;
  transition: background-size var(--duration-normal) var(--ease-out);
  white-space: nowrap;
}

.text-link:hover {
  background-size: 30% 1px;
}

/* --- 9. Project Cards --- */
.project-card {
  display: block;
  position: relative;
}

.project-card__image {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 10;
  overflow: hidden;
  border-radius: var(--radius);
  view-transition-class: cover;
}

.project-card__image > .placeholder {
  position: absolute;
  inset: 0;
  min-height: 0;
  transition: transform var(--duration-slow) var(--ease-out);
}

.project-card:hover .project-card__image > .placeholder {
  transform: scale(1.04);
}

.project-card .placeholder span {
  transition: translate var(--duration-slow) var(--ease-out);
}

.project-card:hover .placeholder span:nth-child(1) { translate: -10px 6px; }
.project-card:hover .placeholder span:nth-child(2) { translate: 12px -8px; }
.project-card:hover .placeholder span:nth-child(3) { translate: -6px -12px; }

.project-card__info {
  padding: var(--space-sm) 0;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-sm);
}

.project-card__title-wrap {
  display: flex;
  align-items: baseline;
  gap: var(--space-sm);
}

.project-card__num {
  font-size: 0.75rem;
  letter-spacing: 0.1em;
  color: var(--color-text-light);
  font-variant-numeric: tabular-nums;
}

.project-card__title {
  font-family: var(--font-display);
  font-size: 1.25rem;
}

.project-card__meta-right {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  flex-shrink: 0;
}

.project-card__category,
.project-card__year {
  font-size: 0.8rem;
  color: var(--color-text-light);
  letter-spacing: 0.04em;
}

.project-card__year { font-variant-numeric: tabular-nums; }

.project-card__arrow {
  font-size: 1rem;
  color: var(--color-text-light);
  transition: transform var(--duration-fast) var(--ease-out), color var(--duration-fast) ease;
}

.project-card:hover .project-card__arrow,
.project-card:focus-visible .project-card__arrow {
  transform: translateX(4px);
  color: var(--color-text);
}

/* Unpublished case studies: visible in the archive but not clickable */
.project-card--soon .project-card__image > .placeholder {
  filter: saturate(0.35);
  opacity: 0.75;
}

.project-card--soon:hover .project-card__image > .placeholder { transform: none; }
.project-card--soon:hover .placeholder span { translate: none; }

.project-card__badge {
  position: absolute;
  top: var(--space-sm);
  left: var(--space-sm);
  z-index: 1;
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--color-surface);
  color: var(--color-text-secondary);
}

/* --- 10. Featured Works (Homepage) --- */
.featured__grid {
  display: grid;
  gap: var(--space-md);
}

@media (min-width: 769px) {
  .featured__grid {
    grid-template-columns: 1fr 1fr;
  }
  .featured__grid .project-card:first-child {
    grid-column: 1 / -1;
  }
  .featured__grid .project-card:first-child .project-card__image {
    aspect-ratio: 21 / 10;
  }
}

/* --- 11. Services (Homepage) --- */
.services__list {
  border-top: 1px solid var(--color-text);
}

.service {
  display: grid;
  grid-template-columns: 1fr 1.3fr 1fr;
  gap: var(--space-md);
  padding: var(--space-lg) 0;
  border-bottom: 1px solid var(--color-border);
}

.service__title {
  font-size: clamp(1.75rem, 3vw, 2.5rem);
}

.service__desc {
  max-width: 46ch;
}

.service__desc .text-link {
  margin-top: var(--space-sm);
}

.service__deliverables li {
  font-size: 0.9375rem;
  color: var(--color-text-secondary);
  padding: 6px 0;
  border-bottom: 1px solid var(--color-border);
}

.service__deliverables li:last-child { border-bottom: 0; }

/* --- About Teaser (Homepage) --- */
.about-teaser__content {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-2xl);
  align-items: center;
}

.about-teaser__text .text-large {
  margin: var(--space-md) 0;
}

.about-teaser__geo {
  position: relative;
  aspect-ratio: 1;
  width: 100%;
  max-width: 400px;
  margin-left: auto;
}

.about-teaser__geo .placeholder {
  position: absolute;
  inset: 0;
  border-radius: var(--radius);
}

/* --- 12. Works Page --- */
.works-filter {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs);
  margin-bottom: var(--space-lg);
}

.works-filter__btn {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  font-size: 0.875rem;
  padding: 8px 16px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  color: var(--color-text-secondary);
  transition: background-color var(--duration-fast) ease,
              color var(--duration-fast) ease,
              border-color var(--duration-fast) ease;
}

.works-filter__btn:hover {
  border-color: var(--color-text);
  color: var(--color-text);
}

.works-filter__btn[aria-pressed="true"] {
  background: var(--color-text);
  border-color: var(--color-text);
  color: var(--color-bg);
}

.works-filter__count {
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
  opacity: 0.6;
}

.works-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--space-lg) var(--space-md);
  padding-bottom: var(--space-2xl);
}

.works-grid .project-card__image {
  aspect-ratio: 4 / 3;
}

/* --- 13. Work Detail Page --- */
.work-detail__back {
  display: inline-flex;
  align-items: center;
  gap: var(--space-xs);
  font-size: 0.875rem;
  color: var(--color-text-secondary);
  margin-bottom: var(--space-md);
  transition: color var(--duration-fast) ease, gap var(--duration-fast) var(--ease-out);
}

.work-detail__back:hover {
  color: var(--color-text);
  gap: var(--space-sm);
}

.work-detail__hero {
  padding-top: calc(var(--nav-height) + var(--space-xl));
  padding-bottom: var(--space-lg);
}

.work-detail__meta {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr 1fr;
  gap: var(--space-md);
  margin-top: var(--space-lg);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border);
}

.work-detail__meta-item .text-label {
  margin-bottom: var(--space-xs);
}

.work-detail__cover {
  width: 100%;
  margin-bottom: var(--space-xl);
  overflow: hidden;
  view-transition-class: cover;
}

.work-detail__cover .placeholder {
  aspect-ratio: 21 / 9;
  will-change: transform;
}

.work-detail__body {
  max-width: 720px;
  margin: 0 auto;
  padding: 0 var(--space-lg);
}

.work-detail__body h3 {
  margin-top: var(--space-xl);
  margin-bottom: var(--space-sm);
}

.work-detail__body p {
  margin-bottom: var(--space-md);
  font-size: 1.0625rem;
  line-height: 1.85;
}

.work-detail__images {
  display: grid;
  gap: var(--space-md);
  margin: var(--space-xl) 0;
}

.work-detail__images--two {
  grid-template-columns: 1fr 1fr;
}

.work-detail__images .placeholder {
  aspect-ratio: 4 / 3;
  border-radius: var(--radius);
}

.work-detail__full-image {
  margin: var(--space-xl) 0;
}

.work-detail__full-image .placeholder {
  aspect-ratio: 16 / 9;
}

.project-nav {
  display: grid;
  grid-template-columns: 1fr 1fr;
  border-top: 1px solid var(--color-border);
  border-bottom: 1px solid var(--color-border);
  margin-top: var(--space-2xl);
}

.project-nav__item {
  display: block;
  padding: var(--space-lg);
  transition: background-color var(--duration-fast) ease;
}

.project-nav__item:hover {
  background-color: var(--color-bg-alt);
}

.project-nav__item:last-child {
  text-align: right;
  border-left: 1px solid var(--color-border);
}

.project-nav__label {
  display: block;
  margin-bottom: var(--space-xs);
}

.project-nav__title {
  display: inline-block;
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 2.2vw, 1.75rem);
  transition: transform var(--duration-normal) var(--ease-out);
}

.project-nav__item:first-child:hover .project-nav__title { transform: translateX(-8px); }
.project-nav__item:last-child:hover .project-nav__title { transform: translateX(8px); }

/* --- 14. About Page --- */
.about-content {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-2xl);
  padding-bottom: var(--space-2xl);
}

.about-photo {
  position: sticky;
  top: calc(var(--nav-height) + var(--space-md));
  align-self: start;
}

.about-photo .placeholder {
  aspect-ratio: 3 / 4;
  border-radius: var(--radius);
}

.about-bio h2 {
  font-size: clamp(1.5rem, 2.5vw, 2rem);
  margin-bottom: var(--space-sm);
  margin-top: var(--space-xl);
}

.about-bio h2:first-child { margin-top: 0; }

.about-bio p { margin-bottom: var(--space-sm); }

.skills-list {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs) var(--space-md);
  margin-top: var(--space-sm);
}

.skills-list li {
  font-size: 0.9375rem;
  color: var(--color-text-secondary);
  padding: var(--space-xs) 0;
  border-bottom: 1px solid var(--color-border);
}

.timeline {
  margin-top: var(--space-sm);
  border-top: 1px solid var(--color-border);
}

.timeline li {
  display: grid;
  grid-template-columns: 8.5rem 1fr;
  gap: var(--space-sm);
  padding: var(--space-sm) 0;
  border-bottom: 1px solid var(--color-border);
}

.timeline__year {
  font-size: 0.875rem;
  font-variant-numeric: tabular-nums;
  color: var(--color-text-light);
  padding-top: 2px;
}

.timeline__role {
  color: var(--color-text);
  font-weight: 500;
}

.timeline__org {
  display: block;
  font-size: 0.9375rem;
  color: var(--color-text-secondary);
}

.clients-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-xs) var(--space-lg);
  margin-top: var(--space-sm);
}

.clients-grid li {
  font-size: 0.9375rem;
  color: var(--color-text-secondary);
  padding: var(--space-xs) 0;
}

.process {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-md);
  margin-top: var(--space-lg);
}

.process__step {
  border-top: 1px solid var(--color-text);
  padding-top: var(--space-sm);
}

.process__num {
  display: block;
  font-size: 0.8125rem;
  font-variant-numeric: tabular-nums;
  color: var(--color-text-light);
  margin-bottom: var(--space-md);
}

.process__step h3 {
  font-size: 1.375rem;
  margin-bottom: var(--space-xs);
}

.process__step p {
  font-size: 0.9375rem;
  line-height: 1.7;
}

.process__time {
  display: block;
  margin-top: var(--space-sm);
  font-size: 0.8125rem;
  color: var(--color-text-light);
}

/* --- 15. Contact Page --- */
.contact-content {
  display: grid;
  grid-template-columns: 1fr 1.2fr;
  gap: var(--space-2xl);
  padding-bottom: var(--space-2xl);
}

.contact-info h2 {
  font-size: 1.25rem;
  margin-bottom: var(--space-xs);
  margin-top: var(--space-lg);
}

.contact-info h2:first-child { margin-top: 0; }

.contact-info p { margin-bottom: var(--space-xs); }

.contact-email {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-sm);
}

.contact-email a {
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 2vw, 1.625rem);
  color: var(--color-text);
  border-bottom: 1px solid var(--color-border);
  transition: border-color var(--duration-fast) ease;
}

.contact-email a:hover { border-color: var(--color-text); }

.copy-btn {
  font-size: 0.8125rem;
  padding: 6px 14px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  color: var(--color-text-secondary);
  transition: border-color var(--duration-fast) ease, color var(--duration-fast) ease,
              background-color var(--duration-fast) ease;
}

.copy-btn:hover {
  border-color: var(--color-text);
  color: var(--color-text);
}

.copy-btn.is-done {
  background: var(--color-text);
  border-color: var(--color-text);
  color: var(--color-bg);
}

.social-links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs) var(--space-md);
  margin-top: var(--space-xs);
}

.social-links a {
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  padding-bottom: 2px;
  background: linear-gradient(currentColor, currentColor) left bottom / 0% 1px no-repeat;
  transition: background-size var(--duration-normal) var(--ease-out);
}

.social-links a:hover { background-size: 100% 1px; }

.contact-form {
  display: flex;
  flex-direction: column;
  gap: var(--space-md);
}

.form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-md);
}

.form-group {
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
}

.form-group label,
.form-group legend {
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  color: var(--color-text-secondary);
}

.form-group legend { margin-bottom: var(--space-xs); }

.form-group .optional {
  font-weight: 400;
  color: var(--color-text-light);
}

.form-group input[type="text"],
.form-group input[type="email"],
.form-group textarea {
  font-family: var(--font-body);
  font-size: 1rem;
  padding: 14px var(--space-sm);
  border: 1px solid var(--color-border);
  border-radius: var(--radius);
  background: var(--color-surface);
  color: var(--color-text);
  transition: border-color var(--duration-fast) ease, box-shadow var(--duration-fast) ease;
  outline: none;
}

.form-group input::placeholder,
.form-group textarea::placeholder { color: #A3A39E; }

.form-group input:focus,
.form-group textarea:focus {
  border-color: var(--color-text);
  box-shadow: 0 0 0 3px rgba(26, 26, 26, 0.08);
}

.form-group.has-error input,
.form-group.has-error textarea {
  border-color: #B42318;
}

.form-error {
  font-size: 0.8125rem;
  color: #B42318;
  min-height: 0;
}

.form-group textarea {
  resize: vertical;
  min-height: 160px;
}

.chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs);
}

.chip {
  position: relative;
  cursor: pointer;
}

.chip input {
  position: absolute;
  opacity: 0;
  width: 1px;
  height: 1px;
}

.chip span {
  display: inline-block;
  font-size: 0.875rem;
  padding: 8px 16px;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  background: var(--color-surface);
  color: var(--color-text-secondary);
  transition: background-color var(--duration-fast) ease, color var(--duration-fast) ease,
              border-color var(--duration-fast) ease;
}

.chip:hover span {
  border-color: var(--color-text);
  color: var(--color-text);
}

.chip input:checked + span {
  background: var(--color-text);
  border-color: var(--color-text);
  color: var(--color-bg);
}

.chip input:focus-visible + span {
  outline: 2px solid var(--color-text);
  outline-offset: 3px;
}

.form-footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-sm) var(--space-md);
}

.form-status {
  font-size: 0.875rem;
  color: var(--color-text-secondary);
}

/* --- 16. Buttons --- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
  font-family: var(--font-body);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  padding: var(--space-sm) var(--space-md);
  border: 1px solid var(--color-text);
  border-radius: 999px;
  color: var(--color-text);
  background: transparent;
  position: relative;
  overflow: hidden;
  isolation: isolate;
  transition: color var(--duration-normal) var(--ease-out);
}

/* Fill rises from the bottom on hover */
.btn::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  background: var(--color-text);
  transform: translateY(101%);
  transition: transform var(--duration-normal) var(--ease-out);
}

.btn:hover { color: var(--color-bg); }
.btn:hover::before { transform: translateY(0); }

.btn--filled {
  background: var(--color-text);
  color: var(--color-bg);
}

.btn--filled::before { background: var(--color-bg-alt); }
.btn--filled:hover { color: var(--color-text); }

.arrow-right {
  display: inline-block;
  transition: transform var(--duration-fast) var(--ease-out);
}

a:hover .arrow-right,
button:hover .arrow-right {
  transform: translateX(4px);
}

/* --- 17. Footer --- */
.footer {
  border-top: 1px solid var(--color-border);
  padding: var(--space-2xl) var(--space-lg) var(--space-lg);
  background: var(--color-bg);
}

.footer__cta {
  max-width: var(--max-width);
  margin: 0 auto var(--space-xl);
}

.footer__cta-label {
  font-size: 1rem;
  color: var(--color-text-secondary);
  margin-bottom: var(--space-sm);
}

.footer__email {
  display: inline-block;
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 6vw, 5rem);
  line-height: 1.1;
  overflow-wrap: anywhere;
  padding-bottom: 0.1em;
  background: linear-gradient(currentColor, currentColor) left bottom / 0% 2px no-repeat;
  transition: background-size var(--duration-slow) var(--ease-out);
}

.footer__email:hover,
.footer__email:focus-visible {
  background-size: 100% 2px;
}

.footer__grid {
  max-width: var(--max-width);
  margin: 0 auto;
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  flex-wrap: wrap;
  gap: var(--space-md);
  padding-bottom: var(--space-md);
}

.footer__nav,
.footer__links {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-xs) var(--space-md);
}

.footer__nav a,
.footer__links a {
  font-size: 0.875rem;
  color: var(--color-text-secondary);
  transition: color var(--duration-fast) ease;
}

.footer__nav a:hover,
.footer__links a:hover {
  color: var(--color-text);
}

.footer__back-to-top {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.06em;
  color: var(--color-text);
  border: 1px solid var(--color-border);
  padding: 10px 20px;
  border-radius: 999px;
  background: var(--color-surface);
  transition: background-color var(--duration-fast) ease, color var(--duration-fast) ease,
              border-color var(--duration-fast) ease, transform var(--duration-fast) var(--ease-out);
}

.footer__back-to-top:hover {
  background: var(--color-text);
  color: var(--color-bg);
  border-color: var(--color-text);
  transform: translateY(-2px);
}

.footer__inner {
  max-width: var(--max-width);
  margin: 0 auto;
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-sm);
  padding-top: var(--space-md);
  border-top: 1px solid var(--color-border);
}

.footer__copyright {
  font-size: 0.8125rem;
  color: var(--color-text-light);
}

/* --- 18. Custom Cursor --- */
.cursor-dot,
.cursor-circle {
  pointer-events: none;
  position: fixed;
  top: 0;
  left: 0;
  border-radius: 50%;
  z-index: 9999;
  opacity: 0;
  will-change: transform;
}

.cursor-dot {
  width: 6px;
  height: 6px;
  background-color: var(--color-text);
  transition: opacity 0.3s ease, scale 0.25s var(--ease-out);
}

.cursor-circle {
  width: 36px;
  height: 36px;
  border: 1px solid rgba(26, 26, 26, 0.4);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: width 0.35s var(--ease-out),
              height 0.35s var(--ease-out),
              background-color 0.25s ease,
              border-color 0.25s ease,
              opacity 0.25s ease;
}

.cursor-circle.is-hover {
  width: 60px;
  height: 60px;
  background-color: rgba(26, 26, 26, 0.06);
  border-color: var(--color-text);
}

.cursor-circle.is-label {
  width: 88px;
  height: 88px;
  background-color: var(--color-text);
  border-color: var(--color-text);
}

.cursor-dot.is-hidden {
  scale: 0;
}

.cursor-circle__label {
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.08em;
  color: var(--color-bg);
  white-space: nowrap;
  opacity: 0;
  transition: opacity 0.2s ease;
}

.cursor-circle.is-label .cursor-circle__label { opacity: 1; }

.menu-open .cursor-dot { background-color: var(--color-inverse); }
.menu-open .cursor-circle { border-color: var(--color-inverse-muted); }
.menu-open .cursor-circle.is-hover {
  background-color: rgba(248, 249, 255, 0.1);
  border-color: var(--color-inverse);
}

@media (hover: none), (pointer: coarse) {
  .cursor-dot,
  .cursor-circle {
    display: none !important;
  }
}

/* --- 19. Geometric Placeholders --- */
.placeholder {
  position: relative;
  width: 100%;
  height: 100%;
  min-height: 200px;
  overflow: hidden;
}

.placeholder span {
  position: absolute;
  display: block;
}

/* Brand Identity — Circles */
.placeholder--brand { background: #F0E8DE; }
.placeholder--brand span:nth-child(1) {
  width: 55%; padding-bottom: 55%; border-radius: 50%;
  background: #E8645A; top: 8%; right: -5%; opacity: 0.9;
}
.placeholder--brand span:nth-child(2) {
  width: 38%; padding-bottom: 38%; border-radius: 50%;
  background: #2B3A67; top: 32%; left: 12%; opacity: 0.85;
}
.placeholder--brand span:nth-child(3) {
  width: 22%; padding-bottom: 22%; border-radius: 50%;
  background: #F5E6CC; bottom: 12%; left: 38%;
  box-shadow: 0 4px 30px rgba(0,0,0,0.08);
}

/* Editorial Design — Rectangles */
.placeholder--editorial { background: #E8EDE5; }
.placeholder--editorial span:nth-child(1) {
  width: 35%; height: 70%; background: #2D6A4F;
  top: 15%; left: 15%; border-radius: 2px;
}
.placeholder--editorial span:nth-child(2) {
  width: 50%; height: 30%; background: #D4A373;
  top: 40%; left: 30%; border-radius: 2px; opacity: 0.9;
}
.placeholder--editorial span:nth-child(3) {
  width: 18%; height: 18%; background: #FEFAE0;
  bottom: 18%; right: 18%; border-radius: 2px;
  box-shadow: 0 4px 20px rgba(0,0,0,0.06);
}

/* Digital Experience — Rotated Squares */
.placeholder--digital { background: #E4EDF2; }
.placeholder--digital span:nth-child(1) {
  width: 40%; padding-bottom: 40%; background: #457B9D;
  top: 15%; right: 15%; transform: rotate(45deg); border-radius: 4px;
}
.placeholder--digital span:nth-child(2) {
  width: 32%; padding-bottom: 32%; background: #2A9D8F;
  bottom: 18%; left: 18%; border-radius: 4px; opacity: 0.85;
}
.placeholder--digital span:nth-child(3) {
  width: 20%; padding-bottom: 20%; background: #E9C46A;
  top: 50%; left: 45%; transform: rotate(15deg); border-radius: 4px;
}

/* Visual Campaign — Circles & Dots */
.placeholder--campaign { background: #F0EADE; }
.placeholder--campaign span:nth-child(1) {
  width: 50%; padding-bottom: 50%; border-radius: 50%;
  background: #264653; top: 20%; left: 25%; opacity: 0.9;
}
.placeholder--campaign span:nth-child(2) {
  width: 14%; padding-bottom: 14%; border-radius: 50%;
  background: #E76F51; top: 15%; right: 20%;
}
.placeholder--campaign span:nth-child(3) {
  width: 10%; padding-bottom: 10%; border-radius: 50%;
  background: #E76F51; bottom: 20%; left: 15%; opacity: 0.7;
}
.placeholder--campaign::after {
  content: ''; position: absolute; width: 8%; padding-bottom: 8%;
  border-radius: 50%; background: #F4A261; bottom: 30%; right: 28%;
}

/* Packaging Design — Triangles */
.placeholder--packaging { background: #EDE4F3; }
.placeholder--packaging span:nth-child(1) {
  width: 0; height: 0; padding: 0;
  border-left: 12vw solid transparent; border-right: 12vw solid transparent;
  border-bottom: 20vw solid #7B2D8E;
  top: 10%; left: 15%; opacity: 0.85;
}
.placeholder--packaging span:nth-child(2) {
  width: 0; height: 0; padding: 0;
  border-left: 8vw solid transparent; border-right: 8vw solid transparent;
  border-top: 14vw solid #F472B6;
  bottom: 8%; right: 15%; opacity: 0.8;
}
.placeholder--packaging span:nth-child(3) {
  width: 20%; padding-bottom: 20%; background: #E9D5FF;
  transform: rotate(45deg); top: 50%; left: 50%;
  margin-top: -10%; margin-left: -10%; border-radius: 2px; opacity: 0.9;
}

/* Type Exploration — Arcs & Curves */
.placeholder--type { background: #F3E4E7; }
.placeholder--type span:nth-child(1) {
  width: 60%; padding-bottom: 60%; border-radius: 50%;
  border: 8px solid #9B1B30; background: transparent;
  top: -10%; right: -10%; clip-path: inset(30% 0 0 0);
}
.placeholder--type span:nth-child(2) {
  width: 40%; padding-bottom: 40%; border-radius: 50%;
  background: #F5A6B8; bottom: 10%; left: 10%; opacity: 0.8;
}
.placeholder--type span:nth-child(3) {
  width: 18%; padding-bottom: 18%; border-radius: 50%;
  background: #FFF5F5; top: 40%; left: 40%;
  box-shadow: 0 4px 20px rgba(0,0,0,0.06);
}

/* About photo placeholder */
.placeholder--portrait {
  background: linear-gradient(135deg, #E8EBFF 0%, #CED5FF 100%);
}
.placeholder--portrait span:nth-child(1) {
  width: 60%; padding-bottom: 60%; border-radius: 50%;
  background: #AAB6FF; top: 20%; left: 20%;
}
.placeholder--portrait span:nth-child(2) {
  width: 30%; height: 40%; background: #7C8CF0;
  bottom: 0; left: 35%; border-radius: 50% 50% 0 0;
}

/* Contact geometric */
.placeholder--contact { background: #EBEEFF; }
.placeholder--contact span:nth-child(1) {
  width: 50%; padding-bottom: 50%; border-radius: 50%;
  border: 3px solid #4C5DFA; background: transparent;
  top: 10%; left: 25%;
}
.placeholder--contact span:nth-child(2) {
  width: 30%; padding-bottom: 30%; background: #AAB6FF;
  top: 35%; left: 55%; border-radius: 2px; transform: rotate(30deg);
}

/* --- 20. Motion --- */
/* Initial hidden states only apply once JS has marked the document,
   so content stays visible without JS. */

/* Page-load sequence: headline lines rise out of their masks */
.js .line > span {
  transform: translateY(105%);
  transition: transform 1.1s var(--ease-out);
  transition-delay: calc(0.1s + var(--i, 0) * 0.12s);
}

.js.is-ready .line > span {
  transform: translateY(0);
}

/* Hero shapes grow in after the headline */
.js .hero__geo-shape {
  scale: 0.6;
  opacity: 0;
  transition: scale 1.6s var(--ease-out), opacity 1.2s ease;
}

.js .hero__geo-shape:nth-child(1) { transition-delay: 0.35s; }
.js .hero__geo-shape:nth-child(2) { transition-delay: 0.5s; }
.js .hero__geo-shape:nth-child(3) { transition-delay: 0.65s; }
.js .hero__geo-shape:nth-child(4) { transition-delay: 0.8s; }

.js.is-ready .hero__geo-shape {
  scale: 1;
  opacity: 1;
}

.js .reveal-up {
  opacity: 0;
  transform: translateY(32px);
}

.reveal-up {
  transition: opacity var(--duration-slow) var(--ease-out),
              transform var(--duration-slow) var(--ease-out);
}

.js .reveal-up.revealed {
  opacity: 1;
  transform: translateY(0);
}

.js .reveal-scale {
  opacity: 0;
  transform: scale(0.97);
}

.reveal-scale {
  transition: opacity var(--duration-slow) var(--ease-out),
              transform var(--duration-slower) var(--ease-out);
}

.js .reveal-scale.revealed {
  opacity: 1;
  transform: scale(1);
}

.js .stagger-children > * {
  opacity: 0;
  transform: translateY(30px);
}

.stagger-children > * {
  transition: opacity var(--duration-normal) var(--ease-out),
              transform var(--duration-normal) var(--ease-out);
}

.js .stagger-children.revealed > * {
  opacity: 1;
  transform: translateY(0);
}

.stagger-children.revealed > *:nth-child(2) { transition-delay: 0.1s; }
.stagger-children.revealed > *:nth-child(3) { transition-delay: 0.2s; }
.stagger-children.revealed > *:nth-child(4) { transition-delay: 0.3s; }
.stagger-children.revealed > *:nth-child(5) { transition-delay: 0.4s; }
.stagger-children.revealed > *:nth-child(6) { transition-delay: 0.5s; }

.divider {
  height: 1px;
  background: var(--color-border);
  transition: transform var(--duration-slower) var(--ease-out);
}

.js .divider {
  transform-origin: left;
  transform: scaleX(0);
}

.js .divider.revealed {
  transform: scaleX(1);
}

/* --- 21. Page Transitions (cross-document View Transitions) --- */
@view-transition {
  navigation: none;
}

::view-transition-old(root) {
  animation: vt-fade-out 0.3s var(--ease-in-out) both;
}

::view-transition-new(root) {
  animation: vt-fade-in 0.6s var(--ease-out) both;
}

::view-transition-group(.cover) {
  animation-duration: 0.7s;
  animation-timing-function: var(--ease-out);
}

::view-transition-old(.cover),
::view-transition-new(.cover) {
  height: 100%;
  object-fit: cover;
}

/* Filtering on the works page: cards move, the rest of the page stays put */
.vt-filter::view-transition-old(root) { display: none; }
.vt-filter::view-transition-new(root) { animation: none; }

.vt-filter::view-transition-group(*) {
  animation-duration: 0.55s;
  animation-timing-function: var(--ease-out);
}

@keyframes vt-fade-out {
  to { opacity: 0; }
}

@keyframes vt-fade-in {
  from { opacity: 0; transform: translateY(16px); }
}

/* --- 22. Responsive --- */
@media (max-width: 1024px) {
  :root {
    --space-lg: 3rem;
    --space-2xl: 8rem;
  }

  .hero__content { max-width: 80%; }

  .service {
    grid-template-columns: 1fr 1fr;
  }

  .service__title { grid-column: 1 / -1; }

  .work-detail__meta {
    grid-template-columns: 1fr 1fr;
  }

  .work-detail__meta-item:first-child { grid-column: 1 / -1; }

  .about-content,
  .contact-content,
  .about-teaser__content {
    gap: var(--space-xl);
  }

  .process {
    grid-template-columns: 1fr 1fr;
    row-gap: var(--space-lg);
  }
}

@media (max-width: 768px) {
  :root {
    --space-lg: 1.5rem;
    --space-xl: 4rem;
    --space-2xl: 5.5rem;
    --nav-height: 64px;
  }

  .hero {
    align-items: flex-end;
    padding-bottom: calc(var(--space-xl) + var(--space-md));
  }

  .hero__content { max-width: 100%; }

  .hero__geo {
    top: calc(var(--nav-height) + 6vh);
    right: -12%;
    width: 85vw;
    height: 85vw;
    transform: translateY(var(--scroll-y, 0px));
  }

  .hero__scroll-hint { bottom: var(--space-md); }

  .section-head {
    flex-direction: column;
    align-items: flex-start;
  }

  .featured__grid,
  .works-grid,
  .about-content,
  .contact-content,
  .about-teaser__content,
  .work-detail__images--two,
  .form-row {
    grid-template-columns: 1fr;
  }

  .works-grid { row-gap: var(--space-md); }

  .about-teaser__geo {
    max-width: 280px;
    margin: 0;
  }

  .about-photo {
    position: static;
    max-width: 420px;
  }

  .service {
    grid-template-columns: 1fr;
    gap: var(--space-sm);
    padding: var(--space-md) 0;
  }

  .project-card__info {
    flex-wrap: wrap;
  }

  .project-card__category { display: none; }

  .work-detail__body p { font-size: 1rem; }

  .project-nav { grid-template-columns: 1fr; }

  .project-nav__item { padding: var(--space-md) var(--space-lg); }

  .project-nav__item:last-child {
    border-left: 0;
    border-top: 1px solid var(--color-border);
  }

  .clients-grid { grid-template-columns: 1fr 1fr; }

  .timeline li { grid-template-columns: 1fr; gap: 2px; }

  .process { grid-template-columns: 1fr; }

  .process__num { margin-bottom: var(--space-xs); }

  .nav__meta { display: none; }

  .menu-overlay__inner {
    grid-template-columns: 1fr;
  }

  .menu-overlay__preview { display: none; }

  .menu-overlay__link {
    font-size: clamp(2.5rem, 13vw, 3.75rem);
    column-gap: 0.75rem;
  }

  .menu-overlay__link-desc { font-size: 0.8125rem; }

  .menu-overlay__info {
    grid-template-columns: 1fr;
    row-gap: var(--space-sm);
  }

  .footer__grid { align-items: flex-start; flex-direction: column; }
}

/* --- 23. Reduced Motion --- */
@media (prefers-reduced-motion: reduce) {
  @view-transition { navigation: none; }

  html { scroll-behavior: auto; }

  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    transition-delay: 0s !important;
  }

  .js .line > span,
  .js .reveal-up,
  .js .reveal-scale,
  .js .stagger-children > *,
  .js .divider {
    opacity: 1;
    transform: none;
  }

  .js .hero__geo-shape {
    opacity: 1;
    scale: none;
  }
}

/* --- 24. Utility --- */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}

.mt-sm { margin-top: var(--space-sm); }
.mt-md { margin-top: var(--space-md); }
.mt-lg { margin-top: var(--space-lg); }
.mb-sm { margin-bottom: var(--space-sm); }
.mb-md { margin-bottom: var(--space-md); }
.mb-lg { margin-bottom: var(--space-lg); }

/* HUI blue accent: preserve existing geometry, timing and interactions. */
::selection { background: var(--color-accent); color: #fff; }
:focus-visible { outline-color: var(--color-accent); }
.scroll-progress, .cursor-dot { background: var(--color-accent); }
.cursor-circle { border-color: var(--color-accent); }
.hero__scroll-line { background: var(--color-accent); }
.hero__title em { color: var(--color-accent); }
.btn { border-color: var(--color-accent-strong); color: var(--color-accent-strong); }
.btn::before { background: var(--color-accent-strong); }
.btn:hover { color: #fff; }
.btn--filled { background: var(--color-accent-strong); color: #fff; }
.btn--filled:hover { color: var(--color-accent-strong); }

/* Keep the active-page marker visible on the blue menu. */
.menu-overlay__link.active .menu-overlay__link-text::after { background: var(--color-inverse); }

/* Real project imagery and case study layout. */
.project-card__image img{width:100%;height:100%;object-fit:cover;object-position:top;transition:transform .8s var(--ease-out)}
.project-card:hover .project-card__image img{transform:scale(1.025)}
.project-card>p{margin:1rem 0}.project-preview{margin-top:1.25rem}.project-preview summary{cursor:pointer;color:var(--color-accent-strong);padding:1rem 0}.project-preview img{width:100%;height:auto;margin:1rem 0}
.case-hero{max-width:1600px;margin:auto}.case-hero img{width:100%;height:auto}.case-toc{display:flex;flex-wrap:wrap;gap:1.4rem;padding-top:2rem;padding-bottom:2rem;border-bottom:1px solid var(--color-border)}
.case-toc a{color:var(--color-accent-strong);font-size:.9rem}.case-figure{max-width:1120px;margin:3rem auto;padding:0 24px}.case-figure img{width:100%;height:auto}.case-figure figcaption{font-size:.8rem;color:var(--color-text-secondary);margin-top:12px}
.work-detail__body h2{margin-bottom:1.5rem;font-size:clamp(1.7rem,3vw,2.8rem)}.work-detail__body{scroll-margin-top:110px}
.case-swatches{display:grid;grid-template-columns:repeat(4,1fr);gap:0}.case-swatches>div{min-height:150px;padding:24px;display:flex;flex-direction:column;justify-content:space-between}.case-swatches span{font-size:.8rem}
@media(max-width:650px){.case-swatches{grid-template-columns:repeat(2,1fr)}.case-figure{padding:0 16px;margin:2rem auto}.case-toc{gap:1rem}.work-detail__meta{gap:1.5rem}.project-card__info{flex-wrap:wrap;gap:.5rem}}

/* Review: quiet case headings, readable captions and centered wide-screen hero. */
.case-figure figcaption{font-size:clamp(1rem,1.2vw,1.125rem);font-weight:500;line-height:1.7;color:var(--color-text);text-align:center;margin-top:22px;margin-bottom:10px}
@media(min-width:1024px){.hero{padding-inline:max(0px,calc((100% - var(--max-width))/2))}.hero__content{max-width:900px;width:66%;padding-inline:var(--space-lg)}.hero__geo{right:max(5%,calc((100% - var(--max-width))/2));width:min(45vw,600px)}}

/* Sans-serif typography and case-study reading rhythm. */
h1,h2,h3,h4{font-weight:600;letter-spacing:-.025em}em{font-weight:700}
.work-detail__meta{grid-template-columns:repeat(4,minmax(0,1fr));column-gap:40px;row-gap:32px;padding-top:32px;margin-top:48px}
.work-detail__meta>div{min-width:0}
.work-detail__meta .text-label{font-size:13px;font-weight:500;color:#626262;line-height:1.5;letter-spacing:.04em;margin:0 0 12px}
.work-detail__meta p:not(.text-label){font-size:16px;font-weight:500;color:#202020;line-height:1.8;margin:0;text-wrap:pretty}
.case-study .case-hero{margin-bottom:clamp(64px,7vw,112px)}
.case-study .work-detail__body{max-width:880px;margin-top:clamp(56px,6vw,96px);margin-bottom:clamp(40px,4vw,64px)}
.case-study .case-hero+.work-detail__body{margin-top:0}
.case-study .work-detail__body h2{line-height:1.4;margin-bottom:24px}
.case-study .work-detail__body p{color:#454545;line-height:1.95}
@media(max-width:1023px){.work-detail__meta{grid-template-columns:repeat(2,minmax(0,1fr));gap:28px 32px}.work-detail__meta-item:first-child{grid-column:auto}}
@media(max-width:600px){.work-detail__meta{gap:28px 20px;margin-top:32px;padding-top:24px}.work-detail__meta p:not(.text-label){font-size:15px}.case-study .work-detail__body{padding-inline:24px}}

/* Homepage scroll choreography; native scrolling remains untouched. */
@media(prefers-reduced-motion:no-preference){
 .hero__content{transform:translate3d(0,var(--hero-rise,0px),0);opacity:var(--hero-fade,1);will-change:transform,opacity}
 .hero__content:focus-within{opacity:1}
 .hero__geo{rotate:var(--geo-turn,0deg)}
 .featured .project-card__image{clip-path:inset(var(--image-inset,0%) round 4px)}
 .featured .project-card__image img{transform:scale(var(--image-scale,1));transition:none}
 .featured .project-card__info{transform:translateY(var(--info-rise,0px));opacity:var(--info-opacity,1)}
 .featured .project-card:focus-visible .project-card__info{transform:none;opacity:1}
}
@media(prefers-reduced-motion:reduce){.hero__content{transform:none;opacity:1}.hero__geo{transform:translateY(-50%);opacity:.55;rotate:none}.featured .project-card__image{clip-path:none}.featured .project-card__image img{transform:none}.featured .project-card__info{transform:none;opacity:1}}

/* A single pinned introduction flows into the first real project. */
.immersive-project{display:block;position:relative;overflow:hidden;background:#463623;color:#fff;isolation:isolate}
.immersive-project:focus-visible{outline:3px solid #fff;outline-offset:-8px}
.immersive-project>img{width:100%;height:100%;object-fit:cover;object-position:center 43%;display:block}
.immersive-project__shade{position:absolute;inset:0;background:linear-gradient(transparent 35%,rgba(20,14,8,.78));pointer-events:none}
.immersive-project__copy{position:absolute;left:max(32px,calc((100% - 1232px)/2));right:32px;bottom:clamp(40px,7vh,90px);max-width:800px}
.immersive-project__copy h2{font-size:clamp(36px,5vw,76px);line-height:1.2;margin:12px 0 20px;color:#fff}
.immersive-project__copy p{color:#fff;line-height:1.7}.immersive-project__copy a{display:inline-block;color:#fff;border-bottom:1px solid rgba(255,255,255,.7);padding:8px 0;margin-top:20px}
@media(prefers-reduced-motion:no-preference){
 .js .immersive-intro{height:240svh;position:relative}
 .js .immersive-sticky{height:100svh;position:sticky;top:0;overflow:hidden}
 .js .immersive-sticky>.hero{height:100%;min-height:100%;position:absolute;inset:0}
 .js .immersive-project{position:absolute;inset:0;z-index:3;transform:translateY(var(--scene-rise,105%));clip-path:inset(0 var(--scene-inset,18%));will-change:transform,clip-path}
 .js .immersive-project>img{transform:scale(var(--scene-zoom,1.12))}
 .js .immersive-project__copy{opacity:var(--scene-copy,0);transform:translateY(var(--scene-copy-rise,32px))}
 .js .immersive-project__shade{opacity:var(--scene-copy,0)}
 .immersive-intro .hero__geo-shape:nth-child(1){margin-right:calc(var(--scene-scatter,0px) * -1)}
 .immersive-intro .hero__geo-shape:nth-child(2){margin-left:calc(var(--scene-scatter,0px) * -1)}
 @media(max-width:700px){.js .immersive-intro{height:215svh}.immersive-project__copy{left:24px;right:24px}.immersive-project>img{object-position:60% center}}
}
@media(prefers-reduced-motion:reduce){.immersive-project{height:75svh;min-height:520px}}
html:not(.js) .immersive-project{height:75svh;min-height:520px}

/* RPDC review: visible hierarchy, generous targets and clear disclosure states. */
.works-grid{align-items:start}
.works-page .page-hero{padding-bottom:40px}
.works-page .page-hero+.section{padding-top:16px}
.works-filter__btn{color:#505050}
.works-filter__count{opacity:1}
.works-filter__btn[aria-pressed="true"]{background:var(--color-accent-strong);border-color:var(--color-accent-strong);color:#fff}
.works-grid .project-card>a>p{font-size:16px;line-height:1.85;color:#454545;margin:16px 0 20px}
.works-grid>.project-card{min-width:0;scroll-margin-top:104px}
.works-grid .project-card__info{display:block;padding:24px 0 0}
.works-grid .project-card__title{font-size:clamp(23px,2vw,30px);font-weight:650;line-height:1.35;margin:0 0 8px}
.works-grid .project-card__info>span{display:block;font-size:14px;line-height:1.6;color:#626262}
.works-grid .project-card>p{font-size:16px;line-height:1.85;color:#454545;margin:16px 0 20px;max-width:40em}
.project-preview summary{list-style:none;display:flex;align-items:center;min-height:48px;padding:12px 16px;border:1px solid #dedede;border-radius:8px;font-size:15px;font-weight:600;background:#fff}
.project-preview summary::-webkit-details-marker{display:none}
.project-preview summary:hover,.project-preview[open]>summary{border-color:var(--color-accent-strong);background:#f7f7f7}
.project-preview[open]{padding-bottom:16px;border-bottom:1px solid #dedede}
.project-preview summary:focus-visible{outline:3px solid var(--color-accent-strong);outline-offset:4px}
.nav__menu-btn,.copy-btn,.footer__back-to-top,.works-filter__btn{min-height:44px}
.work-detail__back{min-height:44px}
.contact-form .form-hint{font-size:14px;line-height:1.8;color:#626262;margin:0 0 28px;max-width:38em}
.contact-content>*{min-width:0}
.contact-email a{overflow-wrap:anywhere}
.profile-method{scroll-margin-top:104px}
@media(max-width:600px){.works-grid .project-card__info{padding-top:18px}.works-grid .project-card>p{margin-top:12px}.project-preview{margin-top:16px}}
