/* ==========================================================================
   Kloset Worx — Website CSS
   Italian-modernist atelier. The system from the brand manual, applied.
   ========================================================================== */

/* Tylko-style bold-sans type system. Geist 700/800 for display
   moments (not italic, not serif — bold confident sans is the
   register of tylko, Aesop's product pages, & similar quiet-
   luxury product brands). Geist Mono for caps and labels.
   Cormorant Garamond removed 2026-05-28: it was a wrong-register
   import (World of Interiors editorial), not tylko.
   Fonts moved out of @import 2026-06-09 → a parallel <link> in each page
   <head> (preceded by preconnect) so the font fetch no longer waits for
   site.css to download+parse. Keep both lists in sync if weights change. */

:root {
  /* Cream-on-cream palette refinement: bone-2 is the surface, bone is
     the paper, ink is the darkest, terra remains the single accent.
     Slightly warmer cream than the prior near-white. */
  --kw-bone: #faf7f1;          /* warm paper (was pure white) */
  --kw-bone-2: #f1ece1;        /* deeper cream surface */
  --kw-paper: #ffffff;         /* still pure white where used */
  --kw-ink: #1d232c;
  --kw-ink-2: #2d3540;
  --kw-terra: #7a2f3a;
  --kw-terra-deep: #5e222c;
  --kw-rule: rgba(29, 35, 44, 0.14);
  --kw-rule-strong: rgba(29, 35, 44, 0.32);
  --kw-rule-on-ink: rgba(29, 35, 44, 0.14);

  --kw-sans: "Geist", "Helvetica Neue", system-ui, sans-serif;
  --kw-mono: "Geist Mono", "JetBrains Mono", ui-monospace, monospace;
  /* --kw-serif removed 2026-05-28: pivoted to tylko-style bold sans
     for all display moments. Geist 700/800 carries the headlines. */

  --kw-max: 1440px;
  --kw-pad: 84px;
  --kw-pad-sm: 40px;
}

/* Page surface — warm cream so the editorial register reads
   immediately, not "tech-startup white". */
html, body { background: var(--kw-bone); }

/* CG-render mask: removed 2026-05-27.
   Replaced 1672137233327 and 1611048268330 site-wide with verified
   real photography (Thom Bradley FUJIFILM X-T2, Gabriel Rosenblut
   Sony A7 II). The mask block is no longer needed. */
/* Reset ---------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
/* Give every hash target a little breathing room so #06, #07, #subscribe,
   #inquire, etc. don't land jammed against the top of the viewport. */
[id] { scroll-margin-top: 28px; }
body {
  font-family: var(--kw-sans);
  font-size: 15px;
  /* 1.65 — magazine reading rhythm. The earlier 1.5 felt cramped at
     long-form scale; 1.65 opens the columns without inflating them. */
  line-height: 1.65;
  color: var(--kw-ink);
  background: #ffffff;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-feature-settings: "ss01", "ss02", "cv11", "kern", "liga";
  text-rendering: optimizeLegibility;
}
/* Headings inherit slightly tighter rhythm; body keeps the openness. */
h1, h2, h3, h4, h5, h6 { line-height: 1.08; }
img, svg { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button, input, textarea, select { font: inherit; color: inherit; }

/* Type ----------------------------------------------------------------- */
/* Tracking philosophy:
     · oversize display    -0.038em → -0.030em   (optical tightening)
     · h2-scale headlines  -0.030em                (near-display)
     · h3                  -0.022em
     · h4 / dek            -0.014em → -0.008em
     · body                -0.003em                (almost zero)
     · mono caps           +0.18em → +0.34em       (positive, by scale)
   Where two values are listed the larger negative goes to the larger
   size — Geist needs more negative space at scale, less at body. */
.k-cap { font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase; line-height: 1; }
.k-micro { font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.26em; text-transform: uppercase; line-height: 1; }
.k-mono { font-family: var(--kw-mono); }
.k-body { font-size: 15px; line-height: 1.65; letter-spacing: -0.003em; }
.k-lede { font-size: 22px; line-height: 1.42; font-weight: 400; letter-spacing: -0.014em; }
.k-h2 { font-size: 56px; line-height: 1.02; font-weight: 500; letter-spacing: -0.032em; }
.k-h3 { font-size: 36px; line-height: 1.06; font-weight: 500; letter-spacing: -0.024em; }
.k-h4 { font-size: 22px; line-height: 1.18; font-weight: 500; letter-spacing: -0.014em; }
.k-hero {
  font-size: clamp(72px, 10vw, 156px);
  line-height: 0.88;
  font-weight: 500;
  letter-spacing: -0.042em;
}
.k-dot, .k-x { color: var(--kw-terra); }

/* SVG monogram — the stacked KX. K is currentColor (inherits ink);
   the bottom X is terra so the brand reads K-over-X with a strong
   accent on the X half. Matches the dot + the lowercase 'x' in the
   Worx wordmark for a single, repeated brand gesture. The SVG path
   carries stroke="currentColor" as a no-CSS fallback so the X never
   renders pure black; the class below overrides it to terra. */
.k-mark__x { stroke: var(--kw-terra) !important; }

/* ----- Magazine-cover display class -------------------------------------
   For the rare title that should read at cover scale — care, materials,
   studio. clamp(56, 9vw, 168). Tight tracking, generous line-height so
   the descenders never crowd a following dek line. */
.k-display {
  font-family: var(--kw-sans);
  font-size: clamp(56px, 9vw, 168px) !important;
  line-height: 0.92 !important;
  font-weight: 500;
  letter-spacing: -0.044em !important;
  text-wrap: balance;
  margin-bottom: 48px !important;
}
@media (max-width: 700px) {
  .k-display { font-size: clamp(48px, 13vw, 96px) !important; line-height: 0.95 !important; letter-spacing: -0.038em !important; }
}

/* ----- Drop-cap for essay openings ---------------------------------------
   Lives on the article's first paragraph. The initial letter floats
   left, scaled to roughly 4x the line-height, terra coloured, sitting
   on the baseline of the first body line. */
.k-drop::first-letter {
  font-family: var(--kw-sans);
  float: left;
  /* 4x line-height of the article ≈ 4 × (19 × 1.62) ≈ 123px desktop.
     Use em so it scales with whatever font-size the paragraph carries. */
  font-size: 6.2em;
  line-height: 0.86;
  font-weight: 500;
  color: var(--kw-terra);
  margin: 4px 14px 0 -4px;
  letter-spacing: -0.04em;
  /* Optical baseline lift — Geist's caps sit slightly above the
     baseline at this scale; nudging them down by a small em looks
     calmer than letting them drift up. */
  padding-top: 0.02em;
}
@media (max-width: 700px) {
  .k-drop::first-letter { font-size: 4.6em; margin-right: 10px; }
}

/* ----- Marginalia ---------------------------------------------------------
   Small italic note that lives in the right gutter of a 680px body
   column on desktop. Inline (italic, indented) below the host
   paragraph on mobile. */
.k-marg {
  font-style: italic;
  font-size: 13px;
  line-height: 1.5;
  color: var(--kw-ink);
  opacity: 0.66;
}
@media (min-width: 1100px) {
  .k-marg {
    float: right;
    width: 200px;
    margin: 4px -240px 8px 24px;
    clear: right;
  }
}
@media (max-width: 1099px) {
  .k-marg {
    display: block;
    padding: 14px 18px;
    margin: 18px 0;
    border-left: 1px solid var(--kw-rule-strong);
  }
}

/* ----- Pull-quote ---------------------------------------------------------
   Centred, oversize, with a terra dot before and a small mono caps
   attribution after. Distinct from .k-pull (which is left-aligned for
   the homepage and Signed section). */
.k-pullquote {
  text-align: center;
  max-width: 880px;
  margin: 72px auto;
  position: relative;
  font-family: var(--kw-sans);
  font-size: clamp(28px, 3.4vw, 40px);
  line-height: 1.22;
  letter-spacing: -0.022em;
  font-weight: 400;
  color: var(--kw-ink);
}
.k-pullquote::before {
  content: "";
  display: block;
  width: 7px; height: 7px;
  border-radius: 50%;
  background: var(--kw-terra);
  margin: 0 auto 28px;
}
.k-pullquote__attrib {
  display: block;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  opacity: 0.6;
  margin-top: 22px;
}
@media (max-width: 700px) {
  .k-pullquote { margin: 56px auto; }
}

/* Container ------------------------------------------------------------ */
.k-wrap {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: 0 var(--kw-pad);
}
@media (max-width: 900px) {
  .k-wrap { padding: 0 var(--kw-pad-sm); }
}

/* Section --------------------------------------------------------------- */
/* Section rhythm — opened from 104/64/160 to 128/88/184 to suit the new
   magazine register. Mobile (≤900) holds 88/56/128 so the cadence
   survives at phone scale without orphaning short sections. */
/* Heyoasis-feel rhythm: more breathing room between sections.
   Bumped from 128/88/184 to 152/104/184 — magazine-grade pacing.
   --loose stays at 184 (not 216) — anything more turns short closing
   CTAs into 55%-empty caverns. */
.k-section { padding: 152px 0; }
.k-section--tight { padding: 104px 0; }
.k-section--loose { padding: 184px 0; }
@media (max-width: 900px) {
  .k-section { padding: 104px 0; }
  .k-section--tight { padding: 64px 0; }
  .k-section--loose { padding: 120px 0; }
}
@media (max-width: 600px) {
  /* Phone-scale: tighten so a 26-section page doesn't feel like
     six full screens of pure padding. */
  .k-section { padding: 80px 0; }
  .k-section--tight { padding: 56px 0; }
  .k-section--loose { padding: 104px 0; }
}
/* Magazine-cover sustain — when a section follows the cinematic hero
   directly, add 12% more vertical breathing above the first content
   so the cover register persists past the fold. Applied via the
   pagemark wrap on home + offerings; matched on .k-hero-cinema + the
   next section directly. */
.k-hero-cinema + .k-wrap > .k-pagemark { padding: 32px 0 24px; }
.k-hero-cinema + .k-section,
.k-hero-cinema + .k-wrap + .k-section {
  padding-top: 144px;
}
@media (max-width: 900px) {
  .k-hero-cinema + .k-section,
  .k-hero-cinema + .k-wrap + .k-section {
    padding-top: 100px;
  }
}
/* On a white site, the former dark sections become neutral grounds bracketed by hairlines
   so the rhythm of the page survives. */
.k-section--ink { background: #ffffff; color: var(--kw-ink); border-top: 1px solid var(--kw-rule); border-bottom: 1px solid var(--kw-rule); }
.k-section--terra { background: #ffffff; color: var(--kw-ink); border-top: 1px solid var(--kw-rule); border-bottom: 1px solid var(--kw-rule); }
.k-section--paper { background: #ffffff; border-top: 1px solid var(--kw-rule); border-bottom: 1px solid var(--kw-rule); }
/* Avoid double hairlines when two bordered sections sit adjacent. */
.k-section--ink + .k-section--ink,
.k-section--ink + .k-section--paper,
.k-section--paper + .k-section--ink,
.k-section--paper + .k-section--paper {
  border-top: 0;
  /* Adjacent sections share continuity — halve the top padding so the
     joined block doesn't read as one giant cavern between content. */
  padding-top: 104px;
}
@media (max-width: 900px) {
  .k-section--ink + .k-section--ink,
  .k-section--ink + .k-section--paper,
  .k-section--paper + .k-section--ink,
  .k-section--paper + .k-section--paper { padding-top: 72px; }
}
/* A pullq immediately preceding a .k-section is another adjacency
   that should compress — the pullq is its own breath; the next section
   doesn't need a full magazine break above its first content. */
.k-pullq + .k-section { padding-top: 104px; }
@media (max-width: 900px) { .k-pullq + .k-section { padding-top: 72px; } }

/* Section eyebrow ------------------------------------------------------- */
.k-eyebrow {
  display: flex;
  align-items: baseline;
  gap: 20px;
  padding-bottom: 28px;
  margin-bottom: 56px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-eyebrow__num { color: var(--kw-ink); opacity: 0.4; }
.k-eyebrow__title { flex: 1; opacity: 0.65; }

/* Hairlines ------------------------------------------------------------- */
/* True hairline — 0.5px on devicePixelRatio ≥ 2 (Retina, mobile), 1px
   fallback elsewhere. Subpixel rules are the small difference between
   a printed magazine and a print-out of one. */
.k-rule { height: 1px; background: var(--kw-rule); border: 0; display: block; }
@media (min-resolution: 2dppx), (-webkit-min-device-pixel-ratio: 2) {
  .k-rule { height: 0.5px; }
  .k-eyebrow,
  .k-section--ink,
  .k-section--terra,
  .k-section--paper,
  .k-nav,
  .k-pagemark { border-width: 0.5px; }
  .k-spec-list,
  .k-spec-list__row { border-width: 0.5px; }
}

/* ==========================================================================
   NAVIGATION (injected by chrome.js into #k-nav)
   ========================================================================== */
.k-nav {
  position: relative;
  z-index: 50;
  border-bottom: 1px solid var(--kw-rule);
  background: #ffffff;
}
.k-nav__inner {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: 22px var(--kw-pad);
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 48px;
}
.k-nav__brand { display: flex; align-items: center; gap: 14px; }
.k-nav__wordmark {
  font-size: 22px;
  font-weight: 500;
  letter-spacing: -0.035em;
  color: var(--kw-ink);
  white-space: nowrap;
}
/* Trademark mark on the wordmark — small, raised, quiet. */
.k-tm {
  font-size: 0.42em;
  font-weight: 400;
  letter-spacing: 0;
  vertical-align: super;
  line-height: 0;
  opacity: 0.7;
  margin-left: 0.06em;
}
.k-nav__items {
  display: flex;
  gap: 36px;
  justify-content: center;
}
.k-nav__item {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.72;
  position: relative;
  padding: 4px 0;
  transition: opacity 0.18s;
}
.k-nav__item:hover { opacity: 1; }
.k-nav__item.is-active { opacity: 1; }
.k-nav__item.is-active::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -8px;
  height: 1px;
  background: var(--kw-terra);
}
.k-nav__cta {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: 12px 20px;
  border: 1px solid var(--kw-ink);
  transition: background 0.18s, color 0.18s;
}
.k-nav__cta:hover { background: var(--kw-ink); color: var(--kw-bone); }

/* Skip link — first focusable element, off-screen until focused */
.k-skip {
  position: fixed;
  top: 10px;
  left: 10px;
  z-index: 200;
  transform: translateY(-160%);
  background: var(--kw-ink);
  color: var(--kw-bone);
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  padding: 12px 18px;
  transition: transform 0.18s;
}
.k-skip:focus { transform: translateY(0); outline: 2px solid var(--kw-terra); }

/* Mobile toggle hidden on desktop; panel flows inline via display:contents */
.k-nav__toggle { display: none; }
.k-nav__panel { display: contents; }

@media (max-width: 1100px) {
  .k-nav__items { gap: 22px; }
  .k-nav__item { font-size: 10px; letter-spacing: 0.14em; }
}
@media (max-width: 900px) {
  .k-nav__inner { grid-template-columns: 1fr auto; }
  .k-nav__toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 44px;
    height: 44px;
    margin-right: -10px;
    background: transparent;
    border: 0;
    cursor: pointer;
    color: var(--kw-ink);
    z-index: 60;
  }
  .k-nav__bars, .k-nav__bars::before, .k-nav__bars::after {
    content: "";
    display: block;
    width: 22px;
    height: 1.5px;
    background: currentColor;
    transition: transform 0.22s ease, background 0.1s ease;
  }
  .k-nav__bars { position: relative; }
  .k-nav__bars::before { position: absolute; top: -6px; left: 0; }
  .k-nav__bars::after { position: absolute; top: 6px; left: 0; }
  .k-nav.is-open .k-nav__bars { background: transparent; }
  .k-nav.is-open .k-nav__bars::before { transform: translateY(6px) rotate(45deg); }
  .k-nav.is-open .k-nav__bars::after { transform: translateY(-6px) rotate(-45deg); }

  .k-nav__panel {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 6px;
    position: fixed;
    inset: 0;
    padding: 104px var(--kw-pad-sm) 48px;
    background: var(--kw-bone);
    transform: translateY(-100%);
    opacity: 0;
    visibility: hidden;
    overflow-y: auto;
    transition: transform 0.34s cubic-bezier(.16,1,.3,1), opacity 0.3s ease, visibility 0s linear 0.34s;
  }
  .k-nav.is-open .k-nav__panel {
    transform: translateY(0);
    opacity: 1;
    visibility: visible;
    transition: transform 0.38s cubic-bezier(.16,1,.3,1), opacity 0.3s ease;
  }
  .k-nav__items { display: flex; flex-direction: column; gap: 0; justify-content: flex-start; }
  .k-nav__item {
    font-size: 16px !important;
    letter-spacing: 0.14em !important;
    padding: 17px 0;
    border-bottom: 1px solid var(--kw-rule);
    opacity: 0.85;
  }
  .k-nav__item.is-active::after { display: none; }
  .k-nav__item.is-active { color: var(--kw-terra); opacity: 1; }
  .k-nav__cta { margin-top: 30px; align-self: flex-start; }
}
@media (max-width: 900px) and (prefers-reduced-motion: reduce) {
  .k-nav__panel, .k-nav__bars,
  .k-nav__bars::before, .k-nav__bars::after { transition: none; }
}

/* ==========================================================================
   FOOTER (injected by chrome.js into #k-footer)
   ========================================================================== */
.k-foot {
  background: var(--kw-ink);
  color: var(--kw-bone);
  margin-top: 0;
}
.k-foot__inner {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: 128px var(--kw-pad) 56px;
}

/* Masthead: brand + newsletter --------------------------------------- */
.k-foot__masthead {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: 96px;
  padding-bottom: 88px;
  border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
.k-foot__mark { color: var(--kw-bone); margin-bottom: 32px; opacity: 0.92; }
.k-foot__head {
  font-size: 52px;
  font-weight: 500;
  letter-spacing: -0.03em;
  line-height: 0.96;
  color: var(--kw-bone);
}
.k-foot__blurb {
  margin-top: 28px;
  max-width: 460px;
  font-size: 15px;
  line-height: 1.7;
  opacity: 0.62;
}
.k-foot__news { align-self: start; padding-top: 4px; }
.k-foot__news-note {
  margin: 16px 0 24px;
  font-size: 14px;
  line-height: 1.65;
  opacity: 0.6;
  max-width: 420px;
}
.k-foot__news-row {
  display: flex;
  align-items: center;
  gap: 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.28);
  max-width: 440px;
}
.k-foot__news-row input {
  flex: 1;
  background: transparent;
  border: 0;
  padding: 12px 0;
  font-size: 16px;
  color: var(--kw-bone);
  outline: none;
}
.k-foot__news-row input::placeholder { color: rgba(255, 255, 255, 0.4); }
.k-foot__news-btn {
  background: transparent;
  border: 0;
  cursor: pointer;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-bone);
  padding: 12px 0 12px 24px;
  white-space: nowrap;
  transition: opacity 0.18s;
}
.k-foot__news-btn:hover { opacity: 0.6; }
.k-foot__news-btn:disabled { opacity: 0.5; cursor: default; }

/* Link columns ------------------------------------------------------- */
.k-foot__cols {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 40px 36px;
  padding: 80px 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}
.k-foot__col-title {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-bone);
  opacity: 0.62;
  margin-bottom: 22px;
}
.k-foot__list { display: flex; flex-direction: column; gap: 12px; }
.k-foot__list a {
  opacity: 0.7;
  font-size: 14px;
  line-height: 1.3;
  transition: opacity 0.18s;
}
.k-foot__list a:hover { opacity: 1; }
.k-foot__more {
  margin-top: 8px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  opacity: 0.55 !important;
}

/* Bottom: legal / social / region ------------------------------------ */
.k-foot__bottom {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 20px 40px;
  padding-top: 40px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}
.k-foot__legal, .k-foot__social {
  display: flex;
  align-items: center;
  gap: 24px;
  flex-wrap: wrap;
}
.k-foot__legal span { opacity: 0.5; }
.k-foot__legal a, .k-foot__social a { opacity: 0.6; transition: opacity 0.18s; }
.k-foot__legal a:hover, .k-foot__social a:hover { opacity: 1; }
.k-foot__region { opacity: 0.6; }
/* Designer credit — full-width final line under the legal/social row,
   separated by a hairline. LEADLEADS links to the agency site. */
.k-foot__credit {
  flex-basis: 100%;
  text-align: center;
  padding-top: 26px;
  margin-top: 10px;
  border-top: 1px solid var(--kw-rule);
  opacity: 0.5;
}
.k-foot__credit a {
  color: inherit;
  opacity: 1;
  border-bottom: 1px solid currentColor;
  padding-bottom: 1px;
  transition: color 0.18s, opacity 0.18s;
}
.k-foot__credit a:hover { color: var(--kw-terra); }

@media (max-width: 1100px) {
  .k-foot__cols { grid-template-columns: repeat(3, 1fr); gap: 48px 40px; }
  /* Avoid the blank-right-half between masthead brand and newsletter
     between 901 and 1100 by stacking the masthead a step earlier. */
  .k-foot__masthead { grid-template-columns: 1fr; gap: 56px; }
  .k-foot__news { max-width: 560px; }
}
@media (max-width: 900px) {
  .k-foot__inner { padding: 88px var(--kw-pad-sm) 96px; }
  .k-foot__masthead { grid-template-columns: 1fr; gap: 48px; padding-bottom: 56px; }
  .k-foot__head { font-size: 38px; }
  .k-foot__cols { grid-template-columns: repeat(2, 1fr); gap: 40px 32px; padding: 56px 0; }
  .k-foot__bottom { flex-direction: column; align-items: flex-start; gap: 18px; }
  /* Section rhythm on small screens is set in the earlier .k-section
     media query (104/64/144). Don't redeclare here — source-order
     wins, and the smaller values were undoing the heyoasis bump. */
  .k-eyebrow { margin-bottom: 40px; }
}
@media (max-width: 600px) {
  /* Pagemark can crowd at narrow widths; wrap and shrink. */
  .k-pagemark { flex-wrap: wrap; gap: 6px 16px; font-size: 9px; }
}
@media (max-width: 540px) {
  .k-foot__cols { grid-template-columns: 1fr; gap: 36px; }
}

/* Featured-split utility: two-column at desktop, stacked on mobile.
   Replaces inline grid-template-columns: 1fr 1fr; gap: 96px on pages
   that would otherwise crush both columns on small screens. */
.k-feat-split { display: grid; grid-template-columns: 1fr 1fr; gap: 96px; align-items: center; }
@media (max-width: 860px) { .k-feat-split { grid-template-columns: 1fr; gap: 40px; } }

/* Editorial detail rows — used on design.html "Details & accessories" to
   give each of the seven details a generous, paced rhythm between rows,
   with a hairline rule separating one from the next. */
.k-detail { padding: 88px 0; border-top: 1px solid var(--kw-rule); }
.k-detail:first-of-type { border-top: 0; padding-top: 56px; }
@media (max-width: 860px) { .k-detail { padding: 56px 0; } }

/* ==========================================================================
   HERO — Cinematic (video background variant)
   ========================================================================== */
.k-hero-cinema {
  position: relative;
  overflow: hidden;
  background: #0e1116;
  /* Use svh (small viewport height), NOT dvh. dvh is *dynamic* — it
     grows/shrinks as the mobile address bar hides/shows on scroll, so
     a full-height video hero re-fits every frame and visibly "shakes."
     svh is the stable smaller height (toolbar-visible), so the hero is
     a constant size and never reflows mid-scroll. vh fallback first. */
  min-height: 92vh;
  min-height: 92svh;
  color: var(--kw-paper);
}
.k-hero-cinema__media {
  position: absolute;
  inset: 0;
  z-index: 0;
}
.k-hero-cinema__media video,
.k-hero-cinema__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* The film sits above the still fallback so its smooth, baked-in
   motion is what shows; the still act behind it is frozen. */
.k-hero-cinema__video { z-index: 1; }
/* PROCESS DRAWING — an honest construction elevation that draws
   itself (Act I — Drawn), fills to material (Act II — Milled), then
   settles into a room with the maker's mark (Act III — Installed).
   One 21s loop, synced to the phase labels below. The <video> drop-in
   still covers this entirely the moment real footage is supplied. */
.k-hero-cinema__seq { position: absolute; inset: 0; overflow: hidden; }
.k-hero-draw {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  transform-origin: 50% 58%;
  animation: kw-draw-settle 21s ease-in-out infinite;
}
.k-hero-draw line, .k-hero-draw path, .k-hero-draw rect { vector-effect: non-scaling-stroke; }
/* Animation + dash must live on the shapes, not the <g> (CSS animation
   doesn't inherit and stroke-dashoffset on a group has no effect). */
.hl-frame path, .hl-frame line,
.hl-detail path, .hl-detail line, .hl-detail rect {
  fill: none;
  stroke: #ded7c8;
  stroke-linecap: round;
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
}
.hl-frame path, .hl-frame line { stroke-width: 2.4; animation: kw-draw-1 21s linear infinite; }
.hl-detail path, .hl-detail line, .hl-detail rect { stroke-width: 1.8; animation: kw-draw-2 21s linear infinite; }
.hf rect { fill: #c98a52; stroke: none; fill-opacity: 0; animation: kw-draw-fill 21s linear infinite; }
.hi { opacity: 0; animation: kw-draw-install 21s linear infinite; }
.hi line { fill: none; stroke: #b7b0a1; stroke-width: 1.4; }
.hi-mark { fill: var(--kw-terra); stroke: none; }
@keyframes kw-draw-1 {
  0%   { stroke-dashoffset: 1; opacity: 0.8; }
  3%   { opacity: 0.8; }
  13%  { stroke-dashoffset: 0; }
  92%  { stroke-dashoffset: 0; opacity: 0.8; }
  98%  { opacity: 0; }
  100% { stroke-dashoffset: 1; opacity: 0; }
}
@keyframes kw-draw-2 {
  0%, 7% { stroke-dashoffset: 1; opacity: 0.62; }
  27%    { stroke-dashoffset: 0; }
  92%    { stroke-dashoffset: 0; opacity: 0.62; }
  98%    { opacity: 0; }
  100%   { stroke-dashoffset: 1; opacity: 0; }
}
@keyframes kw-draw-fill {
  0%, 33% { fill-opacity: 0; }
  49%     { fill-opacity: 0.17; }
  92%     { fill-opacity: 0.17; }
  100%    { fill-opacity: 0; }
}
@keyframes kw-draw-install {
  0%, 64% { opacity: 0; }
  75%     { opacity: 0.6; }
  93%     { opacity: 0.6; }
  100%    { opacity: 0; }
}
@keyframes kw-draw-settle {
  0%, 64% { transform: scale(0.972); }
  82%     { transform: scale(1); }
  95%     { transform: scale(1); }
  100%    { transform: scale(0.972); }
}

/* Reduced motion: hold the finished, installed drawing — fully drawn,
   filled, in the room — with no animation. */
@media (prefers-reduced-motion: reduce) {
  .k-hero-draw, .k-hero-draw * { animation: none !important; transform: none !important; }
  .hl-frame path, .hl-frame line,
  .hl-detail path, .hl-detail line, .hl-detail rect { stroke-dashoffset: 0 !important; }
  .hl-frame path, .hl-frame line { opacity: 0.8; }
  .hl-detail path, .hl-detail line, .hl-detail rect { opacity: 0.62; }
  .hf rect { fill-opacity: 0.17; }
  .hi { opacity: 0.6; }
}
.k-hero-cinema__veil {
  position: absolute;
  inset: 0;
  z-index: 1;
  /* Heyoasis-feel veil — slightly heavier in the centre band where the
     editorial headline sits, lighter top + bottom so the attribution
     and CTAs still read. The photograph remains the cover; the wash is
     just contrast insurance for the white type. */
  background:
    radial-gradient(ellipse 90% 50% at center 50%,
      rgba(14,17,22,0.42) 0%,
      rgba(14,17,22,0.28) 38%,
      rgba(14,17,22,0.10) 70%,
      rgba(14,17,22,0.00) 100%),
    linear-gradient(180deg,
      rgba(14,17,22,0.28) 0%,
      rgba(14,17,22,0.04) 18%,
      rgba(14,17,22,0.00) 42%,
      rgba(14,17,22,0.00) 62%,
      rgba(14,17,22,0.38) 86%,
      rgba(14,17,22,0.66) 100%);
  pointer-events: none;
}
/* Photographic backdrop — kept for non-rotation pages that still
   point at .k-hero-cinema__photo. The home hero now uses the 3-act
   rotation below. */
.k-hero-cinema__photo {
  position: absolute; inset: 0; z-index: 0;
  background-size: cover; background-position: center center;
  filter: saturate(0.96) brightness(1.04) contrast(1.02);
  transform: scale(1.04);
}

/* Three-act rotation: hands -> shop drawing -> finished closet.
   21 s loop, ~5 s on per act + 2 s cross-fade. Each layer runs the
   same keyframe; their delays stagger them around the loop. */
.k-hero-cinema__act {
  position: absolute; inset: 0; z-index: 0;
  background-size: cover; background-position: center center;
  filter: saturate(0.96) brightness(1.02) contrast(1.02);
  transform: scale(1.04);
  opacity: 0;
  /* 14s loop instead of 21s — Act 3 was dropped pending real photography.
     Loop is now Act 1 (photo) -> Act 2 (shop drawing) -> back to Act 1. */
  animation: kw-hero-cycle 14s ease-in-out infinite;
}
/* HEYOASIS-FEEL PURE PHOTOGRAPH — the hero is one cinematic image.
   Act 1 holds at full opacity for the entire 24-second loop. Slow
   ken-burns zoom + drift is the only motion. Act 2 (shop drawing)
   is hidden — moved to method.html where it lives as a feature
   spread without competing with the photograph here.

   Daniel: 2026-05-27 — referenced heyoasis.com/en, asked for "more
   photo dominance." This is that move. The shop drawing remains a
   brand signature; it just lives below the hero now. */
.k-hero-cinema__act--1 {
  opacity: 1;
  /* Static. The hero film (<video>) carries the motion now; a second
     CSS ken-burns here only fought it and shimmered. This layer is a
     still fallback behind the video. */
  animation: none;
  transform: scale(1.04);
}
.k-hero-cinema__act--1 img {
  width: 100%; height: 100%; object-fit: cover; object-position: center 38%;
  filter: saturate(0.94) brightness(1.02) contrast(1.02);
}
.k-hero-cinema__act--2 { display: none; }
.k-hero-cinema__act--3 { display: none; }

@keyframes kw-hero-kenburns {
  /* Slow zoom-and-drift. Lower amplitude than the previous version
     (1.04 -> 1.08 instead of 1.04 -> 1.10) because without the drawing
     interlude resetting the position, the motion is continuous and
     a smaller travel reads as more cinematic, less restless. */
  0%   { transform: scale(1.04) translate3d(0, 0, 0); }
  50%  { transform: scale(1.08) translate3d(-0.4%, -0.2%, 0); }
  100% { transform: scale(1.04) translate3d(0, 0, 0); }
}

/* Reduced motion: photograph holds static at scale 1.02. No animation. */
@media (prefers-reduced-motion: reduce) {
  .k-hero-cinema__act--1 { animation: none !important; transform: scale(1.02); }
}

/* Shop drawing inside Act 2 — terra-deep lines on bone paper; the
   lines self-draw using the same pathLength + dashoffset technique as
   the older brand SVG, but scoped to .hd-* so it doesn't collide. */
.k-hero-cinema__draw {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  display: block;
}
.k-hero-cinema__draw line, .k-hero-cinema__draw path, .k-hero-cinema__draw rect,
.k-hero-cinema__draw .hd-detail circle {
  vector-effect: non-scaling-stroke;
  fill: none;
  stroke: #5e222c;            /* terra-deep on bone paper */
  stroke-linecap: round;
  stroke-dasharray: 1;
  stroke-dashoffset: 1;
}
.k-hero-cinema__draw .hd-ref     line { stroke-width: 1.2; opacity: 0.40; }
.k-hero-cinema__draw .hd-frame   line,
.k-hero-cinema__draw .hd-frame   path { stroke-width: 2.2; }
.k-hero-cinema__draw .hd-detail  line,
.k-hero-cinema__draw .hd-detail  rect { stroke-width: 1.4; opacity: 0.82; }
.k-hero-cinema__draw .hd-dim     line { stroke-width: 1; opacity: 0.6; }
.k-hero-cinema__draw .hd-mark { fill: var(--kw-terra); stroke: none; }
.k-hero-cinema__draw .hd-mark-l {
  font-family: var(--kw-mono); fill: var(--kw-bone); stroke: none;
  font-size: 8px; letter-spacing: 0.02em; text-anchor: middle;
}
.k-hero-cinema__draw .hd-label,
.k-hero-cinema__draw .hd-meta,
.k-hero-cinema__draw .hd-dim-label {
  font-family: var(--kw-mono); fill: #4a2a18; stroke: none;
  letter-spacing: 0.16em; text-transform: uppercase;
}
.k-hero-cinema__draw .hd-label    { font-size: 16px; }
.k-hero-cinema__draw .hd-meta     { font-size: 12px; opacity: 0.7; }
.k-hero-cinema__draw .hd-dim-label{ font-size: 14px; opacity: 0.72; }

/* Material hatching — diagonal grain hint inside the carcass panels.
   Stroked, so it inherits the kw-hero-cycle-draw animation cleanly. */
.k-hero-cinema__draw .hd-hatch line {
  stroke-width: 0.9; opacity: 0.18;
}

/* LED reveals — terra hairline at the underside of each shelf. */
.k-hero-cinema__draw .hd-led line {
  stroke: var(--kw-terra); stroke-width: 1.1; opacity: 0.55;
}

/* Leader callouts — the terra pin + thin line + small mono label
   that point to specific construction details. The pin is filled
   terra; the line and the label match the hd-detail typography. */
.k-hero-cinema__draw .hd-callout .hd-pin {
  fill: var(--kw-terra); stroke: none;
}
.k-hero-cinema__draw .hd-callout line {
  stroke-width: 0.9; opacity: 0.72;
}
.k-hero-cinema__draw .hd-call-label {
  font-family: var(--kw-mono); fill: #4a2a18; stroke: none;
  font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase;
  opacity: 0.85;
}

/* General notes block in the top-right corner of the sheet. The
   header line is a thin underline; the items below are mono caps
   with a column-aligned tag-letter prefix (A · / B · / etc.). */
.k-hero-cinema__draw .hd-notes line {
  stroke-width: 0.8; opacity: 0.55;
}
.k-hero-cinema__draw .hd-notes-h {
  font-family: var(--kw-mono); fill: #4a2a18; stroke: none;
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  opacity: 0.8;
}
.k-hero-cinema__draw .hd-notes-l {
  font-family: var(--kw-mono); fill: #4a2a18; stroke: none;
  font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase;
  opacity: 0.68;
}

/* Section cut markers — small filled bone disc with terra "A"/"B",
   a short stem + chevron underneath indicating the cut direction.
   The disc is a fill, not a stroke, so it pops at full opacity even
   while the rest of the drawing is still animating in. */
.k-hero-cinema__draw .hd-section .hd-sec-bg {
  fill: var(--kw-terra); stroke: none;
}
.k-hero-cinema__draw .hd-section .hd-sec-l {
  font-family: var(--kw-mono); fill: var(--kw-bone); stroke: none;
  font-size: 11px; letter-spacing: 0; text-anchor: middle; font-weight: 500;
}
.k-hero-cinema__draw .hd-section line,
.k-hero-cinema__draw .hd-section path {
  stroke: var(--kw-terra); stroke-width: 1.4; opacity: 0.7;
}

/* Self-draw animation: lines run their stroke-dashoffset 1 -> 0 during
   the window when Act 2 is the visible act. The act starts being
   visible at wall t = 7 s (33% into the 21 s loop after Act 1 fades);
   the drawing should be complete by t ~ 11 s (38% deeper). */
.k-hero-cinema__draw .hd-ref     line,
.k-hero-cinema__draw .hd-frame   line,
.k-hero-cinema__draw .hd-frame   path,
.k-hero-cinema__draw .hd-detail  line,
.k-hero-cinema__draw .hd-detail  rect,
.k-hero-cinema__draw .hd-detail  path,
.k-hero-cinema__draw .hd-detail  circle,
.k-hero-cinema__draw .hd-hatch   line,
.k-hero-cinema__draw .hd-led     line,
.k-hero-cinema__draw .hd-callout line,
.k-hero-cinema__draw .hd-notes   line,
.k-hero-cinema__draw .hd-section line,
.k-hero-cinema__draw .hd-section path,
.k-hero-cinema__draw .hd-dim     line {
  /* 14s draw loop matches the new 2-act hero timing. */
  animation: kw-hero-cycle-draw 14s linear infinite;
}
@keyframes kw-hero-cycle-draw {
  /* While Act 2 holds at full opacity (no Act 1 photograph), the line
     animation runs a draw-hold-reset loop so the shop drawing has
     constant motion: lines build in over the first ~3 seconds, hold
     drawn for ~10 seconds, then briefly reset and rebuild. */
  0%   { stroke-dashoffset: 1; }
  20%  { stroke-dashoffset: 0; }
  90%  { stroke-dashoffset: 0; }
  100% { stroke-dashoffset: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .k-hero-cinema__draw line,
  .k-hero-cinema__draw path,
  .k-hero-cinema__draw rect,
  .k-hero-cinema__draw .hd-detail circle { animation: none !important; stroke-dashoffset: 0; }
}
.k-hero-cinema__seq { z-index: 1; opacity: 1; }

/* Shop-drawing annotation overlay — terra pins land on the actual
   closet features visible in the photograph (rod, mirror, island);
   thin white rules carry to mono caps labels. Sits above the photo,
   under the type, like a designer's transparency. */
.k-hero-annot {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  display: block;
  opacity: 0;
  animation: kw-annot-in 1.4s 0.6s ease-out forwards;
}
.k-hero-annot line { fill: none; stroke: #ffffff; stroke-width: 1.1; opacity: 0.62; vector-effect: non-scaling-stroke; stroke-linecap: round; }
.k-hero-annot .ha-crop line { stroke-width: 1.4; opacity: 0.78; }
.k-hero-annot .ha-pin { fill: var(--kw-terra); stroke: #ffffff; stroke-width: 1; }
.k-hero-annot .ha-titlebox { fill: rgba(14,17,22,0.42); stroke: rgba(255,255,255,0.42); stroke-width: 1.1; vector-effect: non-scaling-stroke; }
.k-hero-annot .ha-label { font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.22em; fill: #ffffff; opacity: 0.78; }
/* Pared watermark — smaller, more elegant; sits over Act 2 without
   competing with the photograph's tonal weight or the bottom credit. */
.k-hero-annot .ha-meta  { font-family: var(--kw-mono); font-size: 9.5px; letter-spacing: 0.22em; fill: #ffffff; opacity: 0.46; }
.k-hero-annot .ha-meta-faint { font-family: var(--kw-mono); font-size: 9.5px; letter-spacing: 0.22em; fill: #ffffff; opacity: 0.28; }
/* Lighten the corner crop marks so they read as a deckle, not a frame. */
.k-hero-annot .ha-crop line { stroke-width: 1; opacity: 0.52; }
@keyframes kw-annot-in {
  from { opacity: 0; transform: translateY(6px); }
  to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .k-hero-annot { animation: none; opacity: 1; transform: none; }
}
/* On narrow viewports the labels overlap the title; hide all but
   the corner crop marks + title block so the photo + type read first. */
@media (max-width: 900px) {
  .k-hero-annot .ha-call,
  .k-hero-annot .ha-sig { display: none; }
}
.k-hero-cinema__inner {
  position: relative;
  z-index: 2;
  min-height: 96vh;
  min-height: 96svh; /* svh (stable), not dvh — see .k-hero-cinema above */
  display: grid;
  /* Heyoasis-feel: a 4-row cover.
       Row 1 (auto): tiny mono attribution, centred at top.
       Row 2 (1fr) : the editorial headline, centred vertically.
       Row 3 (auto): one-line subhead, left-anchored at the bottom.
       Row 4 (auto): the CTA cluster, left-anchored.
     Image carries the cover; the scroll cue is still pinned absolute
     bottom-right. */
  grid-template-rows: auto 1fr auto auto;
  padding: 44px 0 52px;
  gap: 0;
}

/* HEYOASIS-FEEL: tiny mono attribution at top, centred. */
.k-hero-cinema__attr {
  grid-row: 1;
  justify-self: center;
  align-self: start;
  color: var(--kw-paper);
  opacity: 0.74;
  font-size: 10.5px;
  letter-spacing: 0.34em;
  margin: 0;
  text-shadow: 0 1px 6px rgba(0,0,0,0.32);
}
.k-hero-cinema__attr-sep { opacity: 0.55; margin: 0 8px; }
@media (max-width: 760px) {
  .k-hero-cinema__attr { font-size: 9.5px; letter-spacing: 0.28em; text-align: center; }
}
@media (max-width: 480px) {
  /* Phone-scale: shorten tracking so the line fits, hide the trailing
     descriptor so the brand mark reads on a single line at 320-360px. */
  .k-hero-cinema__attr { font-size: 9px; letter-spacing: 0.22em; max-width: 92vw; line-height: 1.6; }
  .k-hero-cinema__attr-sep,
  .k-hero-cinema__attr-tail { display: none; }
}

/* HEYOASIS-FEEL: a single editorial headline in the centre of the hero,
   serving as the title cluster of a magazine cover. Display-scale,
   tightly tracked, with the .k-dot terra full-stop carried through. */
.k-hero-cinema__headline {
  grid-row: 2;
  align-self: center;
  justify-self: center;
  text-align: center;
  margin: 0;
  max-width: 1100px;
  color: var(--kw-paper);
  /* Tylko-style bold display sans — confident, tight, declarative.
     Replaces the prior italic serif (wrong register for tylko). */
  font-family: var(--kw-sans);
  font-weight: 700;
  font-size: clamp(64px, 10.8vw, 160px);
  line-height: 0.94;
  letter-spacing: -0.038em;
  text-shadow: 0 2px 28px rgba(0,0,0,0.42);
  text-wrap: balance;
}
.k-hero-cinema__headline .k-dot {
  color: var(--kw-terra);
  display: inline-block;
  /* Slight nudge — the dot is the brand mark, not punctuation. */
  margin-left: 0.02em;
}
@media (max-width: 900px) {
  .k-hero-cinema__headline { font-size: clamp(44px, 11vw, 84px); }
}
@media (max-width: 600px) {
  .k-hero-cinema__headline {
    font-size: clamp(36px, 12vw, 56px);
    letter-spacing: -0.028em;
    line-height: 1.02;
  }
  /* On phones the line break in markup is awkward; collapse it. */
  .k-hero-cinema__headline br { display: none; }
}
/* Legacy top (kept for any non-pared usage) ----------------------- */
.k-hero-cinema__top {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 24px; color: var(--kw-paper); opacity: 0.62;
  padding-bottom: 28px; border-bottom: 1px solid rgba(255,255,255,0.18);
  margin-bottom: 24px;
}
.k-hero-cinema__top-mid { flex: 1; text-align: center; opacity: 0.85; }
/* PARED top stamp — single mono caps line, centred, no rule, no
   flanking text. Replaces the three-cell timecode bar. Source-ordered
   after the legacy rule so it wins at equal specificity. */
.k-hero-cinema__top.k-hero-cinema__top--pared {
  display: flex; justify-content: center; align-items: baseline;
  padding-bottom: 0; border-bottom: 0; margin-bottom: 0; opacity: 1;
  gap: 0;
}
.k-hero-cinema__stamp {
  color: var(--kw-paper);
  opacity: 0.78;
  font-size: 10px;
  letter-spacing: 0.34em;
}

/* Hero subhead — single quiet line above the CTAs. Sits at body
   weight against the cinematic background, max-width keeps it
   under ~58 chars so it never reads like a paragraph. */
.k-hero-cinema__subhead {
  grid-row: 3;
  align-self: end;
  margin: 0 0 18px;
  max-width: 580px;
  font-family: var(--kw-sans);
  font-size: 17px;
  font-weight: 400;
  line-height: 1.5;
  letter-spacing: -0.005em;
  color: var(--kw-paper);
  opacity: 0.86;
  text-shadow: 0 1px 8px rgba(0,0,0,0.35);
}
@media (max-width: 760px) {
  .k-hero-cinema__subhead { font-size: 15px; margin-bottom: 16px; }
}

/* HEYOASIS-FEEL CTA cluster: one terra primary button + one ghost text
   link. Sits in the third row alongside the subhead, left-anchored at
   the cover's lower gutter. Reduced visual noise — the headline is the
   moment, the CTA is the action. */
.k-hero-cinema__ctas {
  grid-row: 4;
  align-self: end;
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 26px;
}
.k-hero-cinema__cta {
  display: inline-flex;
  align-items: center;
  gap: 16px;
  font-family: var(--kw-mono);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-paper);
  padding: 22px 38px;
  min-height: 62px;
  border: 1.5px solid var(--kw-paper);
  background: transparent;
  box-shadow: 0 4px 16px rgba(0,0,0,0.22);
  transition: background 0.24s, color 0.24s, border-color 0.24s, transform 0.32s cubic-bezier(.16,1,.3,1), box-shadow 0.24s;
}
.k-hero-cinema__cta span { display: inline-block; transition: transform 0.32s cubic-bezier(.16,1,.3,1); font-size: 1.08em; }
.k-hero-cinema__cta:hover { background: var(--kw-paper); color: var(--kw-ink); border-color: var(--kw-paper); box-shadow: 0 8px 26px rgba(0,0,0,0.28); }
.k-hero-cinema__cta:hover span { transform: translateX(6px); }

.k-hero-cinema__cta--primary {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  color: var(--kw-paper);
  box-shadow: 0 8px 28px rgba(122, 47, 58, 0.42);
}
.k-hero-cinema__cta--primary:hover {
  background: var(--kw-terra-deep);
  border-color: var(--kw-terra-deep);
  color: var(--kw-paper);
  box-shadow: 0 12px 34px rgba(94, 34, 44, 0.5);
  transform: translateY(-1px);
}

/* HEYOASIS-FEEL ghost CTA: a text link with an arrow, not a bordered
   button. Demotes the secondary action so the primary terra button
   carries the visual weight alone. */
.k-hero-cinema__cta--ghost {
  background: transparent;
  border: 0;
  box-shadow: none;
  padding: 18px 0;
  min-height: 0;
  letter-spacing: 0.2em;
  position: relative;
}
.k-hero-cinema__cta--ghost::after {
  content: "";
  position: absolute;
  left: 0; right: 0;
  bottom: 12px;
  height: 1px;
  background: rgba(255,255,255,0.32);
  transition: background 0.24s, transform 0.32s cubic-bezier(.16,1,.3,1);
  transform-origin: left center;
}
.k-hero-cinema__cta--ghost:hover {
  background: transparent;
  color: var(--kw-paper);
  border-color: transparent;
  box-shadow: none;
}
.k-hero-cinema__cta--ghost:hover::after { background: var(--kw-paper); }
.k-hero-cinema__cta--ghost:hover span { transform: translateX(6px); }

.k-hero-cinema__cta:focus-visible {
  outline: 2px solid var(--kw-terra);
  outline-offset: 4px;
}

/* PARED scroll cue — bottom-right, tiny mono caps + arrow.
   Positioned absolutely against the .k-hero-cinema__inner, which is
   also the .k-wrap (so it already carries the gutter padding). Using
   `right: 0` aligns the cue with the wrap's content edge — i.e. the
   right gutter — without doubling the padding. */
.k-hero-cinema__cue {
  position: absolute;
  right: 0;
  /* `bottom: 0` lines the cue's bottom edge with the inner's content
     bottom — same baseline as the bottom of the credit cluster, since
     the credit lives in the last grid row of an auto/1fr/auto layout. */
  bottom: 0;
  display: inline-flex;
  align-items: center;
  color: var(--kw-paper);
  opacity: 0.62;
}
.k-hero-cinema__cue-label {
  font-size: 10px;
  letter-spacing: 0.32em;
  display: inline-flex; align-items: center; gap: 10px;
}
.k-hero-cinema__cue-arrow {
  display: inline-block;
  font-family: var(--kw-mono);
  letter-spacing: 0;
}
@media (prefers-reduced-motion: no-preference) {
  .k-hero-cinema__cue-arrow { animation: kw-cue-arrow 2.4s ease-in-out infinite; }
  @keyframes kw-cue-arrow {
    0%, 100% { transform: translateY(0); opacity: 0.62; }
    50%      { transform: translateY(4px); opacity: 1; }
  }
}
@media (max-width: 900px) {
  .k-hero-cinema__inner { padding: 60px 0 64px; }
  /* CTAs go a touch smaller and may wrap onto two lines on narrow
     viewports — gap stays generous so the buttons keep their breath. */
  .k-hero-cinema__ctas { gap: 12px; }
  .k-hero-cinema__cta { font-size: 12px; letter-spacing: 0.16em; padding: 18px 26px; min-height: 56px; }
  /* On phones the CTAs nearly fill the gutter — float the scroll cue
     under them rather than in the absolute bottom-right corner. */
  .k-hero-cinema__cue {
    position: relative;
    right: auto;
    bottom: auto;
    margin-top: 22px;
    opacity: 0.5;
  }
}
@media (max-width: 480px) {
  /* On the smallest viewports, stack the two CTAs so each fills the
     available column and reads as a clear tap target. */
  .k-hero-cinema__ctas { flex-direction: column; align-items: stretch; }
  .k-hero-cinema__cta { justify-content: space-between; }
  /* Ghost CTA: when stacked the ::after underline was spanning the
     full stretched width (label edge to arrow edge), reading as a bar
     not an underline. Anchor it left so the rule sits under the text. */
  .k-hero-cinema__cta--ghost { align-self: flex-start; min-width: 0; }
  .k-hero-cinema__cta--ghost::after { right: auto; width: auto; left: 0; }
}
/* Tighter veil now that no headline lives at the bottom — give back a
   sliver of photograph at the foot, keep the credit legible. */
.k-hero-cinema__veil { /* values overridden inline above — left for compat */ }
@media (max-width: 480px) {
  .k-hero-cinema__cue-label { letter-spacing: 0.24em; }
  .k-hero-cinema__stamp     { letter-spacing: 0.26em; font-size: 9px; }
}

/* Legacy classes kept (no element references them after the pare-back,
   but third-party HTML on other pages might) ------------------------ */
.k-hero-cinema__btn-ghost {
  background: transparent !important;
  border-color: rgba(255,255,255,0.32) !important;
  color: rgba(255,255,255,0.82) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
.k-hero-cinema__btn-ghost:hover {
  background: var(--kw-paper) !important; color: var(--kw-ink) !important;
  border-color: var(--kw-paper) !important;
}
.k-hero-cinema__title {
  font-family: var(--kw-sans);
  font-size: clamp(32px, 4.4vw, 72px);
  line-height: 1.04;
  font-weight: 500;
  letter-spacing: -0.026em;
  color: var(--kw-paper);
  margin-bottom: 22px;
  margin-top: auto;
  max-width: 1100px;
  text-wrap: balance;
}
.k-hero-cinema__dek {
  font-size: 19px;
  line-height: 1.5;
  max-width: 580px;
  color: var(--kw-paper);
  opacity: 0.9;
  margin-bottom: 44px;
}
.k-hero-cinema .k-btn {
  border-color: rgba(247,245,240,0.6);
  color: var(--kw-paper);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  background: rgba(14,17,22,0.18);
}
.k-hero-cinema .k-btn:hover {
  background: var(--kw-paper);
  color: var(--kw-ink);
  border-color: var(--kw-paper);
}
.k-hero-cinema .k-btn--fill {
  background: var(--kw-paper);
  color: var(--kw-ink);
  border-color: var(--kw-paper);
}
.k-hero-cinema .k-btn--fill:hover {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  color: var(--kw-paper);
}

/* ==========================================================================
   HERO
   ========================================================================== */
.k-hero-wrap {
  /* Restored horizontal gutter — the prior `padding: 112px 0 96px` zeroed
     out the inherited .k-wrap padding, leaving hero titles flush against
     the viewport edge on every page except home (22 pages affected). */
  padding: 112px var(--kw-pad) 96px;
  position: relative;
}
@media (max-width: 900px) {
  .k-hero-wrap { padding: 96px var(--kw-pad-sm) 72px; }
}
.k-hero-wrap--with-mark {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 72px;
  align-items: center;
}
.k-hero-eyebrow {
  font-family: var(--kw-mono);
  font-size: 11px;
  /* Caps at small size want air — bumped 0.22 → 0.26. */
  letter-spacing: 0.26em;
  text-transform: uppercase;
  opacity: 0.6;
  margin-bottom: 32px;
}
.k-hero-text {
  font-size: clamp(48px, 7vw, 96px);
  line-height: 0.94;
  font-weight: 500;
  /* Tighter optical tracking at scale — Geist needs more negative
     space the larger it gets; -0.035 → -0.040 at the 96px end. */
  letter-spacing: -0.040em;
  margin-bottom: 36px;
  text-wrap: balance;
}
.k-hero-dek {
  font-size: 19px;
  line-height: 1.52;
  max-width: 560px;
  opacity: 0.8;
  letter-spacing: -0.008em;
}
.k-hero-mark {
  display: flex;
  justify-content: flex-end;
}
@media (max-width: 1000px) {
  .k-hero-wrap--with-mark { grid-template-columns: 1fr; }
  .k-hero-mark { display: none; }
}

/* ==========================================================================
   IMAGE PLACEHOLDERS (striped + caption)
   ========================================================================== */
.k-img {
  position: relative;
  background:
    repeating-linear-gradient(135deg,
      #d8d3c8 0 12px,
      #cdc8bc 12px 13px);
  border: 1px solid var(--kw-rule);
  overflow: hidden;
}
/* When a real photograph is supplied via inline background-image,
   replace the striped placeholder cleanly and drop the placeholder caption. */
.k-img--photo {
  background-color: var(--kw-bone-2);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  border: 0;
}
.k-img--photo::after,
.k-img--photo::before { display: none; }
.k-img::after {
  content: "↳ " attr(data-caption);
  position: absolute;
  left: 16px;
  bottom: 14px;
  right: 16px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.75;
}
.k-img[data-spec]::before {
  content: attr(data-spec);
  position: absolute;
  top: 14px;
  right: 16px;
  font-family: var(--kw-mono);
  font-size: 9px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
}
.k-img--dim {
  background:
    repeating-linear-gradient(135deg,
      #c4bdaa 0 12px,
      #b8b1a0 12px 13px);
}
.k-img--ink {
  background:
    repeating-linear-gradient(135deg,
      #2d3540 0 12px,
      #232a34 12px 13px);
}
.k-img--ink::after, .k-img--ink::before { color: var(--kw-bone); opacity: 0.8; }
.k-img--terra {
  background:
    repeating-linear-gradient(135deg,
      #7a2f3a 0 12px,
      #8a4225 12px 13px);
}
.k-img--terra::after, .k-img--terra::before { color: var(--kw-paper); opacity: 0.85; }

.k-img--1x1 { aspect-ratio: 1 / 1; }
.k-img--4x3 { aspect-ratio: 4 / 3; }
.k-img--3x4 { aspect-ratio: 3 / 4; }
.k-img--3x2 { aspect-ratio: 3 / 2; }
.k-img--2x3 { aspect-ratio: 2 / 3; }
.k-img--16x9 { aspect-ratio: 16 / 9; }
.k-img--2x1 { aspect-ratio: 2 / 1; }

/* ==========================================================================
   CARD GRID
   ========================================================================== */
.k-grid { display: grid; gap: 24px; }
.k-grid--2 { grid-template-columns: repeat(2, 1fr); }
.k-grid--3 { grid-template-columns: repeat(3, 1fr); }
.k-grid--4 { grid-template-columns: repeat(4, 1fr); }
@media (max-width: 900px) {
  .k-grid--3, .k-grid--4 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 600px) {
  .k-grid--2, .k-grid--3, .k-grid--4 { grid-template-columns: 1fr; }
}

.k-card {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.k-card__title { font-size: 22px; font-weight: 500; letter-spacing: -0.015em; }
.k-card__dek { font-size: 14px; opacity: 0.7; }
.k-card__meta {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  opacity: 0.55;
}
.k-card a { display: contents; }
.k-card--hover:hover .k-img { filter: brightness(0.96); }
.k-card--hover { cursor: pointer; }
.k-card__arrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}

/* ==========================================================================
   PROJECTS REGISTER ON HOME — editorial project cards
   --------------------------------------------------------------------------
   The "Recent projects" grid on index.html. Each card now reads as a
   small editorial entry: location stamp -> title -> a one-line dek
   -> a three-row specification list -> a quiet, terra CTA. The spec
   table uses real <dl> markup so it stays semantic for screen readers.
   ========================================================================== */
.k-projects__body {
  display: grid;
  gap: 14px;
}
.k-projects__title {
  margin-top: 4px;
  font-size: 26px;
  font-weight: 500;
  letter-spacing: -0.018em;
  line-height: 1.12;
  color: var(--kw-ink);
}
.k-projects__dek {
  margin: 0;
  font-family: var(--kw-sans);
  font-size: 15px;
  line-height: 1.55;
  color: var(--kw-ink);
  opacity: 0.72;
  max-width: 52ch;
}
/* Three-row labelled spec list — Material / Scale / Year. <dt> in mono
   caps, <dd> in body sans, separated by a thin hairline above. */
.k-projects__spec {
  display: grid;
  gap: 6px;
  margin: 6px 0 0;
  padding-top: 14px;
  border-top: 1px solid var(--kw-rule);
  position: relative;
}
.k-projects__spec::before {
  content: "";
  position: absolute;
  top: -1px; left: 0;
  width: 32px;
  height: 1px;
  background: var(--kw-terra);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .5s cubic-bezier(.2,.7,.2,1), width .5s ease;
}
.k-projects__spec > div {
  display: grid;
  grid-template-columns: 88px 1fr;
  gap: 16px;
  align-items: baseline;
}
.k-projects__spec dt {
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-rule-strong);
  margin: 0;
}
.k-projects__spec dd {
  font-family: var(--kw-sans);
  font-size: 14px;
  letter-spacing: -0.005em;
  color: var(--kw-ink-2);
  margin: 0;
}
.k-projects__cta {
  display: inline-block;
  margin-top: 4px;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-terra);
  opacity: 0.7;
  transition: opacity .35s ease, transform .35s ease, letter-spacing .35s ease;
}
/* Hover / focus state — image lifts a touch, terra rule scales in,
   CTA brightens, spec dd tone deepens. All subtle; the card is still
   reading first on the photograph. */
.k-projects__card:hover .k-projects__spec::before,
.k-projects__card:focus-visible .k-projects__spec::before { transform: scaleX(1); width: 52px; }
.k-projects__card:hover .k-projects__cta,
.k-projects__card:focus-visible .k-projects__cta { opacity: 1; letter-spacing: 0.22em; }
.k-projects__card:hover .k-projects__spec dd,
.k-projects__card:focus-visible .k-projects__spec dd { color: var(--kw-ink); }
.k-projects__card:hover .k-img,
.k-projects__card:focus-visible .k-img { filter: brightness(0.96); }
.k-projects__card:focus-visible {
  outline: 2px solid var(--kw-terra);
  outline-offset: 4px;
}
@media (max-width: 760px) {
  .k-projects__title { font-size: 22px; }
  .k-projects__spec > div { grid-template-columns: 76px 1fr; gap: 12px; }
  .k-projects__story > div { grid-template-columns: 76px 1fr; gap: 12px; }
}

/* Project-card narrative: Problem -> Solution -> Result. Sits
   above the material/scale/year spec, same <dl> structure so the
   eye reads down: dek -> story -> spec -> CTA. Subtle terra dot
   on each <dt> as a list anchor; on hover the dots brighten in
   sequence (CSS, no JS). */
.k-projects__story {
  display: grid;
  gap: 10px;
  margin: 2px 0 0;
  padding-top: 14px;
  border-top: 1px solid var(--kw-rule);
  position: relative;
}
.k-projects__story::before {
  content: "";
  position: absolute;
  top: -1px; left: 0;
  width: 24px;
  height: 1px;
  background: var(--kw-ink-2);
  opacity: 0.4;
}
.k-projects__story > div {
  display: grid;
  grid-template-columns: 88px 1fr;
  gap: 16px;
  align-items: baseline;
}
.k-projects__story dt {
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-terra);
  opacity: 0.78;
  margin: 0;
  position: relative;
}
.k-projects__story dt::before {
  content: "·";
  display: inline-block;
  margin-right: 6px;
  color: var(--kw-terra);
  font-weight: 700;
}
.k-projects__story dd {
  font-family: var(--kw-sans);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: -0.005em;
  color: var(--kw-ink);
  opacity: 0.76;
  margin: 0;
}
.k-projects__card:hover .k-projects__story dt,
.k-projects__card:focus-visible .k-projects__story dt { opacity: 1; }
.k-projects__card:hover .k-projects__story dd,
.k-projects__card:focus-visible .k-projects__story dd { opacity: 0.92; }

/* ==========================================================================
   PROOF STRIP — five differentiators in a thin terra-bordered band
   sitting right under the hero. Centered, horizontally tight, set in
   the same mono caps the wordmark uses.
   ========================================================================== */
.k-proof {
  background: var(--kw-bone);
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
  padding: 22px 0;
  position: relative;
}
.k-proof::before, .k-proof::after {
  content: "";
  position: absolute;
  left: 0; right: 0;
  height: 1px;
  background: var(--kw-terra);
  opacity: 0.18;
}
.k-proof::before { top: -1px; }
.k-proof::after  { bottom: -1px; }
.k-proof__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 14px 22px;
}
.k-proof__item {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink-2);
}
.k-proof__sep {
  color: var(--kw-terra);
  font-size: 14px;
  line-height: 1;
  opacity: 0.7;
}
@media (max-width: 760px) {
  .k-proof { padding: 16px 0; }
  .k-proof__list { gap: 8px 14px; font-size: 10px; }
  .k-proof__sep { display: none; }
  .k-proof__item { font-size: 10px; }
}

/* ==========================================================================
   TRIAD SPEC · "BECAUSE" LINE — the plain-English benefit that sits
   underneath the precision spec. Quiet italic body voice; sits below
   the mono caption with a small top margin.
   ========================================================================== */
.k-triad__spec-because {
  display: block;
  margin-top: 8px;
  font-family: var(--kw-sans);
  font-size: 13.5px;
  line-height: 1.5;
  font-style: italic;
  color: var(--kw-ink-2);
  opacity: 0.72;
  max-width: 30ch;
}
.k-triad__cell:hover .k-triad__spec-because,
.k-triad__cell:focus-visible .k-triad__spec-because { opacity: 0.92; }

/* ==========================================================================
   MANIFESTO — single-block brand thesis between Featured Spaces and
   By the Room. Generous vertical room; the headline runs at display
   scale with one terra-coloured half-line as the emphasis lift.
   ========================================================================== */
.k-manifesto {
  background: var(--kw-bone-2);
  padding: 120px 0 132px;
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
}
.k-manifesto__eyebrow {
  display: inline-block;
  margin: 0 0 24px;
  font-size: 11px;
  letter-spacing: 0.26em;
}
.k-manifesto__head {
  font-family: var(--kw-sans);
  font-size: clamp(48px, 6.6vw, 112px);
  line-height: 1.0;
  letter-spacing: -0.038em;
  font-weight: 700;
  color: var(--kw-ink);
  margin: 0 0 48px;
  max-width: 1100px;
  text-wrap: balance;
}
.k-manifesto__head--em {
  color: var(--kw-terra);
}
.k-manifesto__body {
  font-family: var(--kw-sans);
  font-size: 19px;
  line-height: 1.6;
  letter-spacing: -0.005em;
  color: var(--kw-ink);
  opacity: 0.82;
  max-width: 760px;
  margin: 0 0 44px;
}
.k-manifesto__cta {
  display: inline-flex;
  flex-wrap: wrap;
  gap: 14px;
}
@media (max-width: 760px) {
  .k-manifesto { padding: 72px 0 80px; }
  .k-manifesto__body { font-size: 17px; }
}

/* ==========================================================================
   FOOTER · ABOVE-LEGAL MANIFESTO LINE — quiet tagline that sits
   above the © stamp. National-ambition copy.
   ========================================================================== */
.k-foot__manifesto {
  font-family: var(--kw-sans);
  font-size: 14px;
  line-height: 1.5;
  letter-spacing: -0.005em;
  color: var(--kw-ink);
  opacity: 0.5;
  margin: 36px 0 20px;
  max-width: 640px;
  font-style: italic;
}

/* ==========================================================================
   TWO-COLUMN PROSE
   ========================================================================== */
.k-prose {
  display: grid;
  grid-template-columns: 1fr 1.4fr;
  gap: 88px;
  align-items: start;
}
.k-prose__label { padding-top: 8px; }
.k-prose__body { font-size: 19px; line-height: 1.5; max-width: 640px; }
.k-prose__body p + p { margin-top: 1em; }
.k-prose__body p { opacity: 0.86; }
@media (max-width: 900px) { .k-prose { grid-template-columns: 1fr; gap: 24px; } }

/* ==========================================================================
   PROCESS STEPS
   ========================================================================== */
.k-step {
  display: grid;
  grid-template-columns: 40px minmax(150px, 0.8fr) 1.25fr 0.95fr;
  gap: 40px;
  padding: 32px 0;
  border-top: 1px solid var(--kw-rule);
  align-items: center;
}
.k-step:last-child { border-bottom: 1px solid var(--kw-rule); }
.k-step__num {
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.18em;
  color: var(--kw-terra);
  align-self: start;
  padding-top: 4px;
}
.k-step__title { font-size: 25px; font-weight: 500; letter-spacing: -0.018em; line-height: 1.1; }
.k-step__body { font-size: 15px; line-height: 1.6; opacity: 0.86; align-self: start; padding-top: 2px; }
.k-step__img { width: 100%; align-self: stretch; }
@media (max-width: 900px) {
  .k-step { grid-template-columns: 1fr; gap: 14px; padding: 26px 0; }
  .k-step__title { font-size: 23px; }
  .k-step__img { aspect-ratio: 16 / 9; }
}

/* ==========================================================================
   BUTTONS / CTAS
   ========================================================================== */
.k-btn {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 14px 24px;
  border: 1px solid var(--kw-ink);
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  background: transparent;
  cursor: pointer;
  transition: background 0.18s, color 0.18s, border-color 0.18s;
}
.k-btn:hover { background: var(--kw-ink); color: var(--kw-bone); }
.k-btn--fill { background: var(--kw-ink); color: var(--kw-bone); }
.k-btn--fill:hover { background: var(--kw-terra); border-color: var(--kw-terra); }
.k-btn--terra { background: var(--kw-terra); border-color: var(--kw-terra); color: var(--kw-paper); }
.k-btn--terra:hover { background: var(--kw-terra-deep); border-color: var(--kw-terra-deep); }
.k-btns { display: flex; gap: 16px; flex-wrap: wrap; }

/* ==========================================================================
   FORM
   ========================================================================== */
.k-form { display: grid; grid-template-columns: 1fr 1fr; gap: 28px 28px; }
.k-form__field { display: flex; flex-direction: column; gap: 8px; }
.k-form__field--full { grid-column: 1 / -1; }
.k-form__label {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  opacity: 0.6;
}
.k-form input, .k-form select, .k-form textarea {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--kw-rule-strong);
  padding: 12px 0;
  font-size: 17px;
  letter-spacing: -0.005em;
  width: 100%;
  outline: none;
  transition: border-color 0.18s;
}
.k-form input:focus, .k-form textarea:focus, .k-form select:focus { border-bottom-color: var(--kw-terra); }
.k-form textarea { resize: vertical; min-height: 120px; }
@media (max-width: 700px) { .k-form { grid-template-columns: 1fr; } }

/* ==========================================================================
   QUOTE / PULL
   ========================================================================== */
.k-pull {
  font-size: clamp(28px, 4vw, 48px);
  line-height: 1.15;
  font-weight: 400;
  letter-spacing: -0.02em;
  max-width: 1100px;
}
.k-pull__attrib {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  margin-top: 28px;
  opacity: 0.55;
}

/* ==========================================================================
   PAGE-MARK utility (ID stamp top of page below nav)
   ========================================================================== */
/* Single inline mono line with terra-dot separators between spans
   (was a 3-cell flex space-between bar — read as utility chrome).
   Now reads as a slug. */
.k-pagemark {
  padding: 22px 0;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  opacity: 0.42;
  border-bottom: 1px solid var(--kw-rule);
  text-align: left;
}
.k-pagemark > span:not(:last-child)::after {
  content: " · ";
  color: var(--kw-terra);
  opacity: 0.7;
  margin: 0 6px;
}

/* ==========================================================================
   FEATURE LIST (used for spec)
   ========================================================================== */
.k-spec-list {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0;
  border-top: 1px solid var(--kw-rule);
}
.k-spec-list__row {
  display: grid;
  grid-template-columns: 1fr 1.4fr;
  gap: 24px;
  padding: 16px 0;
  border-bottom: 1px solid var(--kw-rule);
  align-items: baseline;
}
.k-spec-list__key {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  opacity: 0.55;
  /* Mono caps already align; opt in to tabular for any inline digits. */
  font-variant-numeric: tabular-nums lining-nums;
}
.k-spec-list__val {
  font-size: 15px;
  /* Numeric data (areas, dates, plate numbers) needs same-width digits
     so the right edge of the column behaves like a tide line. */
  font-variant-numeric: tabular-nums lining-nums;
  letter-spacing: -0.003em;
}
@media (max-width: 700px) {
  .k-spec-list { grid-template-columns: 1fr; }
  .k-spec-list__row { grid-template-columns: 1fr; gap: 6px; }
}

/* ==========================================================================
   SPACES GRID (used on Home + Spaces)
   ========================================================================== */
/* By the Room — same rounded-card system as the discipline cells:
   real gaps, 20px radius, depth, two-ended scrim, hover lift. */
.k-spaces-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(14px, 1.6vw, 22px);
}
.k-spaces-grid__cell {
  position: relative;
  overflow: hidden;
  isolation: isolate;
  min-height: clamp(320px, 27vw, 400px);
  padding: 30px;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  background: #14161a;
  border-radius: 20px;
  box-shadow: 0 22px 50px -34px rgba(20, 24, 30, 0.42);
}
.k-spaces-grid__img {
  position: absolute;
  inset: 0;
  z-index: 0;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  transform: scale(1.02);
  filter: saturate(0.97) contrast(1.02);
  transition: transform 1.15s cubic-bezier(.16,1,.3,1), filter .55s ease;
}
/* Two-ended scrim: a touch at the top for the index number, a deep
   foot for the title — matches the discipline cards' legibility. */
.k-spaces-grid__scrim {
  position: absolute;
  inset: 0;
  z-index: 1;
  background: linear-gradient(180deg,
    rgba(15,17,21,0.34) 0%,
    rgba(15,17,21,0.06) 22%,
    rgba(15,17,21,0.00) 44%,
    rgba(15,17,21,0.50) 72%,
    rgba(15,17,21,0.88) 100%);
  transition: opacity 0.5s ease;
}
.k-spaces-grid__cell:hover .k-spaces-grid__scrim,
.k-spaces-grid__cell:focus-visible .k-spaces-grid__scrim { opacity: 0.92; }
.k-spaces-grid__num {
  position: absolute;
  top: 26px;
  left: 30px;
  z-index: 2;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  color: #d8a6ab;
}
.k-spaces-grid__body { position: relative; z-index: 2; color: #fff; }
.k-spaces-grid__title {
  font-size: 26px;
  font-weight: 600;
  letter-spacing: -0.018em;
  line-height: 1.12;
  color: #fff;
  text-shadow: 0 2px 16px rgba(0,0,0,0.4);
  transition: transform .5s cubic-bezier(.16,1,.3,1);
}
.k-spaces-grid__meta {
  margin-top: 10px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.66);
}
.k-spaces-grid__go {
  display: inline-block;
  margin-top: 18px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: #d8a6ab;
  opacity: 0;
  transform: translateY(10px);
  transition: opacity .45s ease, transform .45s cubic-bezier(.16,1,.3,1);
}
.k-spaces-grid__cell:hover .k-spaces-grid__img,
.k-spaces-grid__cell:focus-visible .k-spaces-grid__img {
  transform: scale(1.08);
  filter: saturate(1) contrast(1.02);
}
.k-spaces-grid__cell:hover .k-spaces-grid__title,
.k-spaces-grid__cell:focus-visible .k-spaces-grid__title { transform: translateY(-3px); }
.k-spaces-grid__cell:hover .k-spaces-grid__go,
.k-spaces-grid__cell:focus-visible .k-spaces-grid__go { opacity: 1; transform: translateY(0); }
.k-spaces-grid__cell:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 3px; }
@media (max-width: 900px) { .k-spaces-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 500px) {
  .k-spaces-grid { grid-template-columns: 1fr; }
  .k-spaces-grid__cell { min-height: 300px; border-radius: 16px; }
}
@media (prefers-reduced-motion: reduce) {
  .k-spaces-grid__img,
  .k-spaces-grid__title,
  .k-spaces-grid__go { transition: none !important; transform: none !important; }
  .k-spaces-grid__img { filter: saturate(0.95) brightness(0.9); }
  .k-spaces-grid__go { opacity: 1; }
}

/* ==========================================================================
   THIN UTILS
   ========================================================================== */
.k-spacer-xs { height: 16px; }
.k-spacer-sm { height: 32px; }
.k-spacer-md { height: 56px; }
.k-spacer-lg { height: 96px; }
.k-flex { display: flex; }
.k-flex-col { display: flex; flex-direction: column; }
.k-gap-sm { gap: 16px; }
.k-gap-md { gap: 24px; }
.k-text-terra { color: var(--kw-terra); }
.k-text-mute { opacity: 0.7; }
.k-align-center { text-align: center; }

/* Monogram SVG inline drop-in */
.k-mark { display: block; }

/* Tags / chips — hairline rectangles with sharp corners (was pill, but
   border-radius: 999px reads SaaS-feature-grid; sharp keeps the atelier
   register). */
.k-tag {
  display: inline-flex;
  align-items: center;
  padding: 6px 12px;
  border: 1px solid var(--kw-rule-strong);
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  border-radius: 0;
}
.k-tags { display: flex; flex-wrap: wrap; gap: 8px; }

/* ==========================================================================
   COMPARISON — editorial two-column: KW vs. everyone else
   No borders between rows; rhythm is set by vertical gap and type.
   Terra accent appears ONLY on the KW side, and faintly.
   ========================================================================== */
.k-vs2 { margin-top: 56px; max-width: 1180px; }
.k-vs2__head {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: 64px;
  padding-bottom: 36px;
  border-bottom: 1px solid var(--kw-rule);
  margin-bottom: 56px;
}
.k-vs2__col { display: flex; flex-direction: column; gap: 18px; }
.k-vs2__tag { opacity: 0.55; }
.k-vs2__col--us .k-vs2__tag { color: var(--kw-terra); opacity: 0.85; }
.k-vs2__name {
  font-size: clamp(32px, 4.2vw, 56px);
  line-height: 0.96;
  letter-spacing: -0.028em;
  font-weight: 500;
  color: var(--kw-ink);
}
.k-vs2__them-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.k-vs2__them-list li { display: flex; flex-direction: column; gap: 4px; }
.k-vs2__them-list em {
  font-style: normal; font-weight: 500;
  font-size: 17px; letter-spacing: -0.012em;
  color: var(--kw-ink);
  opacity: 0.55;
  text-decoration: line-through;
  text-decoration-color: rgba(29,35,44,0.32);
  text-decoration-thickness: 1px;
}
.k-vs2__them-list .k-cap { opacity: 0.4; }

.k-vs2__rows { list-style: none; margin: 0; padding: 0; }
.k-vs2__row {
  display: grid;
  grid-template-columns: 200px 1.05fr 1fr;
  gap: 24px 64px;
  align-items: baseline;
  padding: 28px 0;
}
.k-vs2__row + .k-vs2__row { border-top: 1px solid rgba(29,35,44,0.06); }
.k-vs2__crit { opacity: 0.55; display: flex; align-items: baseline; gap: 14px; }
.k-vs2__num {
  display: inline-block;
  color: var(--kw-terra);
  opacity: 0.7;
  font-weight: 500;
}
.k-vs2__us {
  font-size: clamp(20px, 1.95vw, 26px);
  line-height: 1.28;
  letter-spacing: -0.014em;
  color: var(--kw-ink);
  font-weight: 400;
  margin: 0;
  position: relative;
  padding-left: 18px;
}
.k-vs2__us::before {
  content: "";
  position: absolute;
  left: 0; top: 0.45em;
  width: 3px; height: calc(100% - 0.5em);
  background: var(--kw-terra);
  opacity: 0.85;
  transform-origin: top;
  animation: k-vs2-rule 0.7s cubic-bezier(0.2,0.7,0.2,1) both;
}
@keyframes k-vs2-rule { from { transform: scaleY(0.001); } to { transform: scaleY(1); } }
.k-vs2__them {
  font-size: 15px;
  line-height: 1.55;
  color: var(--kw-ink);
  opacity: 0.62;
  margin: 0;
}
.k-vs2__note {
  margin-top: 48px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  opacity: 0.42;
  max-width: 780px;
  line-height: 1.75;
}

@media (max-width: 900px) {
  .k-vs2__head { grid-template-columns: 1fr; gap: 36px; padding-bottom: 28px; margin-bottom: 40px; }
  .k-vs2__row { grid-template-columns: 1fr; gap: 14px; padding: 24px 0; }
  .k-vs2__crit { order: 1; }
  .k-vs2__us { order: 2; padding-left: 14px; font-size: clamp(19px, 4.6vw, 24px); }
  .k-vs2__them { order: 3; font-size: 14.5px; }
  .k-vs2__name { font-size: clamp(30px, 8vw, 44px); }
}

@media (prefers-reduced-motion: reduce) {
  .k-vs2__us::before { animation: none; transform: scaleY(1); }
}

/* ==========================================================================
   MAKER'S MARK ON IMAGERY (injected by chrome.js on [data-mark])
   --patch   : embroidered workwear patch — the logo on the makers
   --stencil : faint shop-stencil — the logo on the work
   ========================================================================== */
.k-onmark { position: absolute; z-index: 3; pointer-events: none; }
.k-onmark svg { display: block; }

.k-onmark--patch {
  left: 14px;
  bottom: 14px;
  padding: 9px 11px;
  color: #f3efe9;
  background: rgba(18, 20, 24, 0.5);
  border: 1px dashed rgba(243, 239, 233, 0.5);
  border-radius: 3px;
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  box-shadow: 0 1px 0 rgba(243, 239, 233, 0.12), inset 0 0 0 1px rgba(18, 20, 24, 0.3);
}

.k-onmark--stencil {
  right: 20px;
  top: 20px;
  color: #ffffff;
  opacity: 0.17;
  mix-blend-mode: soft-light;
}
@media (max-width: 600px) {
  .k-onmark--patch { left: 10px; bottom: 10px; padding: 7px 9px; }
}

/* ==========================================================================
   THE PLANNER — "Begin your build" (design.html)
   ========================================================================== */
.k-plan { display: grid; grid-template-columns: 348px 1fr; gap: 48px; align-items: start; }
@media (max-width: 980px) { .k-plan { grid-template-columns: 1fr; } }

/* Stepper — the EasyClosets-inspired flow chrome above the planner.
   Five numbered stages spanning both columns. Sticky on desktop so
   the visitor always knows where they are in the sketch. */
.k-plan__steps {
  grid-column: 1 / -1;
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 1px;
  background: var(--kw-rule);
  border: 1px solid var(--kw-rule);
  margin-bottom: 32px;
  position: sticky; top: 0; z-index: 8;
}
.k-plan__step {
  display: flex; align-items: baseline; gap: 10px;
  padding: 16px 18px;
  background: var(--kw-bone);
  font-family: var(--kw-mono);
  font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.55;
  transition: opacity 0.18s, color 0.18s, background 0.18s;
  border-top: 2px solid transparent;
}
.k-plan__step:hover { opacity: 0.85; }
.k-plan__step.is-active {
  opacity: 1; border-top-color: var(--kw-terra);
  background: linear-gradient(to bottom, rgba(122,47,58,0.04), var(--kw-bone));
}
.k-plan__stepnum {
  font-weight: 600; font-size: 12px;
  color: var(--kw-terra); letter-spacing: 0.04em;
}
.k-plan__steplabel { font-size: 12px; letter-spacing: 0.18em; }
@media (max-width: 720px) {
  .k-plan__steps { grid-template-columns: repeat(5, 1fr); }
  .k-plan__step { padding: 12px 8px; flex-direction: column; align-items: flex-start; gap: 4px; }
  .k-plan__steplabel { font-size: 10px; letter-spacing: 0.12em; }
}

/* Stage head — the eyebrow that opens each numbered stage. */
.k-plan__stagehead {
  display: flex; align-items: baseline; gap: 12px;
  padding-bottom: 16px; margin-bottom: 22px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-plan__stagenum {
  font-family: var(--kw-mono); font-size: 22px; font-weight: 500;
  color: var(--kw-terra); letter-spacing: -0.02em; line-height: 1;
}
.k-plan__stagelabel {
  font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.22em;
  text-transform: uppercase; color: var(--kw-ink);
  align-self: center;
}
.k-plan__stagedek {
  margin-left: auto; font-family: var(--kw-mono); font-size: 10px;
  letter-spacing: 0.04em; opacity: 0.45; align-self: center;
}
.k-plan__sub { margin-bottom: 26px; }
.k-plan__sub:last-child { margin-bottom: 0; }

.k-plan__controls {
  display: flex;
  flex-direction: column;
  gap: 28px;
  border: 1px solid var(--kw-rule);
  padding: 32px;
}
.k-plan__group { display: flex; flex-direction: column; gap: 12px; }
.k-plan__label {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  opacity: 0.65;
  display: flex;
  justify-content: space-between;
}
.k-plan__label span { color: var(--kw-terra); opacity: 1; }
.k-plan__select {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--kw-rule-strong);
  padding: 10px 0;
  font-size: 16px;
  outline: none;
}
.k-plan__select:focus { border-bottom-color: var(--kw-terra); }

.k-plan__range { -webkit-appearance: none; appearance: none; width: 100%; height: 2px; background: var(--kw-rule-strong); outline: none; cursor: pointer; }
.k-plan__range::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; background: var(--kw-terra); border: 0; cursor: pointer; }
.k-plan__range::-moz-range-thumb { width: 16px; height: 16px; background: var(--kw-terra); border: 0; border-radius: 0; cursor: pointer; }
.k-plan__range:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 6px; }
.k-plan__scale {
  display: flex;
  justify-content: space-between;
  font-family: var(--kw-mono);
  font-size: 9px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  opacity: 0.4;
}

.k-plan__seg { display: flex; border: 1px solid var(--kw-rule-strong); }
.k-plan__seg label { flex: 1; position: relative; }
.k-plan__seg input { position: absolute; inset: 0; opacity: 0; cursor: pointer; }
.k-plan__seg span {
  display: block;
  text-align: center;
  padding: 11px 6px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  transition: background 0.15s, color 0.15s;
}
.k-plan__seg label + label span { border-left: 1px solid var(--kw-rule-strong); }
.k-plan__seg input:checked + span { background: var(--kw-ink); color: var(--kw-bone); }
.k-plan__seg input:focus-visible + span { outline: 2px solid var(--kw-terra); outline-offset: -2px; }

.k-plan__checks { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 16px; }
.k-plan__checks label { display: flex; align-items: center; gap: 9px; font-size: 14px; cursor: pointer; }
.k-plan__checks input { width: 15px; height: 15px; accent-color: var(--kw-terra); }
.k-plan__checks input:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 3px; }
.k-plan__select:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 2px; }

.k-plan__stage { display: flex; flex-direction: column; gap: 28px; }
.k-plan__drawwrap {
  position: relative;
  border: 1px solid var(--kw-rule);
  background-color: #fcfbf8;
  background-image:
    linear-gradient(rgba(29,35,44,0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(29,35,44,0.05) 1px, transparent 1px);
  background-size: 28px 28px;
  padding: 18px 20px 20px;
}
.k-plan__sheet {
  display: flex;
  justify-content: space-between;
  font-family: var(--kw-mono);
  font-size: 9px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  opacity: 0.5;
  margin-bottom: 12px;
  padding: 0 2px;
}
.k-plan__svg { display: block; width: 100%; height: auto; }
.k-plan__svg .pl-ink { fill: none; stroke: #1d232c; stroke-width: 2; vector-effect: non-scaling-stroke; }
.k-plan__svg .pl-frame { stroke-width: 3; }
.k-plan__svg .pl-faint { fill: none; stroke: #1d232c; stroke-opacity: 0.4; stroke-width: 1.5; vector-effect: non-scaling-stroke; }
.k-plan__svg .pl-dim { stroke: #7a2f3a; stroke-opacity: 0.55; stroke-width: 1; vector-effect: non-scaling-stroke; }
.k-plan__svg .pl-mark { fill: #7a2f3a; stroke: none; }
.k-plan__svg.is-redraw { animation: kw-plan-redraw 0.42s ease; }
@keyframes kw-plan-redraw { from { opacity: 0.4; } to { opacity: 1; } }

/* Planner — visual controls (wall colour, hardware, time of day, view) */
.k-plan__visual {
  display: flex;
  flex-direction: column;
  gap: 18px;
  padding: 18px 20px;
  border: 1px solid var(--kw-rule);
  background: #fcfbf8;
}
.k-plan__visual-row {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 28px;
  align-items: end;
}
@media (max-width: 720px) { .k-plan__visual-row { grid-template-columns: 1fr; gap: 16px; } }
.k-plan__visual-block { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
.k-plan__visual-block--wide { min-width: 240px; }
.k-plan__wallchips {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}
.k-plan__wallchip {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 4px 10px 4px 4px;
  border: 1px solid var(--kw-rule);
  background: transparent;
  cursor: pointer;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.72;
  transition: opacity 0.15s ease, border-color 0.15s ease;
}
.k-plan__wallchip:hover { opacity: 1; }
.k-plan__wallchip.is-active {
  opacity: 1;
  border-color: var(--kw-terra);
}
.k-plan__wallchip__chip {
  display: inline-block;
  width: 24px;
  height: 24px;
  border: 1px solid rgba(29,35,44,0.18);
}
.k-plan__seg--small span {
  padding: 8px 12px;
  font-size: 10px;
  letter-spacing: 0.10em;
}
@media (prefers-reduced-motion: reduce) {
  .k-plan__wallchip { transition: none; }
}

.k-plan__readout { display: grid; grid-template-columns: 1fr 1fr; gap: 32px 44px; align-items: start; }
@media (max-width: 620px) { .k-plan__readout { grid-template-columns: 1fr; } }
.k-plan__price { font-size: 38px; font-weight: 500; letter-spacing: -0.02em; line-height: 1.05; }
.k-plan__fine { margin-top: 14px; font-size: 12px; line-height: 1.6; opacity: 0.55; max-width: 380px; }
.k-plan__speclist { display: flex; flex-direction: column; }
.k-plan__specrow {
  display: grid;
  grid-template-columns: 124px 1fr;
  gap: 16px;
  padding: 11px 0;
  border-bottom: 1px solid var(--kw-rule);
  font-size: 14px;
}
.k-plan__specrow dt {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  opacity: 0.55;
  padding-top: 2px;
}
.k-plan__cta { grid-column: 1 / -1; display: flex; gap: 14px; flex-wrap: wrap; margin-top: 4px; }
@media (prefers-reduced-motion: reduce) {
  .k-plan__svg.is-redraw { animation: none; }
}
.k-plan__matnote {
  margin-top: 10px;
  font-size: 12.5px;
  line-height: 1.55;
  opacity: 0.7;
}

/* Paint picker — purveyor tabs, family chips, swatch grid. Only
   visible when the current material is a painted finish (see
   design.js). Six purveyors, eight families, ~60 real colours. */
.k-plan__paint {
  margin-top: 22px;
  padding-top: 22px;
  border-top: 1px dashed var(--kw-rule-strong);
}
.k-plan__paint[hidden] { display: none; }
.k-plan__paint-head {
  display: flex; justify-content: space-between; align-items: baseline;
  margin-bottom: 12px;
}
.k-plan__paint-clear {
  background: transparent; border: 0; padding: 4px 0;
  font-family: var(--kw-mono); font-size: 10px;
  letter-spacing: 0.14em; text-transform: uppercase;
  opacity: 0.55; cursor: pointer; color: var(--kw-ink);
}
.k-plan__paint-clear:hover { opacity: 1; }

.k-plan__paint-tabs {
  display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 12px;
}
.k-plan__paint-tab {
  padding: 6px 10px;
  background: transparent;
  border: 1px solid var(--kw-rule-strong);
  font-family: var(--kw-mono); font-size: 10px;
  letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.7;
  cursor: pointer; transition: opacity .15s, background .15s, color .15s;
}
.k-plan__paint-tab:hover { opacity: 1; }
.k-plan__paint-tab.is-active {
  background: var(--kw-ink); color: var(--kw-bone);
  border-color: var(--kw-ink); opacity: 1;
}

.k-plan__paint-families {
  display: flex; flex-wrap: wrap; gap: 2px 14px; margin-bottom: 14px;
}
.k-plan__paint-fam {
  padding: 4px 0 6px;
  background: transparent; border: 0;
  border-bottom: 1px solid transparent;
  font-family: var(--kw-mono); font-size: 10px;
  letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.5; cursor: pointer;
  transition: opacity .15s, border-color .15s;
}
.k-plan__paint-fam:hover { opacity: 0.85; }
.k-plan__paint-fam.is-active { opacity: 1; border-bottom-color: var(--kw-terra); }
.k-plan__paint-fam.is-empty { opacity: 0.18; pointer-events: none; }

.k-plan__paint-grid {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 6px; margin-bottom: 14px;
}
@media (max-width: 980px) {
  .k-plan__paint-grid { grid-template-columns: repeat(3, 1fr); }
}
.k-plan__sx {
  display: flex; flex-direction: column;
  cursor: pointer;
  border: 1px solid var(--kw-rule);
  overflow: hidden;
  background: var(--kw-bone);
  transition: transform .15s ease, border-color .15s ease;
}
.k-plan__sx:hover { transform: translateY(-1px); border-color: var(--kw-rule-strong); }
.k-plan__sx.is-active {
  border-color: var(--kw-terra);
  outline: 2px solid var(--kw-terra);
  outline-offset: -3px;
}
.k-plan__sx__chip { display: block; aspect-ratio: 1.4 / 1; }
.k-plan__sx__meta { padding: 6px 8px 8px; }
.k-plan__sx__name {
  display: block; font-size: 11px; line-height: 1.3; color: var(--kw-ink);
}
.k-plan__sx__code {
  display: block; margin-top: 2px;
  font-family: var(--kw-mono); font-size: 9px;
  letter-spacing: 0.08em; opacity: 0.5;
}
.k-plan__paint-empty {
  grid-column: 1 / -1;
  padding: 20px 0; font-family: var(--kw-mono); font-size: 10px;
  letter-spacing: 0.12em; text-transform: uppercase;
  opacity: 0.5; text-align: center;
}

.k-plan__paint-current {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; margin-top: 4px; margin-bottom: 10px;
  border: 1px solid var(--kw-rule-strong);
}
.k-plan__paint-current[hidden] { display: none; }
.k-plan__paint-current-chip {
  display: inline-block; width: 28px; height: 28px;
  border: 1px solid rgba(0,0,0,0.2);
}
.k-plan__paint-current-text { display: flex; flex-direction: column; }
.k-plan__paint-current-name { font-size: 14px; line-height: 1.2; color: var(--kw-ink); }
.k-plan__paint-current-meta {
  margin-top: 2px;
  font-family: var(--kw-mono); font-size: 10px;
  letter-spacing: 0.08em; opacity: 0.55;
}
/* Live material swatch — the true colour the sketch renders in. */
.k-plan__swatch {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-top: 14px;
}
.k-plan__swatch-chip {
  width: 46px;
  height: 46px;
  flex: none;
  border: 1px solid var(--kw-rule-strong);
  background: #cdab7a;
  transition: background .45s ease;
}
.k-plan__swatch-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.k-plan__swatch-name {
  font-family: var(--kw-sans);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: -0.006em;
  color: var(--kw-ink);
}
.k-plan__swatch-origin {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
}
@media (prefers-reduced-motion: reduce) {
  .k-plan__swatch-chip { transition: none; }
}

/* ==========================================================================
   SCROLL REVEAL — subtle rise/fade as blocks enter. chrome.js adds
   html.kw-anim only when motion is allowed, so without JS or under
   reduced-motion everything is simply visible (no content is hidden).
   ========================================================================== */
html.kw-anim .kw-rv {
  opacity: 0;
  transform: translateY(18px);
  transition: opacity 0.75s cubic-bezier(.16,1,.3,1), transform 0.75s cubic-bezier(.16,1,.3,1);
  /* will-change only while the block is still pre-reveal — chrome.js
     drops it inline via transitionend after the reveal completes, so
     we don't leave composite layers piled up on a long scroll. */
  will-change: opacity, transform;
}
html.kw-anim .kw-rv.kw-rv--in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  html.kw-anim .kw-rv { opacity: 1; transform: none; transition: none; will-change: auto; }
}

/* ==========================================================================
   MATERIALS FAMILY MOBILE CADENCE (2026-05-28).
   --------------------------------------------------------------------------
   The six family sections (Solid timber / Veneer / Finish / Stone / Metal /
   Leather) alternate image-left and image-right on desktop via .k-grid--2.
   On mobile they stacked as image-then-text six times — read as a default
   Tailwind stack. Demote the image to a slim 16:7 landscape "ribbon" so
   the rhythm reads editorial, not cards.
   ========================================================================== */
@media (max-width: 768px) {
  body[data-page="materials"] section[data-screen-label^="Materials · "] .k-grid--2 .k-img--4x3 {
    aspect-ratio: 16 / 7;
    margin-bottom: 8px;
  }
}

/* ==========================================================================
   EDITORIAL INDEX — sidebar register replacing 3-card "Adjacent reading"
   footers (2026-05-28). A numbered list with Roman counters, hairline
   rules, and a single arrow per row. Reads as a book's table of
   contents, not a CMS related-posts grid.
   ========================================================================== */
.k-index {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 920px;
}
.k-index__item {
  border-top: 1px solid var(--kw-rule-strong);
}
.k-index__item:last-child {
  border-bottom: 1px solid var(--kw-rule-strong);
}
.k-index__link {
  display: grid;
  grid-template-columns: 80px 1fr 40px;
  gap: 28px;
  align-items: baseline;
  padding: 28px 0;
  text-decoration: none;
  color: var(--kw-ink);
  transition: color 0.32s ease;
}
.k-index__link:hover {
  color: var(--kw-terra);
}
.k-index__num {
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--kw-terra);
  opacity: 0.86;
}
.k-index__body {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.k-index__h {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-style: normal;
  font-size: clamp(22px, 2vw, 30px);
  line-height: 1.15;
  letter-spacing: -0.008em;
  color: var(--kw-ink);
}
.k-index__dek {
  font-family: var(--kw-sans);
  font-size: 15px;
  line-height: 1.5;
  color: var(--kw-ink);
  opacity: 0.66;
  max-width: 680px;
}
.k-index__arrow {
  font-family: var(--kw-mono);
  font-size: 18px;
  color: var(--kw-ink);
  opacity: 0.36;
  text-align: right;
  align-self: center;
  transition: transform 0.32s cubic-bezier(.16,1,.3,1), opacity 0.32s, color 0.32s;
}
.k-index__link:hover .k-index__arrow {
  transform: translateX(6px);
  opacity: 1;
  color: var(--kw-terra);
}
@media (max-width: 760px) {
  .k-index__link {
    grid-template-columns: 56px 1fr 28px;
    gap: 18px;
    padding: 22px 0;
  }
  .k-index__h { font-size: 19px; }
  .k-index__dek { font-size: 14px; }
}

/* ==========================================================================
   FEATURED SPACES PORTRAIT TRIO — tylko-feel cards (2026-05-28).
   --------------------------------------------------------------------------
   4:5 portrait tile + one editorial "neighborhood · year" caption.
   No bordered card chrome, no separate title row, no dek paragraph —
   the image is the title, the caption is the slug.
   ========================================================================== */
.k-projects--trio {
  margin: 0;
}
.k-projects__tile {
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: inherit;
  position: relative;
  overflow: hidden;
}
.k-projects__tile-img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 5;
  background-size: cover;
  background-position: center;
  margin: 0 0 18px;
  overflow: hidden;
  background-color: var(--kw-ink);
  transition: transform 0.7s cubic-bezier(.16,1,.3,1);
}
.k-projects__tile:hover .k-projects__tile-img {
  transform: scale(1.03);
}
.k-projects__tile-cap {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.7;
  transition: opacity 0.32s, color 0.32s;
}
.k-projects__tile:hover .k-projects__tile-cap {
  opacity: 1;
  color: var(--kw-terra);
}
@media (max-width: 760px) {
  .k-projects--trio { gap: 32px !important; grid-template-columns: 1fr !important; }
  .k-projects__tile-img { aspect-ratio: 4 / 3; }
  .k-projects__tile-cap { font-size: 10.5px; letter-spacing: 0.2em; }
}

/* ==========================================================================
   BEFORE / AFTER — paired-claims compare register (2026-05-28).
   --------------------------------------------------------------------------
   Four pairs of statements: builder-grade (left, dimmed) vs Kloset Worx
   (right, terra-warmed). Heyoasis pattern of cumulative typographic proof —
   the visitor reads down the four pairs and builds a mental case. No
   photos; the claims carry it.
   ========================================================================== */
.k-vs-compare { background: var(--kw-bone); }
.k-vs-compare__list {
  list-style: none; margin: 0; padding: 0;
}
.k-vs-compare__pair {
  display: grid;
  grid-template-columns: 80px 1fr 1fr;
  gap: 40px 64px;
  align-items: start;
  padding: 56px 0;
  border-top: 1px solid var(--kw-rule-strong);
}
.k-vs-compare__pair:last-child { border-bottom: 1px solid var(--kw-rule-strong); }
.k-vs-compare__num {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--kw-terra);
  padding-top: 8px;
}
.k-vs-compare__col {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.k-vs-compare__label {
  font-size: 10.5px;
  letter-spacing: 0.26em;
}
.k-vs-compare__col p {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-style: normal;
  font-size: clamp(20px, 2.2vw, 32px);
  line-height: 1.18;
  letter-spacing: -0.008em;
  color: var(--kw-ink);
  margin: 0;
  text-wrap: balance;
}
.k-vs-compare__col--bad p {
  opacity: 0.42;
  font-style: normal;
  font-family: var(--kw-sans);
  font-weight: 400;
}
.k-vs-compare__col--good p .k-dot { color: var(--kw-terra); }

@media (max-width: 760px) {
  .k-vs-compare__pair {
    grid-template-columns: 1fr;
    gap: 22px;
    padding: 40px 0;
  }
  .k-vs-compare__num { padding-top: 0; }
  .k-vs-compare__col p { font-size: clamp(18px, 5vw, 24px); }
}

/* ==========================================================================
   PROMISE BAND — single-sentence proof band (2026-05-28).
   --------------------------------------------------------------------------
   A 60vh-tall band carrying one display-scale guarantee sentence. Bone-2
   ground, hairline rules above/below, terra dot, mono caps eye + foot.
   The final declarative proof before the trade close.
   ========================================================================== */
.k-promise {
  background: var(--kw-bone-2);
  border-top: 1px solid var(--kw-rule-strong);
  border-bottom: 1px solid var(--kw-rule-strong);
  padding: clamp(96px, 14vh, 184px) 0;
}
.k-promise__inner {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 32px;
}
.k-promise__eye { letter-spacing: 0.34em; opacity: 0.86; }
.k-promise__line {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-style: normal;
  font-size: clamp(48px, 7.4vw, 124px);
  line-height: 1.0;
  letter-spacing: -0.014em;
  color: var(--kw-ink);
  margin: 0;
  max-width: 22ch;
  text-wrap: balance;
}
.k-promise__line .k-dot { color: var(--kw-terra); }
.k-promise__foot {
  letter-spacing: 0.24em;
  opacity: 0.55;
  font-size: 11px;
}
@media (max-width: 760px) {
  .k-promise__line { font-size: clamp(36px, 9vw, 64px); }
  .k-promise__eye, .k-promise__foot { font-size: 10px; letter-spacing: 0.22em; }
}

/* ==========================================================================
   STICKY CTA — heyoasis-feel persistent reach (2026-05-28).
   --------------------------------------------------------------------------
   Materializes (fades + slides in from below) after the hero exits view,
   so the visitor always has a one-tap path to schedule a consultation.
   Hides again at the footer so it doesn't overlap the final close.
   ========================================================================== */
.k-sticky-cta {
  position: fixed;
  bottom: 28px;
  right: 28px;
  z-index: 80;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 18px 28px;
  font-family: var(--kw-mono);
  font-size: 11.5px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--kw-paper);
  background: var(--kw-terra);
  box-shadow: 0 12px 32px rgba(122, 47, 58, 0.36);
  text-decoration: none;
  opacity: 0;
  transform: translateY(20px);
  pointer-events: none;
  transition: opacity 0.42s cubic-bezier(.16,1,.3,1),
              transform 0.42s cubic-bezier(.16,1,.3,1),
              background 0.24s ease, box-shadow 0.24s ease;
}
.k-sticky-cta--show {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}
.k-sticky-cta--hide-at-foot {
  opacity: 0;
  transform: translateY(20px);
  pointer-events: none;
}
.k-sticky-cta:hover {
  background: var(--kw-terra-deep);
  box-shadow: 0 16px 40px rgba(94, 34, 44, 0.5);
}
.k-sticky-cta__arrow {
  font-family: var(--kw-mono);
  letter-spacing: 0;
  font-size: 14px;
  transition: transform 0.32s cubic-bezier(.16,1,.3,1);
}
.k-sticky-cta:hover .k-sticky-cta__arrow { transform: translateX(4px); }
@media (max-width: 600px) {
  .k-sticky-cta {
    bottom: 16px;
    right: 16px;
    padding: 14px 20px;
    font-size: 10.5px;
    letter-spacing: 0.2em;
  }
}
@media (prefers-reduced-motion: reduce) {
  .k-sticky-cta { transition: opacity 0.2s ease; transform: none; }
  .k-sticky-cta--show { transform: none; }
}

/* ==========================================================================
   SCROLL-DRIVEN CINEMA — heyoasis-feel interaction layer (2026-05-28).
   --------------------------------------------------------------------------
   Modern CSS scroll-timeline animations: hero photo translates upward as
   the viewport scrolls past it (parallax depth); chapter headings pin
   against the top of the viewport while their section's content rolls;
   the cinematic break section scales the photo subtly as it enters and
   exits view. All progressive: browsers without scroll-timeline see the
   site exactly as it was. No JS layer added — pure CSS modern animation.
   ========================================================================== */

/* Hero parallax REMOVED (2026-05-29). The scroll-linked
   animation-timeline parallax on the hero photograph compounded with
   the video's baked-in motion and, because view() timelines run on
   the main thread, desynced from threaded scrolling on mobile — it
   read as the hero "shaking." The hero is now a steady film; depth
   comes from the footage itself, not a scroll transform. */

/* Sticky chapter headings: when a chapter header enters the viewport,
   it pins against the nav for the duration of its parent section, so
   the visitor reads the chapter title alongside the scrolling content
   beneath it. The .k-chapter motif already has the right structure;
   just give it a sticky top. */
@supports (position: sticky) {
  .k-chapter {
    position: sticky;
    top: 80px;
    z-index: 5;
    /* Background block behind the sticky chapter so content scrolling
       underneath doesn't bleed through. Uses backdrop-filter for a
       subtle glass effect — falls back to a solid bone if unsupported. */
    background: var(--kw-paper);
    background: rgba(255, 255, 255, 0.92);
    backdrop-filter: blur(8px) saturate(1.04);
    -webkit-backdrop-filter: blur(8px) saturate(1.04);
    padding: 24px 0 18px;
    border-bottom: 1px solid var(--kw-rule);
    /* Margin baseline so the chapter sits just above the content it
       leads, separated by the rule rather than by gap. */
    margin-bottom: 48px;
  }
  /* Chapters inside paper / bone-2 sections — keep the sticky pane
     consistent with the section background so the glass blends. */
  .k-section--paper .k-chapter,
  .k-section .k-chapter {
    background: rgba(255, 255, 255, 0.94);
  }
  .k-mat-band .k-chapter {
    background: rgba(255, 255, 255, 0.96);
  }
  @media (max-width: 760px) {
    .k-chapter {
      top: 68px;
      padding: 18px 0 14px;
      margin-bottom: 36px;
    }
  }
}
/* Disable sticky chapters under reduced motion — pinned content is
   motion-coded for some vestibular-sensitive visitors. */
@media (prefers-reduced-motion: reduce) {
  .k-chapter { position: static !important; }
}

/* Scroll-revealed bleed band: as the cinematic break enters view, the
   photograph scales from 1.04 -> 1.08 over the section's scroll range.
   Adds momentum to the section that's otherwise just a static photo. */
@supports (animation-timeline: view()) {
  .k-bleed__img {
    animation: kw-bleed-scroll-scale linear;
    animation-timeline: view();
    animation-range: entry 0% exit 100%;
  }
  @keyframes kw-bleed-scroll-scale {
    from { transform: translate3d(0, 0, 0) scale(1.04); }
    50%  { transform: translate3d(-0.3%, -0.2%, 0) scale(1.08); }
    to   { transform: translate3d(-0.6%, -0.4%, 0) scale(1.10); }
  }
}

/* Featured Spaces lead-spread parallax: as the visitor scrolls past
   the full-bleed feature project, the image translates slightly faster
   than the page beneath, mirroring the hero treatment. */
@supports (animation-timeline: view()) {
  .k-projects__lead-img {
    animation: kw-feature-parallax linear;
    animation-timeline: view();
    animation-range: entry 0% exit 100%;
  }
  @keyframes kw-feature-parallax {
    from { transform: translate3d(0, 0, 0) scale(1.0); }
    to   { transform: translate3d(0, -6%, 0) scale(1.06); }
  }
}

/* Editorial gallery — each figure scales subtly as it enters view, so
   scrolling through the masonry feels like leafing through a magazine
   rather than scrolling a static grid. */
@supports (animation-timeline: view()) {
  .k-section[data-screen-label="Home · Gallery"] figure.k-img {
    animation: kw-gallery-tile linear;
    animation-timeline: view();
    animation-range: entry 0% cover 50%;
  }
  @keyframes kw-gallery-tile {
    from { transform: scale(0.96); opacity: 0.5; }
    to   { transform: scale(1.0);  opacity: 1; }
  }
}

/* ==========================================================================
   MOBILE SCROLL PERFORMANCE
   --------------------------------------------------------------------------
   Three small wins applied at narrow viewports and on coarse pointers
   (touch). Tested against a long iOS Safari home-scroll: the three
   together take the page from "fights the scroll" to "ride-along."
   ========================================================================== */

/* (1) backdrop-filter blur is genuinely expensive on mobile GPUs —
   each scroll tick triggers a re-blur of whatever is behind the fixed
   element. Disable on narrow viewports; the visual cost is one less
   layer of glassiness on the concierge pill and one ghost button
   variant in the legacy hero CSS. */
@media (max-width: 820px) {
  .k-cc-launch,
  .k-hero-cinema .k-btn {
    -webkit-backdrop-filter: none !important;
            backdrop-filter: none !important;
  }
  /* Keep the concierge pill readable without the glass effect. */
  .k-cc-launch { background: rgba(255, 255, 255, 0.96); }
}

/* (2) content-visibility lets the browser skip layout + paint for
   sections that are well below the fold. We scope it to the homepage
   sections that are unlikely to be the initial scroll target. The
   contain-intrinsic-size keeps a sensible reserved height so the
   scrollbar doesn't jitter as content paints in. Modern Chromium +
   WebKit support it; older browsers ignore it cleanly. */
@supports (content-visibility: auto) {
  main > section.k-section,
  main > section.k-section--paper {
    content-visibility: auto;
    contain-intrinsic-size: 1px 1200px;
  }
}

/* (3) Cap background-image rendering work for the cards on mobile —
   the browser still has to decode the same source, but if the layout
   only shows a 380 px-wide tile, we let the GPU sample it at a more
   reasonable size. (Most of our figures use cover/center which means
   the same source is used everywhere; this directive is harmless on
   desktop and modestly helpful on phones.) */
@media (max-width: 760px) {
  .k-img--photo,
  .k-spaces-grid__img,
  .k-foot__mark img {
    image-rendering: auto;
  }
}

/* Planner — band note + full breakdown + change pulse */
.k-plan__bandnote {
  margin-top: 10px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.06em;
  line-height: 1.6;
  opacity: 0.6;
  max-width: 400px;
}
.k-plan__price { transition: color 0.2s ease; }
.k-plan__price.is-bump { animation: kw-bump 0.5s ease; }
@keyframes kw-bump {
  0% { transform: translateY(0); }
  35% { color: var(--kw-terra); transform: translateY(-2px); }
  100% { transform: translateY(0); }
}
.k-plan__breakdown { grid-column: 1 / -1; }
.k-plan__bd { display: flex; flex-direction: column; }
.k-plan__bdrow {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 20px;
  padding: 9px 0;
  border-bottom: 1px solid var(--kw-rule);
  font-size: 14px;
}
.k-plan__bdrow dt { opacity: 0.68; }
.k-plan__bdrow dd { font-variant-numeric: tabular-nums; white-space: nowrap; }
.k-plan__bdrow--sum dt, .k-plan__bdrow--sum dd,
.k-plan__bdrow--total dt, .k-plan__bdrow--total dd { font-weight: 500; opacity: 1; }
.k-plan__bdrow--total { border-bottom-width: 2px; border-bottom-color: var(--kw-rule-strong); }
.k-plan__bdrow--range { border-bottom: 0; padding-top: 16px; align-items: center; }
.k-plan__bdrow--range dt {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  opacity: 0.55;
}
.k-plan__bdrow--range dd { font-size: 22px; font-weight: 500; letter-spacing: -0.01em; color: var(--kw-terra); }
@media (prefers-reduced-motion: reduce) {
  .k-plan__price.is-bump { animation: none; }
}

/* ==========================================================================
   ATELIER CONCIERGE (injected by chrome.js)
   ========================================================================== */
/* CONCIERGE launch — restrained, concierge not e-commerce. A terra
   hairline ring with the brand mark only; the label fades in and
   expands the pill on hover and on keyboard focus. */
.k-cc-launch {
  position: fixed;
  right: 32px;
  bottom: 32px;
  z-index: 120;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* No gap until label appears — keeps the resting state perfectly
     square around the mark. Minimum 44x44 tap-target for WCAG 2.5.5
     AA on touch devices. */
  gap: 0;
  padding: 14px;
  min-width: 48px;
  min-height: 48px;
  background: rgba(255, 255, 255, 0.86);
  -webkit-backdrop-filter: saturate(140%) blur(8px);
  backdrop-filter: saturate(140%) blur(8px);
  color: var(--kw-terra);
  border: 1px solid var(--kw-terra);
  cursor: pointer;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  /* Soft, considered shadow — not a CTA drop-shadow, but the way a
     calling card sits on a marble counter. */
  box-shadow: 0 1px 1px rgba(20, 22, 26, 0.04), 0 8px 24px rgba(122, 47, 58, 0.08);
  transition:
    gap 0.32s cubic-bezier(.16,1,.3,1),
    padding 0.32s cubic-bezier(.16,1,.3,1),
    background 0.22s ease,
    color 0.22s ease,
    border-color 0.22s ease,
    box-shadow 0.22s ease;
}
/* Label is rendered by chrome.js as a <span> next to the mark; we
   compress it to zero width when at rest and reveal it on hover/focus. */
.k-cc-launch > span:not(.k-cc-launch__mark) {
  display: inline-block;
  max-width: 0;
  overflow: hidden;
  white-space: nowrap;
  opacity: 0;
  transform: translateX(-4px);
  transition:
    max-width 0.36s cubic-bezier(.16,1,.3,1),
    opacity 0.24s ease,
    transform 0.32s cubic-bezier(.16,1,.3,1);
}
.k-cc-launch:hover,
.k-cc-launch:focus-visible,
.k-cc-launch[aria-expanded="true"] {
  gap: 10px;
  padding: 12px 18px 12px 14px;
  background: var(--kw-terra);
  color: var(--kw-paper);
  border-color: var(--kw-terra);
  box-shadow: 0 2px 2px rgba(20, 22, 26, 0.06), 0 12px 32px rgba(122, 47, 58, 0.20);
}
.k-cc-launch:hover > span:not(.k-cc-launch__mark),
.k-cc-launch:focus-visible > span:not(.k-cc-launch__mark),
.k-cc-launch[aria-expanded="true"] > span:not(.k-cc-launch__mark) {
  max-width: 160px;
  opacity: 1;
  transform: translateX(0);
}
.k-cc-launch:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 4px; }
.k-cc-launch__mark { display: flex; color: currentColor; }

.k-cc {
  position: fixed;
  right: 28px;
  bottom: 92px;
  z-index: 130;
  width: 384px;
  max-width: calc(100vw - 40px);
  height: 560px;
  max-height: calc(100vh - 132px);
  display: flex;
  flex-direction: column;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule-strong);
  box-shadow: 0 24px 60px rgba(20, 22, 26, 0.30);
  opacity: 0;
  visibility: hidden;
  transform: translateY(14px) scale(0.99);
  transform-origin: bottom right;
  transition: opacity 0.26s ease, transform 0.3s cubic-bezier(.16,1,.3,1), visibility 0s linear 0.3s;
}
.k-cc.is-open { opacity: 1; visibility: visible; transform: none; transition: opacity 0.26s ease, transform 0.32s cubic-bezier(.16,1,.3,1); }
.k-cc__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 16px 18px;
  background: var(--kw-ink);
  color: var(--kw-bone);
}
.k-cc__title { font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; }
.k-cc__x { background: transparent; border: 0; color: var(--kw-bone); font-size: 22px; line-height: 1; cursor: pointer; padding: 0 4px; opacity: 0.8; }
.k-cc__x:hover { opacity: 1; }
.k-cc__log { flex: 1; overflow-y: auto; padding: 20px 18px; display: flex; flex-direction: column; gap: 14px; }
.k-cc-msg { max-width: 86%; font-size: 14px; line-height: 1.55; }
.k-cc-msg p { margin: 0; }
.k-cc-msg--bot { align-self: flex-start; }
.k-cc-msg--bot > p { background: #fff; border: 1px solid var(--kw-rule); padding: 12px 14px; }
.k-cc-msg--you { align-self: flex-end; }
.k-cc-msg--you > p { background: var(--kw-ink); color: var(--kw-bone); padding: 12px 14px; }
.k-cc-typing { opacity: 0.5; letter-spacing: 0.3em; padding: 6px 2px; }
.k-cc-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.k-cc-act {
  display: inline-block;
  padding: 8px 12px;
  border: 1px solid var(--kw-rule-strong);
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  transition: background 0.16s, color 0.16s;
}
.k-cc-act:hover { background: var(--kw-ink); color: var(--kw-bone); border-color: var(--kw-ink); }
.k-cc__chips { display: flex; flex-wrap: wrap; gap: 8px; padding: 0 18px 12px; }
.k-cc-chip {
  background: transparent;
  border: 1px solid var(--kw-rule);
  cursor: pointer;
  padding: 8px 12px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  transition: border-color 0.16s, color 0.16s;
}
.k-cc-chip:hover { border-color: var(--kw-terra); color: var(--kw-terra); }
.k-cc__form { display: flex; border-top: 1px solid var(--kw-rule); }
.k-cc__form input {
  flex: 1;
  border: 0;
  background: transparent;
  padding: 16px 18px;
  font-size: 15px;
  outline: none;
}
.k-cc__send { background: transparent; border: 0; cursor: pointer; padding: 0 20px; font-size: 18px; color: var(--kw-terra); }
.k-cc__send:hover { color: var(--kw-terra-deep); }
@media (max-width: 520px) {
  /* On small screens hold the resting state — the label expansion is
     a desktop affordance; tap surface stays a clean ring. */
  .k-cc-launch { right: 18px; bottom: 18px; padding: 11px; }
  .k-cc-launch:hover,
  .k-cc-launch:focus-visible,
  .k-cc-launch[aria-expanded="true"] { padding: 11px; gap: 0; }
  .k-cc-launch > span:not(.k-cc-launch__mark) { display: none; }
  .k-cc { right: 12px; left: 12px; bottom: 76px; width: auto; max-width: none; height: 70vh; }
}
@media (prefers-reduced-motion: reduce) {
  .k-cc, .k-cc.is-open, .k-cc-launch { transition: none; }
  .k-cc { transform: none; }
}

/* ---------------------------------------------------------------------
   THE SHOP TRIAD — calm at rest, interactive on hover / keyboard focus.
   Cells are real links into the method; a hairline rule draws, a line of
   copy opens, and an index strengthens. Entrance staggers off the
   section's own .kw-rv--in reveal state (no extra JS).
   ------------------------------------------------------------------- */
.k-triad {
  margin-top: 56px;
  display: grid;
  /* Two-card layout while the Installed cell waits on real imagery. When
     the third cell returns, switch back to repeat(3, 1fr). */
  grid-template-columns: repeat(2, 1fr);
  gap: 1px;
  background: var(--kw-rule);
  border: 1px solid var(--kw-rule);
}
.k-triad__cell {
  position: relative;
  display: block;
  background: #fff;
  padding: 34px 30px 30px;
  text-decoration: none;
  color: inherit;
  overflow: hidden;
  transition: background .5s ease;
}
.k-triad__idx {
  position: absolute;
  top: 22px; right: 26px;
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.16em;
  color: var(--kw-rule-strong);
  transition: color .45s ease, transform .45s ease;
}
.k-triad__kicker { display: block; margin-bottom: 14px; }
.k-triad__h {
  display: block;
  font-size: 22px;
  line-height: 1.2;
  font-weight: 500;
  letter-spacing: -0.01em;
  color: var(--kw-ink);
}
.k-triad__h::after {
  content: "";
  display: block;
  height: 1px;
  margin-top: 16px;
  background: var(--kw-terra);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .55s cubic-bezier(.2,.7,.2,1);
}
.k-triad__note {
  display: block;
  margin-top: 14px;
  opacity: 0.55;
  font-family: var(--kw-sans);
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--kw-ink);
  transition: opacity .45s ease;
}
.k-triad__go {
  display: inline-block;
  margin-top: 18px;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-terra);
  opacity: 0;
  transform: translateY(6px);
  transition: opacity .4s ease, transform .4s ease;
}
.k-triad__cell:hover,
.k-triad__cell:focus-visible {
  background: rgba(122, 47, 58, 0.045);
  outline: none;
}
.k-triad__cell:hover .k-triad__idx,
.k-triad__cell:focus-visible .k-triad__idx { color: var(--kw-terra); }
.k-triad__cell:hover .k-triad__h::after,
.k-triad__cell:focus-visible .k-triad__h::after { transform: scaleX(1); }
.k-triad__cell:hover .k-triad__note,
.k-triad__cell:focus-visible .k-triad__note { opacity: 0.82; }
.k-triad__cell:hover .k-triad__go,
.k-triad__cell:focus-visible .k-triad__go { opacity: 1; transform: none; }
.k-triad__cell:focus-visible { box-shadow: inset 0 0 0 2px var(--kw-terra); }

/* A precision spec chip per cell — a precise number with a tiny
   caption underneath, set in the brand mono. Replaced the earlier
   self-drawing motif: the spec gives readers something to remember.
   Number is large, tabular-nums (so the alignment holds across the
   three cards), with a thin terra rule that scales in on hover. */
.k-triad__spec {
  display: block;
  margin-top: 28px;
  padding-top: 18px;
  border-top: 1px solid var(--kw-rule);
  position: relative;
}
.k-triad__spec::before {
  content: "";
  position: absolute;
  top: -1px; left: 0;
  width: 36px;
  height: 1px;
  background: var(--kw-terra);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .55s cubic-bezier(.2,.7,.2,1) .05s, width .55s ease;
}
.k-triad__spec-num {
  display: block;
  font-family: var(--kw-mono);
  font-feature-settings: "tnum" 1, "lnum" 1;
  font-size: 34px;
  line-height: 1;
  letter-spacing: -0.015em;
  color: var(--kw-ink);
  font-weight: 500;
}
.k-triad__spec-unit {
  font-size: 0.6em;
  letter-spacing: 0.04em;
  color: var(--kw-ink-2);
  font-weight: 400;
}
.k-triad__spec-cap {
  display: block;
  margin-top: 10px;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-rule-strong);
}
.k-triad__cell:hover .k-triad__spec::before,
.k-triad__cell:focus-visible .k-triad__spec::before { transform: scaleX(1); width: 56px; }
.k-triad__cell:hover .k-triad__spec-cap,
.k-triad__cell:focus-visible .k-triad__spec-cap { color: var(--kw-ink-2); }

/* Legacy line-art motif — retained as dead-code styling for any older
   triad markup that might still ship the .k-triad__art span. Safe to
   keep; safe to remove on a future cleanup pass. */
.k-triad__art { display: block; margin-top: 26px; color: var(--kw-ink); }
.k-triad__art svg {
  width: 172px;
  height: auto;
  opacity: 0.5;
  overflow: visible;
  shape-rendering: geometricPrecision;
  transition: transform .6s cubic-bezier(.2,.7,.2,1);
}
.k-triad__art .a { stroke: var(--kw-terra); }
.k-triad__art .sh { transform-box: fill-box; transform-origin: right center; }
.k-triad__cell:hover .k-triad__art svg,
.k-triad__cell:focus-visible .k-triad__art svg { transform: scale(1.035); }

/* A short looping "run" per category — vector, so it stays crisp on a
   4K / Retina display at any size. Each motif draws itself, the
   mechanism works, it holds, then redraws; the three are desynced so
   the strip feels alive. Only when motion is allowed (chrome.js sets
   html.kw-anim); otherwise the motif is simply present, fully drawn. */
html.kw-anim .k-triad__art .d {
  stroke-dasharray: 1;
  animation: kw-run-draw 9s ease-in-out infinite;
}
html.kw-anim .k-triad__art svg {
  animation: kw-run-fade 9s ease-in-out infinite;
}
html.kw-anim .k-triad__art .sh {
  animation: kw-run-shave 9s ease-in-out infinite;
}
html.kw-anim .k-triad__cell:nth-child(2) .k-triad__art .d,
html.kw-anim .k-triad__cell:nth-child(2) .k-triad__art svg,
html.kw-anim .k-triad__cell:nth-child(2) .k-triad__art .sh { animation-delay: -3s; }
html.kw-anim .k-triad__cell:nth-child(3) .k-triad__art .d,
html.kw-anim .k-triad__cell:nth-child(3) .k-triad__art svg,
html.kw-anim .k-triad__cell:nth-child(3) .k-triad__art .sh { animation-delay: -6s; }
.k-triad__cell:hover .k-triad__art .d,
.k-triad__cell:hover .k-triad__art svg,
.k-triad__cell:hover .k-triad__art .sh,
.k-triad__cell:focus-within .k-triad__art .d,
.k-triad__cell:focus-within .k-triad__art svg,
.k-triad__cell:focus-within .k-triad__art .sh { animation-play-state: paused; }
@keyframes kw-run-draw {
  0%   { stroke-dashoffset: 1; }
  22%  { stroke-dashoffset: 0; }
  80%  { stroke-dashoffset: 0; }
  100% { stroke-dashoffset: 1; }
}
@keyframes kw-run-fade {
  0%, 5%    { opacity: .1; }
  20%, 78%  { opacity: .6; }
  96%, 100% { opacity: .08; }
}
@keyframes kw-run-shave {
  0%, 16%   { transform: none; }
  42%, 72%  { transform: rotate(-9deg) translateX(-2px); }
  90%, 100% { transform: none; }
}

/* Staggered entrance, driven by the section's reveal state. */
html.kw-anim .kw-rv .k-triad__cell { opacity: 0; transform: translateY(16px); }
html.kw-anim .kw-rv--in .k-triad__cell {
  opacity: 1;
  transform: none;
  transition: opacity .7s ease, transform .7s cubic-bezier(.2,.7,.2,1);
}
html.kw-anim .kw-rv--in .k-triad__cell:nth-child(2) { transition-delay: .12s; }
html.kw-anim .kw-rv--in .k-triad__cell:nth-child(3) { transition-delay: .24s; }

@media (max-width: 760px) {
  .k-triad { grid-template-columns: 1fr; }
  .k-triad__idx { top: 26px; }
}
@media (prefers-reduced-motion: reduce) {
  .k-triad__cell, .k-triad__idx, .k-triad__h::after,
  .k-triad__note, .k-triad__go, .k-triad__art svg { transition: none !important; }
  html.kw-anim .kw-rv .k-triad__cell { opacity: 1; transform: none; }
  .k-triad__h::after { transform: scaleX(1); opacity: .35; }
  html.kw-anim .k-triad__art .d,
  html.kw-anim .k-triad__art svg,
  html.kw-anim .k-triad__art .sh { animation: none !important; }
  html.kw-anim .k-triad__art .d { stroke-dasharray: none; stroke-dashoffset: 0; }
  html.kw-anim .k-triad__art svg { opacity: .5; }
  .k-triad__art .sh { transform: none; }
  .k-triad__cell:hover .k-triad__art svg,
  .k-triad__cell:focus-visible .k-triad__art svg { transform: none; }
}

/* ---------------------------------------------------------------------
   THE MATERIAL LIBRARY — a browsable specimen catalogue. The cards are
   real HTML (a complete catalogue with no JS); materials.js adds .is-live
   to reveal the filter bar, so JS-off visitors never meet a dead control.
   ------------------------------------------------------------------- */
.k-lib { margin-top: 30px; }

.k-lib__bar { display: none; }
.k-lib.is-live .k-lib__bar {
  display: flex;
  flex-wrap: wrap;
  gap: 22px 48px;
  padding: 22px 0 26px;
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
  margin-bottom: 22px;
}
.k-lib__group { display: flex; align-items: baseline; gap: 16px; min-width: 0; }
.k-lib__glabel {
  flex: none;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.45;
  padding-top: 7px;
}
.k-lib__chips { display: flex; flex-wrap: wrap; gap: 8px; }
.k-lib__chip {
  appearance: none;
  cursor: pointer;
  background: transparent;
  border: 1px solid var(--kw-rule-strong);
  color: var(--kw-ink);
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding: 7px 13px;
  transition: background .35s ease, color .35s ease, border-color .35s ease;
}
.k-lib__chip:hover { border-color: var(--kw-terra); color: var(--kw-terra); }
.k-lib__chip:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--kw-terra); }
.k-lib__chip.is-on {
  background: var(--kw-ink);
  border-color: var(--kw-ink);
  color: #fff;
}

.k-lib__count {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
  margin: 0 0 22px;
}

.k-lib__grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: 1px;
  background: var(--kw-rule);
  border: 1px solid var(--kw-rule);
}
.k-lib__card {
  position: relative;
  display: flex;
  flex-direction: column;
  background: #fff;
  overflow: hidden;
}
.k-lib__card.is-hidden { display: none; }
.k-lib__card::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 2px;
  background: var(--kw-terra);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .5s cubic-bezier(.2,.7,.2,1);
  z-index: 2;
}
.k-lib__card:hover::before,
.k-lib__card:focus-within::before { transform: scaleX(1); }
.k-lib__sw {
  width: 100%;
  filter: saturate(0.92);
  transition: filter .55s ease, transform .9s ease;
}
.k-lib__card:hover .k-lib__sw { filter: saturate(1) brightness(1.02); transform: scale(1.025); }
.k-lib__body {
  display: flex;
  flex-direction: column;
  gap: 7px;
  padding: 20px 20px 22px;
  flex: 1 1 auto;
}
.k-lib__no {
  font-family: var(--kw-mono);
  font-size: 9px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-terra);
}
.k-lib__name {
  font-family: var(--kw-sans);
  font-size: 16.5px;
  line-height: 1.25;
  font-weight: 500;
  letter-spacing: -0.008em;
  color: var(--kw-ink);
  margin: 0;
}
.k-lib__meta {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
}
.k-lib__note {
  font-family: var(--kw-sans);
  font-size: 13px;
  line-height: 1.5;
  color: var(--kw-ink);
  opacity: 0.7;
  margin: 2px 0 0;
}
.k-lib__badge {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  margin-top: auto;
  padding-top: 14px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.62;
}
.k-lib__dot {
  /* Was a circular pill (border-radius: 50%); switched to a hairline
     square so the tier badge reads as editorial mark, not status pill. */
  width: 9px; height: 9px;
  border-radius: 0;
  border: 1px solid rgba(29, 35, 44, 0.32);
  flex: none;
}
.k-lib__empty {
  margin: 28px 0 0;
  padding: 28px 24px;
  text-align: center;
  border: 1px solid var(--kw-rule);
  font-family: var(--kw-sans);
  font-size: 15px;
  color: var(--kw-ink);
  opacity: 0.85;
}
.k-lib__empty a { color: var(--kw-terra); text-decoration: none; white-space: nowrap; }
.k-lib__empty a:hover { text-decoration: underline; }
.k-lib__cta {
  display: inline-block;
  margin-top: 14px;
  padding-top: 13px;
  border-top: 1px solid var(--kw-rule);
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
  text-decoration: none;
  transition: color .35s ease, opacity .35s ease;
}
.k-lib__card:hover .k-lib__cta,
.k-lib__card:focus-within .k-lib__cta { color: var(--kw-terra); opacity: 1; }
.k-lib__cta:hover,
.k-lib__cta:focus-visible { color: var(--kw-terra); opacity: 1; outline: none; text-decoration: underline; }
@media (prefers-reduced-motion: reduce) {
  .k-lib__cta { transition: none; }
}

@media (max-width: 760px) {
  .k-lib.is-live .k-lib__bar { flex-direction: column; gap: 18px; }
  .k-lib__grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
  .k-lib__body { padding: 16px 16px 18px; }
}
@media (prefers-reduced-motion: reduce) {
  .k-lib__chip, .k-lib__sw, .k-lib__card::before { transition: none !important; }
  .k-lib__card:hover .k-lib__sw { transform: none; }
}

/* ======================================================================
   CINEMATIC MOTION LAYER
   Cross-document View Transitions (a static MPA, so this is automatic in
   supporting browsers) with the shared nav held continuous across pages,
   plus a subtle scroll-driven parallax on the home hero. Everything
   degrades to instant navigation and is silenced under reduced motion.
   ====================================================================== */
@view-transition { navigation: auto; }

::view-transition-old(root) {
  animation: kw-vt-out .34s cubic-bezier(.2,.7,.2,1) both;
}
::view-transition-new(root) {
  animation: kw-vt-in .42s cubic-bezier(.2,.7,.2,1) both;
}
@keyframes kw-vt-out { to { opacity: 0; transform: translateY(-6px); } }
@keyframes kw-vt-in  { from { opacity: 0; transform: translateY(10px); } }

/* The nav is rendered identically on every page by chrome.js, so naming
   it makes the browser hold it in place while the body cross-fades —
   the page changes underneath a fixed mark. */
.k-nav { view-transition-name: kw-nav; }
::view-transition-group(kw-nav) { animation-duration: .34s; }

/* Scroll-driven parallax: the hero media drifts and settles as the
   section scrolls away. Compositor-only, no JS. */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .k-hero-cinema__media {
      animation: kw-hero-parallax linear both;
      animation-timeline: view();
      animation-range: entry 0% exit 100%;
      will-change: transform;
    }
    @keyframes kw-hero-parallax {
      from { transform: scale(1.06) translateY(0); }
      to   { transform: scale(1.0)  translateY(5%); }
    }
  }
}

@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root),
  ::view-transition-new(root) { animation: none !important; }
  .k-hero-cinema__media { animation: none !important; transform: none !important; }
}

/* ==========================================================================
   INTERACTIVE ENRICHMENTS
   Tasteful, motion-restrained layer: per-paragraph reveals, a reading
   progress hairline, hover specimens, marginalia, cursor refinements,
   anchor-highlight flash, and typeset section separators. Every behaviour
   collapses gracefully under (prefers-reduced-motion: reduce) and under
   pointers without hover. Nothing here touches existing classes destructively.
   ========================================================================== */

/* 1 · Per-element type reveal — extends the existing .kw-rv system with a
   tighter, faster pass over individual paragraphs / figures inside long-form
   essays + method / care / studio / projects. Driven by chrome.js. */
html.kw-anim .kw-rv-line {
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 320ms cubic-bezier(.2,.7,.2,1),
              transform 320ms cubic-bezier(.2,.7,.2,1);
  will-change: opacity, transform;
}
html.kw-anim .kw-rv-line.kw-rv-line--in { opacity: 1; transform: none; }

@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    html.kw-anim .kw-rv-line {
      animation: kw-line-rise 360ms cubic-bezier(.2,.7,.2,1) both;
      animation-timeline: view();
      animation-range: entry 0% cover 18%;
    }
    @keyframes kw-line-rise {
      from { opacity: 0; transform: translateY(8px); }
      to   { opacity: 1; transform: none; }
    }
  }
}

@media (prefers-reduced-motion: reduce) {
  html.kw-anim .kw-rv-line {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
    animation: none !important;
  }
}

/* 2 · Reading-progress hairline — a 2px terra rule pinned to the top of the
   viewport, filling left → right as the visitor moves through the page.
   chrome.js mounts it only on journal / method / care + presence of an
   <article>. Hidden entirely under reduced-motion. */
.k-progress {
  position: fixed;
  top: 0; left: 0; right: 0;
  height: 2px;
  z-index: 60;
  pointer-events: none;
  background: transparent;
}
.k-progress__bar {
  display: block;
  height: 100%;
  width: 0%;
  background: var(--kw-terra);
  transform-origin: left center;
}
@media (prefers-reduced-motion: reduce) {
  .k-progress { display: none !important; }
}

/* 3 · Hover-revealed specimen detail — on materials.html. On a precise
   pointer the .k-lib__note lifts from a slightly-lowered rest state on
   hover, paired with a small "+ view" hint floated over the swatch. On
   coarse pointers the hint becomes a static "tap to read" label. */
.k-lib__sw { position: relative; }
.k-lib__hint {
  position: absolute;
  right: 14px;
  bottom: 14px;
  font-family: var(--kw-mono);
  font-size: 9.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-bone);
  background: rgba(29, 35, 44, 0.74);
  padding: 6px 10px;
  border-radius: 1px;
  opacity: 0;
  transform: translateY(4px);
  transition: opacity .35s ease, transform .35s ease;
  pointer-events: none;
}
@media (hover: hover) and (pointer: fine) {
  .k-lib__card:hover .k-lib__hint,
  .k-lib__card:focus-within .k-lib__hint {
    opacity: 1;
    transform: none;
  }
  .k-lib__card .k-lib__note,
  .k-lib__card .k-lib__meta {
    transition: opacity .35s ease, transform .35s ease;
  }
  .k-lib__card .k-lib__note { transform: translateY(2px); opacity: 0.55; }
  .k-lib__card:hover .k-lib__note,
  .k-lib__card:focus-within .k-lib__note {
    opacity: 0.85;
    transform: none;
  }
}
@media (hover: none), (pointer: coarse) {
  .k-lib__hint {
    position: static;
    display: inline-block;
    margin: 10px 16px 0;
    opacity: 0.55;
    transform: none;
    background: transparent;
    color: var(--kw-ink);
    padding: 0;
  }
}
@media (prefers-reduced-motion: reduce) {
  .k-lib__hint,
  .k-lib__card .k-lib__note,
  .k-lib__card .k-lib__meta { transition: none !important; transform: none !important; }
  .k-lib__hint { opacity: 1; }
}

/* 4 · Marginalia animating in — targets .k-marg (Agent A's class). If the
   class is absent the rule is a no-op. When present, the marker fades in
   180ms after its companion paragraph reveals. */
html.kw-anim .k-marg {
  opacity: 0;
  transform: translateY(6px);
  transition: opacity 300ms cubic-bezier(.2,.7,.2,1) 180ms,
              transform 300ms cubic-bezier(.2,.7,.2,1) 180ms;
  will-change: opacity, transform;
}
html.kw-anim .k-marg.k-marg--in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  html.kw-anim .k-marg {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}

/* 5 · Cursor refinements */
#pl-svg,
#pl-svg * { cursor: crosshair; }
.k-lib__card { cursor: pointer; }

/* Footer links — native cursor, with a left-anchored underline that draws
   in on hover. Augments the existing opacity-only hover state. */
.k-foot__list a {
  cursor: default;
  position: relative;
  display: inline-block;
  width: fit-content;
}
.k-foot__list a::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -2px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .32s cubic-bezier(.2,.7,.2,1);
  opacity: 0.45;
}
.k-foot__list a:hover::after,
.k-foot__list a:focus-visible::after { transform: scaleX(1); }
@media (prefers-reduced-motion: reduce) {
  .k-foot__list a::after { transition: none; }
}

/* 6 · In-page anchor highlight — chrome.js adds .k-anchor-hit to the
   landed-on heading / eyebrow for 1.6s and a brief terra accent runs down
   its left edge. Silenced under reduced motion. */
.k-anchor-hit { position: relative; }
.k-anchor-hit::before {
  content: "";
  position: absolute;
  left: -16px;
  top: 0;
  bottom: 0;
  width: 2px;
  background: var(--kw-terra);
  opacity: 0;
  animation: kw-anchor-flash 1.6s cubic-bezier(.2,.7,.2,1) both;
  pointer-events: none;
}
@keyframes kw-anchor-flash {
  0%   { opacity: 0; transform: scaleY(0.6); }
  18%  { opacity: 0.95; transform: scaleY(1); }
  100% { opacity: 0; transform: scaleY(1); }
}
@media (prefers-reduced-motion: reduce) {
  .k-anchor-hit::before { animation: none !important; opacity: 0 !important; }
}

/* 7 · Typeset section separators — existing .k-rule elements (12 places,
   all in long-form bodies) render as a centered em-dash with letter-
   spacing instead of a solid hairline, so transitions read as typeset
   rather than gridded. Inline style="margin" continues to control rhythm. */
.k-rule {
  background: transparent !important;
  height: auto !important;
  border: 0;
  display: block;
  position: relative;
  text-align: center;
  line-height: 1;
}
.k-rule::before {
  content: "—";
  font-family: var(--kw-mono);
  font-size: 14px;
  letter-spacing: 0.4em;
  color: var(--kw-ink);
  opacity: 0.34;
  display: inline-block;
  padding: 0 6px;
}

/* 8 · Focus rings on enrichments */
.k-lib__hint:focus-visible {
  outline: 2px solid var(--kw-terra);
  outline-offset: 2px;
}

/* ==========================================================================
   IMAGINATION LAYER — toolbar, side panel, compare modal, mood presets.
   Sits between the planner stepper and the form. Reform-calm: quiet mono
   caps, paper ground, terra on hover/active. The compare modal opens
   fixed at 90% viewport. Spec sheet print styles live in the popup window.
   ========================================================================== */

/* Toolbar — 5 buttons + a small "From: <name>" label. */
.k-plan__toolbar {
  grid-column: 1 / -1;
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 0 0 28px;
}
.k-plan__toolbar-row {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 1px;
  background: var(--kw-rule);
  border: 1px solid var(--kw-rule);
}
.k-plan__tool {
  display: flex; align-items: baseline; gap: 10px;
  padding: 14px 16px;
  background: var(--kw-bone);
  font-family: var(--kw-mono);
  font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.72;
  border: 0;
  cursor: pointer;
  transition: opacity 0.18s, color 0.18s, background 0.18s, border-top-color 0.18s;
  border-top: 2px solid transparent;
}
.k-plan__tool:hover { opacity: 1; color: var(--kw-terra); }
.k-plan__tool.is-active {
  opacity: 1; color: var(--kw-ink);
  border-top-color: var(--kw-terra);
  background: linear-gradient(to bottom, rgba(122,47,58,0.05), var(--kw-bone));
}
.k-plan__tool:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: -2px; }
.k-plan__tool-num {
  font-size: 10px; font-weight: 500;
  color: var(--kw-terra); letter-spacing: 0.04em;
  font-feature-settings: "tnum";
  min-width: 14px;
}
.k-plan__tool-lbl { font-size: 11px; }
@media (max-width: 720px) {
  .k-plan__tool { padding: 10px 8px; flex-direction: column; align-items: flex-start; gap: 3px; }
  .k-plan__tool-lbl { font-size: 9px; letter-spacing: 0.12em; }
}
.k-plan__toolbar-meta {
  min-height: 18px;
  display: flex; align-items: baseline; justify-content: flex-end;
}
.k-plan__toolbar-from {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--kw-terra); opacity: 0.9;
}
.k-plan__toolbar-from[hidden] { display: none; }

/* Side panel — saved projects, compare workspace, mood picker. */
.k-plan__panel {
  grid-column: 1 / -1;
  background: #fcfbf8;
  border: 1px solid var(--kw-rule);
  margin: 0 0 28px;
  padding: 24px 28px 28px;
}
.k-plan__panel[hidden] { display: none; }
.k-plan__panel-head {
  display: flex; align-items: baseline; justify-content: space-between;
  padding-bottom: 14px; margin-bottom: 18px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-plan__panel-eyebrow {
  display: flex; flex-direction: column; gap: 4px;
}
.k-plan__panel-kicker {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--kw-ink);
}
.k-plan__panel-dek {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.04em;
  color: var(--kw-ink); opacity: 0.55;
}
.k-plan__panel-close {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.6;
  background: transparent; border: 0; cursor: pointer;
  padding: 4px 6px;
}
.k-plan__panel-close:hover { color: var(--kw-terra); opacity: 1; }
.k-plan__panel-empty {
  font-size: 14px; line-height: 1.55;
  color: var(--kw-ink); opacity: 0.6;
  padding: 18px 4px;
}
.k-plan__panel-empty em { color: var(--kw-terra); font-style: normal; }

/* Project list — used by Load, Compare and Mood. */
.k-plan__projlist, .k-plan__moodlist {
  list-style: none; padding: 0; margin: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 12px;
}
.k-plan__proj, .k-plan__mood {
  display: flex; align-items: stretch;
  border: 1px solid var(--kw-rule);
  background: var(--kw-bone);
  transition: border-color 0.18s, box-shadow 0.18s;
}
.k-plan__proj:hover, .k-plan__mood:hover {
  border-color: var(--kw-rule-strong);
  box-shadow: 0 2px 14px rgba(29,35,44,0.04);
}
.k-plan__proj.is-picked {
  border-color: var(--kw-terra);
  background: linear-gradient(to bottom, rgba(122,47,58,0.06), var(--kw-bone));
}
.k-plan__proj-load, .k-plan__mood-btn {
  display: flex; align-items: center; gap: 14px;
  padding: 14px;
  background: transparent; border: 0;
  font-family: inherit; color: inherit;
  text-align: left; cursor: pointer;
  flex: 1; min-width: 0;
}
.k-plan__proj-load:hover, .k-plan__mood-btn:hover { color: var(--kw-terra); }
.k-plan__proj-load:focus-visible, .k-plan__mood-btn:focus-visible {
  outline: 2px solid var(--kw-terra); outline-offset: -3px;
}
.k-plan__proj-thumb {
  flex: 0 0 80px;
  display: block;
  border: 1px solid var(--kw-rule-strong);
  background: var(--kw-bone);
}
.k-plan__thumb-svg { display: block; width: 100%; height: auto; }
.k-plan__proj-meta {
  display: flex; flex-direction: column; gap: 4px; min-width: 0;
}
.k-plan__proj-name {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 15px; line-height: 1.25;
  color: var(--kw-ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.k-plan__proj-line {
  font-family: var(--kw-mono);
  font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.55;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.k-plan__proj-meta-fine {
  font-family: var(--kw-mono);
  font-size: 9px; letter-spacing: 0.08em;
  color: var(--kw-terra); opacity: 0.8;
}
.k-plan__proj-del {
  font-family: var(--kw-mono);
  font-size: 9px; letter-spacing: 0.16em; text-transform: uppercase;
  background: transparent; border: 0;
  border-left: 1px solid var(--kw-rule);
  color: var(--kw-ink); opacity: 0.45;
  padding: 0 14px; cursor: pointer;
  transition: color 0.18s, opacity 0.18s;
}
.k-plan__proj-del:hover { color: var(--kw-terra); opacity: 1; }

/* Compare modal — fixed, 90vw. Side-by-side rendered SVGs. */
.k-plan__compare {
  position: fixed; inset: 0; z-index: 60;
  display: flex; align-items: center; justify-content: center;
  padding: 5vh 5vw;
}
.k-plan__compare[hidden] { display: none; }
.k-plan__compare-scrim {
  position: absolute; inset: 0;
  background: rgba(29,35,44,0.36);
}
.k-plan__compare-shell {
  position: relative;
  width: 90vw; max-width: 1480px;
  height: 90vh;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule-strong);
  display: flex; flex-direction: column;
  box-shadow: 0 18px 60px rgba(29,35,44,0.18);
}
.k-plan__compare-head {
  display: flex; justify-content: space-between; align-items: baseline;
  padding: 18px 24px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-plan__compare-kicker {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--kw-ink);
}
.k-plan__compare-close {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase;
  background: transparent; border: 0; cursor: pointer;
  color: var(--kw-ink); opacity: 0.6;
  padding: 4px 6px;
}
.k-plan__compare-close:hover { color: var(--kw-terra); opacity: 1; }
.k-plan__compare-body {
  flex: 1; min-height: 0;
  display: grid; grid-template-columns: 1fr 1fr;
  border-top: 1px solid var(--kw-rule);
}
@media (max-width: 880px) {
  .k-plan__compare-body { grid-template-columns: 1fr; grid-template-rows: 1fr 1fr; }
}
.k-plan__cmp-side {
  display: flex; flex-direction: column; min-height: 0;
  border-right: 1px solid var(--kw-rule);
  padding: 24px;
}
.k-plan__cmp-side:last-child { border-right: 0; }
.k-plan__cmp-head {
  display: flex; justify-content: space-between; align-items: baseline; gap: 12px;
  margin-bottom: 16px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-plan__cmp-kicker {
  font-family: var(--kw-mono);
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--kw-ink);
  overflow: hidden; text-overflow: ellipsis;
}
.k-plan__cmp-use {
  font-size: 10px; padding: 8px 12px;
  border: 1px solid var(--kw-rule-strong);
}
.k-plan__cmp-use:hover { border-color: var(--kw-terra); color: var(--kw-terra); }
.k-plan__cmp-draw {
  flex: 1; min-height: 0;
  background-color: #fcfbf8;
  background-image:
    linear-gradient(rgba(29,35,44,0.05) 1px, transparent 1px),
    linear-gradient(90deg, rgba(29,35,44,0.05) 1px, transparent 1px);
  background-size: 22px 22px;
  border: 1px solid var(--kw-rule);
  padding: 12px;
  display: flex; align-items: center; justify-content: center;
  overflow: hidden;
}
.k-plan__cmp-draw .k-plan__svg {
  width: 100%; height: 100%; max-height: 100%;
}
.k-plan__cmp-band {
  display: flex; flex-direction: column; gap: 4px;
  margin-top: 14px;
}
.k-plan__cmp-band-kicker {
  font-family: var(--kw-mono);
  font-size: 9px; letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--kw-terra);
}
.k-plan__cmp-band-price {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 26px; line-height: 1.1;
  color: var(--kw-ink);
}
.k-plan__cmp-band-line {
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.08em;
  color: var(--kw-ink); opacity: 0.6;
}

body.k-plan-compare-open { overflow: hidden; }

/* Print — when the planner page itself is printed, hide the toolbar +
   panel + compare modal. The spec sheet has its own popup with its own
   print styles. */
@media print {
  .k-plan__toolbar, .k-plan__panel, .k-plan__compare,
  [data-no-print] {
    display: none !important;
  }
}

/* ==========================================================================
   BEFORE / AFTER SLIDER  —  .k-baslider
   --------------------------------------------------------------------------
   A draggable comparison figure. Two layers stacked, the AFTER layer
   clipped via inset(). A thin terra hairline + circular knob mark the
   split. Markup is shaped by before-after.js — the figure starts empty
   and the script injects .k-baslider__layer + .k-baslider__handle.
   ========================================================================== */
.k-baslider {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  margin: 0;
  overflow: hidden;
  background: var(--kw-bone-2);
  border: 1px solid var(--kw-rule);
  user-select: none;
  -webkit-user-select: none;
  touch-action: none;        /* let JS own the gesture */
  cursor: ew-resize;
  isolation: isolate;
}
@media (max-width: 760px) {
  .k-baslider { aspect-ratio: 4 / 3; }
}

.k-baslider__layer {
  position: absolute;
  inset: 0;
  background-color: var(--kw-bone-2);
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  opacity: 0;
  transition: opacity 480ms ease-out;
}
.k-baslider__layer.is-ready { opacity: 1; }
.k-baslider__layer--before { z-index: 1; }
.k-baslider__layer--after  { z-index: 2; clip-path: inset(0 50% 0 0); }

/* Labels — small mono caps, terra rule beneath, persist for screen
   readers even when the user has dragged past them. */
.k-baslider__label {
  position: absolute;
  z-index: 4;
  top: 18px;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: #ffffff;
  padding: 6px 10px 6px 10px;
  background: rgba(29, 35, 44, 0.62);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  border-left: 2px solid var(--kw-terra);
  pointer-events: none;
}
.k-baslider__label--before { left: 18px; }
.k-baslider__label--after  { right: 18px; border-left: 0; border-right: 2px solid var(--kw-terra); }

/* The handle — vertical hairline + a circular knob sitting on the
   line. Sits centred on the split percentage; left is set in JS. */
.k-baslider__handle {
  position: absolute;
  z-index: 3;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 44px;             /* hit-zone wider than the line */
  transform: translateX(-50%);
  cursor: ew-resize;
  touch-action: none;
  outline: none;
}
.k-baslider__line {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 1.5px;
  margin-left: -0.75px;
  background: var(--kw-terra);
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18);
}
.k-baslider__knob {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 44px;
  height: 44px;
  margin: -22px 0 0 -22px;
  border-radius: 999px;
  background: #ffffff;
  border: 1.5px solid var(--kw-terra);
  box-shadow: 0 1px 2px rgba(29, 35, 44, 0.18),
              0 6px 18px rgba(29, 35, 44, 0.18);
  transition: transform 180ms ease-out, box-shadow 180ms ease-out;
}
/* Two small terra chevrons drawn from the knob's center via pseudo-
   elements so we don't need an SVG file. */
.k-baslider__knob::before,
.k-baslider__knob::after {
  content: "";
  position: absolute;
  top: 50%;
  width: 7px;
  height: 7px;
  border-top: 1.5px solid var(--kw-terra);
  border-right: 1.5px solid var(--kw-terra);
  transform: translateY(-50%) rotate(45deg);
}
.k-baslider__knob::before {
  left: 11px;
  transform: translateY(-50%) rotate(-135deg);
}
.k-baslider__knob::after {
  right: 11px;
  transform: translateY(-50%) rotate(45deg);
}
.k-baslider:hover .k-baslider__knob,
.k-baslider.is-dragging .k-baslider__knob {
  transform: scale(1.06);
  box-shadow: 0 2px 4px rgba(29, 35, 44, 0.22),
              0 10px 24px rgba(29, 35, 44, 0.22);
}
.k-baslider__handle:focus-visible .k-baslider__knob {
  outline: 2px solid var(--kw-terra);
  outline-offset: 4px;
}
.k-baslider.is-dragging { cursor: ew-resize; }

/* Caption row sits beneath each slider in the Transformations section. */
.k-baslider-caption {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 24px;
  padding: 14px 2px 0;
  border-top: 1px solid var(--kw-rule);
  margin-top: 16px;
}
.k-baslider-caption__num {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-terra);
}
.k-baslider-caption__text {
  font-family: var(--kw-sans);
  font-size: 14px;
  letter-spacing: 0.01em;
  color: var(--kw-ink);
  opacity: 0.78;
}
.k-baslider-caption__where {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.48;
}
@media (max-width: 700px) {
  .k-baslider-caption {
    flex-wrap: wrap;
    gap: 6px 16px;
  }
  .k-baslider-caption__text { order: 3; flex-basis: 100%; }
}

@media (prefers-reduced-motion: reduce) {
  .k-baslider__layer { transition: none; }
  .k-baslider__knob  { transition: none; }
}

/* ==========================================================================
   METHOD PAGE — editorial rebuild (Cabana / AD / World of Interiors register)
   Scoped to method.html. All classes prefixed .k-method__ to avoid
   collisions with sibling pages owned by other agents.
   ----
   2026-05-26 rebuild: this page is now a magazine-grade page-turn through
   five movements. The legacy image-half layout (.k-method__hero with a
   background-image, .k-method__mv-img halves) is gone — every movement
   is now a typographic spread with a bespoke SVG plate. The third
   movement, Drawing, is the brand's signature and gets a full-bleed
   feature treatment with a self-drawing elevation and draughtsman's-
   notes sidebar.
   ----
   Many legacy class names are reused with new semantics (e.g.
   .k-method__hero is no longer a hero photo block, it is a typographic
   overture). New rules below in the EDITORIAL REBUILD block override
   the older ones earlier in the file for those shared selectors.
   ========================================================================== */

/* ---------- Sticky timeline rail ---------- */
.k-method__rail {
  position: sticky;
  top: 0;
  z-index: 40;
  background: rgba(255,255,255,0.92);
  backdrop-filter: saturate(140%) blur(6px);
  -webkit-backdrop-filter: saturate(140%) blur(6px);
  border-bottom: 1px solid var(--kw-rule);
}
.k-method__rail-inner {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: 14px var(--kw-pad);
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: 28px;
}
.k-method__rail-eyebrow,
.k-method__rail-meta {
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.55;
}
.k-method__rail-meta { text-align: right; }
.k-method__rail-list {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0;
  margin: 0;
  padding: 0;
  list-style: none;
  position: relative;
}
.k-method__rail-list::before {
  content: "";
  position: absolute;
  left: 6%;
  right: 6%;
  top: 50%;
  height: 1px;
  background: var(--kw-rule);
  transform: translateY(-0.5px);
}
.k-method__rail-list > li {
  flex: 1;
  display: flex;
  justify-content: center;
  position: relative;
  z-index: 1;
}
.k-method__rail-dot {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 4px;
  text-decoration: none;
  color: var(--kw-ink);
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  opacity: 0.5;
  transition: opacity 0.25s ease;
}
.k-method__rail-mark {
  display: inline-block;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #ffffff;
  border: 1px solid var(--kw-ink);
  transition: background 0.25s ease, border-color 0.25s ease, transform 0.25s ease;
}
.k-method__rail-name {
  white-space: nowrap;
}
.k-method__rail-dot:hover { opacity: 0.9; }
.k-method__rail-dot.is-active {
  opacity: 1;
  color: var(--kw-terra);
}
.k-method__rail-dot.is-active .k-method__rail-mark {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  transform: scale(1.18);
}

@media (max-width: 900px) {
  .k-method__rail-inner { grid-template-columns: 1fr; gap: 8px; padding: 10px var(--kw-pad-sm); }
  .k-method__rail-eyebrow, .k-method__rail-meta { display: none; }
  .k-method__rail-name { display: none; }
  .k-method__rail-list::before { left: 12%; right: 12%; }
}

/* Reduced-motion: static rail, all names visible */
.k-method-static .k-method__rail-dot { opacity: 0.85; }
.k-method-static .k-method__rail-mark { transition: none; }
@media (prefers-reduced-motion: reduce) {
  .k-method__rail { backdrop-filter: none; -webkit-backdrop-filter: none; background: #ffffff; }
  .k-method__rail-dot { opacity: 0.85; }
}

/* ---------- HERO — image is the headline ---------- */
.k-method__hero {
  position: relative;
  width: 100%;
  height: min(86vh, 880px);
  min-height: 560px;
  overflow: hidden;
  background: var(--kw-ink);
}
.k-method__hero-img {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}
.k-method__hero-img::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(0,0,0,0) 30%, rgba(0,0,0,0.55) 100%);
}
.k-method__hero-cap {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  padding: 56px var(--kw-pad);
  color: #ffffff;
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: end;
  gap: 32px;
  max-width: var(--kw-max);
  margin: 0 auto;
}
.k-method__hero-cap .k-cap {
  grid-column: 1 / -1;
  color: #ffffff;
  opacity: 0.82;
}
.k-method__hero-h1 {
  font-size: clamp(56px, 8.6vw, 128px);
  line-height: 0.96;
  font-weight: 500;
  letter-spacing: -0.038em;
  margin: 12px 0 0;
  color: #ffffff;
}
.k-method__hero-cta {
  align-self: end;
  color: #ffffff;
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  padding: 14px 22px;
  border: 1px solid rgba(255,255,255,0.6);
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
  white-space: nowrap;
}
.k-method__hero-cta:hover {
  background: #ffffff;
  color: var(--kw-ink);
  border-color: #ffffff;
}
@media (max-width: 760px) {
  .k-method__hero { height: 74vh; min-height: 480px; }
  .k-method__hero-cap { grid-template-columns: 1fr; padding: 32px var(--kw-pad-sm); gap: 20px; }
  .k-method__hero-cta { justify-self: start; }
}

/* ---------- MOVEMENT — full-bleed two-up split ---------- */
.k-method__mv {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: stretch;
  min-height: min(78vh, 760px);
  border-top: 1px solid var(--kw-rule);
  background: #ffffff;
}
.k-method__mv:last-of-type { border-bottom: 1px solid var(--kw-rule); }
.k-method__mv--reverse { direction: rtl; }
.k-method__mv--reverse > * { direction: ltr; }

.k-method__mv-img {
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  min-height: 480px;
  position: relative;
}
/* KW brand stamp — bottom-right of every method-step image.
   Reads as a maker's mark on the work: the designer's atelier,
   the surveyor at the wall, the drawing in the studio — all
   carry the Kloset Worx imprint, so visible third-party
   branding on subjects' clothing in the source photos no
   longer competes for ownership of the moment. */
.k-method__mv-img::after {
  content: "KW";
  position: absolute;
  bottom: 18px;
  right: 18px;
  padding: 9px 14px;
  background: var(--kw-terra);
  color: var(--kw-paper);
  font-family: var(--kw-mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.34em;
  line-height: 1;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);
  pointer-events: none;
  z-index: 2;
}
@media (max-width: 540px) {
  .k-method__mv-img::after {
    bottom: 14px; right: 14px;
    padding: 7px 11px;
    font-size: 10px;
  }
}
.k-method__mv-text {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 88px clamp(36px, 6vw, 96px);
  background: #ffffff;
  position: relative;
}
.k-method__mv-num {
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin-bottom: 28px;
  display: inline-block;
}
.k-method__mv-title {
  font-size: clamp(48px, 5.4vw, 88px);
  line-height: 0.98;
  font-weight: 500;
  letter-spacing: -0.034em;
  margin: 0 0 28px;
  color: var(--kw-ink);
}
.k-method__mv-dek {
  font-size: clamp(18px, 1.5vw, 22px);
  line-height: 1.4;
  color: var(--kw-ink);
  opacity: 0.82;
  margin: 0 0 36px;
  max-width: 38ch;
  font-weight: 400;
}
.k-method__mv-time {
  font-family: var(--kw-mono);
  font-size: 11.5px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.6;
  border-top: 1px solid var(--kw-rule);
  padding-top: 18px;
  display: inline-block;
  align-self: flex-start;
}

@media (max-width: 900px) {
  .k-method__mv {
    grid-template-columns: 1fr;
    min-height: 0;
  }
  .k-method__mv--reverse { direction: ltr; }
  .k-method__mv-img {
    min-height: 56vh;
    aspect-ratio: 4 / 3;
  }
  .k-method__mv-text {
    padding: 56px var(--kw-pad-sm);
  }
  .k-method__mv-title { margin-bottom: 18px; }
  .k-method__mv-dek { margin-bottom: 24px; }
}

/* ---------- NUMBERS BAND ---------- */
.k-method__numbers {
  background: #ffffff;
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
  /* Heyoasis-feel rhythm: 152/104, matching the new .k-section cadence. */
  padding: 152px 0;
}
@media (max-width: 760px) {
  .k-method__numbers { padding: 104px 0; }
}
.k-method__numbers-eyebrow {
  display: block;
  color: var(--kw-ink);
  opacity: 0.5;
  margin-bottom: 56px;
}
.k-method__numbers-grid {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 56px 40px;
}
.k-method__numbers-grid > li {
  display: flex;
  flex-direction: column;
  gap: 18px;
  border-top: 1px solid var(--kw-rule);
  padding-top: 22px;
}
.k-method__numbers-fig {
  font-size: clamp(56px, 6vw, 96px);
  line-height: 1;
  font-weight: 500;
  letter-spacing: -0.032em;
  color: var(--kw-ink);
}
.k-method__numbers-cap {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.7;
}
@media (max-width: 900px) {
  .k-method__numbers-grid { grid-template-columns: repeat(2, 1fr); gap: 40px 32px; }
}
@media (max-width: 480px) {
  .k-method__numbers-grid { grid-template-columns: 1fr; }
}

/* ---------- FAQ — tight accordion ---------- */
.k-method__faq {
  margin-top: 40px;
  border-top: 1px solid var(--kw-rule);
}
.k-method__faq-item {
  border-bottom: 1px solid var(--kw-rule);
}
.k-method__faq-q {
  cursor: pointer;
  list-style: none;
  padding: 26px 0;
  font-size: 21px;
  line-height: 1.25;
  font-weight: 500;
  letter-spacing: -0.012em;
  color: var(--kw-ink);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
  position: relative;
}
.k-method__faq-q::-webkit-details-marker { display: none; }
.k-method__faq-q::after {
  content: "+";
  font-family: var(--kw-mono);
  font-size: 18px;
  font-weight: 400;
  color: var(--kw-ink);
  opacity: 0.55;
  transition: transform 0.25s ease, opacity 0.25s ease;
  flex-shrink: 0;
}
.k-method__faq-item[open] .k-method__faq-q::after {
  content: "−";
  opacity: 1;
  color: var(--kw-terra);
}
.k-method__faq-q:hover { color: var(--kw-terra); }
.k-method__faq-a {
  font-size: 16px;
  line-height: 1.55;
  color: var(--kw-ink);
  opacity: 0.75;
  margin: 0 0 26px;
  max-width: 62ch;
}
.k-method__faq-a a {
  color: var(--kw-terra);
  border-bottom: 1px solid currentColor;
  text-decoration: none;
}
@media (max-width: 600px) {
  .k-method__faq-q { font-size: 18px; padding: 22px 0; }
}

/* ---------- CTA — single closing block ---------- */
.k-method__cta {
  background: var(--kw-bone-2);
  padding: 160px 0;
  text-align: center;
  border-top: 1px solid var(--kw-rule);
}
@media (max-width: 760px) {
  .k-method__cta { padding: 112px 0; }
}
.k-method__cta-h2 {
  font-size: clamp(48px, 5.4vw, 80px);
  line-height: 1.02;
  font-weight: 500;
  letter-spacing: -0.032em;
  margin: 0 0 48px;
  color: var(--kw-ink);
}
.k-method__cta-btns {
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  justify-content: center;
}

/* ============================================================
   THE CUSTOM DESIGNER WIZARD  —  .k-wiz
   A step-by-step configurator inspired by IKEA PAX + Modular
   Closets — but in the Kloset Worx editorial register. Eight
   questions, one screen at a time, always a live preview, a
   per-section detail panel on the build step, a quote form at
   the end. Lives at the top of design.html, replacing the
   "all-controls-visible" panel UI.
   ============================================================ */

.k-wiz {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(420px, 0.95fr);
  gap: 48px;
  align-items: start;
  margin: 8px 0 24px;
  position: relative;
}
@media (max-width: 960px) {
  .k-wiz { grid-template-columns: 1fr; gap: 32px; }
}

/* Progress rail — small terra dots, names underneath on desktop.
   Spans the top of the wizard, full width. ----------------- */
.k-wiz__progress {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  list-style: none;
  margin: 0 0 36px;
  padding: 0;
  gap: 4px;
  position: relative;
}
.k-wiz__progress::before {
  content: "";
  position: absolute;
  left: 14px; right: 14px;
  top: 11px;
  height: 1px;
  background: var(--kw-rule);
  z-index: 0;
}
.k-wiz__progress-dot {
  position: relative;
  z-index: 1;
  flex: 1;
  text-align: center;
  cursor: pointer;
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  color: inherit;
}
.k-wiz__progress-dot-marker {
  display: block;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule-strong);
  margin: 0 auto 8px;
  font-family: var(--kw-mono);
  font-size: 10px;
  line-height: 20px;
  color: var(--kw-text-mute);
  transition: background 0.24s, color 0.24s, border-color 0.24s;
}
.k-wiz__progress-dot-label {
  display: block;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  opacity: 0.7;
  transition: color 0.24s, opacity 0.24s;
}
.k-wiz__progress-dot.is-done .k-wiz__progress-dot-marker {
  background: var(--kw-ink);
  border-color: var(--kw-ink);
  color: var(--kw-paper);
}
.k-wiz__progress-dot.is-active .k-wiz__progress-dot-marker {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  color: var(--kw-paper);
  box-shadow: 0 0 0 6px rgba(122, 47, 58, 0.14);
}
.k-wiz__progress-dot.is-active .k-wiz__progress-dot-label {
  color: var(--kw-terra);
  opacity: 1;
}
@media (max-width: 720px) {
  .k-wiz__progress-dot-label { display: none; }
}

/* Question pane (left column). ------------------------------- */
.k-wiz__pane {
  min-height: 540px;
  position: relative;
}
.k-wiz__step {
  display: none;
}
.k-wiz__step.is-active {
  display: block;
  animation: kw-wiz-in 0.42s cubic-bezier(.16,1,.3,1);
}
@keyframes kw-wiz-in {
  0%   { opacity: 0; transform: translateY(12px); }
  100% { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .k-wiz__step.is-active { animation: none; }
}

.k-wiz__head {
  margin-bottom: 32px;
}
.k-wiz__stepnum {
  display: inline-block;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin-bottom: 18px;
}
.k-wiz__q {
  font-size: clamp(28px, 3.6vw, 44px);
  line-height: 1.08;
  letter-spacing: -0.018em;
  font-weight: 500;
  color: var(--kw-ink);
  margin: 0 0 14px;
}
.k-wiz__sub {
  font-size: 16px;
  line-height: 1.5;
  color: var(--kw-text-mute);
  max-width: 540px;
  margin: 0;
}

/* Visual tile grid for picks. ------------------------------- */
.k-wiz__tiles {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 14px;
  margin-top: 28px;
}
.k-wiz__tiles--wide { grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
.k-wiz__tiles--narrow { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }

.k-wiz__tile {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule);
  text-align: left;
  cursor: pointer;
  overflow: hidden;
  transition: border-color 0.24s, transform 0.32s cubic-bezier(.16,1,.3,1), box-shadow 0.24s;
  font-family: inherit;
  padding: 0;
  color: inherit;
}
.k-wiz__tile:hover {
  border-color: var(--kw-ink);
  transform: translateY(-2px);
  box-shadow: 0 8px 20px rgba(29,35,44,0.06);
}
.k-wiz__tile.is-selected {
  border-color: var(--kw-terra);
  box-shadow: 0 0 0 2px var(--kw-terra), 0 8px 24px rgba(122,47,58,0.18);
}
.k-wiz__tile.is-selected::after {
  content: "✓";
  position: absolute;
  top: 10px;
  right: 12px;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--kw-terra);
  color: var(--kw-paper);
  text-align: center;
  line-height: 22px;
  font-size: 13px;
  font-weight: 600;
}
.k-wiz__tile-img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  background: var(--kw-bone-2);
  background-size: cover;
  background-position: center;
}
.k-wiz__tile-body {
  padding: 14px 16px 18px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.k-wiz__tile-name {
  font-size: 15px;
  font-weight: 500;
  color: var(--kw-ink);
  letter-spacing: -0.008em;
}
.k-wiz__tile-dek {
  font-size: 12px;
  line-height: 1.45;
  color: var(--kw-text-mute);
}
.k-wiz__tile-meta {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin-top: 6px;
}

/* Range-slider blocks for dimensions. ----------------------- */
.k-wiz__range-block {
  margin-bottom: 28px;
}
.k-wiz__range-block:last-child { margin-bottom: 0; }
.k-wiz__range-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin-bottom: 8px;
}
.k-wiz__range-label {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
}
.k-wiz__range-val {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 26px;
  font-weight: 400;
  color: var(--kw-ink);
}
.k-wiz__range-val small {
  font-size: 14px;
  color: var(--kw-text-mute);
  margin-left: 6px;
}
.k-wiz__range {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  height: 3px;
  background: var(--kw-rule-strong);
  outline: none;
  cursor: pointer;
}
.k-wiz__range::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 22px; height: 22px;
  background: var(--kw-terra);
  border: 0;
  border-radius: 50%;
  cursor: pointer;
  box-shadow: 0 2px 8px rgba(122,47,58,0.3);
}
.k-wiz__range::-moz-range-thumb {
  width: 22px; height: 22px;
  background: var(--kw-terra);
  border: 0;
  border-radius: 50%;
  cursor: pointer;
}
.k-wiz__range:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 6px; }
.k-wiz__range-scale {
  display: flex;
  justify-content: space-between;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  opacity: 0.55;
  margin-top: 8px;
}

/* Number stepper (for layout: 1-6 sections). ---------------- */
.k-wiz__stepper {
  display: inline-flex;
  align-items: center;
  gap: 0;
  margin-top: 28px;
  border: 1px solid var(--kw-rule-strong);
}
.k-wiz__stepper-btn {
  width: 56px;
  height: 56px;
  background: var(--kw-bone);
  border: 0;
  font-family: Georgia, "Times New Roman", serif;
  font-size: 26px;
  color: var(--kw-ink);
  cursor: pointer;
  transition: background 0.24s;
}
.k-wiz__stepper-btn:hover { background: var(--kw-bone-2); }
.k-wiz__stepper-btn:disabled { opacity: 0.3; cursor: not-allowed; }
.k-wiz__stepper-val {
  width: 80px;
  height: 56px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: Georgia, "Times New Roman", serif;
  font-size: 32px;
  background: var(--kw-bone);
  border-left: 1px solid var(--kw-rule-strong);
  border-right: 1px solid var(--kw-rule-strong);
}

/* Live preview pane (right column, sticky on desktop). ----- */
.k-wiz__preview {
  position: sticky;
  top: 100px;
  align-self: start;
}
@media (max-width: 960px) {
  .k-wiz__preview { position: relative; top: 0; }
}
.k-wiz__preview-frame {
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule);
  overflow: hidden;
}
.k-wiz__preview-svg {
  display: block;
  width: 100%;
  aspect-ratio: 5 / 3;
  background: var(--kw-bone-2);
}
.k-wiz__preview-meta {
  padding: 14px 18px;
  border-top: 1px solid var(--kw-rule);
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
}
.k-wiz__preview-price {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 22px;
  font-weight: 400;
  color: var(--kw-ink);
  letter-spacing: -0.01em;
  text-transform: none;
}
.k-wiz__preview-bays {
  padding: 0 18px 18px;
  display: flex;
  gap: 6px;
  border-top: 1px solid var(--kw-rule);
  background: var(--kw-bone);
}
.k-wiz__preview-bays[hidden] { display: none; }
.k-wiz__preview-bay {
  flex: 1;
  padding: 12px 8px;
  border: 1px dashed var(--kw-rule-strong);
  cursor: pointer;
  background: var(--kw-bone-2);
  font-family: var(--kw-mono);
  font-size: 9px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  text-align: center;
  transition: border-color 0.24s, color 0.24s;
}
.k-wiz__preview-bay:hover { border-color: var(--kw-terra); color: var(--kw-terra); }
.k-wiz__preview-bay.is-active { border-color: var(--kw-terra); border-style: solid; color: var(--kw-terra); background: rgba(122,47,58,0.06); }

/* Bottom nav bar. ----------------------------------------- */
.k-wiz__nav {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 40px;
  padding-top: 24px;
  border-top: 1px solid var(--kw-rule);
  gap: 24px;
}
.k-wiz__nav-meta {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  opacity: 0.7;
}
.k-wiz__nav-btn {
  font-family: var(--kw-mono);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  padding: 18px 32px;
  background: transparent;
  border: 1.5px solid var(--kw-rule-strong);
  color: var(--kw-ink);
  cursor: pointer;
  transition: background 0.24s, color 0.24s, border-color 0.24s, transform 0.32s cubic-bezier(.16,1,.3,1), box-shadow 0.24s;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
}
.k-wiz__nav-btn:hover {
  border-color: var(--kw-ink);
  background: var(--kw-ink);
  color: var(--kw-paper);
}
.k-wiz__nav-btn--primary {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  color: var(--kw-paper);
  box-shadow: 0 4px 16px rgba(122,47,58,0.28);
}
.k-wiz__nav-btn--primary:hover {
  background: var(--kw-terra-deep);
  border-color: var(--kw-terra-deep);
  color: var(--kw-paper);
  box-shadow: 0 8px 24px rgba(94,34,44,0.38);
  transform: translateY(-1px);
}
.k-wiz__nav-btn:disabled { opacity: 0.3; cursor: not-allowed; transform: none; box-shadow: none; }

/* PER-SECTION configuration panel (slides over preview). --- */
.k-wiz__section-panel {
  position: relative;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule-strong);
  padding: 24px;
  margin-top: 20px;
  display: none;
}
.k-wiz__section-panel.is-open { display: block; animation: kw-wiz-in 0.32s cubic-bezier(.16,1,.3,1); }
.k-wiz__section-panel-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin-bottom: 20px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-wiz__section-panel-title {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 22px;
  color: var(--kw-ink);
}
.k-wiz__section-panel-close {
  background: none;
  border: 0;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  cursor: pointer;
}
.k-wiz__section-panel-close:hover { color: var(--kw-terra); }
.k-wiz__section-group {
  margin-bottom: 22px;
}
.k-wiz__section-group:last-child { margin-bottom: 0; }
.k-wiz__section-group-label {
  display: block;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  margin-bottom: 10px;
}
.k-wiz__section-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.k-wiz__section-chip {
  padding: 10px 16px;
  border: 1px solid var(--kw-rule-strong);
  background: transparent;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--kw-ink);
  cursor: pointer;
  transition: background 0.18s, color 0.18s, border-color 0.18s;
}
.k-wiz__section-chip:hover { border-color: var(--kw-ink); }
.k-wiz__section-chip.is-selected {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  color: var(--kw-paper);
}

/* REVIEW step — spec sheet + quote form. ------------------ */
.k-wiz__review {
  display: grid;
  grid-template-columns: 1fr;
  gap: 32px;
}
.k-wiz__spec {
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule);
  padding: 28px 32px;
}
.k-wiz__spec-eyebrow {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin-bottom: 16px;
}
.k-wiz__spec-title {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 30px;
  font-weight: 400;
  letter-spacing: -0.012em;
  color: var(--kw-ink);
  margin: 0 0 24px;
}
.k-wiz__spec-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.k-wiz__spec-list li {
  display: flex;
  justify-content: space-between;
  padding: 12px 0;
  border-bottom: 1px solid var(--kw-rule);
  gap: 24px;
}
.k-wiz__spec-list li:last-child { border-bottom: 0; }
.k-wiz__spec-key {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  flex-shrink: 0;
  width: 35%;
}
.k-wiz__spec-val {
  font-size: 14px;
  color: var(--kw-ink);
  text-align: right;
}
.k-wiz__quote-form {
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule);
  padding: 32px;
}
.k-wiz__quote-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  margin-bottom: 14px;
}
@media (max-width: 600px) {
  .k-wiz__quote-row { grid-template-columns: 1fr; }
}
.k-wiz__quote-field {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.k-wiz__quote-field label {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
}
.k-wiz__quote-field input,
.k-wiz__quote-field textarea {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--kw-rule-strong);
  padding: 10px 0;
  font: inherit;
  font-size: 15px;
  color: var(--kw-ink);
  outline: none;
}
.k-wiz__quote-field input:focus,
.k-wiz__quote-field textarea:focus {
  border-bottom-color: var(--kw-terra);
}
.k-wiz__quote-field textarea {
  min-height: 80px;
  resize: vertical;
}
.k-wiz__quote-actions {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  margin-top: 24px;
}
.k-wiz__quote-help {
  font-size: 12px;
  color: var(--kw-text-mute);
  margin: 16px 0 0;
  line-height: 1.5;
}

/* SUCCESS state for the quote step. ----------------------- */
.k-wiz__sent {
  text-align: center;
  padding: 64px 24px;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule);
}
.k-wiz__sent-mark {
  font-family: var(--kw-mono);
  font-size: 32px;
  color: var(--kw-terra);
  margin-bottom: 18px;
}
.k-wiz__sent h3 {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 32px;
  font-weight: 400;
  color: var(--kw-ink);
  margin: 0 0 14px;
}
.k-wiz__sent p {
  color: var(--kw-text-mute);
  max-width: 480px;
  margin: 0 auto;
  line-height: 1.5;
}

/* Photoreal render block on the Review step. ------------- */
.k-wiz__render {
  margin: 0 0 32px;
  padding: 0;
}
.k-wiz__render-frame {
  position: relative;
  aspect-ratio: 3 / 2;
  background: var(--kw-bone-2);
  border: 1px solid var(--kw-rule);
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
}
.k-wiz__render-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.k-wiz__render-state {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 32px;
  text-align: center;
  background: var(--kw-bone-2);
}
/* `display:flex` above wins over the UA `[hidden]` rule; restate the
   override so state.hidden=true actually hides the spinner once the
   image lands. */
.k-wiz__render-state[hidden] { display: none; }
.k-wiz__render-spinner {
  width: 28px;
  height: 28px;
  border: 2px solid var(--kw-rule-strong);
  border-top-color: var(--kw-terra);
  border-radius: 50%;
  animation: kw-render-spin 0.9s linear infinite;
}
@keyframes kw-render-spin {
  to { transform: rotate(360deg); }
}
.k-wiz__render-msg {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  max-width: 32ch;
  line-height: 1.5;
}
.k-wiz__render-msg--soft {
  text-transform: none;
  letter-spacing: 0;
  font-family: inherit;
  font-size: 14px;
  max-width: 44ch;
  line-height: 1.55;
  color: var(--kw-ink-2);
}
.k-wiz__render-cap {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 16px;
  margin-top: 12px;
}
.k-wiz__render-cap-text {
  font-size: 12px;
  color: var(--kw-text-mute);
  line-height: 1.55;
  max-width: 60ch;
}
.k-wiz__render-regen {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-terra);
  background: transparent;
  border: 1px solid var(--kw-rule-strong);
  padding: 8px 14px;
  cursor: pointer;
  flex-shrink: 0;
  transition: border-color 0.2s ease, color 0.2s ease;
}
.k-wiz__render-regen:hover {
  border-color: var(--kw-terra);
  color: var(--kw-terra-deep);
}

/* Skip-to-advanced link, top right of progress rail. ----- */
.k-wiz__escape {
  position: absolute;
  top: 0;
  right: 0;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  padding-bottom: 2px;
  transition: color 0.24s, border-color 0.24s;
}
.k-wiz__escape:hover { color: var(--kw-terra); border-bottom-color: var(--kw-terra); }

/* Advanced-mode collapsible — keeps the original "all-controls"
   panel reachable for power users without crowding the wizard. */
.k-plan-advanced {
  margin-top: 64px;
  border-top: 1px solid var(--kw-rule);
  padding-top: 32px;
}
.k-plan-advanced__summary {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  cursor: pointer;
  padding: 12px 0;
  list-style: none;
  user-select: none;
}
.k-plan-advanced__summary::-webkit-details-marker { display: none; }
.k-plan-advanced__summary::before {
  content: "+ ";
  color: var(--kw-terra);
  font-weight: 700;
  margin-right: 6px;
}
.k-plan-advanced[open] .k-plan-advanced__summary::before { content: "− "; }
.k-plan-advanced__summary:hover { color: var(--kw-ink); }
.k-plan-advanced > .k-plan { margin-top: 24px; }

/* DESIGN PAGE — TIGHT HERO + COLLAPSED PRE-WIZARD REFERENCE
   The /design.html hero is reduced to one short line + one
   sentence so the wizard lands above-the-fold on most viewports.
   The Details & Accessories reference block is collapsed into a
   single-row summary that opens on demand. */
.k-hero-wrap--tight { padding-top: 24px !important; padding-bottom: 28px !important; }
@media (max-width: 760px) {
  .k-hero-wrap--tight { padding-top: 16px !important; padding-bottom: 20px !important; }
}

.k-design-preref {
  display: block;
  background: var(--kw-bone);
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
  margin: 0 0 12px;
}
.k-design-preref__summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 14px 32px;
  max-width: 1480px;
  margin: 0 auto;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  user-select: none;
  transition: color 0.24s;
}
.k-design-preref__summary::-webkit-details-marker { display: none; }
.k-design-preref__summary:hover { color: var(--kw-ink); }
.k-design-preref__chev {
  display: inline-block;
  width: 18px; height: 18px;
  border: 1px solid var(--kw-rule-strong);
  text-align: center;
  line-height: 16px;
  font-weight: 500;
  font-size: 12px;
  color: var(--kw-terra);
  transition: transform 0.24s;
}
.k-design-preref[open] .k-design-preref__chev { content: "−"; transform: rotate(45deg); }
.k-design-preref__lbl { flex: 0 0 auto; }
.k-design-preref__hint {
  flex: 1;
  text-align: right;
  opacity: 0.45;
  letter-spacing: 0.14em;
  font-size: 10px;
}
@media (max-width: 720px) { .k-design-preref__hint { display: none; } }

/* ============================================================
   PAX-QUALITY WIZARD POLISH
   Eliminates layout shifts between steps. The question pane is
   given a min-height so navigation doesn't make the preview
   "jump." Tile grid uses fixed aspect ratios. The preview pane
   reserves space for the bay-chip row at all times (transparent
   when not on the Build step) so its frame height never changes.
   ============================================================ */
.k-wiz__pane {
  min-height: 620px;          /* enough to seat any step without growing */
}
@media (max-width: 960px) {
  .k-wiz__pane { min-height: 0; }
}
.k-wiz__tiles {
  /* Fixed grid that doesn't reflow on selection. Each tile is
     locked to a 4:3 ratio image + uniform body height. */
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}
@media (max-width: 760px) {
  .k-wiz__tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 460px) {
  .k-wiz__tiles { grid-template-columns: 1fr; }
}
.k-wiz__tiles--wide { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.k-wiz__tiles--narrow { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 760px) {
  .k-wiz__tiles--narrow { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

.k-wiz__tile-img {
  /* Lock the aspect — image content can vary but tile size is identical. */
  aspect-ratio: 4 / 3;
}
.k-wiz__tile-body {
  /* Locked min-height so 1-line and 2-line deks don't change the
     visual grid. Names + deks settle into uniform cards. */
  min-height: 88px;
  justify-content: flex-start;
}
.k-wiz__tile {
  /* Smooth transitions, no jarring scale on selection. */
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.k-wiz__tile:hover {
  /* Replace the translateY hover with a quieter, more PAX-like
     border tone — no movement that nudges adjacent tiles. */
  transform: none;
}

.k-wiz__preview-frame {
  /* Reserve a stable height for the preview frame so the page
     doesn't shift when bay row appears on Build step. */
  min-height: 440px;
}
.k-wiz__preview-svg {
  aspect-ratio: 5 / 3;
  min-height: 360px;
}
.k-wiz__preview-bays {
  /* On non-Build steps the row is hidden but we leave room so
     opening it doesn't shove anything below it. */
  min-height: 56px;
}
.k-wiz__preview-bays[hidden] {
  display: flex;       /* keep occupying space */
  visibility: hidden;
  pointer-events: none;
}

/* Step entrance — quieter than the original 12px slide. */
@keyframes kw-wiz-in {
  0% { opacity: 0; }
  100% { opacity: 1; }
}
.k-wiz__step.is-active { animation: kw-wiz-in 0.28s ease-out; }

/* Progress dot — bigger tap targets, clearer hierarchy. */
.k-wiz__progress-dot-marker {
  width: 24px;
  height: 24px;
  line-height: 22px;
  font-size: 11px;
}
.k-wiz__progress::before { top: 12px; }
.k-wiz__progress-dot.is-active .k-wiz__progress-dot-marker {
  box-shadow: 0 0 0 4px rgba(122, 47, 58, 0.16);
}

/* Anchor the step number above the question so the typographic
   ladder reads in one beat instead of three. */
.k-wiz__stepnum {
  font-size: 10px;
  letter-spacing: 0.36em;
  margin-bottom: 14px;
}
.k-wiz__q {
  font-size: clamp(28px, 3.2vw, 40px);
  letter-spacing: -0.02em;
  margin-bottom: 12px;
}
.k-wiz__sub { font-size: 15px; line-height: 1.55; }

/* ==========================================================================
   MOBILE FRIENDLINESS — comprehensive sweep
   --------------------------------------------------------------------------
   Audit pass (May 2026). Touches NOTHING above this point destructively;
   only tightens / adds rules under existing min-width breakpoints. All
   rules below scope to (max-width: …) so desktop is unaffected.

   Targets:
     · 768  — tablet (iPad portrait)
     · 640  — large phone (iPhone Plus / 14 Pro Max)
     · 480  — phone (iPhone 12/13/14 standard)
     · 380  — phone (iPhone SE / mini)

   Fixes cover:
     1. Horizontal overflow guard (html, body, wrap).
     2. Inline-grid HTML styles (repeat(4|6|12), 1fr 1fr, 1.4fr 1fr, etc.).
        These are written in style="..." on individual pages and would not
        respond at narrow widths without the attribute selectors below.
     3. Touch targets ≥ 44px on tap-able elements (nav cta, k-btn, form chips).
     4. Hero sizing and CTA stacking on phones.
     5. Mega-footer column collapse below 540.
     6. Wizard preview + step nav + tile grid at narrow widths.
     7. Planner readout + controls + paint grid stacking.
     8. Before/after slider hint label on coarse pointers.
     9. Spec tables, k-spec-list, k-prose, k-feat-split, k-detail.
    10. Journal essay readability (line-length already 680, just tighten gutters).
    11. Method page 5-movement stacks image-above-text.
    12. Long words / pre-formatted strings break instead of overflow.
   ========================================================================== */

@media (max-width: 768px) {
  /* Root overflow guard — any one stray inline grid or oversize image
     should never push the body wider than the viewport on a phone.
     Use `clip`, not `hidden`: `overflow-x: hidden` makes the body a
     scroll container (the cross-axis computes to `auto`), which breaks
     `position: sticky` descendants (the pinned step-in section, sticky
     figures) and stutters iOS momentum scrolling. `clip` trims the
     same horizontal bleed without establishing a scroll container. */
  html, body { overflow-x: clip; max-width: 100%; }

  /* Wrap padding stays at --kw-pad-sm; collapse the largest gutters. */
  :root { --kw-pad-sm: 24px; }

  /* Long URLs, codes (e.g. NEIGHBOURHOOD · ZIP), and tabular spec values
     should wrap rather than push the layout wider. .k-page-hero__title
     joins the list because trade.html ("For the&nbsp;trade.") and
     visit.html ("By&nbsp;appointment.") use non-breaking spaces that
     clip at 320px without explicit wrapping. */
  .k-spec-list__val, .k-card__title, .k-h2, .k-h3, .k-hero-text,
  .k-page-hero__title {
    overflow-wrap: anywhere;
    word-wrap: break-word;
  }

  /* Touch targets — every visible link in the nav, every CTA, every form
     control needs to be at least 44px on a tap surface. */
  .k-btn { min-height: 44px; padding: 12px 18px; }
  .k-btn,
  .k-cap a, .k-eyebrow a { -webkit-tap-highlight-color: transparent; }
  .k-form input,
  .k-form select,
  .k-form textarea { min-height: 44px; font-size: 16px; /* prevents iOS zoom on focus */ }
  .k-foot__news-row input { font-size: 16px; min-height: 44px; }
  .k-foot__news-btn { min-height: 44px; }

  /* Headings shrink one more notch on phones — clamp() in the base already
     handles most cases, but the `.k-h2` is a fixed 56px on desktop which
     reads too dense at 375 px wide. */
  .k-h2 { font-size: clamp(34px, 7.6vw, 44px); }
  .k-h3 { font-size: clamp(26px, 6vw, 32px); }

  /* Pull quote sized to mobile — already had clamp() but the side margins
     get tight on narrow screens. */
  .k-pull { font-size: clamp(24px, 6.2vw, 36px); }
  .k-pullquote { padding: 0 8px; }

  /* INLINE grid attribute selectors — these match the inline styles
     written directly into HTML files (index.html, offerings.html,
     spaces.html, materials.html, trade.html, visit.html, journal.html,
     studio.html, care.html, space.html, etc.). The attribute selector
     wins at equal specificity because element-styles are 1,0,0,0 but
     `[style*=…]` is 0,1,0,0. We use !important sparingly. */

  /* 12-column gallery on home becomes 2 cols, fixed row height auto. */
  [style*="grid-template-columns: repeat(12, 1fr)"] {
    grid-template-columns: repeat(2, 1fr) !important;
    grid-auto-rows: auto !important;
  }
  [style*="grid-template-columns: repeat(12, 1fr)"] > figure {
    grid-column: span 1 !important;
    grid-row: auto !important;
    aspect-ratio: 4 / 5;
  }

  /* 6-column offering colour strips → 3 cols. */
  [style*="grid-template-columns: repeat(6, 1fr)"] {
    grid-template-columns: repeat(3, 1fr) !important;
  }

  /* 4-column photo strips (home, offerings, spaces) → 2 cols. */
  [style*="grid-template-columns: repeat(4, 1fr)"] {
    grid-template-columns: repeat(2, 1fr) !important;
  }

  /* Two-column splits that lived in inline styles → 1 col. */
  [style*="grid-template-columns: 1fr 1fr"],
  [style*="grid-template-columns: 1.4fr 1fr"],
  [style*="grid-template-columns: 1fr 1.4fr"] {
    grid-template-columns: 1fr !important;
    gap: 32px !important;
  }

  /* `auto 1fr` (the Signed monogram + pull on home) and `1fr auto`
     (Trade strip CTA on home, journal sub-eyebrow) stack on mobile. */
  [style*="grid-template-columns: auto 1fr"],
  [style*="grid-template-columns: 1fr auto"] {
    grid-template-columns: 1fr !important;
    gap: 32px !important;
    align-items: flex-start !important;
  }

  /* Trade-strip CTA — the inline grid forces the CTA inline; on phones it
     should drop under the title. Re-align right edge. */
  .k-section--terra .k-btn { align-self: flex-start; }

  /* SIGNED / "In confidence" — the giant "open-quote" or monogram column
     was set with inline color/styling. On phones, give it less vertical
     weight. */
  .k-section--ink [style*="font-size: 64px"] { font-size: 36px !important; line-height: 1 !important; }
  .k-section--ink [style*="width=\"100\""],
  .k-section--ink svg[width="100"][height="180"] { width: 56px; height: auto; }

  /* k-feat-split — already stacks at 860; reinforce gap so blocks
     aren't tight. */
  .k-feat-split { gap: 32px !important; }

  /* k-detail rows — give the photo column reasonable height when stacked.
     Without this, a 4:3 figure inside a stacked split can become huge. */
  .k-detail .k-img,
  .k-feat-split .k-img { max-height: 70vh; }

  /* HERO — cinematic. Stack the CTAs full-width, drop the lower-right
     scroll cue (already happens at 480) and make sure the photo column
     reads cleanly on a phone. */
  .k-hero-cinema__inner { padding: 48px 0 56px; min-height: 80vh; }
  .k-hero-cinema { min-height: 80vh; }
  .k-hero-cinema__ctas { width: 100%; }

  /* Page hero text — already uses clamp() but we want it less tight at
     375 px. The 7vw at 375 = 26px; bump baseline up a touch. */
  .k-hero-text { font-size: clamp(40px, 11vw, 64px); }
  .k-hero-dek { font-size: 17px; }

  /* Footer — the 5/6-col layout already collapses to 2 at 900 and 1 at
     540. Make sure padding and link spacing are tap-friendly. */
  .k-foot__list a { padding: 4px 0; min-height: 28px; }
  .k-foot__col-title { margin-bottom: 14px; }
  .k-foot__head { font-size: 32px; }

  /* Method page — at 900 the rail-name and rail-eyebrow already drop.
     Reinforce hero CTA full-width on phones; mv-img height. */
  .k-method__hero-h1 { font-size: clamp(40px, 11vw, 72px); }
  .k-method__hero-cap { padding: 24px var(--kw-pad-sm); }
  .k-method__mv-img { min-height: 48vh; aspect-ratio: 4 / 3; }
  .k-method__mv-title { font-size: clamp(36px, 9vw, 56px); }
  .k-method__mv-dek { font-size: 17px; }
  .k-method__mv-text { padding: 48px var(--kw-pad-sm); }

  /* Compare section — editorial two-column. Mobile rules live with the
     .k-vs2 block below. No min-width is set here. */

  /* k-spec-list — at 700 it already collapses; reinforce padding so
     long values like "Vegetable-tanned leather over timber · soap-finished
     oak · honed stone" wrap softly rather than overflow. */
  .k-spec-list__val { word-break: break-word; }

  /* k-prose — stacked at 900; tighten gap and lede font size. */
  .k-prose__body { font-size: 17px; }
  .k-prose__body p { font-size: 17px; line-height: 1.55; }

  /* Pagemark — narrow widths can run the three spans into each other. */
  .k-pagemark { flex-wrap: wrap; gap: 6px 14px; }
  .k-pagemark span,
  .k-pagemark a { font-size: 9.5px; }

  /* WIZARD — the wizard already collapses at 960. On phones, tighten
     paddings and lock tile-image aspect ratio. */
  .k-wiz { gap: 24px; }
  .k-wiz__progress { margin-bottom: 22px; }
  .k-wiz__progress-dot-marker { width: 26px; height: 26px; line-height: 24px; }
  .k-wiz__pane { min-height: 0; }
  .k-wiz__head { margin-bottom: 22px; }
  .k-wiz__q { font-size: clamp(26px, 7vw, 32px); }
  .k-wiz__sub { font-size: 15px; }
  .k-wiz__tile { min-height: 44px; }
  .k-wiz__nav-btn { padding: 14px 22px; font-size: 12px; min-height: 48px; }
  .k-wiz__nav { gap: 14px; }
  .k-wiz__stepper-btn { width: 48px; height: 48px; }
  .k-wiz__stepper-val { width: 64px; height: 48px; font-size: 26px; }

  /* PLANNER — already stacks at 980. Reinforce: tighten the toolbar text,
     ensure paint grid is 2-col rather than 3 at very small widths, and
     reduce the planner controls panel padding so it doesn't dwarf the
     phone screen. */
  .k-plan__controls { padding: 20px 18px; gap: 22px; }
  .k-plan__drawwrap { padding: 12px 12px 14px; }
  .k-plan__visual { padding: 14px 14px; gap: 14px; }
  .k-plan__step { padding: 10px 6px; }
  .k-plan__stepnum { font-size: 11px; }
  .k-plan__steplabel { font-size: 9px; letter-spacing: 0.10em; }
  .k-plan__tool { padding: 8px 6px; }
  .k-plan__tool-num { min-width: 12px; font-size: 9px; }
  .k-plan__tool-lbl { font-size: 8.5px; letter-spacing: 0.10em; }
  .k-plan__price { font-size: 30px; }
  .k-plan__bdrow,
  .k-plan__specrow { font-size: 13px; padding: 9px 0; }
  .k-plan__specrow { grid-template-columns: 100px 1fr; gap: 12px; }

  /* Paint picker — at 980 it's 3-col already; for narrow phones make it
     2-col so each chip is large enough to tap. */
  .k-plan__paint-grid { grid-template-columns: repeat(2, 1fr) !important; }
  .k-plan__paint-tab,
  .k-plan__paint-fam { min-height: 38px; padding: 8px 10px; }

  /* Materials filter chips — bigger tap surface. */
  .k-lib__chip { padding: 10px 14px; min-height: 38px; }
  .k-lib__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  /* Before/after slider — already 4:3 at 760. Bump knob hit area. */
  .k-baslider__handle { width: 56px; }
  .k-baslider__knob { width: 48px; height: 48px; margin: -24px 0 0 -24px; }
  .k-baslider__label { font-size: 9px; padding: 5px 8px; letter-spacing: 0.18em; top: 12px; }
  .k-baslider__label--before { left: 12px; }
  .k-baslider__label--after  { right: 12px; }

  /* Triad — already 1-col at 760. Tighten internal padding. */
  .k-triad__cell { padding: 26px 22px 24px; }
  .k-triad__art svg { width: 132px; }

  /* Spaces grid — already 2 cols at 900; min-height stays sensible. */
  .k-spaces-grid__cell { min-height: 240px; padding: 22px; }
  .k-spaces-grid__title { font-size: 22px; }

  /* Concierge launcher — keep clear of bottom CTAs on phones. */
  .k-cc-launch { right: 16px; bottom: 16px; }

  /* Compare modal — already 1-col body at 880; ensure header stays
     readable on phones. */
  .k-plan__compare { padding: 3vh 3vw; }
  .k-plan__compare-shell { width: 94vw; height: 94vh; }

  /* Journal essays — articles already cap at 680. Tighten gutters
     so the body column doesn't kiss the screen edge on tiny phones,
     and shrink the drop-cap. */
  article { padding-left: 4px; padding-right: 4px; }
  .k-drop::first-letter { font-size: 4em; }

  /* Sample box / care callouts that use `1fr 1fr` and 64px gap on
     desktop — caught by the attribute selector above. The `.k-section`
     already uses 0 horizontal padding; the inner `.k-wrap` carries the
     gutter, which has already been collapsed to --kw-pad-sm above. */

  /* Buttons inside CTA rows on phones — wrap before tip onto next line. */
  .k-btns { gap: 12px; }
}

/* ----- iPhone-12 / iPhone-13 standard (390 wide) and below ------------- */
@media (max-width: 480px) {
  :root { --kw-pad-sm: 20px; }

  /* Compare section — editorial two-column. Mobile rules live with the
     .k-vs2 block below. */

  /* Hero cinematic — full-width CTAs already stack at 480; reinforce
     padding so they don't hug the edges. */
  .k-hero-cinema__cta { padding: 16px 22px; min-height: 52px; font-size: 11.5px; }

  /* k-h2 / k-h3 final clamp at small phones. */
  .k-h2 { font-size: clamp(28px, 8vw, 36px); letter-spacing: -0.025em; }

  /* Footer 5-col → at 540 already 1 col; reinforce padding. */
  .k-foot__inner { padding: 64px var(--kw-pad-sm) 64px; }
  .k-foot__masthead { padding-bottom: 40px; }
  .k-foot__cols { padding: 40px 0; }
  .k-foot__head { font-size: 28px; }

  /* Method numbers grid — already 1-col at 480. Reinforce gap. */
  .k-method__numbers-grid { gap: 28px; }
  .k-method__numbers-fig { font-size: clamp(48px, 12vw, 64px); }

  /* Wizard tile grid — locked to 1 col at 460; reinforce body height. */
  .k-wiz__tile-body { min-height: 0; padding: 12px 14px 14px; }
  .k-wiz__tile-name { font-size: 14px; }
  .k-wiz__tile-dek { font-size: 11.5px; }

  /* Planner steps — five items get crowded on 390 wide screens.
     Reduce gap and font-size further. */
  .k-plan__steps { gap: 0; }
  .k-plan__step { padding: 8px 4px; gap: 2px; }
  .k-plan__stepnum { font-size: 10px; }
  .k-plan__steplabel { font-size: 8.5px; letter-spacing: 0.06em; }

  /* Toolbar buttons — five become very narrow. Hide numerals on
     phones; lbl alone is enough. */
  .k-plan__tool-num { display: none; }

  /* Paint grid stays 2-col here. */

  /* Spaces grid — single column on very narrow widths so each room
     reads cleanly. */
  .k-spaces-grid { grid-template-columns: 1fr; }
  .k-spaces-grid__cell { min-height: 220px; }

  /* k-grid--2 — already 1-col at 600; reinforce gap. */
  .k-grid { gap: 28px !important; }

  /* Spec-row keys can be very narrow on small screens. Stack key + val
     vertically (already does at 700; explicit here for safety). */
  .k-spec-list__row { grid-template-columns: 1fr; gap: 4px; padding: 12px 0; }
  .k-spec-list__key { font-size: 9px; letter-spacing: 0.18em; }
  .k-spec-list__val { font-size: 14px; }

  /* Visit-page and trade-page two-column splits already collapse.
     Reinforce form gap. */
  .k-form { gap: 22px; }
  .k-form input,
  .k-form select,
  .k-form textarea { font-size: 16px; padding: 10px 0; }

  /* Hero CTA inside k-section--terra (trade strip on home) — full
     width on phones for clean tap target. */
  .k-section--terra .k-btn { width: 100%; justify-content: center; }

  /* Inline-style FAQ + accordions — k-method__faq-q font scale already
     drops at 600; no changes needed. */
}

/* ----- iPhone SE (375 wide) and below ---------------------------------- */
@media (max-width: 380px) {
  :root { --kw-pad-sm: 16px; }

  /* Final type pass — the cinematic hero CTAs at SE width can wrap. */
  .k-hero-cinema__cta { padding: 14px 18px; font-size: 11px; letter-spacing: 0.14em; }

  /* Trim outer wrap padding so the cards aren't stamp-sized. */
  .k-wrap { padding: 0 var(--kw-pad-sm); }

  /* Compare section — editorial two-column. Mobile rules live with the
     .k-vs2 block below. */

  /* Planner readout: stacked. Each line at small size. */
  .k-plan__price { font-size: 26px; }
}

/* ----- Tablet (≤ 1024) — between phone and desktop --------------------- */
@media (max-width: 1024px) and (min-width: 769px) {
  /* On iPad portrait (768 × 1024) the wizard is in stacked mode (≤960);
     give the preview pane a stable max-height so it doesn't dominate.
     The wizard's own min-height: 540 already protects the question
     pane; we only constrain the preview SVG on smaller-than-desktop. */
  .k-wiz__preview-svg { max-height: 60vh; }

  /* Method numbers grid — at 900 the inline 4-col becomes 2 already.
     Tablet keeps the 2-col rhythm. */

  /* Inline 4-column photo strips on offerings/spaces/home — at this
     tablet width keep them as 2-col rather than the tight 4. */
  [style*="grid-template-columns: repeat(4, 1fr)"] {
    grid-template-columns: repeat(3, 1fr) !important;
  }
}



/* ============================================================
   INVENTORY STEP + CAPACITY READOUT (step 3 of the wizard)
   Four counters with +/-/text-input editors, paired with a live
   readout block that translates the wardrobe into required hang
   feet, drawer banks, folded shelves and shoe slots.
   ============================================================ */
.k-wiz__inv {
  display: flex;
  flex-direction: column;
  gap: 18px;
  margin-top: 28px;
  margin-bottom: 28px;
}
.k-wiz__inv-row {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: center;
  gap: 18px;
  padding: 18px 22px;
  background: var(--kw-bone);
  border: 1px solid var(--kw-rule);
  transition: border-color 0.18s ease;
}
.k-wiz__inv-row:hover { border-color: var(--kw-rule-strong); }
.k-wiz__inv-meta {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.k-wiz__inv-label {
  font-size: 15px;
  font-weight: 500;
  color: var(--kw-ink);
  letter-spacing: -0.005em;
}
.k-wiz__inv-sub {
  font-size: 12px;
  color: var(--kw-text-mute);
  opacity: 0.78;
}
.k-wiz__inv-stepper {
  display: inline-flex;
  align-items: stretch;
  border: 1px solid var(--kw-rule-strong);
  background: var(--kw-paper);
}
.k-wiz__inv-btn {
  width: 44px;
  height: 44px;
  background: var(--kw-paper);
  border: 0;
  font-family: Georgia, "Times New Roman", serif;
  font-size: 22px;
  color: var(--kw-ink);
  cursor: pointer;
  transition: background 0.16s ease;
}
.k-wiz__inv-btn:hover { background: var(--kw-bone-2); color: var(--kw-terra); }
.k-wiz__inv-btn:disabled { opacity: 0.25; cursor: not-allowed; }
.k-wiz__inv-val {
  width: 60px;
  height: 44px;
  border: 0;
  border-left: 1px solid var(--kw-rule-strong);
  border-right: 1px solid var(--kw-rule-strong);
  text-align: center;
  font-family: Georgia, "Times New Roman", serif;
  font-size: 22px;
  color: var(--kw-ink);
  background: var(--kw-paper);
  outline: none;
}
.k-wiz__inv-val:focus { background: var(--kw-bone-2); }
.k-wiz__inv-hint {
  grid-column: 1 / -1;
  font-size: 12px;
  color: var(--kw-text-mute);
  opacity: 0.6;
  padding-left: 0;
}

.k-wiz__inv-readout {
  background: var(--kw-ink);
  color: var(--kw-paper);
  padding: 26px 28px 28px;
  border: 0;
}
.k-wiz__inv-readout-eyebrow {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--kw-terra);
  opacity: 0.95;
}
.k-wiz__inv-readout-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  margin-top: 16px;
  margin-bottom: 18px;
}
@media (max-width: 600px) {
  .k-wiz__inv-readout-grid { grid-template-columns: repeat(2, 1fr); gap: 18px; }
}
.k-wiz__inv-readout-grid > div {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-right: 12px;
  border-right: 1px solid rgba(255,255,255,0.12);
}
.k-wiz__inv-readout-grid > div:last-child { border-right: 0; }
.k-wiz__inv-readout-num {
  font-family: Georgia, "Times New Roman", serif;
  font-size: 30px;
  line-height: 1;
  color: var(--kw-paper);
  letter-spacing: -0.015em;
}
.k-wiz__inv-readout-cap {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-paper);
  opacity: 0.55;
}
.k-wiz__inv-readout-note {
  font-size: 14px;
  line-height: 1.5;
  color: var(--kw-paper);
  opacity: 0.84;
  margin: 0;
  padding-top: 18px;
  border-top: 1px solid rgba(255,255,255,0.16);
}
.k-wiz__inv-readout-note strong {
  color: var(--kw-terra);
  font-weight: 600;
}

/* ============================================================
   SMART-SUGGESTION NOTES (Review step)
   Shows above the spec sheet — the moments where the wizard
   has caught a sub-optimal choice and is recommending an
   improvement. Severity "warning" adds a stronger terra accent.
   ============================================================ */
.k-wiz__notes {
  background: var(--kw-bone-2);
  border-left: 4px solid var(--kw-terra);
  padding: 22px 26px;
  margin: 26px 0 32px;
}
.k-wiz__notes-eyebrow {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin-bottom: 14px;
}
.k-wiz__notes-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.k-wiz__notes-item {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding-left: 14px;
  border-left: 1px solid var(--kw-rule-strong);
}
.k-wiz__notes-item--warn { border-left-color: var(--kw-terra); }
.k-wiz__notes-title {
  font-size: 14px;
  font-weight: 500;
  color: var(--kw-ink);
  letter-spacing: -0.005em;
}
.k-wiz__notes-item--warn .k-wiz__notes-title { color: var(--kw-terra-deep, var(--kw-terra)); }
.k-wiz__notes-body {
  font-size: 13px;
  line-height: 1.55;
  color: var(--kw-text-mute);
}

/* ============================================================
   LIVE PHOTOREAL PREVIEW — k-wiz__preview-render
   The AI render is the primary preview, always visible in the
   wizard's right pane. The SVG sits behind it as a fallback
   layer. A toggle lets the user switch between Render and
   Drawing views; the regenerate button fires a fresh variation.
   ============================================================ */
.k-wiz__preview-render {
  position: relative;
  width: 100%;
  aspect-ratio: 3 / 2;
  overflow: hidden;
  background: var(--kw-ink);
  display: block;
}
.k-wiz__preview-svg-layer {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--kw-bone-2);
  /* Default: SVG sits behind the photoreal image. When the user
     toggles to "Drawing" view, we promote it to the front. */
  z-index: 1;
  opacity: 1;
}
.k-wiz__preview-svg-layer > svg {
  width: 100%;
  height: 100%;
  display: block;
}
.k-wiz__preview-render-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  z-index: 2;
  opacity: 1;
  transition: opacity 0.5s ease;
  background: var(--kw-bone-2);
}
.k-wiz__preview-veil {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  background: rgba(29, 35, 44, 0.62);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  color: var(--kw-paper);
  padding: 32px;
  text-align: center;
  transition: opacity 0.32s ease;
}
.k-wiz__preview-veil[hidden] { display: none; }
.k-wiz__preview-veil .k-wiz__render-spinner {
  border: 2px solid rgba(255, 255, 255, 0.28);
  border-top-color: var(--kw-paper);
}
.k-wiz__preview-veil .k-wiz__render-msg {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--kw-paper);
}

/* Drawing-view variant — promote the SVG over the image. */
.k-wiz__preview-render[data-view="drawing"] .k-wiz__preview-svg-layer { z-index: 5; }
.k-wiz__preview-render[data-view="drawing"] .k-wiz__preview-render-img { z-index: 1; }

/* Toggle + regenerate button row, just below the preview frame. */
.k-wiz__preview-tools {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 12px 16px;
  background: var(--kw-bone);
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
}
.k-wiz__preview-toggle {
  display: inline-flex;
  border: 1px solid var(--kw-rule-strong);
}
.k-wiz__preview-toggle-btn {
  padding: 8px 16px;
  background: transparent;
  border: 0;
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-text-mute);
  cursor: pointer;
  transition: background 0.18s ease, color 0.18s ease;
}
.k-wiz__preview-toggle-btn + .k-wiz__preview-toggle-btn {
  border-left: 1px solid var(--kw-rule-strong);
}
.k-wiz__preview-toggle-btn:hover { color: var(--kw-ink); }
.k-wiz__preview-toggle-btn.is-active {
  background: var(--kw-ink);
  color: var(--kw-paper);
}
.k-wiz__preview-regen {
  padding: 8px 14px;
  background: transparent;
  border: 1px solid var(--kw-rule-strong);
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  cursor: pointer;
  transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease;
}
.k-wiz__preview-regen:hover {
  border-color: var(--kw-terra);
  color: var(--kw-terra);
}
.k-wiz__preview-regen:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}
@media (max-width: 540px) {
  .k-wiz__preview-tools {
    flex-wrap: wrap;
    gap: 8px;
  }
  .k-wiz__preview-toggle-btn { padding: 8px 12px; font-size: 9px; }
}

/* ==========================================================================
   HERO AMBIENT DEPTH LAYERS (2026-05-26)
   --------------------------------------------------------------------------
   Five layers that turn the static SVG shop drawing into a living
   architectural plate: warm light pool, paper drift, grain, corner
   watermark, micro-tilt. All entries respect prefers-reduced-motion.
   ========================================================================== */

/* Layer 1 — Warm light pool. Soft terra spotlight centred on Act 2. */
.k-hero-cinema__act--2::before {
  content: "";
  position: absolute; inset: 0;
  pointer-events: none;
  background: radial-gradient(ellipse 58% 46% at 50% 54%,
    rgba(94, 34, 44, 0.055) 0%,
    rgba(94, 34, 44, 0.028) 38%,
    rgba(94, 34, 44, 0) 72%);
  mix-blend-mode: multiply;
  animation: kw-hero-bloom 22s ease-in-out infinite;
  z-index: 1;
}
@keyframes kw-hero-bloom {
  0%, 100% { opacity: 0.85; transform: scale(1); }
  50%      { opacity: 1;    transform: scale(1.035); }
}

/* Layer 2 — Paper drift. Slow vertical breath on the drawing surface. */
.k-hero-cinema__draw {
  animation: kw-hero-paper-drift 34s ease-in-out infinite;
  will-change: transform;
}
@keyframes kw-hero-paper-drift {
  0%, 100% { transform: translateY(-6px); }
  50%      { transform: translateY(6px); }
}

/* Layer 3 — Paper grain. SVG noise tile overlaid for tooth. */
.k-hero-cinema__act--2::after {
  content: "";
  position: absolute; inset: 0;
  pointer-events: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.43  0 0 0 0 0.21  0 0 0 0 0.13  0 0 0 0.6 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.55'/></svg>");
  background-size: 160px 160px;
  opacity: 0.08;
  mix-blend-mode: multiply;
  z-index: 2;
}

/* Layer 4 — Corner watermark. Faint terra diagonal hatching, lower-right.
   Layer 5 — Micro-tilt animation on the stamp. */
.k-hero-cinema::before {
  content: "";
  position: absolute;
  right: -40px; bottom: -40px;
  width: 320px; height: 320px;
  pointer-events: none;
  background: repeating-linear-gradient(45deg,
    rgba(94, 34, 44, 0.10) 0 1px,
    rgba(94, 34, 44, 0) 1px 9px);
  -webkit-mask-image: radial-gradient(closest-side, #000 30%, transparent 75%);
          mask-image: radial-gradient(closest-side, #000 30%, transparent 75%);
  z-index: 1;
  transform-origin: 75% 75%;
  animation: kw-hero-stamp-tilt 48s ease-in-out infinite;
}
@keyframes kw-hero-stamp-tilt {
  0%, 100% { transform: rotate(-0.35deg); }
  50%      { transform: rotate(0.4deg); }
}

@media (prefers-reduced-motion: reduce) {
  .k-hero-cinema__act--2::before,
  .k-hero-cinema__draw,
  .k-hero-cinema::before { animation: none !important; transform: none !important; }
}


/* ==========================================================================
   PULL-QUOTE BREAKS — Home page caesuras (A, B, C, 2026-05-26)
   --------------------------------------------------------------------------
   Display-scale typography acting as the visual layer between content
   blocks. Three distinct postures so they don't read as the same
   component repeated.
   ========================================================================== */

.k-pullq {
  background: var(--kw-bone-2);
  /* Heyoasis-feel rhythm: bumped to match the new .k-section cadence. */
  padding: 152px 0;
  position: relative;
  overflow: hidden;
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
}
.k-pullq + .k-pullq,
.k-pullq + .k-section--paper,
.k-pullq + .k-section--ink,
.k-section--paper + .k-pullq,
.k-section--ink + .k-pullq { border-top: 0; }

.k-pullq__inner { max-width: 1180px; margin: 0 auto; position: relative; }

.k-pullq__kicker { display: block; opacity: 0.55; margin-bottom: 40px; }
.k-pullq__kicker--terra { color: var(--kw-terra); opacity: 0.9; }

.k-pullq__quote {
  font-family: var(--kw-sans);
  font-size: clamp(54px, 8.4vw, 120px);
  line-height: 0.96;
  font-weight: 700;
  letter-spacing: -0.04em;
  color: var(--kw-ink);
  text-wrap: balance;
  margin: 0;
}

.k-pullq__dot { color: var(--kw-terra); }
.k-pullq__accent { color: var(--kw-terra); font-style: italic; font-weight: 500; }

/* Variant A — centred, hairline-framed */
.k-pullq--a { padding: 156px 0; }
.k-pullq--a .k-pullq__inner { text-align: center; max-width: 1080px; padding: 72px 0; }
.k-pullq--a .k-pullq__kicker { text-align: center; margin-bottom: 56px; opacity: 0.5; }
.k-pullq--a .k-pullq__quote {
  font-size: clamp(48px, 8.4vw, 112px);
  letter-spacing: -0.044em;
  line-height: 0.96;
}
.k-pullq__rule {
  display: block; width: 64px; height: 1px;
  background: var(--kw-rule-strong);
  margin: 0 auto;
  position: absolute; left: 50%;
  transform: translateX(-50%);
}
.k-pullq__rule--top { top: 0; }
.k-pullq__rule--btm { bottom: 0; }

/* Variant B — asymmetric left-bleed */
.k-pullq--b { padding: 160px 0; }
.k-pullq--b .k-pullq__inner { display: grid; grid-template-columns: minmax(0, 1fr); max-width: 1180px; }
.k-pullq--b .k-pullq__kicker { margin-bottom: 48px; }
.k-pullq--b .k-pullq__quote--left {
  text-align: left;
  font-size: clamp(46px, 8vw, 108px);
  letter-spacing: -0.044em;
  line-height: 0.94;
  max-width: 1040px;
}
.k-pullq__sig {
  display: block; margin-top: 56px;
  font-family: var(--kw-mono);
  font-size: 10px; letter-spacing: 0.32em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.42;
}

/* Variant C — folio split */
.k-pullq--c { padding: 164px 0; }
.k-pullq__inner--folio {
  display: grid; grid-template-columns: 180px 1fr; gap: 72px;
  align-items: start;
}
.k-pullq__folio-meta {
  display: flex; flex-direction: column; gap: 14px;
  padding-top: 18px; border-top: 1px solid var(--kw-rule-strong);
}
.k-pullq__folio-num { color: var(--kw-terra); opacity: 0.95; }
.k-pullq__folio-cap { opacity: 0.5; }
.k-pullq__quote--folio {
  font-size: clamp(44px, 7.6vw, 104px);
  line-height: 0.96;
  letter-spacing: -0.042em;
  text-align: left;
}

@media (max-width: 900px) {
  /* Heyoasis-feel rhythm at phone scale: 104/116/112 to match the
     150% cadence applied at desktop without orphaning short content. */
  .k-pullq { padding: 104px 0; }
  .k-pullq--a { padding: 116px 0; }
  .k-pullq--a .k-pullq__inner { padding: 48px 0; }
  .k-pullq--b, .k-pullq--c { padding: 112px 0; }
  .k-pullq__kicker { margin-bottom: 32px; }
  .k-pullq__quote { font-size: clamp(38px, 11vw, 64px); letter-spacing: -0.036em; line-height: 1; }
  .k-pullq--a .k-pullq__quote { font-size: clamp(40px, 12vw, 68px); }
  .k-pullq--b .k-pullq__quote--left { font-size: clamp(38px, 11vw, 64px); }
  .k-pullq__inner--folio { grid-template-columns: 1fr; gap: 32px; }
  .k-pullq__folio-meta { flex-direction: row; justify-content: space-between; padding-top: 14px; }
  .k-pullq__quote--folio { font-size: clamp(40px, 11.5vw, 68px); }
  .k-pullq__sig { margin-top: 36px; }
  .k-pullq__rule { width: 48px; }
}

@media (prefers-reduced-motion: no-preference) {
  .k-pullq__quote, .k-pullq__kicker, .k-pullq__sig, .k-pullq__folio-meta {
    opacity: 0; transform: translateY(8px);
    animation: kPullqRise 1.1s cubic-bezier(0.2, 0.7, 0.2, 1) forwards 0.08s;
  }
  .k-pullq__quote { animation-delay: 0.18s; }
  .k-pullq__sig { animation-delay: 0.32s; }
}
@keyframes kPullqRise { to { opacity: 1; transform: translateY(0); } }


/* ==========================================================================
   MATERIAL SPECIMENS BAND — home page Cabana-style swatch spread
   (2026-05-26). Real surface tones from catalogue.js rendered as
   layered CSS gradients (no stock photo).
   ========================================================================== */
.k-mat-band { background: #ffffff; border-top: 1px solid var(--kw-rule); border-bottom: 1px solid var(--kw-rule); }
.k-mat-band__eyebrow-link { opacity: 0.6; text-decoration: none; color: var(--kw-ink); transition: color 0.35s ease, opacity 0.35s ease; }
.k-mat-band__eyebrow-link:hover { color: var(--kw-terra); opacity: 1; }

/* Lead photo — full-width photographic anchor above the swatch grid. */
.k-mat-band__lead {
  position: relative;
  margin: 0 0 64px;
  aspect-ratio: 21 / 9;
  overflow: hidden;
  background: var(--kw-ink);
}
.k-mat-band__lead-img {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center 50%;
  filter: saturate(0.92) brightness(1.0) contrast(1.04);
}
.k-mat-band__lead::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(14,17,22,0.00) 0%,
    rgba(14,17,22,0.00) 56%,
    rgba(14,17,22,0.42) 88%,
    rgba(14,17,22,0.66) 100%);
  pointer-events: none;
}
.k-mat-band__lead-cap {
  position: absolute;
  left: 36px; right: 36px; bottom: 28px;
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 24px;
  color: var(--kw-paper);
  z-index: 1;
}
.k-mat-band__lead-meta {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  opacity: 0.78;
}
@media (max-width: 760px) {
  .k-mat-band__lead { aspect-ratio: 4 / 3; margin-bottom: 48px; }
  .k-mat-band__lead-cap { left: 22px; right: 22px; bottom: 20px; flex-direction: column; gap: 8px; align-items: flex-start; }
  .k-mat-band__lead-meta { font-size: 10px; letter-spacing: 0.18em; }
}

/* Family nav — six material families above the swatch grid. Each one
   reads as a chapter doorway into the deeper materials.html catalogue.
   Number + name + specimen count. Hairline-bordered tiles, terra
   numeral, no images — pure typography so the band feels like an
   editorial table of contents, not a card row. */
.k-mat-band__families {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 0;
  margin: 0 0 72px;
  border-top: 1px solid var(--kw-rule-strong);
  border-bottom: 1px solid var(--kw-rule-strong);
}
.k-mat-band__family {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 28px 24px;
  text-decoration: none;
  color: inherit;
  border-right: 1px solid var(--kw-rule);
  transition: background 0.32s ease;
}
.k-mat-band__family:last-child { border-right: 0; }
.k-mat-band__family:hover { background: var(--kw-bone-2); }
.k-mat-band__family-num { color: var(--kw-terra); opacity: 0.86; }
.k-mat-band__family-name {
  font-family: var(--kw-sans);
  font-weight: 500;
  font-size: clamp(17px, 1.4vw, 22px);
  line-height: 1.2;
  letter-spacing: -0.012em;
  color: var(--kw-ink);
}
.k-mat-band__family-count {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
  margin-top: 6px;
}
@media (max-width: 1100px) {
  .k-mat-band__families { grid-template-columns: repeat(3, 1fr); }
  .k-mat-band__family:nth-child(3n) { border-right: 0; }
  .k-mat-band__family:nth-child(-n+3) { border-bottom: 1px solid var(--kw-rule); }
}
@media (max-width: 600px) {
  .k-mat-band__families { grid-template-columns: repeat(2, 1fr); margin-bottom: 48px; }
  .k-mat-band__family { padding: 22px 18px; }
  .k-mat-band__family:nth-child(2n) { border-right: 0; }
  .k-mat-band__family:nth-child(-n+4) { border-bottom: 1px solid var(--kw-rule); }
  .k-mat-band__family-name { font-size: 15px; }
}

.k-mat-band__lede {
  max-width: 720px; margin: 0 0 64px;
  font-family: var(--kw-sans); font-size: 18px; line-height: 1.55;
  letter-spacing: -0.008em; color: var(--kw-ink); opacity: 0.78;
}

.k-mat-band__grid {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 56px 40px;
}

.k-mat-band__tile {
  display: flex; flex-direction: column; gap: 22px;
  transition: transform 0.55s cubic-bezier(0.2, 0.7, 0.2, 1);
}
.k-mat-band__tile:hover { transform: translateY(-4px); }

.k-mat-band__chip {
  position: relative;
  aspect-ratio: 2 / 3;
  width: 100%;
  background-color: var(--fill);
  background-image:
    repeating-linear-gradient(92deg, rgba(0,0,0,0) 0, rgba(0,0,0,0) 6px, var(--grain) 6px, var(--grain) 6.6px),
    radial-gradient(120% 80% at 30% 25%, rgba(255,255,255,0.12), rgba(255,255,255,0) 60%),
    radial-gradient(90% 70% at 70% 80%, rgba(0,0,0,0.18), rgba(0,0,0,0) 65%),
    linear-gradient(180deg, var(--fill), var(--grain));
  background-blend-mode: soft-light, normal, normal, normal;
  box-shadow: inset 0 0 0 1px rgba(29,35,44,0.08), 0 1px 0 rgba(29,35,44,0.04);
  outline: 1px solid transparent;
  outline-offset: 6px;
  transition: outline-color 0.45s ease, box-shadow 0.45s ease;
}
.k-mat-band__tile:hover .k-mat-band__chip {
  outline-color: var(--kw-terra);
  box-shadow: inset 0 0 0 1px rgba(29,35,44,0.12), 0 6px 18px rgba(29,35,44,0.08);
}

.k-mat-band__no {
  position: absolute; top: 14px; left: 14px;
  font-family: var(--kw-mono); font-size: 9px; letter-spacing: 0.22em;
  text-transform: uppercase; color: #ffffff; opacity: 0.78;
  mix-blend-mode: difference; pointer-events: none;
}

.k-mat-band__cap { display: flex; flex-direction: column; gap: 10px; padding-top: 4px; border-top: 1px solid var(--kw-rule); }
.k-mat-band__tier { margin-top: 14px; opacity: 0.78; }
.k-mat-band__name { font-family: var(--kw-sans); font-size: 17px; line-height: 1.24; font-weight: 500; letter-spacing: -0.012em; color: var(--kw-ink); margin: 0; }
.k-mat-band__origin { font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--kw-ink); opacity: 0.5; }

.k-mat-band__foot { margin-top: 80px; padding-top: 32px; border-top: 1px solid var(--kw-rule); display: flex; align-items: baseline; justify-content: space-between; gap: 32px; flex-wrap: wrap; }
.k-mat-band__cta { font-family: var(--kw-sans); font-size: 22px; line-height: 1.1; letter-spacing: -0.014em; font-weight: 500; color: var(--kw-ink); text-decoration: none; display: inline-flex; align-items: baseline; gap: 14px; transition: color 0.35s ease; }
.k-mat-band__cta-arrow { color: var(--kw-terra); font-family: var(--kw-mono); transition: transform 0.45s cubic-bezier(0.2,0.7,0.2,1); }
.k-mat-band__cta:hover { color: var(--kw-terra); }
.k-mat-band__cta:hover .k-mat-band__cta-arrow { transform: translateX(6px); }
.k-mat-band__foot-meta { opacity: 0.5; }

@media (max-width: 1100px) { .k-mat-band__grid { grid-template-columns: repeat(3, 1fr); gap: 48px 32px; } }
@media (max-width: 800px) {
  .k-mat-band__grid { grid-template-columns: repeat(2, 1fr); gap: 40px 24px; }
  .k-mat-band__lede { margin-bottom: 48px; font-size: 16px; }
  .k-mat-band__foot { margin-top: 56px; padding-top: 24px; }
  .k-mat-band__cta { font-size: 18px; }
}
@media (max-width: 520px) {
  .k-mat-band__grid { grid-template-columns: 1fr; gap: 36px; }
  .k-mat-band__chip { aspect-ratio: 3 / 4; }
  .k-mat-band__name { font-size: 16px; }
}
@media (prefers-reduced-motion: reduce) {
  .k-mat-band__tile, .k-mat-band__chip, .k-mat-band__cta-arrow { transition: none; }
  .k-mat-band__tile:hover { transform: none; }
  .k-mat-band__cta:hover .k-mat-band__cta-arrow { transform: none; }
}

/* ─────────────────────────────────────────────────────────────────
   THE WORKSHOP · 380 CANAL PLACE  ·  home-page editorial spread
   Two-column "turn-the-page" layout: left page is a giant mono-caps
   address; right page is a draughtsman's coordinate sheet plotting
   the route from the SoHo showroom to the Bronx workshop. Terra is
   reserved for the workshop pin + the route itself; everything else
   is ink at varied opacities, matching the sheet idiom used in the
   hero. The route self-draws on first paint.
   ───────────────────────────────────────────────────────────────── */
/* Heyoasis-feel rhythm: bumped to match the new .k-section cadence. */
.k-workshop { padding-top: 152px; padding-bottom: 152px; }
.k-workshop__spread {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 96px;
  align-items: start;
  margin-top: 56px;
}
.k-workshop__page { position: relative; }
.k-workshop__page--type { padding-top: 16px; }
.k-workshop__folio { display: block; margin-bottom: 36px; }

/* The address as visual centerpiece — mono caps, set huge, tight. */
.k-workshop__address {
  font-family: var(--kw-sans);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: -0.018em;
  line-height: 0.86;
  color: var(--kw-ink);
  margin: 0 0 64px 0;
  display: flex; flex-direction: column; gap: 4px;
}
.k-workshop__addr-num { font-size: clamp(96px, 14vw, 184px); letter-spacing: -0.04em; color: var(--kw-terra); line-height: 0.82; }
.k-workshop__addr-st  { font-size: clamp(40px, 5.6vw, 76px); letter-spacing: -0.02em; }
.k-workshop__addr-loc { font-size: clamp(24px, 3.2vw, 42px); letter-spacing: 0.02em; opacity: 0.88; }
.k-workshop__addr-rule {
  display: block; width: 56px; height: 2px;
  background: var(--kw-ink); opacity: 0.32;
  margin: 22px 0 22px 0;
}

/* Specifications list — two-column micro-data block. */
.k-workshop__facts {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: 22px 48px; margin: 0 0 48px 0;
  border-top: 1px solid var(--kw-rule-strong);
  padding-top: 28px;
}
.k-workshop__fact { display: flex; flex-direction: column; gap: 8px; }
.k-workshop__fact dt { color: var(--kw-ink); opacity: 0.55; }
.k-workshop__fact dd { margin: 0; font-size: 13px; color: var(--kw-ink); line-height: 1.45; }

.k-workshop__credo {
  font-family: var(--kw-sans);
  font-size: clamp(20px, 2.4vw, 28px);
  line-height: 1.28; letter-spacing: -0.012em;
  color: var(--kw-ink); max-width: 36ch; margin: 0;
}
.k-workshop__credo em { font-style: italic; color: var(--kw-terra); }

/* RIGHT PAGE — the coordinate sheet. Aspect-ratio holds the SVG. */
.k-workshop__page--sheet {
  background: var(--kw-bone-2);
  border: 1px solid var(--kw-rule);
  padding: 18px;
  aspect-ratio: 600 / 760;
  position: sticky; top: 96px;
}
.k-workshop__sheet { display: block; width: 100%; height: 100%; }

/* Sheet typography — mono everywhere, like the hero drawing. */
.k-workshop__sheet text { font-family: var(--kw-mono); fill: var(--kw-ink); }
.kw-sheet-h { font-size: 11px; letter-spacing: 0.22em; }
.kw-sheet-m { font-size: 9px; letter-spacing: 0.18em; opacity: 0.62; }
.kw-sheet-tick { font-size: 8.5px; letter-spacing: 0.16em; opacity: 0.5; }

/* Grid + title + north arrow — hairline ink, low contrast. */
.k-workshop__sheet line, .k-workshop__sheet path { fill: none; }
.kw-sheet-grid line { stroke: var(--kw-ink); stroke-width: 0.5; opacity: 0.14; }
.kw-sheet-north line, .kw-sheet-north path { stroke: var(--kw-ink); stroke-width: 1; opacity: 0.7; }
.kw-sheet-axis text { opacity: 0.5; }

/* The route line — terra, drawn in over 2s. */
.kw-sheet-route {
  stroke: var(--kw-terra); stroke-width: 2.2;
  stroke-linecap: round; stroke-linejoin: round;
  stroke-dasharray: 1; stroke-dashoffset: 1;
  animation: kw-route-draw 2.4s cubic-bezier(.22,.61,.36,1) 0.4s both;
}
@keyframes kw-route-draw { to { stroke-dashoffset: 0; } }

/* The river — a hatched gap across the route. */
.kw-sheet-river line { stroke: var(--kw-ink); stroke-width: 0.7; opacity: 0.42; }
.kw-sheet-river-l { font-size: 8px; letter-spacing: 0.22em; opacity: 0.5; fill: var(--kw-ink); }

/* Pins — SoHo in ink, the workshop in terra (the destination). */
.kw-sheet-pin circle { stroke-width: 1.2; fill: transparent; }
.kw-sheet-pin .kw-sheet-pin-dot { fill: var(--kw-ink); stroke: none; }
.kw-sheet-pin line { stroke: var(--kw-ink); stroke-width: 0.7; opacity: 0.6; }
.kw-sheet-pin .kw-sheet-pin-l { font-size: 10px; letter-spacing: 0.22em; font-weight: 500; }
.kw-sheet-pin .kw-sheet-pin-m { font-size: 8px; letter-spacing: 0.2em; opacity: 0.55; }
.kw-sheet-pin--soho circle { stroke: var(--kw-ink); }
.kw-sheet-pin--bx circle { stroke: var(--kw-terra); }
.kw-sheet-pin--bx .kw-sheet-pin-dot { fill: var(--kw-terra); }
.kw-sheet-pin--bx .kw-sheet-pin-l { fill: var(--kw-terra); }

.kw-sheet-legend line { stroke: var(--kw-terra); stroke-width: 2.2; }
.kw-sheet-legend text { opacity: 0.7; }

/* MOBILE — stack the spread, drop the sticky, scale the type. */
@media (max-width: 900px) {
  .k-workshop { padding-top: 104px; padding-bottom: 104px; }
  .k-workshop__spread { grid-template-columns: 1fr; gap: 64px; margin-top: 36px; }
  .k-workshop__page--sheet { position: static; aspect-ratio: 600 / 760; padding: 12px; }
  .k-workshop__address { margin-bottom: 44px; }
  .k-workshop__addr-num { font-size: clamp(72px, 22vw, 120px); }
  .k-workshop__addr-st { font-size: clamp(32px, 9vw, 52px); }
  .k-workshop__addr-loc { font-size: clamp(20px, 6vw, 32px); }
  .k-workshop__facts { grid-template-columns: 1fr; gap: 18px; padding-top: 22px; margin-bottom: 36px; }
  .k-workshop__credo { font-size: clamp(18px, 4.6vw, 22px); }
}

@media (prefers-reduced-motion: reduce) {
  .kw-sheet-route { animation: none; stroke-dashoffset: 0; }
}

/* ==========================================================================
   HOME CLOSERS — Trade Strip (§11) + Visit (§12)
   Two closing moments before the footer. Trade reads as an editorial
   spec block on bone-2; Visit reads as a generous bone invitation.
   ========================================================================== */

/* Trade close — heyoasis-feel photo-backed editorial spec.
   A soft architectural photo sits behind the content as a backplate,
   muted to ~12% opacity so the editorial spec still reads. */
.k-trade-close {
  background: var(--kw-bone-2);
  background-image: linear-gradient(
      to right,
      rgba(238, 232, 218, 0.92) 0%,
      rgba(238, 232, 218, 0.78) 40%,
      rgba(238, 232, 218, 0.62) 100%),
    url("https://images.unsplash.com/photo-1497218770144-3fea6dbc33fe?w=2800&q=88&auto=format&fit=crop");
  background-size: cover;
  background-position: center right;
  background-repeat: no-repeat;
  border-top: 1px solid var(--kw-terra);
  border-bottom: 1px solid var(--kw-rule);
  position: relative;
}
.k-trade-close > .k-wrap { position: relative; z-index: 1; }
.k-trade-close__grid {
  display: grid;
  grid-template-columns: minmax(160px, 0.55fr) minmax(0, 1.45fr);
  gap: 72px;
  align-items: start;
}
.k-trade-close__num {
  font-family: var(--kw-mono);
  font-size: clamp(120px, 16vw, 220px);
  line-height: 0.82;
  letter-spacing: -0.04em;
  color: var(--kw-terra);
  font-weight: 400;
  margin-top: -0.12em;
  user-select: none;
}
.k-trade-close__eyebrow { margin-bottom: 22px; }
.k-trade-close__title { margin: 0 0 56px; max-width: 720px; }
.k-trade-close__list {
  list-style: none;
  margin: 0 0 56px;
  padding: 0;
  border-top: 1px solid var(--kw-rule);
  max-width: 760px;
}
.k-trade-close__list > li {
  display: grid;
  grid-template-columns: minmax(220px, 0.9fr) 1.4fr;
  gap: 32px;
  padding: 22px 0;
  border-bottom: 1px solid var(--kw-rule);
  align-items: baseline;
}
.k-trade-close__list-key {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
}
.k-trade-close__list-val {
  font-size: 17px;
  line-height: 1.35;
  letter-spacing: -0.008em;
  color: var(--kw-ink);
  opacity: 0.82;
}
.k-trade-close__cta {
  display: inline-flex;
  align-items: baseline;
  gap: 18px;
  font-family: var(--kw-sans);
  font-size: 26px;
  line-height: 1;
  letter-spacing: -0.018em;
  font-weight: 500;
  color: var(--kw-ink);
  text-decoration: none;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--kw-ink);
  transition: color 0.3s ease, border-color 0.3s ease;
}
.k-trade-close__cta-arrow {
  color: var(--kw-terra);
  font-family: var(--kw-mono);
  transition: transform 0.4s cubic-bezier(0.2,0.7,0.2,1);
}
.k-trade-close__cta:hover { color: var(--kw-terra); border-bottom-color: var(--kw-terra); }
.k-trade-close__cta:hover .k-trade-close__cta-arrow { transform: translateX(8px); }
@media (max-width: 900px) {
  .k-trade-close__grid { grid-template-columns: 1fr; gap: 16px; }
  .k-trade-close__num { font-size: clamp(96px, 32vw, 160px); margin-bottom: 8px; }
  .k-trade-close__title { margin-bottom: 40px; }
  .k-trade-close__list { margin-bottom: 40px; }
  .k-trade-close__list > li { grid-template-columns: 1fr; gap: 6px; padding: 18px 0; }
  .k-trade-close__cta { font-size: 22px; }
}

/* Visit close — bone, display-scale title with KX plate, hairline meta row */
/* Visit close — heyoasis-feel photo-backed final invitation.
   A SoHo showroom photograph behind the content, washed in white so
   the final invitation reads photographic, not graphic. */
.k-visit-close {
  background-color: #ffffff;
  background-image: linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.96) 0%,
      rgba(255, 255, 255, 0.84) 60%,
      rgba(255, 255, 255, 0.62) 100%),
    url("https://images.unsplash.com/photo-1721044168675-b577e899413d?w=2800&q=88&auto=format&fit=crop");
  background-size: cover;
  background-position: center 35%;
  background-repeat: no-repeat;
  position: relative;
}
.k-visit-close > .k-wrap { position: relative; z-index: 1; }
.k-visit-close__eyebrow { margin-bottom: 56px; }
.k-visit-close__head {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 48px;
  align-items: end;
  padding-bottom: 56px;
  margin-bottom: 56px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-visit-close__title {
  font-family: var(--kw-sans);
  font-size: clamp(64px, 11vw, 184px);
  line-height: 0.9;
  letter-spacing: -0.044em;
  font-weight: 500;
  margin: 0;
  color: var(--kw-ink);
  text-wrap: balance;
}
.k-visit-close__plate {
  width: 120px;
  height: 160px;
  color: var(--kw-ink);
  flex-shrink: 0;
}
.k-visit-close__meta {
  display: grid;
  grid-template-columns: 1fr 1fr 1.2fr;
  gap: 56px;
  align-items: start;
}
.k-visit-close__col-cap { opacity: 0.55; margin-bottom: 18px; }
.k-visit-close__addr {
  font-family: var(--kw-sans);
  font-size: 22px;
  line-height: 1.28;
  letter-spacing: -0.014em;
  font-weight: 500;
  color: var(--kw-ink);
  margin-bottom: 14px;
}
.k-visit-close__hours {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.55;
}
.k-visit-close__col--ctas {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
}
@media (max-width: 900px) {
  .k-visit-close__head { grid-template-columns: 1fr; gap: 32px; padding-bottom: 40px; margin-bottom: 40px; }
  .k-visit-close__plate { width: 96px; height: 128px; }
  .k-visit-close__meta { grid-template-columns: 1fr; gap: 36px; }
  .k-visit-close__eyebrow { margin-bottom: 36px; }
}

/* ==========================================================================
   DOSSIER STRIP — replaces former photo strip on the home page.
   Four numbered tiles, hairline rules between them, display-mono numerals
   with the figure carried in terra. Brand-true data only.
   ========================================================================== */
.k-dossier__grid {
  list-style: none; margin: 56px 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid var(--kw-rule-strong);
  border-bottom: 1px solid var(--kw-rule-strong);
}
.k-dossier__tile {
  position: relative; padding: 56px 32px 44px;
  display: flex; flex-direction: column; align-items: flex-start;
  min-height: 320px;
}
.k-dossier__tile + .k-dossier__tile { border-left: 1px solid var(--kw-rule); }
.k-dossier__folio { position: absolute; top: 20px; left: 32px; color: var(--kw-ink); opacity: 0.4; }
.k-dossier__label { color: var(--kw-ink); opacity: 0.55; margin-bottom: auto; }
.k-dossier__fig {
  font-family: var(--kw-mono); color: var(--kw-ink);
  display: flex; align-items: baseline; gap: 6px;
  margin: 36px 0 22px; line-height: 0.86; letter-spacing: -0.035em;
}
.k-dossier__num { color: var(--kw-terra); font-size: clamp(48px, 4.6vw, 76px); font-weight: 500; }
.k-dossier__sym { color: var(--kw-terra); font-size: clamp(28px, 2.4vw, 40px); }
.k-dossier__unit { color: var(--kw-ink); opacity: 0.7; font-size: clamp(14px, 1.1vw, 17px); letter-spacing: 0.02em; padding-left: 4px; }
.k-dossier__dek {
  font-family: var(--kw-sans); font-size: 14.5px; line-height: 1.42;
  color: var(--kw-ink); opacity: 0.78; max-width: 30ch; margin: 0;
}
@media (max-width: 900px) {
  .k-dossier__grid { grid-template-columns: 1fr 1fr; }
  .k-dossier__tile { min-height: 260px; padding: 48px 22px 32px; }
  .k-dossier__tile:nth-child(2n) { border-left: 1px solid var(--kw-rule); }
  .k-dossier__tile:nth-child(n+3) { border-top: 1px solid var(--kw-rule); }
  .k-dossier__folio { left: 22px; }
}
@media (max-width: 560px) {
  .k-dossier__grid { grid-template-columns: 1fr; }
  .k-dossier__tile { border-left: 0 !important; min-height: 0; padding: 44px 6px 36px; }
  .k-dossier__tile + .k-dossier__tile { border-top: 1px solid var(--kw-rule); }
  .k-dossier__folio { left: 6px; }
}

/* ==========================================================================
   SIGNED — dramatic dark-ink full-bleed moment.
   Huge KX monogram in terra, signature-style display line, a terra plate
   rule crossing the section, register of recent project numbers at the
   bottom in mono caps. The inside cover of a leather-bound portfolio.
   ========================================================================== */
.k-signed {
  position: relative;
  background: var(--kw-ink); color: var(--kw-bone);
  border-top: 1px solid rgba(255,255,255,0.06);
  border-bottom: 1px solid rgba(255,255,255,0.06);
  overflow: hidden;
}
.k-signed__plate {
  position: absolute; left: 0; right: 0; top: 50%;
  height: 1px; background: var(--kw-terra); opacity: 0.55;
  transform: translateY(-50%);
}
.k-signed__inner { position: relative; }
.k-signed__head {
  display: flex; justify-content: space-between; align-items: baseline;
  color: rgba(255,255,255,0.5); margin-bottom: 88px;
  padding-bottom: 22px; border-bottom: 1px solid rgba(255,255,255,0.08);
}
.k-signed__body {
  display: grid; grid-template-columns: minmax(220px, 28%) 1fr;
  gap: clamp(48px, 7vw, 112px); align-items: center;
}
.k-signed__mark { color: var(--kw-bone); line-height: 0; }
.k-signed__mark svg { width: 100%; height: auto; max-width: 320px; display: block; }
.k-signed__mark-x { stroke: var(--kw-terra); }
.k-signed__kicker { display: block; color: var(--kw-terra); opacity: 0.85; margin-bottom: 32px; }
.k-signed__line {
  font-family: var(--kw-sans); font-weight: 700;
  font-size: clamp(44px, 6.8vw, 104px); line-height: 1.0;
  letter-spacing: -0.04em; color: var(--kw-bone);
  margin: 0 0 36px; max-width: 16ch;
}
.k-signed__em { font-style: italic; font-family: "Georgia", "Times New Roman", serif; font-weight: 400; color: var(--kw-bone); }
.k-signed__dot { color: var(--kw-terra); }
.k-signed__caption {
  font-family: var(--kw-sans); font-size: 16px; line-height: 1.55;
  color: rgba(255,255,255,0.72); max-width: 56ch; margin: 0;
}
.k-signed__register {
  list-style: none; margin: 96px 0 0; padding: 28px 0 0;
  border-top: 1px solid rgba(255,255,255,0.12);
  display: flex; gap: clamp(20px, 3vw, 48px); flex-wrap: wrap; align-items: baseline;
}
.k-signed__register li { display: flex; align-items: baseline; gap: 10px; }
.k-signed__reg-label { color: var(--kw-terra); opacity: 0.85; }
.k-signed__reg-label--end { margin-left: auto; opacity: 0.45; color: rgba(255,255,255,0.55); }
.k-signed__reg-num { color: rgba(255,255,255,0.78); font-size: 13px; letter-spacing: 0.12em; }
@media (max-width: 900px) {
  .k-signed__head { margin-bottom: 56px; }
  .k-signed__body { grid-template-columns: 1fr; gap: 48px; }
  .k-signed__mark svg { max-width: 156px; }
  .k-signed__register { margin-top: 64px; gap: 18px 28px; }
  .k-signed__reg-label--end { margin-left: 0; }
}

/* ==========================================================================
   INTERIOR PAGE HEROES — heyoasis-feel photographic backdrops (2026-05-27).
   --------------------------------------------------------------------------
   Each interior page's existing hero gets a soft, page-scoped photographic
   backdrop. The image carries the moment; the editorial title and dek sit
   on top, washed in bone so they read cleanly. No markup changes — just
   page-scoped CSS via body[data-page="X"] selectors.
   ========================================================================== */

/* Shared backdrop scaffold — same gradient + photo pattern across pages,
   with each page-scoped rule supplying its own background-image. */
body[data-page="projects"] .k-reg-hero,
body[data-page="studio"]   .k-studio-hero,
body[data-page="method"]   .k-method__hero,
body[data-page="materials"] .k-hero-wrap,
body[data-page="trade"]    .k-page-hero,
body[data-page="visit"]    .k-page-hero,
body[data-page="care"]     .k-hero-wrap {
  position: relative;
}
body[data-page="projects"] .k-reg-hero::before,
body[data-page="studio"]   .k-studio-hero::before,
body[data-page="method"]   .k-method__hero::before,
body[data-page="materials"] .k-hero-wrap::before,
body[data-page="trade"]    .k-page-hero::before,
body[data-page="visit"]    .k-page-hero::before,
body[data-page="care"]     .k-hero-wrap::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background-size: cover;
  background-position: center 38%;
  background-repeat: no-repeat;
  pointer-events: none;
}
body[data-page="projects"] .k-reg-hero > *,
body[data-page="studio"]   .k-studio-hero > *,
body[data-page="method"]   .k-method__hero > *,
body[data-page="materials"] .k-hero-wrap > *,
body[data-page="trade"]    .k-page-hero > *,
body[data-page="visit"]    .k-page-hero > *,
body[data-page="care"]     .k-hero-wrap > * {
  position: relative;
  z-index: 1;
}

/* Per-page backdrops — each pulls a verified real-photography Unsplash
   image, washed via a diagonal gradient so the editorial title reads. */
body[data-page="projects"] .k-reg-hero::before {
  background-image: linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.96) 0%,
      rgba(255, 255, 255, 0.84) 50%,
      rgba(255, 255, 255, 0.62) 100%),
    url("https://images.unsplash.com/photo-1646872686934-cf4c910fc219?w=2800&q=88&auto=format&fit=crop");
}
body[data-page="studio"] .k-studio-hero::before {
  background-image: linear-gradient(
      135deg,
      rgba(241, 235, 222, 0.94) 0%,
      rgba(241, 235, 222, 0.82) 50%,
      rgba(241, 235, 222, 0.62) 100%),
    url("https://images.unsplash.com/photo-1626081062126-d3b192c1fcb0?w=2800&q=88&auto=format&fit=crop");
}
body[data-page="method"] .k-method__hero::before {
  background-image: linear-gradient(
      135deg,
      rgba(241, 235, 222, 0.94) 0%,
      rgba(241, 235, 222, 0.82) 50%,
      rgba(241, 235, 222, 0.62) 100%),
    url("https://images.unsplash.com/photo-1667400104764-a5fd01a919b0?w=2800&q=88&auto=format&fit=crop");
}
body[data-page="materials"] .k-hero-wrap::before {
  background-image: linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.96) 0%,
      rgba(255, 255, 255, 0.84) 50%,
      rgba(255, 255, 255, 0.66) 100%),
    url("https://images.unsplash.com/photo-1722960961055-b9a8e77ddc9b?w=2800&q=88&auto=format&fit=crop");
}
body[data-page="trade"] .k-page-hero::before {
  background-image: linear-gradient(
      135deg,
      rgba(241, 235, 222, 0.94) 0%,
      rgba(241, 235, 222, 0.78) 50%,
      rgba(241, 235, 222, 0.58) 100%),
    url("https://images.unsplash.com/photo-1631067128698-2f4f8ce87e28?w=2800&q=88&auto=format&fit=crop");
}
body[data-page="visit"] .k-page-hero::before {
  background-image: linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.96) 0%,
      rgba(255, 255, 255, 0.84) 50%,
      rgba(255, 255, 255, 0.62) 100%),
    url("https://images.unsplash.com/photo-1721044168675-b577e899413d?w=2800&q=88&auto=format&fit=crop");
}
body[data-page="care"] .k-hero-wrap::before {
  background-image: linear-gradient(
      135deg,
      rgba(255, 255, 255, 0.96) 0%,
      rgba(255, 255, 255, 0.82) 50%,
      rgba(255, 255, 255, 0.58) 100%),
    url("https://images.unsplash.com/photo-1631067128698-2f4f8ce87e28?w=2800&q=88&auto=format&fit=crop");
}

/* The materials and care heroes are .k-wrap-only sections without their
   own padding; give them a comfortable internal padding so the backdrop
   has room to breathe. */
body[data-page="materials"] .k-hero-wrap,
body[data-page="care"] .k-hero-wrap {
  padding-top: 88px;
  padding-bottom: 88px;
}
@media (max-width: 760px) {
  body[data-page="materials"] .k-hero-wrap,
  body[data-page="care"] .k-hero-wrap { padding-top: 64px; padding-bottom: 64px; }
}

/* ==========================================================================
   BUILDER — interactive closet configurator on design.html (2026-05-28).
   --------------------------------------------------------------------------
   Two-column layout: sticky photo canvas on the left (updates with the
   selected room type), six stepped option panels on the right. A sticky
   inverted summary bar at the bottom carries the running spec, indicative
   price range, and the consultation CTA.
   ========================================================================== */
.k-builder {
  background: var(--kw-bone);
  padding: 88px 0 0;
  position: relative;
}
.k-builder__inner {
  max-width: 1440px;
  margin: 0 auto;
  padding: 0 var(--kw-pad);
}
.k-builder__layout {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: 64px;
  padding-bottom: 140px;
}
.k-builder__canvas {
  position: sticky;
  top: 96px;
  aspect-ratio: 3 / 4;
  margin: 0;
  overflow: hidden;
  background: var(--kw-bone-2);
  border: 1px solid var(--kw-rule);
}
.k-builder__visual {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center 40%;
  background-image: url('https://images.unsplash.com/photo-1722606486160-982bc90fafac?w=2400&q=88&auto=format&fit=crop');
  transition: opacity 0.5s ease;
  filter: saturate(0.94) brightness(1.02) contrast(1.02);
}
.k-builder__caption {
  position: absolute;
  bottom: 0; left: 0; right: 0;
  padding: 24px 28px;
  background: linear-gradient(to top, rgba(14,17,22,0.72), rgba(14,17,22,0.0));
  color: var(--kw-paper);
  display: flex; align-items: baseline; justify-content: space-between; gap: 18px;
}
.k-builder__caption-num {
  font-size: 10.5px; letter-spacing: 0.32em; opacity: 0.78;
}
.k-builder__caption-meta {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  opacity: 0.92;
}
.k-builder__steps {
  list-style: none; margin: 0; padding: 0;
}
.k-builder__step {
  padding: 32px 0;
  border-top: 1px solid var(--kw-rule);
}
.k-builder__step:first-child { border-top: 0; padding-top: 0; }
.k-builder__step:last-child { padding-bottom: 0; }
.k-builder__step-num {
  display: block;
  margin-bottom: 22px;
  font-size: 10.5px;
  letter-spacing: 0.28em;
}
.k-builder__radios,
.k-builder__checks {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.k-builder__radio,
.k-builder__check {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  position: relative;
}
.k-builder__radio input,
.k-builder__check input {
  position: absolute; opacity: 0; pointer-events: none;
}
.k-builder__radio span,
.k-builder__check span {
  display: inline-block;
  padding: 11px 20px;
  border: 1px solid var(--kw-rule-strong);
  border-radius: 999px;
  font-family: var(--kw-sans);
  font-size: 14.5px;
  font-weight: 400;
  color: var(--kw-ink);
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
  user-select: none;
}
.k-builder__radio input:checked + span,
.k-builder__check input:checked + span {
  background: var(--kw-ink);
  color: var(--kw-paper);
  border-color: var(--kw-ink);
}
.k-builder__radio input:focus-visible + span,
.k-builder__check input:focus-visible + span {
  outline: 2px solid var(--kw-terra);
  outline-offset: 3px;
}
.k-builder__sliders {
  display: flex;
  flex-direction: column;
  gap: 20px;
  max-width: 480px;
}
.k-builder__slider {
  display: grid;
  grid-template-columns: 84px 1fr 64px;
  gap: 16px;
  align-items: center;
}
.k-builder__slider-label {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.78;
}
.k-builder__slider input[type="range"] {
  width: 100%;
  accent-color: var(--kw-terra);
  cursor: pointer;
}
.k-builder__slider-value {
  font-family: var(--kw-mono);
  font-size: 14px;
  color: var(--kw-ink);
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.k-builder__dots {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  align-items: center;
}
.k-builder__dot {
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  position: relative;
  padding: 4px;
}
.k-builder__dot input {
  position: absolute; opacity: 0; pointer-events: none;
}
.k-builder__dot-chip {
  display: flex; align-items: center; justify-content: center;
  width: 32px; height: 32px;
  border-radius: 50%;
  border: 1px solid rgba(29, 35, 44, 0.42);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.k-builder__dot-chip--byo {
  background: transparent !important;
  font-family: var(--kw-sans);
  font-size: 18px;
  color: var(--kw-ink);
  opacity: 0.62;
  font-weight: 400;
}
.k-builder__dot input:checked + .k-builder__dot-chip {
  outline: 2px solid var(--kw-ink);
  outline-offset: 4px;
}
.k-builder__dot input:focus-visible + .k-builder__dot-chip {
  outline: 2px solid var(--kw-terra);
  outline-offset: 4px;
}
.k-builder__dot:hover .k-builder__dot-chip { transform: scale(1.06); }
.k-builder__dots-label {
  display: block;
  margin-top: 16px;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.78;
}

/* Sticky bottom bar — inverted ink ground with terra hairline above. */
.k-builder__bar {
  position: sticky;
  bottom: 0;
  z-index: 30;
  background: var(--kw-ink);
  color: var(--kw-paper);
  padding: 22px var(--kw-pad);
  display: grid;
  grid-template-columns: 1.5fr 1fr auto;
  gap: 40px;
  align-items: center;
  border-top: 1.5px solid var(--kw-terra);
}
.k-builder__bar-cell { display: flex; flex-direction: column; }
.k-builder__bar-eye {
  display: block;
  margin-bottom: 4px;
  opacity: 0.6;
  color: var(--kw-paper);
}
.k-builder__bar-summary {
  font-family: var(--kw-sans);
  font-size: 14.5px;
  letter-spacing: -0.005em;
  color: var(--kw-paper);
  line-height: 1.4;
}
.k-builder__bar-figure {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-size: clamp(22px, 2.2vw, 30px);
  letter-spacing: -0.022em;
  color: var(--kw-paper);
  font-variant-numeric: tabular-nums;
}
.k-builder__bar-cell--cta { align-items: flex-end; }

/* Pill button modifier — tylko-style high-radius outlined / filled
   buttons. Applied to consultation CTAs across the site where the
   bigger-feel commitment is appropriate. */
.k-btn--pill {
  border-radius: 999px !important;
}

@media (max-width: 960px) {
  .k-builder { padding-top: 56px; }
  .k-builder__layout {
    grid-template-columns: 1fr;
    gap: 40px;
    padding-bottom: 220px;
  }
  .k-builder__canvas {
    position: relative;
    top: auto;
    aspect-ratio: 4 / 5;
  }
  .k-builder__bar {
    grid-template-columns: 1fr;
    gap: 14px;
    padding: 18px var(--kw-pad-sm);
  }
  .k-builder__bar-cell--cta { align-items: stretch; }
  .k-builder__bar-cell--cta .k-btn { width: 100%; text-align: center; justify-content: center; }
}

/* ==========================================================================
   DESIGN PAGE — CALENDLY EMBED (added 2026-05-27).
   --------------------------------------------------------------------------
   The "Pick a time" section embeds Calendly inline below the project-intake
   form. Visitors who'd rather book directly can; the form-fill flow still
   exists for those who prefer to send context first and let the atelier
   reach out. The container is light-toned to match the bone-paper palette
   so Calendly's themed widget settles in without breaking the editorial
   register.
   ========================================================================== */
.k-design-schedule {
  background-color: var(--kw-bone);
  /* Same diagonal wash treatment as the hero, slightly lighter so the
     widget keeps focus. */
  background-image: linear-gradient(
      135deg,
      rgba(241, 235, 222, 0.98) 0%,
      rgba(241, 235, 222, 0.92) 50%,
      rgba(241, 235, 222, 0.84) 100%);
}
.k-design-schedule__widget {
  margin-top: 24px;
  /* Soft border + paper background so the widget reads as a card on the
     bone-2 section ground without floating in a void. */
  background: #ffffff;
  border: 1px solid var(--kw-rule);
  padding: 8px;
  position: relative;
  overflow: hidden;
}
.k-design-schedule__widget .calendly-inline-widget { width: 100%; }
.k-design-schedule__note {
  margin-top: 32px;
  max-width: 720px;
  font-family: var(--kw-sans);
  font-size: 15px;
  line-height: 1.55;
  color: var(--kw-ink);
  opacity: 0.66;
}
@media (max-width: 760px) {
  .k-design-schedule__widget { padding: 4px; }
  .k-design-schedule__note { font-size: 14px; margin-top: 24px; }
}

/* ==========================================================================
   DESIGN PAGE HERO — heyoasis-feel photographic backdrop (added 2026-05-27).
   --------------------------------------------------------------------------
   The new design.html is the designer-consultation entry point (replaced
   the prior interactive wizard). The hero carries a soft drafting-hand
   photo behind the editorial header, washed in bone so the title and
   dek read cleanly.
   ========================================================================== */
.k-design-hero {
  background-color: var(--kw-bone);
  background-image: linear-gradient(
      135deg,
      rgba(241, 235, 222, 0.94) 0%,
      rgba(241, 235, 222, 0.82) 50%,
      rgba(241, 235, 222, 0.66) 100%),
    url("https://images.unsplash.com/photo-1503387837-b154d5074bd2?w=2800&q=88&auto=format&fit=crop");
  background-size: cover;
  background-position: center 38%;
  background-repeat: no-repeat;
  position: relative;
}
.k-design-hero > .k-wrap { position: relative; z-index: 1; }
.k-design-hero .k-page-hero__dek {
  max-width: 620px;
  font-size: clamp(17px, 1.7vw, 22px);
  line-height: 1.42;
  color: var(--kw-ink);
  opacity: 0.78;
  margin-top: 32px;
}
.k-design-form { background: #ffffff; }

/* What to Expect — three numbered paragraphs, hairline-divided.
   Editorial register treats process as prose, not feature cards. */
.k-design-expect { background: var(--kw-bone); }
.k-design-expect__list { list-style: none; margin: 0; padding: 0; }
.k-design-expect__item {
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: 48px;
  padding: 36px 0;
  border-top: 1px solid var(--kw-rule);
  align-items: baseline;
}
.k-design-expect__item:last-child { border-bottom: 1px solid var(--kw-rule); }
.k-design-expect__num {
  font-size: 11px;
  letter-spacing: 0.26em;
  align-self: start;
  padding-top: 8px;
}
.k-design-expect__item p {
  font-family: var(--kw-sans);
  font-size: clamp(18px, 1.6vw, 22px);
  line-height: 1.5;
  letter-spacing: -0.008em;
  color: var(--kw-ink);
  max-width: 720px;
  margin: 0;
}
@media (max-width: 760px) {
  .k-design-expect__item {
    grid-template-columns: 1fr;
    gap: 14px;
    padding: 28px 0;
  }
  .k-design-expect__num { padding-top: 0; }
  .k-design-expect__item p { font-size: 17px; }
}

/* Editorial paragraph alternative to the 3-card "Or, another way in"
   block — three inline links inside a single justified paragraph. */
.k-design-alt { max-width: 880px; }
.k-design-alt__eye { display: block; margin-bottom: 28px; }
.k-design-alt__body {
  font-family: var(--kw-sans);
  font-size: clamp(18px, 1.4vw, 22px);
  line-height: 1.55;
  letter-spacing: -0.012em;
  color: var(--kw-ink);
  max-width: 760px;
}
.k-design-alt__body a {
  color: var(--kw-ink);
  text-decoration: none;
  border-bottom: 1px solid var(--kw-rule-strong);
  transition: color 0.24s ease, border-color 0.24s ease;
}
.k-design-alt__body a:hover {
  color: var(--kw-terra);
  border-bottom-color: var(--kw-terra);
}
.k-design-alt__body .k-dot { color: var(--kw-terra); }

/* Form select — custom chevron + hairline underline so it matches the
   text inputs above. Was rendering with native OS chrome (rounded box,
   default dropdown arrow), which undermined the editorial register. */
.k-eform__field > select {
  appearance: none;
  -webkit-appearance: none;
  background-color: transparent;
  background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 12' width='14' height='8'%3E%3Cpath d='M 2 2 L 10 10 L 18 2' stroke='%231d232c' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 4px center;
  padding-right: 28px;
  border: 0;
  border-bottom: 1px solid var(--kw-rule-strong);
  border-radius: 0;
  cursor: pointer;
}
.k-eform__field > select:focus {
  outline: none;
  border-bottom-color: var(--kw-terra);
}

/* ==========================================================================
   IN CONFIDENCE — heyoasis-feel photo-cards (added 2026-05-27).
   --------------------------------------------------------------------------
   Three photographic quote cards. Each one carries a single trade or
   client quote overlaid bottom-left over a soft veil. 4:5 portrait
   ratio so they read as plates, not banners.
   ========================================================================== */
.k-confidence__cards {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  margin: 0;
}
.k-confidence__card {
  position: relative;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  margin: 0;
  background: var(--kw-ink);
}
.k-confidence__card-img {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center 42%;
  filter: saturate(0.92) brightness(1.0) contrast(1.04);
  transition: transform 1s cubic-bezier(.16,1,.3,1);
}
.k-confidence__card:hover .k-confidence__card-img { transform: scale(1.04); }
.k-confidence__card-veil {
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(14,17,22,0.10) 0%,
    rgba(14,17,22,0.00) 32%,
    rgba(14,17,22,0.00) 50%,
    rgba(14,17,22,0.48) 84%,
    rgba(14,17,22,0.78) 100%);
  pointer-events: none;
}
.k-confidence__card-body {
  position: absolute;
  left: 28px; right: 28px; bottom: 28px;
  z-index: 1;
  color: var(--kw-paper);
}
.k-confidence__card-quote {
  font-family: var(--kw-sans);
  font-weight: 500;
  font-size: clamp(18px, 1.6vw, 22px);
  line-height: 1.28;
  letter-spacing: -0.014em;
  color: var(--kw-paper);
  margin: 0 0 18px;
  text-shadow: 0 1px 12px rgba(0,0,0,0.34);
  text-wrap: balance;
}
.k-confidence__card-quote .k-dot { color: var(--kw-terra); }
.k-confidence__card-attrib {
  display: block;
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--kw-paper);
  opacity: 0.78;
}
@media (max-width: 900px) {
  .k-confidence__cards { grid-template-columns: 1fr; gap: 16px; }
  .k-confidence__card { aspect-ratio: 16 / 10; }
  .k-confidence__card-body { left: 22px; right: 22px; bottom: 22px; }
  .k-confidence__card-quote { font-size: clamp(17px, 4.4vw, 20px); }
}

/* ==========================================================================
   FEATURED SPACES — heyoasis-feel lead spread (added 2026-05-27).
   --------------------------------------------------------------------------
   One full-bleed photographic feature project breaking out of the wrap,
   followed by a 3-column grid of supporting cards inside the wrap. The
   lead spread is 16:9 desktop / 4:3 mobile, with the project title and
   meta overlaid at the bottom-left over a soft gradient veil.
   ========================================================================== */
.k-projects__lead {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  margin: 0 0 56px;
  overflow: hidden;
  background: var(--kw-ink);
  text-decoration: none;
  color: var(--kw-paper);
}
.k-projects__lead-img {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center 38%;
  filter: saturate(0.94) brightness(1.02) contrast(1.02);
  transition: transform 0.9s cubic-bezier(.16,1,.3,1);
}
.k-projects__lead:hover .k-projects__lead-img { transform: scale(1.025); }
.k-projects__lead-veil {
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(14,17,22,0.00) 0%,
    rgba(14,17,22,0.00) 46%,
    rgba(14,17,22,0.50) 80%,
    rgba(14,17,22,0.84) 100%);
  pointer-events: none;
}
.k-projects__lead-body {
  position: absolute;
  left: var(--kw-pad); right: var(--kw-pad); bottom: 56px;
  z-index: 1;
  max-width: 720px;
}
.k-projects__lead-num {
  display: block;
  margin-bottom: 18px;
  color: #d8a6ab;
  opacity: 1;
}
.k-projects__lead-title {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-style: normal;
  font-size: clamp(42px, 6vw, 88px);
  line-height: 1.02;
  letter-spacing: -0.03em;
  color: var(--kw-paper);
  margin: 0 0 18px;
  text-shadow: 0 2px 16px rgba(0,0,0,0.36);
  text-wrap: balance;
}
.k-projects__lead-title .k-dot { color: #d8a6ab; }
.k-projects__lead-dek {
  display: block;
  font-family: var(--kw-sans);
  font-size: 18px;
  line-height: 1.4;
  letter-spacing: -0.005em;
  color: var(--kw-paper);
  opacity: 0.88;
  margin-bottom: 24px;
  text-shadow: 0 1px 8px rgba(0,0,0,0.32);
}
.k-projects__lead-cta {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--kw-paper);
  border-bottom: 1px solid rgba(255,255,255,0.42);
  padding-bottom: 6px;
  transition: border-color 0.32s, color 0.32s;
}
.k-projects__lead-arrow { transition: transform 0.32s cubic-bezier(.16,1,.3,1); }
.k-projects__lead:hover .k-projects__lead-cta { border-color: var(--kw-paper); }
.k-projects__lead:hover .k-projects__lead-arrow { transform: translateX(6px); }
.k-projects__lead:focus-visible { outline: 3px solid var(--kw-terra); outline-offset: 4px; }

@media (max-width: 900px) {
  .k-projects__lead { aspect-ratio: 4 / 3; margin-bottom: 40px; }
  .k-projects__lead-body { left: var(--kw-pad-sm); right: var(--kw-pad-sm); bottom: 32px; }
  .k-projects__lead-title { font-size: clamp(28px, 7vw, 48px); margin-bottom: 14px; }
  .k-projects__lead-dek { font-size: 16px; margin-bottom: 18px; }
  .k-projects__lead-num { margin-bottom: 14px; }
}
@media (max-width: 560px) {
  .k-projects__lead { aspect-ratio: 4 / 5; }
  .k-projects__lead-title { font-size: clamp(24px, 8.4vw, 38px); }
  .k-projects__lead-dek { font-size: 15px; }
}

/* ==========================================================================
   FULL-BLEED CINEMATIC PHOTO BAND — heyoasis-feel break (added 2026-05-27).
   --------------------------------------------------------------------------
   Full-viewport-width photograph used as a transitional moment between
   typography-heavy sections. Image carries the centre; a single mono-caps
   editorial line sits at the bottom-left. 70vh tall on desktop so it
   reads as a poster spread, not a thin band.
   ========================================================================== */
.k-bleed {
  position: relative;
  height: 70vh;
  min-height: 460px;
  overflow: hidden;
  background: var(--kw-ink);
  /* Break the section out of any wrap padding — full viewport width. */
}
.k-bleed__img {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center 42%;
  filter: saturate(0.92) brightness(1.02) contrast(1.02);
  /* Subtle ken-burns to keep the band cinematic. */
  animation: kw-bleed-kenburns 26s ease-in-out infinite;
}
@keyframes kw-bleed-kenburns {
  0%   { transform: scale(1.03) translate3d(0, 0, 0); }
  50%  { transform: scale(1.07) translate3d(-0.4%, -0.2%, 0); }
  100% { transform: scale(1.03) translate3d(0, 0, 0); }
}
.k-bleed__veil {
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(14,17,22,0.18) 0%,
    rgba(14,17,22,0.00) 30%,
    rgba(14,17,22,0.00) 60%,
    rgba(14,17,22,0.42) 92%,
    rgba(14,17,22,0.62) 100%);
  pointer-events: none;
}
.k-bleed__inner {
  position: absolute;
  left: var(--kw-pad); right: var(--kw-pad);
  bottom: 40px;
  z-index: 1;
}
.k-bleed__cap {
  color: var(--kw-paper);
  font-size: 12px;
  letter-spacing: 0.34em;
  opacity: 0.86;
  text-shadow: 0 1px 8px rgba(0,0,0,0.32);
}
@media (prefers-reduced-motion: reduce) {
  .k-bleed__img { animation: none !important; transform: scale(1.03); }
}
@media (max-width: 760px) {
  .k-bleed { height: 60vh; min-height: 360px; }
  .k-bleed__inner { left: var(--kw-pad-sm); right: var(--kw-pad-sm); bottom: 28px; }
  .k-bleed__cap { font-size: 11px; letter-spacing: 0.26em; }
}

/* ==========================================================================
   THREE DISCIPLINES — heyoasis-feel image cells (added 2026-05-27).
   --------------------------------------------------------------------------
   Three full-height photographic cells with the caption overlaid at the
   bottom-left. Replaces the prior 3-column text grid for maximum photo
   dominance — the brand reads as Designed | Milled | Installed at first
   glance, before any copy.
   ========================================================================== */
.k-disciplines {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(14px, 1.6vw, 22px);
  margin: 0;
}
.k-disciplines__cell {
  position: relative;
  margin: 0;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  border-radius: 20px;
  background: var(--kw-ink);
  box-shadow: 0 22px 50px -34px rgba(20, 24, 30, 0.42);
}
.k-disciplines__img {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center 38%;
  transition: transform 1.05s cubic-bezier(.16,1,.3,1);
  filter: saturate(0.97) contrast(1.02);
}
.k-disciplines__cell:hover .k-disciplines__img { transform: scale(1.05); }
/* Two-stop scrim: a soft top wash plus a deeper foot so the white
   headline reads even on the bright "Installed" cabinet shot. */
.k-disciplines__cell::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg,
    rgba(14,17,22,0.00) 0%,
    rgba(14,17,22,0.06) 36%,
    rgba(14,17,22,0.52) 70%,
    rgba(14,17,22,0.88) 100%);
  pointer-events: none;
  transition: opacity 0.5s ease;
}
.k-disciplines__cell:hover::after { opacity: 0.92; }
.k-disciplines__body {
  position: absolute;
  left: 30px; right: 30px; bottom: 30px;
  z-index: 1;
  color: var(--kw-paper);
  transition: transform 0.55s cubic-bezier(.16,1,.3,1);
}
.k-disciplines__cell:hover .k-disciplines__body { transform: translateY(-5px); }
.k-disciplines__num {
  display: block;
  margin-bottom: 14px;
  /* Lightened tint of the brand burgundy — legible on the dark foot,
     still on-brand (deep burgundy would vanish into the scrim). */
  color: #d8a6ab;
  opacity: 1;
}
.k-disciplines__head {
  font-family: var(--kw-sans);
  font-weight: 600;
  font-size: clamp(22px, 2.4vw, 31px);
  line-height: 1.12;
  letter-spacing: -0.02em;
  color: var(--kw-paper);
  text-shadow: 0 2px 18px rgba(0,0,0,0.5);
  margin: 0;
  text-wrap: balance;
}
.k-disciplines__head .k-dot { color: #d8a6ab; }
@media (max-width: 760px) {
  .k-disciplines { grid-template-columns: 1fr; gap: 16px; }
  .k-disciplines__cell { aspect-ratio: 16 / 11; border-radius: 16px; }
  .k-disciplines__body { left: 24px; right: 24px; bottom: 24px; }
  .k-disciplines__head { font-size: clamp(21px, 5.6vw, 28px); }
}

/* ==========================================================================
   CHAPTER HEADINGS — heyoasis-feel recurring motif (added 2026-05-27).
   --------------------------------------------------------------------------
   heyoasis.com uses "Hello, X" as a chapter-heading device. The Klosetworx
   equivalent: first-person plural declarative sentence + terra full-stop,
   prefixed by a roman-numeral chapter counter. Six placements down the
   home page tie the brand voice together as a monograph TOC.
   ========================================================================== */
.k-chapter { display: block; margin-bottom: 64px; }
.k-chapter__num {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--kw-terra);
  display: block;
  margin-bottom: 18px;
}
.k-chapter__head {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-size: clamp(42px, 5.8vw, 80px);
  line-height: 1.0;
  letter-spacing: -0.035em;
  margin: 0 0 22px;
  max-width: 20ch;
  color: var(--kw-ink);
  text-wrap: balance;
}
.k-chapter__head .k-dot { color: var(--kw-terra); }
.k-chapter__rule {
  display: block;
  height: 1px;
  background: var(--kw-rule);
  margin: 0 0 18px;
  width: 100%;
  max-width: 320px;
}
.k-chapter__tag {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  opacity: 0.55;
  display: inline-flex;
  align-items: baseline;
  gap: 18px;
  flex-wrap: wrap;
}
.k-chapter__tag a { color: inherit; text-decoration: none; opacity: 0.8; }
.k-chapter__tag a:hover { color: var(--kw-terra); opacity: 1; }
@media (max-width: 600px) {
  .k-chapter { margin-bottom: 48px; }
  .k-chapter__head { font-size: clamp(28px, 8vw, 44px); max-width: 100%; }
  .k-chapter__num, .k-chapter__tag { font-size: 10px; letter-spacing: 0.2em; }
  .k-chapter__rule { max-width: 200px; }
}

/* ==========================================================================
   SCRIBE — a typographic breath between Pull-Quote C and In Confidence.
   One sentence at display scale on a clean bone ground, hairline rules
   above and below, generous whitespace, ~52vh tall.
   ========================================================================== */
.k-scribe {
  background: var(--kw-bone); color: var(--kw-ink);
  min-height: 52vh;
  display: flex; align-items: center;
  padding: clamp(88px, 12vh, 168px) 0;
  border-top: 1px solid var(--kw-rule);
  border-bottom: 1px solid var(--kw-rule);
}
.k-scribe__inner { position: relative; }
.k-scribe__rule {
  display: block; height: 1px; background: var(--kw-rule-strong);
  width: clamp(96px, 14vw, 200px);
}
.k-scribe__rule--top { margin: 0 0 44px; }
.k-scribe__rule--btm { margin: 44px 0 0; margin-left: auto; }
.k-scribe__meta {
  display: flex; justify-content: space-between; align-items: baseline;
  color: var(--kw-ink); opacity: 0.5; margin-bottom: clamp(40px, 6vh, 72px);
}
.k-scribe__line {
  font-family: var(--kw-sans); font-weight: 700;
  font-size: clamp(54px, 8.6vw, 140px); line-height: 0.96;
  letter-spacing: -0.04em; color: var(--kw-ink);
  margin: 0; max-width: 22ch;
}
.k-scribe__accent { color: var(--kw-terra); font-variant-numeric: tabular-nums; }
/* .k-scribe__em was a Georgia italic accent inside the scribe. Tylko
   register has no italic serif accents, so this just inherits the
   bold sans now (terra-coloured for emphasis instead). */
.k-scribe__em { color: var(--kw-terra); }
.k-scribe__dot { color: var(--kw-terra); }
@media (max-width: 900px) {
  .k-scribe { min-height: 44vh; padding: 104px 0; }
  .k-scribe__meta { margin-bottom: 36px; flex-direction: column; gap: 10px; align-items: flex-start; }
  .k-scribe__rule--top { margin-bottom: 32px; }
  .k-scribe__rule--btm { margin-top: 32px; }
}

/* ==========================================================================
   METHOD — EDITORIAL REBUILD (2026-05-26)
   --------------------------------------------------------------------------
   These rules override the legacy .k-method__hero / .k-method__mv image
   layout earlier in the file. The new spread is text + SVG + CSS only —
   no photographs. Every movement is a magazine page-turn; the third
   (Drawing) is the brand's signature and gets a full-bleed feature
   treatment with a self-drawing elevation and a draughtsman's-notes
   sidebar. The serif italic in the hero h1 borrows the 'em' treatment
   used elsewhere on the site for editorial sparkle.
   ========================================================================== */

/* ---------- HERO · typographic overture --------------------------------- */
/* Wipe legacy hero rules that assumed a hero photo block */
.k-method__hero {
  position: relative;
  height: auto;
  min-height: 0;
  overflow: visible;
  background: var(--kw-bone-2);
  border-bottom: 1px solid var(--kw-rule);
  padding: clamp(56px, 9vw, 120px) 0 clamp(72px, 11vw, 144px);
}
.k-method__hero-inner {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: 0 var(--kw-pad);
  position: relative;
}
.k-method__hero-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 24px;
  padding-bottom: 28px;
  margin-bottom: clamp(56px, 7vw, 96px);
  border-bottom: 1px solid var(--kw-rule);
}
.k-method__hero-cap {
  /* Reuses legacy class — re-anchor it for the new context.
     Cancels the old absolute-positioned hero-photo caption rules. */
  position: static;
  left: auto; right: auto; bottom: auto;
  display: inline-block;
  padding: 0;
  margin: 0;
  max-width: none;
  color: var(--kw-ink);
  opacity: 0.6;
  grid-column: auto;
  grid-template-columns: none;
  align-items: baseline;
  gap: 0;
}
.k-method__hero-meta {
  display: inline-flex;
  align-items: baseline;
  gap: 14px;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.55;
}
.k-method__hero-meta .k-mono {
  letter-spacing: 0.16em;
  color: var(--kw-terra);
  opacity: 1;
}

.k-method__hero-grid {
  display: grid;
  grid-template-columns: minmax(220px, 0.7fr) minmax(0, 1fr);
  align-items: start;
  gap: clamp(40px, 6vw, 96px);
}

/* The roman numeral V — page-opening drop, terra outline + filled depth */
.k-method__hero-figure {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 24px;
  padding-top: 8px;
}
.k-method__hero-roman {
  font-family: var(--kw-sans);
  font-weight: 500;
  font-size: clamp(160px, 22vw, 320px);
  line-height: 0.86;
  color: var(--kw-terra);
  letter-spacing: -0.06em;
  display: block;
  /* Italic-leaning, like a magazine drop cap. */
  font-style: italic;
}
.k-method__hero-romansub {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.55;
  line-height: 1.6;
  padding-top: 4px;
  border-top: 1px solid var(--kw-rule);
}

.k-method__hero-copy { min-width: 0; }
.k-method__hero-h1 {
  position: static;
  font-family: var(--kw-sans);
  font-weight: 500;
  font-size: clamp(48px, 6.4vw, 104px);
  line-height: 0.98;
  letter-spacing: -0.038em;
  color: var(--kw-ink);
  margin: 0 0 clamp(28px, 3vw, 44px);
  text-wrap: balance;
}
.k-method__hero-h1 em {
  font-family: "Georgia", "Times New Roman", serif;
  font-style: italic;
  font-weight: 400;
  color: var(--kw-terra);
  letter-spacing: -0.024em;
}
.k-method__hero-dek {
  font-size: clamp(17px, 1.35vw, 21px);
  line-height: 1.55;
  color: var(--kw-ink);
  opacity: 0.78;
  max-width: 52ch;
  margin: 0 0 clamp(40px, 5vw, 64px);
  letter-spacing: -0.006em;
}

/* Numbered TOC — the table-of-contents preview of the five movements */
.k-method__toc {
  list-style: none;
  margin: 0;
  padding: 0;
  border-top: 1px solid var(--kw-rule);
}
.k-method__toc-row {
  border-bottom: 1px solid var(--kw-rule);
  position: relative;
}
.k-method__toc-link {
  display: grid;
  grid-template-columns: 88px minmax(0, 1fr) minmax(40px, 1fr) auto;
  align-items: baseline;
  gap: 24px;
  padding: 22px 0;
  color: var(--kw-ink);
  text-decoration: none;
  transition: color 0.25s ease, padding-left 0.25s ease;
}
.k-method__toc-num {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.5;
  font-variant-numeric: tabular-nums;
}
.k-method__toc-name {
  font-family: var(--kw-sans);
  font-size: clamp(24px, 2.6vw, 38px);
  font-weight: 500;
  line-height: 1.06;
  letter-spacing: -0.022em;
  color: var(--kw-ink);
}
.k-method__toc-rule {
  display: block;
  height: 1px;
  background: var(--kw-rule);
  align-self: center;
  margin: 0 8px;
}
.k-method__toc-time {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.65;
  white-space: nowrap;
}
.k-method__toc-aster {
  color: var(--kw-terra);
  font-family: var(--kw-mono);
  font-weight: 600;
  margin-left: 4px;
}
.k-method__toc-link:hover { color: var(--kw-terra); padding-left: 12px; }
.k-method__toc-link:hover .k-method__toc-num,
.k-method__toc-link:hover .k-method__toc-time { opacity: 0.9; color: var(--kw-terra); }
.k-method__toc-row--feature .k-method__toc-name { color: var(--kw-terra); }
.k-method__toc-row--feature::before {
  content: "";
  position: absolute;
  left: -16px;
  top: 50%;
  width: 4px;
  height: 4px;
  background: var(--kw-terra);
  border-radius: 50%;
  transform: translateY(-50%);
}

.k-method__toc-foot {
  margin: 24px 0 0;
  display: flex;
  align-items: baseline;
  gap: 12px;
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.55;
  font-style: normal;
}

.k-method__hero-cta {
  /* Override legacy hero-cta which was positioned over a dark photo */
  position: static;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-top: clamp(48px, 6vw, 80px);
  padding: 16px 26px;
  background: var(--kw-ink);
  color: var(--kw-bone);
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  text-decoration: none;
  border: 1px solid var(--kw-ink);
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
  align-self: start;
}
.k-method__hero-cta:hover {
  background: var(--kw-terra);
  border-color: var(--kw-terra);
  color: var(--kw-bone);
}
.k-method__hero-cta-arrow { font-size: 14px; line-height: 1; }

@media (max-width: 900px) {
  .k-method__hero-inner { padding: 0 var(--kw-pad-sm); }
  .k-method__hero-grid {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .k-method__hero-figure { flex-direction: row; align-items: baseline; gap: 20px; padding-top: 0; }
  .k-method__hero-roman { font-size: clamp(120px, 36vw, 200px); }
  .k-method__hero-romansub { border-top: 0; padding-top: 0; max-width: 18ch; }
  .k-method__hero-head { flex-direction: column; align-items: flex-start; gap: 12px; }
  .k-method__hero-meta { width: 100%; justify-content: space-between; }
  .k-method__toc-link {
    grid-template-columns: 64px minmax(0,1fr) auto;
    column-gap: 16px;
    padding: 18px 0;
  }
  .k-method__toc-rule { display: none; }
  .k-method__toc-name { font-size: clamp(22px, 6.4vw, 30px); }
  .k-method__toc-row--feature::before { display: none; }
}

/* ---------- MOVEMENT SPREAD · standard (01, 02, 04, 05) ---------------- */
/* Override the legacy two-up image-half layout entirely */
.k-method__mv {
  display: block;
  grid-template-columns: none;
  align-items: stretch;
  min-height: 0;
  border-top: 1px solid var(--kw-rule);
  background: #ffffff;
  position: relative;
  padding: clamp(88px, 12vw, 168px) 0;
}
.k-method__mv:last-of-type { border-bottom: 1px solid var(--kw-rule); }
/* Hairline § dingbat between movements, terra */
.k-method__mv::before {
  content: "§";
  position: absolute;
  top: -14px;
  left: 50%;
  transform: translateX(-50%);
  background: #ffffff;
  padding: 0 14px;
  font-family: var(--kw-mono);
  font-size: 14px;
  color: var(--kw-terra);
  line-height: 1;
}
.k-method__mv--reverse { direction: ltr; }
.k-method__mv--reverse > * { direction: ltr; }

.k-method__mv-inner {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: 0 var(--kw-pad);
  display: grid;
  grid-template-columns: minmax(180px, 0.5fr) minmax(0, 0.8fr) minmax(0, 1fr);
  align-items: start;
  gap: clamp(40px, 5vw, 80px);
  position: relative;
}
.k-method__mv--reverse .k-method__mv-inner {
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.8fr) minmax(180px, 0.5fr);
}
.k-method__mv--reverse .k-method__mv-numwrap { order: 3; }
.k-method__mv--reverse .k-method__plate { order: 2; }
.k-method__mv--reverse .k-method__mv-text { order: 1; }
.k-method__mv--reverse .k-method__mv-pagemark {
  left: auto;
  right: var(--kw-pad);
  text-align: right;
}

.k-method__mv-pagemark {
  position: absolute;
  top: -64px;
  left: var(--kw-pad);
  font-family: var(--kw-mono);
  font-size: 10.5px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--kw-terra);
  opacity: 0.8;
}

.k-method__mv-numwrap {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding-top: 12px;
}
.k-method__mv-num {
  font-family: var(--kw-mono);
  font-weight: 500;
  font-size: clamp(120px, 14vw, 240px);
  line-height: 0.86;
  color: var(--kw-terra);
  letter-spacing: -0.06em;
  display: block;
}
.k-method__mv-numsub {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.55;
  border-top: 1px solid var(--kw-rule);
  padding-top: 14px;
}

/* Bespoke SVG plate */
.k-method__plate {
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
  position: relative;
  padding: 28px 28px 22px;
  background: var(--kw-bone-2);
  border: 1px solid var(--kw-rule);
  color: var(--kw-ink);
}
.k-method__plate-svg {
  width: 100%;
  height: auto;
  display: block;
  color: var(--kw-ink);
}
.k-method__plate-cap {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--kw-rule);
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.65;
}
.k-method__plate-cap span:first-child { color: var(--kw-terra); opacity: 1; }

/* Plate SVG line-draw — fires when the host section enters viewport.
   Uses a 2000-unit dasharray (longer than any path in any plate), so we
   don't need to set pathLength on each individual <path>. The animation
   tweens offset from 2000 → 0 to draw the line in.
   ----
   chrome.js sets html.kw-anim only when motion is allowed, and adds
   .kw-rv--in to the host <section> as it scrolls into view. Until then
   the paths sit hidden (offset = 2000). */
.k-method__plate-d {
  stroke-dasharray: 2000;
  stroke-dashoffset: 0;
}
html.kw-anim .k-method__mv .k-method__plate-d {
  stroke-dashoffset: 2000;
}
html.kw-anim .k-method__mv.kw-rv--in .k-method__plate-d {
  animation: kw-plate-draw 1700ms cubic-bezier(0.65, 0, 0.35, 1) forwards;
}
@keyframes kw-plate-draw {
  0%   { stroke-dashoffset: 2000; }
  100% { stroke-dashoffset: 0; }
}

/* Editorial text column */
.k-method__mv-text {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  padding: 12px 0 0;
  background: transparent;
  position: static;
}
.k-method__mv-title {
  font-family: var(--kw-sans);
  font-size: clamp(40px, 4.6vw, 72px);
  line-height: 1.0;
  font-weight: 500;
  letter-spacing: -0.034em;
  margin: 0 0 22px;
  color: var(--kw-ink);
}
.k-method__mv-dek {
  font-size: clamp(18px, 1.4vw, 22px);
  line-height: 1.45;
  color: var(--kw-ink);
  opacity: 0.82;
  margin: 0 0 36px;
  max-width: 38ch;
  font-weight: 400;
  letter-spacing: -0.008em;
}
.k-method__mv-meta {
  margin: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
  border-top: 1px solid var(--kw-rule);
  padding-top: 22px;
  width: 100%;
  max-width: 38ch;
}
.k-method__mv-meta > div {
  display: grid;
  grid-template-columns: 110px minmax(0,1fr);
  align-items: baseline;
  column-gap: 16px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-method__mv-meta > div:last-child { border-bottom: 0; padding-bottom: 0; }
.k-method__mv-meta dt {
  font-family: var(--kw-mono);
  font-size: 10px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--kw-terra);
}
.k-method__mv-meta dd {
  margin: 0;
  font-size: 15px;
  line-height: 1.4;
  color: var(--kw-ink);
  opacity: 0.88;
}

@media (max-width: 1100px) {
  .k-method__mv-inner,
  .k-method__mv--reverse .k-method__mv-inner {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 40px 48px;
  }
  .k-method__mv-numwrap { grid-column: 1; }
  .k-method__plate { grid-column: 2; grid-row: 1 / span 2; }
  .k-method__mv-text { grid-column: 1; }
  .k-method__mv--reverse .k-method__mv-numwrap,
  .k-method__mv--reverse .k-method__mv-text { grid-column: 2; }
  .k-method__mv--reverse .k-method__plate { grid-column: 1; }
  .k-method__mv-num { font-size: clamp(96px, 18vw, 160px); }
}
@media (max-width: 760px) {
  .k-method__mv { padding: 104px 0; }
  .k-method__mv-inner,
  .k-method__mv--reverse .k-method__mv-inner {
    grid-template-columns: 1fr;
    padding: 0 var(--kw-pad-sm);
    gap: 28px;
  }
  .k-method__mv-numwrap,
  .k-method__plate,
  .k-method__mv-text,
  .k-method__mv--reverse .k-method__mv-numwrap,
  .k-method__mv--reverse .k-method__plate,
  .k-method__mv--reverse .k-method__mv-text { grid-column: 1; grid-row: auto; order: initial; }
  .k-method__mv-pagemark {
    position: static;
    top: auto; left: auto;
    margin-bottom: 8px;
  }
  .k-method__mv--reverse .k-method__mv-pagemark { text-align: left; right: auto; }
  .k-method__mv-numwrap { flex-direction: row; align-items: baseline; gap: 18px; padding-top: 0; }
  .k-method__mv-num { font-size: clamp(96px, 28vw, 144px); }
  .k-method__mv-numsub { border-top: 0; padding-top: 0; }
  .k-method__mv-title { font-size: clamp(34px, 9vw, 52px); margin-bottom: 16px; }
  .k-method__mv-dek { font-size: 17px; margin-bottom: 24px; }
  .k-method__plate { padding: 18px 18px 14px; }
}

/* ---------- MOVEMENT 03 · DRAWING (feature treatment) ------------------ */
/* The signature movement: full-bleed, blueprint-margin, self-drawing
   elevation, draughtsman's-notes sidebar. */
.k-method__mv--feature {
  background: var(--kw-bone-2);
  border-top: 1px solid var(--kw-terra);
  border-bottom: 1px solid var(--kw-terra);
  padding: clamp(96px, 13vw, 184px) 0;
  position: relative;
}
/* Override the generic § dingbat with a terra one anchored higher */
.k-method__mv--feature::before { color: var(--kw-terra); background: var(--kw-bone-2); }

.k-method__feat-head {
  max-width: var(--kw-max);
  margin: 0 auto clamp(48px, 6vw, 88px);
  padding: 0 var(--kw-pad);
  display: grid;
  grid-template-columns: minmax(220px, 0.5fr) minmax(0, 1fr);
  gap: clamp(32px, 5vw, 72px);
  align-items: end;
}
.k-method__feat-pagemark {
  grid-column: 1 / -1;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin-bottom: 32px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--kw-rule);
}
.k-method__feat-numwrap {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.k-method__feat-num {
  font-family: var(--kw-mono);
  font-weight: 500;
  font-size: clamp(160px, 20vw, 280px);
  line-height: 0.84;
  letter-spacing: -0.06em;
  color: var(--kw-terra);
  display: block;
}
.k-method__feat-titlewrap { padding-bottom: 12px; }
.k-method__feat-title {
  font-family: var(--kw-sans);
  font-weight: 500;
  font-size: clamp(56px, 7.6vw, 124px);
  line-height: 0.96;
  letter-spacing: -0.04em;
  color: var(--kw-ink);
  margin: 0 0 24px;
}
.k-method__feat-dek {
  font-size: clamp(19px, 1.5vw, 24px);
  line-height: 1.42;
  color: var(--kw-ink);
  opacity: 0.82;
  margin: 0;
  max-width: 44ch;
  letter-spacing: -0.008em;
}

.k-method__feat-canvas {
  max-width: var(--kw-max);
  margin: 0 auto;
  padding: clamp(40px, 5vw, 64px) clamp(48px, 6vw, 96px);
  background: var(--kw-paper);
  border: 1px solid var(--kw-rule);
  position: relative;
}
.k-method__feat-canvas::before,
.k-method__feat-canvas::after {
  content: "";
  position: absolute;
  pointer-events: none;
}
/* Inner ruled border */
.k-method__feat-canvas::before {
  inset: 14px;
  border: 1px solid var(--kw-rule);
  opacity: 0.6;
}
/* Faint terra outer rule */
.k-method__feat-canvas::after {
  inset: -6px;
  border: 1px solid var(--kw-terra);
  opacity: 0.18;
}
.k-method__feat-corner {
  position: absolute;
  font-family: var(--kw-mono);
  font-size: 16px;
  color: var(--kw-terra);
  opacity: 0.7;
  line-height: 1;
  z-index: 1;
}
.k-method__feat-corner--tl { top: 8px; left: 8px; }
.k-method__feat-corner--tr { top: 8px; right: 8px; }
.k-method__feat-corner--bl { bottom: 8px; left: 8px; }
.k-method__feat-corner--br { bottom: 8px; right: 8px; }

/* Title-block stamp, bottom-right of the canvas */
.k-method__feat-stamp {
  position: absolute;
  right: 30px;
  bottom: 30px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 12px 16px;
  background: var(--kw-paper);
  border: 1px solid var(--kw-terra);
  font-family: var(--kw-mono);
  font-size: 9.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--kw-ink);
  z-index: 2;
}
.k-method__feat-stamp-row {
  display: grid;
  grid-template-columns: 56px 1fr;
  gap: 14px;
  align-items: baseline;
}
.k-method__feat-stamp-row span:first-child { color: var(--kw-terra); }
.k-method__feat-stamp-row span:last-child  { color: var(--kw-ink); }

.k-method__feat-svg {
  width: 100%;
  height: auto;
  display: block;
  position: relative;
  z-index: 0;
}

/* The self-drawing elevation lines. Each <path> in the markup carries
   the SVG attribute pathLength="1", so a single dasharray/offset tween
   covers all paths regardless of their actual stroke length.
   ----
   Triggers when the feature section enters viewport (chrome.js sets
   .kw-rv--in). Without kw-anim or with reduced motion, the paths
   render fully drawn (default dashoffset 0). */
.k-method__feat-d {
  stroke-dasharray: 1;
  stroke-dashoffset: 0;
}
html.kw-anim .k-method__mv--feature .k-method__feat-d {
  stroke-dashoffset: 1;
}
html.kw-anim .k-method__mv--feature.kw-rv--in .k-method__feat-d {
  animation: kw-feat-draw 2400ms cubic-bezier(0.65, 0, 0.35, 1) forwards;
}
/* Staggered passes when the section enters view:
   frame → bays → drawer/shelf detail → terra dimension lines.
   Order matters — more specific selectors come second, so the marks
   and dims override the generic .k-method__feat-d timing. */
html.kw-anim .k-method__mv--feature.kw-rv--in .k-method__feat-d--frame { animation-duration: 1400ms; animation-delay: 80ms; }
html.kw-anim .k-method__mv--feature.kw-rv--in .k-method__feat-d--mark  { animation-delay: 1600ms; animation-duration: 800ms; }
html.kw-anim .k-method__mv--feature.kw-rv--in .k-method__feat-d--dim   { animation-delay: 2100ms; animation-duration: 900ms; }
@keyframes kw-feat-draw {
  0%   { stroke-dashoffset: 1; }
  100% { stroke-dashoffset: 0; }
}

/* Draughtsman's notes sidebar */
.k-method__feat-notes {
  max-width: var(--kw-max);
  margin: clamp(56px, 6vw, 96px) auto 0;
  padding: 0 var(--kw-pad);
  display: grid;
  grid-template-columns: minmax(220px, 0.5fr) minmax(0, 1fr);
  gap: clamp(32px, 5vw, 80px);
}
.k-method__feat-notes-title {
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--kw-terra);
  margin: 0;
  border-top: 1px solid var(--kw-terra);
  padding-top: 16px;
  font-weight: 500;
  align-self: start;
}
.k-method__feat-notes-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(28px, 4vw, 56px);
  row-gap: 24px;
}
.k-method__feat-notes-list > li {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr);
  align-items: baseline;
  gap: 12px;
  padding-top: 16px;
  border-top: 1px solid var(--kw-rule);
}
.k-method__feat-notes-num {
  font-family: var(--kw-mono);
  font-style: italic;
  font-size: 12px;
  letter-spacing: 0.08em;
  color: var(--kw-terra);
}
.k-method__feat-notes-body {
  font-size: 15px;
  line-height: 1.55;
  color: var(--kw-ink);
  opacity: 0.85;
  letter-spacing: -0.005em;
}
.k-method__feat-notes-foot {
  grid-column: 2;
  margin: 0;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 24px;
  padding-top: 22px;
  border-top: 1px solid var(--kw-rule);
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.7;
}
.k-method__feat-notes-time { color: var(--kw-terra); opacity: 1; }

@media (max-width: 1100px) {
  .k-method__feat-head {
    grid-template-columns: 1fr;
    padding: 0 var(--kw-pad-sm);
    gap: 24px;
  }
  .k-method__feat-num { font-size: clamp(120px, 28vw, 200px); }
  .k-method__feat-canvas { padding: 32px 28px; margin: 0 var(--kw-pad-sm); }
  .k-method__feat-notes {
    grid-template-columns: 1fr;
    padding: 0 var(--kw-pad-sm);
    gap: 24px;
  }
  .k-method__feat-notes-list { grid-template-columns: 1fr; }
  .k-method__feat-notes-foot { grid-column: 1; }
}
@media (max-width: 700px) {
  .k-method__mv--feature { padding: 104px 0; }
  .k-method__feat-stamp { right: 16px; bottom: 16px; padding: 10px 12px; font-size: 8.5px; }
  .k-method__feat-stamp-row { grid-template-columns: 48px 1fr; gap: 10px; }
  .k-method__feat-canvas { padding: 22px 16px; margin: 0 var(--kw-pad-sm); }
  .k-method__feat-corner { font-size: 13px; }
}

/* ---------- Honour reduced motion -------------------------------------- */
/* If the user prefers reduced motion, the kw-anim gate is never added —
   the line-draw animations never start, and the plates render fully
   drawn from the first frame (because the unanimated default state is
   stroke-dashoffset: 0). */
@media (prefers-reduced-motion: reduce) {
  .k-method__plate-d,
  .k-method__feat-d,
  .k-method__feat-d--frame,
  .k-method__feat-d--mark,
  .k-method__feat-d--dim {
    stroke-dashoffset: 0 !important;
    animation: none !important;
    transition: none !important;
  }
}
/* Belt and braces: html without kw-anim also renders the lines fully drawn. */
html:not(.kw-anim) .k-method__plate-d,
html:not(.kw-anim) .k-method__feat-d {
  stroke-dashoffset: 0;
  animation: none;
}

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║ PROJECTS · THE REGISTER                                              ║
   ║                                                                      ║
   ║ Scoped to projects.html. A magazine-grade portfolio register: a      ║
   ║ leather-bound TOC hero (.k-reg-hero), a single featured plate as a   ║
   ║ monograph spread with hand-drawn plan view (.k-plate), a 9-card      ║
   ║ dossier grid (.k-reg), and a coda. Material chips throughout are     ║
   ║ CSS gradient swatches matching the home page library.                ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

/* ─── HERO · REGISTER TABLE OF CONTENTS ─── */
/* Heyoasis-feel rhythm: bumped to match the new .k-section cadence. */
.k-reg-hero { padding-top: 152px; padding-bottom: 152px; background: #ffffff; }
.k-reg-hero__inner { padding-top: 28px; padding-bottom: 16px; }
.k-reg-hero__head {
  display: flex; justify-content: space-between; align-items: baseline;
  padding-bottom: 28px; border-bottom: 1px solid var(--kw-rule); margin-bottom: 64px;
}
.k-reg-hero__cap { opacity: 0.8; }
.k-reg-hero__meta { display: flex; gap: 28px; font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; opacity: 0.55; }
.k-reg-hero__grid {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.45fr);
  gap: 96px; align-items: start;
}
.k-reg-hero__figure { position: sticky; top: 120px; display: flex; flex-direction: column; gap: 24px; align-items: flex-start; }
.k-reg-hero__roman {
  font-family: var(--kw-sans); font-weight: 500;
  font-size: clamp(160px, 22vw, 320px); line-height: 0.82; letter-spacing: -0.04em;
  color: var(--kw-terra); display: block;
}
.k-reg-hero__romansub { font-family: var(--kw-mono); font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase; line-height: 1.5; opacity: 0.6; padding-left: 4px; }
.k-reg-hero__h1 {
  font-family: var(--kw-sans); font-weight: 500;
  font-size: clamp(48px, 5.6vw, 76px); line-height: 1.02; letter-spacing: -0.028em;
  color: var(--kw-ink); margin: 0 0 28px;
}
.k-reg-hero__h1 em { font-style: italic; font-weight: 500; color: var(--kw-terra); }
.k-reg-hero__dek { font-family: var(--kw-sans); font-size: 18px; line-height: 1.52; letter-spacing: -0.006em; max-width: 640px; opacity: 0.78; margin: 0 0 48px; }

/* TOC — numbered rows with right-aligned years */
.k-reg-toc { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--kw-rule); }
.k-reg-toc__row { border-bottom: 1px solid var(--kw-rule); }
.k-reg-toc__link {
  display: grid; grid-template-columns: 88px 1fr auto; align-items: baseline; gap: 28px;
  padding: 22px 0; text-decoration: none; color: var(--kw-ink); transition: color 0.4s ease;
}
.k-reg-toc__num { font-family: var(--kw-mono); font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--kw-terra); opacity: 0.85; }
.k-reg-toc__name { font-family: var(--kw-sans); font-size: 22px; line-height: 1.18; letter-spacing: -0.014em; font-weight: 500; color: var(--kw-ink); transition: color 0.4s ease; }
.k-reg-toc__aster { color: var(--kw-terra); font-family: var(--kw-mono); font-size: 0.7em; vertical-align: super; margin-left: 4px; }
.k-reg-toc__rule { display: none; }
.k-reg-toc__year { font-family: var(--kw-mono); font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--kw-ink); opacity: 0.5; }
.k-reg-toc__link:hover .k-reg-toc__name,
.k-reg-toc__link:focus-visible .k-reg-toc__name { color: var(--kw-terra); }
.k-reg-toc__link:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 4px; }
.k-reg-toc__foot { display: flex; gap: 12px; align-items: baseline; padding-top: 24px; font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.55; }

@media (max-width: 980px) {
  .k-reg-hero__grid { grid-template-columns: 1fr; gap: 56px; }
  .k-reg-hero__figure { position: static; flex-direction: row; align-items: baseline; }
  .k-reg-hero__roman { font-size: clamp(120px, 30vw, 200px); }
}
@media (max-width: 720px) {
  .k-reg-hero { padding-top: 104px; padding-bottom: 104px; }
  .k-reg-hero__head { flex-direction: column; gap: 12px; align-items: flex-start; margin-bottom: 40px; }
  .k-reg-hero__meta { gap: 16px; }
  .k-reg-toc__link { grid-template-columns: 72px 1fr auto; gap: 16px; padding: 18px 0; }
  .k-reg-toc__name { font-size: 17px; }
  .k-reg-toc__num, .k-reg-toc__year { font-size: 10px; }
}

/* ─── FEATURED PLATE · № 1148 SPREAD ─── */
.k-plate { padding-top: 96px; padding-bottom: 96px; }
.k-plate__head { display: flex; justify-content: space-between; align-items: baseline; padding-bottom: 24px; border-bottom: 1px solid var(--kw-rule); margin-bottom: 64px; }
.k-plate__feature { color: var(--kw-terra); opacity: 0.92; }
.k-plate__filing { opacity: 0.5; }
.k-plate__spread { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr); gap: 88px; align-items: start; }
.k-plate__num { display: flex; flex-direction: column; gap: 16px; }
.k-plate__numeral {
  font-family: var(--kw-sans); font-weight: 500;
  font-size: clamp(120px, 18vw, 240px); line-height: 0.88; letter-spacing: -0.04em;
  color: var(--kw-terra); display: block; margin: -12px 0 0 -8px;
}
.k-plate__plate, .k-plate__location { font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; opacity: 0.7; }
.k-plate__location { opacity: 0.5; padding-bottom: 28px; border-bottom: 1px solid var(--kw-rule); margin-bottom: 28px; }
.k-plate__plan { margin: 0; }
.k-plate__plan-svg { width: 100%; height: auto; color: var(--kw-ink); display: block; }
.k-plate__plan-cap { display: flex; justify-content: space-between; margin-top: 16px; font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; opacity: 0.55; }
.k-plate__copy { padding-top: 16px; }
.k-plate__title {
  font-family: var(--kw-sans); font-weight: 500;
  font-size: clamp(38px, 4.6vw, 64px); line-height: 1.02; letter-spacing: -0.026em;
  color: var(--kw-ink); margin: 0 0 28px;
}
.k-plate__title em { font-style: italic; font-weight: 500; color: var(--kw-terra); }
.k-plate__lede { font-family: var(--kw-sans); font-size: 19px; line-height: 1.5; letter-spacing: -0.008em; opacity: 0.82; margin: 0 0 48px; }
.k-plate__spec { margin: 0 0 56px; padding: 0; border-top: 1px solid var(--kw-rule); }
.k-plate__spec-row { display: grid; grid-template-columns: 120px 1fr; gap: 24px; padding: 14px 0; border-bottom: 1px solid var(--kw-rule); }
.k-plate__spec-row dt { font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--kw-terra); opacity: 0.78; }
.k-plate__spec-row dd { margin: 0; font-family: var(--kw-sans); font-size: 15px; line-height: 1.4; letter-spacing: -0.004em; }

/* Material chips — plate edition. Matches home library gradient pattern. */
.k-plate__matsblk { padding-top: 24px; border-top: 1px solid var(--kw-rule); }
.k-plate__matshead { display: block; opacity: 0.55; margin-bottom: 18px; }
.k-plate__mats { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px 24px; }
.k-plate__mat { display: grid; grid-template-columns: 56px 1fr; gap: 14px; align-items: center; }
.k-plate__mat-chip {
  display: block; width: 56px; aspect-ratio: 1/1; background-color: var(--fill);
  background-image:
    repeating-linear-gradient(92deg, rgba(0,0,0,0) 0, rgba(0,0,0,0) 5px, var(--grain) 5px, var(--grain) 5.5px),
    radial-gradient(120% 80% at 30% 25%, rgba(255,255,255,0.12), rgba(255,255,255,0) 60%),
    linear-gradient(180deg, var(--fill), var(--grain));
  background-blend-mode: soft-light, normal, normal;
  box-shadow: inset 0 0 0 1px rgba(29,35,44,0.1);
}
.k-plate__mat-no { display: block; font-family: var(--kw-mono); font-size: 9px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--kw-terra); opacity: 0.85; }
.k-plate__mat-name { display: block; font-family: var(--kw-sans); font-size: 14px; line-height: 1.18; letter-spacing: -0.006em; font-weight: 500; }

.k-plate__details { margin-top: 80px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }

@media (max-width: 980px) {
  .k-plate__spread { grid-template-columns: 1fr; gap: 56px; }
  .k-plate__details { grid-template-columns: 1fr; gap: 16px; }
}
@media (max-width: 720px) {
  .k-plate { padding-top: 64px; padding-bottom: 64px; }
  .k-plate__head { flex-direction: column; gap: 8px; align-items: flex-start; margin-bottom: 40px; }
  .k-plate__spec-row { grid-template-columns: 1fr; gap: 4px; padding: 12px 0; }
  .k-plate__mats { grid-template-columns: 1fr; gap: 16px; }
  .k-plate__mat { grid-template-columns: 44px 1fr; }
  .k-plate__mat-chip { width: 44px; }
}

/* ─── DOSSIER GRID · k-reg ─── */
.k-reg__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 56px 40px; margin-top: 24px; }
.k-reg__card { display: flex; flex-direction: column; text-decoration: none; color: var(--kw-ink); background: var(--kw-paper); padding-bottom: 4px; border-top: 1px solid var(--kw-rule); padding-top: 18px; }
.k-reg__head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; margin-bottom: 18px; }
.k-reg__no { font-family: var(--kw-sans); font-weight: 500; font-size: 28px; line-height: 1; letter-spacing: -0.018em; color: var(--kw-terra); }
.k-reg__stamp { font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; opacity: 0.55; }
.k-reg__card .k-img { margin-bottom: 22px; }
.k-reg__body { display: flex; flex-direction: column; gap: 10px; flex: 1; }
.k-reg__title { font-family: var(--kw-sans); font-size: 21px; line-height: 1.18; letter-spacing: -0.014em; font-weight: 500; margin: 0; }
.k-reg__dek { font-family: var(--kw-sans); font-size: 14px; line-height: 1.5; opacity: 0.7; margin: 0; flex: 1; }
.k-reg__mats { list-style: none; margin: 12px 0 0; padding: 0; display: flex; gap: 8px; align-items: center; }
.k-reg__mat {
  display: block; width: 28px; aspect-ratio: 1/1; background-color: var(--fill);
  background-image:
    repeating-linear-gradient(92deg, rgba(0,0,0,0) 0, rgba(0,0,0,0) 4px, var(--grain) 4px, var(--grain) 4.4px),
    linear-gradient(180deg, var(--fill), var(--grain));
  background-blend-mode: soft-light, normal;
  box-shadow: inset 0 0 0 1px rgba(29,35,44,0.12);
  transition: transform 0.35s cubic-bezier(0.2, 0.7, 0.2, 1);
}
.k-reg__cta {
  display: flex; justify-content: space-between; align-items: baseline;
  padding-top: 14px; margin-top: 14px; border-top: 1px solid var(--kw-rule);
  font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.2em;
  text-transform: uppercase; color: var(--kw-ink); opacity: 0.6;
  transition: opacity 0.35s ease, letter-spacing 0.35s ease, color 0.35s ease;
}
.k-reg__card:hover .k-reg__cta,
.k-reg__card:focus-visible .k-reg__cta { opacity: 1; color: var(--kw-terra); letter-spacing: 0.24em; }
.k-reg__card:hover .k-img,
.k-reg__card:focus-visible .k-img { filter: brightness(0.96); }
.k-reg__card:hover .k-reg__mat,
.k-reg__card:focus-visible .k-reg__mat { transform: translateY(-2px); }
.k-reg__card:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 4px; }

.k-reg__coda { display: grid; grid-template-columns: 1.4fr 1fr; gap: 64px; margin-top: 96px; padding-top: 40px; border-top: 1px solid var(--kw-rule); align-items: start; }
.k-reg__coda-stack { display: flex; flex-direction: column; gap: 12px; }
.k-reg__coda-lede { font-family: var(--kw-sans); font-size: 17px; line-height: 1.5; opacity: 0.72; max-width: 460px; margin: 0; }
.k-reg__coda-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.k-reg__coda-list li { display: grid; grid-template-columns: 1fr auto; gap: 16px; padding: 10px 0; border-bottom: 1px solid var(--kw-rule); }
.k-reg__coda-list li:last-child { border-bottom: 0; }
.k-reg__coda-list .k-mono { color: var(--kw-terra); opacity: 0.85; }

@media (max-width: 980px) { .k-reg__grid { grid-template-columns: repeat(2, 1fr); gap: 48px 32px; } }
@media (max-width: 720px) {
  .k-reg__grid { grid-template-columns: 1fr; gap: 56px; }
  .k-reg__coda { grid-template-columns: 1fr; gap: 32px; margin-top: 64px; }
  .k-reg__no { font-size: 22px; }
}
@media (prefers-reduced-motion: reduce) {
  .k-reg__mat, .k-reg__cta, .k-reg-toc__link, .k-reg-toc__name { transition: none; }
  .k-reg__card:hover .k-reg__mat,
  .k-reg__card:focus-visible .k-reg__mat { transform: none; }
}

/* ==========================================================================
   VISIT + TRADE STANDALONE PAGE REGISTER (2026-05-26)
   Two utility pages pulled up to the home-page closer register: display-scale
   hero with hairline meta band, dossier tiles, route schematic for visit,
   and a quieter editorial form on bone.
   ========================================================================== */
/* Heyoasis-feel rhythm: bumped to match the new .k-section cadence. */
.k-page-hero { padding: 152px var(--kw-pad) 112px; }
@media (max-width: 900px) { .k-page-hero { padding: 112px var(--kw-pad-sm) 88px; } }
.k-page-hero__eyebrow { margin-bottom: 40px; opacity: 0.6; }
.k-page-hero__title {
  font-family: var(--kw-sans);
  font-size: clamp(72px, 12.4vw, 208px); line-height: 0.92;
  letter-spacing: -0.038em; font-weight: 700;
  margin: 0 0 56px; color: var(--kw-ink); text-wrap: balance;
}
/* Phones: the 72px floor above is wider than the gutter can hold for a single
   long word ("appointment." / "trade."), so the display title broke mid-word.
   A gentler slope with a lower floor keeps the longest word on one line down
   to a 320px viewport; the cap stays 72px so tablets keep the full display
   scale. Defined after the base rule so it wins the source-order tie. */
@media (max-width: 768px) {
  .k-page-hero__title { font-size: clamp(38px, 11.5vw, 72px); }
}
.k-page-hero__meta {
  display: grid; grid-template-columns: repeat(3, 1fr); padding: 28px 0;
  border-top: 1px solid var(--kw-rule-strong); border-bottom: 1px solid var(--kw-rule);
}
.k-page-hero__meta > div { padding: 0 32px; border-left: 1px solid var(--kw-rule); }
.k-page-hero__meta > div:first-child { padding-left: 0; border-left: 0; }
.k-page-hero__meta-cap { opacity: 0.55; margin-bottom: 12px; }
.k-page-hero__meta-val {
  font-family: var(--kw-sans); font-size: 17px; line-height: 1.42;
  letter-spacing: -0.008em; color: var(--kw-ink);
}
@media (max-width: 760px) {
  .k-page-hero__meta { grid-template-columns: 1fr; padding: 0; border: 0; }
  .k-page-hero__meta > div { padding: 22px 0; border: 0; border-top: 1px solid var(--kw-rule); }
  .k-page-hero__meta > div:first-child { border-top: 1px solid var(--kw-rule-strong); }
  .k-page-hero__meta > div:last-child { border-bottom: 1px solid var(--kw-rule); }
}

/* Beats + Trade dossier share a numbered-bordered-grid pattern */
.k-beats, .k-trade-tiles {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid var(--kw-rule-strong);
  border-bottom: 1px solid var(--kw-rule-strong);
}
.k-beats > li {
  padding: 48px 28px 40px; border-left: 1px solid var(--kw-rule);
  display: flex; flex-direction: column; gap: 14px;
}
.k-beats > li:first-child, .k-trade-tiles > li:first-child { border-left: 0; }
.k-beats__num {
  font-family: var(--kw-mono); font-size: clamp(36px, 3.4vw, 52px); color: var(--kw-terra);
  line-height: 0.86; letter-spacing: -0.02em; font-weight: 500; margin-bottom: 14px;
}
.k-beats__label { color: var(--kw-ink); opacity: 0.55; }
.k-beats__title { font-size: 19px; line-height: 1.28; letter-spacing: -0.012em; font-weight: 500; color: var(--kw-ink); }
.k-beats__dek, .k-trade-tiles__dek { font-size: 14.5px; line-height: 1.5; color: var(--kw-ink); opacity: 0.78; }
@media (max-width: 900px) {
  .k-beats, .k-trade-tiles { grid-template-columns: 1fr 1fr; }
  .k-beats > li { padding: 36px 18px 28px; }
  .k-beats > li:nth-child(2n+1), .k-trade-tiles > li:nth-child(2n+1) { border-left: 0; }
  .k-beats > li:nth-child(n+3), .k-trade-tiles > li:nth-child(n+3) { border-top: 1px solid var(--kw-rule); }
}
@media (max-width: 560px) {
  .k-beats, .k-trade-tiles { grid-template-columns: 1fr; }
  .k-beats > li, .k-trade-tiles > li { border-left: 0; padding: 36px 0 28px; }
  .k-beats > li + li, .k-trade-tiles > li + li { border-top: 1px solid var(--kw-rule); }
}

/* Editorial form on bone — hairline, terra focus, no inverted ink block */
.k-eform { display: grid; grid-template-columns: minmax(280px, 0.85fr) minmax(0, 1.4fr); gap: 88px; align-items: start; }
.k-eform__intro h2 { color: var(--kw-ink); margin-bottom: 24px; }
.k-eform__intro p {
  font-family: var(--kw-sans); font-size: 19px; line-height: 1.5;
  letter-spacing: -0.008em; color: var(--kw-ink); opacity: 0.78;
  margin-bottom: 32px; max-width: 36ch;
}
.k-eform__contacts {
  border-top: 1px solid var(--kw-rule); padding-top: 22px;
  font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.18em;
  text-transform: uppercase; line-height: 1.9; color: var(--kw-ink); opacity: 0.72;
}
.k-eform__contacts a { color: var(--kw-ink); border-bottom: 1px solid var(--kw-rule-strong); }
.k-eform__contacts a:hover { color: var(--kw-terra); border-bottom-color: var(--kw-terra); }
.k-eform__form { display: grid; grid-template-columns: 1fr 1fr; gap: 32px 28px; }
.k-eform__field { display: flex; flex-direction: column; gap: 10px; }
.k-eform__field--full { grid-column: 1 / -1; }
.k-eform__field > label {
  font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.22em;
  text-transform: uppercase; color: var(--kw-ink); opacity: 0.55;
}
.k-eform__field > input, .k-eform__field > select, .k-eform__field > textarea {
  background: transparent; border: 0; border-bottom: 1px solid var(--kw-rule-strong);
  padding: 8px 0 12px; font-family: var(--kw-sans); font-size: 17px;
  letter-spacing: -0.008em; color: var(--kw-ink); width: 100%; outline: none;
  transition: border-color 0.2s; -webkit-appearance: none; appearance: none;
}
.k-eform__field > select {
  background-image: linear-gradient(45deg, transparent 50%, var(--kw-ink) 50%),
                    linear-gradient(135deg, var(--kw-ink) 50%, transparent 50%);
  background-position: calc(100% - 14px) center, calc(100% - 8px) center;
  background-size: 6px 6px, 6px 6px; background-repeat: no-repeat; padding-right: 26px;
}
.k-eform__field > textarea { resize: vertical; min-height: 92px; line-height: 1.5; }
.k-eform__field > input:focus, .k-eform__field > select:focus, .k-eform__field > textarea:focus { border-bottom-color: var(--kw-terra); }
.k-eform__field > input::placeholder, .k-eform__field > textarea::placeholder { color: var(--kw-ink); opacity: 0.32; }
.k-eform__submit {
  grid-column: 1 / -1; display: flex; align-items: baseline; gap: 24px;
  padding-top: 12px; border-top: 1px solid var(--kw-rule); flex-wrap: wrap;
}
.k-eform__submit-note {
  font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.22em;
  text-transform: uppercase; color: var(--kw-ink); opacity: 0.5;
}
@media (max-width: 1000px) { .k-eform { grid-template-columns: 1fr; gap: 56px; } }
@media (max-width: 700px) { .k-eform__form { grid-template-columns: 1fr; gap: 24px; } }

/* Route schematic — Manhattan to SoHo showroom, single self-draw line */
.k-route {
  background: var(--kw-bone-2); border: 1px solid var(--kw-rule);
  padding: 22px; aspect-ratio: 16 / 8; position: relative; margin-top: 40px;
}
.k-route__sheet { display: block; width: 100%; height: 100%; }
.k-route__sheet text { font-family: var(--kw-mono); fill: var(--kw-ink); }
.k-route__sheet .kr-h { font-size: 10px; letter-spacing: 0.22em; }
.k-route__sheet .kr-m { font-size: 8.5px; letter-spacing: 0.18em; opacity: 0.6; }
.k-route__sheet .kr-grid line { stroke: var(--kw-ink); stroke-width: 0.5; opacity: 0.14; }
.k-route__sheet .kr-st line { stroke: var(--kw-ink); stroke-width: 0.7; opacity: 0.34; }
.k-route__sheet .kr-st text { font-size: 8px; letter-spacing: 0.18em; opacity: 0.55; }
.k-route__sheet .kr-line {
  stroke: var(--kw-terra); stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round;
  fill: none; stroke-dasharray: 1; stroke-dashoffset: 1;
  animation: kw-route-draw 2.6s cubic-bezier(.22,.61,.36,1) 0.4s both;
}
.k-route__sheet .kr-pin { fill: var(--kw-terra); stroke: none; }
.k-route__sheet .kr-pin-ring { fill: none; stroke: var(--kw-terra); stroke-width: 1; opacity: 0.6; }
.k-route__sheet .kr-pin-l { font-size: 10px; letter-spacing: 0.2em; fill: var(--kw-terra); font-weight: 500; }
.k-route__sheet .kr-pin-m { font-size: 8px; letter-spacing: 0.2em; opacity: 0.55; }
.k-route__sheet .kr-block { fill: var(--kw-ink); fill-opacity: 0.04; }
@media (max-width: 700px) { .k-route { aspect-ratio: 4 / 3; padding: 14px; } }
@media (prefers-reduced-motion: reduce) { .k-route__sheet .kr-line { animation: none; stroke-dashoffset: 0; } }

/* Trade dossier — folio, hairline-rule-before-dek (terra), shared border grid */
.k-trade-tiles > li {
  position: relative; padding: 56px 28px 44px; border-left: 1px solid var(--kw-rule);
  display: flex; flex-direction: column; gap: 14px; min-height: 280px;
}
.k-trade-tiles__folio { position: absolute; top: 20px; left: 28px; color: var(--kw-ink); opacity: 0.4; }
.k-trade-tiles__title {
  font-size: 22px; line-height: 1.18; letter-spacing: -0.014em;
  font-weight: 500; color: var(--kw-ink); margin-top: 36px;
}
.k-trade-tiles__dek { margin-top: auto; }
.k-trade-tiles__dek::before {
  content: ""; display: block; width: 24px; height: 1px;
  background: var(--kw-terra); opacity: 0.7; margin-bottom: 14px;
}
@media (max-width: 900px) { .k-trade-tiles > li { min-height: 230px; padding: 48px 22px 32px; } }
@media (max-width: 560px) { .k-trade-tiles > li { padding: 40px 6px 32px; } }

/* CE — continuing education editorial moment */
.k-ce { display: grid; grid-template-columns: 0.45fr 1.3fr; gap: 64px; align-items: start; }
.k-ce__seal {
  font-family: var(--kw-mono); border: 1px solid var(--kw-rule-strong);
  padding: 36px 28px; text-align: center; position: relative;
}
.k-ce__seal-num {
  font-family: var(--kw-mono); font-size: clamp(40px, 4vw, 56px);
  color: var(--kw-terra); font-weight: 500; line-height: 1;
  letter-spacing: -0.02em; display: block; margin-bottom: 12px;
}
.k-ce__seal-cap { opacity: 0.7; line-height: 1.7; }
.k-ce__body p { font-size: 17px; line-height: 1.55; color: var(--kw-ink); opacity: 0.86; }
.k-ce__body p + p { margin-top: 1em; }
@media (max-width: 900px) { .k-ce { grid-template-columns: 1fr; gap: 32px; } }

/* =================================================================
   TYLKO-FEEL LAYER v2 (2026-05-28)
   -----------------------------------------------------------------
   A site-wide pass to capture tylko's actual signature: SHAPES
   (everything rounded, soft, capsule-like) plus INTERACTIVENESS
   (cards lift on hover, swatches animate, photos cross-fade, the
   slider thumb has weight). This is a layer — it overrides earlier
   styles selectively so the existing layout grid stays intact.
   ================================================================= */

:root {
  --kw-r-card:    22px;
  --kw-r-card-lg: 30px;
  --kw-r-input:   14px;
  --kw-r-pill:    999px;
  --kw-shadow-lift: 0 22px 56px -28px rgba(20,24,30,0.30), 0 8px 18px -12px rgba(20,24,30,0.16);
  --kw-shadow-soft: 0 10px 26px -16px rgba(20,24,30,0.22);
  --kw-shadow-bar:  0 28px 68px -32px rgba(20,24,30,0.55);
  --kw-ease-tylko: cubic-bezier(.22, .61, .36, 1);
}

/* --- FLOATING CAPSULE NAV ---------------------------------------
   The single most identifiable tylko element: a pill-shaped nav
   that floats over the page with a backdrop blur. */
.k-nav {
  position: fixed !important;
  top: 16px;
  left: 50%;
  transform: translateX(-50%);
  width: calc(100% - 32px);
  max-width: 1320px;
  background: rgba(250, 247, 241, 0.82) !important;
  -webkit-backdrop-filter: saturate(180%) blur(18px);
  backdrop-filter: saturate(180%) blur(18px);
  border: 1px solid rgba(29, 35, 44, 0.08) !important;
  border-radius: var(--kw-r-pill) !important;
  box-shadow: var(--kw-shadow-soft);
  z-index: 100;
  transition: top 0.3s var(--kw-ease-tylko), background 0.3s ease, box-shadow 0.3s ease, padding 0.3s ease;
}
.k-nav.is-scrolled {
  top: 8px;
  background: rgba(250, 247, 241, 0.94) !important;
  box-shadow: var(--kw-shadow-lift);
}
.k-nav__inner {
  padding: 11px 26px !important;
  gap: 28px !important;
}
.k-nav.is-scrolled .k-nav__inner {
  padding: 9px 24px !important;
}
.k-nav__cta {
  border-radius: var(--kw-r-pill) !important;
  padding: 11px 22px !important;
  background: var(--kw-ink) !important;
  color: var(--kw-paper) !important;
  border: 1px solid var(--kw-ink) !important;
  transition: transform 0.22s var(--kw-ease-tylko),
              box-shadow 0.22s var(--kw-ease-tylko),
              background 0.2s ease,
              border-color 0.2s ease !important;
}
.k-nav__cta:hover {
  background: var(--kw-terra) !important;
  border-color: var(--kw-terra) !important;
  transform: translateY(-1px);
  box-shadow: 0 8px 18px -10px rgba(122, 47, 58, 0.55);
}
.k-nav__item.is-active::after { bottom: -3px; }

/* Push body below the floating nav */
body { padding-top: 84px; }
@media (max-width: 900px) {
  body { padding-top: 72px; }
  .k-nav { top: 10px; width: calc(100% - 20px); }
  .k-nav__inner { padding: 9px 18px !important; }
}

/* --- SOFT-RADIUS CASCADE ----------------------------------------
   Every photo container gets tylko's rounded-rect treatment. */
.k-img,
.k-img--photo,
.k-projects__tile-img,
.k-spaces__tile-img,
.k-builder__canvas,
.k-confidence__card-img,
.k-vs__media,
.k-vs2__media,
.k-vis__canvas,
.k-conv__img,
.k-feat__img,
.k-feat-spread__img,
.k-foot__news,
.k-trade__plate {
  border-radius: var(--kw-r-card) !important;
  border: 0 !important;
  overflow: hidden;
}
.k-img--bleed, .k-img--hero,
.k-hero-cinema__act,
.k-builder__canvas {
  border-radius: var(--kw-r-card-lg) !important;
  overflow: hidden;
}
.k-projects__tile { border-radius: 0 !important; overflow: visible; }
.k-projects__tile-img { border-radius: var(--kw-r-card) !important; }

/* Caption gradient inside rounded canvas needs to clip to the radius */
.k-builder__caption { border-bottom-left-radius: var(--kw-r-card-lg); border-bottom-right-radius: var(--kw-r-card-lg); }

/* --- INPUT SOFT-RADIUS ------------------------------------------- */
input[type="text"], input[type="email"], input[type="tel"],
input[type="search"], input[type="number"], input[type="url"],
select, textarea {
  border-radius: var(--kw-r-input) !important;
  border: 1px solid rgba(29, 35, 44, 0.18) !important;
  padding: 14px 16px !important;
  font-family: var(--kw-sans) !important;
  font-size: 16px !important; /* 16px min so iOS Safari never auto-zooms on focus */
  background: var(--kw-paper);
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
input:focus, select:focus, textarea:focus {
  border-color: var(--kw-ink) !important;
  box-shadow: 0 0 0 4px rgba(29, 35, 44, 0.08) !important;
  outline: 0 !important;
}

/* --- ALL CTAs become pills site-wide ----------------------------- */
.k-btn, .k-cta,
.k-hero-cinema__cta,
.k-sticky-cta__btn,
.k-foot__news-btn,
button.k-form__btn,
.k-form button[type="submit"] {
  border-radius: var(--kw-r-pill) !important;
  transition: transform 0.22s var(--kw-ease-tylko),
              box-shadow 0.22s var(--kw-ease-tylko),
              background 0.2s ease,
              color 0.2s ease,
              border-color 0.2s ease !important;
}
.k-btn:hover, .k-cta:hover,
.k-hero-cinema__cta:hover,
.k-sticky-cta__btn:hover,
.k-foot__news-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 12px 24px -14px rgba(20, 24, 30, 0.34);
}
.k-cta--primary, .k-btn--primary {
  background: var(--kw-ink) !important;
  color: var(--kw-paper) !important;
  border-color: var(--kw-ink) !important;
}
.k-cta--primary:hover, .k-btn--primary:hover {
  background: var(--kw-terra) !important;
  border-color: var(--kw-terra) !important;
}

/* Arrow micro-motion on every CTA that has an arrow span */
.k-sticky-cta__arrow,
.k-card__arrow svg,
.k-cta__arrow,
.k-hero-cinema__cta-arrow {
  display: inline-block;
  transition: transform 0.32s var(--kw-ease-tylko);
}
.k-sticky-cta__btn:hover .k-sticky-cta__arrow,
.k-cta:hover .k-cta__arrow,
.k-hero-cinema__cta:hover .k-hero-cinema__cta-arrow,
.k-card--hover:hover .k-card__arrow svg {
  transform: translateX(5px);
}

/* --- CARD HOVER MICRO-INTERACTIONS ------------------------------- */
.k-projects__tile {
  transition: transform 0.5s var(--kw-ease-tylko);
}
.k-projects__tile:hover {
  transform: translateY(-6px);
}
.k-projects__tile-img,
.k-spaces__tile-img {
  transition: transform 0.7s var(--kw-ease-tylko), filter 0.5s ease !important;
}
.k-projects__tile:hover .k-projects__tile-img {
  transform: scale(1.06) !important;
}

/* --- CONFIGURATOR POLISH ----------------------------------------- */
.k-builder__canvas {
  background: var(--kw-bone-2);
  box-shadow: 0 38px 92px -48px rgba(20, 24, 30, 0.32),
              0 12px 32px -18px rgba(20, 24, 30, 0.14);
}
.k-builder__visual {
  transition: opacity 0.45s var(--kw-ease-tylko),
              transform 0.9s var(--kw-ease-tylko) !important;
  transform: scale(1.0);
}
.k-builder__visual.is-fading {
  opacity: 0.4;
  transform: scale(1.03);
}

/* Chunky tylko-style slider */
.k-builder__slider input[type="range"] {
  -webkit-appearance: none;
  appearance: none;
  height: 6px;
  background: rgba(29, 35, 44, 0.12);
  border-radius: var(--kw-r-pill);
  outline: none;
}
.k-builder__slider input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--kw-ink);
  border: 4px solid var(--kw-paper);
  box-shadow: 0 4px 12px -2px rgba(20, 24, 30, 0.36);
  cursor: grab;
  transition: transform 0.18s var(--kw-ease-tylko), background 0.18s ease;
}
.k-builder__slider input[type="range"]::-moz-range-thumb {
  width: 26px; height: 26px; border-radius: 50%;
  background: var(--kw-ink); border: 4px solid var(--kw-paper);
  box-shadow: 0 4px 12px -2px rgba(20, 24, 30, 0.36);
  cursor: grab;
  transition: transform 0.18s var(--kw-ease-tylko), background 0.18s ease;
}
.k-builder__slider input[type="range"]:hover::-webkit-slider-thumb { transform: scale(1.14); }
.k-builder__slider input[type="range"]:hover::-moz-range-thumb { transform: scale(1.14); }
.k-builder__slider input[type="range"]:active::-webkit-slider-thumb { background: var(--kw-terra); cursor: grabbing; }
.k-builder__slider input[type="range"]:active::-moz-range-thumb { background: var(--kw-terra); cursor: grabbing; }

.k-builder__slider-value {
  font-weight: 600 !important;
  background: var(--kw-ink) !important;
  color: var(--kw-paper) !important;
  padding: 7px 14px !important;
  border-radius: var(--kw-r-pill) !important;
  text-align: center !important;
  min-width: 72px;
  font-variant-numeric: tabular-nums !important;
}

/* Tylko pill-radio polish */
.k-builder__radio span,
.k-builder__check span {
  padding: 13px 22px !important;
  font-size: 14.5px !important;
  border: 1.5px solid rgba(29, 35, 44, 0.14) !important;
  background: var(--kw-paper) !important;
  border-radius: var(--kw-r-pill) !important;
  transition: transform 0.18s var(--kw-ease-tylko),
              border-color 0.18s ease,
              background 0.18s ease,
              color 0.18s ease,
              box-shadow 0.18s ease !important;
}
.k-builder__radio:hover span,
.k-builder__check:hover span {
  border-color: rgba(29, 35, 44, 0.38) !important;
  transform: translateY(-1px);
}
.k-builder__radio input:checked + span,
.k-builder__check input:checked + span {
  background: var(--kw-ink) !important;
  color: var(--kw-paper) !important;
  border-color: var(--kw-ink) !important;
  box-shadow: 0 6px 14px -6px rgba(20, 24, 30, 0.38) !important;
}

/* Animated color-dot picker — bigger, with glow ring on selection */
.k-builder__dot-chip {
  width: 40px !important;
  height: 40px !important;
  transition: transform 0.22s var(--kw-ease-tylko),
              box-shadow 0.22s var(--kw-ease-tylko) !important;
}
.k-builder__dot:hover .k-builder__dot-chip {
  transform: scale(1.12) !important;
}
.k-builder__dot input:checked + .k-builder__dot-chip {
  outline: 0 !important;
  box-shadow:
    0 0 0 3px var(--kw-bone),
    0 0 0 5px var(--kw-ink),
    0 6px 18px -6px rgba(20, 24, 30, 0.42) !important;
  transform: scale(1.08) !important;
}

/* Sticky bar floats as a pill not a flat bar */
.k-builder__bar {
  width: calc(100% - 32px);
  max-width: 1240px;
  margin: 0 auto;
  bottom: 16px !important;
  border-radius: var(--kw-r-card-lg) !important;
  border-top: 0 !important;
  padding: 22px 28px !important;
  box-shadow: var(--kw-shadow-bar);
  -webkit-backdrop-filter: saturate(160%);
  backdrop-filter: saturate(160%);
}

/* Builder CTA — paper pill on the inverted ground */
.k-builder__bar .k-cta,
.k-builder__bar a[href] {
  border-radius: var(--kw-r-pill) !important;
  padding: 14px 24px !important;
  background: var(--kw-paper) !important;
  color: var(--kw-ink) !important;
  font-family: var(--kw-mono) !important;
  font-size: 11.5px !important;
  letter-spacing: 0.2em !important;
  text-transform: uppercase !important;
  border: 0 !important;
  text-decoration: none !important;
  transition: transform 0.22s var(--kw-ease-tylko),
              background 0.2s ease,
              color 0.2s ease,
              box-shadow 0.22s var(--kw-ease-tylko) !important;
}
.k-builder__bar .k-cta:hover,
.k-builder__bar a[href]:hover {
  background: var(--kw-terra) !important;
  color: var(--kw-paper) !important;
  transform: translateY(-2px);
  box-shadow: 0 10px 22px -10px rgba(122, 47, 58, 0.55);
}

/* --- STICKY CTA (site-wide floating button) --------------------- */
.k-sticky-cta {
  z-index: 90;
}
.k-sticky-cta__btn {
  border-radius: var(--kw-r-pill) !important;
  padding: 14px 26px !important;
  background: var(--kw-ink) !important;
  color: var(--kw-paper) !important;
  font-family: var(--kw-mono) !important;
  font-size: 11.5px !important;
  letter-spacing: 0.2em !important;
  text-transform: uppercase !important;
  border: 0 !important;
  box-shadow: var(--kw-shadow-lift);
}
.k-sticky-cta__btn:hover {
  background: var(--kw-terra) !important;
}

/* --- FORM POLISH (consultation + newsletter) -------------------- */
.k-foot__news-row {
  border-radius: var(--kw-r-pill);
  overflow: hidden;
  border: 1px solid rgba(250, 247, 241, 0.18);
}
.k-foot__news-row input {
  border-radius: 0 !important;
  border: 0 !important;
  background: transparent !important;
  color: var(--kw-bone);
}
.k-foot__news-btn {
  border-radius: 0 !important;
  background: var(--kw-paper);
  color: var(--kw-ink);
  padding: 14px 22px !important;
}

/* --- BEFORE/AFTER + COMPARISON CARDS ---------------------------- */
.k-vs2__cell, .k-vs__cell {
  border-radius: var(--kw-r-card) !important;
}

/* --- REVEAL (entry animation) ----------------------------------- */
@media (prefers-reduced-motion: no-preference) {
  .k-reveal {
    opacity: 0;
    transform: translateY(16px);
    transition: opacity 0.7s var(--kw-ease-tylko), transform 0.7s var(--kw-ease-tylko);
  }
  .k-reveal.is-visible {
    opacity: 1;
    transform: translateY(0);
  }
}

/* --- MOBILE GUARDS ---------------------------------------------- */
@media (max-width: 960px) {
  .k-builder__bar {
    grid-template-columns: 1fr !important;
    gap: 14px !important;
    width: calc(100% - 16px) !important;
    padding: 18px 22px !important;
    bottom: 10px !important;
  }
  .k-builder__bar-cell--cta { align-items: stretch !important; }
  .k-builder__bar-cell--cta .k-cta,
  .k-builder__bar-cell--cta a[href] { text-align: center; display: block; }
}

/* --- REDUCED MOTION RESPECT ------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  .k-projects__tile,
  .k-projects__tile-img,
  .k-spaces__tile-img,
  .k-builder__visual,
  .k-builder__dot-chip,
  .k-builder__radio span,
  .k-builder__check span,
  .k-cta, .k-btn, .k-nav,
  .k-sticky-cta__arrow, .k-cta__arrow {
    transition: none !important;
  }
}

/* =================================================================
   TYLKO-FEEL LAYER v2.1 — ENTRY MOTION
   -----------------------------------------------------------------
   The page should feel ALIVE on arrival, not still. Tylko's product
   page does an orchestrated entry: hero text rises, the canvas
   fades in, then the option chips cascade. Gives the visitor an
   immediate sense of an interactive surface.
   ================================================================= */

@media (prefers-reduced-motion: no-preference) {
  /* Configurator: orchestrated arrival */
  @keyframes kw-rise-in {
    from { opacity: 0; transform: translateY(14px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  @keyframes kw-fade-in {
    from { opacity: 0; }
    to   { opacity: 1; }
  }

  .k-builder__canvas {
    animation: kw-rise-in 0.9s var(--kw-ease-tylko) both;
  }
  .k-builder__step {
    animation: kw-rise-in 0.7s var(--kw-ease-tylko) both;
    opacity: 0;
  }
  .k-builder__step:nth-child(1) { animation-delay: 0.08s; }
  .k-builder__step:nth-child(2) { animation-delay: 0.18s; }
  .k-builder__step:nth-child(3) { animation-delay: 0.28s; }
  .k-builder__step:nth-child(4) { animation-delay: 0.38s; }
  .k-builder__step:nth-child(5) { animation-delay: 0.48s; }
  .k-builder__step:nth-child(6) { animation-delay: 0.58s; }
  .k-builder__bar {
    animation: kw-rise-in 0.8s var(--kw-ease-tylko) 0.65s both;
  }

  /* Hero primary CTA: subtle attention pulse on the bone glow ring */
  @keyframes kw-pulse-ring {
    0%   { box-shadow: 0 0 0 0 rgba(250, 247, 241, 0.42), 0 12px 24px -14px rgba(20,24,30,0.34); }
    70%  { box-shadow: 0 0 0 14px rgba(250, 247, 241, 0.0),  0 12px 24px -14px rgba(20,24,30,0.34); }
    100% { box-shadow: 0 0 0 0 rgba(250, 247, 241, 0.0),  0 12px 24px -14px rgba(20,24,30,0.34); }
  }
  .k-hero-cinema__cta--primary {
    animation: kw-pulse-ring 2.6s ease-out 1.2s infinite;
  }
  .k-hero-cinema__cta--primary:hover { animation-play-state: paused; }

  /* Sticky CTA: gentle slide-up entry (already opacity-fades, add rise) */
  .k-sticky-cta {
    animation: kw-rise-in 0.6s var(--kw-ease-tylko) both;
  }
}

/* Nav: soft fade on arrival — the capsule floats in rather than snap */
@media (prefers-reduced-motion: no-preference) {
  @keyframes kw-nav-arrive {
    from { opacity: 0; transform: translate(-50%, -8px); }
    to   { opacity: 1; transform: translate(-50%, 0); }
  }
  .k-nav {
    animation: kw-nav-arrive 0.55s var(--kw-ease-tylko) both;
  }
}


/* =================================================================
   TYLKO-FEEL LAYER v3 — THE SIGNATURE MOVES (2026-05-28)
   -----------------------------------------------------------------
   Daniel sent a screen-recording of tylko.com. The four moves
   below are what makes the site immediately READ as tylko, none
   of which we had:
     1. MEGA pill category navigator — chunky 60-100px-tall black
        pills in a deliberately scattered asymmetric layout
     2. Three-up "color-picker" product spread — three items on
        cream with rows of swatches + an Explore pill below
     3. Big-eyebrow + huge-display headline pattern
     4. Cinematic full-bleed product-detail close-up bands
   ================================================================= */

/* --- BIG EYEBROW + DISPLAY HEADLINE PATTERN --------------------- */
.k-bigh {
  text-align: left;
  padding: clamp(56px, 9vw, 128px) 0 clamp(32px, 4vw, 56px);
}
.k-bigh__eyebrow {
  display: block;
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.62;
  margin-bottom: clamp(20px, 3vw, 40px);
}
.k-bigh__head {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-size: clamp(40px, 7.5vw, 116px);
  line-height: 0.96;
  letter-spacing: -0.038em;
  color: var(--kw-ink);
  margin: 0;
  text-wrap: balance;
  max-width: 1240px;
}
.k-bigh__head .k-dot { color: var(--kw-terra); margin-left: 0.02em; }
@media (max-width: 720px) {
  .k-bigh__head { font-size: clamp(34px, 11vw, 64px); letter-spacing: -0.028em; }
}

/* --- MEGA PILL CATEGORY NAVIGATOR -------------------------------
   The killer tylko signature. Massive black pills in a casual,
   scattered arrangement. Hover floods terra. Mobile collapses to
   two columns with smaller pills. */
.k-mega-pills {
  background: var(--kw-bone);
  padding: clamp(40px, 6vw, 88px) 0 clamp(56px, 8vw, 120px);
  overflow: hidden;
}
.k-mega-pills__inner {
  max-width: 1500px;
  margin: 0 auto;
  padding: 0 clamp(16px, 3vw, 56px);
}
.k-mega-pills__eyebrow {
  display: block;
  font-family: var(--kw-mono);
  font-size: 12px;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--kw-ink);
  opacity: 0.6;
  margin-bottom: clamp(28px, 4vw, 56px);
}
.k-mega-pills__scatter {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-start;
  gap: clamp(14px, 1.8vw, 28px);
  row-gap: clamp(16px, 2.4vw, 32px);
}
.k-mega-pills__pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: clamp(18px, 2.4vw, 36px) clamp(28px, 4.4vw, 72px);
  background: var(--kw-ink);
  color: var(--kw-paper);
  font-family: var(--kw-sans);
  font-weight: 700;
  font-size: clamp(28px, 4.6vw, 76px);
  line-height: 1;
  letter-spacing: -0.025em;
  text-transform: uppercase;
  text-decoration: none;
  border-radius: 999px;
  border: 0;
  white-space: nowrap;
  transition: background 0.32s var(--kw-ease-tylko),
              color 0.32s var(--kw-ease-tylko),
              transform 0.32s var(--kw-ease-tylko),
              box-shadow 0.32s var(--kw-ease-tylko);
  cursor: pointer;
}
.k-mega-pills__pill:hover,
.k-mega-pills__pill:focus-visible {
  background: var(--kw-terra);
  color: var(--kw-paper);
  transform: translateY(-3px) scale(1.015);
  box-shadow: 0 22px 44px -24px rgba(122, 47, 58, 0.62);
  outline: 0;
}
/* Optional ghost variant — outlined ink pill for the catch-all link */
.k-mega-pills__pill--ghost {
  background: transparent;
  color: var(--kw-ink);
  border: 2px solid var(--kw-ink);
  padding: calc(clamp(18px, 2.4vw, 36px) - 2px) calc(clamp(28px, 4.4vw, 72px) - 2px);
}
.k-mega-pills__pill--ghost:hover {
  background: var(--kw-ink);
  color: var(--kw-paper);
  border-color: var(--kw-ink);
}
/* Deliberate asymmetric offsets — gives the scatter feel rather
   than a tidy grid. Even rows are nudged right, odd rows left. */
.k-mega-pills__row {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(14px, 2vw, 28px);
  margin-bottom: clamp(14px, 2vw, 28px);
}
.k-mega-pills__row:last-child { margin-bottom: 0; }
.k-mega-pills__row--offset-r { padding-left: clamp(40px, 8vw, 180px); }
.k-mega-pills__row--offset-l { padding-right: clamp(40px, 8vw, 180px); }
@media (max-width: 720px) {
  .k-mega-pills__row--offset-r,
  .k-mega-pills__row--offset-l { padding: 0; }
  .k-mega-pills__pill { font-size: clamp(22px, 7.5vw, 38px); padding: 16px 30px; }
}

/* --- THREE-UP COLOR PICKER SPREAD -------------------------------
   Tylko's "Choose your colour. The rest is easy." pattern. Three
   products floating on cream, each with a row of color swatches
   and a thin-line Explore pill. */
.k-picker-trio {
  background: var(--kw-bone);
  padding: clamp(40px, 6vw, 96px) 0 clamp(64px, 9vw, 128px);
}
.k-picker-trio__inner {
  max-width: 1500px;
  margin: 0 auto;
  padding: 0 clamp(20px, 3vw, 56px);
}
.k-picker-trio__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(28px, 4vw, 80px);
  margin-top: clamp(48px, 6vw, 96px);
}
.k-picker-trio__cell {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 28px;
}
.k-picker-trio__img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 5;
  background-color: transparent;
  background-size: contain;
  background-position: center bottom;
  background-repeat: no-repeat;
  border-radius: var(--kw-r-card-lg);
  margin-bottom: 8px;
  transition: transform 0.7s var(--kw-ease-tylko);
}
.k-picker-trio__cell:hover .k-picker-trio__img {
  transform: scale(1.035);
}
.k-picker-trio__name {
  font-family: var(--kw-sans);
  font-weight: 500;
  font-size: clamp(20px, 1.8vw, 26px);
  letter-spacing: -0.012em;
  color: var(--kw-ink);
  margin: 0;
}
.k-picker-trio__dots {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
  max-width: 320px;
  margin: 0 auto;
}
.k-picker-trio__dot {
  display: inline-block;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  border: 1px solid rgba(29, 35, 44, 0.22);
  cursor: pointer;
  transition: transform 0.2s var(--kw-ease-tylko),
              box-shadow 0.2s var(--kw-ease-tylko);
  position: relative;
}
.k-picker-trio__dot:hover {
  transform: scale(1.18);
  z-index: 2;
}
.k-picker-trio__dot.is-active,
.k-picker-trio__dot:active {
  box-shadow: 0 0 0 2px var(--kw-bone), 0 0 0 4px var(--kw-ink);
}
/* Material swatches by name — true material hex values from the
   Kloset Worx catalogue. */
.k-picker-trio__dot[data-mat="oak"]      { background: #c9a878; }
.k-picker-trio__dot[data-mat="cerused"]  { background: #ddd1bd; }
.k-picker-trio__dot[data-mat="walnut"]   { background: #6d4838; }
.k-picker-trio__dot[data-mat="claro"]    { background: #4a2a18; }
.k-picker-trio__dot[data-mat="leather"]  { background: #9a4f2e; }
.k-picker-trio__dot[data-mat="linen"]    { background: #ddd5c4; }
.k-picker-trio__dot[data-mat="stone"]    { background: #f0ecdf; }
.k-picker-trio__dot[data-mat="ink"]      { background: #1d232c; }
.k-picker-trio__dot[data-mat="bone"]     { background: #faf7f1; }
.k-picker-trio__dot[data-mat="clay"]     { background: #b6604b; }
.k-picker-trio__dot[data-mat="olive"]    { background: #6b6a3c; }
.k-picker-trio__dot[data-mat="sage"]     { background: #9aa890; }
.k-picker-trio__dot[data-mat="storm"]    { background: #586571; }
.k-picker-trio__dot[data-mat="charcoal"] { background: #2c2f33; }
.k-picker-trio__dot[data-mat="brass"]    { background: #b89456; }
.k-picker-trio__dot[data-mat="bronze"]   { background: #6b4928; }

.k-picker-trio__cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 14px 36px;
  border: 1px solid var(--kw-ink);
  background: transparent;
  color: var(--kw-ink);
  font-family: var(--kw-sans);
  font-size: 15px;
  font-weight: 500;
  letter-spacing: -0.005em;
  text-decoration: none;
  border-radius: 999px;
  transition: background 0.22s var(--kw-ease-tylko),
              color 0.22s var(--kw-ease-tylko),
              transform 0.22s var(--kw-ease-tylko),
              box-shadow 0.22s var(--kw-ease-tylko);
  margin-top: 10px;
}
.k-picker-trio__cta:hover {
  background: var(--kw-ink);
  color: var(--kw-paper);
  transform: translateY(-2px);
  box-shadow: 0 10px 22px -10px rgba(20, 24, 30, 0.42);
}

@media (max-width: 900px) {
  .k-picker-trio__grid { grid-template-columns: 1fr; gap: 64px; }
}

/* --- CINEMATIC CLOSE-UP BAND ------------------------------------
   Apple-style product-as-art full-bleed photo. Used between
   sections as a breath / mood transition. Heading optional and
   sits inset, bottom-left. */
.k-cinema-band {
  position: relative;
  width: 100%;
  height: clamp(420px, 70vh, 820px);
  background-size: cover;
  background-position: center;
  background-color: var(--kw-ink);
  overflow: hidden;
}
.k-cinema-band__body {
  position: absolute;
  bottom: clamp(28px, 5vw, 72px);
  left: clamp(20px, 4vw, 72px);
  right: clamp(20px, 4vw, 72px);
  color: var(--kw-paper);
  max-width: 880px;
  z-index: 2;
}
.k-cinema-band__eyebrow {
  display: block;
  font-family: var(--kw-mono);
  font-size: 11px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  opacity: 0.82;
  margin-bottom: 18px;
}
.k-cinema-band__head {
  font-family: var(--kw-sans);
  font-weight: 700;
  font-size: clamp(32px, 5vw, 76px);
  line-height: 1.02;
  letter-spacing: -0.032em;
  margin: 0;
  text-wrap: balance;
}
.k-cinema-band__head .k-dot { color: var(--kw-terra); }
.k-cinema-band::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(14,17,22,0) 40%, rgba(14,17,22,0.55) 100%);
  z-index: 1;
}

/* =================================================================
   TYLKO-FEEL LAYER v3.1 — BALANCED CAPSULES + HOVER PREVIEW
   -----------------------------------------------------------------
   Daniel: "balance the capsules and perhaps when you hover it
   shows a reference picture."
     - Both rows center-justified (was: deliberate scatter)
     - Pills given a sensible min-width so they read as a set
     - New preview panel below the pills with cross-fade on hover
   ================================================================= */

/* CENTER the pill rows and drop the offset scatter */
.k-mega-pills__row {
  justify-content: center;
}
.k-mega-pills__row--offset-r,
.k-mega-pills__row--offset-l {
  padding-left: 0 !important;
  padding-right: 0 !important;
}

/* Give pills a minimum width so they hold the row visually rather
   than collapsing to text-length. Caps still wrap naturally. */
.k-mega-pills__pill {
  min-width: clamp(180px, 18vw, 320px);
  text-align: center;
}
@media (max-width: 720px) {
  .k-mega-pills__pill {
    min-width: 0;
    flex: 1 1 calc(50% - 14px);
  }
  .k-mega-pills__pill--ghost {
    flex: 1 1 100%;
  }
}

/* HOVER PREVIEW PANEL — large 16:9 photo below the pills that
   swaps via chrome.js when a pill is hovered/focused. */
.k-mega-pills__preview {
  position: relative;
  width: 100%;
  max-width: 1240px;
  aspect-ratio: 16 / 9;
  margin: clamp(36px, 5vw, 72px) auto 0;
  border-radius: var(--kw-r-card-lg);
  overflow: hidden;
  background: var(--kw-bone-2);
  box-shadow: 0 38px 92px -48px rgba(20, 24, 30, 0.32),
              0 12px 32px -18px rgba(20, 24, 30, 0.14);
}
.k-mega-pills__preview-visual {
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center 40%;
  background-image: url('https://images.unsplash.com/photo-1722606486160-982bc90fafac?w=2400&q=88&auto=format&fit=crop');
  transition: opacity 0.5s var(--kw-ease-tylko),
              transform 1.2s var(--kw-ease-tylko),
              filter 0.5s ease;
  filter: saturate(0.96) brightness(1.0);
}
.k-mega-pills__preview-visual.is-fading {
  opacity: 0.35;
  transform: scale(1.04);
}
/* Subtle gradient veil at the bottom for caption readability */
.k-mega-pills__preview::after {
  content: "";
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(14,17,22,0) 55%, rgba(14,17,22,0.45) 100%);
  z-index: 1;
  pointer-events: none;
}
.k-mega-pills__preview-cap {
  position: absolute;
  bottom: clamp(20px, 3vw, 36px);
  left: clamp(20px, 3vw, 36px);
  z-index: 2;
  display: flex;
  align-items: baseline;
  gap: 18px;
  font-family: var(--kw-mono);
  font-size: 11.5px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--kw-paper);
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 0.4s var(--kw-ease-tylko),
              transform 0.4s var(--kw-ease-tylko);
}
.k-mega-pills__preview-cap.is-visible {
  opacity: 0.94;
  transform: translateY(0);
}
.k-mega-pills__preview-cap-room {
  font-weight: 600;
  letter-spacing: 0.22em;
}
.k-mega-pills__preview-cap-meta {
  opacity: 0.78;
}

/* On touch (no hover), hide the preview — it's a desktop enhancement
   and on mobile the section is already busy. */
@media (hover: none) and (pointer: coarse) {
  .k-mega-pills__preview { display: none; }
}

/* =================================================================
   TYLKO-FEEL LAYER v4 — HERO FILM (2026-05-29)
   -----------------------------------------------------------------
   The cinematic hero video — the "alive" quality tylko gets from
   real moving footage. Sits as the base layer of the hero media,
   above the still photo act (the deep fallback) and below the
   shop-drawing overlay (now hidden), veil, and text.
   ================================================================= */
.k-hero-cinema__video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 42%;
  z-index: 1;
  /* match the still act's warm grade so the fallback transition is
     seamless if the poster shows before play */
  filter: saturate(0.97) brightness(1.0);
}
/* With the film as hero, hide the technical-drawing overlay — the
   film carries the moment cleanly, no annotation competing. */
.k-hero-cinema__media:has(.k-hero-cinema__video) .k-hero-cinema__seq {
  display: none;
}
/* The veil + text sit above the film. */
.k-hero-cinema__veil { z-index: 2; }
.k-hero-cinema__inner { position: relative; z-index: 3; }

/* Reduced motion: drop the film entirely, fall back to the still
   photo act underneath (z-index 0, its own ken-burns already frozen
   by the existing reduced-motion rule). */
@media (prefers-reduced-motion: reduce) {
  .k-hero-cinema__video { display: none; }
}
/* MOBILE: serve a STATIC photo hero, not the film. On phones the
   looping video's baked ken-burns + decode + loop-seam read as a
   shake/judder while scrolling (and burn data). Hiding the <video>
   reveals the frozen still act beneath it (z-index 0, no animation),
   so the mobile hero is a single steady photograph. The film stays
   on desktop where it plays smoothly. */
@media (max-width: 900px) {
  .k-hero-cinema__video { display: none !important; }
}

/* Magnetic elements — promote to their own layer for buttery
   transform chasing (setupMagnetic in chrome.js drives the inline
   transform; the element's transition eases the snap-back). */
.k-mega-pills__pill,
.k-picker-trio__cta { will-change: transform; }

/* =================================================================
   TYLKO-FEEL LAYER v5 — TRUE CAPSULE NAV (2026-05-29)
   -----------------------------------------------------------------
   Daniel: "the navigation should be a capsule." The v2 nav had
   999px corners but stretched to max-width 1320px (≈full width),
   so it read as a rounded BAR. tylko's nav is a compact pill that
   HUGS its content and floats centered with air on both sides.
   This makes the desktop nav hug its content; mobile keeps the
   wider logo-left / toggle-right pill (a tiny hugged capsule there
   would strand the hamburger in dead space).
   ================================================================= */
@media (min-width: 901px) {
  .k-nav {
    width: auto !important;            /* hug content, not the viewport */
    max-width: calc(100% - 48px) !important;
  }
  .k-nav__inner {
    display: flex !important;          /* was grid auto/1fr/auto — the
                                          1fr spacer is what stretched it */
    grid-template-columns: none !important;
    align-items: center;
    gap: clamp(22px, 2.2vw, 40px) !important;
  }
  .k-nav__items {
    gap: clamp(18px, 1.5vw, 28px) !important;
  }
  .k-nav__cta {
    margin-left: 2px;
    position: relative;
  }
  .k-nav__cta::before {
    content: "";
    position: absolute;
    left: calc(-1 * clamp(11px, 1.1vw, 20px));
    top: 50%;
    transform: translateY(-50%);
    width: 1px;
    height: 22px;
    background: rgba(29, 35, 44, 0.14);
  }
}

/* =================================================================
   TYLKO-FEEL LAYER v6 — MOBILE REFINEMENTS (2026-05-29)
   -----------------------------------------------------------------
   Live mobile audit at 375px (preview). Fixes:
   1. Mega pills 2-per-row clipped REACH-INS / MUDROOMS off the right
      edge → full-width stacked, each label gets the whole row.
   2. Mega-pills hover preview was showing on phone (no hover there,
      and the touch media query is unreliable in emulators) → hidden
      on phone widths.
   3. Sticky CTA collided with the concierge launcher in the bottom-
      right corner → stack them (CTA above the launcher).
   4. Big-headline + color-picker had excessive top whitespace on
      phone → tightened.
   ================================================================= */

/* 3 — stack the sticky CTA above the concierge launcher so the two
   fixed bottom-right elements never overlap. Launcher is ~48px tall
   at bottom:32 (desktop) / bottom:16 (mobile); clear it with a gap. */
.k-sticky-cta { bottom: 96px !important; }
@media (max-width: 600px) {
  .k-sticky-cta { bottom: 80px !important; right: 16px !important; }
}

@media (max-width: 720px) {
  /* 1 — full-width stacked pills; REACH-INS / MUDROOMS never clip. */
  .k-mega-pills__pill {
    flex: 1 1 100% !important;
    min-width: 0 !important;
    width: 100%;
    font-size: clamp(26px, 8.4vw, 40px) !important;
    padding: 18px 26px !important;
  }
  /* 2 — hide the hover preview on phone (it can't be hovered). */
  .k-mega-pills__preview { display: none !important; }

  /* 4 — tighten the big-headline + picker whitespace on phone. */
  .k-bigh { padding: 40px 0 22px !important; }
  .k-picker-trio { padding-top: 30px !important; padding-bottom: 56px !important; }
  .k-picker-trio__grid { margin-top: 26px !important; gap: 52px !important; }
}

/* v6 addendum — on phone, constrain the swatch row so 8 dots wrap a
   balanced 4 + 4 instead of a lopsided 7 + 1. */
@media (max-width: 720px) {
  .k-picker-trio__dots { max-width: 184px !important; }
}

/* =================================================================
   NAV v7 — pin the capsule as a real top bar (2026-05-29)
   -----------------------------------------------------------------
   Daniel: "that capsule navigation bar is not useful." Chosen fix:
   keep the rounded look, but make it a proper top bar — full-width,
   SOLID background (not a small translucent pill floating over
   content), anchored at the top, obviously the nav. This undoes the
   v5 content-hugging flex and restores the 3-zone bar layout.
   ================================================================= */

/* Solid, all widths — was translucent rgba(...,0.82) + blur. */
.k-nav {
  background: var(--kw-bone) !important;
  -webkit-backdrop-filter: none !important;
  backdrop-filter: none !important;
  border: 1px solid rgba(29, 35, 44, 0.10) !important;
  box-shadow: 0 6px 22px -14px rgba(20, 24, 30, 0.26) !important;
}
.k-nav.is-scrolled {
  background: var(--kw-bone) !important;
  box-shadow: 0 10px 30px -16px rgba(20, 24, 30, 0.34) !important;
}

/* Desktop: full-width 3-zone bar (logo | links | CTA). Undo the v5
   width:auto + flex hug; the bar now fills the top. */
@media (min-width: 901px) {
  .k-nav {
    width: calc(100% - 28px) !important;
    max-width: 1640px !important;
  }
  .k-nav__inner {
    display: grid !important;
    grid-template-columns: auto 1fr auto !important;
    align-items: center;
    gap: 40px !important;
    padding: 12px 30px !important;
  }
  .k-nav.is-scrolled .k-nav__inner { padding: 10px 30px !important; }
  .k-nav__items {
    justify-content: center !important;
    gap: clamp(20px, 2vw, 34px) !important;
  }
  /* Drop the v5 hairline divider before the CTA — not needed on a
     full bar. */
  .k-nav__cta::before { display: none !important; }
}

/* =================================================================
   PULL-QUOTE v8 — give the "Storage. as architecture." moment life
   -----------------------------------------------------------------
   Daniel: "this needs some life." The section was a static centred
   block. Now, on scroll-in, the two lines wipe up from behind a
   mask (stagger), the hairline rules draw outward from centre, the
   kicker settles, and the burgundy brand-dots pop in — then breathe
   gently forever (life at rest). All hooks off the section's
   existing .kw-rv--in reveal; no new JS. Fully static + visible
   without motion (no html.kw-anim, or reduced-motion).
   ================================================================= */

/* Split lines = vertical wipe masks. Padding gives glyph room
   (caps + the "g" descender in "Storage") so overflow:hidden never
   clips letters at rest; negative margin keeps the layout tight. */
.k-pullq__quote--split .k-pullq__line { display: block; text-align: center; overflow: hidden; }
.k-pullq__quote--split .k-pullq__line-in {
  display: inline-block;
  padding: 0.18em 0.06em;
  margin: -0.18em -0.06em;
}
.k-pullq__dot { display: inline-block; }

/* ---- Animated states — only when motion is allowed (html.kw-anim) ---- */

/* Opt the pull-quote out of the generic whole-section fade; it gets
   this bespoke choreography instead. */
html.kw-anim .k-pullq--a.kw-rv { opacity: 1 !important; transform: none !important; }

/* Lines: start below the mask, wipe up on reveal, second line trails. */
html.kw-anim .k-pullq--a.kw-rv .k-pullq__line-in { transform: translateY(130%); }
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__line-in {
  transform: translateY(0);
  transition: transform 0.95s cubic-bezier(.16, 1, .3, 1);
}
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__line:nth-child(2) .k-pullq__line-in {
  transition-delay: 0.13s;
}

/* Kicker "A POSITION" — fade + settle a beat ahead of the lines. */
html.kw-anim .k-pullq--a.kw-rv .k-pullq__kicker { opacity: 0; transform: translateY(10px); }
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__kicker {
  opacity: 0.5; transform: translateY(0);
  transition: opacity 0.7s ease, transform 0.7s cubic-bezier(.16, 1, .3, 1);
}

/* Hairline rules — draw outward from centre. */
html.kw-anim .k-pullq--a .k-pullq__rule { transform: translateX(-50%) scaleX(0); transform-origin: center; }
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__rule {
  transform: translateX(-50%) scaleX(1);
  transition: transform 0.9s cubic-bezier(.16, 1, .3, 1);
}
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__rule--btm { transition-delay: 0.22s; }

/* Brand dots — pop in just after each line lands, then breathe
   gently forever. Pop and breathe are sequenced via animation-delay
   so they never fight over `transform`. */
html.kw-anim .k-pullq--a.kw-rv .k-pullq__dot { transform: scale(0); }
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__line:nth-child(1) .k-pullq__dot {
  animation: kw-dot-pop 0.55s cubic-bezier(.34, 1.56, .64, 1) 0.72s both,
             kw-dot-breathe 3.4s ease-in-out 1.5s infinite;
}
html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__line:nth-child(2) .k-pullq__dot {
  animation: kw-dot-pop 0.55s cubic-bezier(.34, 1.56, .64, 1) 0.92s both,
             kw-dot-breathe 3.4s ease-in-out 1.7s infinite;
}
@keyframes kw-dot-pop {
  0%   { transform: scale(0); }
  60%  { transform: scale(1.3); }
  100% { transform: scale(1); }
}
@keyframes kw-dot-breathe {
  0%, 100% { transform: scale(1);    opacity: 1; }
  50%      { transform: scale(1.15); opacity: 0.8; }
}

/* Reduced motion — everything static and fully visible. */
@media (prefers-reduced-motion: reduce) {
  .k-pullq__quote--split .k-pullq__line-in { transform: none !important; }
  .k-pullq--a .k-pullq__rule { transform: translateX(-50%) scaleX(1) !important; }
  .k-pullq--a .k-pullq__dot { transform: none !important; animation: none !important; }
  .k-pullq--a .k-pullq__kicker { opacity: 0.5 !important; transform: none !important; }
}

/* v8 mobile safety — on phones the big quote line can wrap; a clip
   mask would chop the wrapped text. Below 600px, drop the mask and
   use a wrap-safe fade-up instead (still lively, never clips). */
@media (max-width: 600px) {
  .k-pullq__quote--split .k-pullq__line { overflow: visible; }
  html.kw-anim .k-pullq--a.kw-rv .k-pullq__line-in { transform: translateY(20px); opacity: 0; }
  html.kw-anim .k-pullq--a.kw-rv--in .k-pullq__line-in {
    transform: translateY(0); opacity: 1;
    transition: transform 0.8s cubic-bezier(.16, 1, .3, 1), opacity 0.8s ease;
  }
}

/* =================================================================
   PAINT PICKER (materials.html #paint) — 2026-05-29
   -----------------------------------------------------------------
   "Any colour you like." A CSS-rendered shaker cabinet door that
   fills live with the chosen colour (set via --paint by chrome.js),
   beside curated designer swatches + a custom any-colour input.
   The door is drawn (not a photo) so it tints cleanly across the
   whole range, white through near-black.
   ================================================================= */
.k-paint {
  background: var(--kw-bone);
  padding: clamp(56px, 8vw, 120px) 0;
}
.k-paint__inner { max-width: 1240px; margin: 0 auto; padding: 0 var(--kw-pad); }
.k-paint__lede {
  max-width: 660px;
  font-size: 18px; line-height: 1.55;
  color: var(--kw-ink); opacity: 0.82;
  margin: 0 0 clamp(40px, 5vw, 64px);
}
.k-paint__stage {
  display: grid;
  grid-template-columns: 0.8fr 1fr;
  gap: clamp(32px, 5vw, 76px);
  align-items: center;
}

/* Live-tinting shaker door */
.k-paint__door {
  position: relative;
  aspect-ratio: 4 / 5;
  border-radius: 18px;
  margin: 0;
  background: var(--paint, #f3ede0);
  box-shadow: 0 44px 96px -46px rgba(20, 24, 30, 0.42),
              inset 0 0 0 1px rgba(0, 0, 0, 0.06);
  overflow: hidden;
  transition: background 0.55s cubic-bezier(.16, 1, .3, 1);
}
.k-paint__panel {
  position: absolute; inset: 10% 12%;
  border-radius: 8px;
  background: var(--paint, #f3ede0);
  box-shadow:
    inset 0 3px 8px rgba(0, 0, 0, 0.24),
    inset 0 -2px 6px rgba(255, 255, 255, 0.16),
    0 1px 0 rgba(255, 255, 255, 0.30);
  transition: background 0.55s cubic-bezier(.16, 1, .3, 1);
}
/* lacquer sheen */
.k-paint__door::after {
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(118deg, rgba(255,255,255,0.18) 0%, rgba(255,255,255,0) 40%);
}
.k-paint__knob {
  position: absolute; top: 50%; right: 15%; transform: translateY(-50%);
  width: 13px; height: 13px; border-radius: 50%; z-index: 2;
  background: radial-gradient(circle at 34% 30%, #e6cd95, #9c7a3e 78%);
  box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}

/* Controls */
.k-paint__readout { margin-bottom: 30px; }
.k-paint__readcap { display: block; opacity: 0.5; margin-bottom: 8px; }
.k-paint__name {
  display: block;
  font-family: var(--kw-sans); font-weight: 600;
  font-size: clamp(26px, 3vw, 38px); letter-spacing: -0.02em;
  color: var(--kw-ink); line-height: 1;
}
.k-paint__metaline {
  display: block; margin-top: 8px;
  font-family: var(--kw-mono); font-size: 11.5px;
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--kw-ink); opacity: 0.6;
}
.k-paint__dot { opacity: 0.5; margin: 0 4px; }
.k-paint__swatches { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 28px; }
.k-paint__sw {
  width: 46px; height: 46px; border-radius: 50%;
  background: var(--sw); padding: 0; cursor: pointer;
  border: 1px solid rgba(29, 35, 44, 0.16);
  transition: transform 0.2s var(--kw-ease-tylko), box-shadow 0.2s ease;
}
.k-paint__sw:hover { transform: scale(1.1); }
.k-paint__sw.is-active {
  box-shadow: 0 0 0 2px var(--kw-bone), 0 0 0 4px var(--kw-ink);
  transform: scale(1.06);
}
.k-paint__sw:focus-visible { outline: 2px solid var(--kw-terra); outline-offset: 3px; }
.k-paint__custom { display: block; margin-bottom: 24px; }
.k-paint__custom > .k-cap { display: block; opacity: 0.5; margin-bottom: 12px; }
.k-paint__custom-row { display: flex; align-items: center; gap: 14px; }
.k-paint__custom input[type="color"] {
  width: 60px; height: 46px; border-radius: 12px; padding: 4px;
  border: 1px solid rgba(29, 35, 44, 0.18); background: var(--kw-paper); cursor: pointer;
}
.k-paint__custom-hint { font-size: 13px; opacity: 0.55; }
.k-paint__note { max-width: 440px; font-size: 13.5px; line-height: 1.5; opacity: 0.6; margin: 0; }
@media (max-width: 820px) {
  .k-paint__stage { grid-template-columns: 1fr; gap: 36px; }
  .k-paint__door { max-width: 320px; }
}

/* v9 (2026-05-31) — Hero: the best still leads on every viewport.
   Film montage + 3-act drawing rotation retired so the oak dressing-room
   photo (Act 1) is the single, static hero on desktop and mobile alike. */
.k-hero-cinema__video { display: none !important; }
.k-hero-cinema__act--2 { display: none !important; }
.k-hero-annot { display: none !important; }
.k-hero-cinema__act--1 { opacity: 1 !important; }

/* v10 (2026-06-01) — Custom booking widget on design.html (replaces the
   Calendly embed). Native date input + radio-pill time slots + contact,
   submitted through the shared data-kw-form pipeline. */
.k-booking { max-width: 720px; margin: 0 auto; display: flex; flex-direction: column; gap: 26px; text-align: left; }
.k-booking__grid { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1.5fr); gap: 24px 30px; align-items: start; }
.k-booking__grid--contact { grid-template-columns: repeat(3, minmax(0,1fr)); }
.k-booking__field { display: flex; flex-direction: column; gap: 9px; border: 0; margin: 0; padding: 0; min-width: 0; }
.k-booking__lab { font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; font-size: 11px; letter-spacing: 0.13em; text-transform: uppercase; opacity: 0.6; }
.k-booking__opt { opacity: 0.6; }
.k-booking__date,
.k-booking input[type="text"],
.k-booking input[type="email"],
.k-booking input[type="tel"] {
  font: inherit; color: var(--kw-ink, #1d232c); background: #fff;
  border: 1px solid var(--kw-rule, rgba(29,35,44,0.18)); border-radius: 12px;
  padding: 13px 15px; width: 100%; -webkit-appearance: none; appearance: none;
  transition: border-color 150ms ease, box-shadow 150ms ease;
}
.k-booking input:focus, .k-booking__date:focus {
  outline: none; border-color: var(--kw-terra, #7a2f3a);
  box-shadow: 0 0 0 3px rgba(122,47,58,0.13);
}
.k-booking__slots { display: flex; flex-wrap: wrap; gap: 10px; }
.k-booking__slot { position: relative; cursor: pointer; }
.k-booking__slot input { position: absolute; inset: 0; opacity: 0; margin: 0; cursor: pointer; }
.k-booking__slot span {
  display: block; padding: 11px 17px; border-radius: 999px; white-space: nowrap;
  border: 1px solid var(--kw-rule, rgba(29,35,44,0.2)); background: #fff;
  font-family: ui-monospace, "SFMono-Regular", Menlo, monospace; font-size: 13px; letter-spacing: 0.03em;
  transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
}
.k-booking__slot:hover span { border-color: var(--kw-terra, #7a2f3a); }
.k-booking__slot input:checked + span { background: var(--kw-terra, #7a2f3a); color: #fff; border-color: var(--kw-terra, #7a2f3a); }
.k-booking__slot input:focus-visible + span { box-shadow: 0 0 0 3px rgba(122,47,58,0.18); }
.k-booking__actions { display: flex; align-items: center; gap: 16px; margin-top: 2px; }
@media (max-width: 720px) {
  .k-booking__grid, .k-booking__grid--contact { grid-template-columns: 1fr; }
}

/* v11 (2026-06-01) — Booking widget: taken/closed slots + status line. */
.k-booking__slot.is-disabled { opacity: 0.38; }
.k-booking__slot.is-disabled span { text-decoration: line-through; cursor: not-allowed; }
.k-booking__status { margin: 0; font-size: 14px; line-height: 1.5; color: var(--kw-ink, #1d232c); opacity: 0.82; }

/* v12 (2026-06-01) — design.html "What it costs": per-room price ranges.
   Hairline-separated tiles (paper on bone); reuses .k-grid--3 (responsive). */
.k-pricing__grid { gap: 1px; background: var(--kw-rule); border: 1px solid var(--kw-rule); margin-top: 6px; }
.k-pricing__tile { background: var(--kw-paper); padding: 24px 22px 20px; display: flex; flex-direction: column; min-height: 190px; }
.k-pricing__type { font-size: 0.7rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--kw-ink); opacity: 0.5; }
.k-pricing__from { font-size: 0.64rem; letter-spacing: 0.12em; text-transform: uppercase; opacity: 0.45; margin-top: 18px; }
.k-pricing__fig { font-family: var(--kw-sans); font-weight: 700; font-size: 1.95rem; line-height: 1; letter-spacing: -0.015em; color: var(--kw-ink); margin: 3px 0 11px; }
.k-pricing__band { font-size: 0.85rem; line-height: 1.45; opacity: 0.68; }
.k-pricing__lead { margin-top: auto; padding-top: 16px; font-size: 0.68rem; letter-spacing: 0.1em; text-transform: uppercase; opacity: 0.55; }
.k-pricing__lead b { color: var(--kw-terra); font-weight: 600; }
.k-pricing__foot { margin-top: 28px; display: flex; gap: 16px 26px; flex-wrap: wrap; align-items: center; }
@media (max-width: 640px) {
  .k-pricing__tile { min-height: 0; padding: 20px 18px; }
  .k-pricing__fig { font-size: 1.7rem; }
}

/* v13 (2026-06-01) — Floating-image hero (home, .kw-fh). Vanilla recreation
   of the reference's drifting collage: clip-reveal + idle-float are pure CSS;
   scroll + pointer parallax live in chrome.js setupFloatHero(). */
.kw-fh { position: relative; display: flex; align-items: center; overflow: hidden; background: var(--kw-bone); padding: 104px 0 72px; min-height: 92vh; min-height: 92svh; }
.kw-fh__stage { position: absolute; inset: 0; z-index: 1; pointer-events: none; }
.kw-fh__img { position: absolute; margin: 0; border-radius: 6px; overflow: hidden; opacity: 0; will-change: transform, clip-path, opacity; box-shadow: 0 34px 66px -30px rgba(29,35,44,0.45), 0 10px 24px -14px rgba(29,35,44,0.30); animation: fhImgIn 1.25s cubic-bezier(.16,.84,.44,1) both; }
.kw-fh__img > img { display: block; width: 100%; height: 100%; object-fit: cover; animation: fhFloat 7.5s ease-in-out infinite; }
@keyframes fhImgIn { from { opacity: 0; clip-path: inset(100% 0 0 0); } to { opacity: 1; clip-path: inset(0 0 0 0); } }
@keyframes fhFloat { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } }
.kw-fh__img--1 { width: 25vw;   aspect-ratio: 1280 / 896;  top: 7%;    left: 2.5%; animation-delay: .15s; }
.kw-fh__img--2 { width: 23vw;   aspect-ratio: 1280 / 1024; bottom: 6%; right: 3.5%; animation-delay: .42s; }
.kw-fh__img--3 { width: 12.5vw; aspect-ratio: 1024 / 1280; top: 19%;   right: 6%;  border-radius: 150px 150px 6px 6px; animation-delay: .30s; }
.kw-fh__img--4 { width: 14vw;   aspect-ratio: 1 / 1;       bottom: 9%; left: 7%;   animation-delay: .54s; }
.kw-fh__img--5 { width: 11.5vw; aspect-ratio: 1 / 1;       top: 9%;    right: 10%; animation-delay: .66s; }
.kw-fh__img--1 > img { animation-duration: 8.5s; }
.kw-fh__img--2 > img { animation-duration: 7.6s; animation-delay: -2s; }
.kw-fh__img--3 > img { animation-duration: 9.4s; animation-delay: -1s; }
.kw-fh__img--4 > img { animation-duration: 6.8s; animation-delay: -3s; }
.kw-fh__img--5 > img { animation-duration: 8.1s; animation-delay: -1.5s; }
.kw-fh__inner { position: relative; z-index: 2; width: 100%; text-align: center; }
.kw-fh__inner::before { content: ""; position: absolute; z-index: -1; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 128%; height: 152%; pointer-events: none; background: radial-gradient(ellipse at center, var(--kw-bone) 32%, rgba(250,247,241,0.72) 52%, rgba(250,247,241,0) 74%); }
.kw-fh__attr, .kw-fh__headline, .kw-fh__subhead, .kw-fh__ctas { opacity: 0; animation: fhTextIn .9s cubic-bezier(.16,.84,.44,1) both; }
@keyframes fhTextIn { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }
.kw-fh__attr { display: block; margin: 0 0 26px; animation-delay: .1s; }
.kw-fh__headline { margin: 0 auto; max-width: 15ch; font-weight: 800; font-size: clamp(2.7rem, 7vw, 6.6rem); line-height: 0.97; letter-spacing: -0.026em; color: var(--kw-ink); animation-delay: .24s; }
.kw-fh__subhead { margin: 22px auto 0; font-size: clamp(0.98rem, 1.4vw, 1.2rem); color: rgba(29,35,44,0.72); animation-delay: .42s; }
.kw-fh__ctas { margin-top: 34px; display: flex; gap: 14px 22px; justify-content: center; align-items: center; flex-wrap: wrap; animation-delay: .56s; }
.kw-fh__ghost { font-weight: 600; color: var(--kw-ink); text-decoration: none; opacity: 0.82; border-bottom: 1px solid var(--kw-rule-strong); padding-bottom: 2px; transition: color .2s ease, opacity .2s ease; }
.kw-fh__ghost:hover { opacity: 1; color: var(--kw-terra); }
.kw-fh__cue { position: absolute; left: 50%; bottom: 22px; transform: translateX(-50%); z-index: 2; opacity: 0.5; }
.kw-fh__cue-arrow { display: inline-block; animation: fhCue 2.2s ease-in-out infinite; }
@keyframes fhCue { 0%, 100% { transform: translateY(0); opacity: .55; } 50% { transform: translateY(4px); opacity: 1; } }
@media (max-width: 1024px) {
  .kw-fh { min-height: 86vh; }
  .kw-fh__img--1 { width: 31vw; } .kw-fh__img--2 { width: 31vw; }
  .kw-fh__img--3 { width: 17vw; } .kw-fh__img--4 { width: 21vw; }
  .kw-fh__img--5 { display: none; }
}
@media (max-width: 640px) {
  .kw-fh { min-height: 84vh; padding: 116px 0 84px; }
  .kw-fh__headline { max-width: 11ch; font-size: clamp(2.5rem, 13vw, 3.7rem); }
  .kw-fh__img--1 { width: 44vw; top: 5%; left: -6%; }
  .kw-fh__img--2 { width: 46vw; bottom: 4%; right: -7%; }
  .kw-fh__img--3, .kw-fh__img--4, .kw-fh__img--5 { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .kw-fh__img, .kw-fh__img > img, .kw-fh__attr, .kw-fh__headline, .kw-fh__subhead, .kw-fh__ctas, .kw-fh__cue-arrow { animation: none !important; opacity: 1 !important; }
  .kw-fh__img { clip-path: none; }
}

/* v14 (2026-06-01) — Home "Browse by room": image cards replace the
   text-only mega-pills. Each category shows the actual room + a bold label. */
.k-roomnav { background: var(--kw-bone); padding: clamp(56px, 8vw, 112px) 0; }
.k-roomnav__inner { width: min(1180px, 92vw); margin: 0 auto; }
.k-roomnav__head { margin-bottom: clamp(22px, 3vw, 40px); }
.k-roomnav__title { margin: 8px 0 0; font-weight: 800; font-size: clamp(2rem, 4.2vw, 3.4rem); line-height: 1; letter-spacing: -0.02em; color: var(--kw-ink); }
.k-roomnav__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 1.6vw, 22px); }
.k-roomnav__card { position: relative; display: flex; align-items: flex-end; aspect-ratio: 7 / 5; border-radius: 16px; overflow: hidden; text-decoration: none; box-shadow: 0 18px 40px -26px rgba(29,35,44,0.5); }
.k-roomnav__img { position: absolute; inset: 0; background-size: cover; background-position: center; transition: transform .7s cubic-bezier(.16,.84,.44,1); }
.k-roomnav__card:hover .k-roomnav__img { transform: scale(1.06); }
.k-roomnav__card::after { content: ""; position: absolute; inset: 0; background: linear-gradient(to top, rgba(20,24,30,0.76) 0%, rgba(20,24,30,0.12) 48%, rgba(20,24,30,0) 78%); }
.k-roomnav__label { position: relative; z-index: 1; margin: 0; padding: 22px 24px; font-weight: 800; font-size: clamp(1.2rem, 2vw, 1.85rem); letter-spacing: 0.005em; text-transform: uppercase; color: #fff; }
.k-roomnav__card--all { background: var(--kw-bone); border: 1px solid var(--kw-rule-strong); align-items: center; justify-content: center; box-shadow: none; transition: background .25s ease, border-color .25s ease; }
.k-roomnav__card--all::after { display: none; }
.k-roomnav__card--all .k-roomnav__label { color: var(--kw-ink); padding: 0; transition: color .25s ease; }
.k-roomnav__card--all:hover { background: var(--kw-ink); border-color: var(--kw-ink); }
.k-roomnav__card--all:hover .k-roomnav__label { color: #fff; }
@media (max-width: 900px) { .k-roomnav__grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 520px) { .k-roomnav__grid { grid-template-columns: 1fr; } .k-roomnav__card { aspect-ratio: 16 / 9; } }

/* v15 (2026-06-01) — "In the details": reference-style arch + pill + joint
   cluster (overlapping masked images) beside a short craft note. */
.k-craft { background: var(--kw-bone); padding: clamp(64px, 9vw, 128px) 0; overflow: hidden; }
.k-craft__inner { width: min(1160px, 92vw); margin: 0 auto; display: grid; grid-template-columns: 1fr 1.18fr; gap: clamp(28px, 5vw, 72px); align-items: center; }
.k-craft figure { margin: 0; }
.k-craft__title { margin: 12px 0 16px; font-weight: 800; font-size: clamp(1.9rem, 3.6vw, 3rem); line-height: 1.03; letter-spacing: -0.02em; color: var(--kw-ink); }
.k-craft__text { margin: 0 0 24px; max-width: 46ch; font-size: clamp(1rem, 1.25vw, 1.12rem); line-height: 1.62; color: rgba(29,35,44,0.74); }
.k-craft__link { font-weight: 700; color: var(--kw-terra); text-decoration: none; letter-spacing: 0.01em; }
.k-craft__link:hover { color: var(--kw-terra-deep); }
.k-craft__cluster { position: relative; padding: 16px 0 24px; }
.k-craft__arch { width: 76%; margin-left: auto; aspect-ratio: 4 / 5; border-radius: 50% 50% 20px 20px / 40% 40% 4% 4%; overflow: hidden; box-shadow: 0 38px 72px -34px rgba(29,35,44,0.5); }
.k-craft__arch img, .k-craft__pill img, .k-craft__rect img { width: 100%; height: 100%; object-fit: cover; display: block; }
.k-craft__pill { position: absolute; top: 1%; left: 0; width: 25%; aspect-ratio: 5 / 8; border-radius: 999px; overflow: hidden; border: 7px solid var(--kw-bone); box-shadow: 0 22px 42px -24px rgba(29,35,44,0.5); }
.k-craft__rect { position: absolute; bottom: 3%; left: 4%; width: 45%; aspect-ratio: 7 / 5; border-radius: 22px; overflow: hidden; border: 7px solid var(--kw-bone); box-shadow: 0 26px 50px -26px rgba(29,35,44,0.55); }
@media (max-width: 860px) {
  .k-craft__inner { grid-template-columns: 1fr; gap: 14px; }
  .k-craft__cluster { width: min(460px, 94%); margin: 10px auto 0; }
}

/* v16 step-inside block removed 2026-06-12 — superseded by the v21
   clip-path rebuild below; the stacked override chain was fragile. */


/* v17 (2026-06-02) — NAV REDESIGN: retire the floating rounded capsule for a
   clean, flush, full-width top bar (solid bone + a single hairline rule).
   Final override — wins over the earlier v5/v7 capsule blocks wholesale. */
.k-nav {
  position: fixed !important;
  top: 0 !important; left: 0 !important; right: 0 !important;
  transform: none !important;
  width: 100% !important;
  max-width: none !important;
  margin: 0 !important;
  border: 0 !important;
  border-bottom: 1px solid rgba(29, 35, 44, 0.10) !important;
  border-radius: 0 !important;
  background: var(--kw-bone) !important;
  -webkit-backdrop-filter: none !important;
  backdrop-filter: none !important;
  box-shadow: none !important;
  z-index: 100 !important;
  transition: padding 0.25s ease, box-shadow 0.25s ease !important;
}
.k-nav.is-scrolled {
  background: var(--kw-bone) !important;
  box-shadow: 0 14px 28px -26px rgba(20, 24, 30, 0.34) !important;
}
.k-nav__inner {
  max-width: var(--kw-max) !important;
  margin: 0 auto !important;
  padding: 17px var(--kw-pad) !important;
  gap: 40px !important;
}
.k-nav.is-scrolled .k-nav__inner { padding: 12px var(--kw-pad) !important; }
@media (min-width: 901px) {
  .k-nav { width: 100% !important; max-width: none !important; }
  .k-nav__inner { display: grid !important; grid-template-columns: auto 1fr auto !important; align-items: center; }
}
.k-nav__cta {
  border-radius: var(--kw-r-pill) !important;
  background: var(--kw-ink) !important;
  color: var(--kw-paper) !important;
  border: 1px solid var(--kw-ink) !important;
  padding: 11px 22px !important;
}
.k-nav__cta:hover { background: var(--kw-terra) !important; border-color: var(--kw-terra) !important; color: #fff !important; transform: none !important; box-shadow: none !important; }
.k-nav__cta::before { display: none !important; }
body { padding-top: 64px !important; }
@media (max-width: 900px) {
  body { padding-top: 58px !important; }
  .k-nav__inner { padding: 13px var(--kw-pad) !important; gap: 18px !important; }
}

/* v18 (2026-06-02) — WORLD-CLASS HERO. One full-bleed cinematic image (NYC
   dressing room at dusk) edge-to-edge behind a transparent nav; slow Ken
   Burns + scroll parallax (chrome.js setupHero); legibility scrim; bottom-
   left editorial type with a line-mask reveal. Replaces the floating collage. */
.kw-hero { position: relative; margin-top: -64px; height: 100svh; min-height: 600px; overflow: hidden; background: #14181c; isolation: isolate; }
.kw-hero__media { position: absolute; inset: -7% -2%; z-index: 0; will-change: transform; }
.kw-hero__img { position: absolute; inset: 0; background-size: cover; background-position: center 44%; transform: scale(1.04); animation: kwKenburns 30s ease-in-out infinite alternate; will-change: transform; }
@keyframes kwKenburns { from { transform: scale(1.04) translate3d(0,0,0); } to { transform: scale(1.14) translate3d(-1.4%,-1.4%,0); } }
.kw-hero__scrim { position: absolute; inset: 0; z-index: 1; pointer-events: none; background:
  linear-gradient(to top, rgba(11,14,17,0.82) 0%, rgba(11,14,17,0.34) 28%, rgba(11,14,17,0.03) 52%, rgba(11,14,17,0) 66%),
  linear-gradient(100deg, rgba(11,14,17,0.50) 0%, rgba(11,14,17,0.10) 40%, rgba(11,14,17,0) 62%),
  linear-gradient(to bottom, rgba(11,14,17,0.32) 0%, rgba(11,14,17,0) 22%); }
.kw-hero__inner { position: absolute; left: 50%; transform: translateX(-50%); bottom: 0; z-index: 2; width: min(1320px, 100%); padding: 0 var(--kw-pad) clamp(44px, 9vh, 96px); }
.kw-hero__eyebrow { margin: 0 0 22px; font-family: var(--kw-mono); font-size: 12px; letter-spacing: 0.24em; text-transform: uppercase; color: rgba(255,255,255,0.82); opacity: 0; animation: kwFadeUp 0.9s ease both; animation-delay: 0.3s; }
.kw-hero__eyebrow span { opacity: 0.45; margin: 0 8px; }
.kw-hero__headline { margin: 0; font-weight: 800; font-size: clamp(2.7rem, 6.7vw, 6.6rem); line-height: 0.95; letter-spacing: -0.03em; color: #fff; }
.kw-hero__line { display: block; overflow: hidden; padding-bottom: 0.05em; }
.kw-hero__line > span { display: block; animation: kwLineIn 1.1s cubic-bezier(.16,.84,.44,1) both; }
.kw-hero__line:nth-child(1) > span { animation-delay: 0.45s; }
.kw-hero__line:nth-child(2) > span { animation-delay: 0.57s; }
@keyframes kwLineIn { from { transform: translateY(110%); } to { transform: translateY(0); } }
.kw-hero__headline .k-dot { color: var(--kw-terra); }
.kw-hero__sub { margin: 26px 0 0; max-width: 42ch; font-size: clamp(1.02rem, 1.35vw, 1.22rem); line-height: 1.5; color: rgba(255,255,255,0.88); opacity: 0; animation: kwFadeUp 0.9s cubic-bezier(.16,.84,.44,1) both; animation-delay: 0.85s; }
.kw-hero__ctas { margin-top: 34px; display: flex; gap: 16px 26px; align-items: center; flex-wrap: wrap; opacity: 0; animation: kwFadeUp 0.9s cubic-bezier(.16,.84,.44,1) both; animation-delay: 0.98s; }
@keyframes kwFadeUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: none; } }
.kw-hero__ctas .k-btn--fill { background: #fff !important; color: var(--kw-ink) !important; border-color: #fff !important; }
.kw-hero__ctas .k-btn--fill:hover { background: var(--kw-terra) !important; color: #fff !important; border-color: var(--kw-terra) !important; }
.kw-hero__ghost { font-weight: 600; color: #fff; text-decoration: none; opacity: 0.9; border-bottom: 1px solid rgba(255,255,255,0.42); padding-bottom: 3px; transition: opacity .2s, border-color .2s; }
.kw-hero__ghost:hover { opacity: 1; border-color: #fff; }
.kw-hero__cue { position: absolute; left: 50%; transform: translateX(-50%); bottom: 26px; z-index: 2; display: flex; flex-direction: column; align-items: center; gap: 9px; color: rgba(255,255,255,0.66); opacity: 0; animation: kwFadeUp 1s ease both; animation-delay: 1.4s; }
.kw-hero__cue .k-cap { font-size: 10.5px; letter-spacing: 0.22em; }
.kw-hero__cue-line { width: 1px; height: 42px; background: rgba(255,255,255,0.5); transform-origin: top; animation: kwCueLine 2.4s ease-in-out infinite; }
@keyframes kwCueLine { 0%, 100% { transform: scaleY(0.5); opacity: .4; } 50% { transform: scaleY(1); opacity: 1; } }
/* Home only: nav rides transparent (white) over the hero; solid on scroll. */
body[data-page="home"] .k-nav:not(.is-scrolled) { background: transparent !important; border-bottom-color: transparent !important; }
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__wordmark,
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__wordmark .k-x,
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__wordmark .k-dot,
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__item { color: #fff !important; }
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__item { opacity: 0.82; }
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__cta { background: rgba(255,255,255,0.12) !important; border-color: rgba(255,255,255,0.5) !important; color: #fff !important; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__cta:hover { background: rgba(255,255,255,0.2) !important; border-color: #fff !important; }
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__bars,
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__bars::before,
body[data-page="home"] .k-nav:not(.is-scrolled) .k-nav__bars::after { background: #fff !important; }
@media (max-width: 900px) { .kw-hero { margin-top: -58px; } .kw-hero__sub { max-width: 32ch; } }
@media (prefers-reduced-motion: reduce) {
  .kw-hero__img { animation: none; transform: scale(1.06); }
  .kw-hero__cue-line { animation: none; }
  .kw-hero__line > span, .kw-hero__eyebrow, .kw-hero__sub, .kw-hero__ctas, .kw-hero__cue { animation: none; opacity: 1; transform: none; }
}

/* ==========================================================================
   v19 — PROMISE BAND, DARKENED (2026-06-02).
   The guarantee was the page's quietest LIGHT beat. Ultra-lux wants it
   "larger, quieter, darker." Recast as a full-bleed dark cinematic moment
   that echoes the hero and gives the closing third a second dark "breath"
   to balance the k-signed plate higher up. Deep ink field, a faint terra
   glow behind the line, hairline terra rules top + bottom, oversized quiet
   bone type. Text-only (no photo) so it stays distinct from the photo-heavy
   sections around it and reads like a watchmaker's warranty plate.
   ========================================================================== */
.k-promise {
  position: relative;
  isolation: isolate;
  background: radial-gradient(125% 145% at 50% 0%, #222932 0%, #161b22 48%, #0f1319 100%);
  border-top: 1px solid rgba(122, 47, 58, 0.55);
  border-bottom: 1px solid rgba(122, 47, 58, 0.55);
  padding: clamp(120px, 20vh, 248px) 0;
  overflow: hidden;
}
.k-promise::before {                 /* faint terra glow centered behind the line */
  content: "";
  position: absolute;
  left: 50%; top: 48%;
  width: min(960px, 92%); height: 78%;
  transform: translate(-50%, -50%);
  background: radial-gradient(ellipse at center, rgba(150, 60, 72, 0.30) 0%, rgba(122, 47, 58, 0) 68%);
  z-index: -1;
  pointer-events: none;
}
.k-promise__inner { gap: 38px; }     /* base supplies centered flex column */
.k-promise__eye {
  color: #e2b1b7 !important;         /* light terra — burgundy is invisible on ink */
  opacity: 1;
  letter-spacing: 0.42em;
}
.k-promise__line {
  color: var(--kw-bone);
  letter-spacing: -0.018em;
}
.k-promise__line .k-dot { color: #cf8e96; }   /* lifted terra so the stops glow */
.k-promise__foot {
  color: var(--kw-bone);
  opacity: 0.5;
  letter-spacing: 0.28em;
}
@media (max-width: 760px) {
  .k-promise { padding: clamp(88px, 16vh, 168px) 0; }
}

/* ==========================================================================
   v20 — MOBILE FIXES (2026-06-02). Two live-mobile bugs reported:
   (1) Nav "does weird things": the fixed bar is ~71px tall on mobile (44px
       tap target on the toggle) but body only reserved 58px, so section tops
       slid under it; and the transparent→solid flip at 24px was an abrupt,
       flicker-prone hard cut. Fix: reserve the bar's true height (and match
       the hero's negative margin to it), and FADE the bg/colour transitions.
       The scroll threshold + hysteresis live in chrome.js setupNavScroll().
   (2) "Step inside" wrong proportion on mobile: the 102vmax square is ~828px
       on a 375px phone (vmax = the height axis in portrait), cropping the
       photo to a sliver. Fix: on mobile, drop the scroll-scrub and render a
       clean static full-bleed cover band — the same shape the reduced-motion
       path already uses. (setupStepIn() bails on mobile to match.)
   ========================================================================== */

/* (1a) Fade the nav state change instead of snapping it. */
.k-nav {
  transition: background-color .35s ease, border-color .35s ease,
              box-shadow .3s ease, padding .25s ease !important;
}
.k-nav__wordmark, .k-nav__wordmark .k-x, .k-nav__wordmark .k-dot,
.k-nav__item, .k-nav__cta {
  transition: color .35s ease, background-color .35s ease, border-color .35s ease !important;
}
.k-nav__bars, .k-nav__bars::before, .k-nav__bars::after {
  transition: background-color .35s ease, transform .25s ease !important;
}

/* (1b) Reserve the bar's real height so nothing hides under it. */
body { padding-top: 68px !important; }            /* desktop nav ≈ 67px */
.kw-hero { margin-top: -68px; }
@media (max-width: 900px) {
  body { padding-top: 72px !important; }           /* mobile nav ≈ 71px (44px tap target) */
  .kw-hero { margin-top: -72px; }
}

/* (2) "Step inside" reveal — rebuilt with clip-path in v21 below so the
   scroll aperture works on mobile too; the static-band stopgap is removed. */

/* ==========================================================================
   v21 — "STEP INSIDE" reveal rebuilt with clip-path (2026-06-02).
   The old effect scaled a 102vmax SQUARE behind a border-radius circle — on a
   portrait phone (vmax = the height axis) that ballooned to ~828px wide and
   cropped the photo to a sliver, so the reveal didn't "work" on mobile. New
   approach: the image fills the viewport (cover → always proper proportion)
   and a clip-path circle widens from a peek to full-bleed as you scroll. Same
   code path on every aspect ratio. chrome.js setupStepIn() drives the radius
   and no longer bails on mobile.
   ========================================================================== */
.k-stepin { position: relative; height: 170vh; background: var(--kw-bone); }
/* dvh (not svh) so the pinned cover image always fills the *current*
   viewport — svh stays locked to the small (address-bar-visible) height,
   which leaves a blank band under the image once iOS hides the bar. dvh
   also matches the window.innerHeight that setupStepIn() reads. */
.k-stepin__sticky { position: sticky; top: 0; height: 100vh; height: 100dvh; overflow: hidden; }
.k-stepin__img {
  position: absolute;
  left: 0; top: 0; width: 100%; height: 100%; margin: 0;
  background-size: cover;
  background-position: center;
  transform: none;
  border-radius: 0;
  clip-path: circle(34% at 50% 50%);
  will-change: clip-path;
}
.k-stepin__title {
  position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
  z-index: 2; margin: 0; color: #fff; font-weight: 800;
  font-size: clamp(2.6rem, 8vw, 7rem); line-height: 1; letter-spacing: -0.025em;
  opacity: 0; text-shadow: 0 2px 50px rgba(0,0,0,0.42); pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  /* No scrub — reveal the whole room as a static full-bleed band. */
  .k-stepin { height: auto; }
  .k-stepin__sticky { position: relative; height: 70svh; min-height: 420px; }
  .k-stepin__img { clip-path: none; }
  .k-stepin__title { opacity: 1; }
}

/* ==========================================================================
   v22 — PER-FAMILY MATERIAL SELECTOR (2026-06-02). "Select any wood" — a
   live preview + a horizontally-scrollable rail of every choice in the
   family (timber/veneer/finish/stone/metal/leather/glass). Injected by
   materials.js from the shared catalog; hidden until .is-live so no-JS
   visitors keep the static library grid.
   ========================================================================== */
.k-matsel { margin-top: clamp(36px, 5vw, 64px); }
.k-matsel:not(.is-live) { display: none; }

.k-matsel__stage {
  display: grid;
  grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr);
  gap: clamp(24px, 4vw, 56px);
  align-items: center;
}
.k-matsel__preview {
  position: relative;
  aspect-ratio: 4 / 3;
  border-radius: var(--kw-r-card, 14px);
  overflow: hidden;
  box-shadow: 0 30px 60px -42px rgba(20, 24, 30, 0.5), inset 0 0 0 1px rgba(29, 35, 44, 0.08);
}
.k-matsel__preview-fill { position: absolute; inset: 0; transition: background 0.45s ease; }
.k-matsel__preview::after {            /* polished-sample sheen */
  content: ""; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(120% 80% at 28% 16%, rgba(255, 255, 255, 0.22), rgba(255, 255, 255, 0) 55%);
}
.k-matsel__eyebrow { display: block; margin-bottom: 14px; letter-spacing: 0.28em; }
.k-matsel__name {
  font-weight: 700; font-size: clamp(22px, 3vw, 33px); line-height: 1.06;
  letter-spacing: -0.02em; margin: 0 0 14px; color: var(--kw-ink);
}
.k-matsel__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 9px 14px; margin-bottom: 16px; }
.k-matsel__tier {
  font-family: var(--kw-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--kw-terra); border: 1px solid rgba(122, 47, 58, 0.4); border-radius: 999px; padding: 4px 11px;
}
.k-matsel__origin { font-size: 13px; color: var(--kw-ink); opacity: 0.6; }
.k-matsel__note { font-size: 15px; line-height: 1.55; color: var(--kw-ink); opacity: 0.78; max-width: 46ch; margin: 0 0 18px; }
.k-matsel__cta {
  font-family: var(--kw-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--kw-terra); border-bottom: 1px solid rgba(122, 47, 58, 0.34); padding-bottom: 3px;
  transition: border-color .2s, opacity .2s;
}
.k-matsel__cta:hover { border-bottom-color: var(--kw-terra); }
.k-matsel__cta span { margin-left: 4px; }

.k-matsel__rail {
  display: flex; gap: 14px; margin-top: clamp(24px, 3.5vw, 40px);
  padding: 6px 2px 16px; overflow-x: auto; scroll-snap-type: x proximity;
  -webkit-overflow-scrolling: touch; scrollbar-width: thin; scrollbar-color: var(--kw-rule-strong) transparent;
}
.k-matsel__rail::-webkit-scrollbar { height: 6px; }
.k-matsel__rail::-webkit-scrollbar-thumb { background: var(--kw-rule-strong); border-radius: 999px; }
.k-matsel__swatch {
  flex: 0 0 auto; width: 96px; background: none; border: 0; padding: 0; cursor: pointer;
  display: flex; flex-direction: column; gap: 9px; scroll-snap-align: start; text-align: left;
}
.k-matsel__chip {
  display: block; width: 96px; height: 72px; border-radius: 10px;
  box-shadow: inset 0 0 0 1px rgba(29, 35, 44, 0.10);
  transition: box-shadow .2s ease, transform .2s ease;
}
.k-matsel__swatch-name { font-size: 11.5px; line-height: 1.25; color: var(--kw-ink); opacity: 0.6; transition: opacity .2s, font-weight .2s; }
.k-matsel__swatch:hover .k-matsel__chip { transform: translateY(-3px); }
.k-matsel__swatch.is-sel .k-matsel__chip {
  box-shadow: inset 0 0 0 1px rgba(29, 35, 44, 0.10), 0 0 0 2px var(--kw-bone), 0 0 0 4px var(--kw-terra);
}
.k-matsel__swatch.is-sel .k-matsel__swatch-name { opacity: 1; font-weight: 600; }
.k-matsel__swatch:focus-visible .k-matsel__chip { outline: 2px solid var(--kw-terra); outline-offset: 3px; }

@media (max-width: 760px) {
  .k-matsel__stage { grid-template-columns: 1fr; gap: 20px; }
  .k-matsel__preview { aspect-ratio: 16 / 10; }
  .k-matsel__rail { gap: 12px; }
  .k-matsel__swatch, .k-matsel__chip { width: 84px; }
  .k-matsel__chip { height: 62px; }
}

/* ==========================================================================
   v23 — TECHNOLOGY & AI section (materials.html). A capability grid: the
   systems wired into the cabinetry. Editorial spec-sheet cards, terra index.
   ========================================================================== */
.k-tech {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(20px, 2.4vw, 34px);
  margin-top: clamp(40px, 5vw, 68px);
}
.k-tech__card { border-top: 2px solid var(--kw-terra); padding: 22px 2px 0; }
.k-tech__num { display: block; margin-bottom: 14px; letter-spacing: 0.2em; }
.k-tech__title {
  font-weight: 700; font-size: clamp(18px, 1.5vw, 22px); line-height: 1.18;
  letter-spacing: -0.015em; margin: 0 0 12px; color: var(--kw-ink);
}
.k-tech__body { font-size: 15px; line-height: 1.58; color: var(--kw-ink); opacity: 0.76; margin: 0; }
.k-tech-sec__foot {
  display: flex; flex-wrap: wrap; align-items: center; gap: 16px 28px;
  margin-top: clamp(38px, 4.5vw, 60px); padding-top: 28px; border-top: 1px solid var(--kw-rule);
}
.k-tech-sec__cta {
  font-family: var(--kw-mono); font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--kw-ink); border-bottom: 1px solid var(--kw-terra); padding-bottom: 4px; transition: color .2s;
}
.k-tech-sec__cta:hover { color: var(--kw-terra); }
.k-tech-sec__cta span { margin-left: 5px; }
@media (max-width: 900px) { .k-tech { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 600px) {
  .k-tech { grid-template-columns: 1fr; gap: 0; }
  .k-tech__card { border-top: 0; border-bottom: 1px solid var(--kw-rule); padding: 22px 0; }
  .k-tech__card:first-child { border-top: 2px solid var(--kw-terra); }
}

/* === v24 (2026-06-09) — mobile drawer legibility =========================
   Two regressions from the floating-capsule bar, reported as "nav links not
   clear to see" on phones:
   1. transform + backdrop-filter on .k-nav make the bar the CONTAINING BLOCK
      for the position:fixed drawer, so the full-screen panel collapsed to the
      bar's own box (~150px) — most links hidden behind an invisible scroll.
   2. the homepage over-hero state forces .k-nav__item to #fff !important,
      which bled into the open drawer: white links on the bone panel.
   While the opaque drawer is open the capsule's blur and centering are
   invisible anyway, so neutralize them; and force ink links in the drawer. */
@media (max-width: 900px) {
  .k-nav.is-open {
    transform: none !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
    top: 0 !important;
    left: 0 !important;
    width: 100% !important;
    max-width: none !important;
    border-radius: 0 !important;
  }
  .k-nav__panel { justify-content: flex-start; }
  /* inset:0 alone leaves the drawer at its padding height inside the grid
     bar — pin the open drawer to the real viewport explicitly. */
  .k-nav.is-open .k-nav__panel {
    height: 100vh;
    height: 100dvh;
  }
  .k-nav.is-open .k-nav__item,
  body[data-page="home"] .k-nav:not(.is-scrolled).is-open .k-nav__item {
    color: var(--kw-ink) !important;
    opacity: 1;
  }
  .k-nav.is-open .k-nav__item.is-active,
  body[data-page="home"] .k-nav:not(.is-scrolled).is-open .k-nav__item.is-active {
    color: var(--kw-terra) !important;
  }
  body[data-page="home"] .k-nav:not(.is-scrolled).is-open .k-nav__cta {
    background: var(--kw-ink) !important;
    border-color: var(--kw-ink) !important;
    color: var(--kw-bone) !important;
    -webkit-backdrop-filter: none;
    backdrop-filter: none;
  }
  /* wordmark + the close ✕ also inherit the over-hero white — force ink
     while the bone drawer is open. */
  .k-nav.is-open .k-nav__wordmark,
  body[data-page="home"] .k-nav:not(.is-scrolled).is-open .k-nav__wordmark {
    color: var(--kw-ink) !important;
  }
  .k-nav.is-open .k-nav__bars,
  .k-nav.is-open .k-nav__bars::before,
  .k-nav.is-open .k-nav__bars::after,
  body[data-page="home"] .k-nav:not(.is-scrolled).is-open .k-nav__bars::before,
  body[data-page="home"] .k-nav:not(.is-scrolled).is-open .k-nav__bars::after {
    background-color: var(--kw-ink) !important;
  }
  .k-nav.is-open .k-nav__bars { background-color: transparent !important; }
}

/* === v25 (2026-06-12) — mobile bug fixes ==================================
   1. "By appointment." clipped mid-word on phones: the visit-close display
      title clamps with a 64px FLOOR — at 390px the word needs ~420px and
      shears off-screen (and hands iOS a horizontal rubber-band). Re-clamp
      with a phone-sized floor.
   2. The sticky CTA renders as a ~237px floating bar stacked directly above
      the chat launcher in the same corner — a two-story tower that sits on
      headings as they scroll under. Compact it and move it bottom-left so
      the two floating actions split the corners. */
@media (max-width: 700px) {
  .k-visit-close__title {
    font-size: clamp(34px, 10.5vw, 64px);
    overflow-wrap: break-word;
  }
  .k-sticky-cta {
    left: 16px !important;
    right: auto !important;
    bottom: 16px !important;
    padding: 11px 16px;
    gap: 8px;
    font-size: 9.5px;
    letter-spacing: 0.16em;
  }
}

/* ──────────────────────────────────────────────────────────────────────
   Mobile nav layout — authoritative (2026-06-14)
   The historical .k-nav__inner overrides left a fragile grid on phones
   (computed grid-template-columns resolved to content widths, brand pushed
   in from the left edge). iOS Safari resolved that grid differently from
   Chromium and shifted the entire row ~50% left over the homepage hero,
   clipping the wordmark off-screen. Replace it with a simple, deterministic
   flex row — brand at the left, menu button at the right — defined last so
   it wins the cascade on every engine. The drawer panel is position:fixed
   on phones, so it is out of flex flow and never affects this row.
   ────────────────────────────────────────────────────────────────────── */
@media (max-width: 900px) {
  .k-nav__inner {
    display: flex !important;
    grid-template-columns: none !important;
    flex-direction: row !important;
    flex-wrap: nowrap !important;
    align-items: center !important;
    justify-content: space-between !important;
    gap: 16px !important;
    width: 100% !important;
    max-width: none !important;
    margin: 0 !important;
    /* var(--kw-pad) is the 84px editorial desktop gutter — on a 390px phone
       that leaves only ~222px for the wordmark + menu button, an exact fit
       that tips into overflow on iOS (which then shifts the row off-screen).
       Use a small fixed gutter so there is always ample room. */
    padding: 12px 20px !important;
  }
  .k-nav.is-scrolled .k-nav__inner { padding: 10px 20px !important; }
  .k-nav__brand { margin: 0 !important; min-width: 0; }
  .k-nav__toggle { margin: 0 !important; flex: 0 0 auto; }
}

/* ──────────────────────────────────────────────────────────────────────
   Mobile polish pass (2026-06-14) — consolidated fixes from a multi-device
   audit. Appended last so these win the cascade.
   ────────────────────────────────────────────────────────────────────── */

/* 1 · Landscape phones: the full-screen nav drawer centred its items under
   104px of top padding, so on a ~390px-tall landscape viewport the lower
   links (Trade, Visit) and the CTA fell below the fold with no way to reach
   them (centred flex overflow isn't scrollable to the top). Top-align,
   compress the rows, and let it scroll. */
@media (max-width: 900px) and (max-height: 540px) {
  .k-nav.is-open .k-nav__panel {
    justify-content: flex-start !important;
    padding-top: 56px !important;
    padding-bottom: 16px !important;
    gap: 0 !important;
  }
  .k-nav__item { padding: 9px 0 !important; font-size: 15px !important; }
  .k-nav__cta { margin-top: 10px !important; }
}

/* 2 · The floating "Speak with a designer" CTA must fully clear the footer
   (it was still painting over footer links). Force the hide-at-foot state to
   win regardless of any later .k-sticky-cta rule. */
.k-sticky-cta--hide-at-foot {
  opacity: 0 !important;
  visibility: hidden !important;
  pointer-events: none !important;
}

/* 3 · Touch targets — bring the chat concierge chips and reply-action
   buttons up to the 44px minimum. */
.k-cc-chip,
.k-cc-act {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
}

/* 4 · Spec-list keys read at 9px / 0.55 opacity on phones — under the legible
   floor and below WCAG AA contrast. Lift size and opacity. */
@media (max-width: 768px) {
  .k-spec-list__key { font-size: 11px !important; opacity: 0.8 !important; }
}

/* 5 · Faint decorative eyebrows (section numbers) sat at 0.4 opacity — wash
   out to ~2.4:1. Nudge up so they clear AA for incidental text. */
.k-eyebrow__num { opacity: 0.62; }
