/* ==========================================================================
   SPARSKEY — SERVICE PAGES, PLACEMENT LAYER
   Loads after tokens.css and site.css, and only on the eight public service
   pages (/op-maat, /professionals, /studio, /studio/halil, /contact,
   /journal, /journal/{slug}), pulled in from each view's `head` section.

   Layer 6 of VISUAL-SYSTEM §11: PLACEMENT ONLY. Ported from the approved
   prototype screens and re-scoped from their #screen-* ids to the page hook
   class on <body>:

     prototype/screen-custom.html   #screen-custom   -> .page-custom
     prototype/screen-pro.html      #screen-pro      -> .page-pro
     prototype/screen-studio.html   #screen-studio   -> .page-studio, .page-halil
     prototype/screen-forms.html    #screen-forms    -> .page-contact
     prototype/screen-journal.html  #screen-journal  -> .page-journal, .page-article

   No token is redefined here and no component is restyled. Every value is a
   token, a ratio, or a ch/percentage measure — no raw colours, no magic px.
   The collapse uses @container queries against .sk, exactly as the prototype:
   the same markup genuinely re-flows.

   It sits in its own file rather than in site.css so that parallel work on the
   catalogue pages and on this set cannot collide in one stylesheet.
   ========================================================================== */


/* ==========================================================================
   A · SHARED BY EVERY SERVICE PAGE
   ========================================================================== */

/* Controls inherit the body face: the reset in tokens.css does not reach them. */
.sk :is(input, textarea, select, button, fieldset, legend) { font: inherit; color: inherit; }

/* ...but `color: inherit` above is (0,1,1) and the button variants in
   tokens.css are (0,1,0), so it wins — and a .sk-btn--canvas <button> rendered
   as --text on --ink: navy on navy, an invisible label on every submit control
   on the site. The variants are restored here at (0,2,1) rather than weakened
   in tokens.css, because the design system is layer 1 and this regression
   belongs to the layer that caused it. Anchors were never affected; only
   controls, which is why it survived. */
.sk button.sk-btn--art    { color: var(--ink); }
.sk button.sk-btn--canvas { color: var(--on-dark); }
.sk button.sk-btn--ghost  { color: var(--text); }
.sk fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.sk legend { padding: 0; width: 100%; }

/* Visually hidden, still announced — used for the unit in a dimension label. */
.cst-vh { position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; }

/* The inner-page hero sits inside the container, per VISUAL-SYSTEM §5. */
.svc-inset { padding-top: var(--s7); }

/* HERO — the contained hero with its height released.
   tokens.css pins .sk-hero--contained to 340px, which is right for a short
   English line and clips a longer Dutch one. Keep the 340 as a FLOOR.
   The component writes .sk-h2 on a contained hero's heading; on these pages
   the heading is the page's <h1>, so it takes the H1 step of the same scale.
   Size only — the face, the balance and the tracking are the component's. */
.svc-hero { height: auto; min-height: 340px; }
.svc-hero .sk-hero__body { padding: var(--s8) var(--s7) var(--s7); }
.svc-hero .sk-hero__body > * + * { margin-top: var(--s4); }
.svc-hero h1.sk-h2 { font-size: var(--t-h1); line-height: 1.02; letter-spacing: -.016em; }
.svc-hero .sk-lead { max-width: 52ch; }

/* A note that qualifies the band above it. */
.svc-strip { padding-block: var(--s5); }
.svc-strip .sk-meta { text-transform: none; letter-spacing: 0; line-height: 1.6;
  max-width: 78ch; }

/* OPEN MARKERS — two devices beside the shared .sk-assume from tokens.css.
   .sk-assume marks one unverified VALUE and is written by copy_text().
   .svc-open  marks a whole BLOCK that has no answer yet.
   .svc-flag  is the inline status chip on a row.
   Both print their id from the attribute, so a mark cannot drift from the
   open item it refers to. */
.svc-open { display: block; font-size: var(--t-sm); line-height: 1.55;
  color: var(--muted); border-left: 2px solid var(--accent-line);
  padding: var(--s2) 0 var(--s2) var(--s4); max-width: 68ch; }
.svc-open::before { content: attr(data-open) " · "; font-size: var(--t-label);
  letter-spacing: .12em; font-weight: 600; color: var(--text); }
.on-dark .svc-open, .sk-dark .svc-open { color: var(--on-dark-muted);
  border-left-color: var(--accent-dark); }
.on-dark .svc-open::before, .sk-dark .svc-open::before { color: var(--accent-dark); }

.svc-flag { display: inline-flex; align-items: center; gap: var(--s2);
  font-size: var(--t-label); text-transform: uppercase; letter-spacing: .14em;
  color: var(--muted); }
.svc-flag::before { content: ""; width: 6px; height: 6px; flex: none;
  background: var(--accent-line); }
.svc-flag::after { content: attr(data-open); font-weight: 600; letter-spacing: .1em;
  color: var(--text); }
.on-dark .svc-flag { color: var(--on-dark-muted); }
.on-dark .svc-flag::before { background: var(--accent-dark); }
.on-dark .svc-flag::after { color: var(--accent-dark); }

/* A dark band that carries an editorial block above the four steps. */
.svc-how .sk-editorial { max-width: 62ch; }
.svc-how .sk-steps { margin-top: var(--s8); padding-top: var(--s7);
  border-top: 1px solid var(--line-dark); }

/* A split band whose media half is a tall portrait frame: left free it would
   set a 1700px band with an empty panel beside it. */
.svc-split-tall .sk-split__media { height: clamp(480px, 44cqw, 700px); }

/* Two editorial columns with a hairline between — the homepage's duo pattern,
   reused on /studio and /contact. */
.st-duo { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s8); }
.st-duo > * { min-width: 0; }
.st-duo > .sk-editorial + .sk-editorial { padding-left: var(--s8);
  border-left: 1px solid var(--line); }


/* ==========================================================================
   B · /op-maat — .page-custom
   Ported from prototype/screen-custom.html.
   ========================================================================== */

/* ---- the form: upload half on the ink ground ---- */
.page-custom .cst-upload { background: var(--ink); color: var(--on-dark);
  padding: var(--s9) var(--s7) var(--s9) var(--gutter);
  display: flex; flex-direction: column; justify-content: center; }
.page-custom .cst-upload__in { max-width: 560px; }
.page-custom .cst-upload__in > * + * { margin-top: var(--s5); }
.page-custom .cst-upload h2 { margin-top: var(--s4); }

.page-custom .cst-drop { position: relative; display: flex; flex-direction: column;
  align-items: center; text-align: center; gap: var(--s4);
  padding: var(--s9) var(--s6); cursor: pointer;
  border: 1px dashed rgb(237 233 226 / .38);
  transition: border-color 250ms var(--ease), background 250ms var(--ease); }
.page-custom .cst-drop:hover { border-color: var(--accent-dark);
  background: rgb(237 233 226 / .04); }
.page-custom .cst-drop:has(input:focus-visible) { outline: 2px solid var(--on-dark);
  outline-offset: 3px; }
.page-custom .cst-drop input { position: absolute; width: 1px; height: 1px; opacity: 0; }
.page-custom .cst-drop__icon { width: 48px; height: 48px; stroke: var(--accent-dark);
  fill: none; stroke-width: 1.25; stroke-linecap: round; stroke-linejoin: round; }
.page-custom .cst-drop__t { font-family: var(--f-display); font-size: var(--t-h3);
  line-height: 1.2; }
.page-custom .cst-drop__note { font-size: var(--t-xs); color: var(--on-dark-muted);
  max-width: 36ch; line-height: 1.5; }

.page-custom .cst-extra { position: relative; display: inline-flex; align-items: center;
  gap: var(--s3); min-height: 44px; font-size: var(--t-sm); cursor: pointer;
  border-bottom: 1px solid rgb(237 233 226 / .4); }
.page-custom .cst-extra:hover { border-bottom-color: var(--on-dark); }
.page-custom .cst-extra:has(input:focus-visible) { outline: 2px solid var(--on-dark);
  outline-offset: 4px; }
.page-custom .cst-extra input { position: absolute; width: 1px; height: 1px; opacity: 0; }
.page-custom .cst-extra__opt { color: var(--on-dark-muted); }

.page-custom .cst-eg { display: flex; gap: var(--s4); align-items: flex-start;
  padding-top: var(--s5); border-top: 1px solid var(--line-dark); }
.page-custom .cst-eg img { width: 88px; height: 116px; object-fit: cover; flex: none; }
.page-custom .cst-eg figcaption { font-size: var(--t-xs); color: var(--on-dark-muted);
  line-height: 1.55; }

/* ---- the fields half ---- */
.page-custom .cst-fields { background: var(--paper);
  padding: var(--s9) var(--gutter) var(--s9) var(--s7); }
.page-custom .cst-fields__in { max-width: 660px; }
.page-custom .cst-fields__head { padding-bottom: var(--s7); margin-bottom: var(--s7);
  border-bottom: 1px solid var(--line-strong); }
.page-custom .cst-fields__head h3 { margin-top: var(--s3); }
.page-custom .cst-skip { margin-top: var(--s4); font-size: var(--t-sm); line-height: 1.6; }
.page-custom .cst-example { margin-top: var(--s4); padding-left: var(--s4);
  border-left: 2px solid var(--accent-line); font-size: var(--t-sm); color: var(--muted); }

.page-custom .cst-group + .cst-group { margin-top: var(--s7); padding-top: var(--s7);
  border-top: 1px solid var(--line); }
.page-custom .cst-group__head { display: flex; justify-content: space-between;
  align-items: baseline; gap: var(--s4); margin-bottom: var(--s5); }
.page-custom .cst-tag { font-size: var(--t-label); text-transform: uppercase;
  letter-spacing: .14em; color: var(--muted); white-space: nowrap; }
.page-custom .cst-tag--need { color: var(--accent-text); }

.page-custom .cst-label { display: block; font-size: var(--t-sm); font-weight: 500;
  margin-bottom: var(--s2); }
.page-custom .cst-hint { font-size: var(--t-xs); color: var(--muted); line-height: 1.55;
  margin-top: var(--s3); }
.page-custom .cst-in { width: 100%; min-height: 48px; padding: var(--s3) var(--s4);
  background: var(--canvas); border: 1px solid var(--line-strong);
  border-radius: var(--radius); }
.page-custom .cst-in:hover { border-color: var(--ink); }
.page-custom .cst-in:focus { border-color: var(--ink); background: var(--paper); }
.page-custom textarea.cst-in { min-height: 150px; line-height: 1.6; resize: vertical; }

/* dimensions — 60px tall, the unit inside the field */
.page-custom .cst-dims { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s5); }
.page-custom .cst-dims > * { min-width: 0; }
.page-custom .cst-dim { position: relative; }
.page-custom .cst-dim .cst-in { height: 60px; padding-right: 56px;
  font-size: var(--t-lg); font-variant-numeric: tabular-nums; }
.page-custom .cst-dim__unit { position: absolute; right: var(--s4); bottom: 0; height: 60px;
  display: flex; align-items: center; font-size: var(--t-sm); color: var(--muted);
  pointer-events: none; }

/* style — visual swatches; :has() carries the state, so no script is needed */
.page-custom .cst-swatches { display: flex; flex-wrap: wrap; gap: var(--s5); }
.page-custom .cst-swatch { position: relative; display: flex; flex-direction: column;
  gap: var(--s2); width: 64px; cursor: pointer; }
.page-custom .cst-swatch input { position: absolute; width: 1px; height: 1px; opacity: 0; }
.page-custom .cst-swatch img { width: 64px; height: 64px; object-fit: cover;
  border: 1px solid var(--line); }
.page-custom .cst-swatch__name { font-size: var(--t-xs); line-height: 1.3;
  color: var(--muted); }
.page-custom .cst-swatch:hover img { border-color: var(--ink); }
.page-custom .cst-swatch:has(input:checked) img { border-color: var(--ink);
  outline: 2px solid var(--ink); outline-offset: 2px; }
.page-custom .cst-swatch:has(input:checked) .cst-swatch__name { color: var(--text);
  font-weight: 500; }
/* the selected state is carried by a mark as well as by the outline */
.page-custom .cst-swatch:has(input:checked) .cst-swatch__name::after { content: " \2713"; }
.page-custom .cst-swatch:has(input:focus-visible) img { outline: 2px solid var(--accent-line);
  outline-offset: 2px; }

/* colour — the chip carries a name, never the colour alone */
.page-custom .cst-chips { display: flex; flex-wrap: wrap; gap: var(--s3); }
.page-custom .cst-chip { position: relative; display: inline-flex; align-items: center;
  gap: var(--s3); min-height: 44px; padding: 0 var(--s4); cursor: pointer;
  font-size: var(--t-sm); border: 1px solid var(--line-strong); }
.page-custom .cst-chip input { position: absolute; width: 1px; height: 1px; opacity: 0; }
.page-custom .cst-dot { width: 18px; height: 18px; flex: none;
  border: 1px solid rgb(20 25 30 / .28); }
.page-custom .cst-chip:hover { border-color: var(--ink); }
.page-custom .cst-chip:has(input:checked) { border-color: var(--ink);
  background: var(--canvas-sink); font-weight: 500; }
.page-custom .cst-chip:has(input:checked)::after { content: "\2713"; margin-left: var(--s1); }
.page-custom .cst-chip:has(input:focus-visible) { outline: 2px solid var(--accent-line);
  outline-offset: 2px; }

.page-custom .cst-rows { display: grid; gap: var(--s5); }
.page-custom .cst-rows > * { min-width: 0; }
.page-custom .cst-send { margin-top: var(--s7); padding-top: var(--s7);
  border-top: 1px solid var(--line); }
.page-custom .cst-send > * + * { margin-top: var(--s4); }
.page-custom .cst-fine { font-size: var(--t-xs); color: var(--muted); line-height: 1.6; }
.page-custom .cst-demo { font-size: var(--t-xs); line-height: 1.6; color: var(--muted);
  padding-left: var(--s4); border-left: 2px solid var(--accent-line); }

/* honeypot — off-screen, out of the tab order, out of the accessibility tree */
.cst-trap, .fm-trap { position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; }

/* ---- indicatie ---- */
.page-custom .cst-ind { display: grid; grid-template-columns: 5fr 6fr; gap: var(--s9);
  align-items: start; }
.page-custom .cst-ind > * { min-width: 0; }
.page-custom .cst-ind h2 { margin-top: var(--s4); }
.page-custom .cst-ind p { margin-top: var(--s5); max-width: 60ch; }
.page-custom .cst-dl__row { display: flex; justify-content: space-between; gap: var(--s5);
  padding: var(--s4) 0; border-top: 1px solid var(--line); font-size: var(--t-sm); }
.page-custom .cst-dl__row:first-child { border-top-color: var(--line-strong); }
.page-custom .cst-dl dt { color: var(--muted); }
.page-custom .cst-dl dd { text-align: right; }
.page-custom .cst-range { padding-bottom: var(--s5); }
.page-custom .cst-range .sk-price__fig { line-height: 1.1; font-size: var(--t-h3); }

/* ---- wat je terugkrijgt ---- */
.page-custom .cst-duo { display: grid; grid-template-columns: 6fr 5fr; gap: var(--s8);
  align-items: start; }
.page-custom .cst-duo > * { min-width: 0; }
.page-custom .cst-duo > * + * { border-left: 1px solid var(--line); padding-left: var(--s8); }
.page-custom .cst-time { margin-top: var(--s5); }
.page-custom .cst-time__row { display: grid; grid-template-columns: 40% 1fr; gap: var(--s4);
  padding: var(--s4) 0; border-top: 1px solid var(--line); }
.page-custom .cst-time__row > * { min-width: 0; }
.page-custom .cst-time__row:first-child { border-top-color: var(--line-strong); }
.page-custom .cst-time dt { font-size: var(--t-xs); line-height: 1.5; color: var(--muted); }
.page-custom .cst-time dd { font-size: var(--t-sm); }


/* ==========================================================================
   C · /professionals — .page-pro
   Ported from prototype/screen-pro.html.
   ========================================================================== */

.page-pro .pro-status { display: grid; grid-template-columns: 8fr 4fr; gap: var(--s7);
  align-items: start; margin-top: var(--s8); padding-block: var(--s6);
  border-block: 1px solid var(--line); }
.page-pro .pro-status > * { min-width: 0; }
.page-pro .pro-status p { max-width: 62ch; }
.page-pro .pro-status__tally { text-align: right; }
.page-pro .pro-status__fig { display: block; font-family: var(--f-display);
  font-size: var(--t-h3); line-height: 1; color: var(--text); }

/* AUDIENCES — staggered, never a card row. Each row steps one column further
   right than the one above it, so the band reads as an editorial descent. */
.page-pro .pro-aud__h { margin-top: var(--s4); max-width: 20ch; }
.page-pro .pro-aud { margin-top: var(--s8); }
.page-pro .pro-aud > li { display: grid; grid-template-columns: repeat(12, 1fr);
  gap: var(--s5); padding-block: var(--s7); border-top: 1px solid var(--line); }
.page-pro .pro-aud > li > * { min-width: 0; }
.page-pro .pro-aud > li:last-child { border-bottom: 1px solid var(--line); }
/* Written out per row: grid line numbers are <integer> only, so no loop. */
.page-pro .pro-aud > li:nth-child(1) .pro-aud__head { grid-column: 1 / span 4; }
.page-pro .pro-aud > li:nth-child(1) .pro-aud__body { grid-column: 6 / span 5; }
.page-pro .pro-aud > li:nth-child(2) .pro-aud__head { grid-column: 2 / span 4; }
.page-pro .pro-aud > li:nth-child(2) .pro-aud__body { grid-column: 7 / span 5; }
.page-pro .pro-aud > li:nth-child(3) .pro-aud__head { grid-column: 3 / span 4; }
.page-pro .pro-aud > li:nth-child(3) .pro-aud__body { grid-column: 8 / span 5; }
.page-pro .pro-aud__n { display: block; font-family: var(--f-display);
  font-size: var(--t-lg); line-height: 1; color: var(--muted); margin-bottom: var(--s3); }
.page-pro .pro-aud__body > * + * { margin-top: var(--s4); }

/* TECHNISCHE INFORMATIE */
.page-pro .pro-tech { display: grid; grid-template-columns: 5fr 7fr; gap: var(--s8); }
.page-pro .pro-tech > * { min-width: 0; }
.page-pro .pro-tech__intro > * + * { margin-top: var(--s5); }
.page-pro .pro-tech figcaption { font-size: var(--t-xs); color: var(--muted);
  line-height: 1.5; margin-top: var(--s3); max-width: 52ch; }
.page-pro .pro-tech__table > * + * { margin-top: var(--s6); }
.page-pro .pro-strip img { width: 100%; height: 120px; object-fit: cover; }

/* DOWNLOADS — a manifest, not a row of dead links. */
.page-pro .pro-dl__h { margin-top: var(--s4); max-width: 22ch; }
.page-pro .pro-dl__lede { margin-top: var(--s5); max-width: 64ch; }
.page-pro .pro-dl__open { margin-top: var(--s6); }
.page-pro .pro-dl { margin-top: var(--s7); border-top: 1px solid var(--line); }
.page-pro .pro-dl > li { display: grid; grid-template-columns: 4fr 4fr 4fr; gap: var(--s5);
  align-items: baseline; padding-block: var(--s5); border-bottom: 1px solid var(--line); }
.page-pro .pro-dl > li > * { min-width: 0; }
.page-pro .pro-dl__name { font-size: var(--t-lg); color: var(--muted); }
.page-pro .pro-dl__form { font-size: var(--t-sm); color: var(--muted); }
.page-pro .pro-dl__stat { justify-self: end; text-align: right; }
.page-pro .pro-dl__foot { margin-top: var(--s6); max-width: 64ch; }

/* VERWACHTEN — dark, four open questions. */
.page-pro .pro-exp { display: grid; grid-template-columns: 5fr 7fr; gap: var(--s8); }
.page-pro .pro-exp > * { min-width: 0; }
.page-pro .pro-exp__intro > * + * { margin-top: var(--s5); }
.page-pro .pro-q > li { padding-block: var(--s6); border-top: 1px solid var(--line-dark); }
.page-pro .pro-q > li:first-child { border-top: 0; padding-top: 0; }
.page-pro .pro-q h3 { max-width: 30ch; }
.page-pro .pro-q p { font-size: var(--t-sm); color: var(--on-dark-muted);
  max-width: 56ch; margin-top: var(--s3); }
.page-pro .pro-q .svc-flag { margin-top: var(--s4); }

/* REFERENTIES */
.page-pro .pro-ref { display: grid; grid-template-columns: 4fr 8fr; gap: var(--s8);
  align-items: start; }
.page-pro .pro-ref > * { min-width: 0; }
.page-pro .pro-ref__intro > * + * { margin-top: var(--s5); }
.page-pro .pro-ref__thumbs .sk-grid { grid-template-columns: 1fr 1fr; }


/* ==========================================================================
   D · /studio and /studio/halil — .page-studio, .page-halil
   Ported from prototype/screen-studio.html.
   ========================================================================== */

.page-studio .st-hero__cap { margin-top: var(--s5); max-width: 78ch;
  text-transform: none; letter-spacing: 0; line-height: 1.6; }

/* THE EMPTY PLATE — the honest substitute for a photograph nobody has taken
   yet (OPEN-49). A dashed hairline, so it can never be mistaken for content,
   and no image is ever put inside it. */
.st-plate { background: var(--canvas-sink); display: grid; place-items: center;
  padding: var(--s7) var(--gutter); }
.st-plate__inner { width: 100%; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: var(--s3); text-align: center;
  padding: var(--s6); border: 1px dashed var(--line-strong); }
.st-plate__inner--portrait { max-width: 420px; aspect-ratio: 4 / 5; }
.st-plate__inner--wide { max-width: 1080px; aspect-ratio: 21 / 9; min-height: 320px; }
.st-plate__line { font-size: var(--t-sm); line-height: 1.5; max-width: 38ch; }
.st-plate__note { font-size: var(--t-xs); color: var(--muted); max-width: 38ch; }

/* Placeholder copy is flagged in the layout, not only in a footnote. */
.st-flag { display: inline-flex; align-items: center; gap: var(--s2);
  font-size: var(--t-label); text-transform: uppercase; letter-spacing: .16em;
  font-weight: 600; color: var(--warning); border: 1px dashed var(--warning);
  padding: var(--s1) var(--s3); }
.st-draft { border-left: 2px solid var(--warning); padding-left: var(--s5); }
.st-draft > * + * { margin-top: var(--s4); }
.st-note { font-size: var(--t-sm); color: var(--muted); }

/* HET HANDSCHRIFT — three works at three sizes on a 12-column field,
   staggered vertically. Deliberately not a three-card row. */
.page-studio .st-hand { display: grid; grid-template-columns: repeat(12, 1fr);
  column-gap: var(--s5); align-items: start; }
.page-studio .st-hand > * { min-width: 0; }
.page-studio .st-hand__intro { grid-column: 1 / span 4; grid-row: 1; }
.page-studio .st-hand__intro > * + * { margin-top: var(--s4); }
.page-studio .st-hand__a { grid-column: 6 / span 7; grid-row: 1; }
.page-studio .st-hand__b { grid-column: 2 / span 5; grid-row: 2;
  margin-top: calc(var(--s9) * -1); }
.page-studio .st-hand__c { grid-column: 8 / span 4; grid-row: 2; margin-top: var(--s8); }
.page-studio .st-hand figcaption { margin-top: var(--s3); text-transform: none;
  letter-spacing: 0; }
.page-studio .st-marks > li { padding: var(--s3) 0; border-top: 1px solid var(--line);
  font-size: var(--t-sm); line-height: 1.5; }
.page-studio .st-marks > li:last-child { border-bottom: 1px solid var(--line); }
.page-studio .st-marks b { font-weight: 500; }

/* ATELIER — a full-width image band with no image, because none exists. */
.page-studio .st-atelier { padding-block: var(--s9); }
.page-studio .st-atelier__head { margin-bottom: var(--s7); }
.page-studio .st-atelier__head > * + * { margin-top: var(--s4); }
.page-studio .st-atelier__cap { margin-top: var(--s5); max-width: 72ch; }

/* MATERIALEN */
.page-studio .st-mat { display: grid; grid-template-columns: 4fr 6fr;
  gap: var(--s7) var(--s9); align-items: start; }
.page-studio .st-mat > * { min-width: 0; }
.page-studio .st-mat__intro > * + * { margin-top: var(--s4); }

/* ---- /studio/halil ---- */
.page-halil .hal-head__in > * + * { margin-top: var(--s4); }
.page-halil .hal-head__in { max-width: 68ch; }
.page-halil .hal-crumb { margin-bottom: var(--s3); }
.page-halil .hal-name { font-size: var(--t-sm); padding-top: var(--s5);
  border-top: 1px solid var(--line); }
/* The measure is capped on the panel's children, never on the panel itself:
   a max-width on the grid item would pull the paper ground off the edge. */
.page-halil .hal-panel > * { max-width: 62ch; }
.page-halil .hal-say > * + * { margin-top: var(--s5); }
.page-halil .hal-say { max-width: 68ch; }


/* ==========================================================================
   E · /contact — .page-contact
   Ported from prototype/screen-forms.html. The swatch picker that shared this
   section belonged to /samples, which was removed from scope
   (docs/PRODUCT.md §8, decision 2026-09-12).
   ========================================================================== */

.fm-example { margin-top: var(--s4); padding-left: var(--s4);
  border-left: 2px solid var(--accent-line); font-size: var(--t-sm); color: var(--muted); }


/* FIELDS — the label is ALWAYS above the control, never a placeholder. */
.fm-stack { margin-top: var(--s6); }
.fm-stack > * + * { margin-top: var(--s5); }
.fm-field { display: flex; flex-direction: column; gap: var(--s2); min-width: 0; }
.fm-label { font-size: var(--t-label); text-transform: uppercase; letter-spacing: .14em;
  font-weight: 500; color: var(--muted); overflow-wrap: break-word; }
.fm-label .fm-opt { text-transform: none; letter-spacing: 0; font-weight: 400; }
.fm-input { width: 100%; min-height: 48px; padding: var(--s3) var(--s4);
  font-family: var(--f-body); font-size: var(--t-sm); line-height: 1.4; color: var(--text);
  background: var(--paper); border: 1px solid var(--line-strong);
  border-radius: var(--radius); }
textarea.fm-input { min-height: 152px; line-height: 1.6; resize: vertical; }
.fm-input:hover { border-color: var(--ink); }
.fm-input:focus { border-color: var(--ink); }
.fm-hint { font-size: var(--t-xs); color: var(--muted); line-height: 1.5; }
.fm-error { font-size: var(--t-xs); color: var(--danger); line-height: 1.5; }
.fm-row { display: grid; gap: var(--s4); align-items: start; }
.fm-row > * { min-width: 0; }
.fm-row--street { grid-template-columns: 1fr 96px 116px; }
.fm-row--city { grid-template-columns: 148px 1fr; }
/* Guest-first, stated above the fields (USER-FLOWS F2). */
.fm-guest { margin-top: var(--s5); border-left: 2px solid var(--accent-line);
  padding-left: var(--s4); font-size: var(--t-sm); line-height: 1.6; }
.fm-guest strong { font-weight: 600; }
.fm-note { font-size: var(--t-xs); color: var(--muted); line-height: 1.6; max-width: 64ch; }
/* The work carried in on /contact?werk={slug}. It sits above the fields
   because it is the answer to "does this form know what I was looking at". */
.fm-context { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s2);
  margin-top: var(--s4); }
.fm-context a { color: var(--text); text-underline-offset: 3px; }
.fm-context a:hover { color: var(--ink); }

/* THE FORM ANSWERS BACK. Until 2026-09-12 it could not: no method, no action,
   no submit. These three states are what wiring it up made necessary.
   - .fm-alert   one sentence above the form: the submission was refused, or
                 could not be stored. Never a field message.
   - .fm-field--bad  the field itself carries the fault, so the reason is where
                 the correction is made (CLAUDE.md 27, designed error states).
   - .fm-thanks  what replaces the form once the message is stored. */
.fm-alert { margin-top: var(--s5); padding: var(--s4) var(--s5);
  border-left: 3px solid var(--danger); background: var(--paper);
  font-size: var(--t-sm); line-height: 1.55; max-width: 64ch; }
.fm-field--bad .fm-input { border-color: var(--danger); }
.fm-field--bad .fm-label { color: var(--danger); }
.fm-thanks { max-width: 64ch; }
.fm-thanks p { margin-top: var(--s4); font-size: var(--t-sm); line-height: 1.7; }
.fm-thanks__act { display: flex; flex-wrap: wrap; gap: var(--s3); margin-top: var(--s6); }


/* CONTACT */
.page-contact .fm-contact { display: grid; grid-template-columns: 7fr 5fr; gap: var(--s9);
  align-items: start; }
.page-contact .fm-contact > * { min-width: 0; }
.page-contact .fm-contact__t { margin-top: var(--s4); }
.page-contact .fm-side__t { margin-top: var(--s4); margin-bottom: var(--s4); }
.page-contact .fm-side .svc-open { margin-top: var(--s4); }
.page-contact .fm-details { border-top: 1px solid var(--line); margin-top: var(--s6); }
.page-contact .fm-details > div { display: grid; grid-template-columns: 136px 1fr;
  gap: var(--s4); padding: var(--s4) 0; border-bottom: 1px solid var(--line); }
.page-contact .fm-details > div > * { min-width: 0; }
.page-contact .fm-details dt { font-size: var(--t-label); text-transform: uppercase;
  letter-spacing: .14em; color: var(--muted); }
.page-contact .fm-details dd { font-size: var(--t-sm); line-height: 1.6; }
.page-contact .fm-side__foot { margin-top: var(--s5); }


/* ==========================================================================
   F · /journal and /journal/{slug} — .page-journal, .page-article
   Ported from prototype/screen-journal.html.
   ========================================================================== */

.page-journal, .page-article { --container-narrow: 680px; }

/* THE LIST — an editorial list, not a card grid (VISUAL-SYSTEM §3.5). */
.page-journal .jr-list-head { display: flex; align-items: baseline;
  justify-content: space-between; gap: var(--s5); margin-bottom: var(--s6); }
.page-journal .jr-list__t { margin-top: var(--s3); }
.page-journal .jr-list { border-top: 1px solid var(--line-strong); }
.page-journal .jr-list > li { border-bottom: 1px solid var(--line); }
.page-journal .jr-row { display: grid; grid-template-columns: 190px 1fr 132px;
  gap: var(--s7); align-items: center; padding-block: var(--s5); }
.page-journal .jr-row > * { min-width: 0; }
.page-journal .jr-row__meta { display: flex; flex-direction: column; gap: var(--s2);
  font-size: var(--t-xs); color: var(--muted); }
.page-journal .jr-row__cat { color: var(--accent-text); text-transform: uppercase;
  letter-spacing: .14em; }
.page-journal .jr-row__t { display: block; transition: color 250ms var(--ease); }
.page-journal .jr-row__s { display: block; font-size: var(--t-sm); color: var(--muted);
  margin-top: var(--s2); max-width: 62ch; }
.page-journal .jr-row__thumb { overflow: hidden; background: var(--canvas-sink); }
.page-journal .jr-row__thumb img { width: 132px; height: 120px; object-fit: cover;
  transition: transform 500ms var(--ease); }
.page-journal .jr-row:hover .jr-row__thumb img { transform: scale(1.02); }
.page-journal .jr-row:hover .jr-row__t { color: var(--accent-text); }
.page-journal .jr-list__foot { display: flex; flex-direction: column; align-items: center;
  gap: var(--s3); margin-top: var(--s7); text-align: center; }
/* The disabled state is designed, not defaulted (CLAUDE.md quality rule 25). */
.page-journal .jr-list__foot .sk-btn[disabled] { opacity: .5; cursor: not-allowed;
  border-color: var(--line); }
.page-journal .jr-list__note { font-size: var(--t-xs); color: var(--muted); }

/* ARTICLE HEADER — locked to the same axis as the reading column. */
.page-article .jr-art-head { max-width: var(--container-narrow); margin-inline: auto; }
.page-article .jr-crumb { margin-bottom: var(--s5); }
.page-article .jr-art-head h1 { margin-block: var(--s4) var(--s5); }
.page-article .jr-art-head .sk-lead { max-width: none; }
.page-article .jr-byline { display: flex; flex-wrap: wrap; gap: var(--s4) var(--s5);
  margin-top: var(--s7); padding-block: var(--s4); border-block: 1px solid var(--line);
  font-size: var(--t-xs); color: var(--muted); }
.page-article .jr-art-head .svc-open { margin-top: var(--s5); }

.page-article .jr-fig img { width: 100%; }
.page-article .jr-fig figcaption { font-size: var(--t-xs); color: var(--muted);
  margin-top: var(--s3); max-width: 64ch; }

/* THE READING COLUMN.
   680px at 19px / 1.72 lands on roughly 70 characters per line: inside the
   60–75 band where long-form reading is comfortable. The ch cap is a second
   safety net for when the display face falls back to Georgia. Nothing else on
   the site uses this measure — index and detail pages read in fragments, this
   one reads in paragraphs. */
.page-article .jr-body { max-width: var(--container-narrow); margin-inline: auto; }
.page-article .jr-body > * + * { margin-top: var(--s5); }
.page-article .jr-body p { font-size: var(--t-lg); line-height: 1.72; max-width: 72ch;
  text-wrap: pretty; }
.page-article .jr-body h2 { margin-top: var(--s8); }
.page-article .jr-body .sk-quote { margin-block: var(--s8); }
.page-article .jr-body .sk-quote p { font-size: inherit; line-height: inherit; }
.page-article .jr-body p a, .page-article .jr-body li a {
  border-bottom: 1px solid var(--accent-line);
  transition: color 250ms var(--ease), border-color 250ms var(--ease); }
.page-article .jr-body p a:hover, .page-article .jr-body li a:hover {
  color: var(--accent-text); border-bottom-color: var(--accent-text); }
.page-article .jr-ul { margin-top: var(--s5); }
.page-article .jr-ul li { position: relative; padding-left: var(--s5);
  font-size: var(--t-body); line-height: 1.6; max-width: 72ch; }
.page-article .jr-ul li + li { margin-top: var(--s3); }
.page-article .jr-ul li::before { content: ""; position: absolute; left: 0; top: .8em;
  width: 10px; height: 1px; background: var(--accent-line); }

.page-article .jr-share { display: flex; flex-wrap: wrap; align-items: center;
  justify-content: space-between; gap: var(--s4); margin-top: var(--s8);
  padding-block: var(--s5); border-block: 1px solid var(--line); }
.page-article .jr-share__links { display: flex; flex-wrap: wrap; gap: var(--s5);
  font-size: var(--t-sm); }
.page-article .jr-share__links a { border-bottom: 1px solid var(--line-strong);
  padding-block: var(--s1); }
.page-article .jr-share__links a:hover { border-bottom-color: var(--ink); }

/* Two items, never three — a "related" row inside an editorial band is a
   three-card grid waiting to happen. */
.page-article .jr-more__h { margin-top: var(--s8); }
.page-article .jr-more { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s6);
  margin-top: var(--s6); }
.page-article .jr-more > * { min-width: 0; }
.page-article .jr-more__item { display: block; }
.page-article .jr-more__frame { display: block; overflow: hidden;
  background: var(--canvas-sink); margin-bottom: var(--s4); }
.page-article .jr-more__item img { width: 100%; height: 180px; object-fit: cover;
  transition: transform 500ms var(--ease); }
.page-article .jr-more__item:hover img { transform: scale(1.02); }
.page-article .jr-more__cat { display: block; font-size: var(--t-label);
  text-transform: uppercase; letter-spacing: .16em; color: var(--accent-text);
  margin-bottom: var(--s2); }
.page-article .jr-more__item .sk-h4 { display: block; }
.page-article .jr-more__item:hover .sk-h4 { color: var(--accent-text); }


/* ==========================================================================
   G · THE MIDDLE RANGE — 901px to 1100px
   The forms hold two or three controls on one row at desktop width. Between
   901 and 1100 the paper half of a split band is only ~400px wide, which is
   not enough for a street row of three: the labels are the widest thing in
   their tracks and would push the grid past the frame. One column instead —
   the same containment site.css already applies to the nav.
   ========================================================================== */
@container screen (min-width: 901px) and (max-width: 1100px) {
  .fm-row--street { grid-template-columns: 1fr 1fr; }
  .fm-row--street > :first-child { grid-column: 1 / -1; }
  .fm-row--city { grid-template-columns: 1fr; }
  .page-custom .cst-ind { gap: var(--s7); }
  .page-custom .cst-duo { gap: var(--s6); }
  .page-custom .cst-duo > * + * { padding-left: var(--s6); }
  .page-journal .jr-row { grid-template-columns: 150px 1fr 110px; gap: var(--s5); }
  .page-journal .jr-row__thumb img { width: 110px; height: 100px; }
}


/* ==========================================================================
   H · NARROW — every irregular composition resolves to one predictable
   column. The drama comes from scale and imagery, not from layout.
   ========================================================================== */
@container screen (max-width: 900px) {

  /* shared */
  .svc-hero { min-height: 260px; }
  .svc-hero .sk-hero__body { padding: var(--s7) var(--gutter) var(--s6); }
  .st-duo { grid-template-columns: 1fr; gap: var(--s7); }
  .st-duo > .sk-editorial + .sk-editorial { padding-left: 0; border-left: 0;
    padding-top: var(--s7); border-top: 1px solid var(--line); }
  .svc-split-tall .sk-split__media { height: auto; }

  /* /op-maat */
  .page-custom .cst-upload { padding: var(--s8) var(--gutter); }
  .page-custom .cst-drop { padding: var(--s8) var(--s5); }
  .page-custom .cst-fields { padding: var(--s8) var(--gutter); }
  .page-custom .cst-ind { grid-template-columns: 1fr; gap: var(--s7); }
  .page-custom .cst-duo { grid-template-columns: 1fr; gap: var(--s7); }
  .page-custom .cst-duo > * + * { border-left: 0; padding-left: 0;
    border-top: 1px solid var(--line); padding-top: var(--s7); }
  .page-custom .cst-time__row { grid-template-columns: 1fr; gap: var(--s1); }
  .page-custom .cst-dl__row { flex-direction: column; gap: var(--s1); }
  .page-custom .cst-dl dd { text-align: left; }

  /* /professionals */
  .page-pro .pro-status { grid-template-columns: 1fr; gap: var(--s5); }
  .page-pro .pro-status__tally { text-align: left; }
  .page-pro .pro-aud > li { grid-template-columns: 1fr; gap: var(--s4);
    padding-block: var(--s6); }
  .page-pro .pro-aud > li .pro-aud__head,
  .page-pro .pro-aud > li .pro-aud__body { grid-column: 1 / -1; }
  .page-pro .pro-tech,
  .page-pro .pro-exp,
  .page-pro .pro-ref { grid-template-columns: 1fr; gap: var(--s7); }
  .page-pro .pro-dl > li { grid-template-columns: 1fr; gap: var(--s2); }
  .page-pro .pro-dl__stat { justify-self: start; text-align: left; margin-top: var(--s2); }
  .page-pro .pro-ref__thumbs .sk-grid { grid-template-columns: 1fr; }
  .page-pro .pro-strip img { height: 90px; }

  /* /studio, /studio/halil */
  .page-studio .st-hand { grid-template-columns: 1fr; row-gap: var(--s7); }
  .page-studio .st-hand__intro,
  .page-studio .st-hand__a,
  .page-studio .st-hand__b,
  .page-studio .st-hand__c { grid-column: 1; grid-row: auto; margin-top: 0; }
  .page-studio .st-atelier { padding-block: var(--s8); }
  .page-studio .st-mat { grid-template-columns: 1fr; gap: var(--s6); }
  .st-plate { padding: var(--s6) var(--gutter); }
  .st-plate__inner { padding: var(--s5); }
  .st-plate__inner--wide { aspect-ratio: 4 / 5; max-width: 420px; min-height: 0; }
  .page-halil .hal-panel > * { max-width: none; }

  /* /contact */
  .fm-row--street { grid-template-columns: 1fr 1fr; }
  .fm-row--street > :first-child { grid-column: 1 / -1; }
  .fm-row--city { grid-template-columns: 1fr; }
  .page-contact .fm-contact { grid-template-columns: 1fr; gap: var(--s8); }
  .page-contact .fm-details > div { grid-template-columns: 1fr; gap: var(--s1); }

  /* /journal, /journal/{slug} */
  .page-journal .jr-row { grid-template-columns: 1fr 84px; gap: var(--s4) var(--s5); }
  .page-journal .jr-row__meta { grid-column: 1; grid-row: 1; flex-direction: row;
    flex-wrap: wrap; gap: var(--s3); }
  .page-journal .jr-row__body { grid-column: 1; grid-row: 2; }
  .page-journal .jr-row__thumb { grid-column: 2; grid-row: 1 / span 2; align-self: start; }
  .page-journal .jr-row__thumb img { width: 84px; height: 84px; }
  .page-article .jr-more { grid-template-columns: 1fr; gap: var(--s6); }
  .page-article .jr-more__item img { height: 200px; }
  /* The measure survives the frame: the column runs to the gutter and the type
     steps down so the line count per paragraph stays readable. */
  .page-article .jr-body p { font-size: var(--t-body); line-height: 1.68; }
}


/* ==========================================================================
   I · THE NARROWEST FRAME — 420px and below (NFR-301 lists 320 as supported)
   ========================================================================== */
@container screen (max-width: 420px) {
  .fm-row--street { grid-template-columns: 1fr; }
  .page-journal .jr-row { grid-template-columns: 1fr; }
  .page-journal .jr-row__thumb { grid-column: 1; grid-row: 3; }
  .page-journal .jr-row__thumb img { width: 100%; height: 140px; }
  .page-custom .cst-dims { grid-template-columns: 1fr; }
  .st-plate__inner { padding: var(--s4); }
  .page-pro .pro-status__fig { font-size: var(--t-lg); }
}

/* ---- /op-maat, the form's live states ----
   Added when the brief stopped being decorative (2026-09-12). Everything here
   is a state the form always had and never drew: an error against a field, the
   summary above the fields, the stored-brief panel, and the two things the
   enhancement script shows once a file is chosen. */
.page-custom .cst-form { margin: 0; }

.page-custom .cst-err { margin-top: var(--s3); font-size: var(--t-xs); line-height: 1.55;
  color: var(--danger); }
.page-custom .cst-upload .cst-err { color: #F0B5AB; }
.page-custom .cst-drop--bad { border-color: #F0B5AB; border-style: solid; }

.page-custom .cst-alert { margin-top: var(--s5); padding: var(--s4) var(--s5);
  font-size: var(--t-sm); line-height: 1.6;
  background: var(--canvas-sink); border-left: 3px solid var(--accent-line); }

/* the file the visitor chose — written by assets/js/op-maat.js, empty without it */
.page-custom .cst-picked { display: flex; align-items: center; gap: var(--s4);
  margin-top: var(--s4); font-size: var(--t-xs); color: var(--on-dark-muted);
  line-height: 1.5; text-align: left; }
.page-custom .cst-picked img { width: 56px; height: 56px; flex: none;
  object-fit: cover; border: 1px solid rgb(237 233 226 / .38); }
.page-custom .cst-picked b { display: block; color: var(--on-dark); font-weight: 500;
  overflow-wrap: anywhere; }
.page-custom .cst-drop--over { border-color: var(--accent-dark); border-style: solid;
  background: rgb(237 233 226 / .07); }

/* the stored brief */
.page-custom .cst-thanks { max-width: 62ch; }
.page-custom .cst-thanks > * + * { margin-top: var(--s4); }
.page-custom .cst-thanks h2 { margin-top: var(--s3); }
.page-custom .cst-ref { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s3);
  padding: var(--s4) var(--s5); background: var(--paper); border: 1px solid var(--line-strong); }
.page-custom .cst-ref__label { font-size: var(--t-label); text-transform: uppercase;
  letter-spacing: .14em; color: var(--muted); }
.page-custom .cst-ref b { font-size: var(--t-lg); font-variant-numeric: tabular-nums; }
.page-custom .cst-thanks__act { display: flex; flex-wrap: wrap; gap: var(--s4);
  margin-top: var(--s6); }
