/* ============================================================================
   WOVENRAG — the single stylesheet for the whole site
   ----------------------------------------------------------------------------
   THEME SWITCHING (colours and fonts) HAPPENS ONLY IN THE "SWITCHBOARD" BLOCK
   BELOW. No colour and no font name is hardcoded anywhere else in this file.

   Since issue #27 the site runs ONE calm light scheme. `.t-dark` stays as an
   OPT-IN ACCENT class for a single section (a closing CTA band, a photo band)
   — it is never put on <body> any more.
   ========================================================================== */

/* ── SWITCHBOARD: FONTS ──────────────────────────────────────────────────────
   ACTIVE PAIRING: Hubballi (headings) + Work Sans (body, UI and prices).

   Heading candidates are self-hosted under stable internal family names.
   Change only --font-heading in :root to compare them; no component rule
   names a real font. The body family stays behind the same indirection.

   Both faces are self-hosted (GDPR + performance, no request to Google) and
   split latin / latin-ext by unicode-range, the same split Google Fonts uses.
   Both are variable woff2 instanced with fontTools to the weights we use:
     Fraunces  — wght pinned to 400, opsz 9..144 axis KEPT, so the browser's
                 default `font-optical-sizing:auto` picks the display cut for
                 large headings and the text cut for small ones. WONK and SOFT
                 are not in the Google-served file, so wonky forms stay off.
     Work Sans — wght limited to 400..600 (body 400, buttons/nav 500, price 600).
   ------------------------------------------------------------------------- */
@font-face{font-family:'WR Heading Fraunces';src:url('../fonts/fraunces-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Fraunces';src:url('../fonts/fraunces-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading Fraunces';src:url('../fonts/fraunces-italic-latin-ext.woff2') format('woff2');font-weight:400;font-style:italic;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Fraunces';src:url('../fonts/fraunces-italic-latin.woff2') format('woff2');font-weight:400;font-style:italic;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

/* Sans-serif heading candidates. Hubballi is active; the other four are
   already local so a later comparison is a one-line :root change. */
@font-face{font-family:'WR Heading Hubballi';src:url('../fonts/hubballi-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Hubballi';src:url('../fonts/hubballi-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading Livvic';src:url('../fonts/livvic-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Livvic';src:url('../fonts/livvic-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading Thasadith';src:url('../fonts/thasadith-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Thasadith';src:url('../fonts/thasadith-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading Thasadith';src:url('../fonts/thasadith-bold-latin-ext.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Thasadith';src:url('../fonts/thasadith-bold-latin.woff2') format('woff2');font-weight:700;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading Sarabun';src:url('../fonts/sarabun-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Sarabun';src:url('../fonts/sarabun-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading Nunito';src:url('../fonts/nunito-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading Nunito';src:url('../fonts/nunito-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Body';src:url('../fonts/worksans-latin-ext.woff2') format('woff2');font-weight:400 600;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Body';src:url('../fonts/worksans-latin.woff2') format('woff2');font-weight:400 600;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

/* ── Comparison faces, loaded ONLY by the /vzorkovnik/ specimen page ────────
   The previous pairing (Newsreader 400 + Archivo) under its own family name,
   so the specimen can show old beside new. @font-face downloads lazily, so
   these cost nothing on the real pages. They also keep the "tuned status
   quo" alternate above switchable without re-downloading anything.      */
@font-face{font-family:'WR Alt Heading';src:url('../fonts/newsreader-latin-ext.woff2') format('woff2');font-weight:200 500;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Alt Heading';src:url('../fonts/newsreader-latin.woff2') format('woff2');font-weight:200 500;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Alt Body';src:url('../fonts/archivo-latin-ext.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Alt Body';src:url('../fonts/archivo-latin.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

/* ── ALTERNATE PAIRING A — "the tuned status quo": Newsreader 400 + Archivo ──
   Files ARE in assets/fonts/ (newsreader-*.woff2, archivo-*.woff2), so this
   one is switchable immediately: comment out the six @font-face rules above,
   uncomment the six below, and set --weight-heading:400 / --heading-tracking:
   -0.012em / --fs-h1:clamp(36px,4.1vw,58px) in the type block.

@font-face{font-family:'WR Heading';src:url('../fonts/newsreader-latin-ext.woff2') format('woff2');font-weight:200 500;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading';src:url('../fonts/newsreader-latin.woff2') format('woff2');font-weight:200 500;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Heading';src:url('../fonts/newsreader-italic-latin-ext.woff2') format('woff2');font-weight:200 500;font-style:italic;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Heading';src:url('../fonts/newsreader-italic-latin.woff2') format('woff2');font-weight:200 500;font-style:italic;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:'WR Body';src:url('../fonts/archivo-latin-ext.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap;
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:'WR Body';src:url('../fonts/archivo-latin.woff2') format('woff2');font-weight:300 700;font-style:normal;font-display:swap;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
   ─────────────────────────────────────────────────────────────────────────── */

/* ── ALTERNATE PAIRING B — "bookish and quiet": Literata + Karla ─────────────
   No files committed. To try it, fetch the two subsets per family from the
   Google Fonts CSS API with a browser User-Agent (the API returns the
   per-subset unicode-range blocks and the direct fonts.gstatic.com woff2
   URLs), then instance the variable files down to the weights in use:

     curl -sS -A "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/120 Safari/537.36" \
       "https://fonts.googleapis.com/css2?family=Literata:ital,opsz,wght@0,7..72,400;1,7..72,400&family=Karla:wght@400;500;600&display=swap"
     # download the `latin` and `latin-ext` woff2 URLs it prints, then:
     python3 -c "from fontTools.ttLib import TTFont; from fontTools.varLib.instancer import instantiateVariableFont; \
       t=TTFont('literata-latin.woff2'); t.flavor=None; \
       instantiateVariableFont(t,{'wght':400,'opsz':(7,72)},inplace=True); t.flavor='woff2'; t.save('out.woff2')"

   Then point 'WR Heading' at literata-*.woff2 and 'WR Body' at karla-*.woff2
   and set --weight-heading:400 / --heading-tracking:-0.006em.
   ─────────────────────────────────────────────────────────────────────────── */

:root{
  /* Heading font switch. Other ready values: 'WR Heading Hubballi',
     'WR Heading Livvic', 'WR Heading Thasadith', 'WR Heading Nunito', or
     'WR Heading Fraunces'. Change this one line to compare them. */
  --font-heading:'WR Heading Sarabun','Helvetica Neue',Arial,sans-serif;
  --font-body:'WR Body','Helvetica Neue',Helvetica,sans-serif;
  --weight-heading:400;
  --heading-tracking:0;

  /* ── SWITCHBOARD: COLOURS — ACTIVE PALETTE "Galéria" ────────────────────
     Cool light neutrals, aubergine accent that echoes the magenta-violet
     vests in the product photos. Decided in #26/#27 on 2026-08-29.
     Measured WCAG 2.2 contrast (see the table in the PR):
       fg/bg 17.1:1 · muted/bg 5.6:1 · muted-strong/bg 7.1:1
       accent-as-text/bg 9.0:1 · white-on-accent 9.7:1 · error/bg 6.1:1   */
  --bg:#f3eaee;
  --surface:#fbf7f9;
  --surface-alt:#e9dfe4;
  --fg:#141414;
  --muted:#66625c;
  --muted-strong:#57534d;      /* for text under 14px — contrast 7.1:1 */
  --rule:#ddcfd6;
  --accent:#5c3a4d;            /* aubergine */
  --accent-hover:#4c3040;
  --on-accent:#ffffff;
  --accent-text:var(--accent); /* the accent as *text*; re-derived in .t-dark */
  --error:#a33a2c;             /* on --bg #f7f6f4: contrast 6.1:1 */

  --btn-bg:var(--accent);
  --btn-fg:var(--on-accent);
  --btn-bg-hover:var(--accent-hover);
  --header-stuck-bg:color-mix(in srgb,var(--bg) 76%,transparent);
  /* Since #29 every hero puts its text BESIDE the photo (.hero--split), the
     home page included: the photo is never dimmed and needs no scrim.     */
  --hero-overlay:none;
  --hero-img-opacity:1;

  /* ── ALTERNATE PALETTE 1 — "Ľan a indigo" (calm/contemporary; the indigo
        comes from Júlia's own fabric). Swap the nine tokens above for:
     --bg:#faf9f7; --surface:#ffffff; --surface-alt:#f3f0ea;
     --fg:#1c1a16; --muted:#6a635a; --muted-strong:#5a544c; --rule:#e4dfd7;
     --accent:#35566f; --accent-hover:#2c4a61; --on-accent:#ffffff;
     --error:#b0483a;                                                     */

  /* ── ALTERNATE PALETTE 2 — "Prírodné farbenie" (warmer/traditional, the
        accent reads as madder/rust). Swap the nine tokens above for:
     --bg:#f8f4ee; --surface:#fffdf9; --surface-alt:#f1ebe1;
     --fg:#2a241d; --muted:#6e655a; --muted-strong:#5e564c; --rule:#e6ddd0;
     --accent:#8a4a30; --accent-hover:#71391f; --on-accent:#ffffff;
     --error:#a33a2c;                                                     */

  /* ── Grid, spacing, type scale ──────────────────────────────────────────
     Spacing was scaled up one step in #27 — the review asked for air.   */
  --wrap:1408px;
  --pad:64px;
  --gap:24px;
  --sp-64:64px; --sp-72:72px; --sp-80:96px; --sp-88:96px; --sp-96:96px;
  /* Six visual roles: page title, section title, item title, body,
     supporting text and category label. Components reuse these roles. */
  --fs-h1:clamp(46px,4vw,56px);
  --fs-h2:clamp(32px,2.8vw,36px);
  --fs-h3:24px;
  --fs-body:16px;
  --fs-small:14px;
  --fs-eyebrow:12px;
  --fs-price:var(--fs-h3);
  /* Text case is controlled here, never by typing headings in capitals. */
  --case-eyebrow:uppercase;
  --case-footer-heading:uppercase;
  --case-process-label:uppercase;
}

/* Query-only review switch used by ?heading-font=<candidate>. Hubballi
   remains the default when the attribute is absent. */
html[data-heading-font-preview="hubballi"]{--font-heading:'WR Heading Hubballi','Helvetica Neue',Arial,sans-serif}
html[data-heading-font-preview="livvic"]{--font-heading:'WR Heading Livvic','Helvetica Neue',Arial,sans-serif}
html[data-heading-font-preview="thasadith"]{--font-heading:'WR Heading Thasadith','Helvetica Neue',Arial,sans-serif}
html[data-heading-font-preview="thasadith-bold"]{--font-heading:'WR Heading Thasadith','Helvetica Neue',Arial,sans-serif;--weight-heading:700}
html[data-heading-font-preview="sarabun"]{--font-heading:'WR Heading Sarabun','Helvetica Neue',Arial,sans-serif}
html[data-heading-font-preview="nunito"]{--font-heading:'WR Heading Nunito','Helvetica Neue',Arial,sans-serif}
html[data-body-font-preview="thasadith"]{--font-body:'WR Heading Thasadith','Helvetica Neue',Arial,sans-serif}
html[data-heading-font-preview]::after{
  content:"Heading font · " attr(data-heading-font-preview);position:fixed;right:14px;bottom:14px;z-index:10040;
  padding:9px 12px;background:#141414;color:#fff;font-family:var(--font-body);font-size:var(--fs-small);
  font-weight:600;line-height:1;text-transform:capitalize;box-shadow:0 4px 18px rgba(0,0,0,.24)}
html[data-body-font-preview]::before{
  content:"Body font · " attr(data-body-font-preview);position:fixed;right:14px;bottom:54px;z-index:10040;
  padding:9px 12px;background:#141414;color:#fff;font-family:var(--font-body);font-size:var(--fs-small);
  font-weight:600;line-height:1;text-transform:capitalize;box-shadow:0 4px 18px rgba(0,0,0,.24)}
html[data-heading-font-preview^="thasadith"] :is(.price,.work__price,.workshop-card__price,.pricelist__price,.facts__num,.home-company__facts strong){
  font-family:var(--font-heading);font-weight:var(--weight-heading);letter-spacing:var(--heading-tracking)}

/* ── Dark ACCENT scheme — opt-in on a single <section>, never on <body> ─────
   Retained so a closing CTA band or one photo band can go dark. Body text
   inside it keeps AA: fg/bg 15.2:1, muted/bg 5.0:1, accent-text/bg 8.4:1. */
.t-dark{
  --bg:#131211;
  --fg:#ece7e0;
  --muted:#8b837a;
  --muted-strong:#a49b90;      /* for text under 14px — contrast 6.8:1 */
  --rule:#282422;
  --surface:#131211;
  --surface-alt:#191716;
  --accent-text:#c9a3b8;       /* aubergine lifted for dark ground — 8.4:1 */
  --btn-bg:var(--fg);
  --btn-fg:var(--bg);
  --btn-bg-hover:#ffffff;
  --error:#ce6856;             /* on --bg #131211: contrast 5.11:1 */
  --hero-overlay:linear-gradient(100deg,#131211 26%,rgba(19,18,17,.72) 58%,rgba(19,18,17,.28) 100%);
  --hero-img-opacity:.62;
  background:var(--bg);
  color:var(--fg);
}
/* ── Base ─────────────────────────────────────────────────────────────────── */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
  margin:0;background:var(--bg);color:var(--fg);
  font-family:var(--font-body);font-size:var(--fs-body);line-height:1.65;
  font-weight:400;-webkit-font-smoothing:antialiased;overflow-x:hidden;
}
address{font-style:normal}
h1,h2,h3,h4{font-family:var(--font-heading);font-weight:var(--weight-heading);
  letter-spacing:var(--heading-tracking);margin:0;text-wrap:balance}
h1{font-size:var(--fs-h1);line-height:1.08}
h2{font-size:var(--fs-h2);line-height:1.15}
h3{font-size:var(--fs-h3);line-height:1.2}
p{margin:0}
p+p{margin-top:1.1em}
img,svg{display:block;max-width:100%}
picture{display:contents}
source{display:none}
img{height:auto}
a{color:inherit}
ul{margin:0;padding:0;list-style:none}
:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.t-dark :focus-visible{outline-color:var(--accent-text)}
.skip{position:absolute;left:-9999px;top:0;z-index:200;background:var(--bg);color:var(--fg);
  padding:12px 18px;border:1px solid var(--rule)}
.skip:focus{left:0}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* ── Layout ───────────────────────────────────────────────────────────────── */
.wrap{max-width:var(--wrap);margin:0 auto;padding-left:var(--pad);padding-right:var(--pad)}
.section{padding-top:var(--sp-80);padding-bottom:var(--sp-80)}
.section--alt{background:var(--surface-alt)}
.section--lead{padding-top:var(--sp-88)}
.section--tight{padding-top:var(--sp-64);padding-bottom:var(--sp-64)}
.section--wide{padding-top:var(--sp-96);padding-bottom:var(--sp-96)}
.grid{display:grid;grid-template-columns:repeat(12,1fr);gap:var(--gap)}
.stack{display:flex;flex-direction:column;gap:22px;align-items:flex-start}
.stack--center{align-items:center;text-align:center}
.measure{max-width:59ch}

/* ── Type helpers ─────────────────────────────────────────────────────────── */
.eyebrow{font-size:var(--fs-eyebrow);line-height:1.2;letter-spacing:.16em;text-transform:var(--case-eyebrow);
  color:var(--muted-strong);font-weight:400;margin:0}
.lead{font-size:var(--fs-body);line-height:1.65;color:var(--muted);max-width:52ch}
.small{font-size:var(--fs-small);line-height:1.65;color:var(--muted)}
.note{font-size:var(--fs-small);color:var(--muted)}
.accent{color:var(--accent-text)}
.price{font-family:var(--font-body);font-weight:600;font-size:var(--fs-price);line-height:1;letter-spacing:-0.01em}

/* ── Buttons and links ────────────────────────────────────────────────────── */
.btn{display:inline-flex;align-items:center;justify-content:center;min-height:48px;
  padding:14px 24px;font-size:var(--fs-small);font-weight:500;line-height:1;text-decoration:none;
  border:1px solid transparent;background:var(--btn-bg);color:var(--btn-fg);cursor:pointer;
  font-family:var(--font-body);transition:background-color .15s linear,color .15s linear}
.btn:hover{background:var(--surface);color:var(--accent);border-color:var(--accent)}
.btn--ghost{background:transparent;color:var(--fg);border-color:var(--muted)}
.btn--ghost:hover{background:var(--accent);color:var(--on-accent);border-color:var(--accent)}
.btn--invert{background:var(--on-accent);color:var(--accent)}
.btn--invert:hover{background:#141414;color:#fff;border-color:#141414}
.btn[disabled],.btn[aria-disabled="true"]{pointer-events:none;opacity:.5}
.btn-row{display:flex;flex-wrap:wrap;gap:12px}
.link{display:inline-block;font-size:var(--fs-small);color:var(--fg);letter-spacing:.02em;
  text-decoration:none;border-bottom:1px solid var(--fg);padding-bottom:6px;min-height:24px}
.link:hover{border-bottom-color:var(--muted);color:var(--muted)}
.link--arrow{display:inline-flex;align-items:center;gap:14px;min-height:44px;padding:8px 0;
  border-bottom:0;font-size:var(--fs-small);letter-spacing:.02em;font-weight:500}
.link--arrow::after{content:"";display:block;width:42px;height:9px;background:currentColor;
  clip-path:polygon(0 44%,84% 44%,84% 0,100% 50%,84% 100%,84% 56%,0 56%);
  transition:transform .15s linear}
.link--arrow:hover{border-bottom:0}
.link--arrow:hover::after{transform:translateX(5px)}

/* ── Header ───────────────────────────────────────────────────────────────── */
.hdr{position:sticky;top:0;z-index:50;background:var(--bg);border-bottom:1px solid transparent;
  transition:background-color .2s linear,border-color .2s linear,-webkit-backdrop-filter .2s linear,backdrop-filter .2s linear}
.hdr.is-stuck{border-bottom-color:var(--rule)}
.hdr__inner{position:relative;z-index:2;display:flex;align-items:flex-end;justify-content:space-between;gap:24px;
  padding-top:20px;padding-bottom:20px}
.hdr__logo{display:flex;align-items:flex-end;min-height:44px;padding:10px 0;transition:opacity .15s linear}
.hdr__logo img{height:15px;width:auto}
.hdr__logo:hover{opacity:.62}
.nav{display:flex;align-items:flex-end;gap:28px}
.nav a{font-size:var(--fs-small);text-decoration:none;color:var(--muted);padding:10px 0;min-height:44px;
  display:inline-flex;align-items:center}
.nav a:hover{color:var(--fg)}
.nav a[aria-current="page"]{color:var(--fg);box-shadow:inset 0 -2px 0 var(--accent)}
.nav .btn{color:var(--btn-fg)}
.hdr__cta{flex:0 0 auto;padding-left:22px;padding-right:22px}
.nav__toggle{display:none;align-items:center;justify-content:center;width:44px;height:44px;
  background:none;border:1px solid var(--rule);color:var(--fg);cursor:pointer;padding:0}
.nav__toggle i,.nav__toggle i::before,.nav__toggle i::after{
  content:"";display:block;width:18px;height:1px;background:currentColor}
.nav__toggle i{position:relative}
.nav__toggle i::before{position:absolute;top:-6px}
.nav__toggle i::after{position:absolute;top:6px}
.nav__scrim{display:none}

@media (min-width:1024px){
  .hdr__inner,.hdr__logo,.nav,.nav a,.hdr__cta{transition:padding .2s linear,min-height .2s linear,gap .2s linear}
  .hdr.is-stuck{background:var(--header-stuck-bg);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}
  .hdr.is-stuck .hdr__inner{padding-top:10px;padding-bottom:10px}
  .hdr.is-stuck .hdr__logo{min-height:40px;padding-top:5px;padding-bottom:5px}
  .hdr.is-stuck .nav{gap:22px}
  .hdr.is-stuck .nav a{min-height:40px;padding-top:6px;padding-bottom:6px}
  .hdr.is-stuck .hdr__cta{min-height:40px;padding:10px 18px}
}

/* ── Hero ─────────────────────────────────────────────────────────────────── */
.hero{position:relative;display:flex;align-items:center;min-height:700px;overflow:hidden}
.hero__media{position:absolute;inset:0;z-index:0}
.hero__media img{width:100%;height:100%;object-fit:cover;opacity:var(--hero-img-opacity)}
.hero__media::after{content:"";position:absolute;inset:0;background:var(--hero-overlay)}
.hero__inner{position:relative;z-index:1;width:100%}
.hero h1{max-width:24ch}
.hero--split{min-height:0;align-items:stretch;--hero-overlay:none}
.hero--split .hero__inner{padding-top:var(--sp-88);padding-bottom:var(--sp-88)}

/* ── Facts strip ──────────────────────────────────────────────────────────── */
.facts{display:grid;grid-template-columns:repeat(4,1fr);border-top:1px solid var(--rule)}
.facts__item{padding:34px 32px;border-left:1px solid var(--rule)}
.facts__item:first-child{border-left:0;padding-left:0}
.facts__num{font-family:var(--font-body);font-weight:600;
  font-size:var(--fs-h3);line-height:1.2;letter-spacing:0}
.facts__label{margin-top:10px;font-size:var(--fs-small);color:var(--muted);line-height:1.5}

/* ── Split blocks (photo + text) ──────────────────────────────────────────── */
.split{display:grid;gap:56px;align-items:center;grid-template-columns:47fr 53fr}
.split--narrow{grid-template-columns:42fr 58fr}
.split--wide{grid-template-columns:52fr 48fr}
.split--mirror{grid-template-columns:53fr 47fr}
.split--mirror .split__media{order:2}
.split__media{position:relative;height:var(--h,540px)}
.split__media img{width:100%;height:100%;object-fit:cover}
.split__media--tall{--h:600px}
.split__media--short{--h:420px}
.split__media--portrait{--h:500px}
.split__media--collection{--h:420px}
.photo-focus-lower img{object-position:center 58%}
.portrait-focus img{object-position:center 30%}
.portrait-safe img{object-position:center top}
.col-5{grid-column:span 5}
.col-6{grid-column:span 6}
.col-7{grid-column:7 / span 6}

/* ── Cards ────────────────────────────────────────────────────────────────── */
.cards{display:grid;gap:var(--gap);grid-template-columns:repeat(3,1fr)}
.cards--2{grid-template-columns:repeat(2,1fr)}
.card{border:1px solid var(--rule);padding:34px;background:var(--surface);
  display:flex;flex-direction:column;gap:14px;align-items:flex-start}
.card--flush{padding:0}
.card--flush .card__body{padding:34px;display:flex;flex-direction:column;gap:14px;align-items:flex-start;height:100%}
.card__media{width:100%;height:230px}
.card__media picture{display:block;width:100%;height:100%}
.card__media img{width:100%;height:100%;object-fit:cover}
.card__media--contain{background:var(--surface-alt)}
.card__media--contain img{object-fit:contain}
.card__media--panorama{height:auto;min-height:0;aspect-ratio:4/1;background:var(--surface);overflow:hidden;flex:none;align-self:stretch}
.card__media--panorama img{object-fit:cover}
.card--flush .card__body>.btn:last-child{margin-top:auto;width:100%}
.card>.btn:last-child,.card>.pay-form:last-child{margin-top:auto;width:100%}
.card__num{font-family:var(--font-body);font-size:var(--fs-eyebrow);letter-spacing:.16em;color:var(--accent-text)}
.card__title{font-size:var(--fs-h3);font-family:var(--font-heading);font-weight:var(--weight-heading)}
.specs{width:100%;border-collapse:collapse;font-size:var(--fs-small)}
.specs th,.specs td{text-align:left;padding:9px 0;border-top:1px solid var(--rule);font-weight:400}
.specs th{color:var(--muted);width:40%}

/* ── Selling points (columns with a top rule) ─────────────────────────────── */
.args{display:grid;gap:var(--gap);grid-template-columns:repeat(3,1fr)}
.args__item{border-top:2px solid var(--accent-text);padding-top:22px;display:flex;flex-direction:column;gap:10px}
.process-steps{counter-reset:process}
.process-steps .card{counter-increment:process;border:0;border-right:1px solid var(--rule);
  background:transparent;padding:0 24px 0 0}
.process-steps .card:last-child{border-right:0}

/* ── Works grid ───────────────────────────────────────────────────────────── */
.works{display:grid;column-gap:var(--gap);row-gap:64px;grid-template-columns:repeat(3,1fr)}
.work{display:flex;flex-direction:column;gap:14px;text-decoration:none;height:100%}
.work__media,.work__media--tall{height:auto;aspect-ratio:4/5;background:var(--surface);overflow:hidden}
.work__media img{width:100%;height:100%;object-fit:cover;object-position:center}
.work__row{display:flex;justify-content:space-between;gap:16px;align-items:baseline;
  padding-top:4px}
.work__name{font-family:var(--font-heading);font-size:var(--fs-h3);font-weight:var(--weight-heading)}
.work__price{font-size:var(--fs-small);color:var(--muted);white-space:nowrap}
a.work:hover .work__name{color:var(--muted)}
.work__action{margin-top:auto;padding-top:10px;width:100%;min-height:72px}
.work__action .btn,.work__pay,.work__pay .btn{width:100%}
.work__pay{display:flex;flex-direction:column;gap:10px}
/* ── Public workshop cards ───────────────────────────────────────────────── */
.workshop-list{display:grid;gap:24px}
.workshop-card{display:grid;grid-template-columns:minmax(0,4fr) minmax(0,5fr) minmax(190px,3fr);
  gap:32px;align-items:stretch;border:1px solid var(--rule);background:var(--surface);padding:24px}
.workshop-card--sold{opacity:.55}
.workshop-card__media{width:100%;min-width:0;height:auto;min-height:0;aspect-ratio:4/3;align-self:start;overflow:hidden;background:var(--surface-alt)}
.workshop-card__media img{width:100%;height:100%;object-fit:cover}
.workshop-card__body{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:4px 0}
.workshop-card__date{font-size:var(--fs-small);color:var(--muted-strong)}
.workshop-card__title{font-family:var(--font-heading);font-size:var(--fs-h3);line-height:1.2}
.workshop-card__outcome{font-size:var(--fs-body);line-height:1.65}
.workshop-card__meta{margin-top:auto;font-size:var(--fs-small);line-height:1.55;color:var(--muted)}
.workshop-card__purchase{display:flex;flex-direction:column;align-items:flex-start;padding:4px 0}
.workshop-card__price{font-family:var(--font-body);font-weight:600;font-size:var(--fs-price);line-height:1.2;letter-spacing:0}
.workshop-card__state{margin-top:8px;font-size:var(--fs-small);color:var(--muted)}
.workshop-card__action{margin-top:auto;width:100%}
.workshop-card__action .btn,.workshop-card__pay,.workshop-card__pay .btn{width:100%}
.workshop-card__pay{display:flex;flex-direction:column;gap:10px;margin:0}
.workshop-card__pay.pay-form--fallback-shown>.btn,
.workshop-card__pay.pay-form--fallback-shown>.pay-note{display:none}
.terms__empty{padding:28px 0;border-top:1px solid var(--rule);color:var(--muted)}
.term__msg{font-size:var(--fs-small);line-height:1.65;border:1px solid var(--error);color:var(--error);
  padding:10px 14px;max-width:44ch}
.term__msg:focus{outline:2px solid var(--error);outline-offset:2px}
.term__msg .pay-fallback{display:flex;margin-top:10px;color:var(--fg)}

/* ── Pull quote ───────────────────────────────────────────────────────────── */
.quote{text-align:center;max-width:20ch;margin:0 auto;font-family:var(--font-heading);
  font-style:italic;font-weight:var(--weight-heading);font-size:var(--fs-h2);line-height:1.2}
.quote--wide{max-width:26ch}

/* ── Gallery ──────────────────────────────────────────────────────────────── */
.gallery{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--rule)}
.gallery img{width:100%;height:280px;object-fit:cover}

/* ── Technique tiles ──────────────────────────────────────────────────────── */
.tiles{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:var(--rule);
  border:1px solid var(--rule)}
.tiles li{background:var(--bg);padding:24px 20px;font-size:var(--fs-small);min-height:80px;
  display:flex;align-items:center}

/* ── Timeline ─────────────────────────────────────────────────────────────── */
.path__item{display:grid;grid-template-columns:130px 1fr;gap:var(--gap);
  padding:26px 0;border-top:1px solid var(--rule)}
.path__when{font-size:var(--fs-small);color:var(--muted)}

/* ── Heading row with a note on the right ────────────────────────────────── */
.headrow{display:flex;justify-content:space-between;align-items:flex-start;gap:40px;width:100%}
.headrow>:last-child{max-width:46ch;text-align:right}
.headrow h2{max-width:22ch}

/* ── FAQ ──────────────────────────────────────────────────────────────────── */
.faq__item{display:grid;grid-template-columns:4fr 8fr;gap:var(--gap);padding:26px 0;
  border-top:1px solid var(--rule)}
.faq__q{font-family:var(--font-heading);font-size:var(--fs-h3);font-weight:var(--weight-heading)}

/* ── Two-up link block ────────────────────────────────────────────────────── */
.duo{display:grid;grid-template-columns:1fr 1fr;gap:0}
.duo__item{padding:0 56px;border-left:1px solid var(--rule);display:flex;flex-direction:column;
  gap:14px;align-items:flex-start}
.duo__item:first-child{border-left:0;padding-left:0}

/* ── Closing accent band ──────────────────────────────────────────────────── */
.band{background:var(--accent);color:var(--on-accent)}
.band .lead,.band .small{color:rgba(255,255,255,.82)}
.band .link{border-bottom-color:currentColor}
.band .field label,.band .consent{color:rgba(255,255,255,.86)}
.band .consent a,.band .form__actions a{color:var(--on-accent)}
.band .field input,.band .field textarea{color:var(--fg);border-color:transparent}

/* ── Forms ────────────────────────────────────────────────────────────────── */
.form{display:grid;grid-template-columns:repeat(2,1fr);gap:22px var(--gap)}
.contact-form{max-width:640px}
.field{display:flex;flex-direction:column;gap:8px}
.field--full{grid-column:1/-1}
.field label{font-size:var(--fs-small);color:var(--muted)}
.field input,.field textarea,.field select{
  font:inherit;font-size:var(--fs-body);color:var(--fg);background:var(--surface);
  border:1px solid var(--rule);padding:12px 14px;min-height:44px;border-radius:0;width:100%}
.field textarea{min-height:132px;resize:vertical}
.field input:focus,.field textarea:focus{border-color:var(--accent);outline:none;
  box-shadow:inset 0 0 0 1px var(--accent)}
.field--hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.consent{grid-column:1/-1;display:flex;gap:12px;align-items:flex-start;font-size:var(--fs-small);
  color:var(--muted)}
.consent input{width:24px;height:24px;margin:1px 0 0;flex:0 0 auto;accent-color:var(--accent)}
.form__actions{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:16px;align-items:center}
.form__msg{grid-column:1/-1;font-size:var(--fs-small);border:1px solid var(--rule);padding:14px 16px}
.form__msg[hidden]{display:none}
.form__msg--ok{border-color:var(--accent);color:var(--fg)}
.form__msg--err{border-color:var(--error);color:var(--error)}
.band .form__msg--ok{border-color:var(--on-accent);color:var(--on-accent)}

/* ── Image-placement debug mode (?image-debug=1) ─────────────────────────── */
.image-debug img[data-image-placement]{cursor:crosshair}
.image-debug img[data-image-placement]:hover,
.image-debug img.image-debug__active{outline:6px solid #ffdf00;outline-offset:-6px}
.image-debug__badge{
  position:fixed;z-index:10020;transform:translate(-50%,-50%);pointer-events:none;
  display:grid;place-items:center;min-width:108px;height:108px;padding:0 18px;
  border:6px solid #fff;border-radius:999px;background:#e0006c;color:#fff;
  box-shadow:0 5px 28px rgba(0,0,0,.55);font:700 64px/1 var(--font-body);
  font-variant-numeric:tabular-nums}
.image-debug__badge[hidden]{display:none}
.image-debug__off{
  position:fixed;right:18px;bottom:18px;z-index:10030;min-height:48px;padding:0 18px;
  border:2px solid #fff;background:#141414;color:#fff;box-shadow:0 4px 20px rgba(0,0,0,.4);
  font:600 14px/1 var(--font-body);cursor:pointer}
.image-debug__off:hover{background:#e0006c}

/* ── Footer ───────────────────────────────────────────────────────────────── */
.ftr{border-top:0;padding-top:var(--sp-64);padding-bottom:40px}
.ftr__top{display:grid;grid-template-columns:minmax(260px,1.7fr) 1fr 1fr minmax(250px,1.45fr);gap:48px}
.ftr__brand img{height:15px;width:auto}
.ftr__brand p{margin-top:20px;max-width:34ch;font-size:var(--fs-small);color:var(--muted)}
.ftr__contact{margin-top:20px}
.ftr h2{font-size:var(--fs-eyebrow);font-family:var(--font-body);letter-spacing:.18em;
  text-transform:var(--case-footer-heading);color:var(--muted-strong);font-weight:400;line-height:1;margin-bottom:18px}
.ftr li+li{margin-top:10px}
.ftr a{font-size:var(--fs-small);text-decoration:none;color:var(--fg)}
.ftr a:hover{color:var(--muted)}
.ftr__social{display:flex;flex-wrap:nowrap;gap:10px;margin-top:24px}
.ftr__social a{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:44px;
  width:44px;padding:0;border:1px solid var(--rule);color:var(--fg)}
.ftr__social a:hover{border-color:var(--fg);color:var(--fg)}
.ftr__social img{width:20px;height:20px;object-fit:contain}
.ftr__social a.ftr__social-sashe-link{width:82px}
.ftr__social img.ftr__social-sashe{width:60px;height:20px}
.ftr__utility{grid-column:1/-1;display:flex;flex-direction:column;align-items:flex-start;gap:18px;margin-top:4px}
.ftr__entity{margin:0;font-size:var(--fs-small);line-height:1.6;color:var(--muted-strong);white-space:nowrap}
.payment-marks{display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;margin-top:22px}
.payment-marks__label{width:100%;font-size:var(--fs-small);line-height:1.4;color:var(--muted-strong)}
.payment-marks img{display:block;width:auto;max-height:35px;object-fit:contain}
.payment-marks img[alt^="Mastercard"]{max-height:43px}
.payment-marks--page{margin:20px 0;padding:18px 20px;border:1px solid var(--rule);background:var(--surface)}
.payment-marks--page img{max-height:43px}

/* ── Marker for a missing value or photo ──────────────────────────────────── */
.todo{border:1px dashed var(--muted-strong);color:var(--muted-strong);padding:2px 8px;font-size:var(--fs-small);
  display:inline-block}

/* ── Long-form pages (privacy policy) ─────────────────────────────────────── */
.prose{max-width:72ch}
.prose h2{font-size:var(--fs-h3);margin-top:48px}
.prose h2:first-child{margin-top:0}
.prose p,.prose ul{margin-top:14px;font-size:var(--fs-body);color:var(--muted)}
.prose li{padding-left:18px;position:relative}
.prose li::before{content:"—";position:absolute;left:0}
.prose a{color:var(--fg)}
.commerce-disclosure{max-width:72ch;margin-top:24px;color:var(--muted)}
.commerce-disclosure a{color:inherit;text-underline-offset:3px}
.work__specs{display:grid;gap:8px;margin-top:2px;font-size:var(--fs-small);line-height:1.55;color:var(--muted)}
.work__specs>div{display:grid;grid-template-columns:72px 1fr;gap:10px;padding-top:8px;border-top:1px solid var(--rule)}
.work__specs dt{color:var(--muted-strong)}
.work__specs dd{margin:0}
.product-guide{margin-top:8px}

/* ── Utilities ────────────────────────────────────────────────────────────
   These exist so no template needs an inline style= attribute: the CSP in
   .htaccess sets style-src 'self', which blocks inline styles outright
   (issue #24). Everything here used to be an inline style in build.mjs.  */
.w-full{width:100%}
.stack--tight{gap:10px}
.stack--sm{gap:24px}
.stack--md{gap:28px}
.stack--lg{gap:32px}
.stack--xl{gap:36px}
.mw-34{max-width:34ch}
.mw-52{max-width:52ch}
.mt-8{margin-top:8px}
.mt-16{margin-top:16px}
.grid--center{align-items:center}
.split__media--400{--h:400px}
.split__media--460{--h:460px}
.split__media--560{--h:560px}
.args__item--quiet{border-top-color:var(--rule)}

/* ── Type specimen page (/vzorkovnik/, noindex) ───────────────────────────
   Only used by the font regression page; safe to delete with it.         */
.spec{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap)}
.spec__col{border:1px solid var(--rule);background:var(--surface);padding:40px;
  display:flex;flex-direction:column;gap:22px;align-items:flex-start}
/* The alternate column just re-points the two font tokens locally — every
   rule in this file reads them through var(), so nothing else needs saying.
   font-family has to be restated because inheritance carries the computed
   value from <body>, not the variable. */
.spec__col--alt{--font-heading:'WR Alt Heading',Georgia,serif;
  --font-body:'WR Alt Body','Helvetica Neue',Helvetica,sans-serif;
  font-family:var(--font-body)}
.spec__pangram{font-size:22px;line-height:1.5}
.spec__glyphs{font-family:var(--font-body);font-size:54px;line-height:1.25;letter-spacing:.03em;word-break:break-word}
.spec__glyphs--heading{font-family:var(--font-heading);font-weight:var(--weight-heading)}
.spec__pangram--heading{font-family:var(--font-heading);font-weight:var(--weight-heading);letter-spacing:var(--heading-tracking)}
.spec__label{font-size:var(--fs-small);color:var(--muted-strong);letter-spacing:.14em;
  text-transform:uppercase}
.spec .quote{text-align:left;margin:0;max-width:none}


/* ── Mobile layout: one breakpoint, shared by tablets and phones ─────────── */
@media (max-width:1023px){
  body.nav-open{overflow:hidden}
  .nav{position:absolute;top:100%;left:0;right:0;flex-direction:column;align-items:stretch;gap:0;
    background:var(--surface);border:1px solid var(--rule);padding:0 var(--pad);display:none;
    box-shadow:0 24px 56px rgba(20,20,20,.22)}
  .nav.is-open{display:flex}
  .nav a{padding:14px 0;border-top:1px solid var(--rule);font-size:var(--fs-body)}
  .nav a:first-child{border-top:0}
  .nav a[aria-current="page"]{box-shadow:none;text-decoration:underline;text-decoration-thickness:2px;
    text-underline-offset:5px}
  .nav__toggle{display:inline-flex;order:3;transition:background-color .15s linear,color .15s linear}
  .nav__toggle[aria-expanded="true"]{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
  .nav__toggle[aria-expanded="true"] i{background:transparent}
  .nav__toggle[aria-expanded="true"] i::before{top:0;transform:rotate(45deg)}
  .nav__toggle[aria-expanded="true"] i::after{top:0;transform:rotate(-45deg)}
  .nav__scrim{position:fixed;inset:0;z-index:1;background:rgba(20,20,20,.28);
    -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}
  .nav__scrim:not([hidden]){display:block}
  .hdr__cta{margin-left:auto;order:2;height:44px;min-height:44px;padding-top:0;padding-bottom:0}
}

@media (max-width:1023px){
  :root{--pad:24px;--sp-64:56px;--sp-72:56px;--sp-80:56px;--sp-88:56px;--sp-96:56px;
    --fs-h1:38px;--fs-h2:30px;--fs-h3:22px}
  .hero{min-height:520px}
  .hdr__inner{align-items:center;gap:12px}
  .hdr__logo{align-items:center;padding:0}
  .hdr__cta{padding-left:16px;padding-right:16px}
  .facts{grid-template-columns:repeat(2,1fr)}
  .facts__item{padding:22px 18px}
  .facts__item:nth-child(odd){border-left:0;padding-left:0}
  .facts__item:nth-child(n+3){border-top:1px solid var(--rule)}
  .split,.split--mirror,.split--narrow,.split--wide{grid-template-columns:1fr;gap:28px}
  .split--mirror .split__media{order:0}
  .split__media{height:300px}
  .col-5,.col-6,.col-7{grid-column:1 / -1}
  .cards,.cards--2,.args,.works,.duo,.gallery,.form{grid-template-columns:1fr}
  .tiles{grid-template-columns:repeat(2,1fr)}
  .workshop-card{grid-template-columns:1fr;gap:20px;padding:0 0 20px}
  .workshop-card__media{width:100%;min-width:0;height:auto;min-height:0;aspect-ratio:16/10}
  .workshop-card__body,.workshop-card__purchase{padding-left:20px;padding-right:20px}
  .workshop-card__purchase{grid-column:auto;display:grid;grid-template-columns:1fr auto;gap:8px 16px}
  .workshop-card__price{margin:0}
  .workshop-card__state{margin:0;text-align:right;align-self:center}
  .workshop-card__action{grid-column:1/-1;margin-top:8px}
  .workshop-card__action .btn{width:100%}
  .workshop-card__pay{width:100%}
  .term__msg{max-width:none}
  .spec{grid-template-columns:1fr}
  .spec__col{padding:28px}
  .spec__glyphs{font-size:44px}
  .faq__item{grid-template-columns:1fr;gap:10px}
  .headrow{flex-direction:column;align-items:flex-start;gap:14px}
  .headrow>:last-child{text-align:left}
  .path__item{grid-template-columns:1fr;gap:6px}
  .duo__item{padding:0;border-left:0}
  .duo__item+.duo__item{border-top:1px solid var(--rule);padding-top:32px;margin-top:32px}
  .gallery img{height:220px}
  .ftr__top{grid-template-columns:1fr;gap:32px}
  .ftr__brand{margin-bottom:0}
  .ftr li a{display:inline-flex;align-items:center;min-height:44px}
  .ftr li+li{margin-top:0}
  .ftr__utility{gap:24px;margin-top:0}
  .ftr__entity{white-space:normal}
  .payment-marks{gap:12px 16px}
  .payment-marks--page{padding:16px}
  .work__specs>div{grid-template-columns:84px 1fr}
  .btn-row{flex-direction:column;align-items:stretch;width:100%}
}

@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
}
@media print{.hdr,.nav,.ftr__social{display:none}}

/* ── Home ─────────────────────────────────────────────────────────────────
   Compact path from the offer to workshops, company work and the studio. */
.home-band--base{background:var(--bg)}
.home-band--workshops{background:var(--surface-alt)}
.home-band--products{background:var(--surface)}
.home-band--company{
  --fg:#fff;--muted:rgba(255,255,255,.76);--muted-strong:rgba(255,255,255,.86);
  --rule:rgba(255,255,255,.3);background:var(--accent);color:var(--on-accent)}
.home-band--company .lead,.home-band--company .home-company__facts span{color:var(--muted)}
.home-band--company .eyebrow{color:var(--muted-strong)}
.home-hero .hero__inner{padding-top:96px;padding-bottom:96px}
.home-hero h1{font-size:var(--fs-h2)}
.home-hero .btn-row{align-items:stretch}
.home-hero .btn-row .btn{width:260px}
.home-hero__layout{display:grid;grid-template-columns:minmax(300px,.72fr) minmax(620px,1.5fr);
  gap:48px;align-items:center}
.home-collage{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:560px;
  gap:12px}
.home-collage__item{min-width:0;overflow:hidden}
.home-collage__item picture,.home-collage__item img{display:block;width:100%;height:100%}
.home-collage__item img{object-fit:cover}
.home-collage__item--prepared img{object-position:center}
.home-collage__item--process img{object-position:center 44%}
.home-collage__item--result img{object-position:center}

.home-gallery{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.home-gallery__item{margin:0;height:320px;overflow:hidden;background:var(--surface)}
.home-gallery__item img{width:100%;height:100%;object-fit:cover}

.home-company__facts{display:grid;grid-template-columns:repeat(3,1fr);width:100%;border-top:1px solid var(--rule)}
.home-company__facts li{display:flex;flex-direction:column;gap:4px;padding:16px 16px 0 0}
.home-company__facts strong{font-family:var(--font-body);font-weight:600;font-size:var(--fs-h3)}
.home-company__facts span{font-size:var(--fs-small);line-height:1.45;color:var(--muted)}

.home-founder .split{grid-template-columns:minmax(320px,4fr) minmax(0,6fr);
  gap:64px}
.home-founder .split__media--portrait{height:500px}
.home-founder__links{display:flex;flex-wrap:wrap;gap:12px 32px}

/* Text and outline actions on accent sections. */
.band .link{color:var(--on-accent)}
.band .link:hover{color:rgba(255,255,255,.8);border-bottom-color:rgba(255,255,255,.8)}
.band .btn--ghost{background:transparent;color:var(--on-accent);border-color:rgba(255,255,255,.55)}
.band .btn--ghost:hover{background:var(--on-accent);color:var(--accent);border-color:var(--on-accent)}

@media (max-width:1023px){
  .home-hero__layout{grid-template-columns:1fr}
  .home-collage{order:-1;grid-template-columns:1fr;grid-template-rows:260px;gap:0}
  .home-collage__item{display:none}
  .home-collage__item--result{display:block}
  .home-gallery{grid-template-columns:repeat(2,1fr)}
  .home-gallery__item{height:210px}
  .home-founder .split{grid-template-columns:1fr;gap:28px}
  .home-founder .split__media--portrait{height:420px}
  .home-hero~.section .link{display:inline-flex;align-items:center;min-height:44px}
  .home-hero .hero__inner{padding-top:56px;padding-bottom:56px}
  .home-hero .btn-row .btn{width:100%}
  .home-company__facts{grid-template-columns:1fr}
  .home-company__facts li{flex-direction:row;justify-content:space-between;align-items:baseline;
    padding:12px 0;border-bottom:1px solid var(--rule)}
  .home-founder .split__media--portrait{height:340px}
}

/* ── #30 pre-firmy ── */
.pricelist{list-style:none;border-top:1px solid var(--rule)}
.pricelist__row{display:grid;grid-template-columns:4fr 3fr 5fr;gap:var(--gap);align-items:baseline;
  padding:20px 0;border-bottom:1px solid var(--rule)}
.pricelist__who{font-family:var(--font-heading);font-weight:var(--weight-heading);font-size:var(--fs-h3);
  line-height:1.25}
.pricelist__qual{display:block;margin-top:6px;font-family:var(--font-body);font-weight:400;
  font-size:var(--fs-small);color:var(--muted)}
.pricelist__price{font-family:var(--font-body);font-weight:600;font-size:var(--fs-h3);white-space:nowrap}
.pricelist__note{font-size:var(--fs-small);color:var(--muted)}
.teaser{display:flex;flex-wrap:wrap;gap:20px var(--gap);align-items:center;
  justify-content:space-between;border-top:2px solid var(--accent-text);padding-top:22px}
.teaser__text{max-width:46ch}
.teaser__actions{display:flex;flex-wrap:wrap;gap:14px 20px;align-items:center}
.b2b-quick .teaser{border-top:0;padding-top:0}
.b2b-quick .teaser__text{font-size:var(--fs-body);line-height:1.65}
.b2b-quick .teaser__actions .small a{color:var(--on-accent)}
.dopyt{display:flex;flex-direction:column;align-items:flex-start;gap:36px;max-width:960px;margin:0 auto}
@media (min-width:1024px){
  .dopyt__lead{order:1}
  .dopyt__form{order:2}
}
@media (max-width:1023px){
  .pricelist__row{grid-template-columns:1fr auto;gap:6px 18px;padding:18px 0}
  .pricelist__price{grid-row:1;grid-column:2;text-align:right}
  .pricelist__note{grid-column:1/-1}
  .teaser{flex-direction:column;align-items:flex-start;gap:16px}
  .teaser__actions{flex-direction:column;align-items:stretch;width:100%}
  .teaser__actions .btn{width:100%;justify-content:center}
  .process-steps .card{border-right:0;border-bottom:1px solid var(--rule);padding:0 0 28px}
  .process-steps .card:last-child{border-bottom:0}
}

/* ── #31 atelier ──────────────────────────────────────────────────────────
   Credentials line folded into the "Cesta" section (replaces the standalone
   facts strip), the quiet proof block for cenotvorba.com, and a three-column
   variant of .duo for the closing links.                                   */
.creds{font-size:var(--fs-small);line-height:1.8;color:var(--muted-strong);max-width:none}
.proof{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:40px;align-items:center;
  border:1px solid var(--rule);background:var(--surface);padding:32px;width:100%}
.proof__media{min-width:0;background:var(--surface-alt);overflow:hidden}
.proof__media img{width:100%;height:100%;aspect-ratio:4/3;object-fit:cover;object-position:top left}
.proof__body{display:flex;flex-direction:column;align-items:flex-start;gap:16px}
.proof__text{margin-top:0;font-size:var(--fs-body);line-height:1.65;color:var(--muted);max-width:none}
.proof .small{margin-top:14px}
.proof .link{margin-top:0}
.technique-groups{display:grid;grid-template-columns:repeat(3,1fr);gap:40px}
.technique-group{border-top:1px solid var(--fg);padding-top:20px}
.technique-group h3{font-family:var(--font-heading);font-size:var(--fs-h3);font-weight:var(--weight-heading);letter-spacing:var(--heading-tracking)}
.technique-group ul{margin-top:16px}
.technique-group li{padding:8px 0;border-top:1px solid var(--rule);font-size:var(--fs-body);color:var(--muted)}
.duo--three{grid-template-columns:repeat(3,1fr)}
@media (max-width:1023px){
  .proof{grid-template-columns:1fr;padding:20px;gap:24px}
  .technique-groups{grid-template-columns:1fr;gap:32px}
  .duo--three{grid-template-columns:1fr}
}

/* ── #34 legal ──────────────────────────────────────────────────────────────
   Footer merchant identity + legal links, and the three legal documents
   (/obchodne-podmienky/, /ochrana-osobnych-udajov/, /cookies/). Colours and
   fonts come from the switchboard only — nothing is hardcoded here. */

/* Footer legal links share the one bottom row defined with the footer above. */
.ftr__legal-links a:hover{color:var(--fg)}

/* Notice under a checkout button — 108/2024 requires the terms to be shown
   before the order is placed, not a checkbox. */
.pay-note{font-size:var(--fs-small);line-height:1.6;color:var(--muted);max-width:30ch}
.pay-note a{color:var(--fg)}

/* Legal documents */
.legal-meta{font-size:var(--fs-small);color:var(--muted-strong);padding-bottom:20px;
  border-bottom:1px solid var(--rule)}
.legal-toc{margin-top:28px;padding:22px 24px;background:var(--surface-alt)}
.legal-toc__label{font-size:var(--fs-eyebrow);letter-spacing:.26em;text-transform:uppercase;
  color:var(--muted-strong);margin:0 0 12px}
.legal-toc ul{display:flex;flex-wrap:wrap;gap:8px 24px}
.legal-toc li{font-size:var(--fs-small)}
.legal-toc a{color:var(--fg);text-decoration:none;border-bottom:1px solid var(--rule)}
.legal-toc a:hover{border-bottom-color:var(--accent)}
.prose h3{font-size:var(--fs-h3);margin-top:26px}
.prose>p:first-child{margin-top:0}
.prose strong{color:var(--fg);font-weight:600}
.legal-flag{margin-top:14px}
/* The statutory withdrawal form, quoted verbatim from príloha č. 2 k zák.
   č. 108/2024 Z. z. — set apart so it reads as a quoted document, not as
   our own prose. */
.legal-form{margin-top:18px;padding:20px 24px;background:var(--surface-alt)}
.legal-form>p:first-child{margin-top:0}

/* Tables inside the documents scroll on their own; the page never does.
   The min()-clamp keeps .prose (a flex item of .stack, which is
   align-items:flex-start and therefore shrink-to-fit) from ever growing
   past the viewport on a narrow screen. */
.prose{max-width:min(72ch,100%)}
.legal-toc,.table-scroll{max-width:100%}
.table-scroll{overflow-x:auto;margin-top:18px}
.legal-table{width:100%;border-collapse:collapse;font-size:var(--fs-small);min-width:520px}
.legal-table th,.legal-table td{text-align:left;vertical-align:top;padding:11px 16px 11px 0;
  border-top:1px solid var(--rule);font-weight:400;color:var(--muted)}
.legal-table thead th{color:var(--muted-strong);border-top:0;border-bottom:1px solid var(--fg);
  font-size:var(--fs-eyebrow);letter-spacing:.16em;text-transform:uppercase;white-space:nowrap}
.legal-table td:last-child,.legal-table th:last-child{padding-right:0}
.table-scroll .specs{min-width:420px}

@media (max-width:1023px){
  .ftr__legal{flex-direction:column;gap:14px}
  .legal-toc ul{flex-direction:column;gap:0}
  .legal-toc li a{display:inline-flex;align-items:center;min-height:40px}
}

/* ── #38 consent ─────────────────────────────────────────────────────────────
   The cookie banner and its settings panel. Built at runtime by
   assets/js/consent.js, which sets no inline styles — everything visual is
   here, because the CSP is `style-src 'self'` with no 'unsafe-inline'.

   Every colour and size comes from the SWITCHBOARD at the top of this file;
   nothing below names a colour or a font. Contrast on the Galéria palette:
   --fg on --surface 16.9:1, --muted-strong on --surface 7.5:1,
   --on-accent on --accent 9.4:1 — all comfortably AA, and AAA for body text.

   The two decisive buttons share ONE class, `.cc__btn`, with no modifier: it
   is not possible to make `Prijať všetko` louder than `Odmietnuť` here
   without deleting a rule, which is the point (EDPB Guidelines 03/2022).  */

.cc{position:fixed;left:0;right:0;bottom:0;z-index:120;
  background:var(--surface);color:var(--fg);
  border-top:1px solid var(--rule);
  box-shadow:0 -2px 24px rgba(0,0,0,.07);
  max-height:88vh;overflow-y:auto;
  animation:cc-in .28s ease-out both}
@keyframes cc-in{from{transform:translateY(100%)}to{transform:translateY(0)}}

.cc__inner{max-width:1180px;margin:0 auto;padding:24px 28px 26px;
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:20px 40px;align-items:start}

.cc__title{font-size:var(--fs-h3);margin:0 0 8px}
.cc__body{font-size:var(--fs-small);line-height:1.65;color:var(--muted-strong);margin:0;max-width:78ch}
.cc__link{color:var(--accent-text);text-underline-offset:3px}

/* Actions. `Prijať všetko` and `Odmietnuť` are the same element in every
   respect a visitor can perceive; `Nastavenia` is the quieter third option
   the guidelines allow next to them. */
.cc__actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:flex-end}
.cc__btn{display:inline-flex;align-items:center;justify-content:center;
  min-height:44px;min-width:148px;padding:10px 22px;
  font-family:var(--font-body);font-size:var(--fs-small);font-weight:500;line-height:1.2;
  color:var(--on-accent);background:var(--accent);
  border:1px solid var(--accent);border-radius:0;cursor:pointer;
  transition:background .15s ease,border-color .15s ease}
.cc__btn:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
.cc__btn--quiet{background:transparent;color:var(--fg);border-color:var(--muted)}
.cc__btn--quiet:hover{background:var(--surface-alt);color:var(--fg);border-color:var(--fg)}

/* Settings panel — spans both columns under the bar when expanded. */
.cc__panel{grid-column:1/-1;border-top:1px solid var(--rule);padding-top:20px;margin-top:2px}
.cc__panel-title{font-size:var(--fs-h3);margin:0 0 14px}
.cc__panel-title:focus-visible{outline:2px solid var(--accent);outline-offset:4px}

.cc__cat{padding:12px 0;border-bottom:1px solid var(--rule)}
.cc__cat-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.cc__check{width:18px;height:18px;accent-color:var(--accent);margin:0;flex:none}
.cc__check:disabled{opacity:.55}
.cc__cat-name{font-weight:500;cursor:pointer}
.cc__check:disabled+.cc__cat-name{cursor:default}
.cc__always{font-size:var(--fs-eyebrow);letter-spacing:.16em;text-transform:uppercase;
  color:var(--muted-strong)}
.cc__cat-desc{font-size:var(--fs-small);line-height:1.6;color:var(--muted-strong);
  margin:4px 0 0 28px;max-width:78ch}

.cc__note{font-size:var(--fs-small);line-height:1.6;color:var(--muted);
  margin:14px 0 0;max-width:78ch}
.cc__panel-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}

/* Keep the fixed bar from covering the end of the page while it is up. */
.has-cc body{padding-bottom:200px}

@media (max-width:1023px){
  .cc__inner{grid-template-columns:1fr;gap:16px;padding:20px 20px 22px}
  .cc__actions{justify-content:stretch}
  .cc__btn{flex:1 1 100%;min-width:0}
  .cc__panel-actions .cc__btn{flex:1 1 100%}
  .has-cc body{padding-bottom:300px}
}

/* The global reduced-motion rule near the top of this file already neutralises
   the slide-in; this states it locally too, so the intent survives a refactor
   of that rule. */
@media (prefers-reduced-motion:reduce){
  .cc{animation:none}
}

/* ── #32 commerce ────────────────────────────────────────────────────────────
   Every product card shows a price and exactly one action, so the action sits
   at the bottom of the card whatever the description above it does. Colours
   and fonts come from the switchboard at the top of this file — nothing is
   hardcoded here. */

/* The product card is an <article> now, not one big link: it contains a form
   (Kúpiť) or a button, and neither may be nested inside an <a>. Only the
   image links on to the piece. */
.work__link{display:block;text-decoration:none}
.work__link:hover{opacity:.9}
.work__action{margin-top:auto;padding-top:4px}
.work__action .btn{width:100%;text-align:center}
.work__notify{color:var(--muted)}

/* The shared Stripe form template — one column, the checkout notice under the
   button. .term__pay (course rows) keeps its own width rules further up. */
.pay-form{display:flex;flex-direction:column;gap:10px;margin:0}
.pay-form .btn{width:100%;text-align:center}
.card__pay{margin-top:4px}

/* /prace/ hero: the H1 used to wrap to about seven lines in a 34ch column
   (issue #32 point 4). The heading is shorter now and the column is wider;
   the 24ch cap `.hero h1` applies to every hero is lifted here because this
   hero carries no photo beside it, so there is room to spend. */
.works-hero__col{max-width:80ch}
.works-hero__col h1{max-width:none}
.works-hero__media{background:var(--surface)}
.works-hero__media img{object-fit:cover;padding:0}

/* /kontakt/ — the note shown when the form arrived prefilled from a product
   card (assets/js/site.js fills the text and unhides it). */
.form__prefill{grid-column:1/-1;font-size:var(--fs-small);color:var(--muted);
  border-left:2px solid var(--accent);padding-left:12px}

@media (max-width:1023px){
  .work__action .btn,.pay-form .btn{width:100%}
}

/* ── #33 social proof ─────────────────────────────────────────────────────
   Attributed quote cards (home, /kurzy/, /pre-firmy/), the B2B client list
   and the "Z minulých kurzov" photo grid. All three render honestly while
   empty: the dashed .todo marker does the visual work, so no rule here may
   hide an unfilled slot.                                                  */

.quotes{display:grid;gap:var(--gap);grid-template-columns:repeat(3,1fr);align-items:start}
.quotecard{border-top:2px solid var(--rule);padding-top:22px;display:flex;flex-direction:column;
  gap:14px;margin:0}
.quotecard__text{font-size:var(--fs-body);line-height:1.65}
.quotecard__by{display:flex;flex-direction:column;gap:6px;align-items:flex-start;
  font-size:var(--fs-small)}
.quotecard__author{font-family:var(--font-heading);font-weight:var(--weight-heading);font-size:var(--fs-body)}
.quotecard__context{color:var(--muted-strong)}

/* A single sentence of proof above the course dates. */
.proofline{font-size:var(--fs-body);line-height:1.65;color:var(--muted-strong);max-width:52ch}

/* B2B client names — plain text, logos can come later. */
.refs{border-top:1px solid var(--rule);padding-top:22px;display:flex;flex-wrap:wrap;
  gap:14px 28px;align-items:baseline}
.refs__label{font-size:var(--fs-eyebrow);line-height:1;letter-spacing:.26em;text-transform:uppercase;
  color:var(--muted-strong)}
.refs__list{list-style:none;display:flex;flex-wrap:wrap;gap:12px 28px;align-items:baseline;margin:0}
.refs__item{font-family:var(--font-heading);font-weight:var(--weight-heading);font-size:var(--fs-h3)}

/* Past-course gallery: photo grid with optional captions, plus an openly
   missing tile for a photo that does not exist yet at all. */
.shots{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap)}
.shot{margin:0;display:flex;flex-direction:column;gap:12px}
.shot__media{height:280px;background:var(--surface-alt)}
.shot__media img{width:100%;height:100%;object-fit:cover}
.shot__media--missing{display:flex;align-items:center;justify-content:center;padding:20px;
  border:1px solid var(--rule);text-align:center}
.shot__cap{font-size:var(--fs-small);line-height:1.65;color:var(--muted-strong)}

@media (max-width:1023px){
  .quotes{grid-template-columns:1fr}
  .shots{grid-template-columns:1fr}
  .shot__media{height:220px}
  .refs{flex-direction:column;align-items:flex-start;gap:12px}
}

/* ── #36 journal ───────────────────────────────────────────────────────────
   /dennik/ index cards, the post page, the consent-gated embed and the one
   closing CTA. Appended at the end of the file on purpose (see the note in
   the issue): every rule here is additive, so a merge that loses the block
   loses the journal's styling and nothing else.

   No colour and no font name is written out below — everything reads the
   SWITCHBOARD tokens at the top of this file, same as the rest of the site.
   ------------------------------------------------------------------------- */

/* ── Journal index / home teaser cards ───────────────────────────────────── */
.journal{display:grid;gap:var(--gap) var(--gap);grid-template-columns:repeat(3,1fr)}
.jpost{display:flex;flex-direction:column;gap:10px}
.jpost__link{display:flex;flex-direction:column;gap:12px;text-decoration:none;color:inherit}
.jpost__media{height:280px}
.jpost__media img{width:100%;height:100%;object-fit:cover}
.jpost__date{font-size:var(--fs-small);color:var(--muted)}
.jpost__title{font-family:var(--font-heading);font-weight:var(--weight-heading);
  font-size:var(--fs-h3);line-height:1.2;max-width:26ch}
.jpost__link:hover .jpost__title{color:var(--muted)}
.jpost__teaser{font-size:var(--fs-small);line-height:1.65;color:var(--muted);max-width:44ch}
/* A placeholder entry is visibly a demo, in the same dashed language as
   .todo — it must never be mistaken for content. */
.jpost--todo{border:1px dashed var(--muted-strong);padding:20px}

/* ── Post page ───────────────────────────────────────────────────────────── */
.post__meta{font-size:var(--fs-small);color:var(--muted)}
.post__media{width:100%;max-width:62ch}
.post__media img{width:100%;height:auto}
.post__source{font-size:var(--fs-small);color:var(--muted)}
.post__source a{color:var(--fg)}

/* The shared .prose is tuned for the legal documents (small, muted). A
   journal entry is the page's main reading text, so it gets body size and
   full contrast. */
.prose--post{max-width:62ch}
.prose--post p,.prose--post ul{font-size:var(--fs-body);color:var(--fg);margin-top:18px}
.prose--post p:first-child{margin-top:0}
.prose--post blockquote{margin-top:18px;padding-left:20px;border-left:2px solid var(--accent);
  font-family:var(--font-heading);font-style:italic;font-size:var(--fs-h3);line-height:1.4}

/* ── Consent-gated embed (issue #36 + #38) ──────────────────────────────────
   The placeholder is what ships in the HTML; the frame is added by
   assets/js/embeds.js only after marketing consent. Both live in the same
   box so the page does not jump when the visitor agrees. */
.embed{width:100%;max-width:540px}
.embed__frame-holder{width:100%}
.embed__frame{width:100%;height:640px;border:0;display:block;background:var(--surface-alt)}
/* Once the Instagram frame has reported its real height the fixed one above
   is replaced from JavaScript (CSSOM, not a style attribute — style-src
   stays 'self'); this just stops the fallback height fighting it. */
.embed__frame--measured{height:auto}

.embed__ph{border:1px solid var(--rule);background:var(--surface);padding:26px;
  display:flex;flex-direction:column;gap:12px;align-items:flex-start}
.embed__ph[hidden]{display:none}
.embed__ph-title{font-family:var(--font-heading);font-weight:var(--weight-heading);font-size:var(--fs-h3)}
.embed__ph-why{font-size:var(--fs-small);line-height:1.65;color:var(--muted-strong);max-width:46ch}
.embed__ph-actions{display:flex;flex-wrap:wrap;gap:16px;align-items:center;margin-top:4px}

/* ── The one closing CTA ─────────────────────────────────────────────────── */
.cta-post{width:100%;max-width:62ch;margin-top:8px;padding:28px;background:var(--surface-alt);
  display:flex;flex-direction:column;gap:16px;align-items:flex-start}
.cta-post__text{font-size:var(--fs-body);line-height:1.6;max-width:52ch}
.cta-post .work--cta{width:100%;max-width:320px}
.cta-post .work--cta .work__media{height:260px}

/* ── Mobile layout ───────────────────────────────────────────────────────── */
@media (max-width:1023px){
  .journal{grid-template-columns:1fr;gap:36px}
  .jpost__media{height:240px}
  .embed{max-width:none}
  .embed__frame{height:560px}
  .embed__ph{padding:20px}
  .cta-post{padding:22px}
  .cta-post .work--cta{max-width:none}
}
