/* ═══════════════════════════════════════════════════════════════
   Porchlight — Dusk Slate v2 · porchlight.css
   Component layer. Requires tokens.css. Implements audit №1, №3–№8.
   ═══════════════════════════════════════════════════════════════ */

body {
  margin:0; background:var(--paper); color:var(--ink);
  font-family:var(--font-text); line-height:1.6;
  -webkit-font-smoothing:antialiased;
  
}
a { color:var(--amber-deep); }
a:hover { color:var(--amber-bright); }
body.pl-ready { transition:background-color 2.5s ease, color 2.5s ease; } /* dusk ramp — gated so first paint doesn't fade in */

/* ── №8 · paper grain — put .pl-grain on <body>. 2% noise: felt, not seen. */
.pl-grain { background-image:radial-gradient(rgba(38,40,52,.028) 1px, transparent 1px); background-size:5px 5px; }
[data-theme="night"] .pl-grain, [data-theme="dusk"] .pl-grain { background-image:radial-gradient(rgba(237,235,226,.03) 1px, transparent 1px); }

/* ── №1 · the wordmark: a lamp, not a sticker ─────────────────── */
.pl-wordmark { font-family:var(--font-display); font-weight:800; letter-spacing:-.03em; color:var(--ink); position:relative; display:inline-block; }
.pl-wordmark .lit { color:var(--amber); transition:color 1.2s ease, text-shadow 1.2s ease; }
/* lamp on (dusk/night): glow + slow breathe */
[data-theme="night"] .pl-wordmark .lit,
[data-theme="dusk"]  .pl-wordmark .lit { text-shadow:var(--glow); animation:pl-breathe-text var(--t-breathe) ease-in-out infinite; }
/* №1 · the pool: light lands on the paper around the lamp */
.pl-pool { position:relative; }
.pl-pool::before { content:""; position:absolute; inset:-40% -20%; background:var(--pool); pointer-events:none; opacity:calc(.4 + .6 * var(--lamp)); }
.pl-pool > * { position:relative; }
.pl-pool .pl-warmed { color:var(--ink-warmed); } /* ink warms inside the pool */
/* №2 · the ignition — dusk.js adds .pl-ignite when the lamp comes on */
.pl-ignite .lit { animation:pl-flicker-once 2.2s ease-in-out 1, pl-breathe-text var(--t-breathe) ease-in-out 2.2s infinite; }

/* ── Buttons — pill, amber fill, hover blooms + breathes ──────── */
.pl-btn { background:var(--amber-bright); color:var(--on-amber); font-family:var(--font-text); font-weight:700; font-size:14px; padding:11px 22px; border-radius:var(--r-pill); border:0; cursor:pointer; transition:box-shadow var(--t-slow) var(--ease-arrive), transform var(--t-slow) var(--ease-arrive); }
.pl-btn:hover { box-shadow:0 0 1px rgba(244,155,22,.5), 0 0 10px rgba(255,178,64,.34), 0 0 24px rgba(255,169,40,.13); }
.pl-btn:active { transform:scale(.985); transition-duration:var(--t-press); }
.pl-btn.ghost { background:transparent; color:var(--ink); border:1px solid var(--hairline-strong); }
.pl-btn.ghost:hover { background:var(--sand); box-shadow:none; }

/* ── №4 · cards rest on the table (slate shadow, day only) ────── */
.pl-card { background:var(--card); border-radius:var(--r-card); padding:var(--s4) 22px; box-shadow:var(--shadow-rest); border:1px solid var(--hairline); }
.pl-card.raised { box-shadow:var(--shadow-raised); }
.pl-panel { background:var(--sand); border-radius:var(--r-panel); padding:var(--s4) 22px; } /* recessed: hairline world, no shadow */

/* ── №5 · the lit sill — ceremony only, ONE per screen. A calm panel
   with a hairline of lamplight laid across its top edge. ─────────── */
.pl-sill { position:relative; background:var(--card); border:1px solid var(--hairline); border-radius:var(--r-sill); padding:var(--s6) var(--s5) var(--s4); box-shadow:var(--shadow-rest); text-align:center; }
.pl-sill::before { content:""; position:absolute; top:0; left:14%; right:14%; height:1px; pointer-events:none;
  background:linear-gradient(90deg, transparent, var(--amber) 50%, transparent); opacity:.55; }
[data-theme="night"] .pl-sill::before, [data-theme="dusk"] .pl-sill::before {
  opacity:.9; box-shadow:0 0 9px rgba(255,169,40,.34); }

/* ── №3 · the voice — wherever Porchlight itself is speaking ──── */
.pl-voice { font-family:var(--font-voice); line-height:1.45; color:var(--ink); }
.pl-kicker { font-family:var(--font-text); font-size:11px; font-weight:700; letter-spacing:.18em; text-transform:uppercase; color:var(--amber-deep); }
.pl-kicker.leaning { transform:rotate(-.5deg); display:inline-block; } /* №8: one per screen */

/* ── №8 · the lamplight underline — no ink, a subtle pool of light
   under the word. Usage: <span class="pl-underline">caring</span> */
.pl-underline { position:relative; white-space:nowrap; }
.pl-underline::after { content:""; position:absolute; left:-2%; bottom:-.18em; width:104%; height:.26em;
  background:radial-gradient(ellipse 60% 100% at 50% 0%, rgba(244,155,22,.32), rgba(255,178,64,.10) 60%, transparent 100%);
  border-radius:50%; filter:blur(1px); pointer-events:none; }
[data-theme="night"] .pl-underline::after, [data-theme="dusk"] .pl-underline::after {
  background:radial-gradient(ellipse 60% 100% at 50% 0%, rgba(255,169,40,.4), rgba(255,178,64,.14) 60%, transparent 100%); }

/* ── №6 · Pulse bands: the filament carries the band ──────────── */
.pl-band { display:inline-flex; align-items:center; gap:9px; border:1px solid var(--hairline-strong); background:var(--card); border-radius:var(--r-pill); padding:7px 16px; font-size:12px; font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--ink); }
.pl-band .filament { width:9px; height:9px; border-radius:50%; background:radial-gradient(circle at 40% 34%, var(--amber-core), var(--amber-bright) 70%); flex:none; }
.pl-band.bright     .filament { box-shadow:0 0 9px 2.5px rgba(244,155,22,.75); }
.pl-band.steady     .filament { box-shadow:0 0 5px 1px rgba(244,155,22,.45); }
.pl-band.flickering .filament { box-shadow:0 0 6px 1.5px rgba(244,155,22,.55); animation:pl-flicker 2.6s ease-in-out infinite; }
.pl-band.checkin { color:var(--muted); }
.pl-band.checkin .filament { background:#C9B99A; opacity:.7; box-shadow:none; } /* dimmed, never red */

/* ── Chips ─────────────────────────────────────────────────────── */
.pl-chip { border:1px solid var(--hairline-strong); background:var(--card); border-radius:var(--r-pill); padding:8px 16px; font-size:13px; font-weight:600; color:var(--ink-2); display:inline-block; }
.pl-chip.on { background:var(--amber-bright); border-color:var(--amber-bright); color:var(--on-amber); box-shadow:inset 0 1px 0 rgba(255,255,255,.25); }

/* ── Forms — the field becomes a lit thing ────────────────────── */
.pl-input { font-size:15px; padding:11px 16px; border-radius:var(--r-pill); border:1px solid var(--hairline-strong); background:var(--card); color:var(--ink); font-family:var(--font-text); transition:border-color var(--t-fast) ease, box-shadow var(--t-fast) ease; }
.pl-input:focus { border-color:var(--amber-bright); box-shadow:0 0 0 1px rgba(244,155,22,.35), 0 0 12px rgba(255,169,40,.18); outline:none; }
.pl-input.bad { border-color:var(--warning); } /* earth-tone, no shake, no red */

/* ── №7 · icons: single-weight ink line, amber only as the light.
   Custom properties inherit through <use> shadow boundaries; class
   selectors don't — so the sprite paths consume these vars. */
.pl-icon { stroke:var(--ink); --pl-icon-accent:var(--amber-deep); --pl-icon-light:var(--amber-bright); }

/* ── Keyframes ─────────────────────────────────────────────────── */
@keyframes pl-breathe-text { 0%,100% { text-shadow:var(--glow); } 50% { text-shadow:var(--glow-strong); } }
@keyframes pl-breathe-box  { 0%,100% { box-shadow:var(--glow); }  50% { box-shadow:var(--glow-strong); } }
@keyframes pl-flicker { 0%,100%{opacity:1} 42%{opacity:.35} 44%{opacity:.9} 58%{opacity:.5} 61%{opacity:1} 80%{opacity:.75} }
@keyframes pl-flicker-once { 0%{opacity:0} 8%{opacity:.6} 14%{opacity:.15} 22%{opacity:.85} 30%{opacity:.4} 42%{opacity:1} 55%{opacity:.7} 70%,100%{opacity:1} }

@media (prefers-reduced-motion: reduce) {
  .pl-wordmark .lit, .pl-ignite .lit, .pl-band .filament { animation:none !important; }
  body.pl-ready { transition:none; }
}

/* ── pl-art: the Flow-era line illustrations (brand/explorations 2026-08-11),
   retraced as token-true vectors. One lit thing per drawing; amber only.
   Day = lamp off (amber is pigment, lit fills are outlines);
   night = lamp on (fills glow softly). ── */
.pl-art{display:block}
.pl-art .al{fill:none;stroke:var(--ink-2);stroke-width:2.5;
  stroke-linecap:round;stroke-linejoin:round}
.pl-art .aa{fill:none;stroke:var(--amber);stroke-width:2.5;
  stroke-linecap:round;stroke-linejoin:round}
.pl-art .aad{fill:var(--amber)}
.pl-art .af{fill:var(--amber);opacity:.9}
.pl-art .lit{fill:none}
[data-theme="night"] .pl-art .al,[data-theme="dusk"] .pl-art .al{stroke:var(--ink-2)}
[data-theme="night"] .pl-art .aa,[data-theme="dusk"] .pl-art .aa{stroke:var(--amber-bright)}
[data-theme="night"] .pl-art .aad,[data-theme="dusk"] .pl-art .aad{fill:var(--amber-bright)}
[data-theme="night"] .pl-art .af,[data-theme="dusk"] .pl-art .af{
  fill:var(--amber-bright);
  filter:drop-shadow(0 0 8px rgba(255,169,40,.45))}
[data-theme="night"] .pl-art .lit,[data-theme="dusk"] .pl-art .lit{
  fill:var(--amber-core);
  filter:drop-shadow(0 0 10px rgba(255,178,64,.5))}

/* Support-article screenshots (docs/58 pipeline) — real app panes rendered
   per release; sync-support-shots.sh owns the ?v= cache keys. */
.shot{margin:14px 0 6px}
.shot img{max-width:100%;width:440px;border-radius:12px;
  border:1px solid var(--hairline,rgba(0,0,0,.08));
  box-shadow:0 6px 22px rgba(0,0,0,.10)}
.shot figcaption{font-size:12px;color:var(--muted,#8a8377);margin-top:6px}

/* ── Support hub (docs/60) ─────────────────────────────────────────── */
.hub-hero h1{font-size:clamp(32px,5.4vw,46px);padding:clamp(34px,5.5vw,54px) 0 8px}
.hub-search{position:relative;margin:22px 0 0;max-width:none}
.hub-search input{font-size:18px;padding:18px 118px 18px 54px}
.hub-search .sic{position:absolute;left:22px;top:50%;transform:translateY(-50%);color:var(--muted);pointer-events:none}
.hub-search .kbd{position:absolute;right:20px;top:50%;transform:translateY(-50%);display:flex;gap:6px;pointer-events:none}
.hub-search .kbd span{font-size:11px;color:var(--muted);border:1px solid var(--hair-soft);border-radius:6px;
  padding:2px 7px;background:var(--card)}
.hub-results{position:absolute;left:0;right:0;top:calc(100% + 8px);z-index:30;background:var(--card);
  border:1px solid var(--hair);border-radius:16px;box-shadow:var(--shadow-raised);overflow:hidden;
  opacity:0;transform:translateY(-4px);pointer-events:none;
  transition:opacity .22s cubic-bezier(.16,1,.3,1),transform .22s cubic-bezier(.16,1,.3,1)}
.hub-results.open{opacity:1;transform:none;pointer-events:auto}
.hub-results ul{list-style:none;margin:0;padding:6px;max-height:min(52vh,460px);overflow-y:auto}
.hub-results li a{display:block;padding:11px 14px;border-radius:10px;text-decoration:none;color:var(--ink)}
.hub-results li a .rc{font-size:11px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:var(--amber-deep)}
.hub-results li a .rt{display:block;font-weight:600;font-size:15px;margin-top:1px}
.hub-results li a .rx{display:block;font-size:12.5px;color:var(--muted);margin-top:2px;
  overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.hub-results li a:hover,.hub-results li.sel a{background:var(--sand)}
.hub-results .rmiss{padding:16px 18px;font-size:14px;color:var(--ink-2)}
.hub-results .rmiss a{color:var(--amber-deep)}
.triage{margin:clamp(30px,5vw,44px) 0 0;padding:18px 20px;border:1px solid var(--hair-soft);border-radius:16px;
  background:color-mix(in srgb,var(--sand) 62%,transparent)}
.triage .tq{font-size:12px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-2);margin:0 0 12px}
.triage .row{display:flex;flex-wrap:wrap;gap:9px}
.tchip{display:inline-flex;align-items:center;gap:9px;border:1px solid var(--hair);background:var(--card);
  border-radius:999px;padding:9px 16px;font-size:13.5px;font-weight:600;color:var(--ink);text-decoration:none;
  transition:border-color .16s,box-shadow .16s,transform .12s}
.tchip:hover{border-color:var(--muted);box-shadow:var(--shadow-rest)}
.tchip:active{transform:scale(.97)}
.tchip .d{width:8px;height:8px;border-radius:50%;flex:none}
.tchip .d.ember{background:var(--danger,#B3542E);box-shadow:0 0 6px rgba(179,84,46,.5)}
.tchip .d.quiet{background:var(--muted);opacity:.55}
.tchip .d.slate{background:var(--ink-2)}
.tchip .d.amber{background:var(--amber);box-shadow:0 0 6px rgba(244,155,22,.45)}
.cats{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;margin:clamp(28px,4.5vw,40px) 0 0}
@media (max-width:720px){.cats{grid-template-columns:1fr}}
.cat{display:flex;flex-direction:column;background:var(--card);border:1px solid var(--hair-soft);border-radius:18px;
  padding:20px 22px 16px;color:var(--ink);box-shadow:var(--shadow-rest);
  transition:box-shadow .22s cubic-bezier(.16,1,.3,1),border-color .22s}
.cat:hover{box-shadow:var(--shadow-raised);border-color:var(--hair)}
.cat a{text-decoration:none;color:inherit}
.cat .top{display:flex;align-items:flex-end;gap:14px;padding-bottom:12px;border-bottom:1px solid var(--hair-soft)}
.cat .ic{flex:none;width:44px;height:44px;color:var(--ink-2)}
.cat .ic .aa{color:var(--amber)}
.cat:hover .ic{color:var(--ink)}
.cat h3{font-family:var(--optima);font-size:19px;font-weight:600;margin:0}
.cat .n{margin-left:auto;font-size:11.5px;color:var(--muted);white-space:nowrap;padding-bottom:2px}
.cat p{font-size:13.5px;color:var(--ink-2);margin:11px 0 10px;min-height:2.6em}
.cat ul{list-style:none;margin:0;padding:0}
.cat ul a{display:flex;gap:8px;align-items:baseline;padding:6px 0;font-size:13.5px;color:var(--ink-2);
  text-decoration:none;border-radius:6px}
.cat ul a::before{content:"·";color:var(--amber);font-weight:700}
.cat ul a:hover{color:var(--ink)}
.cat a.all{display:block;margin-top:auto;padding-top:10px;font-size:13px;font-weight:600;color:var(--amber-deep)}
.cat a.all:hover{color:var(--amber)}
/* article foot: vote + verified (category pages) */
.art-foot{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin:14px 0 4px;padding-top:10px;
  border-top:1px solid var(--hair-soft);font-size:12.5px;color:var(--muted)}
.art-foot .helpq{margin-left:auto;display:flex;gap:8px;align-items:center}
.hv{border:1px solid var(--hair);background:var(--card);border-radius:999px;padding:4px 13px;
  font-family:var(--sf);font-size:12px;font-weight:600;color:var(--ink-2);cursor:pointer;
  transition:background-color .14s,border-color .14s,transform .1s}
.hv:hover{border-color:var(--muted)}
.hv:active{transform:scale(.95)}
.hv.picked{background:var(--amber-bright);border-color:var(--amber-bright);color:var(--on-amber)}
.hv-thanks{color:var(--good,seagreen);font-weight:600}
/* step-frame sequences */
.seq{margin:16px 0 8px}
.seq .frames{position:relative;border-radius:12px;overflow:hidden;border:1px solid var(--hair-soft);
  box-shadow:0 6px 22px rgba(0,0,0,.10)}
.seq .frames img{display:block;width:100%;max-width:440px}
.seq .frames img+img{position:absolute;inset:0;opacity:0}
.seq .dots{display:flex;gap:6px;align-items:center;margin-top:8px}
.seq .dots i{width:7px;height:7px;border-radius:50%;background:var(--hair);transition:background-color .3s}
.seq .dots i.on{background:var(--amber)}
.seq .cap{font-size:12.5px;color:var(--muted);margin-top:4px;min-height:2.4em}
@media (prefers-reduced-motion: reduce){
  .seq .frames{display:grid;gap:8px}
  .seq .frames img+img{position:static;opacity:1}
  .seq .dots{display:none}
}


/* Mobile polish (docs/60 verification pass, 2026-08-12) */
/* .nav's `padding:16px 0` was zeroing .wrap's horizontal padding on every
   page — invisible on desktop where the centered max-width leaves margin,
   flush-to-the-bezel on phones. */
header .wrap.nav{padding:16px clamp(20px,4vw,40px)}
@media (max-width:640px){
  .hub-search .kbd{display:none}      /* keyboard hints are a desktop affordance */
  .hub-search input{padding-right:54px}
}
