/* ==========================================================================
   SPARSKEY DESIGN SYSTEM — v2
   Ported verbatim from prototype/tokens.css (the approved design system).
   See docs/VISUAL-SYSTEM.md §10 for the component inventory, §11 for the
   layer order: tokens -> reset -> base type -> layout -> components ->
   page overrides -> responsive. This file is layers 1-6; page overrides and
   the site-chrome integration live in site.css and load after it.

   Scoped under .sk — put the class on <body>. Nothing here leaks out of it.

   Deltas against the prototype file, and only these:
     - .sk-hero--full no longer reads --hero-h; that variable was injected by
       the prototype harness, which rewrote vh units per preview frame. The
       measured comp height is the value in production.
   Kept on purpose:
     - .sk-assume, the visible assumption marker. It stays until the OPEN
       items close, so unconfirmed copy is visible rather than silently true.
     - container-type on .sk, which every @container query below depends on.
   ========================================================================== */

.sk {
  /* ---------- GROUND ---------- */
  --ink:            #101820;   /* dark ground: hero, process band, footer */
  --ink-soft:       #16202A;   /* raised surface on dark */
  --canvas:         #F3EFE8;   /* warm gallery canvas — default light ground */
  --paper:          #F7F4EE;   /* light half of a split band, slightly lifted */
  --canvas-sink:    #EAE5DC;   /* CTA bands, filter rails, image wells */

  /* ---------- TEXT ---------- */
  --text:           #15191E;   /* 15.4:1 on canvas */
  --muted:          #6B6D6A;   /*  4.6:1 on canvas — passes, but only just */
  --on-dark:        #EDE9E2;   /* 14.8:1 on ink */
  --on-dark-muted:  rgb(237 233 226 / .64);

  /* ---------- BRONZE — THREE ROLES, NOT ONE ----------
     The comps use one bronze on both grounds. On the light canvas that value
     measures 2.83:1, which fails as text — and the comps do set links in it.
     Split into three roles so the look survives and the text passes. */
  --accent-dark:    #C0A57E;   /* text ON INK      — 7.6:1 ✓ */
  --accent-line:    #A98A5C;   /* rules, borders, non-text marks only */
  --accent-text:    #7E6238;   /* text ON CANVAS   — 5.0:1 ✓ */
  --accent-fill:    #B9A17C;   /* hero button fill; carries --ink text at 7.2:1 */
  --accent-fill-hv: #A88E68;

  /* ---------- LINES ---------- */
  --line:           rgb(20 25 30 / .14);
  --line-strong:    rgb(20 25 30 / .26);
  --line-dark:      rgb(237 233 226 / .16);

  /* ---------- STATUS ---------- */
  --success: #41624C;  --warning: #7E5F27;  --danger: #923D36;

  /* ---------- OVERLAY ----------
     Three layers, each with one job: a top band so navigation stays legible
     over a busy mural, a left wedge giving the headline a controlled zone,
     and the bottom lift for metadata. The right third stays near-untouched. */
  --scrim: linear-gradient(to bottom, rgb(16 24 32 / .56) 0%,
                                      rgb(16 24 32 / .14) 17%,
                                      transparent 32%),
           linear-gradient(to right,  rgb(16 24 32 / .74) 0%,
                                      rgb(16 24 32 / .48) 32%,
                                      rgb(16 24 32 / .10) 64%,
                                      transparent 88%),
           linear-gradient(to top,    rgb(16 24 32 / .78) 0%,
                                      rgb(16 24 32 / .34) 30%,
                                      transparent 62%);
  --scrim-soft: linear-gradient(to top, rgb(16 24 32 / .84) 0%,
                                        rgb(16 24 32 / .58) 34%,
                                        rgb(16 24 32 / .22) 66%,
                                        transparent 100%);

  /* ---------- TYPE ----------
     The hero device is an ITALIC bronze final word, so the display face must
     have a true italic. Playfair Display is the closest free match with one. */
  --f-display: 'Playfair Display', 'Newsreader', Georgia, 'Times New Roman', serif;
  --f-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --f-script: 'Caveat', 'Segoe Script', cursive;      /* exactly one line, once */

  /* cqw, NOT vw. `.sk` is a container, and vw resolves against the real browser
     window rather than the 390/1440 frame — a 390px frame inside a 1700px window
     rendered the hero at 96px, which is what pushed text over itself on mobile.
     Custom properties substitute lazily, so cqw resolves at the point of use, in
     descendants of .sk — which is exactly the box we want to measure. */
  --t-hero:  clamp(2.35rem, 6.6cqw, 6rem);   /* ≈96px @1440, ≈38px @390 */
  --t-h1:    clamp(1.95rem, 4.4cqw, 4rem);
  --t-h2:    clamp(1.6rem, 3.2cqw, 3rem);
  --t-h3:    clamp(1.2rem, 2cqw, 2rem);
  --t-lg:    1.1875rem;
  --t-body:  1.0625rem;
  --t-sm:    0.9375rem;
  --t-xs:    0.8125rem;
  --t-label: 0.6875rem;                   /* eyebrow floor: 11px, not 10 */

  /* ---------- SPACE (4px scale) ---------- */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px;
  --s7:48px; --s8:64px; --s9:96px; --s10:128px; --s11:160px; --s12:220px;

  /* ---------- LAYOUT ---------- */
  --container: 1520px;
  --gutter: clamp(20px, 4cqw, 64px);
  --radius: 0;                             /* the comps use 0 everywhere */
  --ease: cubic-bezier(.22, 1, .36, 1);

  container-type: inline-size;
  container-name: screen;
  background: var(--canvas);
  color: var(--text);
  font-family: var(--f-body);
  font-size: var(--t-body);
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
}

/* ---------- base ----------
   THE WHOLE RESET SITS IN :where() ON PURPOSE.
   Written as `.sk img { … }` the reset scores (0,1,1) and outranks every
   component class at (0,1,0). That silently broke three things before it was
   caught: link-buttons lost their label colour, hero images ignored
   object-fit, and split panels lost their vertical rhythm. A reset must never
   outrank a component, so :where() drops it to (0,0,1). */
:where(.sk) *, :where(.sk) *::before, :where(.sk) *::after { box-sizing: border-box; }
:where(.sk) :is(h1,h2,h3,h4,p,figure,ul,ol,dl,dd) { margin: 0; }
:where(.sk) :is(ul,ol) { padding: 0; list-style: none; }
:where(.sk) img { display: block; max-width: 100%; height: auto; }
/* Every image ships as <picture> with AVIF -> WebP -> JPEG sources
   (docs/MEDIA-ASSETS.md 8). display:contents removes the wrapper's own box,
   so the <img> stays the flex/grid item its parent lays out and no component
   has to know a wrapper exists. Structural selectors are a separate matter:
   a `> img` rule no longer matches through the wrapper and is written as a
   descendant selector below. */
:where(.sk) picture { display: contents; }
:where(.sk) a { color: inherit; text-decoration: none; }
:where(.sk) button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }
.sk :focus-visible { outline: 2px solid var(--accent-line); outline-offset: 3px; }
.sk .on-dark :focus-visible, .sk .sk-hero :focus-visible { outline-color: var(--on-dark); }

/* ---------- type ---------- */
.sk-hero-title { font-family: var(--f-display); font-weight: 400; font-size: var(--t-hero);
  line-height: .95; letter-spacing: -.018em; text-wrap: balance;
  overflow-wrap: break-word; hyphens: auto; }
.sk-h1 { font-family: var(--f-display); font-weight: 400; font-size: var(--t-h1);
  text-wrap: balance; overflow-wrap: break-word;
  line-height: 1.02; letter-spacing: -.016em; }
.sk-h2 { font-family: var(--f-display); font-weight: 400; font-size: var(--t-h2);
  text-wrap: balance; overflow-wrap: break-word;
  line-height: 1.08; letter-spacing: -.012em; }
.sk-h3 { font-family: var(--f-display); font-weight: 400; font-size: var(--t-h3);
  text-wrap: balance; overflow-wrap: break-word;
  line-height: 1.2; }
.sk-h4 { font-size: var(--t-lg); font-weight: 500; line-height: 1.3; }

/* THE hero device — one flourish per screen, never repeated */
.sk-hero-title em, .sk-accent-word { font-style: italic; color: var(--accent-dark); }

.sk-eyebrow { display: block; font-size: var(--t-label); text-transform: uppercase;
  letter-spacing: .18em; font-weight: 500; color: var(--muted); }
.on-dark .sk-eyebrow, .sk-dark .sk-eyebrow, .sk-hero .sk-eyebrow { color: var(--accent-dark); }
.sk-lead { font-size: var(--t-lg); color: var(--muted); max-width: 46ch; }
.on-dark .sk-lead, .sk-dark .sk-lead, .sk-hero .sk-lead { color: var(--on-dark-muted); }
.sk-meta { font-size: var(--t-xs); text-transform: uppercase; letter-spacing: .14em;
  color: var(--muted); }
.on-dark .sk-meta, .sk-dark .sk-meta, .sk-hero .sk-meta { color: var(--on-dark-muted); }
.sk-num { font-variant-numeric: tabular-nums; }
.sk-script { font-family: var(--f-script); font-size: clamp(1.35rem, 2.4cqw, 2.2rem);
  color: var(--text); line-height: 1.2; }

/* ---------- layout ---------- */
.sk-container { width: 100%; max-width: var(--container); margin-inline: auto;
  padding-inline: var(--gutter); }

/* Grid and flex children default to min-width:auto, which is min-content — so a
   wide child (a thumbnail rail, a table, a long word) can force its track past
   the frame instead of shrinking. This is the single most common cause of
   horizontal overflow in a responsive grid. */
.sk-split > *, .sk-grid > *, .sk-cta > *, .sk-editorial > *,
.sk-offset > *, .sk-steps > *, .sk-metabar > * { min-width: 0; }
.sk-band { padding-block: var(--s9); }
.sk-band--tight { padding-block: var(--s8); }
.sk-band--loose { padding-block: var(--s10); }
.sk-dark { background: var(--ink); color: var(--on-dark); }
.on-dark { color: var(--on-dark); }   /* a context, not just a hook */
.sk-sink { background: var(--canvas-sink); }

/* ========== SPLIT BAND — the homepage's signature object ==========
   Bands 2 and 4 of the reference are this component, mirrored. Edge to edge:
   no container gutter on the outside. */
.sk-split { display: grid; grid-template-columns: 56fr 44fr; align-items: stretch; }
.sk-split--flip { grid-template-columns: 44fr 56fr; }
.sk-split--flip .sk-split__media { order: 2; }
.sk-split__media { position: relative; min-height: 380px; overflow: hidden; }
.sk-split__media img { position: absolute; inset: 0;
  width: 100%; height: 100%; object-fit: cover; }
.sk-split__over { position: absolute; inset: auto 0 0 0;
  padding: var(--s8) var(--s7) var(--s7) var(--gutter);
  background: var(--scrim-soft); color: var(--on-dark); }
.sk-split__panel { background: var(--paper); padding: var(--s9) var(--s7);
  display: flex; flex-direction: column; justify-content: center; position: relative; }
.sk-split__panel > * + * { margin-top: var(--s5); }
.sk-split__count { position: absolute; right: var(--s7); bottom: var(--s7);
  display: flex; gap: var(--s4); font-size: var(--t-xs); }
.sk-split__count b { font-weight: 500; }
.sk-split__count span { color: var(--muted); }

/* ========== HERO ========== */
.sk-hero { position: relative; display: flex; flex-direction: column;
  color: var(--on-dark); overflow: hidden; }
.sk-hero--full { height: 675px; }                 /* measured from comp; never vh */
.sk-hero--contained { height: 340px; }             /* inner pages, ≈3.96:1 */
.sk-hero__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.sk-hero__scrim { position: absolute; inset: 0; background: var(--scrim); }
.sk-hero__top, .sk-hero__body, .sk-hero__foot { position: relative; z-index: 2; }
.sk-hero__body { margin-top: auto; }
.sk-hero__foot { display: flex; align-items: flex-end; justify-content: space-between;
  gap: var(--s5); padding-block: var(--s6); }
.sk-scroll { display: flex; align-items: center; gap: var(--s3); font-size: var(--t-label);
  text-transform: uppercase; letter-spacing: .18em; color: var(--on-dark-muted); }
.sk-scroll::before { content: ""; width: 1px; height: 34px; background: var(--on-dark-muted); }

/* ========== BUTTONS — two primaries, ground-dependent ========== */
.sk-btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--s3);
  min-height: 48px; padding: 0 28px; border-radius: var(--radius); font-size: var(--t-sm);
  font-weight: 500; letter-spacing: .01em; border: 1px solid transparent;
  transition: background 250ms var(--ease), color 250ms var(--ease),
              border-color 250ms var(--ease); }
.sk-btn--art    { background: var(--accent-fill); color: var(--ink); }
.sk-btn--art:hover { background: var(--accent-fill-hv); }
.sk-btn--canvas { background: var(--ink); color: var(--on-dark); }
.sk-btn--canvas:hover { background: var(--ink-soft); }
.sk-btn--ghost  { border-color: var(--line-strong); color: var(--text); }
.sk-btn--ghost:hover { border-color: var(--ink); }
.on-dark .sk-btn--ghost, .sk-hero .sk-btn--ghost {
  border-color: rgb(237 233 226 / .5); color: var(--on-dark); }
.on-dark .sk-btn--ghost:hover, .sk-hero .sk-btn--ghost:hover { border-color: var(--on-dark); }
.sk-btn--block { width: 100%; }

.sk-link { display: inline-flex; align-items: center; gap: var(--s2); font-size: var(--t-sm);
  font-weight: 500; color: var(--accent-text); padding-block: var(--s2); min-height: 44px;
  border-bottom: 1px solid var(--accent-line); transition: gap 250ms var(--ease); }
.sk-link:hover { gap: var(--s3); }
.on-dark .sk-link, .sk-dark .sk-link, .sk-hero .sk-link { color: var(--accent-dark);
  border-bottom-color: rgb(192 165 126 / .5); }
.on-dark .sk-link:hover, .sk-dark .sk-link:hover { border-bottom-color: var(--accent-dark); }

.sk-rule { height: 1px; background: var(--line); border: 0; }
.sk-rule--accent { width: 44px; height: 2px; background: var(--accent-line); border: 0; }

/* ========== PROCESS STEPS ========== */
.sk-steps { display: grid; grid-template-columns: repeat(4, 1fr); }
.sk-steps > li { padding-inline: var(--s5); border-left: 1px solid var(--line-dark); }
.sk-steps > li:first-child { padding-inline-start: 0; border-left: 0; }
.sk-steps__n { display: block; font-family: var(--f-display); font-size: var(--t-h3);
  line-height: 1; color: var(--accent-dark); margin-bottom: var(--s3); }
.sk-steps__t { display: block; font-family: var(--f-display); font-size: var(--t-lg);
  margin-bottom: var(--s2); }
.sk-steps p { font-size: var(--t-xs); color: var(--on-dark-muted); line-height: 1.5; }

/* ========== METADATA BAR (inset in a case-study hero) ========== */
.sk-metabar { display: grid; grid-template-columns: repeat(5, 1fr);
  border-top: 1px solid var(--line-dark); }
.sk-metabar > div { padding: var(--s4) var(--s5); border-left: 1px solid var(--line-dark); }
.sk-metabar > div:first-child { padding-inline-start: 0; border-left: 0; }
.sk-metabar dt { font-size: var(--t-label); text-transform: uppercase; letter-spacing: .14em;
  color: var(--on-dark-muted); margin-bottom: var(--s1); }
.sk-metabar dd { font-size: var(--t-sm); }

/* ========== CARDS + GRID — index / gallery / related ONLY ==========
   Never in an editorial band: there, a three-card row is the AI-template tell. */
.sk-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s6) var(--s5); }
/* The empty catalogue. A band that renders as whitespace reads as a page
   that failed to load; this one says which state it is in. */
.sk-grid__empty { max-width: 46ch; margin: 0; color: var(--muted);
  font-size: var(--t-lg); line-height: 1.55; }
.sk-card { display: block; }
.sk-card__frame { display: block; overflow: hidden; background: var(--canvas-sink); }
.sk-card__frame img { width: 100%; aspect-ratio: 1.1; object-fit: cover;
  transition: transform 500ms var(--ease); }
.sk-card:hover .sk-card__frame img { transform: scale(1.02); }
.sk-card__meta { display: flex; justify-content: space-between; gap: var(--s4);
  margin-top: var(--s4); }
.sk-card__title { display: block; font-family: var(--f-display); font-size: var(--t-h3);
  margin-top: var(--s2); }
.sk-card__frame--tall img { aspect-ratio: 4/5; }

/* ========== FILTER BAR ========== */
.sk-filters { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s5);
  padding-bottom: var(--s4); border-bottom: 1px solid var(--line); }
.sk-filters__tab { display: inline-flex; align-items: center; min-height: 44px;
  font-size: var(--t-sm); color: var(--muted); border-bottom: 1px solid transparent; }
.sk-filters__tab[aria-current="true"] { color: var(--text); border-bottom-color: var(--ink); }
.sk-filters__sort { margin-left: auto; font-size: var(--t-sm); color: var(--muted); }

/* ========== SPEC TABLE + ACCORDION ========== */
.sk-spec { width: 100%; border-collapse: collapse; }
.sk-spec th, .sk-spec td { text-align: left; padding: var(--s4) 0;
  border-bottom: 1px solid var(--line); font-size: var(--t-sm); font-weight: 400; }
.sk-spec th { color: var(--muted); width: 42%; }
.sk-acc { border-bottom: 1px solid var(--line); }
.sk-acc > summary { display: flex; justify-content: space-between; align-items: center;
  gap: var(--s4); padding: var(--s5) 0; cursor: pointer; font-size: var(--t-lg);
  list-style: none; min-height: 44px; }
.sk-acc > summary::-webkit-details-marker { display: none; }
.sk-acc > summary::after { content: "+"; font-size: 1.2em; color: var(--muted); }
.sk-acc[open] > summary::after { content: "–"; }
.sk-acc__body { padding-bottom: var(--s5); }

/* ========== PRICE BLOCK ========== */
.sk-price { display: flex; align-items: baseline; flex-wrap: wrap; gap: var(--s3); }
.sk-price__from { font-size: var(--t-sm); color: var(--muted); }
.sk-price__fig { font-family: var(--f-display); font-size: var(--t-h2); }
.sk-price__unit { font-size: var(--t-sm); color: var(--muted); }

/* ========== ICON ROW ========== */
.sk-icons { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--s5);
  padding-block: var(--s6); border-block: 1px solid var(--line); text-align: center; }
.sk-icons svg { width: 26px; height: 26px; margin: 0 auto var(--s3);
  stroke: var(--accent-text); fill: none; stroke-width: 1.25; }
.sk-icons span { display: block; font-size: var(--t-xs); color: var(--muted); line-height: 1.4; }

/* ========== PULL QUOTE ========== */
.sk-quote { font-family: var(--f-display); font-style: italic; font-size: var(--t-h3);
  line-height: 1.35; padding-top: var(--s5); border-top: 2px solid var(--accent-line); }
.sk-quote cite { display: block; font-family: var(--f-body); font-style: normal;
  font-size: var(--t-sm); color: var(--muted); margin-top: var(--s4); }

/* ========== CTA BAND ========== */
.sk-cta { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s7); align-items: center; }

/* ========== CHROME ========== */
.sk-nav { display: flex; align-items: center; gap: var(--s6); padding-block: var(--s5);
  flex-wrap: nowrap; }
.sk-nav__mark { font-family: var(--f-display); font-size: 1.35rem; letter-spacing: .2em;
  text-transform: uppercase; white-space: nowrap; }
.sk-nav__list { display: flex; align-items: center; gap: var(--s5); font-size: var(--t-sm); }
.sk-nav__list a { display: inline-flex; align-items: center; min-height: 44px;
  border-bottom: 1px solid transparent; white-space: nowrap; }
.sk-nav__list a:hover, .sk-nav__list a[aria-current="page"] { border-bottom-color: currentColor; }
.sk-nav__util { display: flex; align-items: center; gap: var(--s5); margin-left: auto;
  font-size: var(--t-sm); white-space: nowrap; }
.sk-nav__burger { display: none; }

.sk-footer { background: var(--ink); color: var(--on-dark); padding-block: var(--s9) var(--s6); }
.sk-footer__grid { display: grid; grid-template-columns: 1.6fr repeat(4, 1fr); gap: var(--s7); }
.sk-footer h3, .sk-footer h4 { font-size: var(--t-label); text-transform: uppercase; letter-spacing: .16em;
  color: var(--accent-dark); margin-bottom: var(--s4); font-weight: 500; }
.sk-footer li a { font-size: var(--t-sm); color: var(--on-dark-muted);
  display: inline-flex; align-items: center; min-height: 34px; }
.sk-footer li a:hover { color: var(--on-dark); }
.sk-footer__legal { display: flex; flex-wrap: wrap; justify-content: space-between;
  gap: var(--s4); margin-top: var(--s8); padding-top: var(--s5);
  border-top: 1px solid var(--line-dark); font-size: var(--t-xs); color: var(--on-dark-muted); }

/* ========== VISIBLE ASSUMPTIONS ========== */
.sk-assume { border-bottom: 1px dotted var(--accent-line); background: rgb(169 138 92 / .13);
  padding: 0 2px; cursor: help; }
.sk-assume::after { content: attr(data-open); font-size: .6em; vertical-align: super;
  color: var(--accent-text); font-weight: 600; margin-left: 2px; letter-spacing: .04em; }
.on-dark .sk-assume, .sk-dark .sk-assume, .sk-hero .sk-assume {
  background: rgb(192 165 126 / .2); border-bottom-color: var(--accent-dark); }
.on-dark .sk-assume::after, .sk-dark .sk-assume::after, .sk-hero .sk-assume::after {
  color: var(--accent-dark); }

/* ==========================================================================
   MOBILE — deliberately designed, not compressed.
   Container queries, so the collapse tracks the prototype frame rather than
   the reader's browser window.
   ========================================================================== */
@container screen (max-width: 900px) {
  .sk-split, .sk-split--flip { grid-template-columns: 1fr; }
  .sk-split--flip .sk-split__media { order: 0; }
  .sk-split__media { min-height: 0; aspect-ratio: 4/5; }
  .sk-split__over { padding: var(--s8) var(--gutter) var(--s5); }
  .sk-split__over .sk-h2, .sk-split__over .sk-h3 { font-size: var(--t-h3); }
  .sk-split__panel { padding: var(--s8) var(--gutter); }
  .sk-split__count { position: static; margin-top: var(--s5); }
  /* 4:5 as a floor, not a cage: aspect-ratio plus overflow:hidden clipped the
     second CTA and the metadata foot at 390px. */
  .sk-hero--full { height: auto; min-height: 125cqw; }
  /* The desktop scrim is left-weighted, because there the headline occupies a
     column. On a narrow frame the text spans the full width, so the wedge stops
     covering it — weight the scrim from the bottom instead. */
  .sk-hero__scrim {
    background: linear-gradient(to bottom, rgb(16 24 32 / .62) 0%,
                                           rgb(16 24 32 / .18) 14%,
                                           transparent 26%),
                linear-gradient(to top,    rgb(16 24 32 / .90) 0%,
                                           rgb(16 24 32 / .68) 34%,
                                           rgb(16 24 32 / .34) 62%,
                                           rgb(16 24 32 / .10) 84%,
                                           transparent 100%); }
  .sk-split__over { background: linear-gradient(to top,
                                  rgb(16 24 32 / .92) 0%,
                                  rgb(16 24 32 / .72) 40%,
                                  rgb(16 24 32 / .34) 74%,
                                  transparent 100%); }
  .sk-hero__img { object-position: 8% 40%; }   /* mural sits left of centre */
  .sk-hero--contained { height: 240px; }
  .sk-steps { grid-template-columns: 1fr; }
  .sk-steps > li { padding: var(--s5) 0; border-left: 0; border-top: 1px solid var(--line-dark); }
  .sk-steps > li:first-child { border-top: 0; padding-top: 0; }
  .sk-metabar { grid-template-columns: 1fr 1fr; }
  .sk-metabar > div { border-left: 0; border-top: 1px solid var(--line-dark);
    padding-inline: 0 var(--s4); }
  .sk-grid { grid-template-columns: 1fr; }
  .sk-icons { grid-template-columns: 1fr 1fr; gap: var(--s6) var(--s4); }
  .sk-cta { grid-template-columns: 1fr; gap: var(--s5); }
  .sk-footer__grid { grid-template-columns: 1fr 1fr; gap: var(--s6); }
  .sk-nav__list, .sk-nav__util { display: none; }
  .sk-nav__burger { display: inline-flex; margin-left: auto; min-height: 44px;
    align-items: center; font-size: var(--t-sm); }
  .sk-band { padding-block: var(--s8); }
  .sk-band--loose { padding-block: var(--s9); }
}
@container screen (min-width: 901px) and (max-width: 1100px) {
  .sk-grid { grid-template-columns: 1fr 1fr; }
}

@media (prefers-reduced-motion: reduce) {
  .sk *, .sk *::before, .sk *::after {
    animation-duration: .01ms !important; transition-duration: .01ms !important; }
}


/* ---------------------------------------------------------------------------
   Footer grid at the narrow end
   Grid children default to min-width:auto, so the footer columns refused to
   shrink and the page carried a 374px floor - it overflowed at 360 and 320,
   both of which UX-SPEC NFR-301 lists as supported. One column below 420px.
   --------------------------------------------------------------------------- */
.sk-footer__grid > * { min-width: 0; }

@container screen (max-width: 420px) {
  .sk-footer__grid { grid-template-columns: 1fr; gap: var(--s6); }
  .sk-footer__legal { flex-direction: column; gap: var(--s2); }
}
