/* ═══ the surface ═══
   Stark, contemporary — the register is an instrument, not a hymnal. No
   serif body, almost no chrome colour: the only colour on the page belongs
   to the belief systems themselves (each line's generated hue). Everything
   Pantheo says about itself is said in grey, so the tree stays the loudest
   thing on screen.
   The neutrals are warm, and only the PAGE is warm. The ground used to be
   a cool #EDEDEA, which read as an admin console — the page was the
   coldest thing on screen and the covers had to fight it. It is a warm
   off-white now, and every other neutral is mixed from the same taupe.
   Content surfaces stay pure #FFFFFF on purpose. Tinting them too was a
   mistake: it flattened the one separation that matters — the step from
   the page you are on to the thing you are reading — and made the whole
   app look slightly stained. Warm ground, white paper, and the difference
   between them is what the elevation scale below is drawing.
   Contrast improved on every pair rather than merely holding: faint/bg
   5.27 (was 4.85), faint/card 5.83 (was 5.69), muted/card 6.20 (was
   5.95), ink/card 17.7. */
:root{
  /* --faint was #9C9CA3: 2.33:1 on the page background, 2.73:1 on a card.
     It carries every mono meta line, every shelf subtitle, and both copies
     of "Numbers count Pantheo activity only" — the one sentence holding the
     product's honesty commitment was the least readable text in it. */
  --bg:#F6F3EF;--card:#FFFFFF;--ink:#1A1815;--muted:#676057;--faint:#6B645C;
  --line:#E7E2DC;--accent:#6D4E2F;--warn:#8A6A12;--live:#2F6B4A;
  /* ── the accent as a surface ──
     A selected chip is a STATE, not an action, and it was wearing a solid
     black fill — the heaviest object the system owns, applied to the
     lightest meaning it has. Ten of them on a filter row read as ten
     buttons shouting. State now gets a tint it can wear quietly. */
  --accent-soft:#F1EAE1;--accent-line:#DED2C2;
  /* the one ink-ish fill left: the "idea" avatar, which is a face, not a
     control, and needs to read as a silhouette rather than a hole */
  --ink-soft:#453D33;
  --disp:"Manrope",system-ui,sans-serif;
  --wordmark:"Manrope",system-ui,sans-serif;
  --ui:"Inter",system-ui,sans-serif;
  --mono:"JetBrains Mono",ui-monospace,monospace;
  --r:4px; --r-lg:10px; --r-pill:99px;
  /* ── elevation: three steps, all warm ──
     Depth used to be carried entirely by the hairline, so a card at rest
     and a card you could act on were the same object. Three shadows, each
     a tight contact shadow plus a wide soft one — that pairing is what
     makes a surface look lifted rather than blurred. Tinted with the
     page's own clay (43,35,24) instead of black, because a neutral-black
     shadow on a warm ground turns visibly grey.
       sh-1  at rest      every card, the pinned chrome
       sh-2  on hover     the thing under the cursor, paired with -1/-2px
       sh-3  overlay      popovers, the search dropdown */
  --sh-1:0 1px 2px rgba(43,35,24,.045), 0 2px 6px rgba(43,35,24,.045);
  --sh-2:0 2px 4px rgba(43,35,24,.05), 0 10px 24px rgba(43,35,24,.075);
  --sh-3:0 3px 10px rgba(43,35,24,.06), 0 18px 44px rgba(43,35,24,.15);
  /* ── the two measures (docs/ux.md §5a) ──
     Browse is for picking; read is for reading. A component never invents a
     third. Before this there were ten in the file: 560, 620, 640, 660, 720,
     768 and 60 / 62 / 64 / 66 / 70ch, which is why no two surfaces lined up. */
  --m-browse:1250px; --m-read:720px; --m-prose:64ch;
  /* offset for pinned page chrome — app.js re-measures it on lines, where
     the whole identity card pins under the top bar */
  --stick:69px;
  /* ── depth: three levels (docs/ui.md §3) ──
     There was one — card + hairline + 4px — and every surface used it for
     everything, so eight identical white rectangles carried no hierarchy.
       list   hairline-divided rows, no container   ≥3 similar things
       panel  --sunk fill, no border                secondary information
       card   --card + hairline                     things you act on, one per surface
     --sunk is the ground one step down from a card, and it is the level the
     system was missing. */
  --sunk:#EDEAE6;
  /* ── space: one scale (docs/ui.md §5) ──
     Inside a component 8/12/16; between sections 56 or 80. It was ~20 both
     ways, which is the mechanical reason nothing grouped. */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px;
  --s6:32px; --s7:48px; --s8:64px; --s9:80px;
  --sect:56px;
  /* ── the type scale ──
     Seven steps, and nothing between them. The previous "scale" was twelve
     half-point sizes that components then ignored anyway: a census of one
     page found EIGHTEEN distinct sizes in 0.5px increments, with 13 / 13.5
     / 14 all doing the same job. That is the mechanical reason nothing had
     vertical rhythm — there were no steps to snap to. */
  /* One notch chunkier across the board (the "bolder, bigger, readable"
     pass) — same seven steps, each lifted. */
  --t-meta:12px;  /* mono eyebrows, counts, captions */
  --t-sm:14px;    /* secondary UI, card meta, notes  */
  --t-body:16px;  /* body copy, list rows            */
  --t-lede:18px;  /* ledes, card titles              */
  --t-h2:23px;    /* block headings                  */
  --t-h1:33px;    /* page titles                     */
  --t-hero:44px;  /* the door only                   */
  /* The old names survive as aliases, so every rule already using them
     snapped onto the scale without being rewritten twice. */
  --fs-1:var(--t-meta);  --fs-2:var(--t-meta);  --fs-3:var(--t-meta);
  --fs-4:var(--t-sm);    --fs-5:var(--t-sm);    --fs-6:var(--t-body);
  --fs-7:var(--t-body);  --fs-8:var(--t-lede);  --fs-9:var(--t-lede);
  --fs-10:var(--t-h2);   --fs-11:var(--t-h2);   --fs-12:var(--t-h1);
}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--ink);font-family:var(--ui);font-size:var(--t-body);
     line-height:1.6;-webkit-font-smoothing:antialiased}
a{color:inherit}

/* ── the focus ring ──
   There wasn't one anywhere outside two form fields, so tabbing through
   the app moved an invisible caret. One rule, in the accent, offset far
   enough to clear the pill borders. :focus-visible, not :focus, so it
   never fires on a mouse click — which is why nobody added it before. */
:where(a,button,summary,input,textarea,select,[tabindex]):focus-visible{
  outline:2px solid var(--accent);outline-offset:2px}

/* body>nav only — the rail's sdnav is also a <nav>; the bare selector gave
   it this border (a doubled hairline) and sticky chrome behaviour */
body>nav{background:var(--card);border-bottom:1px solid var(--line);position:sticky;top:0;z-index:20;
  box-shadow:0 1px 3px rgba(43,35,24,.045)}
.navin{padding:11px 28px;display:flex;align-items:center;gap:20px}
.brand{font-family:var(--wordmark);font-weight:700;font-size:15px;letter-spacing:.14em;
       text-transform:uppercase;text-decoration:none;
       display:inline-flex;align-items:center;gap:8px}
.brandmark{flex-shrink:0}
.navlink{font-family:var(--mono);font-size:var(--fs-3);font-weight:400;letter-spacing:.1em;
         text-transform:uppercase;color:var(--muted);text-decoration:none}
.navlink:hover{color:var(--ink)}
.navin .sp{margin-left:auto}
.navwho{width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center;
        font-size:12px;font-weight:600;color:#fff;background:hsl(280 40% 48%);
        text-decoration:none;
        /* it renders as a <button> so it can POST the sign-out */
        padding:0;border:0;font-family:inherit;cursor:pointer;appearance:none}
.navwho:hover{background:hsl(280 40% 40%)}
.navwho:disabled{opacity:.5;cursor:default}
.navwho::-webkit-details-marker,.navwho::marker{display:none;content:""}
/* The one create action in the product — but it is ambient chrome, present
   on every page, next to something you actually came to do. Outlined: it
   stays findable and stops arguing with the page's own actions. */
.navnew{font-family:var(--ui);font-size:12.5px;font-weight:600;text-decoration:none;
  border:1px solid var(--accent-line);background:var(--card);color:var(--accent);
  border-radius:99px;padding:6px 14px;white-space:nowrap;flex-shrink:0;
  transition:background .16s ease,border-color .16s ease,box-shadow .16s ease,transform .1s ease}
.navnew:hover{background:var(--accent-soft);border-color:#CFC0AB;box-shadow:var(--sh-1)}
/* ── the one dark button ──
   Solid near-black is the heaviest thing this system can print, so exactly
   one control gets it, and only when it is the honest next step: signing
   in. Nothing else on a signed-out page competes at this weight, which is
   the entire reason it works — the moment a second one appears, both stop
   meaning anything. Signed in, it is not rendered at all. */
.navsign{font-family:var(--ui);font-size:12.5px;font-weight:600;text-decoration:none;
  border:1px solid var(--ink);background:var(--ink);color:var(--card);border-radius:99px;
  padding:6px 15px;white-space:nowrap;flex-shrink:0;box-shadow:var(--sh-1);
  transition:background .16s ease,box-shadow .16s ease,transform .1s ease}
.navsign:hover{background:#000;border-color:#000;box-shadow:var(--sh-2)}
.navsign:active{transform:translateY(1px);box-shadow:var(--sh-1)}
.navdie{display:inline-flex;align-items:center;color:var(--faint);text-decoration:none;
  padding:4px 2px;flex-shrink:0}
.navdie:hover{color:var(--ink)}
.navmenu{position:relative;flex-shrink:0}
.navmenu>summary{list-style:none}
.navpop{position:absolute;top:38px;right:0;min-width:210px;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:6px;z-index:50;
  box-shadow:var(--sh-3);display:flex;flex-direction:column}
.navpopwho{font-family:var(--mono);font-size:10px;letter-spacing:.06em;color:var(--faint);
  padding:7px 10px 5px;overflow:hidden;text-overflow:ellipsis}
.navpop a,.navpop button{font-family:var(--ui);font-size:13px;text-align:left;
  text-decoration:none;color:var(--ink);padding:8px 10px;border-radius:var(--r);
  border:0;background:none;cursor:pointer;width:100%}
.navpop a:hover,.navpop button:hover{background:var(--bg)}
.navpop button{border-top:1px solid var(--line);border-radius:0;margin-top:4px;
  color:var(--muted)}

/* ── two measures, and a page declares which it is (docs/ux.md §5a) ──
   Signed-out Home used to stack four different widths down one column —
   door copy at 660, the steps grid at 986, the feed at 760, the footer at
   986 — which is the mechanical reason the product read as unfinished.
   Browse is the default; a reading surface adds .read. Nothing else is
   allowed to set its own max-width. */
.page{--pw:var(--m-browse);max-width:var(--pw);margin:0 auto;padding:0 28px}
.page.read{--pw:calc(var(--m-read) + 56px);max-width:var(--pw)}

/* ══ the depth primitives (docs/ui.md §3) ══
   Use in this order of preference: list, then panel, then card. If a surface
   has three cards it has no card. */

/* list — a set of similar things, divided by hairlines, in no container. The
   default for systems, elements, ideas, threads. Are.na, not a card grid. */
.lst{display:flex;flex-direction:column}
.lst>*{padding:var(--s3) 0;border-top:1px solid var(--line)}
.lst>*:first-child{border-top:none}
.lst.tight>*{padding:var(--s2) 0}
.lst.roomy>*{padding:var(--s4) 0}

/* panel — secondary information. Tinted, unbordered; recedes instead of
   competing. This is what most of today's cards actually are. */
.pnl{background:var(--sunk);border-radius:var(--r);padding:var(--s4) var(--s5)}
.pnl>h3,.pnl>.pnlh{font-family:var(--disp);font-weight:600;font-size:var(--t-body);
  letter-spacing:-.01em;margin-bottom:var(--s2)}
.pnl p{font-size:var(--t-sm);color:var(--muted);line-height:1.6}
/* a system's own page may tint its panel with its own hue — the one place
   chrome is allowed colour, because it is the corpus's colour (§4) */
.pnl.hued{background:hsl(var(--h,0) 40% 50% / .06)}

/* section rhythm — the gap that was missing (§5) */
.sect{margin-bottom:var(--sect)}
.sect:last-child{margin-bottom:0}
.secth{display:flex;align-items:baseline;gap:var(--s3);flex-wrap:wrap;
  margin-bottom:var(--s4)}
.secth h2{font-family:var(--disp);font-weight:600;font-size:var(--t-h2);
  letter-spacing:-.02em}
.secth .n{font-size:var(--t-sm);color:var(--faint)}
.secth a{margin-left:auto;font-size:var(--t-sm);font-weight:600;
  color:var(--accent);text-decoration:none}

/* an idea, as a list row — full description, no truncation (§8), and the
   holders' hues as the row's colour (§4) */
.irow{display:flex;flex-direction:column;gap:var(--s1);text-decoration:none}
.irtop{display:flex;align-items:baseline;gap:var(--s3);flex-wrap:wrap}
.irtop b{font-family:var(--disp);font-weight:600;font-size:var(--t-lede);
  letter-spacing:-.01em}
.irow:hover .irtop b{color:var(--accent)}
.irhues{display:inline-flex;gap:2px;align-items:center}
.irn{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.07em;
  text-transform:uppercase;color:var(--faint);margin-left:auto;white-space:nowrap}
.irdesc{font-size:var(--t-body);color:var(--muted);line-height:1.55;
  max-width:var(--m-prose)}

/* the secondary action beside a primary one — a link, not a second button,
   so exactly one filled pill is on screen (§6) */
.quietgo{font-size:var(--t-sm);font-weight:600;color:var(--muted);
  text-decoration:none;padding:10px 0}
.quietgo:hover{color:var(--ink)}

/* ── the one page header ──
   Two sizes off one anatomy: title, mono stat, right-aligned mono scope,
   actions, one note, one chip row. 'hero' is the signed-out front door and
   nothing else. */
.ph{padding:24px 0 14px;border-bottom:1px solid var(--line);margin-bottom:22px}
.phtop{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.ph h1{font-family:var(--disp);font-weight:700;font-size:var(--t-h1);
  letter-spacing:-.02em;line-height:1.12}
.phstat,.phscope{font-family:var(--mono);font-size:var(--t-meta);
  letter-spacing:.09em;text-transform:uppercase;color:var(--faint);
  white-space:nowrap}
.phscope{margin-left:auto}
.phacts{display:flex;gap:10px;margin-left:auto;flex-wrap:wrap}
.phscope+.phacts{margin-left:0}
.phnote{font-size:var(--t-body);color:var(--muted);line-height:1.6;
  margin-top:12px;max-width:62ch}
.phchips{display:flex;gap:7px;flex-wrap:wrap;margin-top:14px}
.ph-hero{padding:34px 0 26px}
.ph-hero h1{font-size:var(--t-hero);line-height:1.06;letter-spacing:-.03em;
  max-width:22ch;text-wrap:balance}
.ph-hero .phnote{font-size:var(--t-lede);margin-top:15px;max-width:56ch}
@media(max-width:600px){
  .ph-hero{padding:26px 0 20px}
  .ph-hero h1{font-size:var(--t-h1)}
  .phscope,.phacts{margin-left:0}
}

.cover{margin-top:20px;line-height:0;border-radius:var(--r) var(--r) 0 0;overflow:hidden;position:relative}
.cover svg{width:100%;height:230px;display:block}
/* curated covers: photo duotoned through the line's hue (lum blend against
   the tinted backing set inline); credit is a licensing requirement, not
   decoration — it stays on the image */
/* no position here — the >=761px shell rule makes .cover sticky, and a
   position:relative at this higher specificity would override sticky while
   keeping its top:-172px, shoving the banner up and leaving a hole (the
   base .cover carries position:relative for the credit's sake instead) */
.cover.cimg{height:230px}
.cover.cimg img{width:100%;height:100%;object-fit:cover;display:block;
  filter:grayscale(1) contrast(1.03);mix-blend-mode:luminosity;opacity:.94}
.cover.cimg .ccredit{position:absolute;right:12px;bottom:9px;z-index:2;
  font-family:var(--mono);font-size:10px;letter-spacing:.05em;line-height:1.3;
  color:rgb(255 255 255/.6);text-shadow:0 1px 2px rgb(0 0 0/.5)}
/* the whole identity card pins under the top bar while the line scrolls;
   app.js measures its height into --stick so the page rail clears it */
.headcard{background:var(--card);border:1px solid var(--line);border-top:none;
          border-radius:0 0 var(--r) var(--r);padding:0 26px;margin-bottom:var(--s7);
          position:sticky;top:52px;z-index:18;box-shadow:var(--sh-1);
          transition:box-shadow .2s ease}

/* ── the condensing header ──
   Pinned, the identity card stops being a headline and starts being
   chrome — but it was still spending 72px of emblem and a 33px title on
   telling you where you already are. app.js flags it .stuck the moment it
   meets the top bar; the mark and the title step down, the founding date
   and the lineage fold away, and what is left is a compact bar carrying
   the two things you still need scrolled down: whose page this is, and
   the tab strip. The strip itself never moves or resizes — it is the
   navigation, and navigation that shifts under the cursor is a bug.
   Everything here animates on one curve and one duration, because the mark,
   the title and the two folding lines are one movement, not four. The
   folding lines use max-height rather than display:none — display cannot
   be tweened, and a row that vanishes on a single frame is exactly the
   choppiness this replaced.
   The card is free to animate its height because app.js keeps a spacer
   underneath it topped up to the difference, so the page below holds still
   on every frame of the transition. See public/app.js. */
.headpad{height:0}
/* Chrome's scroll anchoring also compensates for content resizing above the
   viewport — which is the spacer's job, and two mechanisms correcting the
   same 64px against each other is a feedback loop, not a fix. The spacer
   wins: it is exact, and it works in browsers that have no anchoring. */
html{overflow-anchor:none}
/* app.js measures the card's full height by un-condensing it for one
   synchronous layout read; this is what stops that read from animating */
.headcard.notrans,.headcard.notrans *{transition:none !important}
@media(min-width:761px){
  .headcard.stuck{box-shadow:var(--sh-2)}
  .headcard .idrow{transition:padding .22s cubic-bezier(.2,.7,.3,1),gap .22s cubic-bezier(.2,.7,.3,1)}
  .headcard .emblem{transition:width .22s cubic-bezier(.2,.7,.3,1),
    height .22s cubic-bezier(.2,.7,.3,1),font-size .22s cubic-bezier(.2,.7,.3,1)}
  .headcard h1{transition:font-size .22s cubic-bezier(.2,.7,.3,1)}
  /* 30px fitted exactly one line, so any subhead that wrapped had its
     second line cut off at rest and not only when stuck. Two lines. */
  .headcard .idsub,.headcard .lineline{overflow:hidden;max-height:48px;
    transition:max-height .22s cubic-bezier(.2,.7,.3,1),opacity .16s ease,
               margin-top .22s cubic-bezier(.2,.7,.3,1)}
  .headcard .btn{transition:padding .22s cubic-bezier(.2,.7,.3,1),
    font-size .22s cubic-bezier(.2,.7,.3,1),background .16s ease,
    border-color .16s ease,box-shadow .16s ease,color .16s ease}

  .headcard.stuck .idrow{padding:16px 0 12px;gap:13px;align-items:center}
  .headcard.stuck .emblem{width:38px;height:38px;font-size:16px}
  .headcard.stuck h1{font-size:var(--t-h2)}
  .headcard.stuck .idsub,.headcard.stuck .lineline{max-height:0;opacity:0;margin-top:0}
  .headcard.stuck .btn{padding:6px 15px;font-size:var(--fs-4)}
}
@media (prefers-reduced-motion:reduce){
  .headcard,.headcard .idrow,.headcard .emblem,.headcard h1,
  .headcard .idsub,.headcard .lineline,.headcard .btn{transition:none}
}
/* the banner parks a few pixels proud of the pinned card — you always know
   whose colour you are under. -172px = 58px stop − 230px cover height. */
@media(min-width:761px){
  .cover{position:sticky;top:-172px;z-index:18}
  .headcard{top:58px}
}
/* emblem and title share a top line; only the actions stay centered */
.idrow{display:flex;gap:18px;align-items:flex-start;padding:18px 0 16px;flex-wrap:wrap}
.idrow .idacts{align-self:center}
/* sits fully below the banner — it used to ride up over it (-42px), which
   left the title floating against the emblem's lower half */
.emblem{width:72px;height:72px;border-radius:var(--r);display:grid;place-items:center;
        font-family:var(--disp);font-weight:800;font-size:30px;color:#fff;
        flex-shrink:0}
/* the sigil (lib/sigil.js): data-struck marks replace the letter emblem */
.emblem.sig{background:none;border-radius:50%;overflow:hidden}
.emblem.sig svg{display:block;width:100%;height:100%}
.trow svg.sigil{flex-shrink:0;align-self:center}
.sigf{background:none;display:grid;place-items:center}
.sigf svg{display:block;width:100%;height:100%}
.idmain{flex:1;min-width:240px}
h1{font-family:var(--disp);font-weight:700;font-size:var(--t-h1);letter-spacing:-.01em;line-height:1.12}
.idsub{font-size:13.5px;color:var(--muted);margin-top:5px}
.idsub b{font-weight:600;color:var(--ink)}
.idsub .dot{color:var(--faint);padding:0 5px}
.lineline{font-size:12.5px;color:var(--faint);margin-top:4px}
.lineline a{text-decoration:none;font-weight:500;color:var(--muted)}
.lineline a:hover{color:var(--accent)}
.idacts{display:flex;flex-direction:column;align-items:flex-end;gap:9px;padding-bottom:4px}
.btnrow{display:flex;gap:10px}
/* ── buttons: quiet by default, solid almost never ──
   Every .btn used to be a solid black pill, and a page routinely shows
   three or four of them — "Found your own" in the nav, "Follow" on the
   header, "Map your beliefs" in the rail. Four maximum-contrast objects
   competing on one screen is four buttons that each read as THE button,
   which means none of them do, and all of them out-weigh the belief
   system whose page it is.
   So weight is now a scale, and the default sits near the bottom:
     .btn         soft accent tint      the ordinary action (most buttons)
     .btn.o       outline on card       the secondary beside it
     .btn.solid   filled accent         one per screen, and often none
   .solid is opt-in for a reason — nothing in the app claims it yet. If a
   screen ever needs a single unmissable action, it takes it, and it is
   the only one on that screen that may. */
.btn{font-family:var(--ui);font-size:var(--fs-5);font-weight:600;
     border:1px solid var(--accent-line);cursor:pointer;border-radius:99px;
     padding:8px 18px;background:var(--accent-soft);color:var(--accent);
     text-decoration:none;
     transition:background .16s ease,border-color .16s ease,box-shadow .16s ease,
                transform .1s ease,color .16s ease}
.btn:hover{background:#EBE1D5;border-color:#CFC0AB;box-shadow:var(--sh-1)}
.btn.o{background:var(--card);color:var(--ink);border-color:var(--line)}
.btn.o:hover{border-color:var(--accent-line);color:var(--accent);background:var(--card)}
.btn.solid{background:var(--accent);border-color:var(--accent);color:#fff;box-shadow:var(--sh-1)}
.btn.solid:hover{background:#5B4027;border-color:#5B4027;box-shadow:var(--sh-2)}
.btn.on{background:var(--card);color:var(--live);border-color:var(--live)}
.btn.saveon{color:var(--accent);border-color:var(--accent);background:var(--card)}

.tabs{display:flex;gap:4px;border-top:1px solid var(--line);overflow-x:auto}
.tab{font-size:15px;font-weight:600;color:var(--muted);text-decoration:none;
     padding:13px 16px;border-bottom:3px solid transparent;white-space:nowrap;
     display:inline-flex;gap:7px;align-items:center}
.tab.sel{color:var(--accent);border-bottom-color:var(--accent)}
.tab .n{font-size:12px;font-weight:500;color:var(--faint)}
.tab.soon{cursor:default;opacity:.55}
.tab.soon .n{font-size:10px;text-transform:uppercase;letter-spacing:.05em}
.tabsp{margin-left:auto}
.tab.ptab{color:var(--faint)}
.tabsp+.tab.ptab{border-left:1px solid var(--line);border-radius:0;padding-left:18px}

.cols{display:grid;grid-template-columns:minmax(0,1fr) 328px;gap:24px;align-items:start}
/* the page rail keeps pace with the reader: pinned once it meets the
   chrome, scrolling its own overflow instead of the page's */
.cols>aside{position:sticky;top:var(--stick);max-height:calc(100vh - var(--stick));
  overflow-y:auto;overscroll-behavior:contain}
/* and it is ONE container — cards flatten into hairline-divided sections,
   because a column of stacked boxes reads as clutter, not as a rail */
.cols>aside:not(.railcol){background:var(--card);border:1px solid var(--line);
  border-radius:var(--r)}
.cols>aside:not(.railcol) .card{background:none;border:0;border-radius:0;
  margin:0;border-top:1px solid var(--line)}
.cols>aside:not(.railcol) .card:first-child{border-top:none}
/* Home inverts it: your own holdings lead, the world follows. A right rail
   reads as supplementary and this is the primary half of the page. */
.cols.railed{grid-template-columns:minmax(0,1fr) 296px}
/* signed out there is no second rail — the app rail already carries the
   directory, and three columns of chrome around one feed is a website */
.cols.solo{grid-template-columns:minmax(0,1fr)}
.railcol{min-width:0}
/* ── the secondary rail is the first thing to go ──
   The page wants 296px of app rail + a readable main + 328px of this, which
   needs ~1200px before anything is comfortable. Below that the rail used to
   stay and squeeze main, then stack underneath — where it is a long tail of
   chrome the reader scrolls past to reach the footer. It is secondary by
   definition: ideas, other rooms, the cross-reference card. Everything in it
   is reachable from the tabs or the app rail, so on a narrow screen it
   simply does not render.
   :not(.railcol) matters — on Home the rail IS the primary half (your own
   holdings lead), and that one has to survive. */
@media(max-width:1180px){
  .cols{grid-template-columns:minmax(0,1fr)}
  .cols>aside:not(.railcol){display:none}
}
.railcol .card{margin-bottom:14px}
.railcol .card:last-child{margin-bottom:0}
.railtop{border-color:var(--ink)}
.railacts{display:flex;align-items:center;gap:12px;margin-top:12px;flex-wrap:wrap}
.railways{display:flex;flex-direction:column;gap:8px;margin-top:14px;align-items:stretch}
.railways .btn{text-align:center;text-decoration:none}
.btn.sm{font-size:12.5px;padding:7px 14px;text-decoration:none;display:inline-block}
.raillink{font-size:12.5px;font-weight:600;color:var(--accent);text-decoration:none}
/* ═══ the directory layer ═══
   One tile, repeated, in a grid. Every discovery surface — Home's shelves,
   Explore, the idea library — is built from this and nothing else. */
.shelf{scroll-margin-top:74px;margin-bottom:30px}
.shelfhead{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:13px}
.shelfhead h2{font-family:var(--disp);font-weight:600;font-size:17px;letter-spacing:-.015em}
.shelfnote{font-size:12.5px;color:var(--faint)}
.shelfall{margin-left:auto;font-size:12.5px;font-weight:600;color:var(--accent);
  text-decoration:none;white-space:nowrap}
.shelfgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px}
@media(max-width:1180px){.shelfgrid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:900px){.shelfgrid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){.shelfgrid{grid-template-columns:minmax(0,1fr)}}

/* One tile, for lines and for ideas. They used to be two different
   anatomies sharing a grid, so on Explore the idea row read as line tiles
   whose images had failed to load.

   The cover art is gone. It was 84px of hue-tinted gradient with two
   hairlines and three dots: at four-up the tiles differed only by hue,
   three Reformed lines in one search result were three identical maroon
   squares, and on a phone it took half the tile and cropped its own dots
   mid-circle. It identified nothing.

   Nor did the 4px hue bar that replaced it. Sixteen tiles in a grid became
   sixteen coloured stripes — a rainbow of kanban cards, and the only place
   on the site where a line's colour arrived as decoration rather than as a
   mark. The tile now wears the sigil, the same face the line wears at 72px
   on its own page and at 28px in every rail, and the card is the app's
   card: 4px radius, one hairline, the house shadow. A disc is a line; a
   square is an idea. */
.ltile{position:relative;display:flex;flex-direction:column;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:15px 16px 13px;
  text-decoration:none;box-shadow:var(--sh-1);
  transition:border-color .16s ease,box-shadow .16s ease}
/* the whole card is the link. The name is still the only <a> — it just
   stretches its hit area over the tile — so the markup stays one tile, one
   destination, and the Follow button rides above it on its own layer. An
   explicit "Open →" was a second affordance for the thing the card already
   was. */
.ltile .ltname::after{content:"";position:absolute;inset:0}
.ltrow{position:relative;z-index:1}
.ltile:hover{border-color:var(--accent-line);box-shadow:var(--sh-2)}
.lthead{display:flex;align-items:center;gap:12px;min-height:40px}
/* the line's face. 40px sits between the page header's 72 and the rail's 28
   — big enough to read the glyph, small enough that the name still leads */
.ltface{width:40px;height:40px;flex-shrink:0;border-radius:50%;
  overflow:hidden;display:block}
.ltface svg{display:block;width:100%;height:100%}
/* an idea has no sigil — it has a pictogram, in the section chip from the
   detail pages, at the size those wear it */
.itile .ltface{width:34px;height:34px;border-radius:var(--r);
  overflow:visible;color:var(--accent)}
.itile .ltface svg{width:18px;height:18px}
.lthx{min-width:0;flex:1}
/* ── two ranks of title, and only two ──
   A faith is the largest object the app has: everything else is either
   inside one or travels between them. So a faith's name is the --t-lede
   rank and an idea, a figure, a rite or a story is one step below at
   --t-body. They were all --t-lede, which read as a flat world where an
   idea and a religion were the same size of thing. */
.ltname{font-family:var(--disp);font-weight:600;font-size:var(--t-lede);
  letter-spacing:-.01em;text-decoration:none;display:block;line-height:1.25}
.itile .ltname{font-size:var(--t-body);line-height:1.3}
.ltile:hover .ltname{color:var(--accent)}
/* full width, under the head row: beside a 40px face the counts wrapped to
   two lines on half the tiles and shoved every card to a different height */
.ltmeta{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.04em;
  color:var(--faint);margin-top:9px;text-transform:uppercase;display:block}
/* two lines of room whether or not there are two lines of tagline, so the
   footer rows line up across a shelf instead of floating at four heights */
.lttag{font-size:var(--t-sm);color:var(--muted);line-height:1.55;margin-top:9px;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
  overflow:hidden;min-height:3.1em}
.itile .lttag{-webkit-line-clamp:2}
/* the action row, same anatomy as .frow on every detail-page card */
.ltrow{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:12px}
.ltjoin{flex-shrink:0}
/* what a Follow becomes for a signed-out visitor, in place */
.askjoin{text-decoration:none;color:var(--accent);border-color:var(--accent);
  text-align:center;display:inline-flex;justify-content:center;align-items:center}

/* the rail version: the directory beside the feed, not above it */
/* faces sit on the title's line, not the row's vertical middle — centered
   against two lines of text they floated, which read as misalignment */
.mrow{display:flex;align-items:flex-start;gap:10px;padding:8px 0;
  border-top:1px solid var(--line)}
.mrow .mface{margin-top:0}
.mrow .fbtn{align-self:center}
.mrow:first-of-type{border-top:none;padding-top:2px}
.mface{width:30px;height:30px;border-radius:7px;flex-shrink:0;display:block}
.mbody{min-width:0;flex:1;text-decoration:none;display:block}
.mbody b{font-size:14px;font-weight:600;display:block;line-height:1.3;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mbody small{font-family:var(--mono);font-size:10.5px;letter-spacing:.04em;
  color:var(--faint);text-transform:uppercase}
.mrow:hover .mbody b{color:var(--accent)}
.fbtn.xs{font-size:11.5px;padding:4px 11px;flex-shrink:0}
/* the header's Join slot: name + time left, Follow filled at far right */
.fnrow{display:flex;align-items:baseline;gap:6px;min-width:0}
.ftime{font-family:var(--mono);font-size:var(--fs-1);color:var(--faint);
  text-transform:uppercase;letter-spacing:.09em;white-space:nowrap}
.fbtn.join{background:var(--ink);border-color:var(--ink);color:var(--card)}
.fbtn.join:hover{background:var(--ink);border-color:var(--ink);color:var(--card);opacity:.85}
.fbtn.join.on{background:var(--card);border-color:var(--line);color:var(--muted)}

/* the category rail — what kinds of thing are here, before you scroll */
.xhead{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;padding:24px 0 4px}
.xhead h1{font-family:var(--disp);font-weight:700;font-size:var(--t-h1);letter-spacing:-.02em}
.xstat{font-family:var(--mono);font-size:var(--fs-2);letter-spacing:.08em;
  text-transform:uppercase;color:var(--faint)}
/* One row, always. Wrapped, nine categories became a two- and three-line
   block that pushed the shelves down the page and read as a menu of
   everything rather than a rail you skim. A rail is one line you push
   sideways; app.js wraps each one and hangs the arrows off it, and the
   mask is what says there is more — a hard clip mid-word reads as a bug. */
.xrail{position:relative;margin:14px 0 26px}
.xchips{display:flex;gap:7px;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
  scroll-behavior:smooth;scrollbar-width:none;-ms-overflow-style:none;
  margin:14px 0 26px;padding:2px 0}
.xrail>.xchips{margin:0;--ml:0px;--mr:0px;
  -webkit-mask-image:linear-gradient(to right,transparent 0,#000 var(--ml),
    #000 calc(100% - var(--mr)),transparent 100%);
  mask-image:linear-gradient(to right,transparent 0,#000 var(--ml),
    #000 calc(100% - var(--mr)),transparent 100%)}
.xrail.more-l>.xchips{--ml:46px}
.xrail.more-r>.xchips{--mr:46px}
.xchips::-webkit-scrollbar{display:none}
.xrailgo{position:absolute;top:50%;transform:translateY(-50%);z-index:2;
  appearance:none;cursor:pointer;display:none;place-items:center;
  width:30px;height:30px;border-radius:50%;background:var(--card);
  border:1px solid var(--line);box-shadow:var(--sh-2);color:var(--muted);padding:0}
.xrailgo:hover{color:var(--ink);border-color:var(--accent-line)}
.xrailgo.on{display:grid}
.xrailgo.l{left:0}
.xrailgo.r{right:0}
.xchip{flex:none;font-family:var(--ui);font-size:13px;font-weight:600;color:var(--muted);
  background:var(--card);border:1px solid var(--line);border-radius:99px;
  padding:6px 14px;text-decoration:none;white-space:nowrap;
  transition:background .16s ease,border-color .16s ease,color .16s ease,
             box-shadow .16s ease,transform .1s ease}
.xchip:hover{border-color:var(--accent-line);color:var(--ink);box-shadow:var(--sh-1)}
.xchip.sel{background:var(--accent-soft);border-color:var(--accent-line);color:var(--accent)}

/* ═══ the control rail ═══
   The row under a directory's title: where you are (the views), what you
   are looking for (search), and what you are asking of it (the filter, a
   count of what you have changed, and the way back out).

   It used to be written twice — once in the Atlas's own stylesheet for the
   floating map controls, again server-side for its list views — which is
   how one row ended up holding a 35px tab strip, a 39px search field and a
   34px button. It is one component now: All Faiths and All Ideas wear the
   same rail, and it sits the same distance under the heading as Explore's
   chip rail does. */
.atbar{--ch:38px;display:flex;align-items:center;gap:var(--s3);flex-wrap:wrap;
  margin:14px 0 26px}
.atbar #atbarslot,.atbar .attl{display:contents}

/* ── the views: the one control that means the same thing in all of them ── */
.atviews{flex:0 0 auto;display:inline-flex;gap:2px;padding:3px;
  height:var(--ch);align-items:stretch;
  border:1px solid var(--line);border-radius:var(--r-pill);background:var(--card)}
.atviews .vsw{display:inline-flex;align-items:center;padding:0 16px;line-height:1;
  font-family:var(--ui);font-size:var(--t-sm);font-weight:600;color:var(--muted);
  border-radius:var(--r-pill);text-decoration:none}
.atviews .vsw:hover{color:var(--ink)}
.atviews .vsw.sel{background:var(--accent-soft);color:var(--accent)}

/* ── what you are looking for ── */
.atfind{position:relative;display:flex;align-items:center;width:296px;max-width:100%;
  background:var(--card);border:1px solid var(--line);border-radius:var(--r-pill);
  box-shadow:var(--sh-2)}
.atfind>svg{position:absolute;left:14px;color:var(--faint);pointer-events:none}
.atq{flex:1;min-width:0;font:500 var(--t-sm)/1 var(--ui);color:var(--ink);
  background:none;border:0;border-radius:var(--r-pill);
  padding:12px 74px 12px 38px;outline:0}
.atq::-webkit-search-cancel-button{display:none}
.atfind:focus-within{border-color:var(--accent-line);box-shadow:var(--sh-3)}
.atcount{position:absolute;right:14px;font-family:var(--mono);
  font-size:var(--t-meta);color:var(--faint);pointer-events:none}
.atbar .atfind{position:relative;top:auto;left:auto;height:var(--ch);
  flex:1 1 220px;max-width:360px;min-width:0}
.atbar .atq{height:100%;padding:0 74px 0 38px}

/* ── what you are asking of it ── */
.atchiprow{display:flex;gap:6px;flex-wrap:wrap}
.atbar .atchiprow{align-items:center;gap:var(--s2);flex:0 0 auto;min-height:var(--ch)}
.atmenu{position:relative}
.atmenu>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;
  gap:6px;white-space:nowrap;background:var(--card);border:1px solid var(--line);
  border-radius:var(--r-pill);box-shadow:var(--sh-1);padding:7px 12px;
  font:600 var(--t-sm)/1 var(--ui);color:var(--ink)}
.atmenu>summary::-webkit-details-marker{display:none}
.atmenu>summary::after{content:"▾";font-size:10px;color:var(--faint);margin-left:1px}
.atmenu>summary .k{font:500 var(--t-meta)/1 var(--mono);letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint)}
.atmenu>summary:hover{border-color:var(--accent-line)}
/* a control whose answer is no longer the default says so without being read */
.atmenu.act>summary{background:var(--accent-soft);border-color:var(--accent-line);
  color:var(--accent)}
.atmenu.act>summary .k{color:var(--accent);opacity:.75}
.atmenu[open]>summary{border-color:var(--accent-line);box-shadow:var(--sh-2)}
.atpop{position:absolute;top:calc(100% + 6px);left:0;z-index:20;
  width:288px;max-height:58vh;overflow:auto;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-3);
  padding:6px}
/* nineteen families is a list, not a menu of three */
.atfamsel .atpop{width:250px}
.atsep{font:500 var(--t-meta)/1 var(--mono);letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);
  margin:6px 4px 4px;padding-top:8px;border-top:1px solid var(--line)}
.atbar .atmenu{width:auto;min-width:150px;max-width:290px;flex:0 0 auto}
/* four sections of options is a sheet, not a dropdown — give it room and
   let it scroll rather than run off the bottom of a short window */
.atbar .atmenu.atwide .atpop{width:330px;max-height:min(70vh,560px);overflow:auto}
.atbar .atmenu>summary{width:100%;height:var(--ch);justify-content:flex-start;
  overflow:hidden}
.atbar .atmv,.atbar .atcv{flex:1;min-width:0;text-align:left;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}

/* ── the filter is an icon with a count ──
   "FILTER  All families ▾" spent up to 290px of the row announcing that
   nothing had been filtered, and changed width whenever it had. This is the
   toolbar pattern everybody already knows instead: an icon, a badge
   counting what you have changed, and a reset that exists only while there
   is something to reset. */
.atbar .atmenu.aticon{min-width:0;max-width:none;width:auto}
.atbar .atmenu.aticon>summary{width:var(--ch);padding:0;gap:0;
  justify-content:center;border-radius:50%;position:relative;overflow:visible}
.atmenu.aticon>summary::after{content:none}
/* the value stays in the DOM for screen readers — the badge is the sighted
   reader's version of the same sentence */
.atmenu.aticon .atmv,.atmenu.aticon .atcv{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip-path:inset(50%);white-space:nowrap}
/* a 330px sheet hangs off the right edge of a 38px trigger, not the left */
.atmenu.aticon .atpop{left:auto;right:0}
.atbadge{position:absolute;top:-5px;right:-5px;min-width:18px;height:18px;
  padding:0 5px;border-radius:9px;background:var(--accent);color:var(--card);
  font:700 10px/18px var(--mono);text-align:center;box-shadow:0 0 0 2px var(--bg)}
.atbadge[hidden]{display:none}

/* ── the round bar buttons: reset, info ── */
.atctl{appearance:none;border:0;background:none;cursor:pointer;
  width:38px;height:38px;display:grid;place-items:center;color:var(--muted)}
.atctl:hover{background:var(--bg);color:var(--ink)}
.atctl:active{background:var(--accent-soft);color:var(--accent)}
.atbar .atctl{width:var(--ch);height:var(--ch);border-radius:50%;flex-shrink:0;
  border:1px solid var(--line);background:var(--card);box-shadow:none}
.atbar .atctl[hidden]{display:none}

/* ── a menu row: the option, and what choosing it does ──
   The descriptions used to be title="" tooltips, which is where writing
   goes to die. In a sheet they are the second line of the row, so the
   difference between Family and Kinship is readable before you commit. */
.atseg.col{display:block}
.atseg.col button{position:relative;display:block;width:100%;text-align:left;
  appearance:none;border:0;background:none;cursor:pointer;
  border-radius:var(--r);padding:8px 10px 9px 28px;color:var(--ink)}
.atseg.col button b{font:600 var(--t-sm)/1.3 var(--ui);display:block}
.atseg.col button small{display:block;font:400 var(--t-meta)/1.45 var(--ui);
  color:var(--faint);margin-top:3px;white-space:normal}
.atseg.col button:hover{background:var(--bg)}
.atseg.col button.on{background:var(--accent-soft)}
.atseg.col button.on b{color:var(--accent)}
.atseg.col button.on::before{content:"✓";position:absolute;left:9px;top:9px;
  font:600 11px/1.4 var(--ui);color:var(--accent)}

/* nineteen families as a wrapping chip cloud was a second navigation you
   could not scan; in the sheet they are a list, sorted, counted, checkable */
.atfams{display:block}
.atfam{display:flex;align-items:center;gap:8px;width:100%;text-align:left;
  appearance:none;cursor:pointer;border:0;background:none;color:var(--ink);
  border-radius:var(--r);padding:7px 10px;font:500 var(--t-sm)/1.3 var(--ui)}
.atfam:hover{background:var(--bg)}
.atfam.on{background:var(--accent-soft);color:var(--accent);font-weight:600}
.atfam small{margin-left:auto;font-family:var(--mono);font-size:var(--t-meta);
  color:var(--faint)}
.atfam.on small{color:var(--accent);opacity:.7}
.atfamall{border-bottom:1px solid var(--line);border-radius:var(--r) var(--r) 0 0;
  margin-bottom:4px;padding-left:10px}

/* ── the methodology, on request ── */
/* margin:auto, because a modal dialog that is not centred reads as a page
   that failed to load rather than a sheet that opened */
.atdlg{border:0;padding:0;max-width:min(720px,92vw);width:100%;margin:auto;
  border-radius:var(--r-lg);background:var(--card);color:var(--ink);
  box-shadow:var(--sh-3)}
.atdlg::backdrop{background:rgb(26 24 21 / .38);backdrop-filter:blur(3px)}
.atdlgbody{padding:var(--s6) var(--s6) var(--s5);max-height:82vh;overflow:auto}
.atdlgx{position:absolute;top:10px;right:12px;appearance:none;border:0;
  background:none;cursor:pointer;font-size:22px;line-height:1;color:var(--faint);
  padding:4px 6px}
.atdlgx:hover{color:var(--ink)}

/* ═══ the stranger's front door ═══ */
.door{padding:32px 0 26px;border-bottom:1px solid var(--line);margin-bottom:24px;
  max-width:var(--m-read)}
.door h1{font-family:var(--disp);font-weight:700;font-size:var(--t-hero);
  line-height:1.08;letter-spacing:-.03em}
.door p{font-size:var(--t-lede);color:var(--ink);line-height:1.55;margin-top:var(--s4)}
.doorcta{display:flex;gap:10px;flex-wrap:wrap;margin-top:22px}
.doorcta .btn{font-size:14px;padding:10px 22px}
.doorstat{font-family:var(--mono);font-size:11px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);margin-top:18px}
@media(max-width:700px){.door{padding:30px 0 24px}.door h1{font-size:var(--t-h1)}
  /* the narrower viewport was getting the longer measure */
  .door p,.step span{max-width:60ch}}

/* the three jobs people arrive with, each one a door */
.steps{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;
  margin:0 0 30px}
@media(max-width:860px){.steps{grid-template-columns:minmax(0,1fr)}}
.step{display:flex;flex-direction:column;gap:7px;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:18px 20px;
  text-decoration:none}
.step:hover{border-color:var(--ink)}
.step b{font-family:var(--disp);font-size:16px;font-weight:600;line-height:1.3;
  letter-spacing:-.01em}
.step span{font-size:13px;color:var(--muted);line-height:1.6}
.stepgo{font-family:var(--ui);font-size:12.5px;font-weight:600;color:var(--accent);
  margin-top:auto;padding-top:4px}
/* search results: a block per kind, no card chrome competing with the rows */
.rblock{margin-bottom:26px}
.rblock .shelfhead{margin-bottom:6px}
.searchhint{font-size:14px;color:var(--muted);line-height:1.7;max-width:560px;
  margin-bottom:26px}
.xchip .xn{font-family:var(--mono);font-size:10px;opacity:.6;margin-left:3px}
.joinband{display:flex;align-items:center;gap:22px;flex-wrap:wrap;margin:30px 0 10px;
  background:var(--card);border:1px solid var(--ink);border-radius:var(--r);
  padding:20px 24px}
.joinband div{flex:1;min-width:260px}
.joinband b{font-family:var(--disp);font-size:16px;display:block;margin-bottom:4px}
.joinband span{font-size:13.5px;color:var(--muted);line-height:1.6}
.joinband .btn{white-space:nowrap}
/* the signed-out edition reads as prose, so it keeps a measure */
.feedcol.narrow{max-width:720px}
/* the crossing, flattened out of its two-column box */
.fside{font-size:14px;line-height:1.55;margin-top:9px;padding-left:12px;
  border-left:2.5px solid hsl(var(--h) 50% 55%);color:var(--muted)}
.fside b{color:var(--ink);font-weight:600}

/* the belief loop, asked under the passage that raised it */
.fstance{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px;
  padding:10px 12px;background:var(--bg);border-radius:var(--r)}
.fstq{font-size:12.5px;color:var(--muted);flex:1;min-width:180px}
.fstq a{color:var(--ink);font-weight:600;text-decoration:none;
  border-bottom:1px solid var(--line)}
.fstq a:hover{color:var(--accent);border-color:var(--accent)}
.fstacts{display:flex;gap:6px;flex-wrap:wrap}
.fstbtn{font-family:var(--ui);font-size:12px;font-weight:600;cursor:pointer;
  border:1px solid var(--line);background:var(--card);color:var(--ink);
  border-radius:99px;padding:5px 12px;white-space:nowrap}
.fstbtn:hover{border-color:var(--ink)}
.fstbtn.ghost{color:var(--faint)}
.fstbtn:disabled{opacity:.45;cursor:default}
.fstance.answered .fstq{display:none}
.fstance .qnote{font-size:12.5px;color:var(--muted)}

/* the question thread: each answer is a CONTAINED entry — its own surface,
   its own border — so three answers read as three posts, not one run-on
   paragraph. Shared by the Home card and /q/:slug. */
.qanswers,.qthread{margin-top:12px;display:flex;flex-direction:column;gap:9px}
.qans{background:var(--bg);border:1px solid var(--line-soft);
  border-radius:10px;padding:13px 16px 12px}
.qanshead{display:flex;align-items:center;gap:7px;font-family:var(--mono);
  font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--faint)}
.qanshead a{color:var(--ink);text-decoration:none;font-weight:500}
.qanshead a:hover{color:var(--accent)}
.qansclaim{font-family:var(--disp);font-size:15.5px;font-weight:600;
  line-height:1.4;margin:6px 0 10px}
.qanselab{font-size:13.5px;color:var(--muted);line-height:1.55;margin:-4px 0 10px}
.qpost{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
  padding:24px 26px;margin-bottom:14px}
.qposthead{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.qpost h1{font-family:var(--disp);font-weight:700;font-size:30px;
  letter-spacing:-.015em;line-height:1.15}
.qpost .lede{margin-top:8px}
.qthread{max-width:760px}
/* on the question page the ground is the page's beige, so the containers
   flip to card-white — the same figure/ground the feed's cards use */
.qthread .qans{background:var(--card);border-color:var(--line)}
.qansrow{display:flex;align-items:center;justify-content:space-between;
  gap:12px;flex-wrap:wrap}
.qrefs{display:flex;align-items:center;flex-wrap:wrap;gap:4px 12px;
  margin:-2px 0 11px}
.qrefl{font-family:var(--mono);font-size:10px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint)}
.qref{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);
  font-size:10.5px;letter-spacing:.04em;text-transform:uppercase;
  color:var(--muted);text-decoration:none}
.qref:hover{color:var(--accent)}
.qdiscuss{font-size:12.5px;font-weight:500;color:var(--muted);
  text-decoration:none;border:1px solid var(--line);border-radius:999px;
  padding:5px 13px;background:var(--card)}
.qdiscuss:hover{color:var(--ink);border-color:var(--faint)}
.halocount{font-family:var(--mono);font-size:11.5px;color:var(--faint);
  min-width:14px;text-align:right;margin-right:1px}
.qmore{display:flex;align-items:center;gap:16px;margin-top:13px;flex-wrap:wrap}
.qall{font-weight:600;font-size:13.5px;color:var(--accent);text-decoration:none}
.qall:hover{text-decoration:underline}
.qwrite{font-size:13px;color:var(--muted);text-decoration:none;
  border:1px dashed var(--line);border-radius:999px;padding:6px 14px}
.qwrite:hover{color:var(--ink);border-color:var(--faint)}

/* ═══ the belief pill — the one stance control (lib/halo.js) ═══
   One pill, glyph + word, deepening on tap like a Like button with floors:
   Resonates → I Believe → Core Belief. The glyph is the halo filling
   inward; a fourth tap takes the answer back off the map. */
.halo{display:inline-flex;flex-direction:column;gap:3px;align-items:flex-start}
.halopill{display:inline-flex;align-items:center;gap:7px;cursor:pointer;
  border:1px solid var(--line);border-radius:999px;background:var(--card);
  padding:5px 12px 5px 6px;
  font-family:var(--ui);font-size:var(--fs-3);font-weight:600;color:var(--muted);
  touch-action:manipulation;-webkit-tap-highlight-color:transparent;
  transition:transform .12s ease,border-color .2s ease,color .2s ease}
.halopill svg{display:block;flex:none}
.halopill .hr1,.halopill .hr2{transform:rotate(-90deg);transform-origin:center;
  transition:stroke-dashoffset .35s ease}
.halopill .hc{transition:opacity .25s ease}
.halopill:active{transform:scale(.95)}
/* state lives in the glyph and the word — never the border, which must
   stay one continuous weight through the seam */
.halopill.lit{color:var(--ink)}
/* ═══ the connected form ═══
   The belief pill and the disagree circle draw as ONE shape: each button's
   facing cap is cut away by a mask, and .haloseam bridges the gap with two
   drawn curves that cross — the waist of an infinity mark, tangent to both
   borders. */
.halo .halopill{background:var(--card);position:relative;height:32px;
  padding-top:0;padding-bottom:0}
/* The lemniscate junction: the labeled side loses its whole cap (17px),
   the icon circle loses only a 7px sliver of arc, and the seam's curves
   cross and land tangent on the circle exactly where that sliver ends —
   pill line becomes circle line, one continuous figure-eight. The margins
   and svg mirror when the label trades sides. */
.halo .hbelieve:not(.ico){padding-right:20px;
  -webkit-mask:linear-gradient(to right,#000 calc(100% - 17px),transparent calc(100% - 16px));
  mask:linear-gradient(to right,#000 calc(100% - 17px),transparent calc(100% - 16px))}
.halo .hbelieve.ico{
  -webkit-mask:linear-gradient(to right,#000 calc(100% - 7px),transparent calc(100% - 6px));
  mask:linear-gradient(to right,#000 calc(100% - 7px),transparent calc(100% - 6px))}
.halo .hdis:not(.ico){padding-left:20px;
  -webkit-mask:linear-gradient(to right,transparent 16px,#000 17px);
  mask:linear-gradient(to right,transparent 16px,#000 17px)}
.halo .hdis.ico{
  -webkit-mask:linear-gradient(to right,transparent 5px,#000 9px);
  mask:linear-gradient(to right,transparent 5px,#000 9px)}
.haloseam{flex:none;width:24px;height:32px;margin:0 -7px 0 -17px;
  position:relative;z-index:1;pointer-events:none}
.halo[data-refused] .haloseam{margin:0 -17px 0 -7px}
.halo[data-refused] .haloseam svg{transform:scaleX(-1)}
.haloseam svg{display:block}
/* emphasis ticks off the rings on a believe-tap (lib/halo.js haloBurst).
   Rotation sits inline on the outer span; only the inner span animates,
   with literal keyframes — var() inside keyframes is flaky on iOS. */
.hspark{position:absolute;width:0;height:0;pointer-events:none}
.hsparkin{display:block;width:2.5px;height:8px;margin:-4px 0 0 -1.25px;
  border-radius:2px;opacity:0;animation:hspark .45s ease-out forwards}
.hspark.far .hsparkin{animation:hsparkfar .55s ease-out forwards}
@keyframes hspark{0%{opacity:1;transform:translateY(-11px)}
  100%{opacity:0;transform:translateY(-22px) scaleY(.4)}}
@keyframes hsparkfar{0%{opacity:1;transform:translateY(-12px)}
  100%{opacity:0;transform:translateY(-30px) scaleY(.3)}}
@media (prefers-reduced-motion: reduce){.hspark{display:none}}
.halopill.ico{width:32px;height:32px;padding:0;justify-content:center;
  border-radius:50%;flex:none}
.halopill.ico .halolab{display:none}
.halopill.ico:not(.on) svg{opacity:.75}
.hdis .hdx{transition:stroke .2s ease}
.hdis.on{color:var(--ink)}
.hdis.on .hdx{stroke:var(--ink)}
.halo{flex-direction:row;align-items:center;gap:0}
.frow .halo{flex-direction:row;align-items:center}
/* the edition, demoted to a section once Home has become yours */
.fsect{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  margin:26px 0 12px;padding-top:18px;border-top:1px solid var(--line)}
.fsect h2{font-family:var(--mono);font-size:var(--fs-3);font-weight:500;
  letter-spacing:.14em;text-transform:uppercase}
.fsect span{font-size:12.5px;color:var(--faint)}
/* the end of the tree is where you conclude nothing here is yours */
.foundtail{display:flex;align-items:center;gap:20px;flex-wrap:wrap;
  background:var(--card);border:1px solid var(--ink);border-radius:var(--r);
  padding:18px 22px;margin-top:28px}
.foundtail div{flex:1;min-width:240px}
.foundtail b{font-family:var(--disp);font-size:15px;display:block}
.foundtail span{font-size:13px;color:var(--muted);line-height:1.6}
.foundtail .btn{text-decoration:none;white-space:nowrap}
/* said once, the first time the page graduates */
.grad{position:relative;background:var(--card);border:1px solid var(--ink);
  border-radius:var(--r);padding:14px 42px 14px 18px;margin-bottom:18px;
  font-size:13.5px;line-height:1.6;color:var(--muted)}
.grad b{color:var(--ink)}
.gradx{position:absolute;top:8px;right:10px;border:0;background:none;cursor:pointer;
  font-size:17px;line-height:1;color:var(--faint);padding:4px}
.gradx:hover{color:var(--ink)}
@media(max-width:960px){
  .cols.railed{grid-template-columns:minmax(0,1fr)}
  .railed .railcol{order:2;margin-top:22px}
  .railed .feedcol{order:1}
}
/* ── room to breathe ──
   Every gap below was one notch tighter than the scale's own step, which is
   how a page gets crowded without any single thing being wrong: 22px
   between blocks, 22px under the pinned header, 12px between cards, 12px
   under a block's own heading. All of them now land on the scale — and the
   two that matter most are the space under the header, so the content is
   not sitting on the chrome, and the gap between cards, which at 12px had
   the grid reading as one mass rather than as separate things. */
.main>*{margin-bottom:var(--s6)}
.block{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
       padding:var(--s5);box-shadow:var(--sh-1)}
/* ── the block header ──
   One rule: the name and the action share the title row, and the
   explanation goes underneath. It used to be a plain wrapping flex row, so
   whether the "All 83 faiths →" link sat beside the title or got shoved to
   a line of its own depended on how long that block's note happened to be —
   the Atlas explains itself in a sentence, so its link fell off the row
   while every other block's stayed on it. Same header, two behaviours,
   decided by prose length. `order` puts the action back on the title row
   and gives the note a full basis so it always starts a new one. */
.bh{display:flex;align-items:baseline;gap:6px 10px;margin-bottom:var(--s4);flex-wrap:wrap}
.bh>.n{order:3;flex:0 0 100%}
.bh>a{order:2;margin-left:auto}
.bh h2{font-family:var(--disp);font-weight:600;font-size:16px;letter-spacing:-.01em}
.bh h2 a{text-decoration:none;margin-left:0;font-size:inherit;font-weight:inherit;color:inherit}
.bh h2 a:hover{color:var(--accent)}
.card h3>a:first-of-type:hover{color:var(--accent)}
.bh .n{font-size:12px;color:var(--faint);font-weight:500}
.bh a{margin-left:auto;font-size:12.5px;font-weight:600;color:var(--accent);text-decoration:none}

.lede{font-family:var(--disp);font-weight:500;font-size:21px;line-height:1.45;
      letter-spacing:-.005em}
/* This is the reading column of the whole product — the context paragraph
   on every element, the history on every faith. It was 14.5px at 1.65,
   which is a caption's size set at a caption's leading and then asked to
   carry three hundred words. Body size, and the leading a body wants. */
.body p{font-size:var(--t-body);color:var(--muted);line-height:1.75;
        margin-top:var(--s4)}
.body a{text-decoration:none;border-bottom:1px solid var(--line);color:var(--ink)}
.body a:hover{color:var(--accent);border-color:var(--accent)}
.factrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}
.fact{background:var(--bg);border:1px solid var(--line);border-radius:var(--r);
      padding:7px 12px;font-size:12.5px}
.fact .lbl{display:block;font-size:10px;font-weight:600;letter-spacing:.05em;
           text-transform:uppercase;color:var(--faint)}

.claim{padding:16px 0;border-top:1px solid var(--line)}
.claim:first-of-type{border-top:none;padding-top:4px}
.chead{display:flex;align-items:baseline;justify-content:space-between;gap:14px}
.cnum{font-family:var(--mono);font-size:10.5px;color:var(--accent)}
.scope{font-size:11px;font-weight:600;color:var(--warn)}
.scope.maj{color:var(--faint)}
.ctext{font-family:var(--disp);font-weight:600;font-size:19px;line-height:1.35;
       letter-spacing:-.015em;margin-top:3px}
.celab{font-size:13.5px;color:var(--muted);margin-top:4px;line-height:1.55}
.caside{font-size:13px;color:var(--muted);font-style:italic;margin-top:8px;
        padding:9px 14px;background:var(--bg);border-radius:var(--r)}

.hd{display:inline-block;border-radius:50%;flex-shrink:0;position:relative;top:1px}
.kin{display:flex;gap:10px;padding:10px 0;border-top:1px solid var(--line);
     text-decoration:none;align-items:baseline}
.kin:first-of-type{border-top:none}
.kin b{font-size:14px;font-weight:600}
.kin:hover b{color:var(--accent)}
.kin span.sub{font-size:13px;color:var(--muted)}

.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
      padding:18px 20px;margin-bottom:20px;box-shadow:var(--sh-1)}
.card h3{font-family:var(--disp);font-weight:600;font-size:14.5px;letter-spacing:-.01em;
         margin-bottom:10px;display:flex;align-items:baseline;gap:8px}
.card h3 .n{font-size:11.5px;color:var(--faint);font-weight:500}
.kv{display:flex;justify-content:space-between;padding:5px 0;font-size:13px;color:var(--muted)}
.kv b{color:var(--ink);font-weight:600}

/* ═══ Today (the feed) ═══
   One grammar, repeated: head (who + why + when) → body → action row. The
   old feed gave every card its own anatomy and read as a shuffled magazine;
   a feed reads as one system only when the unit repeats. Variety lives in
   the body slot alone. */

/* an app bar, not a masthead — you return here daily, so it states where you
   are and gets out of the way */
.today{padding:22px 0 14px;border-bottom:1px solid var(--line);margin-bottom:20px}
.thead{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
.today h1{font-family:var(--mono);font-size:var(--fs-5);font-weight:500;
  letter-spacing:.17em;text-transform:uppercase}
.tdate,.tscope{font-family:var(--mono);font-size:var(--fs-2);letter-spacing:.09em;
  text-transform:uppercase;color:var(--faint)}
.tscope{margin-left:auto}
.chips.trail{margin-top:12px}

.feedcol{min-width:0;max-width:var(--m-read)}
.fcard{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
  padding:16px 20px 12px;margin-bottom:12px;position:relative;overflow:hidden;
  box-shadow:var(--sh-1)}
/* the line's colour, carried down the edge of anything drawn from it */
/* No hue stripe down the card edge. Every card in the column carried one,
   so a scroll was a column of coloured bars — decoration reading as
   signal. The line's colour is already on its avatar, where it identifies
   something. --h stays set: the quote rule and the crossing still use it. */

/* ─── the head: the actor, always in the same place ─── */
.fhead{display:flex;align-items:center;gap:10px;margin-bottom:13px}
.fav{width:34px;height:34px;border-radius:50%;flex-shrink:0;display:grid;
  place-items:center;color:#fff;font-family:var(--disp);font-weight:600;
  font-size:15px;text-decoration:none}
.fav.idea{background:var(--ink-soft);font-size:13px}
.favpair{display:flex;flex-shrink:0}
.favpair .fav:last-child{margin-left:-12px;box-shadow:0 0 0 2px var(--card)}
.fwho{min-width:0;flex:1;display:flex;flex-direction:column;gap:1px}
.fname{font-size:var(--fs-5);font-weight:600;text-decoration:none;letter-spacing:-.01em}
.fname:hover{color:var(--accent)}
.fphrase{font-size:var(--fs-4);color:var(--muted);line-height:1.35}
.fphrase a{color:var(--accent);text-decoration:none;font-weight:500}
.ftag{font-family:var(--mono);font-size:var(--fs-1);color:var(--faint);
  text-transform:uppercase;letter-spacing:.09em;white-space:nowrap;align-self:flex-start;
  padding-top:2px}

/* ─── the body: the only part allowed to vary ─── */
a.fmain{display:block;text-decoration:none;color:inherit}
.ftitle{font-family:var(--disp);font-weight:600;font-size:var(--fs-11);line-height:1.22;
  letter-spacing:-.025em}
.ftitle.sm{font-size:var(--fs-9);line-height:1.28}
.fmain:hover .ftitle{color:var(--accent)}
.flede{font-size:var(--fs-6);color:var(--muted);margin-top:7px;line-height:1.55;max-width:64ch}
.flede.sm{font-size:var(--fs-5);margin-top:5px}
.fquote{margin-top:13px;padding-left:14px;border-left:2px solid}
.fquote .q{font-family:var(--disp);font-size:var(--fs-8);font-weight:500;
  line-height:1.45;color:var(--ink);letter-spacing:-.01em}
.fquote cite{display:block;font-family:var(--mono);font-size:var(--fs-2);
  font-style:normal;color:var(--faint);margin-top:7px;letter-spacing:.03em}
.fctx{font-size:var(--fs-5);color:var(--muted);line-height:1.6;margin-top:12px;max-width:var(--m-prose)}

/* ─── the row: the same actions, in the same order, on every card ─── */
.frow{display:flex;align-items:center;gap:8px;margin-top:14px;padding-top:11px;
  border-top:1px solid var(--line)}
.fbtn{font-family:var(--ui);font-size:var(--fs-3);font-weight:600;cursor:pointer;
  border:1px solid var(--line);background:var(--card);color:var(--muted);
  border-radius:99px;padding:5px 13px;text-decoration:none;line-height:1.5;
  transition:background .16s ease,border-color .16s ease,color .16s ease,
             box-shadow .16s ease,transform .1s ease}
.fbtn:hover{border-color:var(--accent-line);color:var(--ink);box-shadow:var(--sh-1)}
.fbtn.on{background:var(--accent-soft);border-color:var(--accent-line);color:var(--accent)}
.fbtn[disabled]{opacity:.5;cursor:default}
.fopen{margin-left:auto;font-size:var(--fs-3);font-weight:600;color:var(--accent);
  text-decoration:none;white-space:nowrap}
.fopen:hover{color:var(--ink)}
.followed-note{font-size:var(--fs-3);color:var(--live)}

/* scoped past a.fmain{display:block}, which otherwise out-specifies these */
.fcard .frite,.fcard .ffig{display:flex;gap:14px}
.fritebody,.ffigbody{min-width:0}
.fcard .fmark{width:44px;height:44px;border-radius:50%;flex-shrink:0;display:grid;
  place-items:center;color:#fff;font-family:var(--disp);font-weight:600;font-size:19px}
.frite .ricon{flex-shrink:0}
.fcard .ritemeta{display:grid}

/* two lines that never met, holding the same idea — same width, no winner */
.fpair{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.pside{display:block;background:var(--card);padding:15px 17px;
  text-decoration:none;color:inherit}
.pside:hover{background:var(--bg)}
.phead{display:flex;align-items:center;gap:6px;font-family:var(--mono);
  font-size:var(--fs-2);font-weight:500;letter-spacing:.07em;text-transform:uppercase;
  color:hsl(var(--h) 40% 32%)}
.ptext{display:block;font-family:var(--disp);font-weight:600;font-size:var(--fs-8);
  line-height:1.3;letter-spacing:-.02em;margin-top:9px}
.pside:hover .ptext{color:var(--accent)}
.pelab{display:block;font-size:var(--fs-4);color:var(--muted);line-height:1.5;margin-top:6px}

/* the introduction card: a line arrives wearing its own generated face */
.fline{padding:16px 0 12px}
.fline .fhead{padding:0 20px}
.flcover{display:block;line-height:0}
.flcover svg{width:100%;height:88px;display:block}
.flbody{padding:14px 20px 0}
.fline .frow{margin:14px 20px 0}

.fend{display:flex;flex-direction:column;gap:6px;align-items:center;
  text-align:center;padding:18px 0 4px}
.fend:before{content:"✦";display:block;color:var(--faint);font-size:11px;
  margin-bottom:10px}
.fmore{font-family:var(--mono);font-size:var(--fs-3);font-weight:500;
  letter-spacing:.06em;text-transform:uppercase;color:var(--accent);text-decoration:none}
.fback{font-size:var(--fs-3);color:var(--faint);text-decoration:none}

.cardnote{font-size:12px;color:var(--faint);margin-top:10px;line-height:1.55}
.prow{display:block;text-decoration:none;padding:9px 0;border-top:1px solid var(--line)}
.prow:first-of-type{border-top:none;padding-top:2px}
.phd{display:flex;align-items:center;gap:6px;font-size:13px}
.phd b{font-weight:600}
.phd em{margin-left:auto;font-style:normal;font-family:var(--mono);font-size:10.5px;
  color:var(--faint)}
.prow:hover b{color:var(--accent)}
.pbar{display:block;height:4px;border-radius:99px;background:var(--line);
  margin-top:7px;overflow:hidden}
.pbar i{display:block;height:100%;border-radius:99px}

@media(max-width:700px){
  .fpair{grid-template-columns:1fr}
  .fcard .frite,.fcard .ffig{gap:12px}
  .fcard{padding:14px 16px 10px}
  .fline{padding:14px 0 10px}
  .fline .fhead,.fline .frow{padding-left:16px;padding-right:16px}
  .fline .frow{margin-left:0;margin-right:0}
  .flbody{padding:12px 16px 0}
  .tscope{margin-left:0;flex-basis:100%}
}

/* ═══ page heads ═══
   Every surface used to open with a 40px+ marketing headline. That is a
   website move; this is an app you return to, so a page head states where
   you are in one line and hands the space back to the content. */
.loghero{padding:22px 0 14px;border-bottom:1px solid var(--line);margin-bottom:20px}
/* This was mono at 13px, which is how /c/ritual ended up with a page title
   smaller than its own body copy and smaller than every h2 on the page.
   One page-title treatment now, shared with .xhead. */
.loghero h1{font-family:var(--disp);font-size:var(--t-h1);font-weight:700;
  letter-spacing:-.02em;text-transform:none}
.loghero p{font-size:var(--fs-6);color:var(--muted);margin-top:6px;max-width:64ch}
.loghero .stats{font-family:var(--mono);font-size:var(--fs-2);color:var(--faint);
                margin-top:10px;letter-spacing:.09em;text-transform:uppercase}
.logline{position:relative;padding-left:34px}
.logline::before{content:"";position:absolute;left:12px;top:8px;bottom:8px;
                 width:2px;background:var(--line)}
.commit{position:relative;padding:13px 0 13px 0}
.commit .node{position:absolute;left:-28px;top:19px;width:13px;height:13px;
              border-radius:50%;border:2.5px solid var(--card);box-shadow:0 0 0 1px var(--line)}
.commit .yr{font-family:var(--mono);font-size:10.5px;color:var(--faint);letter-spacing:.04em}
.commit h3{font-family:var(--disp);font-weight:600;font-size:16.5px;letter-spacing:-.01em;
           margin-top:2px}
.commit h3 a{text-decoration:none}
.commit h3 a:hover{color:var(--accent)}
.commit .what{font-size:13.5px;color:var(--muted);margin-top:2px}
.commit .what a{font-weight:600;text-decoration:none;color:var(--ink)}
.commit .what a:hover{color:var(--accent)}

.rootrow{display:flex;gap:10px;padding:9px 0;border-top:1px solid var(--line);
         align-items:center;text-decoration:none}
.rootrow:first-of-type{border-top:none}
.rootrow .sw{width:38px;height:26px;border-radius:5px;flex-shrink:0}
.rootrow b{font-size:13.5px;font-weight:600;display:block;line-height:1.3}
.rootrow small{font-size:11.5px;color:var(--faint)}
.rootrow:hover b{color:var(--accent)}

/* ═══ homepage major cards ═══ */
.majors{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.syscard{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
         overflow:hidden;box-shadow:var(--sh-1)}
.syscard .cv{display:block;line-height:0}
.syscard .cv svg{width:100%;height:120px;display:block}
.scbody{padding:13px 16px 15px}
.scname{font-family:var(--disp);font-weight:800;font-size:17px;letter-spacing:-.02em;
        text-decoration:none;display:inline-block}
.scname:hover{color:var(--accent)}
.sctag{font-size:12.5px;color:var(--muted);margin-top:3px;line-height:1.45}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
/* square, not pill — actions wear pills, data wears rectangles, and the
   difference is doing work: a chip is a place, a pill is a verb */
.chip{font-size:var(--fs-3);font-weight:500;border:1px solid var(--line);border-radius:2px;
      padding:4px 9px;text-decoration:none;display:inline-flex;gap:5px;
      align-items:center;background:var(--card)}
.chip:hover{border-color:var(--ink)}
.chip.more{font-family:var(--mono);font-size:var(--fs-2);letter-spacing:.08em;
      text-transform:uppercase;color:var(--ink);border-color:var(--ink)}
.chip.newline{border-style:dashed}
.chip .nl{font-family:var(--mono);font-size:9px;color:var(--warn);text-transform:uppercase;letter-spacing:.06em}

/* the next layer: tenet/rite pages and their doors */
.tclaim{font-family:var(--disp);font-weight:600;font-size:30px;line-height:1.25;letter-spacing:-.015em;margin-top:6px}
a.claim,a.ritecard{text-decoration:none;color:inherit;display:block}
.tlink .godeep,.godeep{margin-top:8px;font-size:11.5px;font-weight:600;color:var(--accent)}
.tlink .godeep{display:block}
.tlink:hover .godeep,.godeep:hover{color:var(--ink)}
.tgo{text-decoration:none}
.tgo:hover{color:var(--accent)}
.scrip{border-left:3px solid;padding:4px 0 4px 18px;margin:16px 0}
.scrip .squote{font-family:var(--disp);font-size:var(--fs-8);font-weight:500;
  line-height:1.45;letter-spacing:-.01em}
.scrip cite{display:block;margin-top:7px;font-style:normal;font-family:var(--mono);font-size:11px;color:var(--muted)}
.scrip .snote{font-size:12.5px;color:var(--faint);margin-top:4px}

/* nav search + typeahead */
/* ═══ the app shell ═══
   A top bar for identity, creation and search; a persistent left rail for
   every destination and whatever the page wants to suggest. Emitted by
   nav() so every route gets the same chrome, and positioned fixed so no
   page had to change its own markup to gain it. */
.side{position:fixed;left:0;top:53px;bottom:0;width:288px;overflow-y:auto;
  padding:22px 18px 28px;border-right:1px solid var(--line);background:var(--card);
  display:flex;flex-direction:column;gap:8px;z-index:20}
.sdnav,.sdsec{display:flex;flex-direction:column;gap:2px}
.sdsec{padding-top:16px;margin-top:10px;border-top:1px solid var(--line)}
.sdh{font-family:var(--mono);font-size:11px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--faint);padding:2px 12px 8px}
/* section headers double as accordion toggles */
summary.sdh{display:flex;align-items:center;justify-content:space-between;
  cursor:pointer;list-style:none;user-select:none}
summary.sdh::-webkit-details-marker{display:none}
summary.sdh:hover{color:var(--muted)}
.sdchev{color:var(--faint);transition:transform .15s ease;flex-shrink:0}
details.sdcard:not([open]) .sdchev{transform:rotate(-90deg)}
details.sdcard:not([open]){padding-bottom:10px}
.sdl{display:flex;align-items:center;gap:12px;padding:9px 12px;border-radius:8px;
  font-family:var(--ui);font-size:14.5px;font-weight:500;color:var(--ink);
  text-decoration:none;white-space:nowrap}
.sdl svg{color:var(--muted);flex-shrink:0}
.sdl:hover{background:var(--bg)}
.sdl:hover svg{color:var(--ink)}
.sdl.on{background:var(--bg);font-weight:600}
/* views of Explore, subordinate to it — not a fourth group of peers */
.sdl.sub{padding-left:31px;font-size:13.5px;font-weight:400;color:var(--muted);gap:9px}
.sdl.sub svg{color:var(--faint)}
.sdl.sub:hover{color:var(--ink)}
/* the page's own suggestions, in the rail */
.sdcard{padding:16px 4px 0;margin-top:10px;border-top:1px solid var(--line)}
/* headers and see-alls sit flush with the rows' faces, not indented past them */
.sdcard .sdh,.sdcard .sdmore{padding-left:0}
.sdcard .mrow{padding:9px 0}
.sdcard .mface{width:28px;height:28px;border-radius:6px}
.sdmore{display:block;font-size:12px;font-weight:600;color:var(--accent);
  text-decoration:none;padding:8px 8px 0}
.mrowlink{text-decoration:none}
/* flows after the rail's content — pinned to the rail's bottom it sat
   under a column of dead space on short rails */
.sdfoot{gap:10px}
.sdfoot .btn{text-align:center}
.sdfoot p{font-size:11px;color:var(--faint);line-height:1.5}
/* content clears the rail, then centers in the space that remains — a bare
   margin-left:238px killed the auto-centering and left everything hugging
   the rail on wide screens */
.page{margin-left:max(288px,calc((100% - var(--pw) + 288px)/2))}
body>nav{position:sticky;top:0;z-index:30}
.navlinks{display:none;gap:18px;align-items:center}
@media(max-width:1040px){
  .side{display:none}
  .page{margin-left:0}
  .navlinks{display:flex}
}

/* Search is how you get anywhere in a corpus this wide, so it takes the
   middle of the bar and most of the room, the way Reddit's does. */
.navsearch{position:relative;flex:1;max-width:640px;margin:0 auto;display:flex;
  align-items:center;gap:9px;background:var(--bg);border:1px solid var(--line);
  border-radius:99px;padding:0 16px}
.navsearch:focus-within{border-color:var(--ink);background:var(--card)}
.navsearch .pqi{color:var(--faint);flex-shrink:0}
.navsearch:focus-within .pqi{color:var(--ink)}
.navsearch input{width:100%;border:0;background:none;padding:9px 0;
  font:400 14px/1.5 var(--ui);color:var(--ink);outline:none}
.navsearch input::placeholder{color:var(--faint)}
#pqd{position:absolute;top:44px;left:0;right:0;background:var(--card);
  border:1px solid var(--line);border-radius:14px;box-shadow:var(--sh-3);
  padding:8px;max-height:74vh;overflow:auto;z-index:40}
.pqh{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;
  color:var(--faint);padding:10px 10px 4px}
.pqr{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:10px;
  text-decoration:none;font-size:13.5px}
.pqr b{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}
.pqr:hover{background:var(--bg)}
.pqr .hd{flex-shrink:0}
/* a completion: magnifier, then the query it would run */
.pqs .pqm{color:var(--faint);flex-shrink:0}
.pqs b{font-weight:500}
/* an entity: face, name, and what it is */
.pqf{width:28px;height:28px;border-radius:7px;flex-shrink:0;display:grid;
  place-items:center;color:#fff;font-size:13px}
.pqf.idea{background:var(--ink-soft)}
.pqt{min-width:0;flex:1}
.pqt small{display:block;color:var(--faint);font-size:11.5px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.pqall{color:var(--accent);font-weight:600;justify-content:center;margin-top:6px;
  border-top:1px solid var(--line);border-radius:0;padding-top:11px}
.pqall small{display:none}
/* mono uppercase links are wider than the sentence-case ones they replaced,
   so below the search breakpoint the bar scrolls rather than clipping its
   last item off the right edge */
@media (max-width:760px){
  /* Search is primary now, so it wraps to its own full-width row rather
     than being hidden — the bar stops scrolling sideways and stacks. */
  .navin{gap:13px;padding:10px 16px;flex-wrap:wrap;overflow:visible}
  .navin .navlink{font-size:var(--fs-2);white-space:nowrap}
  .navsearch{order:9;flex-basis:100%;max-width:none;margin:2px 0 0}
  #pqd{top:42px}
  .brand{flex-shrink:0}
  .navwho{flex-shrink:0}
  .page{padding:0 16px}
}

/* the passage treatments: source pull-quotes, context teasers, storycards */
.tsrc{margin-top:11px;padding-left:14px;border-left:2.5px solid}
.tsrc .q{font-family:var(--disp);font-weight:500;font-size:var(--fs-7);
  line-height:1.45;letter-spacing:-.01em;color:var(--ink)}
.tsrc cite{font-style:normal;font-family:var(--mono);font-size:10.5px;color:var(--faint)}
.tteaser{margin-top:10px;font-size:13.5px;color:var(--muted);line-height:1.6;
  position:relative;max-height:3.3em;overflow:hidden;max-width:640px}
.tteaser:after{content:"";position:absolute;inset:auto 0 0 0;height:1.8em;
  background:linear-gradient(transparent,var(--card))}
.storycard{padding:22px 0;border-top:1px solid var(--line)}
.storycard:first-of-type{border-top:none}
.stover{font-family:var(--mono);font-size:10.5px;letter-spacing:.09em;
  text-transform:uppercase;margin-bottom:9px}
.stbody{font-family:var(--disp);font-size:19px;line-height:1.6;font-weight:500;
  letter-spacing:-.005em;max-width:660px}
.ritemeta{margin-top:12px;padding-top:10px;border-top:1px solid var(--line);
  display:grid;gap:4px}
.ritemeta span{font-size:12.5px;color:var(--muted)}
.ritemeta b{font-family:var(--mono);font-size:9.5px;font-weight:500;letter-spacing:.08em;
  text-transform:uppercase;color:var(--faint);margin-right:7px}
.figgrid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:6px}
.figcard{display:flex;gap:14px;padding:16px;border:1px solid var(--line);
  border-radius:var(--r);background:var(--card);text-decoration:none;color:inherit;
  box-shadow:var(--sh-1)}
.figcard .fmark{width:44px;height:44px;border-radius:50%;flex-shrink:0;
  display:grid;place-items:center;color:#fff;font-family:var(--disp);
  font-weight:600;font-size:19px}
.figcard .figbody{min-width:0}
@media (max-width:760px){.figgrid{grid-template-columns:1fr}}

/* the app shell's hairline progress bar */
#navprog{position:fixed;top:0;left:0;right:0;height:2px;background:var(--accent);
  transform-origin:0 0;transform:scaleX(0);opacity:0;z-index:99;pointer-events:none}

/* motion: cross-page transitions + content rise; honors reduced-motion.
   Persistent chrome (nav, a system's cover and header) pairs with itself on
   the next page and holds still — tabs never feel like reloads. The active
   tab indicator slides between tabs; only the content below rises. */
@view-transition{navigation:auto}
/* body>nav only — the rail's sdnav is also a <nav>, and two elements
   sharing the name abort every view transition with an InvalidStateError */
body>nav{view-transition-name:site-nav}
.cover{view-transition-name:sys-cover}
.headcard{view-transition-name:sys-head}
.tab{transition:color .16s ease,border-color .16s ease}
@media (prefers-reduced-motion:no-preference){
  ::view-transition-old(root),::view-transition-new(root){animation-duration:.18s}
  @keyframes rise{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
  .loghero,.today,.block,.fcard,aside .card,.syscard{
    animation:rise .35s cubic-bezier(.2,.7,.3,1) backwards}
  .feedcol .fcard:nth-child(2){animation-delay:.04s}
  .feedcol .fcard:nth-child(3){animation-delay:.08s}
  .feedcol .fcard:nth-child(4){animation-delay:.12s}
  .feedcol .fcard:nth-child(5){animation-delay:.16s}
  .fcard{transition:box-shadow .16s ease,border-color .16s ease,transform .16s ease}
  .fcard:hover{box-shadow:var(--sh-2);transform:translateY(-1px)}
  .cols main .block:nth-child(2){animation-delay:.04s}
  .cols main .block:nth-child(3){animation-delay:.08s}
  .cols main .block:nth-child(4){animation-delay:.12s}
  .cols main .block:nth-child(5){animation-delay:.16s}
  aside .card:nth-child(1){animation-delay:.06s}
  aside .card:nth-child(2){animation-delay:.1s}
  aside .card:nth-child(3){animation-delay:.14s}
  aside .card:nth-child(4){animation-delay:.18s}
  .majors .syscard:nth-child(2){animation-delay:.06s}
  .majors .syscard:nth-child(3){animation-delay:.12s}
  .majors .syscard:nth-child(4){animation-delay:.09s}
  .majors .syscard:nth-child(5){animation-delay:.15s}
  .majors .syscard:nth-child(6){animation-delay:.21s}
  .syscard,.chip,.kin,.rootrow,a.ritecard,.idea,.figcard{
    transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease,background .16s ease}
  .syscard:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
  .chip:hover{transform:translateY(-1px)}
  .idea:hover{transform:translateY(-1px);box-shadow:var(--sh-1)}
  a.ritecard:hover{transform:translateY(-2px);box-shadow:var(--sh-2)}
  .figcard:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:var(--accent-line)}
  /* a press should feel like a press: the lift comes back out under the
     cursor, which is the whole reason the resting shadow exists */
  .btn:active,.navnew:active,.fbtn:active,.xchip:active,.secbtn:active{transform:translateY(1px)}
  .syscard:active,.figcard:active,a.ritecard:active{transform:translateY(0);box-shadow:var(--sh-1)}
  #pqd{animation:drop .16s ease-out}
  @keyframes drop{from{opacity:0;transform:translateY(-4px) scale(.99)}to{opacity:1;transform:none}}
}
@media(max-width:900px){.majors{grid-template-columns:1fr 1fr}}
@media(max-width:600px){.majors{grid-template-columns:1fr}}

/* ═══ branch editor ═══ */
.f-label{display:block;font-size:11px;font-weight:600;letter-spacing:.05em;
         text-transform:uppercase;color:var(--faint);margin:16px 0 5px}
.f-in{width:100%;border:1px solid var(--line);border-radius:var(--r);padding:9px 12px;
      font:inherit;background:var(--card);color:var(--ink)}
.f-in:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:transparent}
textarea.f-in{resize:vertical;line-height:1.55}
.claimedit{border:1px solid var(--line);border-radius:var(--r);padding:12px 14px;
           margin-top:10px;background:var(--card)}
.claimedit .keeprow{display:flex;gap:8px;align-items:center;font-size:12px;
                    font-weight:600;color:var(--muted);margin-bottom:8px}
.claimedit textarea{margin-top:6px}
.claimedit.dropped{opacity:.45}
.formnote{font-size:12.5px;color:var(--faint);margin-top:6px;line-height:1.5}

/* ═══ spec grid + anatomy visuals ═══ */
/* article kicker: a label, not a heading — it must never outweigh the lede */
.eyebrow{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.08em;
     text-transform:uppercase;color:var(--faint);margin-bottom:10px}
/* in-article chapter heading (history entries): a running head inside one
   container — below the lede (21px), above body (16px) */
.chh{font-family:var(--disp);font-weight:700;font-size:17px;letter-spacing:-.01em;
     margin:28px 0 8px;padding-top:20px;border-top:1px solid var(--line)}
/* fact rows: the de-boxed spec list (.lst register) — label gutter, hairline
   separators, no cells and so no empty cells */
.factrows{margin-top:18px;border-top:1px solid var(--line)}
.factrow{display:flex;gap:18px;padding:9px 2px;border-bottom:1px solid var(--line);
      font-size:14px;line-height:1.5}
.factrow .lbl{font-family:var(--mono);font-size:11px;letter-spacing:.07em;
      text-transform:uppercase;color:var(--faint);flex:0 0 96px;padding-top:3px}
/* ── the facts row ──
   This was a hard 3-column table: a full border, 1px gridlines and cells at
   a third of the width each, dropped between the lede and the prose. Three
   columns is right when the values are short and wrong when they are a
   sentence, which they usually are — every cell wrapped to three lines and
   the whole thing read as a spec sheet interrupting an essay. Now it is
   auto-fitting so a long value takes the room it needs, and the gridlines
   are gone: a hairline above each label is enough to group them. */
/* Two columns, never three. auto-fit fitted a third into a ~790px reading
   column and each cell dropped to about thirty characters, which is a
   caption's measure being asked to hold a sentence. */
.specgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));
          gap:var(--s5) var(--s6)}
/* And the facts sit BELOW the prose in the hierarchy, not above it. They
   were --ink against a --muted body: darker than the paragraph they
   annotate, so the eye read the summary table first and the actual writing
   second. Same colour as the body now, one size down. */
.spec{font-size:var(--t-sm);line-height:1.55;color:var(--muted);
      padding-top:9px;border-top:1px solid var(--line)}
.spec .lbl{display:block;font-family:var(--mono);font-size:var(--t-meta);
           letter-spacing:.06em;text-transform:uppercase;color:var(--faint);
           margin-bottom:4px}
.bicon{width:26px;height:26px;border-radius:var(--r);display:grid;place-items:center;
       background:var(--bg);border:1px solid var(--line);flex-shrink:0}
.bh .bicon{position:relative;top:4px}
/* ═══ the element card ═══
   The one component every element on a line renders as — see lib/anatomy.js
   for why. Before it there were four shells, two mark systems with different
   geometry, three title sizes and a .godeep with no rule in this file at all.
   Everything below is deliberately boring: one box, one title, one link, and
   exactly two axes of variation (weight, and the mark's skin). */
/* ── the document view ──
   The entry page's building blocks. Every measurement below used to be an
   inline style at the call site: the section heading carried margin-top:26px
   four times, the lede margin-top:8px, the chips 12, the spec grid 18. One
   rule each now, so an inner view that composes docSection gets the same
   rhythm without knowing the number. */
/* the document wears the same 40px mark the card did, so clicking a card
   and arriving here is visibly the same object, not a new one */
.doceyebrow{display:flex;align-items:center;gap:var(--s3);margin-bottom:var(--s3);
  flex-wrap:wrap}
.dockind{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.05em;
  text-transform:uppercase;color:var(--faint)}
/* A document's prose runs the full width of its container, like everything
   else in it. A 64ch measure was tried and it was worse here, not better:
   the facts grid, the section rules and the cards all span the block, so a
   paragraph stopping two thirds of the way across read as a mistake rather
   than as typographic care. The container is the measure — if the lines get
   too long the block gets narrower, not the paragraph inside it. */
.dochead .lede{margin-top:var(--s3)}
.dochead .chips{margin-top:var(--s4)}
.specgrid{margin-top:var(--s6)}
.docsec{margin-top:var(--s7)}
.docsec{margin-top:var(--s6)}
.docsec>.subhead{margin-top:0}
/* two shapes for the sub-line, both named — beside the title, or beneath it */
.kin .sub.blk{display:block}

.egrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(292px,1fr));
  gap:var(--s4)}
.elist{display:flex;flex-direction:column}

.ecard{position:relative;display:flex;gap:var(--s4);align-items:flex-start;
  color:inherit;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r);padding:var(--s5);
  box-shadow:var(--sh-1)}
/* the title is the link, and its ::after is the card's hit area — the card
   itself must not be an <a>, because woven concept links live inside it */
a.etitle{text-decoration:none}
a.etitle::after{content:"";position:absolute;inset:0;z-index:1}
/* …and those inner links have to sit above that hit area to stay clickable */
.ecard .wv,.ecard .elede a{position:relative;z-index:2}
/* the lighter weight: same anatomy, no furniture — for the kinds you read
   down a list of rather than pick out of a grid */
.ecard.flat{background:none;border:0;border-radius:0;box-shadow:none;
  padding:var(--s5) 0;border-top:1px solid var(--line)}
.elist>.ecard.flat:first-child{border-top:0;padding-top:var(--s2)}

/* ONE box for both skins. The silhouette must not move between a figure and
   a rite, or the eye reads "different component" instead of "different
   thing". Only the fill and what sits inside it change. */
.emark{width:40px;height:40px;border-radius:10px;flex-shrink:0;
  display:grid;place-items:center;overflow:hidden}
/* the same light tint the pictograms wear — a figure was arriving as a dark
   saturated medallion, which made every person on a page the heaviest thing
   on it and broke the one-box premise the moment the two sat side by side */
.emark.face{font-family:var(--disp);font-weight:600;font-size:16px;line-height:1}
.emark.glyph svg{width:20px;height:20px;display:block}
/* the rail's copy of the same box, scaled — a size, not a second treatment */
.kin .emark{width:28px;height:28px;border-radius:8px;align-self:center}
.kin .emark.face{font-size:13px}
.kin .emark.glyph svg{width:15px;height:15px}

.ebody{min-width:0;flex:1;display:flex;flex-direction:column}
/* status flags sit UNDER the title, never over it — nothing is allowed
   between the mark and the name it belongs to */
.ehead{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-top:9px}
/* an element is a thing inside a faith — one rank below the faith's name */
.etitle{font-family:var(--disp);font-weight:600;font-size:var(--t-body);
  line-height:1.38;letter-spacing:-.01em;color:var(--ink)}
.ecard:hover .etitle{color:var(--accent)}
.elede{font-size:var(--t-sm);color:var(--muted);line-height:1.55;margin-top:5px;
  display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.ecard .ritemeta{margin-top:11px;padding-top:9px}
/* one placement, one style, and now an actual rule: this used to be three
   copies of an inline style and a class that matched nothing */
.godeep{margin-top:11px;font-size:var(--t-meta);font-weight:600;
  color:var(--accent);text-decoration:none;align-self:flex-start}
.ecard:hover .godeep{color:#5B4027}
@media (prefers-reduced-motion:no-preference){
  .ecard{transition:box-shadow .16s ease,border-color .16s ease,transform .16s ease}
  .ecard:not(.flat):hover{box-shadow:var(--sh-2);transform:translateY(-1px)}
}

.ritegrid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.ritecard{background:var(--bg);border:1px solid var(--line);border-radius:var(--r);
          padding:16px}
.ritecard .ctext{margin-top:10px;font-size:17px}
.ricon{width:42px;height:42px;border-radius:var(--r);display:grid;place-items:center;
       background:var(--card);border:1px solid var(--line)}
.subhead{font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
         color:var(--faint);margin:var(--s6) 0 var(--s4);padding-bottom:var(--s2);
         border-bottom:1px solid var(--line)}
.subhead:first-child{margin-top:0}
.subhead+.claim{border-top:none}
.subhead .subnote{font-weight:500;letter-spacing:0;text-transform:none}
.chip.tagc{background:var(--card);color:var(--muted);font-weight:500}
#spiderbox{border:1px solid var(--line);border-radius:var(--r);background:var(--bg);
           padding:13px 16px;margin-top:12px}
.spiderhead{display:flex;gap:9px;align-items:center;flex-wrap:wrap}
.spiderhead b{font-family:var(--disp);font-weight:600;font-size:17px}
@media(max-width:700px){
  .specgrid{grid-template-columns:1fr 1fr}
  .ritegrid{grid-template-columns:1fr}
}

/* ═══ the weave ═══
   A woven link is a *texture*, not a call to action. Body colour, a hairline
   underline that only warms on hover — the paragraph has to still read as a
   paragraph, because there are up to fourteen of these on a page and if each
   one shouted the prose would be unreadable. This is Wikipedia's calculation
   and it is the right one: the link is there when you want it and invisible
   when you are reading. */
.wv{color:inherit;text-decoration:none;
  border-bottom:1px solid var(--accent-line);
  transition:color .14s ease,border-color .14s ease,background .14s ease}
.wv:hover{color:var(--accent);border-bottom-color:var(--accent);
  background:var(--accent-soft)}

/* ═══ sources ═══
   A numbered list, because that is what a reference section is, and the
   citation leads — the link back into the page is the smaller half.

   Folded shut by default. Forty-one citations is the right amount of
   evidence and the wrong amount of page: open, it doubled the length of
   Buddhism and buried "Where next" under a wall of sutta numbers. Closed,
   it is one line that says how much evidence is under it, which is the
   part most readers want to know and the part almost none want to read. */
.srcblock{padding-top:0;padding-bottom:0}
.srcblock[open]{padding-bottom:18px}
.srchead{list-style:none;cursor:pointer;padding:16px 0;margin-bottom:0;
  user-select:none}
.srchead::-webkit-details-marker{display:none}
.srchead:hover h2{color:var(--accent)}
.srcchev{margin-left:auto;color:var(--faint);flex-shrink:0;
  transition:transform .18s ease}
.srcblock[open] .srcchev{transform:rotate(180deg)}
.srclist{list-style:decimal;margin:0;padding-left:22px}
.srclist li{font-size:var(--t-sm);line-height:1.6;padding:7px 0;
  border-bottom:1px solid var(--line)}
.srclist li:last-child{border-bottom:0}
.srclist cite{font-style:normal;color:var(--ink)}
.srcgo{margin-left:8px;font-family:var(--mono);font-size:var(--t-meta);
  color:var(--faint);text-decoration:none;white-space:nowrap}
.srcgo:hover{color:var(--accent)}
.srcnote{font-size:12.5px;line-height:1.6;color:var(--faint);margin-top:14px;
  max-width:var(--m-prose)}

/* ═══ the library of ideas ═══ */
.ideafind{display:flex;gap:14px;align-items:center;flex-wrap:wrap}
.ideafind input{flex:1;min-width:220px;border:1px solid var(--line);border-radius:var(--r);
  background:var(--bg);padding:10px 15px;font:500 14px var(--ui);color:var(--ink);outline:none}
.ideafind input:focus{border-color:var(--accent)}
.ideafind .ic{font-family:var(--mono);font-size:10.5px;color:var(--faint);letter-spacing:.05em;
  white-space:nowrap}
.shelfjump{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.shelf{scroll-margin-top:70px}
/* Two columns was right when this grid lived in the narrow main column of a
   two-column page. All Ideas is the full width of the column now, like All
   Faiths, so it steps down the same ladder — one fewer than the faith tiles
   at every width, because an idea carries a sentence and a list of faiths
   where a faith tile carries a name. */
.ideagrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
@media(max-width:1180px){.ideagrid{grid-template-columns:repeat(2,minmax(0,1fr))}}
.idea{display:block;background:var(--bg);border:1px solid var(--line);border-radius:var(--r);
  padding:14px 16px 13px;text-decoration:none}
.idea:hover{border-color:var(--accent-line)}
.ideal{font-family:var(--disp);font-weight:600;font-size:16.5px;letter-spacing:-.012em;
  line-height:1.3;display:block}
.idea:hover .ideal{color:var(--accent)}
.idead{font-size:13px;color:var(--muted);line-height:1.55;margin-top:4px}
.ideaheld{margin-top:11px;padding-top:9px;border-top:1px solid var(--line);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:11.5px;
  color:var(--faint);line-height:1.5}
.ideaheld b{font-weight:600;color:var(--muted)}
.dotrow{display:inline-flex;gap:3px;align-items:center;flex-shrink:0}
@media(max-width:700px){.ideagrid{grid-template-columns:1fr}}

/* ═══ explore: the whole tree ═══ */
.fam{scroll-margin-top:70px;margin-bottom:22px}
.tree{margin-top:2px}
.trow{display:flex;gap:9px;padding:8px 2px;border-top:1px solid var(--line);
  text-decoration:none;align-items:baseline;min-width:0}
.trow:first-of-type{border-top:none}
.tglyph{font-family:var(--mono);font-size:12px;color:var(--faint);white-space:pre;
  flex-shrink:0;line-height:1.6}
.trow .hd{align-self:center;top:0}
.tmain{min-width:0;flex:1;display:flex;align-items:baseline;flex-wrap:wrap;column-gap:9px}
.tmain b{font-size:14.5px;font-weight:600;white-space:nowrap}
.trow:hover .tmain b{color:var(--accent)}
.ttag{font-size:12.5px;color:var(--faint);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;max-width:52ch}
.tmeta{font-family:var(--mono);font-size:10.5px;color:var(--faint);white-space:nowrap;
  flex-shrink:0;margin-left:auto;padding-left:10px}
@media(max-width:700px){.ttag{display:none}}

.footer{margin:60px 0 40px;font-size:12px;color:var(--faint);text-align:center}
.footer a{color:var(--muted)}

@media(max-width:960px){
  .cols{grid-template-columns:1fr}
  .idacts{align-items:flex-start}
}

/* ─── the alignment lens (spec §2.7) ─── */
.almark{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-3);font-weight:600;
  padding:3px 10px;border-radius:999px;letter-spacing:.01em;line-height:1.4}
.almark.res{color:var(--live);background:#ECF2EE;border:1px solid #CFDED6}
.almark.con{color:var(--accent);background:#F3EDE2;border:1px solid #DFD0BC}

/* stance controls on a passage's ideas — the slow path into the profile */
.idst{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 0;
  border-top:1px solid var(--line)}
.idst:first-of-type{border-top:none}
.stbtns{margin-left:auto;display:inline-flex;gap:6px}
.stbtn{font-family:var(--ui);font-size:var(--fs-2);font-weight:600;cursor:pointer;
  padding:4px 9px;border-radius:999px;background:var(--bg);color:var(--muted);
  border:1px solid var(--line)}
.stbtn:hover{border-color:var(--ink);color:var(--ink)}
.stbtn.hold.on{color:var(--live);background:#ECF2EE;border-color:#CFDED6}
.stbtn.rej.on{color:var(--accent);background:#F3EDE2;border-color:#DFD0BC}

/* ─── the intake ─── */
.iqwrap{max-width:620px;margin:0 auto;padding-bottom:60px}
.iqprog{height:4px;border-radius:999px;background:var(--line);overflow:hidden;margin-top:6px}
.iqprog i{display:block;height:100%;width:0;background:var(--accent);
  border-radius:999px;transition:width .3s}
.iqcount{font-family:var(--mono);font-size:var(--fs-2);color:var(--faint);
  margin-top:10px;text-transform:uppercase;letter-spacing:.06em}
.iqcard{background:var(--card);border:1px solid var(--line);border-radius:var(--r);
  padding:34px 32px;margin-top:10px;min-height:190px}
.iqlabel{font-family:var(--disp);font-weight:600;font-size:clamp(24px,3.4vw,32px);
  line-height:1.2;letter-spacing:-.01em}
.iqdesc{font-size:var(--fs-7);color:var(--muted);line-height:1.6;margin-top:12px}
.iqlines{font-family:var(--mono);font-size:var(--fs-2);color:var(--faint);margin-top:16px}
.iqbtns{display:flex;gap:10px;margin-top:16px;flex-wrap:wrap;align-items:center}
.iqpass{font-family:var(--ui);font-size:var(--fs-4);font-weight:500;color:var(--faint);
  background:none;border:none;cursor:pointer;padding:10px 6px;margin-left:auto}
.iqpass:hover{color:var(--ink)}
.iqfoot{display:flex;align-items:center;margin-top:14px}
.iqback{font-family:var(--ui);font-size:var(--fs-3);color:var(--faint);background:none;
  border:none;cursor:pointer;padding:0}
.iqback:hover{color:var(--ink)}
.iqkeys{margin-left:auto;font-family:var(--mono);font-size:var(--fs-1);color:var(--faint)}
.iqkeys b{color:var(--muted)}

/* ─── discussion & proposals ─── */
.thform{display:flex;flex-direction:column;gap:8px;padding:12px 0}
.post{border-top:1px solid var(--line);padding:14px 0}
.post:first-of-type{border-top:none}
.posthead{display:flex;gap:10px;align-items:baseline;margin-bottom:5px;
  font-size:var(--fs-3);color:var(--faint)}
.posthead b{color:var(--ink);font-size:var(--fs-5)}
.preport{margin-left:auto;background:none;border:none;cursor:pointer;
  font-family:var(--ui);font-size:var(--fs-1);color:var(--faint);text-transform:uppercase;letter-spacing:.06em}
.preport:hover{color:var(--accent)}
.postbody{font-size:var(--fs-6);color:var(--muted);line-height:1.65;white-space:pre-wrap}
.prop{border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;
  margin-top:12px;background:var(--bg)}
.prophead{display:flex;gap:10px;align-items:baseline;flex-wrap:wrap;margin-bottom:9px}
.pkind{font-family:var(--mono);font-size:10px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--accent);font-weight:600}
.propwho{font-size:var(--fs-3);color:var(--faint)}
.proproute{margin-left:auto;font-size:var(--fs-3);color:var(--faint);font-style:italic}
.pline{font-size:var(--fs-6);color:var(--ink);line-height:1.55;margin-top:5px;
  display:flex;gap:9px;align-items:baseline}
.pline.sub{color:var(--muted);font-size:var(--fs-5)}
.plbl{flex-shrink:0;font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;
  text-transform:uppercase;color:var(--faint);min-width:56px}
.prat{font-size:var(--fs-5);color:var(--muted);line-height:1.6;margin-top:9px;
  border-left:2px solid var(--line);padding-left:10px}
.pcit{display:inline-block;margin-top:8px;font-size:var(--fs-4);font-weight:600;
  color:var(--accent);text-decoration:none}
.pfoot{display:flex;gap:12px;align-items:center;margin-top:12px}
.pacts{margin-left:auto;display:inline-flex;gap:8px}
.pst{font-family:var(--mono);font-size:10px;text-transform:uppercase;letter-spacing:.07em}
.pst.accepted{color:var(--live)}
.pst.declined{color:var(--faint)}
.pst.superseded,.pst.withdrawn{color:var(--warn)}
.chip input[type=radio]{accent-color:var(--accent);margin-right:4px}

/* ═══ the constellation ═══
   The one dark surface in a light app, and deliberately so: the covers are
   already dark, and a hue only reads as a star against near-black. Everything
   Pantheo says about itself stays grey; the colour is all belief systems. */
.viewsw{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--line);
  border-radius:99px;background:var(--card);margin-bottom:18px}
.vsw{font-family:var(--ui);font-size:var(--fs-4);font-weight:600;color:var(--muted);
  background:none;border:none;border-radius:99px;padding:7px 16px;cursor:pointer;
  display:inline-flex;align-items:center;gap:7px}
.vsw:hover{color:var(--ink)}
.vsw.lk{text-decoration:none}
.vsw.sel{background:var(--accent-soft);color:var(--accent);box-shadow:var(--sh-1)}
.viewsw{flex-wrap:wrap}
.vsw .vdot{width:6px;height:6px;border-radius:50%;background:currentColor;opacity:.5}
.vswnote{font-size:var(--fs-3);color:var(--faint);margin:-10px 0 18px}

.cst{--ci:#E8E8EF;--cm:#9294A6;--cf:#616374;--cl:rgba(255,255,255,.10);
  position:relative;display:grid;grid-template-columns:minmax(0,1fr) 336px;
  border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  background:#07070d;height:clamp(520px,78vh,820px);margin-bottom:22px;
  color:var(--ci);font-size:var(--fs-5)}
.cstview{position:relative;overflow:hidden;touch-action:none;
  -webkit-user-select:none;user-select:none}
.cstcv{display:block;width:100%;height:100%;cursor:grab}
.cstcv:active{cursor:grabbing}

.cstboot{position:absolute;inset:0;display:grid;place-content:center;justify-items:center;
  gap:12px;font-family:var(--mono);font-size:var(--fs-3);letter-spacing:.06em;
  text-transform:uppercase;color:var(--cf);background:#07070d;text-align:center;padding:32px}
.cstspin{width:26px;height:26px;border-radius:50%;border:2px solid rgba(255,255,255,.14);
  border-top-color:rgba(255,255,255,.6);animation:cstspin 900ms linear infinite}
@keyframes cstspin{to{transform:rotate(360deg)}}
.cstfail{max-width:38ch;font-family:var(--ui);font-size:var(--fs-5);line-height:1.6;
  letter-spacing:0;text-transform:none;color:var(--cm)}

/* labels — HTML over WebGL, so the type stays the app's type */
.cstlabels{position:absolute;inset:0;pointer-events:none;overflow:hidden;
  -webkit-user-select:none;user-select:none}
.cstlabel{position:absolute;top:0;left:0;white-space:nowrap;font-size:11px;
  font-weight:600;letter-spacing:.01em;color:rgba(232,232,239,.62);
  text-shadow:0 1px 4px rgba(0,0,0,.9);will-change:transform}
.cstlabel.cidea{font-family:var(--mono);font-size:9.5px;font-weight:400;
  letter-spacing:.07em;text-transform:uppercase;color:rgba(180,190,225,.5)}
.cstlabel.hot{color:#fff;font-size:12px}
.cstlabel.hot.cidea{color:#D9E0FF;font-size:10px}
.cstlabel.you{color:#FFE7A8;font-size:12.5px;font-weight:700}
.cstringlab{position:absolute;top:0;left:0;white-space:nowrap;font-family:var(--mono);
  font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:rgba(160,166,196,.8);
  text-shadow:0 1px 5px rgba(0,0,0,.95);transform-origin:0 0;will-change:transform}

/* the head-up controls */
.csthud{position:absolute;top:14px;left:14px;right:352px;display:flex;
  flex-direction:column;gap:8px;align-items:flex-start;z-index:3;pointer-events:none}
.csthud>*{pointer-events:auto}
.cstrow{display:flex;gap:6px;flex-wrap:wrap}
.cstt{font-family:var(--ui);font-size:var(--fs-3);font-weight:600;color:var(--cm);
  background:rgba(16,16,26,.78);border:1px solid var(--cl);border-radius:99px;
  padding:6px 13px;cursor:pointer;backdrop-filter:blur(8px);white-space:nowrap}
.cstt:hover{color:#fff;border-color:rgba(255,255,255,.28)}
.cstt.on{background:#EDEDEA;color:#0D0D10;border-color:#EDEDEA}
.cstt.off{opacity:.55}
.cstt.sm{font-family:var(--mono);font-size:var(--fs-2);font-weight:400;
  letter-spacing:.07em;text-transform:uppercase;padding:5px 11px}
.cstt.live{background:rgba(255,214,120,.14);border-color:rgba(255,214,120,.5);
  color:#FFD978;cursor:default;font-style:italic}
.cstt.back{background:rgba(255,255,255,.09);border-color:rgba(255,255,255,.3);color:#fff}
.cstt.back:hover{background:rgba(255,255,255,.16)}

.cstfind{position:relative;width:min(320px,52vw)}
.cstq{width:100%;font-family:var(--ui);font-size:var(--fs-5);color:#fff;
  background:rgba(16,16,26,.82);border:1px solid var(--cl);border-radius:99px;
  padding:9px 15px;outline:none;backdrop-filter:blur(8px)}
.cstq::placeholder{color:var(--cf)}
.cstq:focus{border-color:rgba(255,255,255,.34)}
.cstsug{display:none;margin-top:6px;background:rgba(12,12,20,.94);border:1px solid var(--cl);
  border-radius:10px;overflow:hidden;backdrop-filter:blur(10px);max-height:236px;overflow-y:auto}
.cstsug.on{display:block}
.cstsug button{display:flex;align-items:center;gap:9px;width:100%;text-align:left;
  background:none;border:none;cursor:pointer;padding:8px 13px;color:var(--ci);
  font-family:var(--ui);font-size:var(--fs-4);font-weight:500}
.cstsug button:hover{background:rgba(255,255,255,.07)}
.cstsug i{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.cstsug i.ideadot{background:none;border:1px solid rgba(180,190,225,.6)}
.cstnone{display:block;padding:9px 13px;font-size:var(--fs-4);color:var(--cf);font-style:italic}

/* the legend — the whole point is that the axes mean something */
.cstlegend{position:absolute;left:14px;bottom:58px;z-index:2;pointer-events:none;
  display:flex;flex-direction:column;gap:3px;max-width:300px}
.cstlegend b{font-family:var(--mono);font-size:var(--fs-1);letter-spacing:.1em;
  text-transform:uppercase;color:var(--cf);margin-bottom:2px}
.cstlegend i{font-style:normal;font-size:var(--fs-3);color:rgba(146,148,166,.85);
  line-height:1.45;text-shadow:0 1px 4px rgba(0,0,0,.8)}
.cstlegend em{font-style:normal;font-weight:700;color:rgba(232,232,239,.9)}

/* time */
.cstscrub{position:absolute;left:14px;right:14px;bottom:14px;z-index:3;
  display:flex;align-items:center;gap:11px}
.cstplay{width:28px;height:28px;flex-shrink:0;border-radius:50%;cursor:pointer;
  background:rgba(16,16,26,.82);border:1px solid var(--cl);color:var(--ci);
  font-size:10px;line-height:1;backdrop-filter:blur(8px)}
.cstplay:hover{border-color:rgba(255,255,255,.32)}
.cstrange{flex:1;min-width:0;-webkit-appearance:none;appearance:none;height:3px;
  border-radius:2px;background:rgba(255,255,255,.16);outline:none;cursor:pointer}
.cstrange::-webkit-slider-thumb{-webkit-appearance:none;width:13px;height:13px;
  border-radius:50%;background:#EDEDEA;border:none;cursor:grab}
.cstrange::-moz-range-thumb{width:13px;height:13px;border-radius:50%;
  background:#EDEDEA;border:none;cursor:grab}
.cstyear{flex-shrink:0;font-family:var(--mono);font-size:var(--fs-2);letter-spacing:.06em;
  text-transform:uppercase;color:var(--cf);min-width:11ch;text-align:right}

.cstpivot{position:absolute;top:0;left:0;width:26px;height:26px;margin:-13px 0 0 -13px;
  border:1px solid rgba(255,255,255,.34);border-radius:50%;pointer-events:none;z-index:2;
  opacity:0;transition:opacity .16s ease;will-change:transform}
.cstpivot::after{content:'';position:absolute;left:50%;top:50%;width:3px;height:3px;
  margin:-1.5px 0 0 -1.5px;border-radius:50%;background:rgba(255,255,255,.75)}

.csttoast{position:absolute;left:50%;bottom:56px;transform:translate(-50%,10px);
  background:rgba(12,12,20,.94);border:1px solid var(--cl);border-radius:99px;
  padding:8px 17px;font-size:var(--fs-4);font-weight:500;color:var(--ci);
  opacity:0;pointer-events:none;transition:opacity .22s ease,transform .22s ease;z-index:4}
.csttoast.on{opacity:1;transform:translate(-50%,0)}

/* the reading panel */
.cstpanel{border-left:1px solid var(--cl);background:#0B0B13;overflow-y:auto;
  overscroll-behavior:contain}
.cstcard{padding:20px 20px 26px}
.cstpin{width:26px;height:4px;border-radius:2px;margin-bottom:13px}
.cstpin.cidea{background:rgba(180,190,225,.55)}
.cstpin.you{background:#FFD978}
.cstpin.trace{background:#FFD978}
.cstpin.empty{background:rgba(255,255,255,.2)}
.cstcard h3{font-family:var(--disp);font-size:var(--fs-9);font-weight:600;
  letter-spacing:-.015em;line-height:1.18;color:#fff}
.cstsub{font-size:var(--fs-5);color:var(--cm);line-height:1.55;margin-top:7px}
.cstfacts{margin-top:15px;border-top:1px solid var(--cl)}
.cstfacts div{display:flex;gap:12px;padding:7px 0;border-bottom:1px solid var(--cl)}
.cstfacts dt{flex-shrink:0;width:74px;font-family:var(--mono);font-size:var(--fs-1);
  letter-spacing:.08em;text-transform:uppercase;color:var(--cf);padding-top:2px}
.cstfacts dd{font-size:var(--fs-4);color:var(--ci);line-height:1.45}
.cstlab{font-family:var(--mono);font-size:var(--fs-1);letter-spacing:.1em;
  text-transform:uppercase;color:var(--cf);margin:18px 0 8px}
.cstchips{display:flex;flex-wrap:wrap;gap:5px}
.cstchip{font-family:var(--ui);font-size:var(--fs-3);font-weight:500;color:var(--cm);
  background:rgba(255,255,255,.05);border:1px solid var(--cl);border-radius:99px;
  padding:4px 11px;cursor:pointer;display:inline-flex;gap:6px;align-items:center}
.cstchip:hover{color:#fff;border-color:rgba(255,255,255,.3)}
.cstchip em{font-family:var(--mono);font-size:9px;font-style:normal;color:var(--cf)}
.cstkin{display:flex;flex-direction:column}
.cstkinrow,.csttname{display:flex;gap:9px;align-items:center;width:100%;text-align:left;
  background:none;border:none;border-top:1px solid var(--cl);cursor:pointer;
  padding:9px 0;color:var(--ci);font-family:var(--ui)}
.cstkin .cstkinrow:first-child{border-top:none}
.cstkinrow i{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.cstkinrow b{font-size:var(--fs-4);font-weight:600;display:block}
.cstkinrow em{font-size:var(--fs-3);font-style:normal;color:var(--cf);display:block;
  line-height:1.35;margin-top:1px}
.cstkinrow:hover b{color:#fff}
.cstkinrow:hover em{color:var(--cm)}
.cstnote{font-size:var(--fs-3);color:var(--cf);line-height:1.55;margin-top:10px}
.cstnote a{color:#A9B4FF}
.cstlist{margin:0;padding-left:16px;font-size:var(--fs-4);color:var(--cm);line-height:1.6}
.cstlist li{margin-bottom:7px}
.cstlist b{color:var(--ci);font-weight:600}
.cstlist a{color:#A9B4FF}
.cstyoubox{margin-top:13px;padding:10px 12px;border-radius:8px;
  background:rgba(255,217,120,.09);border:1px solid rgba(255,217,120,.24);
  font-size:var(--fs-4);color:#F3E2BB}
.cstyoubox b{color:#FFD978;font-weight:700}
.cstacts{display:flex;gap:8px;flex-wrap:wrap;margin-top:20px}
.cstbtn{font-family:var(--ui);font-size:var(--fs-4);font-weight:600;cursor:pointer;
  border-radius:99px;padding:9px 17px;background:#EDEDEA;color:#0D0D10;
  border:1px solid #EDEDEA;text-decoration:none;display:inline-block}
.cstbtn:hover{background:#fff}
.cstbtn.o{background:transparent;color:var(--ci);border-color:var(--cl)}
.cstbtn.o:hover{background:rgba(255,255,255,.07);border-color:rgba(255,255,255,.3)}
.cststance{display:flex;gap:6px;flex-wrap:wrap}
.cstsb{font-family:var(--ui);font-size:var(--fs-3);font-weight:600;cursor:pointer;
  border-radius:99px;padding:6px 13px;background:transparent;color:var(--cm);
  border:1px solid var(--cl)}
.cstsb:hover{color:#fff;border-color:rgba(255,255,255,.3)}
.cstsb.on{background:#FFD978;border-color:#FFD978;color:#221B04}
.cstsb.on.neg{background:#8FA4D8;border-color:#8FA4D8;color:#0B1226}
.cstsb.ghost{color:var(--cf)}
.csttrace{display:flex;flex-direction:column;margin-top:6px}
.csttrow{padding-left:11px;border-left:2px solid rgba(255,217,120,.35)}
.csttrow>em{display:block;font-style:italic;font-size:var(--fs-2);color:var(--cf);
  padding:5px 0 3px}
.csttrow.cidea .csttname{font-family:var(--mono);font-size:var(--fs-3);
  letter-spacing:.06em;text-transform:uppercase;color:#C6CEF5}
.csttname{border-top:none;padding:2px 0 5px;font-size:var(--fs-6);font-weight:600}
.csttname:hover{color:#fff}
.csttname i{width:8px;height:8px;border-radius:50%;flex-shrink:0}

@media(max-width:1000px){
  .cst{grid-template-columns:1fr;height:auto}
  .cstview{height:clamp(380px,58vh,560px)}
  .cstpanel{border-left:none;border-top:1px solid var(--cl);max-height:420px}
  .cstlegend{display:none}
  /* the sky is small here — the controls give ground back to it */
  .csthud{right:10px;left:10px;top:10px;gap:6px}
  .cstfind{width:min(250px,62vw)}
  .cstq{font-size:var(--fs-4);padding:7px 13px}
  .cstt{font-size:var(--fs-2);padding:5px 11px}
  .cstt.sm{font-size:9.5px;padding:4px 9px}
  .cstscrub{left:10px;right:10px;bottom:10px;gap:8px}
  .cstyear{min-width:0;font-size:9px}
}

/* ═══ seconding & the human layer ═══
   The endorsement primitive, and the surfaces that carry people rather than
   institutions. A second is a small, quiet control: it is a judgement, not
   applause, so it gets a mark and a number and no colour until you use it. */
.secbtn{display:inline-flex;align-items:center;gap:6px;cursor:pointer;
  font-family:var(--mono);font-size:var(--fs-2);letter-spacing:.06em;
  background:var(--card);border:1px solid var(--line);border-radius:99px;
  padding:4px 11px;color:var(--muted);line-height:1.6}
.secbtn:hover:not([disabled]){border-color:var(--accent-line);color:var(--ink)}
.secbtn.on{background:var(--accent-soft);border-color:var(--accent-line);color:var(--accent)}
.secbtn[disabled]{opacity:.4;cursor:default}
.secbtn .secmark{font-size:8px;position:relative;top:-1px}
.sectally{font-family:var(--mono);font-size:var(--fs-2);letter-spacing:.06em;
  color:var(--faint);white-space:nowrap}
/* a tally is a label; a status is a sentence. They are not the same register. */
.secstat{font-size:var(--t-sm);color:var(--muted);line-height:1.5}
.secstat.open{color:var(--warn)}

.postfoot{display:flex;align-items:center;gap:10px;margin-top:10px}
.post.topped{background:var(--bg);margin:0 -14px;padding:14px;border-radius:var(--r);
  border-top:none}
.toplbl{font-family:var(--mono);font-size:var(--fs-1);letter-spacing:.1em;
  text-transform:uppercase;color:var(--faint);margin-bottom:7px}

/* a seeded voice says so, once, wherever it speaks */
.seedmark{font-family:var(--mono);font-size:var(--fs-1);letter-spacing:.08em;
  text-transform:uppercase;color:var(--faint);border:1px solid var(--line);
  border-radius:2px;padding:1px 5px;white-space:nowrap}
.seeded-note{border-top:1px solid var(--line);padding-top:11px;margin-top:14px}

/* the thread row: what the room said, not just that it said something */
.threadrow{display:block;text-decoration:none;padding:14px 0;
  border-top:1px solid var(--line)}
.threadrow:first-of-type{border-top:none}
.trhead{display:flex;align-items:baseline;gap:10px}
.trhead b{font-size:var(--fs-7);font-weight:600;letter-spacing:-.01em;line-height:1.3}
.threadrow:hover .trhead b{color:var(--accent)}
.trhead .sectally{margin-left:auto}
.trquote{font-size:var(--fs-5);color:var(--muted);line-height:1.55;margin-top:7px;
  padding-left:11px;border-left:2px solid var(--line);max-width:70ch}
.trwho{color:var(--faint);white-space:nowrap}
.trsec{font-family:var(--mono);font-size:var(--fs-2)}
.trmeta{display:flex;flex-wrap:wrap;align-items:center;gap:9px;margin-top:9px;
  font-size:var(--fs-3);color:var(--faint)}
.trmeta>span:not(.seedmark):not(:last-child):after{content:"·";margin-left:9px;color:var(--line)}
.tranchor{font-style:normal;color:var(--muted)}

/* a person in the feed */
.fav.person{border-radius:50%}
.fsaid{font-family:var(--disp);font-size:var(--fs-8);font-weight:500;line-height:1.45;
  letter-spacing:-.01em;color:var(--ink);max-width:64ch}
.fthread{display:block;font-size:var(--fs-4);color:var(--faint);margin-top:9px}
.fmain:hover .fthread{color:var(--accent)}
.fwas{font-size:var(--fs-4);color:var(--faint);line-height:1.5;margin-bottom:7px;
  text-decoration:line-through;text-decoration-color:var(--line)}
.fwas .plbl{font-family:var(--mono);font-size:var(--fs-1);letter-spacing:.08em;
  text-transform:uppercase;margin-right:7px;text-decoration:none;display:inline-block}

@media(max-width:700px){
  .trquote{padding-left:9px}
  .post.topped{margin:0 -10px;padding:12px 10px}
}

/* ═══ audit fixes: mobile reach, the daily question, tally wording ═══ */

/* SIGN IN was scrolling off the right edge of the phone nav, which put the
   entire signed-in product out of reach on mobile. The word links scroll;
   identity does not. */
@media (max-width:760px){
  .navin{gap:14px}
  .navin .sp{display:none}
  /* the bar no longer scrolls sideways, so nothing needs pinning */
  .navmenu{margin-left:auto}
  .navdie{display:none}
  /* the label does not fit beside identity on a phone, so the create action
     becomes the round + every mobile app uses. font-size:0 hides the text
     visually while leaving it in the accessibility tree. */
  .navnew{font-size:0;padding:0;
    width:30px;height:30px;border-radius:50%;display:inline-grid;place-items:center}
  .navnew:before{content:"+";font-size:19px;font-weight:400;line-height:1;
    position:relative;top:-1px}
  /* the bar scrolls horizontally, which would clip an absolute popover —
     fixed escapes the overflow container entirely */
  .navpop{position:fixed;top:54px;right:12px;left:auto}
}

/* /explore pushed the viewport to 610px wide: the family chip row and the
   filter input both overflowed their card. Nothing may exceed the screen. */
.block,.card,.fcard{max-width:100%}
.ideafind input,.f-in{max-width:100%}
.shelfjump,.chips{max-width:100%}
@media (max-width:700px){
  .ideafind{gap:10px}
  .ideafind input{min-width:0;flex:1 1 100%}
}

/* the tab strip hid Discussion behind an invisible scroll on mobile */
.tabs{scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch}
.tab{scroll-snap-align:start}
@media (max-width:760px){
  .headcard{position:relative}
  .tabs{mask-image:linear-gradient(to right,#000 88%,transparent);
    -webkit-mask-image:linear-gradient(to right,#000 88%,transparent)}
}

/* the daily question — the one card you can act on */
.fq .qlabel{font-size:var(--fs-10);margin-top:2px}
.qacts{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:15px}
.qacts .btn{padding:7px 15px;font-size:var(--fs-4)}
.qacts .btn.ghost{color:var(--faint)}
.qnote{font-size:var(--fs-4);color:var(--muted)}
.qnote.done{color:var(--live);font-weight:500}

/* keep the platform badge off the content it was covering */
aside,.footer{padding-bottom:44px}

/* The mobile single-column grid used `1fr`, which is minmax(auto,1fr) and
   therefore refuses to shrink below its content — one long filter input on
   /explore was widening the whole document to 610px against a 390px screen.
   minmax(0,1fr) is the clamp; min-width:0 lets the flex children inside it
   actually wrap. */
@media(max-width:960px){
  .cols{grid-template-columns:minmax(0,1fr)}
  .cols>aside{position:static;max-height:none;overflow:visible}
  .main,.feedcol,aside{min-width:0}
  .main>*{min-width:0}
}

/* "The Church of Jesus Christ of Latter-day Saints" cannot fit one phone
   line, and nowrap made it push the whole tree sideways. Names wrap on
   small screens; the glyph column keeps the lineage readable regardless. */
@media(max-width:700px){
  .tmain b{white-space:normal}
  .tmeta{margin-left:0;padding-left:0}
}

/* ═══ a faith that is over says so in the list ═══
   Mono and faint, sitting after the name rather than before it: the name is
   still the thing you are scanning for, and "dissolved" is the qualifier
   you need the moment you have found it. Not a badge, not a colour — a
   dissolved faith is not a failed one. */
.tstate{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.03em;
  text-transform:uppercase;color:var(--faint);margin-left:8px;white-space:nowrap}
.ltile .ltmeta{white-space:normal}

/* The Kind menu is the family menu in a second copy, so it inherits
   everything; it only needs room for "Schools and currents". */
.atcatsel .atpop{min-width:212px}

/* ═══ out of here — where a faith speaks for itself ═══
   A row of links under the lineage: the body that speaks for the line, and
   on a movement with a court file, the court file beside it. Underlined
   rather than pilled, because a pill reads as a filter and these are exits.
   The arrow does the work of saying "this leaves the site". */
.idlinks{display:flex;flex-wrap:wrap;gap:4px 14px;margin-top:8px;
  font-size:12.5px;line-height:1.3}
.hlink{color:var(--muted);text-decoration:none;
  border-bottom:1px solid var(--line);padding-bottom:1px}
.hlink:hover{color:var(--accent);border-bottom-color:var(--accent-line)}
.hlink::after{content:"↗";font-size:9px;margin-left:3px;
  vertical-align:1px;color:var(--faint)}
.hlink i{font-style:normal;font-family:var(--mono);font-size:var(--t-meta);
  letter-spacing:.03em;text-transform:uppercase;color:var(--faint);margin-right:5px}
.hlink.critical i{color:var(--ink-soft)}

/* ═══ the record ═══
   For a movement with convictions, deaths or a state inquiry. Deliberately
   NOT a warning colour: red would be Panfaith taking a side, and the whole
   contract of this site is that it reports the finding and the reader
   draws the conclusion. A rule down the left, mono label, plain text —
   the same furniture a footnote gets, because that is what it is.
   Lives in the body, directly under the History & overview summary — it is
   prose, and prose belongs where the reader is already reading. */
.headrec{border-left:2px solid var(--ink-soft);padding:2px 0 2px 13px;
  margin:18px 0 16px}
.headrec span{display:block;font-family:var(--mono);font-size:var(--t-meta);
  letter-spacing:.04em;text-transform:uppercase;color:var(--faint);margin-bottom:4px}
.headrec p{margin:0;font-size:13.5px;line-height:1.55;color:var(--ink-soft);
  max-width:74ch}

/* Why a line is filed as a tradition rather than a movement is an argument
   worth having and not worth the top of the page, so it folds. */
.headwhy{margin:14px 0 4px;max-width:74ch}
.headwhy>summary{list-style:none;cursor:pointer;display:inline-flex;
  align-items:center;gap:5px;font-size:12.5px;color:var(--muted)}
.headwhy>summary::-webkit-details-marker{display:none}
.headwhy>summary::before{content:"›";display:inline-block;color:var(--faint);
  transition:transform .16s ease}
.headwhy[open]>summary::before{transform:rotate(90deg)}
.headwhy>summary:hover{color:var(--accent)}
.headwhy p{margin:8px 0 0;font-size:13.5px;line-height:1.6;color:var(--ink-soft)}

/* The sticky header collapses to a bar on scroll; these rows collapse with
   the two that were already in the set, or the "bar" is four rows tall. */
@media (min-width:701px){
  /* a faith with an official site AND a record link wraps to two rows */
  .headcard .idlinks{overflow:hidden;max-height:52px;
    transition:max-height .22s cubic-bezier(.2,.7,.3,1),opacity .18s ease,
      margin-top .22s cubic-bezier(.2,.7,.3,1)}
  .headcard.stuck .idlinks{max-height:0;opacity:0;margin-top:0}
}
@media (prefers-reduced-motion:reduce){
  .headcard .idlinks{transition:none}
}

/* ═══ the idea, as a place ═══
   /c/:slug wears the faith page's furniture — cover, pinned identity card,
   tab strip, blocks, rail — so everything below is only what an idea has
   that a faith does not. Where a faith's mark is a disc struck from its
   spine, an idea's is a square holding a pictogram; where a faith's action
   is Follow, an idea's is a stance. */

/* An idea gets no banner. A faith's cover earns its 230px because a faith
   is a place with a look; an idea is a word several places happen to use,
   and a generated sky over it was decoration pretending to be identity.
   Without a cover above it the identity card closes its own top edge and
   pins directly under the app bar. */
.headcard.nocover{border-top:1px solid var(--line);border-radius:var(--r);
  margin-top:20px}
@media(min-width:761px){.headcard.nocover{top:53px}}

/* the emblem: a square, in the accent, because an idea has no hue of its
   own — the colour on this page belongs to the faiths that hold it */
.emblem.imark{background:var(--accent-soft);color:var(--accent);
  border:1px solid var(--accent-line)}
.emblem.imark svg{width:34px;height:34px;
  transition:width .22s cubic-bezier(.2,.7,.3,1),height .22s cubic-bezier(.2,.7,.3,1)}
@media(min-width:761px){
  .headcard.stuck .emblem.imark svg{width:19px;height:19px}
}

/* ── the stance: the one thing an idea asks of you ──
   Same three answers as the intake, and the same weight scale as every
   other action row: a tint, an outline, and a plain word. No counts, ever —
   user_concepts is the most private table on the platform, and an aggregate
   of it would be published religious affiliation. */
.stbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  justify-content:flex-end}
.stbar .stpass{appearance:none;border:0;background:none;cursor:pointer;
  font:600 var(--t-sm)/1 var(--ui);color:var(--muted);padding:9px 6px}
.stbar .stpass:hover{color:var(--ink)}
.stbar .btn.on{background:var(--card);color:var(--live);border-color:var(--live)}
.stbar .btn.o.on{color:var(--accent);border-color:var(--accent)}
.stbar .stpass.on{color:var(--ink);text-decoration:underline}
.stnote{flex:0 0 100%;text-align:right;font-size:var(--t-meta);
  color:var(--faint);line-height:1.4}
@media(min-width:761px){
  .headcard .stnote{overflow:hidden;max-height:32px;
    transition:max-height .22s cubic-bezier(.2,.7,.3,1),opacity .16s ease}
  .headcard.stuck .stnote{max-height:0;opacity:0}
}
@media(max-width:960px){.stbar{justify-content:flex-start}.stnote{text-align:left}}

/* ── the spread: every holder on one time axis ── */
.spread{margin:2px 0 4px}
/* An SVG that scales its own type: at phone width the era ticks and the
   faith names shrink to six pixels, which is not a small label, it is a
   smudge. Below 720 the graphic keeps its drawing size and the reader
   pushes it sideways instead. */
@media(max-width:720px){
  .spwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;
    margin:0 -2px;padding-bottom:4px}
  .spwrap .spread{min-width:560px}
}
.sptick{font-family:var(--mono);font-size:10px;fill:var(--faint);
  letter-spacing:.03em}
.spname{font-family:var(--ui);font-size:10.5px;fill:var(--muted)}
.spdot circle{cursor:pointer;transition:r .12s ease}
.spdot:hover circle{r:10}

/* ── the families that carry it ──
   A bar per family, in the family's own hue, because hue is family
   everywhere else on this site and a chart that re-solved colour would be
   the one place it stopped meaning that. */
.fambars{margin-top:var(--s4);border-top:1px solid var(--line);padding-top:var(--s3)}
.fambar{display:grid;grid-template-columns:minmax(0,1fr) 46% 34px;
  align-items:center;gap:12px;padding:5px 0;text-decoration:none}
.fbn{font-size:var(--t-sm);color:var(--ink);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.fambar:hover .fbn{color:var(--accent)}
.fbt{height:7px;background:var(--sunk);border-radius:2px;overflow:hidden}
.fbt i{display:block;height:100%;border-radius:2px}
.fbc{font-family:var(--mono);font-size:var(--t-meta);color:var(--faint);
  text-align:right}
.fbnote{font-size:var(--t-meta);color:var(--faint);line-height:1.5;
  margin-top:10px;max-width:var(--m-prose)}
@media(max-width:600px){.fambar{grid-template-columns:minmax(0,1fr) 28% 30px}}

/* ── across the faiths: who says it, and in what words ──
   The holder line is a heading for the passages under it, not a card: the
   passages are the content and a second box around each faith would bury
   them. Sigil, name, one line of context, one exit. */
.famsec{margin-bottom:var(--s5)}
.famsec:last-child{margin-bottom:0}
.fholder{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:12px 0 4px;border-top:1px solid var(--line)}
.famsec>.subhead+.fholder{border-top:none}
.fhface{width:30px;height:30px;flex-shrink:0;display:block}
.fhface svg{display:block;width:100%;height:100%}
.fhname{font-family:var(--disp);font-weight:700;font-size:var(--t-lede);
  letter-spacing:-.01em;text-decoration:none;line-height:1.2}
.fholder:hover .fhname{color:var(--accent)}
.fhmeta{font-size:var(--t-sm);color:var(--faint);min-width:0;flex:1;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fhall{margin-left:auto;font-size:var(--t-sm);font-weight:600;
  color:var(--accent);text-decoration:none;white-space:nowrap}
.famsec .elist{margin-bottom:2px}
/* the faiths of this family that hold it but do not get quoted here */
.quietfaiths{display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  padding:10px 0 2px;border-top:1px solid var(--line);margin-top:10px}
.qfl{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);margin-right:2px}
.qf{display:inline-flex;align-items:center;gap:6px;font-size:13px;
  color:var(--muted);text-decoration:none;background:var(--bg);
  border:1px solid var(--line);border-radius:var(--r-pill);padding:3px 11px 3px 4px}
.qf svg{display:block;border-radius:50%}
.qf:hover{color:var(--accent);border-color:var(--accent-line)}
/* past ten holders the row folds: the count is the useful part */
.quietfaiths.qfold{display:block}
.qfold>summary{list-style:none;cursor:pointer;display:flex;align-items:center;
  gap:8px;font-size:13px;color:var(--muted)}
.qfold>summary::-webkit-details-marker{display:none}
.qfold>summary b{font-weight:600;color:var(--ink)}
.qfold>summary::after{content:"›";color:var(--faint);font-size:15px;
  transition:transform .16s ease}
.qfold[open]>summary::after{transform:rotate(90deg)}
.qfold>summary:hover b{color:var(--accent)}
.qfwrap{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
/* a sigil dropped straight into a rail row */
.kin>.sigf{flex-shrink:0;align-self:center}

/* ═══ the library: the entry grows a mark ═══
   Twelve bordered paragraphs in a grid is a document. The square glyph is
   what makes it a directory, and it is the same drawing the tile on Explore
   and the emblem on the idea's own page wear. */
.ideatop{display:flex;align-items:center;gap:10px}
.ideamark{width:30px;height:30px;flex-shrink:0;border-radius:var(--r);
  display:grid;place-items:center;background:var(--card);
  border:1px solid var(--line);color:var(--accent)}
.idea:hover .ideamark{border-color:var(--accent-line);background:var(--accent-soft)}
.ideamark svg{display:block}

/* ═══ the Web view ═══
   The Atlas's grammar with the colour taken out: a mark is an idea, a line
   is a pair that keeps company, pointing at one recedes everything it does
   not touch. Graphite on the sunk ground, because hue means "belief system"
   everywhere else on this site and these are not that. */
.iwnote{font-size:var(--t-sm);color:var(--muted);line-height:1.6;
  max-width:var(--m-prose);margin:0 0 var(--s4)}
.iwnote b{color:var(--ink);font-weight:600}
.iwstage{position:relative;background:var(--sunk);border:1px solid var(--line);
  border-radius:var(--r-lg);overflow:hidden;height:min(64vh,660px);min-height:420px}
.iwscroll{position:absolute;inset:0}
.iwsvg{display:block;width:100%;height:100%}
.iwe{stroke:#B9B0A2;fill:none;transition:stroke .16s ease,opacity .16s ease}
.iwc{transition:fill .16s ease}
/* the hit area: a 9px collar so a small idea is still catchable */
.iwh{fill:transparent}
.iwn{cursor:pointer}
.iwn:focus{outline:none}
.iwn:focus-visible .iwc{stroke:var(--accent);stroke-width:2}
.iwt{font-family:var(--ui);font-size:11.5px;fill:var(--ink-soft);
  pointer-events:none;paint-order:stroke;stroke:var(--sunk);stroke-width:3.5px;
  stroke-linejoin:round;transition:opacity .16s ease}
.iwn:hover .iwc{fill:var(--accent)}
/* the names with nowhere clear to sit are written but held back until you
   point at their node — so no dot is anonymous, and nothing is a smear */
.iwt.hid{opacity:0}
.iwn:hover .iwt.hid,.iwn.hot .iwt.hid,.iwn:focus-visible .iwt.hid{opacity:1}
/* pointing at one node: its pairs light, everything else steps back */
.iwsvg.focused .iwn.far{opacity:.22}
.iwsvg.focused .iwe{opacity:.18}
.iwsvg.focused .iwe.lit{opacity:1;stroke:var(--accent)}
.iwn.hot .iwc{fill:var(--accent)}
.iwn.hot .iwt{font-weight:700;fill:var(--ink)}
.iwn.near .iwt{opacity:1;fill:var(--ink)}
/* the search field and the shelf filter dim rather than delete: a graph
   with nodes removed is a lie about the structure */
.iwsvg.sifted .iwn.off{opacity:.13}
.iwsvg.sifted .iwn.off .iwt{opacity:0}
/* the lines go quiet with them, or eleven lit ideas sit under a hundred
   and forty-five full-strength threads and the answer is invisible */
.iwsvg.sifted .iwe{opacity:.28}

.iwhint{position:absolute;left:var(--s3);bottom:var(--s3);font-family:var(--mono);
  font-size:var(--t-meta);letter-spacing:.04em;color:var(--faint);
  background:color-mix(in srgb, var(--card) 82%, transparent);
  border-radius:var(--r-pill);padding:5px 12px;pointer-events:none}
.iwpanel{position:absolute;top:var(--s3);right:var(--s3);width:296px;
  max-height:calc(100% - var(--s5));overflow:auto;background:var(--card);
  border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--sh-2);
  padding:var(--s4)}
.iwpanel[hidden]{display:none}
.iwx{position:absolute;top:10px;right:10px;appearance:none;cursor:pointer;
  border:1px solid var(--line);background:var(--bg);border-radius:var(--r-pill);
  width:24px;height:24px;font-size:12px;color:var(--muted);line-height:1}
.iwx:hover{color:var(--ink);border-color:var(--accent-line)}
.iwpt{display:block;font:700 var(--t-lede)/1.25 var(--disp);padding-right:26px}
.iwpd{font-size:var(--t-sm);line-height:1.55;color:var(--muted);margin-top:6px}
.iwpm{font-family:var(--mono);font-size:var(--t-meta);letter-spacing:.03em;
  text-transform:uppercase;color:var(--faint);margin-top:10px;
  padding-top:10px;border-top:1px solid var(--line)}
.iwlbl{display:block;font-family:var(--mono);font-size:var(--t-meta);
  letter-spacing:.03em;text-transform:uppercase;color:var(--faint);margin-top:14px}
.iwchips{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}
.iwchip{display:inline-flex;align-items:center;gap:5px;appearance:none;
  cursor:pointer;font:500 var(--t-meta)/1 var(--ui);color:var(--ink);
  background:var(--bg);border:1px solid var(--line);border-radius:var(--r-pill);
  padding:5px 10px}
.iwchip:hover{background:var(--accent-soft);border-color:var(--accent-line)}
.iwchip small{font-family:var(--mono);color:var(--faint)}
.iwfoot{font-size:11px;line-height:1.5;color:var(--faint);margin-top:8px}
.iwgo{display:block;margin-top:var(--s4);text-align:center;text-decoration:none;
  font:600 var(--t-sm)/1 var(--ui);color:var(--accent);background:var(--accent-soft);
  border:1px solid var(--accent-line);border-radius:var(--r-pill);padding:10px}
.iwgo:hover{background:#EBE1D5;border-color:#CFC0AB}
@media(max-width:820px){
  .iwstage{height:min(70vh,600px)}
  .iwpanel{left:var(--s3);right:var(--s3);width:auto;top:auto;bottom:var(--s3);
    max-height:52%}
  .iwhint{display:none}
  /* A wide graph fitted into a tall phone frame is a six-pixel band with
     empty space above and below it. The drawing keeps a usable size and the
     reader pushes it sideways — the panel stays put, because it is chrome
     and chrome does not scroll away from you. */
  .iwscroll{overflow:auto;-webkit-overflow-scrolling:touch}
  .iwsvg{min-width:820px}
}

/* ── the Reach view ── */
.reachnote{font-size:var(--t-sm);color:var(--muted);line-height:1.6;
  max-width:var(--m-prose);margin:0 0 var(--s4)}
.reachnote b{color:var(--ink);font-weight:600}
.reachlist{display:flex;flex-direction:column}
.idea.reachrow{display:grid;grid-template-columns:30px minmax(0,1fr) 34% 96px;
  align-items:center;gap:14px;background:none;border:0;border-radius:0;
  border-top:1px solid var(--line);padding:11px 2px}
.reachlist>.idea.reachrow:first-child{border-top:0}
.idea.reachrow:hover{background:var(--bg)}
.rlab{min-width:0}
.rlab b{font-family:var(--disp);font-weight:600;font-size:var(--t-body);
  letter-spacing:-.01em;display:block;line-height:1.3}
.idea.reachrow:hover .rlab b{color:var(--accent)}
.rdesc{display:block;font-size:var(--t-sm);color:var(--faint);line-height:1.45;
  margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rbar{height:8px;background:var(--sunk);border-radius:2px;overflow:hidden}
.rbar i{display:block;height:100%;background:var(--accent-line);border-radius:2px}
.idea.reachrow:hover .rbar i{background:var(--accent)}
.rnum{font-family:var(--mono);font-size:var(--t-meta);color:var(--muted);
  text-align:right;line-height:1.35}
.rnum small{display:block;font-size:10.5px;color:var(--faint)}
@media(max-width:820px){
  .idea.reachrow{grid-template-columns:30px minmax(0,1fr) 76px}
  .idea.reachrow .rbar{display:none}
  .rdesc{display:none}
}