
/* fonts via <link> in <head> — @import was render-blocking */
/* Tokens — FINE PRESS v2 (owner 2026-09-05 "palette upgraded … designed and worth a million
   dollars"; .design/site-refinement/DESIGN_TOKENS.css is the source). The scene: a Loeb volume
   open on a linen desk mat under warm library light. The room (--bg) sits a step DEEPER than the
   reading sheet (--card-bg) so the page reads as a lit object; ONE red family (Loeb #8e2b1f)
   carries the identity at ~5-8%; the old beige chrome and orange terracotta retire. Every pair
   below is measured: ink 14:1, muted 5.9:1, links 5.9:1 on the sheet. */
:root{--bg:#F0F0ED;--fg:#1C1C1A;--head:#111110;--accent:#1C1C1A;--accent2:#3A3A36;--muted:#5A5A56;--border:#D8D8D3;
--card-bg:#FFFFFF;--sidebar-bg:#F7F7F4;--highlight:#EFEFEA;--latin:#1C1C1A;--english:#5A5A56;--accent-soft:#B0B0AA;--rule-soft:#E7E7E2;
--reading-lh:1.62;--measure-single:48rem;--measure-parallel:1440px;--masthead:#FFFFFF;--masthead-ink:#1C1C1A;--facs-mat:#E4E4DF;--scan-filter:none;
--font-display:'IM Fell Great Primer','Source Serif Pro',Georgia,serif;--font-body:'Source Serif Pro','Old Standard TT',Palatino,Georgia,serif;
--font-ui:'Source Serif Pro',Georgia,serif;--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;--ease:cubic-bezier(.22,1,.36,1);}
/* prdl-system.css (the shared four-site sheet) re-reds the accents at :root[data-site] specificity —
   out-rank it here; the sister sites keep their identities, THIS site is monochrome (2026-09-05) */
:root[data-site="faith-received"],:root:not([data-site]){--accent:#1C1C1A;--accent2:#3A3A36;--accent-soft:#B0B0AA}
:root[data-site="faith-received"][data-theme="dark"],:root:not([data-site])[data-theme="dark"]{--accent:#E9E9E5;--accent2:#C9C9C3;--accent-soft:#6E6E68}
:root[data-site="faith-received"][data-theme="sepia"],:root:not([data-site])[data-theme="sepia"]{--accent:#8A2A1E;--accent2:#9D3E2A;--accent-soft:#AB8D55}
/* Kindle-style reading options (owner 2026-08-10): body font + line spacing are reader choices */
:root[data-font="sans"]{--font-body:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif}
/* ═ APPLE PASS (owner 2026-09-02 "apple like, desktop and mobile") — glass chrome over the
   page, capsule controls, calm motion; the reading surface itself is untouched. Theme-aware
   via color-mix on the existing tokens, so light/sepia/dark all keep their voice. ═ */
:root[data-font="easy"]{--font-body:'Atkinson Hyperlegible',-apple-system,"Segoe UI",sans-serif}
:root[data-lh="compact"]{--reading-lh:1.45}
:root[data-lh="relaxed"]{--reading-lh:1.85}
/* Sepia — warm, ~25% lower radiance; less fatigue for long reading */
[data-theme="sepia"]{--head:#2F281C;--bg:#DDD0B6;--card-bg:#F2E9D5;--sidebar-bg:#EBE1C9;--fg:#2F281C;--muted:#635844;--border:#CFC2A4;--rule-soft:#DED2B7;--latin:#2F281C;--english:#635844;--accent:#8A2A1E;--accent2:#9D3E2A;--highlight:#ECDCC9;--accent-soft:#AB8D55;--masthead:#F9F2E1;--masthead-ink:#2F281C;--facs-mat:#D6C9AB;--scan-filter:sepia(.08) brightness(.985);}
/* Lamplight dark — a warm brown-black ROOM, unbleached-linen ink, ember red; the scan is dimmed
   into the room via --scan-filter instead of glaring full-white beside dark panes */
:root[data-theme="dark"]{--head:#F2F2EE;--bg:#1A1A18;--card-bg:#232320;--sidebar-bg:#1E1E1C;--fg:#E9E9E5;--muted:#A2A29C;--border:#383836;--rule-soft:#2C2C2A;--latin:#E9E9E5;--english:#A2A29C;--accent:#E9E9E5;--accent2:#C9C9C3;--highlight:#2E2E2B;--accent-soft:#6E6E68;--masthead:#131311;--masthead-ink:#E9E9E5;--facs-mat:#161614;--scan-filter:brightness(.8) contrast(.96) grayscale(.15);--reading-lh:1.68;}  /* :root prefix — must out-rank :root[data-site]'s accent or the dark lift never ships */
/* No auto-dark: the reading default is always light warm paper (dark stays opt-in via the theme toggle, matching aquinas). */
/* ── Family sites (the data-site system): one shared skeleton; each sibling = its own accent + display face. Set <html data-site="…">. Faith Received is the default :root above. ── */
[data-site="aquinas"]{--accent:oklch(.525 .12 25);--accent2:oklch(.46 .12 25);--accent-soft:oklch(.75 .06 70);--font-display:'Cardo','IM Fell Great Primer',Georgia,serif}
[data-site="pld"]{--accent:oklch(.47 .115 20);--accent2:oklch(.43 .11 20);--accent-soft:oklch(.72 .05 64);--font-display:'Spectral','Source Serif Pro',Georgia,serif}
[data-site="graeca"]{--accent:oklch(.50 .085 195);--accent2:oklch(.45 .08 195);--accent-soft:oklch(.74 .05 155);--font-display:'GFS Didot','Cardo',Georgia,serif;--font-body:'GFS Didot','Old Standard TT',Palatino,Georgia,serif}
/* per-site accent lift in dark mode (the light-mode site accents are too dark on the dark surface) */
[data-theme="dark"][data-site="aquinas"]{--accent:oklch(.71 .125 30);--accent2:oklch(.77 .115 32)}
[data-theme="dark"][data-site="pld"]{--accent:oklch(.70 .125 26);--accent2:oklch(.77 .115 27)}
[data-theme="dark"][data-site="graeca"]{--accent:oklch(.73 .09 190);--accent2:oklch(.79 .08 190)}
*,*::before,*::after{box-sizing:border-box}
body{margin:0;font-family:var(--font-body);background:var(--bg);color:var(--fg);line-height:var(--reading-lh);font-size:19px;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
a{color:var(--accent2);text-decoration:none}a:hover{text-decoration:underline}::selection{background:var(--highlight)}  /* accent2 = AA on cream/sepia (5.5:1); dark lifts --accent2 so light-on-dark holds. Reserve --accent #C1593C (4.16:1) for ≥1.25rem headings/fills */
button:focus-visible,a:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.app{display:flex;height:100vh;height:100dvh;overflow:hidden;position:relative;padding-top:var(--phh,64px)}  /* masthead is a fixed full-width bar; offset content below it; dvh = iOS-safe viewport */
/* contents sidebar is an overlay drawer: collapsed by default, floats over the text when
   summoned so opening it never reflows the reading column. */
.sidebar{position:absolute;left:0;top:var(--phh,64px);bottom:0;z-index:30;width:300px;background:var(--sidebar-bg);border-right:1px solid var(--border);display:flex;flex-direction:column;transition:transform .26s var(--ease),box-shadow .26s var(--ease);box-shadow:10px 0 44px -24px rgba(80,50,20,.6)}
.app.nosb .sidebar{transform:translateX(-100%);box-shadow:none}
/* PEEK (owner 2026-09-26 "the sizing of the preview … looks unprofessional"): a reader framed as a preview (?peek=1) keeps its
   contents drawer closed and reads a step smaller; the visitor's own type choices are untouched (nothing here is saved). */
html.peek .app .sidebar,html.peek #sbScrim{display:none!important}
html.peek body{font-size:17px}
html.peek #app{--ensz:.94;padding-top:0}
html.peek .ph,html.peek nav.frthumb,html.peek .prog{display:none!important}
html.peek .main{padding:1rem 0 2rem}
html.peek #reading{max-width:70ch!important;padding-inline:clamp(1.25rem,4vw,2.5rem)!important}
/* the drawer floats over the un-reflowed column, so a scrim must dim what it covers — at every
   width, not just phones (it was mobile-only; desktop showed raw text crowding the drawer edge) */
#sbScrim{position:fixed;inset:0;z-index:25;background:rgba(45,41,39,.38);opacity:0;pointer-events:none;transition:opacity .25s}
.app:not(.nosb) #sbScrim{opacity:1;pointer-events:auto}
.sbt{flex:0 0 auto;width:40px;height:40px;display:grid;place-items:center;border:1px solid var(--border);border-radius:7px;background:var(--card-bg);color:var(--accent);cursor:pointer;font-size:15px;line-height:1;padding:0;transition:background .15s,color .15s,border-color .15s,opacity .15s,transform .15s}
.sbt:hover{background:var(--highlight)}
.phl{display:flex;align-items:flex-end;gap:.7rem;min-width:0}
.brand{padding:1rem 1.1rem .7rem;border-bottom:1px solid var(--border);position:relative}
.sbx{position:absolute;top:.5rem;right:.55rem;width:26px;height:26px;border-radius:6px;border:1px solid var(--border);background:var(--card-bg);color:var(--muted);font-size:18px;line-height:1;cursor:pointer;display:grid;place-items:center;padding:0}
.sbx:hover{background:var(--highlight);color:var(--accent2)}
.pnav button{font-size:17px;font-weight:700;min-width:32px;padding:.3rem .5rem}
.brand .mk{font-family:var(--font-display);font-size:1.35rem;line-height:1.05;color:var(--accent)}
.brand .mk a{color:inherit}
.brand .tag{font:italic .78rem/1.3 var(--font-ui);color:var(--muted);margin-top:.1rem}
.vs{display:flex;margin-top:.6rem;border:1px solid var(--border);border-radius:7px;overflow:hidden;font:600 11px/1 var(--sans);background:var(--card-bg)}
.vs a,.vs span{padding:7px 9px;color:var(--muted);text-decoration:none;border-right:1px solid #ece0c8;cursor:pointer;white-space:nowrap}
.vs a:last-child,.vs span:last-child{border-right:0}
.vs .on{background:var(--accent);color:#fff;cursor:default}
.vs a:hover{background:var(--highlight);color:var(--accent2)}
/* owner affordances: the ✎ masthead button is injected ONLY after /api/me confirms the owner
   (no reserved space, nothing to toggle for the public); review mode shows a slim banner instead */
#ownerEdit{margin-left:auto;align-self:center;font:600 13px/1 var(--sans);color:var(--muted);border:1px solid var(--border);border-radius:6px;padding:6px 10px;text-decoration:none;white-space:nowrap}
#ownerEdit:hover{color:var(--accent2);background:var(--highlight);border-color:var(--accent-soft)}
/* "✎ Review mode" entry button in the owner's masthead (on /read) — accent so it reads as the primary review affordance */
#ownerMarks .rvbtn{background:var(--accent)!important;color:#fff!important;border-color:var(--accent)!important;font-weight:600}
#ownerMarks .rvbtn:hover{filter:brightness(1.08)}
/* ===== classic cloud review: per-folio status badge · progress panel · propose→review→apply modal ===== */
.fmark .fr .rvchip{display:inline-block;font:600 10px/1.45 var(--sans);padding:1px 7px;border-radius:999px;color:#fff;letter-spacing:.02em;vertical-align:middle}
.rvchip.ok{background:#2f7d52}.rvchip.needs{background:#9a2420}.rvchip.redone{background:#b8860b}.rvchip.viewed{background:#7d97bd}
#ownerMarks .rvprog{background:rgba(0,0,0,.04)}
.rvpanel{position:fixed;top:0;right:0;bottom:0;width:344px;max-width:92vw;z-index:60;background:var(--card-bg);border-left:1px solid var(--border);box-shadow:-12px 0 40px -24px rgba(42,28,14,.5);display:flex;flex-direction:column;font:13px/1.4 var(--sans)}
.rvpanel-h{display:flex;align-items:center;gap:.5rem;padding:.7rem .9rem;background:var(--masthead);color:var(--masthead-ink)}
.rvpanel-h b{font-size:.95rem}.rvpanel-sub{color:color-mix(in oklch,var(--masthead-ink) 70%,transparent);font-size:.78rem}
.rvpanel-x{margin-left:auto;background:rgba(255,255,255,.1);color:var(--masthead-ink);border:0;border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px}
.rvpanel-sum{display:flex;flex-wrap:wrap;gap:.4rem;padding:.7rem .9rem;border-bottom:1px solid var(--border)}
.rvpill{display:inline-flex;align-items:center;gap:.3rem;font:600 12px/1 var(--sans);color:var(--fg);background:var(--bg);border:1px solid var(--border);border-radius:999px;padding:.34rem .6rem}
.rvpill i{width:9px;height:9px;border-radius:50%;display:inline-block;border:1px solid rgba(0,0,0,.15)}
.rvpill.rvnext{cursor:pointer;color:var(--accent);border-color:var(--accent-soft)}.rvpill.rvnext:hover{background:var(--highlight)}
.rvpanel-filters{display:flex;flex-wrap:wrap;gap:.3rem;padding:.55rem .9rem;border-bottom:1px solid var(--border)}
.rvf{font:600 11px/1 var(--sans);text-transform:capitalize;color:var(--muted);background:none;border:1px solid var(--border);border-radius:6px;padding:.33rem .55rem;cursor:pointer}
.rvf.on{background:var(--accent);color:#fff;border-color:var(--accent)}
.rvpanel-grid{flex:1;overflow-y:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(46px,1fr));gap:5px;padding:.8rem .9rem;align-content:start}
.rvcell{font:600 11px/1 var(--sans);color:var(--fg);background:var(--bg);border:1px solid var(--border);border-radius:5px;padding:.5rem 0;cursor:pointer;text-align:center}
.rvcell:hover{outline:2px solid var(--accent-soft)}
.rvcell.ok{background:#2f7d52;color:#fff;border-color:#2f7d52}.rvcell.needs{background:#9a2420;color:#fff;border-color:#9a2420}
.rvcell.redone{background:#b8860b;color:#fff;border-color:#b8860b}.rvcell.viewed{background:#dfe6f0;color:#33415a;border-color:#c2cee0}
.rvprop-ov{position:fixed;inset:0;z-index:70;background:rgba(20,15,10,.55);display:flex;align-items:center;justify-content:center;padding:2.5vh 2vw}
.rvprop-box{background:var(--card-bg);border-radius:12px;box-shadow:0 30px 80px -30px rgba(42,28,14,.7);display:flex;flex-direction:column;width:min(1200px,96vw);height:min(94vh,940px);overflow:hidden}
.rvprop-h{display:flex;align-items:center;gap:.6rem;padding:.7rem 1rem;background:var(--masthead);color:var(--masthead-ink);font:600 .95rem/1.2 var(--sans)}
.rvprop-h span{font-weight:400;font-size:.8rem;color:color-mix(in oklch,var(--masthead-ink) 70%,transparent)}
.rvprop-x{margin-left:auto;background:rgba(255,255,255,.1);color:var(--masthead-ink);border:0;border-radius:6px;width:28px;height:28px;cursor:pointer}
.rvprop-body{flex:1;display:flex;overflow:hidden}
.rvprop-img{flex:0 0 40%;overflow:auto;background:var(--facs-mat,#efe7d6);border-right:1px solid var(--border);display:flex;justify-content:center;padding:.6rem}
.rvprop-img img{width:100%;height:auto;align-self:flex-start;outline:1px solid rgba(0,0,0,.1);outline-offset:-1px}
[data-theme="dark"] .rvprop-img img{outline-color:rgba(255,255,255,.1)}
.rvprop-cols{flex:1;display:grid;grid-template-columns:1fr 1fr;overflow:hidden}
.rvprop-col{display:flex;flex-direction:column;overflow:hidden;border-right:1px solid var(--border)}
.rvprop-lab{font:600 .72rem/1 var(--sans);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);padding:.5rem .7rem;border-bottom:1px solid var(--border)}
.rvprop-ta{flex:1;border:0;padding:.5rem .7rem;font:.9rem/1.55 var(--font-display,serif);resize:none;background:var(--paper,#fffdfa);color:var(--fg);outline:none}
.rvprop-ta.la{color:var(--muted)}
.rvprop-btns{display:flex;align-items:center;gap:.6rem;padding:.7rem 1rem;border-top:1px solid var(--border)}
.rvprop-btns .pri{background:#2f7d52;color:#fff;border:0;border-radius:7px;padding:.5rem .9rem;font:600 .85rem/1 var(--sans);cursor:pointer}
.rvprop-btns .rerun{background:var(--accent);color:#fff;border:0;border-radius:7px;padding:.5rem .9rem;font:600 .85rem/1 var(--sans);cursor:pointer}
.rvprop-btns .cx{background:none;color:var(--muted);border:1px solid var(--border);border-radius:7px;padding:.5rem .9rem;font:.85rem/1 var(--sans);cursor:pointer}
.rvprop-msg{color:var(--muted);font-size:.8rem}
/* ===== About panel — orient any reader: WHAT this work is + WHO wrote it ===== */
.about-ov{position:fixed;inset:0;z-index:65;background:rgba(20,15,10,.5);display:flex;justify-content:center;align-items:flex-start;padding:max(4vh,2rem) 1rem;overflow:auto}
.about-box{background:var(--card-bg);color:var(--fg);border-radius:14px;box-shadow:0 36px 90px -36px rgba(42,28,14,.7);width:min(680px,94vw);overflow:hidden}
.about-h{background:var(--masthead);color:var(--masthead-ink);padding:1.1rem 1.4rem;display:flex;align-items:flex-start;gap:1rem}
.about-h h2{margin:0;font-family:var(--font-display);font-weight:400;font-size:1.35rem;line-height:1.12;text-wrap:balance}
.about-h .ah-meta{margin-top:.3rem;font:italic .9rem/1.35 var(--font-display);color:color-mix(in oklch,var(--masthead-ink) 72%,transparent)}
.about-x{margin-left:auto;flex:none;background:rgba(255,255,255,.12);color:var(--masthead-ink);border:0;border-radius:8px;width:30px;height:30px;cursor:pointer;font-size:15px}
.about-body{padding:1.3rem 1.4rem 1.5rem}
.about-sec+.about-sec{margin-top:1.5rem;padding-top:1.4rem;border-top:1px solid var(--rule-soft,#ece0c8)}
.about-k{font:600 .7rem/1 var(--sans);letter-spacing:.12em;text-transform:uppercase;color:var(--accent);margin:0 0 .6rem}
.about-sec h3{margin:0 0 .15rem;font-family:var(--font-display);font-weight:400;font-size:1.12rem;line-height:1.15}
.about-tags{font:.82rem/1.4 var(--sans);color:var(--muted);margin:.15rem 0 .7rem}
.about-tags b{color:var(--fg);font-weight:600}
.about-prose{font:1rem/1.62 var(--font-body,Georgia,serif);color:var(--fg)}
.about-prose p{margin:.2rem 0 .7rem}
.about-sig{font-style:italic;color:var(--muted);border-left:2px solid var(--accent-soft);padding-left:.8rem;margin-top:.6rem}
.about-kw{font:.8rem/1.5 var(--sans);color:var(--muted);margin-top:.7rem}
.about-kw b{color:var(--fg);font-weight:600;font-style:normal}
.about-note{font:.72rem/1.4 var(--sans);color:var(--muted);opacity:.8;margin-top:1.1rem;padding-top:.7rem;border-top:1px dashed var(--rule-soft,#ece0c8)}
.ph .tgl#rdAbout{font-weight:600}
.sub-about{font:600 .8rem/1 var(--sans);color:var(--accent);background:none;border:0;padding:0 .15rem;cursor:pointer;white-space:nowrap}
.sub-about:hover{text-decoration:underline}
.sub a.subau{color:inherit;text-decoration:none;border-bottom:1px dotted color-mix(in oklch,currentColor 45%,transparent)}
.sub a.subau:hover{color:var(--accent)}
.rvbanner{position:sticky;top:0;z-index:40;background:var(--accent);color:#fff;font:600 12px/1.2 var(--sans);padding:8px 14px;display:flex;gap:10px;align-items:center;border-radius:0 0 8px 8px;box-shadow:0 1px 6px rgba(60,40,15,.14)}
.rvbanner a{color:#fff;text-decoration:underline;white-space:nowrap}
.rvbanner a.rv-exit{margin-left:auto}
.rvbanner .rv-tip{font-weight:400;opacity:.92}
.rvbanner .rv-act{margin-left:auto;font:600 12px/1 var(--sans);color:var(--accent);background:#fff;border:0;border-radius:6px;padding:6px 11px;cursor:pointer;white-space:nowrap}
.rvbanner .rv-act:hover{background:rgba(255,255,255,.88)}
.rvbanner .rv-act+a.rv-exit{margin-left:0}
/* on the deployed /review page the owner's masthead controls get a quiet ring so they read as the review surface */
body.cloud-review #ownerMarks{outline:2px solid var(--accent);outline-offset:3px;border-radius:8px;padding:2px 4px}
/* adjustable la∥en split: drag the gap (dblclick = reset). EN is primary -> wider by default */
#reading{position:relative}
#colgrip{position:absolute;top:0;bottom:0;width:13px;left:calc((100% - 2.1rem) * var(--lar,.44) + 1.05rem - 6.5px);cursor:col-resize;z-index:5}
#colgrip::before{content:"";position:absolute;left:6px;top:0;bottom:0;width:1px;background:var(--border);opacity:.8;transition:background .15s,width .15s}
#colgrip:hover::before,body.gripping #colgrip::before{background:var(--accent-soft);width:2px}
#colgrip::after{content:"⋮";position:sticky;top:48vh;display:block;text-align:center;color:var(--accent-soft);font-size:12px;line-height:1;pointer-events:none}
.app.only-en #colgrip,.app.only-la #colgrip{display:none}   /* the la∥en split grip only exists when both text lanes show */
body.gripping{user-select:none;cursor:col-resize}
.work{padding:.8rem 1.1rem;border-bottom:1px solid var(--border)}
.work .wt{font-family:var(--font-display);font-size:1.02rem;line-height:1.15;font-style:italic}
.work .wmeta{font:.72rem/1.3 var(--sans);color:var(--muted);margin-top:.35rem;letter-spacing:.02em}
.nav{flex:1;overflow-y:auto;padding:.5rem .55rem 30vh;scrollbar-width:thin}
.nav::-webkit-scrollbar{width:6px}.nav::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}
.nav-hd{font:600 .68rem/1 var(--sans);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);padding:.5rem .55rem .5rem}
.nav-node{position:relative;display:flex;align-items:baseline;gap:.3rem;padding:.4rem .55rem;border-radius:5px;cursor:pointer;border-left:2px solid transparent;transition:background .15s,color .15s,border-color .15s,opacity .15s,transform .15s}
.nav-node:hover{background:#fdf6ea}.nav-node.on{background:var(--card-bg);border-left-color:var(--accent)}
.nav-node.nd1 .nn-t{font:600 .9rem/1.3 var(--font-ui)}              /* questions/top divisions — prominent */
.nav-node.nd2,.nav-node.nd3,.nav-node.nd4,.nav-node.nd5{padding-top:.24rem;padding-bottom:.24rem}
.nav-node.nd2 .nn-t,.nav-node.nd3 .nn-t,.nav-node.nd4 .nn-t,.nav-node.nd5 .nn-t{font-size:.8rem;color:var(--muted)}  /* articles/finer — quieter, indented */
.nav-node.nd4 .nn-t,.nav-node.nd5 .nn-t{font-size:.76rem;opacity:.92}
.nav-node .nn-t{flex:1;font:.9rem/1.32 var(--font-ui);color:var(--fg);text-wrap:pretty;min-width:0}.nav-node.on .nn-t{color:var(--accent)}
/* collapsible tree: a caret on nodes that have descendants; collapsed → hide the subtree */
.nav-node .cv{flex:none;width:.85rem;margin:-.3rem -.5rem -.3rem -.65rem;padding:.3rem .5rem;font-size:.6rem;color:var(--muted);transition:transform .15s var(--ease);-webkit-user-select:none;user-select:none;cursor:pointer;text-align:center}
.nav-node.collapsed .cv{transform:rotate(-90deg)}
.nav-node .cv.leaf{visibility:hidden;flex:0 0 24px;width:24px;margin:-4px 0 -4px -4px}/* a leaf keeps the caret's room, so siblings line up */
.nav-node.nd-hidden{display:none}
/* Independent, keyboard-accessible section and expansion controls. */
.nav-node .nav-open{appearance:none;border:0;background:none;box-shadow:none;padding:0;text-align:left;cursor:pointer;text-decoration:none}
.nav-node button.cv{appearance:none;display:flex;align-items:center;justify-content:center;flex:0 0 24px;width:24px;height:28px;margin:-4px 0 -4px -4px;padding:4px;border:0;background:none;box-shadow:none}
.nav-node button.cv svg{width:16px;height:16px;flex:none;transition:transform .15s var(--ease)}
.nav-node.collapsed button.cv{transform:none}.nav-node.collapsed button.cv svg{transform:rotate(-90deg)}
@media(max-width:720px),(pointer:coarse){
 #nav .nav-node{align-items:center;gap:8px;min-height:56px;margin-block:4px;padding:4px 4px 4px calc(8px + var(--nav-depth,0)*12px)!important;border-radius:6px}
 #nav .nav-node:active{transform:none}
 #nav .nav-node .nav-open{order:1;min-height:48px;padding:8px 4px;font-size:16px;line-height:1.45;color:var(--fg);opacity:1}
 #nav .nav-node button.cv{order:2;align-self:center;flex:0 0 48px;width:48px;height:48px;min-height:48px;margin:0;padding:14px;border:1px solid var(--border);border-radius:6px;background:var(--card-bg);color:var(--fg);touch-action:manipulation}
 #nav .nav-node button.cv svg{width:18px;height:18px}
 #nav .nav-node .cv.leaf{display:none}
 #nav .nav-node .nn-la{order:3;padding-left:4px}
 #nav .nav-vt button{min-height:48px}
}
/* Outline ↔ Pages view toggle at the top of the nav drawer */
.nav-vt{display:flex;gap:.25rem;margin:.05rem .05rem .5rem;padding:.2rem;background:var(--sidebar-bg);border:1px solid var(--border);border-radius:8px;position:sticky;top:0;z-index:3}
.nav-vt button{flex:1;padding:.34rem .3rem;border:0;border-radius:6px;background:transparent;color:var(--muted);font:600 .72rem/1 var(--sans);letter-spacing:.02em;cursor:pointer;transition:background .15s,color .15s,border-color .15s,opacity .15s,transform .15s}
.nav-vt button.on{background:var(--card-bg);color:var(--accent);box-shadow:0 1px 3px -1px rgba(60,40,15,.22)}
/* REHAUL P6 (2026-08-17): Index nav destination — reuses .nav-node/.nav-vt wholesale (the
   ixnavrow entry above is a plain .nav-node.nd1, styled by the rules above unmodified); this
   only adds the letter-chip rail, a small addition beneath the entry it belongs to. */
.nav-index{padding:.2rem .1rem}
.ixnav-az{display:flex;flex-wrap:wrap;gap:.2rem;padding:.15rem .8rem .8rem}
.ixnav-chip{width:1.7rem;height:1.7rem;border:1px solid var(--border);border-radius:5px;background:transparent;
  color:var(--muted);font:600 .74rem/1 var(--sans);cursor:pointer;transition:background .15s,color .15s}
.ixnav-chip:hover{background:var(--highlight);color:var(--accent2)}
/* drawer Library view — filterable corpus list; the open work carries the accent spine */
.nav-lib{display:flex;flex-direction:column;gap:.45rem;min-height:0}
.nl-q{font:.86rem/1.4 var(--font-body);padding:.45rem .6rem;border:1px solid var(--border);border-radius:8px;background:var(--card-bg);color:var(--fg);width:100%}
.nl-q:focus{outline:2px solid var(--accent);outline-offset:1px}
.nl-list{display:flex;flex-direction:column;gap:.05rem}
.nl-w{display:block;padding:.4rem .55rem .42rem;border-radius:6px;text-decoration:none;border-left:2px solid transparent;transition:background .13s,color .13s,border-color .13s,opacity .13s,transform .13s}
.nl-w:hover{background:var(--highlight)}
.nl-w.here{border-left-color:var(--accent);background:color-mix(in oklab,var(--accent) 6%,transparent)}
.nl-t{display:block;font:.84rem/1.35 var(--font-ui);color:var(--fg);text-wrap:pretty}
.nl-a{display:block;font:italic .74rem/1.3 var(--font-display);color:var(--muted);margin-top:.06rem}
.nl-au{font:italic .8rem/1.3 var(--font-display);color:var(--head);margin:.85rem .3rem .25rem;padding-bottom:.18rem;border-bottom:1px solid var(--rule-soft);cursor:pointer;user-select:none}
.nl-au .nl-cv{display:inline-block;margin-right:.35rem;transition:transform .12s;font-style:normal;font-size:.7em;color:var(--muted)}
.nl-au.open .nl-cv{transform:rotate(90deg)}
.nl-list.nl-collapsed .nl-au:not(.open)~a.nl-w{display:none}
.nl-list.nl-collapsed .nl-au.open~a.nl-w{display:block}
.nl-list.nl-collapsed .nl-au.open~.nl-au:not(.open)~a.nl-w{display:none}
.nl-list>.nl-au:first-child{margin-top:.3rem}
.nl-v{color:var(--muted);font-size:.92em;font-style:italic}
.nl-msg{padding:.6rem .4rem;color:var(--muted);font:.8rem/1.4 var(--sans)}
.nav-vt button:hover:not(.on){color:var(--fg)}
/* AS bilingual TOC: the Latin half of 'EN — LA' titles is hidden in EVERY mode (the ALL-CAPS echo line
   read as clutter — owner 2026-07-03: the Junius treatment, applied to all). Latin stays in the data
   and on the node's hover tooltip. */
.nav-node .nn-la{display:block;flex-basis:100%;padding-left:.7rem;margin-top:.06rem;font:400 .62rem/1.35 var(--font-body);color:var(--muted);opacity:.85;text-transform:uppercase;letter-spacing:.09em;text-wrap:pretty}  /* honest letterspaced caps, not synthesized small-caps */
.nav-node{flex-wrap:wrap}
.nav-node.nd4 .nn-la,.nav-node.nd5 .nn-la{display:none}  /* deep leaves stay compact */
.fol{display:flex;gap:.55rem;align-items:flex-start;padding:.38rem .5rem;border-radius:5px;cursor:pointer;border:1px solid transparent;transition:background .15s,color .15s,border-color .15s,opacity .15s,transform .15s}
.fol:hover{background:#fdf6ea}.fol.on{background:var(--card-bg);border-color:var(--border)}.fol.on .fn{color:var(--accent)}
.fol img{width:32px;height:auto;border:0;outline:1px solid rgba(0,0,0,.1);outline-offset:-1px;border-radius:2px;flex-shrink:0;background:#fff}
[data-theme="dark"] .fol img{outline-color:rgba(255,255,255,.1)}
.fol .fn{font:italic .9rem/1.1 var(--font-display);color:var(--muted)}
.fol .fp{font:.72rem/1.3 var(--font-ui);color:var(--muted);margin-top:.1rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.scroll{flex:1;overflow-y:auto;position:relative}
/* full-bleed frame: .main fills the browser; masthead + reading share a centered content band
   (--bleed) so the dark masthead reaches both edges while prose stays measured */
.main{max-width:none;margin:0;padding:1.4rem 0 30vh;--bleed:max(clamp(1rem,3vw,2.6rem),calc((100% - 1280px)/2))}
#reading{max-width:var(--measure-parallel);margin-inline:auto;padding-inline:clamp(1.75rem,4.5vw,4rem)}  /* generous side margins — text must never touch an edge (2026-07 readability pass) */
/* the title + language controls stay pinned to the top while you scroll */
.ph{position:fixed;top:0;left:0;right:0;z-index:40;backdrop-filter:blur(10px);
border-bottom:1px solid var(--rule-soft);padding:.42rem clamp(1rem,2.6vw,2.4rem);margin-bottom:2rem;display:flex;align-items:center;
justify-content:space-between;gap:1.1rem;flex-wrap:nowrap;box-shadow:0 14px 20px -20px rgba(80,50,20,.4)}
/* one editorial line: the work speaks in a single quiet italicized breath — Title — Author (dates) —
   truncating gracefully; the full colophon lives one click away under ⓘ About. */
.phl{min-width:0;flex:1 1 auto}
.phl>div{display:flex;align-items:baseline;gap:.55rem;min-width:0}
/* shrink priority: the section crumb yields first, the author string next, the TITLE last —
   it was the reverse, which ellipsized the work's name to one letter at 1440px */
.ph h1{margin:0;font-family:var(--font-display);font-size:1.04rem;line-height:1.2;font-weight:400;letter-spacing:-.005em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:12ch;flex:0 1 auto}
.ph .sub{color:var(--muted);font-size:.8rem;margin-top:0;font-style:italic;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;min-width:12ch;flex:0 3 auto}  /* never the "Davi…" stub: below 12ch an author line says nothing (2026-09-05) */
/* live position sense: the current section title, always visible while scrolling — the outline
   sidebar starts collapsed and Flow hides per-folio marks, so this is the one persistent cue */
.ph .ploc{color:var(--accent);font-size:.78rem;letter-spacing:.02em;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;max-width:52ch;cursor:pointer;opacity:.9;flex:1 4 auto;min-width:10ch}  /* the running head must READ — 12ch stumps like "ACROAMATIC P…" say nothing (owner 2026-09-05) */
.ph .ploc:empty{display:none}
@media (max-width:880px){.ph .ploc{display:none}}
.ctr{flex:0 0 auto}
.ab-note{display:none}                                 /* device-save status → the sync control's tooltip, not the masthead */
.nb-pill[data-zero="1"]{display:none}                  /* 0 tr · 0 notes says nothing — appear when there is something */
.skiplink{position:fixed;left:1rem;top:-3rem;z-index:220;background:var(--card-bg);color:var(--accent2);border:1px solid var(--border);
  border-radius:8px;padding:.5rem .8rem;font:600 .8rem var(--sans,sans-serif);transition:top .18s}
.skiplink:focus{top:1rem;outline:2px solid var(--accent)}
mark.hlq{background:color-mix(in oklab,var(--accent) 18%,transparent);color:inherit;border-radius:2px;padding:0 .06em}
mark.hlq.cur{background:color-mix(in oklab,var(--accent) 38%,transparent)}
.hlbar{position:fixed;right:1rem;bottom:1rem;z-index:70;display:flex;align-items:center;gap:.15rem;
  background:var(--card-bg);border:1px solid var(--border);border-radius:999px;padding:.25rem .3rem .25rem .7rem;
  box-shadow:0 8px 28px -12px rgba(42,28,14,.4);font:.76rem/1 var(--sans,sans-serif);color:var(--muted)}
.hlbar .hlq-q{font-style:italic;max-width:11rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hlbar .hln{font-variant-numeric:tabular-nums;margin:0 .25rem;color:var(--fg)}
.hlbar button{border:0;background:none;color:var(--accent);font-size:.95rem;padding:.3rem .45rem;cursor:pointer;border-radius:999px}
.hlbar button:hover{background:var(--highlight)}
html.g-mobile .hlbar{bottom:calc(64px + env(safe-area-inset-bottom))}
html.g-mobile .ph{flex-wrap:wrap;padding:.5rem clamp(1rem,2.6vw,2.4rem)}
html.g-mobile .ph h1{font-size:1.04rem}
/* dark masthead — a deep editorial band framing the light reading column (kept dark in every theme) */
/* GROUND-UP CHROME (owner 2026-08-17): the reading bar wears the library's own paper —
   warm translucency, ink text — and while reading DOWN it recedes to a slim guiding
   strip: contents toggle · the running section head · the page. Scroll up: it returns. */
.ph{background:color-mix(in srgb,var(--bg) 88%,transparent);-webkit-backdrop-filter:saturate(1.5) blur(16px);backdrop-filter:saturate(1.5) blur(16px);
 border-bottom-color:var(--rule-soft);box-shadow:0 10px 22px -20px rgba(42,28,14,.35);
 --masthead-ink:var(--fg);color:var(--fg);transition:padding .22s var(--ease)}
.ph h1,.ph .sub{color:var(--fg)}
.ph .sub{color:var(--muted)}
.ph .seg.lanes button{color:var(--fg)}
.ph .seg.lanes button[aria-pressed=true]{background:var(--card-bg);color:var(--fg);box-shadow:inset 0 -2px 0 var(--accent)}
.ph .tgl{color:var(--fg);border-color:var(--border);background:transparent}
html[data-theme="dark"] .ph{background:color-mix(in srgb,var(--bg) 86%,transparent)}
html.mh-mini .ph{padding-top:.18rem;padding-bottom:.18rem}
html.mh-mini .ph h1,html.mh-mini .ph .sub,html.mh-mini .ph #rdAbout,html.mh-mini .ph .mh-home,
html.mh-mini .ph .phr .tgl,html.mh-mini .ph .phr .ctr,html.mh-mini .ph .aa,html.mh-mini .ph #signBtn{display:none}
html.mh-mini .ph .ploc{font-size:.7rem;opacity:1}
@media(prefers-reduced-motion:reduce){.ph{transition:none}}
.ph h1{color:var(--masthead-ink)}
.ph .sub{color:color-mix(in oklch,var(--masthead-ink) 70%,transparent)}
.ph .sbt{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.22);color:var(--masthead-ink)}
.ph .sbt:hover{background:rgba(255,255,255,.16)}
.ph .seg{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.20)}
.ph .seg button{color:color-mix(in oklch,var(--masthead-ink) 78%,transparent);border-right-color:rgba(255,255,255,.16)}
.ph .seg button[aria-pressed=true]{background:var(--accent);color:#fff}
/* the lanes seg holds three INDEPENDENT toggles, not radios — checked-tab styling (soft fill +
   accent underline) instead of solid radio fill, so English+Scan lit together reads as intended */
.ph .seg.lanes button[aria-pressed=true]{background:rgba(255,255,255,.13);color:var(--masthead-ink);box-shadow:inset 0 -2px 0 var(--accent)}
.ph .tgl{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.20);color:color-mix(in oklch,var(--masthead-ink) 78%,transparent)}
.ph .tgl[aria-pressed=true]{background:var(--accent);color:#fff;border-color:var(--accent)}
.ph .sld{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.20);color:var(--masthead-ink)}
.ph .authbar{color:color-mix(in oklch,var(--masthead-ink) 72%,transparent)}
.ph .authbar button{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.2);color:var(--masthead-ink)}
#tf{display:none}  /* the source scan is now owned by Study mode — drop the redundant standalone toggle */
.ctr{display:flex;gap:.5rem;align-items:center}
@media(max-width:640px){.ph .ctr{overflow:visible}}
#reading .row .la p{text-align:left}  /* no browser ships Latin hyphenation — justify makes rivers (Opus audit) */
/* PRINT-MAGAZINE RAG (owner 2026-08-27 "readable like a print magazine"): modern engines balance
   the last lines of a paragraph and avoid single-word orphans with text-wrap:pretty — additive,
   left-aligned (the no-justify ruling stands), silently ignored by engines without it. English
   also hyphenates on narrow measures (ragged-right + hyphens is book practice; Latin is excluded
   — no engine ships Latin patterns, per the ruling above). */
#reading .row p{text-wrap:pretty}
#reading .row .en p{-webkit-hyphens:auto;hyphens:auto;hyphenate-limit-chars:8 4 4}
@media(min-width:881px){#reading .row .en p{hyphens:manual;-webkit-hyphens:manual}} /* wide measure needs no hyphens */
@media(max-width:1100px){#reading .row .en p{text-align:left}}  /* the desktop overflow guard clipped the whole Aa popover to the 40px header (Opus audit P0) */
.seg{display:inline-flex;background:var(--card-bg);border:1px solid var(--border);border-radius:6px;overflow:hidden}
.seg button{font:.8rem/1 var(--sans);color:var(--muted);background:none;border:0;border-right:1px solid var(--border);padding:.45rem .7rem;cursor:pointer}
.seg button:last-child{border-right:0}.seg button[aria-pressed=true]{background:var(--accent);color:#fff}
/* emil-craft: controls feel pressable; honest ease-out; movement off under reduced-motion */
.seg button,.tgl,.pnav button,.sbt{transition:transform .14s var(--ease),background .14s ease,color .14s ease,border-color .14s ease}
.seg button:active,.tgl:active,.pnav button:active,.sbt:active{transform:scale(.96)}
@media (prefers-reduced-motion:reduce){.seg button,.tgl,.pnav button,.sbt{transition:none}}
.tgl{font:.8rem/1 var(--sans);color:var(--muted);background:var(--card-bg);border:1px solid var(--border);border-radius:7px;padding:.45rem .7rem;cursor:pointer}
/* one control height across the masthead — mixed heights read as clutter */
.ph .ctr .tgl,.ph .ctr .seg,.ph .ctr .sld{height:32px;box-sizing:border-box}
.ph .ctr .seg button{height:100%}
.ph .ctr .tgl{display:inline-flex;align-items:center}
#pgJump,.pg-total{font-variant-numeric:tabular-nums}
/* secondary toggles (About · Flow · Related) go quiet: text-weight buttons, no box until engaged —
   the eye finds the three primary clusters (page · mode · settings) instead of nine equal boxes */
.ph #rdAbout,.ph .ctr #rdFlow,.ph .ctr #rdRel{background:transparent;border-color:transparent}
.ph #rdAbout:hover,.ph .ctr #rdFlow:hover,.ph .ctr #rdRel:hover{background:rgba(255,255,255,.10)}
.phl #rdAbout{flex:none;align-self:center;color:color-mix(in oklch,var(--masthead-ink) 78%,transparent)}  /* About is identity information — it lives with the title, not among the reading controls */
.ph .ctr #rdFlow[aria-pressed=true],.ph .ctr #rdRel[aria-pressed=true]{background:transparent;border-color:transparent;color:var(--masthead-ink)}
.ph .ctr #rdFlow[aria-pressed=true]::before,.ph .ctr #rdRel[aria-pressed=true]::before{content:"";display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--accent);margin-right:.38rem}
.ph .ctr button:focus-visible,.ph .ctr input:focus-visible{outline:2px solid var(--accent);outline-offset:1px}
.tgl[aria-pressed=true]{background:var(--accent);color:#fff;border-color:var(--accent)}
.fmark{display:flex;align-items:center;gap:.7rem;margin:1.15rem 0 .5rem}.fmark:first-of-type{margin-top:.2rem}   /* tight page seams (user 2026-07-19): pages read as one column */
/* jump targets must clear the fixed masthead (the scroll content runs under it — see pickFolio probe),
   else scrollIntoView({block:start}) tucks the page top under the bar and it reads as "cut off". */
.folio,.fmark{scroll-margin-top:calc(var(--phh,64px) + 12px)}
.fmark .ff{position:relative;font:italic 1rem/1 var(--font-display);color:var(--accent);border:1px solid var(--accent-soft);border-radius:999px;padding:.16rem .7rem;white-space:nowrap;font-variant-numeric:tabular-nums;cursor:copy;transition:background .15s}
.fmark .ff:hover{background:var(--highlight)}
.fol .fn,.sld,#ffol,.fmtoggle .do{font-variant-numeric:tabular-nums}  /* folio/page numbers never shift width */
.fmark .fr{flex:1;height:1px;background:linear-gradient(90deg,var(--border),transparent)}
.fmark .fm{font:.68rem/1 var(--sans);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
/* front matter: the leading scan-notice / library-stamp / blank leaves collapse behind ONE toggle, so the
   reader opens on the actual printed title page. Nothing is removed — the toggle reveals them in place. */
.app:not(.show-fm) .fmark.frontmatter,.app:not(.show-fm) .folio.frontmatter,.app:not(.show-fm) .fol.frontmatter{display:none}
.fmtoggle{display:flex;align-items:center;gap:.6rem;margin:.2rem 0 1.6rem;padding:.55rem .8rem;border:1px dashed var(--border);border-radius:10px;background:var(--card-bg);color:var(--muted);font:.78rem/1.4 var(--sans);cursor:pointer;transition:background .15s,color .15s,border-color .15s,opacity .15s,transform .15s var(--ease)}
.fmtoggle:hover{border-color:var(--accent-soft);background:var(--highlight)}
.fmtoggle .ic{font-size:1.05rem;color:var(--accent-soft);line-height:1}
.fmtoggle .lab b{color:var(--accent2);font-weight:600}
.fmtoggle .do{margin-left:auto;font-weight:600;color:var(--accent2);white-space:nowrap;border:1px solid var(--accent-soft);border-radius:999px;padding:.2rem .6rem}
.app.show-fm .fmtoggle .do::after{content:"Hide ▲"}.app:not(.show-fm) .fmtoggle .do::after{content:"Show ▾"}
.fmark.titlepage .ff{background:var(--accent);color:#fff;border-color:var(--accent)}
/* ── Continuous reading (Flow, default ON): the ORIGINAL page divisions recede so the text reads as one
   document. The full-width folio rule collapses to a small floating page pill in the left gutter, and a
   paragraph that the printer split across a page break visually re-joins (.tail/.cont, set render-side
   by a continuation heuristic). Citations keep working — the pill still names the page. ── */
.app.rflow .fmark{margin:0;height:0;position:relative;pointer-events:none}
.app.rflow .fmark .fr,.app.rflow .fmark .fm{display:none}
.app.rflow .fmark .ff{position:absolute;right:calc(100% + 1.1rem);top:.3rem;font-size:.72rem;opacity:.72;color:var(--muted);border-color:var(--rule-soft);padding:.12rem .55rem;pointer-events:auto;transition:opacity .15s}
.fmark .ff::after{content:"";position:absolute;inset:50%;width:40px;height:40px;transform:translate(-50%,-50%)}
.app.rflow .fmark:hover .ff,.app.rflow .fmark .ff:hover,.app.rflow .fmark .ff:focus-visible{opacity:1;color:var(--accent);border-color:var(--accent-soft)}
.fmark .ff:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.app.rflow .fmark.titlepage{margin:1.6rem 0 .9rem;height:auto}
.app.rflow .fmark.titlepage .ff{position:static;opacity:1}
.app.rflow .fmark.titlepage .fr,.app.rflow .fmark.titlepage .fm{display:block}
/* a page break that split a sentence: close the gap and drop the false paragraph indent */
.app.rflow .row.tail{margin-bottom:0}
.app.rflow .row.tail .la p:last-of-type,.app.rflow .row.tail .en p:last-of-type{margin-bottom:0}
.app.rflow .row.cont{margin-top:0}
/* same re-join once the cells have been lifted into the stacked columns (see GAPPY-PAGE RESCUE):
   the classes now ride on the .la/.en cells themselves, so a sentence split across a page break
   closes up instead of reopening as a fresh indented paragraph */
.app.rflow .stkwrap .la.cont,.app.rflow .stkwrap .en.cont{margin-top:0}
.teifig{margin:1.1rem auto;text-align:center;max-width:46rem}
.teifig img{max-width:100%;border-radius:6px;box-shadow:0 8px 28px -12px rgba(0,0,0,.35);background:#fff}
.teifig figcaption{font:italic .82rem/1.4 var(--font-display);color:var(--muted);margin-top:.45rem}
.teitbl{border-collapse:collapse;font-size:.85em;margin:.4rem 0}
.teitbl td{border:1px solid var(--border);padding:.15rem .55rem;vertical-align:top}
.teitbl .tlab td{font-weight:600;background:color-mix(in oklab,var(--border) 25%,transparent)}
/* TEI universe: the printer's page-split sentences close up in EVERY layout */
/* v2-aesthetic page marks (owner 2026-08-11 'v2 page counting was a lot better'):
   in the TEI path the heavy full-width folio bar becomes a quiet right-aligned chip */
.app.teiflow .fmark{border:none;background:none;margin:.15rem 0 0;padding:0;display:flex;justify-content:flex-end;opacity:.6}
.app.teiflow .fmark .fm{font-size:.66rem;letter-spacing:.02em;border:1px solid var(--border);border-radius:99px;padding:0 .55rem;color:var(--muted)}
.app.teiflow .fmark .ff{font-size:.66rem}
.app.teiflow .fmark .fr{display:none}
.app.teiflow .folio{margin-top:.2rem}
/* single-lane born-digital (EEBO divines/confessions, owner 2026-08-20 'these should flow'):
   the page-marker strip's 1.65rem margins were the phantom paragraph gap at every seam —
   collapse it to the rflow hover-pill. Dual-lane canon works keep their visible markers. */
.app.teiflow.en-only .fmark{margin:0;height:0;position:relative;pointer-events:none}
.app.teiflow.en-only .fmark .fr,.app.teiflow.en-only .fmark .fm{display:none}
.app.teiflow.en-only .fmark .ff{position:absolute;right:calc(100% + 1.1rem);top:.3rem;font-size:.72rem;opacity:.72;color:var(--muted);border-color:var(--rule-soft);padding:.12rem .55rem;pointer-events:auto;transition:opacity .15s}
.app.teiflow.en-only .fmark:hover .ff,.app.teiflow.en-only .fmark .ff:hover{opacity:1;color:var(--accent);border-color:var(--accent-soft)}
.app.teiflow.en-only .row{margin-bottom:.55rem}
.app.teiflow.en-only .row.tail{margin-bottom:0}
/* the seam paragraphs themselves (live-DOM 2026-08-20: a generic p-margin rule outranked
   every seam rule — 29px ghost gap at each page turn). !important ends the war for the
   born-digital single-lane case only. */
.app.teiflow.en-only .row.tail .en p:last-of-type,.app.rflow.only-en .row.tail .en p:last-of-type{margin-bottom:0!important}
.app.teiflow.en-only .row.cont .en p:first-of-type,.app.rflow.only-en .row.cont .en p:first-of-type{margin-top:0!important;text-indent:0!important}
.app.teiflow.en-only .row.cont,.app.rflow.only-en .row.cont{margin-top:0!important}
.app.teiflow .row.tail{margin-bottom:0}
/* paragraph-paired rows: read as one continuous facing flow — tight seams between pairs,
   normal paragraph rhythm inside, a breath before the next section head */
.app.teiflow .row.prow{margin:0}
.app.teiflow .row.prow .la p,.app.teiflow .row.prow .en p{margin:.42rem 0}
.app.teiflow .row.prow+.row.prow{margin-top:0}
.app.teiflow .row.prow+.rhead{margin-top:1.05rem}
/* WA editorial apparatus sections (Anmerkungen/Notes): quieter register than Luther's text —
   smaller, muted, hairline-indented; the head shrinks to a section label */
.app.teiflow .row.redit{font-size:.885em;color:color-mix(in srgb,var(--fg) 72%,var(--muted));}
.app.teiflow .row.redit .la,.app.teiflow .row.redit .en{border-left:2px solid var(--border);padding-left:.8rem}
.app.teiflow .rhead.hedit .csub{font-size:.78rem;letter-spacing:.12em;text-transform:uppercase;opacity:.72}
.app.teiflow .row.tail .la p:last-of-type,.app.teiflow .row.tail .en p:last-of-type{margin-bottom:0}
.app.teiflow .row.cont{margin-top:0}
.app.teiflow .stkwrap .la.cont,.app.teiflow .stkwrap .en.cont{margin-top:0}
.app.teiflow .row.cont>.la p:first-of-type,.app.teiflow .row.cont>.en p:first-of-type{text-indent:0;margin-top:0}
.app.rflow .stkwrap .la.cont>p:first-of-type,.app.rflow .stkwrap .en.cont>p:first-of-type{text-indent:0;margin-top:0}
.app.rflow.only-en .row{margin-bottom:.55rem}
.app.rflow.only-en .row.rhead .csub{margin-top:1.9rem}
/* published-edition rhythm (owner 2026-08-10 "ebook level quality… structure and breaks are clear"):
   section heads breathe above more than below — book typography — in EVERY flow layout, and
   paragraphs avoid widows/orphans where the engine supports it. */
.app.rflow .row.rhead{margin-top:1.5rem}
/* index-run heads (TABULA leaves): compact catalogue typography, not display headings */
.row.rhead.ixh{margin-top:0}.app.rflow .row.rhead.ixh{margin-top:.1rem}
.row.rhead.ixh .csub{display:block;margin:.12rem 0;font-size:.98em;line-height:1.35;color:var(--fg)}
.row.rhead.ixh .csub .hen{font-size:1em;font-weight:600;letter-spacing:0}
.row.rhead.ixh .csub .hla{font-size:.78em;opacity:.62;display:inline;margin-left:.5em}
.row.rhead.ixh .hanchor{display:none}
/* lane-integrity TEI heads (.h2col): each column carries its OWN language as a true heading */
.row.rhead.h2col .csub .hla{display:block;font:inherit;color:inherit;text-transform:none;letter-spacing:0;font-size:1em;opacity:.92}
.row.rhead.h2col .csub{margin:0}
.row.rhead.h2col.hmain .csub{font-size:1.16em}
#m-wit.srcon,#m-wit2.srcon,#m-wit0.srcon{color:var(--accent,#C1593C);box-shadow:inset 0 -2px 0 var(--accent,#C1593C)}
.rl{font-style:italic;font-weight:600;letter-spacing:.01em}
/* REHAUL P1 (2026-08-17): dedicated run-in-label typography (label[@rend=run-in], teiCell
   ~line 2823) — the scholastic "Primus… Secundus…" argument cadence, corpus-wide highest-volume
   unhandled TEI signal (voetius-selectae LA alone: 10,656 instances). Small-caps + a muted
   accent tint reads as STRUCTURE (an enumerator), not as emphasis or a link — kept legible at
   body size rather than promoted to a display weight, per the print-shop-not-app-chrome
   principle. Sized relative to --font-body via em, not a fixed px, so it tracks the reader's
   Aa size control like the surrounding prose. Scoped to .rl alone — teiCell's existing
   run-in detection is untouched, this is a pure additive CSS refinement of the same class.
   CONTRAST FIX (review pass): the file documents its own AA discipline near :root (~line 43) —
   --accent-soft is a low-chroma gold reserved for rules/large text, --accent2 is what's AA-safe
   for body text on the paper background. A first draft mixed 72% accent-soft / 28% --fg, which
   computes to roughly 3.4:1 against the light paper background (#FAF8F3) — under the 4.5:1 body-
   text floor, and this lands on real sentence openings ("Decimus usus est, ut…"), not just
   ornamental labels, across 10,656+ live instances. Inverted the weights (~40% accent-soft / 60%
   fg) instead, which computes to ~6.4:1 light / ~9:1 dark (accent-soft's dark value is lighter
   relative to the dark background) — comfortably AA, still visibly gold-tinted against the
   surrounding ink so the "structure, not link" cue survives. */
.rl{font-variant:small-caps;font-size:.97em;color:color-mix(in oklch,var(--accent-soft,var(--accent)) 40%,var(--fg) 60%)}
/* no synthetic terminal period: sampled label text is inconsistent (bare "Quintus", already-
   punctuated "14.", mid-phrase "Decimus usus est, ut…") — an injected "." would double up or
   land mid-sentence on a meaningful fraction of the corpus's 10k+ instances. Render exactly what
   the source carries. */
.csub.inflow{font-family:var(--font-display);color:var(--head);font-size:1.1em;margin:1.2rem 0 .4rem}
.inhead{display:block;text-align:center;font-family:var(--font-display);color:var(--head);font-size:1.02em;font-weight:600;letter-spacing:.05em;margin:.95em 0 .3em;text-wrap:balance}
.inhead+.inhead{margin-top:.05em}
.milat{display:block;margin-top:.5em;padding-top:.4em;border-top:1px solid color-mix(in oklab,var(--border) 45%,transparent);font-size:.86em;line-height:1.55;color:var(--muted);font-family:var(--font-body)}
/* PG works read their Greek in Cardo — designed for polytonic; loaded lazily at canon time */
.app.grcwork .row .la,.app.grcwork .stkwrap .stk-la .la,.app.grcwork .row.seg .sp .la{font-family:'Cardo','GFS Didot',var(--font-body);font-size:calc(1.04em * var(--lasz,1));line-height:1.72}
/* narrow-column Greek justification opened rivers ("γένοιτο   πάντας   ἡμᾶς") — with the
   scan pane open the lane is too narrow to justify long polytonic words. Ragged right in
   squeezed layouts (railok tracks reading width); hyphenation assists where supported. */
.app.grcwork .row .la{-webkit-hyphens:auto;hyphens:auto}
html:not(.railok) .app.grcwork .row .la p{text-align:left}
.app.grcwork .row .la .milat{font-family:var(--font-body)}
.capslead{display:block;letter-spacing:.06em;font-family:var(--font-display);color:var(--accent);margin:.2rem 0 .5rem}
.mnote{display:block;font-size:.82em;color:var(--muted);font-style:italic;margin:.25rem 0 .25rem 1.4rem;padding-left:.6rem;border-left:2px solid var(--rule-soft,#ddd)}
.mnp{margin:.1rem 0}
.gapfill.inferred{text-decoration:underline dotted;text-decoration-color:var(--muted);text-underline-offset:.16em}   /* EEBO restored words (illegible-letter campaign 09-07): a quiet dotted mark, hover explains */
/* margin-note groups (2026-09-02): off the rail (narrow screens / mid widths) a run of glosses reads as one small
   block with dot separators instead of a stack of indented paragraphs; long glosses clamp, click opens */
.mnp.mngroup>.mnote{display:inline;margin:0 .35em 0 0;padding:0;border:0}
.row p.mnp>span.mnote{float:none;display:block}.row p.mnp.mngroup>span.mnote{display:inline}   /* the inline-gloss float (.row p>span.mnote) must not reach note paragraphs: 26 floated shreds stacked down the column (Billuart v5 p14, 09-02) */
.mnp.mngroup>.mnote:not(:last-child)::after{content:" · ";color:var(--rule-soft,#bbb)}
.mnp.mngroup{margin:.25rem 0 .35rem 1.4rem;padding-left:.6rem;border-left:2px solid var(--rule-soft,#ddd);font-size:.8em;color:var(--muted);font-style:italic;line-height:1.45}
.mnote.mnlong,.row p>span.mnote.mnlong{display:-webkit-box;-webkit-line-clamp:6;-webkit-box-orient:vertical;overflow:hidden;cursor:pointer}
.row p>span.mnote{font-size:.72em;line-height:1.35;margin:.05rem 0 .2rem .8rem}
.mnote.mnlong.open{display:block;-webkit-line-clamp:unset;overflow:visible}
/* EDITORIAL REGISTER (owner 2026-09-01, Luther WA): the Weimar edition sets each work's Einleitung, the
   editor's credit/signature and the apparatus in petit type. rend="editorial" carries that register. */
.row p.editorial{font-size:.9em;line-height:1.55;color:var(--muted);padding-left:.9rem;border-left:2px solid var(--rule-soft,#ddd)}
.row p.editorial+p.editorial{margin-top:.35em}
.row.rhead.hedit h3.csub,.row.rhead.hedit h3.csub .hla,.row.rhead.hedit h3.csub .hen{font-size:.9em;font-weight:600;letter-spacing:.06em;color:var(--muted)}
.row.rhead.hedit h3.csub{margin:1rem 0 .3rem}
h3.csub.inflow.editorial{font-size:.78em;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:1rem 0 .3rem}
.folin{font:500 .62em var(--sans);color:var(--muted);opacity:.55;vertical-align:.45em;
  padding:0 .18em;letter-spacing:.02em;user-select:none}
.folin::before{content:"|" attr(data-n) ""}
.row.seamgone{display:block;height:0;overflow:hidden;margin:0;padding:0;border:0}
/* INLINE margin notes (owner 2026-08-19, Baxter '§. 6.' mid-sentence): a <note> the printer
   set in the margin sits INSIDE the paragraph in TCP order — display:block was splitting the
   sentence. Float it to the paragraph's right edge instead, and keep it out of text selection
   so copies and quote-cards never swallow it. */
.row p>span.mnote{float:right;clear:right;display:block;max-width:9.5rem;font-size:.76em;
  margin:.1rem 0 .3rem 1rem;padding-left:.55rem;text-align:left;
  -webkit-user-select:none;user-select:none}
/* REHAUL P2 (2026-08-17): outer-margin sidenote rail, wide screens only. This EXTENDS the file's
   own pre-existing (previously inert — no other rule referenced it) `.en .mnote,.la .mnote
   {position:relative}` hook at this exact breakpoint, which reads as an abandoned first attempt
   at this very feature — reused rather than duplicated, per "no third head on any hydra".
   Tufte-CSS / Bringhurst convention: the lane's own column narrows to make room for its outer
   margin (LA is the physically-left lane → its outer margin is the left gutter; EN is physically
   right → its outer margin is the right gutter — matches the facing-page book the TEI audit
   cites, glosses beside the column they gloss). CSS-only positioning against the DOM teiCell
   already emits (.mnp > .mnote), no reparenting — the negative-margin float technique already
   proven in this file for user-note asides (.rowx, ~line 776) is reused for a second purpose
   rather than inventing new layout machinery. Gated on .hasmn (readingEditionPass, ~3103):
   a lane cell with no margin note pays zero layout cost. */
/* GUTTER MUST BE RESERVED, NOT ASSUMED (owner 2026-08-24, Barberi vol-1: the Latin
   marginalia showed as two-letter stubs — "MA", "s,", "us" — at the very left edge).
   The technique floats each note 8.5rem+.8rem OUTSIDE its column. The column reserves that
   space with padding, but the ROW is centred at max-width:126ch, so at 1250px the row can
   span nearly the whole viewport and the left float lands off-screen: the note box begins
   ~149px left of a column sitting ~90px from the edge, so only its right-hand TAIL shows.
   The English side never showed it because its gutter floats inward, into the page.
   Two changes: reserve the gutters on the reading container whenever a lane actually
   carries margin notes, and raise the breakpoint to a width that can hold them. */
/* 2026-09-02: the rail keys on the READING AREA's measured width (html.railok, set by JS), not the window —
   with the scan pane open a 1440px window leaves ~860px for text and the reserved gutters squeezed the English
   column to a sliver (Scheibler, Billuart). Below the threshold, margin notes render as the compact in-flow group. */
html.railok #reading:has(.hasmn){padding-left:calc(8.5rem + 1rem);padding-right:calc(8.5rem + 1rem)}
@media(min-width:1px){
  html.railok .en .mnote,html.railok .la .mnote{position:relative}
  html.railok .row>.la.hasmn{padding-left:calc(8.5rem + .8rem)}
  html.railok .row>.en.hasmn{padding-right:calc(8.5rem + .8rem)}
  html.railok .row>.la.hasmn>.mnp,html.railok .row>.en.hasmn>.mnp{margin:0}
  html.railok .row>.la.hasmn>.mnp>.mnote,html.railok .row>.en.hasmn>.mnp>.mnote{
    display:block;width:8.5rem;font-size:.78em;font-style:normal;line-height:1.42;
    letter-spacing:.005em;color:var(--muted);padding:.05rem 0 .05rem .6rem;margin:.15rem 0;
    border-left:1px solid var(--rule-soft);text-align:left}
  html.railok .row>.la.hasmn>.mnp>.mnote{float:left;clear:left;margin-left:calc(-8.5rem - .8rem)}
  /* rail groups: each gloss keeps its own float box (so the rail still tracks the column) but tighter */
  html.railok .row>.la.hasmn>.mnp.mngroup>.mnote,html.railok .row>.en.hasmn>.mnp.mngroup>.mnote{margin-top:.08rem;margin-bottom:.08rem;font-size:.74em;line-height:1.35}
  html.railok .row>.la.hasmn>.mnp.mngroup>.mnote::after,html.railok .row>.en.hasmn>.mnp.mngroup>.mnote::after{content:none}
  html.railok .row>.la.hasmn>.mnp.mndense>.mnote,html.railok .row>.en.hasmn>.mnp.mndense>.mnote{font-size:.68em;line-height:1.3;border-color:transparent;padding-top:0;padding-bottom:0;margin-top:.02rem;margin-bottom:.02rem}
  html.railok .row>.la.hasmn>.mnp.mngroup,html.railok .row>.en.hasmn>.mnp.mngroup{border:0;padding:0;margin:0;font-style:normal}
  html.railok .row>.en.hasmn>.mnp>.mnote{float:right;clear:right;margin-right:calc(-8.5rem - .8rem);
    padding:.05rem .6rem .05rem 0;border-left:0;border-right:1px solid var(--rule-soft);text-align:right}
}
#fnpop{display:none;position:absolute;z-index:60;max-width:340px;background:var(--card-bg,#fff);
  color:var(--fg);border:1px solid var(--border);border-radius:8px;padding:.6rem .8rem;
  font-size:.82rem;line-height:1.5;box-shadow:0 6px 24px rgba(0,0,0,.14)}
/* professional heading rhythm (owner 2026-08-11 'clean and professional') */
.row.rhead .csub{margin:1.5rem 0 .45rem;line-height:1.25}
.row.rhead.h2col.hmain .csub{font-size:1.26em;letter-spacing:.015em}
.row.rhead.h2col:not(.hmain) .csub{font-size:1.05em}
.row.rhead.ixh .csub{margin:.1rem 0}
/* TITLE PAGE: centered display stack, print-order caps lines scaled by position */
.folio.titlepage .row{grid-template-columns:1fr;max-width:60ch;margin-left:auto;margin-right:auto}
/* TITLE-PAGE REGISTER BALANCE (owner 2026-08-20 Rutherford Exercitationes: LA lane's title
   tagged <head> shouted in giant accent caps while the EN facing block sat in body small
   caps). On a title page BOTH lanes set in the same quiet small-caps body register. */
.folio.titlepage .la h1,.folio.titlepage .la h2,.folio.titlepage .la h3,.folio.titlepage .la h4,
.folio.titlepage .en h1,.folio.titlepage .en h2,.folio.titlepage .en h3,.folio.titlepage .en h4,
.folio.titlepage .rhead h3{font-family:var(--font-body);font-size:1.02em;font-weight:400;color:var(--fg);
  font-variant:small-caps;text-transform:lowercase;letter-spacing:.035em;line-height:1.6;text-align:left;margin:.2rem 0}
.folio.titlepage p{text-align:center;margin:.5rem 0}
.folio.titlepage p.caps{letter-spacing:.1em;line-height:1.5;font-size:1.05em}
.folio.titlepage .row:nth-of-type(1) p.caps{font-size:1.55em;letter-spacing:.12em}
.folio.titlepage .row:nth-of-type(2) p.caps{font-size:1.25em}
.folio.titlepage .csub{text-align:center}
.reading p{text-wrap:pretty}
.row.rhead .csub,.reading h1,.reading h2,.reading h3{text-wrap:balance}
/* reading measure cap for the PARALLEL view — on wide monitors unbounded lanes pass 90ch and
   reading comfort dies; cap the pair and center it (the only-en view already caps at 66ch) */
.app.rflow:not(.only-en) #reading .row{max-width:126ch;margin-left:auto;margin-right:auto}
.app.rflow:not(.only-en) #reading .inctoc{max-width:126ch;margin-left:auto;margin-right:auto}
/* only the FIRST cell of a continued row resumes the previous page's sentence — on a .row.seg the
   later .sp sub-pairs are fresh paragraphs and must keep their indent */
.app.rflow .row.cont>.la p:first-of-type,.app.rflow .row.cont>.en p:first-of-type,
.app.rflow .row.cont>.sp:first-child .la p:first-of-type,.app.rflow .row.cont>.sp:first-child .en p:first-of-type{text-indent:0;margin-top:0}
.app.rflow.only-en .row.tail .en p:last-of-type{margin-bottom:0}
/* even between whole paragraphs, the seam adds no extra space in flow — page gaps read like paragraph gaps */
.app.rflow .folio{margin:0}
.app:not(.rflow) .folio{content-visibility:auto;contain-intrinsic-size:auto 720px}
.fph{contain:strict;pointer-events:none}   /* windowed-render placeholder — hydrates on approach */
/* Flow (the DEFAULT mode) was excluded from content-visibility — so a 1,281-folio volume paid
   full layout for every page (13.6s build, 2.2s blocking; perf audit 2026-07-24). The settle
   chains (deep-link, jump, flow-toggle) already tolerate lazy re-measure; 'auto' intrinsic
   keeps each folio's real height once seen so seams don't jump on re-scroll. */
.app.rflow .folio{content-visibility:auto;contain-intrinsic-size:auto 2400px}
.folio:has(.aapop.on),.folio:focus-within{content-visibility:visible;contain-intrinsic-size:none}
/* FOOTNOTE TAP TARGETS (owner 2026-08-27, mobile pass): a superscript degree/number is a ~10px
   target; on coarse pointers give every fnref a 32px invisible hit area without moving the glyph. */
@media(pointer:coarse){
  sup.fnref{position:relative}
  sup.fnref::after{content:"";position:absolute;inset:-10px -8px;border-radius:8px}
}
@media print{.folio{content-visibility:visible!important;contain-intrinsic-size:none!important}}
@media(max-width:900px){.app.rflow .fmark .ff{position:static;display:inline-block;margin:.15rem 0;font-size:.68rem}.app.rflow .fmark{height:auto}}
/* "flow" works (Reformed Confessions): no folios — hide the §-folio running header and read as one
   continuous document structured purely by its own headings/subheadings. */
.app.flow .fmark{display:none}
.app.flow .folio{margin-top:0}
.app.flow .folio .csub:first-child{margin-top:2.2rem}
.nav .fmnav{display:flex;align-items:center;gap:.5rem;padding:.4rem .55rem;margin:.1rem .05rem .35rem;border-radius:6px;cursor:pointer;color:var(--muted);font:600 .72rem/1 var(--sans);border:1px dashed var(--border)}
.nav .fmnav:hover{background:var(--highlight);color:var(--accent2);border-color:var(--accent-soft)}
.nav-sec{margin:.15rem 0}
.nav-sech{position:sticky;top:0;z-index:2;display:flex;gap:.45rem;align-items:baseline;cursor:pointer;background:var(--sidebar-bg);padding:.5rem .55rem .35rem;font:italic 600 .82rem/1.25 var(--font-display);color:var(--accent2);border-bottom:1px solid var(--border)}
.nav-sech .cv{font-style:normal;font-size:.62rem;color:var(--muted);transition:transform .15s}
.nav-sec.closed .cv{transform:rotate(-90deg)}
.nav-sec.closed .nav-secb{display:none}
.row{display:grid;grid-template-columns:var(--laf,.88fr) var(--enf,1.12fr);gap:0 2.1rem;margin:0 0 .95rem;position:relative}  /* paragraph rhythm; EN-favoring adjustable split */
.row .la{color:var(--muted);font-size:calc(1em * var(--lasz,1))}  /* MATCH English. The old .92 step read as "the Latin lane keeps changing size" (owner 2026-08-09): body rows shrank Latin to .92 while .row.rapp, .folio.ixfolio and .row.redit all set BOTH lanes to one size, so the Latin jumped between 92% and 100% down a single page. The lane is already distinguished by the muted ink + accent rule below; size is not a third signal. */
.app:not(.only-en):not(.only-la) .row .la{color:color-mix(in oklch,var(--fg) 88%,var(--bg));border-left:2px solid color-mix(in oklch,var(--accent-soft) 55%,transparent);padding-left:1.05rem}.row .en{color:var(--fg);font-size:calc(1em * var(--ensz,1))}.row .la,.row .en{padding:0;margin:0;max-width:74ch}  /* English primary (ink, full size); Latin muted + smaller. max-width caps each lane at ~74ch so Parallel/born-digital lines don't run to 90+ch (the dominant reading-fatigue source); narrow Study lanes are unaffected */
.row .la p,.row .en p{margin:0;text-indent:1.5em;text-wrap:pretty}
/* WEB-NATIVE paragraph rhythm in Flow (owner 2026-08-10, schola-thomistica analysis): the
   web separates paragraphs with SPACE, not first-line indents — indents are the print
   convention and read like a scanned-book port on screen. Paged mode keeps the fine-press
   indent; Flow reads like an ebook. */
.app.rflow .row .la p,.app.rflow .row .en p,
.app.rflow .stkwrap .la p,.app.rflow .stkwrap .en p{text-indent:0;margin:0 0 .58em}
.app.rflow .row .la p:last-child,.app.rflow .row .en p:last-child{margin-bottom:0}
/* keyboard j/k landing flash + hover anchor on headings */
/* in-column Contents box */
.inctoc{max-width:68ch;margin:0 auto 2.2rem;padding:.9rem .2rem .4rem;border:0;border-top:1px solid var(--border);border-bottom:1px solid var(--rule-soft);border-radius:0;background:none}  /* the work's contents as an index leaf, not a boxed card (2026-09-05) */
.inctoc-h{display:flex;justify-content:space-between;align-items:baseline;font:500 .95rem/1 var(--font-display);font-variant-caps:all-small-caps;letter-spacing:.08em;color:var(--fg)}
.inctoc-t{font:italic .82rem/1 var(--font-body);color:var(--accent2);background:none;border:0;cursor:pointer;padding:.2em .4em}
.inctoc-d{font:600 .72rem/1 var(--sans);color:var(--muted,#8a7f70);background:none;border:0;cursor:pointer;padding:.2em .4em;margin-right:.3em}
.inctoc-d:hover{color:var(--accent)}
.inctoc-l{margin:.7rem 0 0;padding:0 0 0 1.1rem;columns:1;font-size:.92em;line-height:1.55}
.inctoc-l.clp{display:none}
.inctoc-l li{margin:.12em 0}.inctoc-l li.d2{margin-left:1em;font-size:.94em}
.inctoc-l a{display:block;box-sizing:border-box;min-height:36px;padding:.3rem .2rem;color:var(--fg);text-decoration:none}.inctoc-l a:hover{color:var(--accent);text-decoration:underline}
.inctoc-l .tcu{font-weight:600;font-variant-caps:all-small-caps;letter-spacing:.02em}
.inctoc-l .tcg{color:var(--muted);font-size:.93em}
.inctoc-l.selfnum{list-style:none;padding-left:.2rem}
.kbd-hit{animation:kbdhit 0.9s ease-out}
@keyframes kbdhit{0%{background:color-mix(in oklch,var(--accent-soft) 30%,transparent)}100%{background:transparent}}
.row.rhead .csub{position:relative}
.row.rhead,.reading h1,.reading h2,.reading h3{scroll-margin-top:70px}   /* hash landings + j/k stops clear the fixed masthead */
.row.rhead .csub .hanchor{position:absolute;left:-1.15em;top:.12em;font-size:.75em;color:var(--muted);opacity:0;text-decoration:none;transition:opacity .15s}
.row.rhead .csub:hover .hanchor{opacity:.85}
.row .la p+p,.row .en p+p{margin-top:.14rem}  /* the 1.5em first-line indent carries the paragraph break (fine-press: one signal, not two); a hairline of air keeps segmented run-ons from butting */
/* REHAUL §1.1 (2026-08-17): the unsplit-row fallback (asymmetric LA/EN block counts, DESIGN.md
   §1.1) concatenates every <p> in a lane with only the hairline-of-air rule above for a break cue
   — too quiet once several paragraphs stack with no heading between them. .pfallback rows get a
   slightly firmer pilcrow-weight rule: a short accent-soft tick in the outdent, not a full-width
   divider (this is a paragraph seam within one flowing section, not a section break). */
/* 2026-08-18 (owner, Aquinas: 'whats with the para notation'): the pilcrow wall on dense
   scholastic pages was noise — continuation paragraphs take the book convention instead:
   a first-line indent and breathing room, no glyph. */
#reading .row.pfallback .la p+p,#reading .row.pfallback .en p+p{margin-top:.55rem;text-indent:1.25em}
.row .la p:first-child,.row .en p:first-child{text-indent:0}
/* ---- Ramist brace-diagrams: a dividing concept, a scalable { , and the members it embraces (recursive) ---- */
.rdiagram{--rbrace:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 120' preserveAspectRatio='none'%3E%3Cpath d='M10 2 C6 2 7 4 7 30 C7 56 3 60 3 60 C7 60 7 64 7 90 C7 116 6 118 10 118' fill='none' stroke='%23000' stroke-width='2.2' stroke-linecap='round'/%3E%3C/svg%3E");margin:.6rem 0 .9rem;font-size:.93em;line-height:1.4}
/* vertical indented brace-outline: a dividing concept, then its members indented under a curly brace
   drawn in the gutter. BLOCK layout (not flex) → children always wrap to the column width, so the tree
   never overflows horizontally however deep it runs (Baxter's divisions go 5-6 levels). */
.rdiagram .rlabel{text-wrap:pretty;overflow-wrap:break-word;margin:.02em 0}
.rdiagram .rlabel.rparent{font-weight:600;color:var(--fg)}                       /* the dividing concept */
.rkids{position:relative;margin:.05em 0 .18em 0;padding-left:1.15em}
.rkids::before{content:"";position:absolute;left:.16em;top:.1em;bottom:.1em;width:.5em;background:var(--accent-soft);
  -webkit-mask:var(--rbrace) no-repeat center/100% 100%;mask:var(--rbrace) no-repeat center/100% 100%}
.rdiagram .rlabel sup.fnref{font-size:.72em}
@media(max-width:760px){.rdiagram{font-size:.88em}.rkids{padding-left:.95em}}
/* paired sub-rows: long la∥en blocks render as vertically-synced chunk pairs */
/* reading rows reuse the class name "seg" (canonical-pairing rows) — neutralize the masthead
   button-group .seg skin (border/card/radius/clip) or every paired row renders as a boxed card */
.row.seg{display:block;background:none;border:0;border-radius:0;overflow:visible}
.row.seg .sp{display:grid;grid-template-columns:var(--laf,.88fr) var(--enf,1.12fr);gap:0 2.1rem;margin:0 0 .55rem}
.row.seg .sp:last-child{margin-bottom:0}
/* hovering a sub-pair gently backlights BOTH lanes of the pair (Ugarit pattern) */
@media(hover:hover){.row.seg .sp:hover .la,.row.seg .sp:hover .en{background:color-mix(in oklch,var(--highlight) 45%,transparent);box-shadow:0 0 0 6px color-mix(in oklch,var(--highlight) 45%,transparent);border-radius:4px;transition:background .12s,box-shadow .12s}}  /* halo so the tint never sits flush against the letters — POINTER devices only: on touch, :hover sticks after a tap and wraps every touched paragraph in a "capsule" (mobile book-feel complaint, owner 2026-07-21) */
.app.only-en .row.seg .sp{display:block}
.app.only-la .row.seg .sp{grid-template-columns:1fr}
.app.only-en .row .en p{margin:0 0 .7rem;text-indent:0}.app.only-en .row .en{max-width:66ch;margin-inline:auto;font-size:calc(1.04em * var(--ensz,1));line-height:1.66}.app.only-en .row.rhead .csub{max-width:66ch;margin-inline:auto}.app.only-en .row.rapp .en{max-width:66ch;margin-inline:auto}
.app.only-en .row .en p:last-child{margin-bottom:0}  /* segmented paragraphs within a cell */
/* ---- column-citation stamp (Gerson/Mansi: works cited by printed column) — a quiet
   right-aligned marginal marker, never body text */
.row.rcolm{display:block;text-align:right;padding:.1em .2em 0 0}
.row.rcolm .colm{font-size:.72em;letter-spacing:.08em;opacity:.45;font-variant:small-caps}
/* ---- verse (poetry) — '| ' line blocks render as set lines: couplet indents kept,
   wrapped lines tuck under with a hanging indent, a quiet inset marks the poem body */
.row.rverse .verse{padding:.15em 0 .15em 1.1em}
.row.rverse .vl{display:block;line-height:1.5;padding-left:1.4em;text-indent:-1.4em}
.row.rverse .vl.ind{padding-left:2.8em}
.row.rverse .en .verse{font-style:normal}
/* ---- apparatus criticus — the scholarly notes banked at the folio foot, set as a fine printed
   critical edition would: a short hairline above each column's notes (the classic apparatus
   separator), hanging indents so wrapped lines tuck under the text, note-letters in the italic
   display face, old-style figures, a quieter size two steps under the body. la∥en paired by id. */
/* apparatus collapsed by default behind one quiet line — hover previews remain the primary access;
   expanding is one click and the choice persists (fr_appx). Jumping from a mark auto-expands. */
.apptog{grid-column:1/-1;justify-self:start;margin:1.5rem 0 .3rem;padding:.28rem .6rem .3rem;border:0;background:transparent;
  font:italic .74rem/1 var(--font-display);color:var(--muted);cursor:pointer;border-radius:7px;letter-spacing:.02em}
.apptog::before{content:"";display:inline-block;width:2.6rem;border-top:1px solid var(--accent-soft);vertical-align:.32em;margin-right:.55rem}
.apptog:hover{color:var(--accent2);background:var(--highlight)}
.apptog:not(.open)~.row.rapp{display:none}
sup.fnid{margin-right:.35em}
/* inline copies of a note's own text collapse during reading; hover/focus the anchor reveals.
   Content untouched — this is a render-time wrap (owner opted in 2026-07-12). */
.fpdrift{color:#b5892f;cursor:default;font-size:.85em}
.row,.fmark,.row.rhead .csub,.fn-sec,.reader-inline-target,[data-source-heading]{scroll-margin-top:calc(var(--phh,64px) + 14px)}
.about-x,.rvpanel-x,.rvprop-x,.relpanel-x{display:grid;place-items:center;position:relative;transition:transform .12s var(--ease),background .12s ease}
.about-x::after,.rvpanel-x::after,.rvprop-x::after,.relpanel-x::after{content:"";position:absolute;inset:50%;width:40px;height:40px;transform:translate(-50%,-50%)}
.about-x:active,.rvpanel-x:active,.rvprop-x:active,.relpanel-x:active{transform:scale(.96)}
.nav-node:active,.fol:active,.nl-w:active{transform:scale(.96)}
.rp-pin,.rp-pins{position:relative}
.rp-pin::after,.rp-pins::after{content:"";position:absolute;inset:50%;width:40px;height:40px;transform:translate(-50%,-50%)}
#rpPinN{font-variant-numeric:tabular-nums}
@keyframes khIn{from{opacity:0;transform:scale(.975)}to{opacity:1;transform:none}}
.citedup{display:none}
sup.fnref:hover+.citedup,sup.fnref:focus+.citedup,.citedup:hover{display:inline;background:var(--highlight);border-radius:4px;padding:0 .15em}
.fnsp{font-size:0}                                            /* copy-safe space, no visual width beyond the margin */
/* flow mode: an expanded apparatus bank is a deliberate block, not part of the running prose —
   rule it off top and bottom so page N's notes never read as page N+1's opening sentence */
/* Flow: a CLOSED note bank consumes no vertical space — the toggle ghosts into the left margin
   beside the pg chips, so page seams read as plain paragraph gaps (Leibniz UX 2026-07-18).
   Opening it returns the toggle to the flow above its rows. */
.app.rflow .folio{position:relative}
.app.rflow .apptog:not(.open){position:absolute;right:calc(100% + 1.1rem);bottom:0;margin:0;padding:.1rem .4rem;
  font-size:.58rem;opacity:.4;white-space:nowrap;max-width:12rem;overflow:hidden;text-overflow:ellipsis}
.app.rflow .apptog:not(.open)::before{display:none}
.app.rflow .apptog.open{margin:1rem 0 .2rem;font-size:.62rem;opacity:.55}
.app.rflow .apptog:hover{opacity:1}
@media(max-width:900px){.app.rflow .apptog:not(.open){position:static;margin:.2rem 0 0;max-width:none;opacity:.45}}
.app.rflow .row.rapp:last-child{padding-bottom:1.1rem;margin-bottom:2rem;border-bottom:1px solid var(--rule-soft)}
/* dense citation banks (Althusius-class: 150+ one-line legal cites) read better tighter */
.row.rapp{break-inside:avoid}
html.g-mobile .apptog{margin:.9rem 0 .2rem;font-size:.7rem}
.row.rapp{margin:0 0 .46rem;font-size:.78em;line-height:1.52;font-feature-settings:"onum" 1}
.row.rapp .en{color:color-mix(in oklab,var(--fg) 92%,var(--bg))}
.row.rapp .la,.row.rapp .en{font-size:1em;padding-left:1.25em;text-indent:-1.25em}   /* hanging indent under the note-letter */
.row.rapp .la{color:var(--muted)}
.row.rapp .en{color:var(--muted)}.row.rapp .en{color:color-mix(in oklab,var(--fg) 78%,var(--bg))}  /* english notes a half-step darker, like the body */
.row.rapp.fst{margin-top:1.8rem;padding-top:.65rem}
.row.rapp.fst>div:not(:empty)::before{content:"";display:block;width:6rem;border-top:1px solid var(--accent-soft);
  opacity:1;margin:0 0 .6rem;text-indent:0}                                          /* the short apparatus rule, one per column that carries notes */
.row.rapp sup.fnid{font-family:var(--font-display);font-style:italic;font-weight:600;color:var(--accent);
  margin-right:.38em;letter-spacing:.02em}
.row.rapp .fnlem{font-family:var(--font-display);font-style:italic;color:var(--accent2);letter-spacing:.015em}  /* named marginal note → lemma label, as the printed margin reads */
.row.rapp .fnsep{color:var(--accent-soft);margin:0 .45em}
/* REHAUL P4 (2026-08-17): apparatus BAND — unanchored notes render as one continuous unnumbered
   run rather than the numbered/sigla-keyed la∥en grid above (.appband opts out of .row's grid
   entirely — display:block — so this is full-width, not split la/.88fr en/1.12fr). Oxford-
   Classical-Text apparatus-criticus register: small, tight, unnumbered, entries in source order,
   separated by a plain middle-dot rather than a footnote numeral that has nothing to point to. */
.row.rapp.appband{display:block}
/* APPARATUS REGISTER, NOT BODY (owner 2026-08-24, Luther WA schriften-3 §20: a note read as
   a body paragraph mid-sentence — "they did these things literally, § NOTES What then is day
   and night? ..."). The TEI was right: body block and <note> elements are correctly separate.
   The band simply set them at .94em, a whisker off body size, so the eye read them as text.
   The anchored apparatus path has always used .78em; the band now matches it and takes a hair
   rule above, so a folio's notes read as apparatus at a glance. */
.apbfull{columns:2 22em;column-gap:2.2rem;font-size:.78em;line-height:1.5;color:var(--muted);text-indent:0;border-top:1px solid var(--rule-soft);padding-top:.5rem;margin-top:.2rem}
.apbe{display:inline}
.apbe:not(:last-child)::after{content:" \00B7 ";color:var(--accent-soft)}
@media(max-width:880px){.apbfull{columns:1}}
/* REHAUL P5 (2026-08-17): true back-of-book index typography (DESIGN.md §2.3) — Chicago Manual
   of Style back-of-book index setting: run-in headword/numeral, hanging indent, tight leading,
   denser than reading prose. Two columns wide, one column under the file's existing 880px
   breakpoint (no new breakpoint value). Ships correctly DORMANT against today's corpus — the
   gating heuristic (looksLikeTailIndex(), ~loadTEI) verified zero false-fires across a live
   36-work sample — but ready the moment a work actually carries a genuine tail-of-volume finding
   aid, or the corpus ships meta.json.index_pages. */
.pilpar{display:block;margin-top:.55em}.vlem{font-variant-caps:normal;margin:.9em 0 .35em;text-align:left!important;text-indent:0!important}.vlem::first-line{letter-spacing:.01em}#reading .row .la p.vlem,#reading .row .en p.vlem{font-weight:600;font-size:.98em;hyphens:manual}.pil{color:var(--accent2,#a86);opacity:.7;font-size:.9em}.ixdense .ixtruel{columns:1}.ixdense p,.ixdense .ixtruel p{display:inline;margin:0 .9em 0 0;padding:0;text-indent:0}.ixdense p::after{content:"·";color:var(--accent2,#a86);margin-left:.5em}.ixdense p:last-child::after{content:""}.ixtruel{columns:2 20em;column-gap:2rem;font-size:.92em;line-height:1.34;margin-top:.2rem}
@media(max-width:880px){.ixtruel{columns:1}}
.ixtruel p{break-inside:avoid;margin:0 0 .32rem;padding-left:1.1em;text-indent:-1.1em;text-wrap:pretty}
.ixhw{font-variant:small-caps;font-weight:600;color:color-mix(in oklch,var(--accent-soft,var(--accent)) 72%,var(--fg) 28%)}
.ixtruel .pgo{color:var(--accent2);text-decoration:none;white-space:nowrap}
.ixtruel .pgo:hover{text-decoration:underline}
/* the one genuinely new interaction affordance in §2 — pinned while scrolling a long letter's
   entries. Effectively unused against today's corpus (no confirmed-alphabetic index in the
   sample) but the rule is harmless dormant CSS: no ixletter node is ever emitted unless
   ixOrdering() actually returns "alphabetic". */
.ixletter{position:sticky;top:var(--phh,64px);z-index:1;margin:.5rem 0 .15rem;padding:.1rem .3rem;
  font:italic 600 .78rem/1 var(--font-display);color:var(--accent2);background:var(--bg)}
#app button,.fn-ret,.fmark,.fnpre,.fnmore,.rp-refresh,.selchip{user-select:none;-webkit-user-select:none}
sup.fnref.deg{font-style:normal;font-weight:700;padding:0 .1em}                                                  /* in-text mark for a named note: a quiet ° (name on hover) */
sup.fnref.fvar{opacity:.42}sup.fnref.fvar:hover{opacity:1}                                                       /* variant marks recede — reading first, collation on demand */
.appdiv{grid-column:1/-1;margin:1.1rem 0 .5rem;font-size:.68rem;letter-spacing:.06em;text-transform:uppercase;
  color:var(--accent2);font-family:var(--font-display)}
.appdiv span{text-transform:none;letter-spacing:0;color:var(--muted);font-size:.92em}
.appdiv span em{font-style:italic}
.apptog:not(.open)~.appdiv{display:none}                                                                          /* divider folds away with the bank */
.row.rapp.var .la,.row.rapp.var .en{opacity:.62;font-size:.8em;line-height:1.5}
.row.rapp.var.conly{display:block}.row.rapp.var.conly .la{width:100%}.row.rapp.var.conly .en{display:none}
.row.rapp.var{padding:.05rem 0;border:0}   /* collation lines read as a bank, not as paragraphs */
.row.rapp.var:hover .la,.row.rapp.var:hover .en{opacity:1}
.row.rapp:last-child{margin-bottom:0}
sup.fnref{font-family:var(--font-display);font-style:italic;font-weight:400;font-size:.62em;opacity:.8;color:var(--accent);cursor:pointer;
  padding:0 .12em;letter-spacing:.02em;transition:color .15s;position:relative}
sup.fnref::after{content:"";position:absolute;inset:-7px -5px}                                                    /* generous hit target for a tiny superscript */
sup.fnref:hover{color:var(--accent2);text-decoration:underline;text-underline-offset:2px}
.row.rapp.flash{background:var(--highlight);border-radius:6px;box-shadow:0 0 0 6px var(--highlight);transition:background .35s,box-shadow .35s}
/* citation-door landing (owner 2026-08-19 'this is not highlighted'): ANY #b row flashes */
.row.flash{background:var(--highlight);border-radius:6px;box-shadow:0 0 0 6px var(--highlight);transition:background .35s,box-shadow .35s}
/* long notes clamp to ~9 apparatus lines with a paper fade — the full text is one deliberate click
   away, so a 3,000-char Buddeus editor's note no longer buries the next folio. Jumping to a note
   from its mark auto-expands it. */
.row.rapp .la,.row.rapp .en{position:relative}
.row.rapp.cl .la,.row.rapp.cl .en{max-height:13.7em;overflow:hidden}
.row.rapp.cl .la::after,.row.rapp.cl .en::after{content:"";position:absolute;inset:auto 0 0 0;height:3.2em;background:linear-gradient(transparent,var(--bg))}
.fnmore{grid-column:1/-1;justify-self:start;margin:.15rem 0 0;padding:.3rem .55rem .32rem;border:0;background:transparent;
  color:var(--accent);font:italic 600 .92em/1 var(--font-display);cursor:pointer;border-radius:6px;letter-spacing:.01em;
  transition:background .15s,color .15s,transform .15s}
.fnmore span{color:var(--muted);font-style:normal;font-weight:400;font-variant-numeric:tabular-nums}
.fnmore:hover{color:var(--accent2);background:color-mix(in oklab,var(--accent) 7%,transparent)}
.fnmore:active{transform:scale(.96)}
.row.rapp:not(.cl) .fnmore{display:none}
/* footnote hover preview — the note surfaces in a card beside its mark, so a citation never costs
   the reader their place in the sentence. Hover devices only; click still jumps to the bank. */
.fnpre{position:fixed;z-index:95;max-width:min(30rem,86vw);max-height:17em;overflow:hidden;background:var(--card-bg);
  border:1px solid var(--border);border-radius:10px;padding:.7rem .85rem .8rem;
  box-shadow:0 18px 50px -18px rgba(42,28,14,.45),0 1px 3px rgba(60,40,15,.18);
  font-size:.84rem;line-height:1.55;color:var(--fg);opacity:0;transform:scale(.97);pointer-events:none;
  transition:opacity .14s cubic-bezier(.2,0,0,1),transform .14s cubic-bezier(.2,0,0,1)}
.fnpre.on{opacity:1;transform:none}
.fnpre.ovf::after{content:"";position:absolute;inset:auto 0 0 0;height:2.4em;background:linear-gradient(transparent,var(--card-bg))}
.fnpre sup.fnid{font-family:var(--font-display);font-style:italic;font-weight:600;color:var(--accent);margin-right:.38em}
.fnpre .fnlem{font-family:var(--font-display);font-style:italic;color:var(--accent2)}
.fnpre .fnsep{color:var(--accent-soft);margin:0 .45em}
.fnpre .fn-ret{display:none}
/* single-language modes: cap the measure for comfortable reading (mereorthodoxy-style calm) */
/* single-language measure is font-RELATIVE (em on #reading, whose font-size is the reading slider), so
   bumping the text size WIDENS the column to use more of the page — not just bigger text in a fixed width */
.app.only-la #reading,.app.only-en #reading{max-width:min(40em,88%);margin-inline:auto}  /* 88% cap guarantees real side margins even when a large text size grows the em-based measure to the viewport */
.app.only-en .main{line-height:var(--reading-lh)}  /* unify on the 1.62 token; 1.72 on a 23px default read large-print, not fine-press */
.row.rhead{display:block}.row.rhead .csub{font:400 1.1em/1.35 var(--font-display);color:var(--head);margin:1.35rem 0 .5rem;text-wrap:balance}  /* em, not rem — headings must scale with the reading size or they render SMALLER than 23px body */
/* SIDE-BY-SIDE HEAD PAIRS (owner 2026-09-04 'headings side by side instead of stacked'):
   a heading present in BOTH languages rides the same two-column grid as the body rows —
   each lane's head over its own column, baselines level. One-sided heads (echo-guarded,
   untranslated) keep the full-width banner; dense index folios (.ixh) stay compact. */
.row.rhead.hpair{display:grid;align-items:baseline}
.row.rhead.hpair .csub .hla{order:0;display:block;font:400 1em/1.3 var(--font-display);color:var(--head);text-transform:none;letter-spacing:0;font-variant:normal;font-style:normal}
.row.rhead.hpair.ixh{display:block}
/* ── printed-index folios: a page that is itself a printed Tabula/Index arrives as a stack of
   ###-promoted headings and clogs reading. Detected render-side (renderFolio) → the whole folio
   demotes to a compact list under a small label, so the book's own index reads as an index. */
.folio.ixfolio .row.rhead .csub{font:italic .86rem/1.55 var(--font-body);color:var(--muted);margin:.06rem 0;text-wrap:auto}
.folio.ixfolio .row.rhead{margin:0}
.folio.ixfolio .row{margin:.1rem 0}
.folio.ixfolio .row .la,.folio.ixfolio .row .en{font-size:.88em;color:var(--muted)}
.ixchip{display:inline-block;font:600 .64rem/1 var(--sans);letter-spacing:.09em;text-transform:uppercase;color:var(--muted);border:1px solid var(--rule-soft);border-radius:999px;padding:.28rem .7rem;margin:.5rem 0 .45rem}
/* Wadding–Vivès editorial apparatus (Scotus Opera): the scholia/commentary layer is quietly set off —
   a hairline rule + slightly smaller muted type — and its heading carries the attribution chip, so the
   editors' voice never reads (or copies) as Scotus's own. */
.row.rhead.hedit .csub{color:var(--muted);font-size:1.08em;margin-bottom:.3rem}
.edchip{display:inline-block;font:600 .58rem/1 var(--sans);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);border:1px solid var(--border);border-radius:4px;padding:.22rem .45rem;margin:0 0 .5rem}
.row.redit{border-left:2px solid var(--rule-soft);padding-left:.7rem}
.row.redit .la,.row.redit .en{font-size:.93em;color:color-mix(in oklch,var(--fg) 84%,transparent)}
.csub{display:flex;flex-direction:column;gap:.12em}
.csub .hen{order:1}
.csub .hla{order:2;display:block;font:400 .56em/1.4 var(--font-body);color:var(--muted);text-transform:uppercase;letter-spacing:.09em;text-wrap:pretty}  /* honest letterspaced caps — Source Serif ships no smcp, so small-caps synthesized to faded shrunken capitals */
.app.only-la .csub .hen{display:none}
.app.only-la .csub .hla{order:1;display:block;font:inherit;color:inherit;text-transform:none;font-variant:normal;font-style:normal}.csub .hen{display:inline}                       /* English heading primary */
.app.only-la .csub .hla{display:inline}.app.only-la .csub .hen{display:none}  /* Latin-only mode → Latin heading */
/* table-of-contents view: run-on Roman-numeral indexes rendered as an aligned bilingual TOC */
.row.rtoc{display:block;margin:.5rem 0 1.2rem}
.toc{display:grid;gap:.06rem}
.toc .te{display:grid;grid-template-columns:1fr 1fr;gap:0 2.1rem}
.toc .te.major,.toc .te.cap{margin-top:.7rem}
.toc .tc{display:flex;align-items:baseline;gap:.45rem;padding:.12rem 0;min-width:0}
.toc .tn{flex:0 0 auto;min-width:2.1em;text-align:right;font:600 .82rem/1.55 var(--sans);color:var(--muted);font-variant-numeric:tabular-nums}
.toc .tt{flex:0 1 auto;color:var(--fg)}
.toc .en .tt{color:var(--english);font-style:italic}
.toc .dots{flex:1 1 1.5rem;align-self:flex-end;margin:0 .15rem .34em;border-bottom:1px dotted var(--accent-soft);min-width:1rem}
.toc .tp{flex:0 0 auto;font:.8rem/1.55 var(--sans);color:var(--muted);font-variant-numeric:tabular-nums}
.toc .te.major .tn,.toc .te.major .tt{font-family:var(--font-display);color:var(--head);font-size:1.08em}
.toc .te.cap .tn,.toc .te.cap .tt{color:var(--head);font-weight:600}
.toc .te.sub .tc{padding-top:.3rem}.toc .te.sub .tt{font-style:italic;color:var(--muted);font-size:.94em}
.app.only-la .toc .te,.app.only-en .toc .te{grid-template-columns:1fr}
.app.only-la .toc .en,.app.only-en .toc .la{display:none}
.app.only-en .toc .en .tt{font-style:normal;color:var(--fg)}
.first .en p:first-child{text-indent:0}
.first.cap .en p:first-child::first-letter{font-family:var(--font-display);color:var(--accent);float:left;font-size:3.3em;line-height:.82;padding:.04em .09em 0 0}  /* drop cap on the primary English */
/* BORN-DIGITAL: no drop caps (owner 2026-08-10). A facsimile leaf opening earns an initial,
   but born-digital "pages" are text chunks — often one paragraph each — so .first fires on
   every row and every paragraph opened with a giant letter (Albertus De Animalibus). */
.app.no-facs .first.cap .en p:first-child::first-letter{font-family:inherit;color:inherit;float:none;font-size:inherit;line-height:inherit;padding:0}
.app.only-la .en{display:none}.app.only-la .row{grid-template-columns:1fr}
.app.only-la .row.soloen .en{display:block}.app.only-en .row.solola .la{display:block;order:0}
/* English-primary "Read": single column; Latin hidden, revealed per paragraph on demand (muted) */
.app.only-en .row{display:flex;flex-direction:column;gap:0;grid-template-columns:1fr}
.app.only-en .en{order:0;font-style:normal;color:var(--fg)}
.app.only-en .row .la{display:none;order:2}
.app.only-en .row.la-on .la{display:block;color:var(--muted);font-size:.9em;margin:.4rem 0 .15rem}

/* ── GAPPY-PAGE RESCUE (owner 2026-08-08: "the flow is useless … make a final fix for the
   reader, from the perspective of a reader"). When a page's two lanes carry very unequal
   block sizes, the shared grid rows stretch to the taller cell and the page fills with dead
   space. Such sections switch to INDEPENDENT COLUMN FLOW: each lane stacks naturally, so both
   read smoothly; side-by-side correspondence is preserved approximately, anchors keep working
   (the row id moves onto the English cell, which is what deep links point at). ── */
/* the stacked lanes keep the ROW split (owner 2026-09-22, pg-1924 page 27): at 1fr 1fr the Latin flow ran under the lane divider
   (the .rz drag rule sits in the gutter of the .88/1.12 row split) and the rule crossed every Latin line */
.stkwrap{display:grid;grid-template-columns:var(--laf,.88fr) var(--enf,1.12fr);gap:0 2.1rem;align-items:start}
.stkwrap>.stk{min-width:0}
.stkwrap>.stk>.la,.stkwrap>.stk>.en{margin:0 0 .7rem;max-width:none}
/* lane-size sliders must reach cells lifted OUT of rows (stacked runs + phone zip) —
   .row-scoped selectors silently skipped them, so "English size" did nothing there */
.stk>.en,.zipcol>.en{font-size:calc(1em * var(--ensz,1))}
.stk>.la,.zipcol>.la{font-size:calc(1em * var(--lasz,1))}
/* READING EDITION (owner 2026-08-10 "upgrade the reader… designed page by page"): body runs
   continue ACROSS page boundaries in Flow; the page break becomes an inline CCEL-style mark
   in each column, and the scroll-spy tracks these anchors so scan-sync and ?p= stay exact. */
.pganchor{display:inline-block;font:italic .66rem/1.1 var(--font-display);color:var(--muted);border:1px solid var(--rule-soft);border-radius:999px;padding:.05rem .5rem;margin:0 .4rem .12rem 0;vertical-align:baseline;opacity:.72;cursor:default;font-variant-numeric:tabular-nums}
.app:not(.rflow) .pganchor{opacity:.9}
/* SEAMLESS READING (owner 2026-08-10 "page numbers … to the side"): on real screens the
   page mark leaves the text stream entirely — it floats in the margin at its line's height
   (absolute + auto top = static Y). Phones keep the tiny inline pill (no margin to use). */
@media (min-width:881px){
  /* teiflow works (Richer class) carried the INLINE pill here — same margin treatment as
     rflow (owner 2026-09-06 "fix this on the margins": 'p. 226' floated in the gutter) */
  .app.rflow .stk,.app.rflow .zipcol,.app.rflow .row .la,.app.rflow .row .en,
  .app.teiflow .row .la,.app.teiflow .row .en{position:relative}
  .app.rflow .pganchor,.app.teiflow .pganchor{position:absolute;right:calc(100% + .6rem);border:none;background:none;
    padding:0;margin:0;font-size:.64rem;opacity:.55;white-space:nowrap;border-radius:0}
  .app.rflow .pganchor:hover,.app.teiflow .pganchor:hover{opacity:1;color:var(--accent)}
  /* PARALLEL SPREAD: the EN lane's seam anchor mirrors into the RIGHT margin — left-of-lane
     put it in the inter-column gutter, colliding with the Latin column's line ends. */
  .app.rflow:not(.only-en):not(.only-la) .row .en .pganchor,
  .app.teiflow:not(.only-en):not(.only-la) .row .en .pganchor,
  .app.rflow:not(.only-en):not(.only-la) .stkwrap>:last-child .pganchor{right:auto;left:calc(100% + .6rem)}
}
.fmark.rolled{display:none!important}   /* page merged into the previous run: its chip would stack on the next page's (owner 2026-09-04) */
/* print furniture that survived into the text (signature marks, lone catch-syllables):
   hidden in Flow, dimmed-visible in page/study views so nothing is silently lost */
.app.rflow .row.furn{display:none}
.folio.rolled{content-visibility:visible!important;contain-intrinsic-size:none!important;min-height:0}
.rhecho{display:none}   /* running-head + title echoed at the top of the body paragraph */
.row.rhead.rhecho{display:none!important}   /* a head row that only echoes the previous head (owner 2026-09-04) */
/* printed index / contents lists: a column of entries, set ragged-right and tight -- never
   justified prose (Twisse Index Rerum, 2026-08-29: justified narrow lanes tore entries apart) */
.ixl p,.ixtruel p{text-align:left!important;hyphens:manual!important;text-indent:0!important;margin:.05rem 0 .28rem!important;line-height:1.42;font-size:.94em}
.ixl p.ix1{margin-top:.6rem!important;font-variant:small-caps}
/* Akademie headnote (<note type="headnote">): ALWAYS an in-flow small block, in every lane mode --
   pure CSS, so it does not depend on the post-pass having run on a lazily rendered folio */
.row .mnote.headnote,.row>.la>.mnp>.mnote.headnote,.row>.en>.mnp>.mnote.headnote,.row>.la.hasmn>.mnp>.mnote.headnote,.row>.en.hasmn>.mnp>.mnote.headnote,.row p>span.mnote.headnote{float:none!important;clear:both;display:block;position:static!important;width:auto!important;max-width:none!important;margin:.2rem 0 .7rem!important;padding:.15rem 0 .15rem .8rem!important;border-left:2px solid var(--rule-soft,#ddd);font-size:.82em!important;font-style:normal!important;line-height:1.5;color:var(--muted);text-align:left;text-indent:0}
/* inline editorial headnote (Akademie): a small block under the title, not a floated margin column */
.row p>span.mnote.edinl{float:none!important;clear:both;display:block;width:auto!important;max-width:none!important;margin:.2rem 0 .7rem!important;padding:.15rem 0 .15rem .8rem;border-left:2px solid var(--rule-soft,#ddd);font-size:.82em;font-style:normal;line-height:1.5;color:var(--muted);text-align:left;text-indent:0}
/* consecutive variant marks (and°°° Heinrich) read as one cluster, not three floating rings */
sup.fnref.fvar+sup.fnref.fvar{margin-left:-.18em}
sup.fnref.fvar{opacity:.55}sup.fnref.fvar:hover{opacity:1}
/* editorial headnote: a long 'margin' note is the edition's apparatus block, set in the flow */
.row .mnp.edblock>.mnote,.row>.la.hasmn>.mnp.edblock>.mnote,.row>.en.hasmn>.mnp.edblock>.mnote{float:none!important;clear:both;display:block;width:auto!important;max-width:none!important;margin:.3rem 0 .45rem!important;padding:.1rem 0 .1rem .75rem;border-left:2px solid var(--rule-soft,#ddd);font-size:.84em;font-style:normal;line-height:1.5;color:var(--muted);text-align:left}
/* dense register: a table set as paragraphs (sigla, abbreviations) reads as a table */
.folio.dense .row{margin:0 0 .12rem}
.folio.dense .row .la p,.folio.dense .row .en p{margin:0;text-indent:0;line-height:1.38}
.folio.dense .row .la,.folio.dense .row .en{font-size:.92em}
/* run-in demotion: mid-flow labels lose display-heading dress — small, inline-toned, no gap */
.row.rhead.runin{margin:.2rem 0}
.row.rhead.runin .csub{margin:0}
.row.rhead.runin .csub .hen,.row.rhead.runin .csub .hla{font-size:1em;font-family:var(--font-body);font-style:italic;font-weight:600;letter-spacing:0;color:var(--fg)}
.row.rhead.runin .csub .hla{display:none}
.app.rflow .row.rhead.runin{margin-top:.2rem}
/* bare enumerators ('XVIII.') are the print's SECTION NUMBER, not a chapter title. These rules sit
   after .runin and carry .runin.numlab so they win on specificity, not on source order alone --
   and .hla stays VISIBLE: hiding it would silently drop the numeral from the Latin-only view. */
.row.rhead.runin.numlab{margin:.8rem 0 0;border:0}
.row.rhead.runin.numlab .csub .hen,.row.rhead.runin.numlab .csub .hla{font-size:.8em;font-style:normal;font-weight:700;letter-spacing:.07em;color:var(--muted);font-variant-numeric:tabular-nums}
.row.rhead.runin.numlab .csub .hla{display:block}
/* cross-reference links: quiet dotted underline, accent on touch/hover */
a.xref{color:inherit;text-decoration:underline dotted;text-decoration-color:var(--accent-soft);text-underline-offset:2px}
a.xref:hover,a.xref:active{color:var(--accent);text-decoration-color:var(--accent)}
/* phone footnote bottom-sheet: tap a superscript, read the note in place — no scroll-away */
.fnsheet-scrim{position:fixed;inset:0;z-index:118;background:rgba(20,14,8,.35);opacity:0;pointer-events:none;transition:opacity .2s}
.fnsheet-scrim.on{opacity:1;pointer-events:auto}
.fnsheet{position:fixed;left:0;right:0;bottom:0;z-index:119;background:var(--card-bg);border-top:1px solid var(--border);border-radius:18px 18px 0 0;box-shadow:0 -20px 60px -20px rgba(20,12,4,.5);padding:.6rem 1.15rem calc(1.1rem + env(safe-area-inset-bottom));max-height:56vh;overflow:auto;transform:translateY(105%);transition:transform .24s var(--ease)}
.fnsheet.on{transform:none}
.fnsheet .fns-grab{width:38px;height:4px;border-radius:2px;background:var(--border);margin:.15rem auto .6rem}
.fnsheet .fns-id{font:600 .72rem/1 var(--sans);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-bottom:.45rem}
.fnsheet .fns-en{font-size:.98rem;line-height:1.55;margin-bottom:.5rem}
.fnsheet .fns-la{font-size:.9rem;line-height:1.5;color:var(--muted);font-style:italic;border-left:2px solid var(--rule-soft);padding-left:.7rem;margin-bottom:.5rem}
.fnsheet .fns-go{font:.8rem/1 var(--sans);color:var(--accent);background:none;border:none;padding:.4rem 0;cursor:pointer}
/* PRINT (owner 2026-08-10 polish loop): a chapter prints like a book page — no chrome, one
   column, black ink, notes expanded, no orphaned headings */
@media print{
  .ph,.facs,.rz,.prog,.thumbbar,.frthumb,.sidebar,.coach,.aapop,.fnsheet,.fnsheet-scrim,.notebook,.nb-scrim,
  .relpanel,.pb,.apptog,.inctoc-t,.hanchor,.light,.fmark .fr,.fmark .fm{display:none!important}
  body,.app{background:#fff!important;color:#000!important}
  #reading{padding:0!important;max-width:100%!important}
  .row,.stkwrap{break-inside:auto}
  .row.rhead{break-after:avoid}
  .rapp{display:block!important;opacity:1!important}
  .fmark .ff{border:none;color:#666;font-size:.7rem}
  a.xref{text-decoration:none;color:#000}
  /* REHAUL P8 (2026-08-17, optional/last per DESIGN.md's own priority): print coverage for the
     apparatus-band (P4) and true-index (P5) additions — this block already owns .rapp/.apptog
     reset, so it's the natural home for these rather than opening a third print block. */
  .appband{break-inside:avoid}
  .ixtrue{break-inside:avoid-page}
  .ixletter{position:static!important}
  .ixtruel{columns:1!important}
  .pgo{color:#000!important;text-decoration:none!important}
}
/* phone parallel: zipped runs alternate la∥en per paragraph in a single column */
.stkwrap.zipped{display:block}
.stkwrap.zipped>.stk{display:none}
.zipcol>.la{margin:0 0 .3rem}
.zipcol>.en{margin:0 0 1.05rem}
.zipcol>.pganchor{display:inline-block;margin:.2rem .4rem .4rem 0}
.app:not(.rflow) .row.furn{opacity:.4}
.app:not(.rflow) .row.furn::after{content:"print furniture";font:.6rem/1 var(--sans);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-left:.6rem}
.stkwrap>.stk>*:last-child{margin-bottom:0}
.sec-stacked{margin-bottom:1.15rem}
/* Flow mode lifts blocks out of .row into .stkwrap>.stk-la>.la, so EVERY '.row .la' rule
   silently stops applying — the Latin lane lost its accent rule and kept a duplicate .93em
   size step here even after the row-mode step was removed (owner 2026-08-09: the left line
   shows on one block and not the next, "this is everywhere in the corpus"). Match row mode
   exactly: same size as English, same accent rule, same indent. */
.stkwrap>.stk-la>.la{font-size:calc(1em * var(--lasz,1));color:var(--muted)}
.app:not(.only-en):not(.only-la) .stkwrap>.stk-la>.la{color:color-mix(in oklch,var(--fg) 72%,var(--bg));border-left:2px solid color-mix(in oklch,var(--accent-soft) 55%,transparent);padding-left:1.05rem}
.app.only-en .stkwrap{grid-template-columns:1fr}
.app.only-en .stkwrap>.stk-la{display:none}
.app.only-la .stkwrap{grid-template-columns:1fr}
.app.only-la .stkwrap>.stk-en{display:none}
@media(max-width:880px){.stkwrap{grid-template-columns:1fr}.stkwrap>.stk-la>.la{margin-bottom:.5rem}}
/* Ramist schema outlines — the printed bracket-diagrams as hanging indents */
.rml{display:block;margin-left:calc(var(--lv,0)*1.15rem);padding-left:.85rem;text-indent:-.85rem;margin-top:.16em;line-height:1.55}
.rml.rml0{margin-left:0;padding-left:0;text-indent:0;margin-top:.4em}
.rml .rmn{color:var(--accent2,var(--accent));font-weight:600;font-family:var(--sans);font-size:.86em}
.la-rev{display:none}
/* CITATION LANDING (owner 2026-09-01 "link to the actual page first immediately"): with a
   #b/?p deep link the reading surface stays veiled until the target row is positioned, so
   the first painted frame IS the cited page — never page one then a jump. */
.app.prelanding #reading{opacity:0}
#reading{transition:opacity .12s ease-out}
/* Latin reveal, SUBTLE (owner 2026-07-21): invisible until the paragraph is hovered on pointer
   devices — a book page, not a control strip. Touch (no hover): a faint glyph stays as the
   affordance, far quieter than the old per-paragraph LATIN chip. Open rows keep their label. */
.app.only-en .row[id]{position:relative}
.app.only-en .row[id] .la-rev{position:absolute;left:-3.4rem;top:.3rem;display:inline-block;font:600 .6rem/1 var(--sans);letter-spacing:.09em;text-transform:uppercase;color:var(--muted);background:none;border:0;cursor:pointer;padding:.15rem .2rem;opacity:0;transition:opacity .15s,color .15s}  /* in the MARGIN — zero vertical footprint; the old in-flow reveal reserved a 15px line inside every paragraph and the page filled with slack (2026-09-05) */
@media(hover:none){.app.only-en .row[id] .la-rev{opacity:.22}}
.app.only-en .row:hover .la-rev{opacity:.85}
.app.only-en .row.la-on .la-rev{opacity:1}
.app.only-en .row .la-rev:hover{color:var(--accent2);opacity:1}
/* English-only works (e.g. Baxter's Methodus — the Ramist diagrams live in the facsimile, there is no
   Latin parallel): the Latin lane is intentionally empty. Collapse it in EVERY mode (incl. Study, where
   the scan still shows the diagrams), render English full-width, drop the Latin reveal + lane controls. */
.app.en-only .row .la,.app.en-only .row.seg .sp .la,.app.en-only .row .la-rev{display:none!important}
.app.en-only .row,.app.en-only .row.seg .sp{display:block;grid-template-columns:1fr}
.app.en-only .row .en{color:var(--fg);font-style:normal;max-width:74ch}
.app.en-only .row .en p{text-indent:0;margin:0 0 .7rem}.app.en-only .row .en p:last-child{margin-bottom:0}
.app.en-only .toc .te{grid-template-columns:1fr}.app.en-only .toc .la{display:none}
.app.en-only .toc .en .tt{font-style:normal;color:var(--fg)}
.app.en-only .sld.lnz{display:none}   /* lane balance is meaningless with one lane */
.app.en-only #colgrip{display:none}   /* the Latin/English column splitter has no meaning with one lane — it was drawing a phantom divider through the English text in Study */
.app.en-only #reading{max-width:min(42em,88%);margin-inline:auto}
/* sec-stacked confessions (owner 2026-08-18 'its just english'): the stacked la column is
   EMPTY on English-only works — one centered column, no phantom left lane */
.app.en-only .stkwrap{grid-template-columns:1fr;gap:0}
.app.en-only .stkwrap>.stk-la{display:none}
.app.en-only .stkwrap>.stk>.en{max-width:74ch}
.app.en-only .row.rhead .hla{display:none}
/* dark theme: highlight/note/input backgrounds were hardcoded light → unreadable with light text; re-tone */
[data-theme="dark"] .row[data-hl="amber"]{background:#4D3B1C}[data-theme="dark"] .row[data-hl="sage"]{background:#2C3A2A}[data-theme="dark"] .row[data-hl="slate"]{background:#27323F}
[data-theme="dark"] .rowx.note{background:#322A20}[data-theme="dark"] .rowx textarea,[data-theme="dark"] .rv-edit textarea{background:#241F1A}
[data-theme="dark"] .nav-node:hover,[data-theme="dark"] .fol:hover{background:#332A20}
.facs{position:relative;width:var(--fw,clamp(360px,33vw,640px));border-left:0;box-shadow:-10px 0 28px -20px rgba(80,50,20,.45);background:var(--facs-mat);display:flex;flex-direction:column;transition:margin-right .35s var(--ease)}  /* soft shadow edge instead of a hard border (make-interfaces-feel-better #3); mat follows the theme */
.app.no-facs .facs{margin-right:calc(-1*var(--fw,clamp(360px,33vw,640px)))}
.app.nopdf .facs,.app.nopdf .rz,.app.nopdf #tf,.app.nopdf .izc,.app.no-facs .izc{display:none}
.sld{display:inline-flex;align-items:center;gap:6px;font:600 12px/1 var(--sans);color:var(--muted);border:1px solid var(--border);border-radius:7px;background:var(--card-bg);padding:0 10px;height:34px}
.sld input[type=range]{width:84px;accent-color:var(--accent);cursor:pointer}
.sld .t1{font-size:11px}.sld .t2{font-size:16px}
/* ── "Aa" reading-settings popover: theme/size/lanes/zoom live here now — the masthead breathes ── */
.aaw{position:relative;display:inline-block}
.aapop{position:absolute;top:calc(100% + 8px);right:0;z-index:70;background:var(--card-bg);border:1px solid var(--border);border-radius:12px;box-shadow:0 18px 50px -18px rgba(42,28,14,.45);padding:.7rem .8rem;display:none;min-width:230px}
.aapop{transition:opacity .14s var(--ease),transform .14s var(--ease)}
.aapop.on{display:block;transform-origin:top right;animation:aapop-in .16s cubic-bezier(.2,0,0,1)}
@keyframes aapop-in{from{opacity:0;transform:scale(.97) translateY(-2px)}}
.aarow{display:flex;align-items:center;gap:.6rem;padding:.28rem 0}
.aaseg{display:flex;gap:.3rem}
.aaseg .tgl{font-size:.78rem;padding:.24rem .55rem;min-height:30px}
.aaseg .tgl[aria-pressed="true"]{background:var(--accent);color:#fff;border-color:var(--accent)}
#fEasy{font-family:'Atkinson Hyperlegible',sans-serif}#fSans{font-family:var(--sans)}
.aarow .aal{flex:0 0 3.4rem;font:600 .68rem/1 var(--sans);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
.aapop .sld,.aapop .tgl{background:var(--bg);border-color:var(--border);color:var(--fg)}
.aapop .sld{height:30px}
/* inside the popover the app's hide-rules for single-lane modes still apply (rows collapse cleanly) */
.app.only-en .aarow:has(.lnz){display:none}
.app.en-only .aarow:has(.lnz){display:none}
.app.nopdf .aarow:has(.izc),.app.no-facs .aarow:has(.izc){display:none}
/* masthead logo/home + steppable text-size A buttons + page-jump (2026-06 UX pass) */
.ph .mh-home{font-family:var(--font-display);font-size:1rem;line-height:1;color:color-mix(in oklch,var(--masthead-ink) 80%,transparent);text-decoration:none;white-space:nowrap;align-self:center;margin-right:.15rem}
.ph .mh-home:hover{color:var(--masthead-ink)}
.sld.szc button.t1,.sld.szc button.t2{border:0;background:none;color:inherit;cursor:pointer;padding:0 3px;line-height:1;font-family:inherit}
.sld.szc button.t1:hover,.sld.szc button.t2:hover{color:var(--accent)}
.seg.pgjump{align-items:center;padding:0 .5rem;gap:.3rem}
.seg.pgjump input{font:.8rem/1 var(--sans);width:3rem;padding:.35rem .25rem;border:0;background:transparent;color:var(--masthead-ink);outline:none;text-align:right;-moz-appearance:textfield}
.seg.pgjump input::-webkit-inner-spin-button,.seg.pgjump input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
.seg.pgjump .pg-total{font:.75rem/1 var(--sans);color:color-mix(in oklch,var(--masthead-ink) 70%,transparent);white-space:nowrap;padding-right:.1rem}
.fh .fh-ct{font:.68rem/1 var(--sans);color:var(--muted);font-variant-numeric:tabular-nums;margin-left:auto}
/* the masthead page cluster already states the position — the scan header repeats it only when it is the sole cue (facs-only, or phones where the masthead cluster hides) */
@media(min-width:881px){.app:not(.facs-only) .fh .fh-ct{display:none}}
.fn-ret{font:italic .82rem/1 var(--font-display);color:var(--accent2);display:inline-block;margin:-.5em -.35em -.5em .2em;padding:.5em .5em .5em .35em;text-decoration:none}  /* was --accent-soft #C9A96E = 2.1:1, illegible as text; gold stays for rules/borders only */
.fn-ret:hover{color:var(--accent2)}
.sld.lnz .lt{font:italic 600 11px/1 var(--font-display);letter-spacing:.04em}
/* ── APPLE PASS overrides (late in the sheet so they win the cascade) ── */
/* APPLE GEOMETRY only — the theme block above (line ~272) owns the masthead's COLORS
   (light = bg-glass with fg controls; dark likewise). The 2026-09-02 dark-ink override
   fought it and produced dark-on-dark chips in light mode (owner screenshot). */
.ph .ctr .seg,.seg.pnav,.seg.pgjump{border-radius:99px;background:color-mix(in srgb,var(--fg) 7%,transparent);
  border-color:color-mix(in srgb,var(--fg) 14%,transparent);padding:2px}
.ph .ctr .seg button,.seg.pnav button{border-right:0;border-radius:99px;margin:0}
.ph .ctr .tgl,.ph .sbt{border-radius:99px}
.ph .ctr .tgl:hover,.ph .sbt:hover{background:color-mix(in srgb,var(--fg) 9%,transparent)}
.aapop,.rvpanel,.about{border-radius:14px}
.aapop{backdrop-filter:blur(20px) saturate(1.4);-webkit-backdrop-filter:blur(20px) saturate(1.4);
  background:color-mix(in srgb,var(--card-bg) 88%,transparent);
  box-shadow:0 24px 70px -20px rgba(0,0,0,.45);border:1px solid color-mix(in srgb,var(--fg) 12%,transparent)}
.fh{backdrop-filter:blur(14px) saturate(1.3);-webkit-backdrop-filter:blur(14px) saturate(1.3);
  background:color-mix(in srgb,var(--bg) 78%,transparent)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:8px}
html.g-mobile .frthumb{background:color-mix(in srgb,var(--card-bg) 78%,transparent);
  backdrop-filter:blur(22px) saturate(1.6);-webkit-backdrop-filter:blur(22px) saturate(1.6);
  border-top:1px solid color-mix(in srgb,var(--fg) 10%,transparent);
  box-shadow:0 -8px 30px -16px rgba(0,0,0,.35)}
html.g-mobile .frthumb button{border-radius:12px;transition:background .16s,color .16s,transform .1s}
html.g-mobile .frthumb button:active{transform:scale(.94)}
@media(prefers-reduced-motion:reduce){html.g-mobile .frthumb button{transition:none}}
/* ── SOLO-WORK GRACE (owner 2026-09-02 Monachus screenshot: "the line between english and
   source"): a work whose English lane is EMPTY renders every row .solo — the la∥en split
   grip then floats as a stray full-height rule through a single column. If no true
   parallel row exists, the grip has nothing to split: hide it. */
#reading:not(:has(.row:not(.solo):not(.solola):not(.soloen))) #colgrip{display:none}
/* and the solo column reads as PRIMARY text: full ink, no lane bar, centered measure */
.app:not(.only-en):not(.only-la) .row.solo .la{border-left:0;padding-left:0;color:var(--fg)}
/* ── the split grip itself, iPad style: hairline at rest, a rounded handle on approach ── */
#colgrip::before{opacity:.35}
#colgrip:hover::before,body.gripping #colgrip::before{opacity:1}
#colgrip::after{content:"";position:sticky;top:48vh;display:block;width:4px;height:38px;
  margin:0 auto;border-radius:99px;background:color-mix(in srgb,var(--fg) 22%,transparent);
  opacity:0;transition:opacity .18s}
#colgrip:hover::after,body.gripping #colgrip::after{opacity:1}
/* teiflow page seams: one quiet chip, smaller, no ring of pills */
.app.teiflow .fmark{opacity:.45;gap:.35rem}
.app.teiflow .fmark .ff{font-size:.78rem;padding:.1rem .55rem;border-color:color-mix(in srgb,var(--accent-soft) 55%,transparent)}
.app.teiflow .fmark:hover{opacity:.9}
/* the facsimile page sits as a soft card on its mat */
#facs img,.facswrap img{border-radius:6px;box-shadow:0 8px 30px -12px rgba(0,0,0,.45)}
.sld.lnz input[type=range]{width:64px}
.app.only-en .sld.lnz{display:none}   /* lane balance only matters when both lanes are visible */

/* zoom HUD: a quiet % chip while zooming the scan, fades out (owner 2026-09-04) */
#zoomHud{position:absolute;top:.55rem;left:50%;transform:translateX(-50%);z-index:9;background:color-mix(in srgb,var(--fg) 84%,transparent);color:var(--bg);font:600 .74rem/1 var(--sans);padding:.38rem .62rem;border-radius:999px;opacity:0;transition:opacity .25s;pointer-events:none}
#zoomHud.on{opacity:.92}
.rz{flex:0 0 8px;cursor:col-resize;position:relative;z-index:6;touch-action:none}
.rz::before{content:"";position:absolute;inset:0 3px;border-radius:3px;background:var(--border);opacity:0;transition:background .15s,color .15s,border-color .15s,opacity .15s,transform .15s}
.rz:hover::before,.rz.drag::before{opacity:.9;background:var(--accent-soft)}
.fh{display:flex;align-items:center;justify-content:space-between;padding:.7rem 1rem;border-bottom:1px solid var(--border);font:italic 1rem/1 var(--font-display);color:var(--accent)}
.fh .lbl{font:.66rem/1 var(--sans);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-style:normal}
/* page-turn on the scan itself — the only nav reachable when the facsimile overlays the text on a phone */
.fh .fnav{font:1.15rem/1 var(--sans);color:var(--muted);background:none;border:1px solid var(--border);border-radius:6px;width:28px;height:28px;cursor:pointer;display:grid;place-items:center;padding:0;transition:color .15s,border-color .15s;flex:none}
.fh .fnav:hover{color:var(--accent);border-color:var(--accent-soft)}
.fh .fnav:active{transform:scale(.96)}
.fh #ffol{margin:0 .1rem;border:1px solid var(--accent-soft);border-radius:999px;padding:.16rem .7rem}  /* same pill family as the text lane's page marks — one visual language for "current page" */
/* facsimile-only: a quiet expand toggle in the scan header (only present in Study) fills the window with
   the page image and drops the text — for reading the original leaf alone. No new mode button to crowd the
   Read/Parallel/Study toggle; the same control restores the text. */
.fh .fexp{margin-left:.55rem;font:1rem/1 var(--sans);color:var(--muted);background:none;border:0;cursor:pointer;padding:.1rem .3rem;border-radius:5px;transition:color .15s}
.fh .fexp:hover,.fh .fexp[aria-pressed=true]{color:var(--accent)}
.app.facs-only .scroll,.app.facs-only #colgrip,.app.facs-only .rz{display:none}
.app.facs-only .facs{width:100%}
@media(max-width:1100px){.fh .fexp{display:none}}   /* on mobile the scan already fills the screen in Study */
.fstage{flex:1;overflow:auto;display:grid;place-items:start;padding:.25rem;cursor:grab;touch-action:pan-x pan-y;-webkit-overflow-scrolling:touch}  /* start, not center: a centered grid child wider than the pane clips its LEFT overflow (unreachable by scroll) — auto margins center small images and collapse when zoomed (owner 2026-09-04) */
.fstage>*{margin-inline:auto}  /* pinch is OURS (cursor-anchored) — pan stays native */  /* touch pans natively (the drag-pan below is mouse-only); momentum scroll on iOS */
.fstage.grabbing{cursor:grabbing}
.fstage img{width:var(--imz,100%);max-width:none;border:1px solid rgba(0,0,0,.18);border-radius:2px;background:var(--card-bg);cursor:inherit;box-shadow:0 10px 30px -14px rgba(80,50,20,.5);transition:opacity .3s;filter:var(--scan-filter,none)}  /* mat follows theme (near-white light, warm-dark dark) — not a clinical #fff card on warm paper */
.fstage{position:relative}
.fstage::after{content:'';position:absolute;inset:0;pointer-events:none;border-radius:2px;box-shadow:inset 0 0 22px 6px rgba(60,40,20,.20)}  /* frame vignette settles raw scan fore-edge bands ("silver edges") into page depth; an inset shadow on the img itself would not paint (replaced content) */
[data-theme="dark"] .fstage img{border-color:rgba(255,255,255,.1)}  /* pure-tint edge; dim the full-brightness leaf so Study in dark is not a floodlight beside dimmed text */
[data-theme="dark"] .light img{filter:none}  /* the zoom lightbox stays faithful for close inspection of the original leaf */
/* active fills keep AA on the lifted dark accent: warm ink on apricot, not white (2.7:1 → 6.1:1) */
html[data-theme="dark"] .seg button[aria-pressed=true],html[data-theme="dark"] .tgl[aria-pressed=true],html[data-theme="dark"] .fmark.titlepage .ff,html[data-theme="dark"] .vs .on{color:var(--bg)}
.prog{position:fixed;left:0;right:0;bottom:0;height:3px;z-index:50;pointer-events:none}.prog i{display:block;height:100%;width:0;background:var(--accent)}  /* pinned to the viewport bottom — was position:absolute, which on content-height panes (en-only confessions) dropped the reading-progress bar into the MIDDLE of the page */
.light{position:fixed;inset:0;z-index:90;background:rgba(45,41,39,.84);display:none;place-items:center;padding:4vh}.light.open{display:grid}
.light img{max-height:92vh;max-width:96vw;border-radius:3px}
.loading{padding:3rem;font:italic 1.1rem/1 var(--font-display);color:var(--muted)}
.row.rcit .la,.row.rcit .en{font-size:.76rem;line-height:1.55;color:var(--muted)}
.row.rcit{margin:.25rem 0}
/* citation-only apparatus rows: the "translation" of a citation chain is noise — show the SOURCE
   chain once, full row, no paired cell (Bossuet unevenness, owner 2026-07-21) */
.row.rcit.conly{display:block}
.row.rcit.conly .en{display:none}
.row.rcit.conly .la{display:block;max-width:74ch;border-left:none;padding-left:0}
.app.only-en .row.rcit.conly .la{display:block}   /* English-primary mode still shows the (Latin) citation chain */
/* deep-research run card */
.rsrch{border:1px solid var(--border);border-radius:10px;padding:.8rem 1rem;background:var(--card-bg,var(--paper));margin:.4rem 0}
.rsrch .rr-title{font:600 .95rem/1.3 var(--sans);margin-bottom:.5rem}
.rsrch .rr-step{font:.8rem/1.7 var(--sans);color:var(--muted)}
.rsrch .rr-step.done{color:var(--fg)}
.rsrch .rr-step.run{color:var(--accent2)}
.rsrch .rr-tick{display:inline-block;width:1.1em}
.rsrch .rr-note{opacity:.75}
.rsrch .rr-prog{font:.75rem/1.4 var(--sans);color:var(--muted);margin:.45rem 0 .2rem}
.rsrch .rr-evh{font:600 .8rem/1.4 var(--sans);margin:.7rem 0 .3rem}
.rsrch .rr-evwrap{max-width:100%;overflow-x:auto}
.rsrch table.rr-ev{border-collapse:collapse;font:.76rem/1.5 var(--sans);width:100%}
.rsrch table.rr-ev td{border-top:1px solid var(--rule-soft);padding:.3rem .5rem;vertical-align:top}
.rsrch table.rr-ev td:first-child{white-space:nowrap}
#rsResearch.on{color:var(--accent2);border-color:var(--accent2)}
.rsrch .rr-meta{font:.72rem/1.4 var(--sans);color:var(--muted);margin:-.25rem 0 .5rem}
.rsrch .rr-thread{margin-top:.6rem}
.rsrch .rr-q{font:600 .82rem/1.5 var(--sans);color:var(--fg);margin:.7rem 0 .25rem;padding-top:.55rem;border-top:1px dashed var(--rule-soft)}
.rsrch .rr-a{font-size:.9em}
.rsrch .rr-ask{display:flex;gap:.4rem;margin-top:.7rem}
.rsrch .rr-ask input{flex:1;min-width:0;font:.85rem/1.3 var(--font-body);padding:.45rem .65rem;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--fg)}
.rsrch .rr-ask button{font-size:1rem;padding:.3rem .8rem;border-radius:8px;border:1px solid var(--border);background:none;color:var(--accent2);cursor:pointer}
.rr-strip{display:flex;align-items:center;gap:.4rem;flex-wrap:wrap;margin:.2rem 0 .6rem}
.rr-strip-h{font:600 .68rem/1 var(--sans);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.rr-chip{font:.74rem/1.2 var(--sans);padding:.28rem .6rem;border-radius:999px;border:1px solid var(--rule-soft);background:none;color:var(--fg);cursor:pointer;max-width:16rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rr-chip:hover{border-color:var(--accent-soft);color:var(--accent2)}
.psc-live{color:var(--accent2);font-size:.6rem}
.psc-warn{font-size:.68rem;color:var(--accent2);opacity:.85}
.rsa-scopepill{font:.72rem/1.5 var(--sans);color:var(--accent2);border:1px solid var(--accent-soft);border-radius:8px;padding:.35rem .6rem;margin:.3rem 0}
.rsa-scopepill button{font:inherit;background:none;border:0;color:var(--accent2);text-decoration:underline;cursor:pointer;padding:0}
.coach{display:block;margin:0 auto;max-width:56rem;padding:.6rem 2.2rem .55rem 1rem;position:relative;
  font:italic .85rem/1.6 var(--font-body,serif);color:var(--muted);border-bottom:1px solid var(--rule-soft);text-align:center}
.coach b{font-style:normal;font-weight:500;color:var(--fg)}
.coach b{color:var(--fg);font-weight:600}
.coach-x{position:absolute;right:.6rem;top:.4rem;background:none;border:0;color:var(--muted);cursor:pointer;font:inherit;padding:.1rem .3rem}
.coach-x:hover{color:var(--fg)}
@media(max-width:1100px){.facs{position:fixed;top:0;right:0;bottom:0;z-index:40}.app.no-facs .facs{margin-right:0;transform:translateX(102%)}.rz{display:none}.sidebar{width:220px}}
@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important;scroll-behavior:auto!important}}
/* sidenote apparatus: in Read on wide screens, your notes & translations float into the right margin */
@media(min-width:1400px){
  .app.only-en .rowx{float:right;clear:right;width:14rem;margin:.1rem -15.6rem .7rem 0;font-size:.86em}
  .app.only-en .rowx textarea{min-height:4rem}
}
/* mobile: Parallel/Study collapse to interleaved English-then-Latin blocks (never a horizontal scroll) */
@media(max-width:880px){
  /* phones keep the PARALLEL spread (owner 2026-09-05 "flowing, not stacking english latin"):
     two narrow facing lanes, the pocket cut of the same page — never EN-then-LA blocks */
  .app:not(.only-en):not(.only-la) .row{grid-template-columns:1fr 1fr;gap:.7rem}
  .app:not(.only-en):not(.only-la) .row.seg .sp{grid-template-columns:1fr 1fr;gap:.7rem}
  .app:not(.only-en):not(.only-la) .row .en{order:2}
  .app:not(.only-en):not(.only-la) .row .la{order:1;font-size:calc(.97em * var(--lasz,1))}
  .app:not(.only-en):not(.only-la) #reading{font-size:var(--rdszm,clamp(13px,3.5vw,15px))!important}
  /* display heads are titles, not prose lanes — they take the full width, Latin over English */
  .app:not(.only-en):not(.only-la) .row.rhead{grid-template-columns:1fr}
  .app:not(.only-en):not(.only-la) .row.rhead .csub{grid-column:1;max-width:100%}
  .row.rhead .csub .hla,.row.rhead .csub .hen{overflow-wrap:break-word}
  .ph h1{font-size:1.02rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:58vw}
  .ph .sub{display:none}
  /* phones: responsive default, but the Aa size control MUST win — the old bare !important clamp
     silently killed the text-size setting on mobile (owner report 2026-07-21). applySz() writes
     --rdszm; the clamp is only the pre-JS fallback. */
  #reading{padding-inline:clamp(1.1rem,5vw,1.6rem);font-size:var(--rdszm,clamp(14px,3.9vw,16px))!important}
  .app.only-la #reading,.app.only-en #reading,.app.en-only #reading{max-width:100%}  /* phones: the 88% desktop cap would waste scarce width; padding provides the margins */
  .app.only-en #reading,.app.en-only #reading{line-height:var(--reading-lh)}
  /* reading comfort on phones: clearer section breaks for the now-broken-out headings + a touch more air between paragraphs */
  .row.rhead .csub{font-size:1.12em;margin:1.5rem 0 .45rem;text-wrap:balance}
  .app:not(.only-en):not(.only-la) .row+.row{margin-top:.5rem}
  .row .trpencil{display:none}
  /* masthead: one scrollable row of big touch targets; sliders + account cluster leave the bar */
  .ph{padding-left:max(.5rem,env(safe-area-inset-left));padding-right:max(.5rem,env(safe-area-inset-right))}
  .ctr{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}
  .ctr::-webkit-scrollbar{display:none}
  .ph .mh-home{display:none}  /* phone: the brand link collides with the lane toggle; the burger menu carries Home */
  .seg button,.tgl{min-height:38px;padding:8px 11px;font-size:13px}
  .sbt{min-width:42px;min-height:38px}
  .sld.szc,.sld.izc,.sld.lnz{display:none}              /* sliders → use the pinch/OS zoom + per-mode defaults */
  .rvsum{display:none}
  #ownerEdit{padding:8px 10px}
  .ctr .ab-note{display:none}                   /* status text leaves the bar; ✦ pill stays as the Notebook trigger */
  .ctr .nb-pill{min-height:38px;display:inline-flex;align-items:center}
  .ctr .nb-pill[data-zero="1"]{display:none}   /* the display:inline-flex above out-cascades the base zero-hide — restore it */
  /* the column-split grip has no meaning when rows interleave */
  #colgrip{display:none}
  /* sidebar: off-canvas sheet + scrim, full touch width */
  .sidebar{width:min(85vw,330px);box-shadow:18px 0 60px -20px rgba(40,25,10,.55)}
  /* notebook: full-width sheet with safe-area; account row pinned at its head */
  .notebook{width:100vw;border-left:0;padding-bottom:env(safe-area-inset-bottom)}
  .nb-account{display:flex!important;align-items:center;gap:.6rem;flex-wrap:wrap;padding:.7rem 1.1rem;border-bottom:1px solid var(--border);background:var(--paper)}
  .nb-account .ab-sync{min-height:38px;padding:8px 12px}
  /* selection popup: finger-sized actions */
  .pop .pb,.pop .sw{min-height:40px;min-width:40px}
  /* facsimile overlay (Study) on a phone: exactly the viewport (the 460px clamp-min was spilling off-screen left), with a gutter and a comfortable exit */
  .facs{width:100vw;left:0;right:auto}
  .fstage{padding:.6rem max(.6rem,env(safe-area-inset-left)) 1.2rem}
  .facs-x{display:grid!important;place-items:center;position:absolute;top:max(8px,env(safe-area-inset-top));right:10px;z-index:5;width:44px;height:44px;border-radius:8px;border:1px solid var(--border);background:var(--paper);color:var(--muted);font-size:19px;cursor:pointer}
  .fh{padding-top:max(.7rem,env(safe-area-inset-top));padding-right:64px}  /* clear the × button */
  .fh .fnav{width:44px;height:44px;font-size:1.5rem}                       /* thumb-size page-turns on the scan */
}
.facs-x{display:none}
.nb-account{display:none}
/* ---- reader user layer (public /read): highlight · note · my-translation ---- */
.row[data-hl]{border-radius:8px;padding:.5rem .75rem;margin-left:-.75rem;margin-right:-.75rem}  /* breathing room: the tint extends beyond the text instead of the text touching the tint's edge */
.row[data-hl="amber"]{background:#fbe9c8}
.row[data-hl="sage"]{background:#e7efe0}
.row[data-hl="slate"]{background:#e5ecf3}
@keyframes fr-anchor{0%,45%{background:var(--highlight)}100%{background:transparent}}
.row.anchor-flash{animation:fr-anchor 2.2s var(--ease);border-radius:8px;box-shadow:0 0 0 .6rem var(--highlight);transition:box-shadow 2.2s}  /* deep-link landing flash — halo, not a tight box against the text */
/* owner inline page editor */
/* owner quick inline edit: a paragraph cell becomes contenteditable on double-click */
.row .la.editing,.row .en.editing,.row .sp .la.editing,.row .sp .en.editing{outline:2px solid var(--accent);outline-offset:4px;border-radius:5px;background:color-mix(in oklch,var(--accent) 8%,var(--bg));cursor:text;caret-color:var(--accent)}
.row .la.edited,.row .en.edited{box-shadow:inset 3px 0 0 var(--accent2);transition:box-shadow .4s}
/* in-reader search overlay (⌘K / ⌕): this work · corpus · ask */
.rsov{position:fixed;inset:0;z-index:130;background:color-mix(in oklch,var(--fg) 22%,transparent);backdrop-filter:blur(3px);display:none;padding:7vh 1rem}
/* wide screens: the research surface DOCKS as a right rail — the page stays readable and scrollable
   beside the conversation (the sisters' research-rail pattern, kept as one surface, not a second). */
@media(min-width:1240px){
  .rsov{inset:auto 0 0 auto;top:0;width:min(520px,38vw);padding:0;background:transparent;backdrop-filter:none;pointer-events:none;box-shadow:none}
  .rsov .rsp{pointer-events:auto;height:100vh;max-height:none;margin:0;border-radius:0;border-width:0 0 0 1px;
    box-shadow:-18px 0 48px -30px rgba(40,25,10,.45)}
}
.rsr{position:relative}
.rsr .rspin{position:absolute;top:.35rem;right:.4rem;border:0;background:none;font-size:.82rem;line-height:1;cursor:pointer;
  color:color-mix(in oklch,var(--muted) 45%,transparent);padding:.2rem;transition:color .14s,transform .12s}
.rsr .rspin:hover{color:var(--accent)}.rsr .rspin.on{color:var(--accent)}.rsr .rspin:active{transform:scale(.96)}
.rsov.open{display:block}
.rsp{max-width:760px;margin:0 auto;max-height:84vh;display:flex;flex-direction:column;background:var(--bg);border:1px solid var(--border);border-radius:12px;box-shadow:0 30px 80px -20px rgba(40,25,10,.5);overflow:hidden}
.rsh{display:flex;gap:.55rem;padding:.7rem .8rem;border-bottom:1px solid var(--border);align-items:center;flex-wrap:wrap}
.rsgo{flex:0 0 auto;min-width:40px;min-height:36px;border:1px solid var(--border);border-radius:8px;background:var(--paper,#faf7f2);font-size:1.15rem;line-height:1;cursor:pointer;color:inherit;transition:transform .16s cubic-bezier(.23,1,.32,1)}
.rsgo:active{transform:scale(.96)}
.rshl{margin-left:.6rem;font-size:.74rem;padding:.15rem .55rem;border:1px solid var(--border);border-radius:999px;background:transparent;cursor:pointer;color:inherit;opacity:.85}
.rshl:hover{opacity:1}
.rsh input{flex:1;min-width:150px;font:1rem/1.3 var(--font-body);padding:.5rem .75rem;border:1px solid var(--border);border-radius:8px;background:var(--card-bg);color:var(--fg)}
.rsh input:focus{outline:0;border-color:var(--accent)}
.rss{display:inline-flex;border:1px solid var(--border);border-radius:8px;overflow:hidden}
.rspl{display:inline-flex;align-items:center;gap:.3rem;font:600 11px/1 var(--sans);color:var(--muted);white-space:nowrap;cursor:pointer;margin-left:.5rem}
.rspl input{accent-color:var(--accent)}
.rss button{font:600 .74rem/1 var(--sans);padding:.5rem .7rem;border:0;border-right:1px solid var(--border);background:var(--card-bg);color:var(--muted);cursor:pointer}
.rss button:last-child{border-right:0}.rss button[aria-pressed=true]{background:var(--accent);color:#fff}
.rsx{border:0;background:none;color:var(--muted);font-size:1.05rem;cursor:pointer;padding:.3rem .45rem;line-height:1}
.rsb{overflow:auto;padding:.6rem .8rem 1rem}
.rsn{color:var(--muted);font:.85rem/1.5 var(--sans);padding:.5rem .2rem}
.rsr{display:block;padding:.5rem .65rem;border:1px solid var(--border);border-left:3px solid transparent;border-radius:7px;margin:0 0 .4rem;background:var(--card-bg);text-decoration:none;color:var(--fg);cursor:pointer;text-align:left;width:100%;font:inherit}
.rsr:hover{border-left-color:var(--accent);background:var(--highlight)}
.rsr .rst{font-family:var(--font-display);color:var(--accent2);font-size:1rem;display:block}
.rsr .rsm{font:.7rem/1.4 var(--sans);color:var(--muted);display:block;margin-top:.15rem}
.rsr .rsx2{font:.86rem/1.5 var(--font-body);color:var(--fg);display:block;margin-top:.12rem}
.rsr mark{background:var(--highlight);color:var(--accent2);padding:0 .12em;border-radius:3px}
.rsa-deep{font:600 .72rem/1.4 var(--sans);color:var(--accent2);background:var(--highlight);border-radius:6px;padding:.35rem .6rem;margin:0 0 .5rem}
/* keyboard-help overlay (?) */
.kbdhelp{position:fixed;inset:0;z-index:130;background:rgba(20,15,10,.45);display:grid;place-items:center;cursor:pointer}
.kh-box{background:var(--card-bg);border:1px solid var(--border);border-radius:14px;box-shadow:0 30px 80px -30px rgba(42,28,14,.6);padding:1.2rem 1.5rem;min-width:320px}
.kh-box b{font:600 .95rem/1 var(--sans);color:var(--accent2)}
.kh-box table{margin:.7rem 0 .4rem;border-collapse:collapse;font:.85rem/1.9 var(--sans);color:var(--fg)}
.kh-box td:first-child{font-weight:600;color:var(--accent2);padding-right:1.2rem;white-space:nowrap}
.kh-x{font:.7rem/1 var(--sans);color:var(--muted)}
/* ── Related panel: cross-work + cross-corpus parallels for the folio being read ── */
/* v2 (owner 2026-09-02 'genuine upgrade'): glass header, skeleton loading, affinity bars,
   inline peek, auto-follow of the reading position */
.relpanel-h{backdrop-filter:blur(14px) saturate(1.3);-webkit-backdrop-filter:blur(14px) saturate(1.3)}
.rp-follow{font:600 .64rem/1 var(--sans);letter-spacing:.05em;color:var(--muted);display:flex;align-items:center;gap:.35rem;margin:.1rem 0 .5rem}
.rp-follow i{width:6px;height:6px;border-radius:50%;background:#3F6B4E;animation:rpPulse 2s ease-in-out infinite}
@keyframes rpPulse{0%,100%{opacity:.4}50%{opacity:1}}
.rp-skel{border:1px solid var(--border);border-radius:12px;padding:.7rem .8rem;margin:.4rem 0;overflow:hidden;position:relative}
.rp-skel div{height:.7rem;border-radius:5px;background:color-mix(in srgb,var(--fg) 8%,transparent);margin:.3rem 0}
.rp-skel div:nth-child(2){width:70%}.rp-skel div:nth-child(3){width:45%}
.rp-skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--card-bg) 60%,transparent),transparent);
  animation:rpShimmer 1.4s infinite}
@keyframes rpShimmer{100%{transform:translateX(100%)}}
.relpanel a.rsr{border:1px solid var(--border);border-radius:12px;padding:.55rem 2rem .55rem .75rem;margin:.35rem 0;
  transition:transform .16s var(--ease),box-shadow .16s,border-color .16s}
.relpanel a.rsr:hover{transform:translateY(-1px);border-color:var(--accent-soft);box-shadow:0 8px 22px -14px rgba(0,0,0,.25)}
.rsaff{display:block;height:3px;border-radius:99px;background:color-mix(in srgb,var(--accent) 55%,transparent);margin-top:.4rem}
.rp-peek{font:inherit;font-size:.7rem;border:1px solid var(--border);border-radius:99px;background:none;color:var(--muted);
  cursor:pointer;padding:.08rem .45rem;margin-left:.35rem;transition:transform .2s,color .2s}
.rp-peek.on{transform:rotate(180deg);color:var(--accent)}
.rp-peekwrap{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s cubic-bezier(.32,.72,.25,1)}
.rp-peekwrap.on{grid-template-rows:1fr}
.rp-peekwrap>div{overflow:hidden;min-height:0}
.rp-peekwrap iframe{width:100%;height:46vh;border:1px solid var(--border);border-radius:12px;margin:.4rem 0;background:var(--card-bg)}
.rp-act{display:flex;gap:.5rem;flex-wrap:wrap;margin:.6rem 0}
.rp-act a{font:600 .78rem/1 var(--sans);border:1px solid var(--accent-soft);border-radius:99px;padding:.45rem .8rem;
  color:var(--accent2);text-decoration:none;transition:background .15s}
.rp-act a:hover{background:var(--highlight)}
@media(prefers-reduced-motion:reduce){.rp-skel::after,.rp-follow i{animation:none}.relpanel a.rsr:hover{transform:none}}
.rp-mined{border:1px solid var(--line,#e8e0d5);border-radius:10px;padding:.6rem .7rem;margin:0 0 .7rem;background:var(--highlight,rgba(0,0,0,.03))}
.rpm-h{font:600 .68rem/1 var(--sans);letter-spacing:.04em;text-transform:uppercase;color:var(--accent);margin:0 0 .4rem}
.rpm-h .rpm-u{color:var(--muted);text-transform:none;letter-spacing:0;font-weight:400;margin-left:.4rem}
.rpm-gist{font:italic .82rem/1.45 var(--serif,serif);color:var(--muted);margin:0 0 .45rem}
.rpm-pos{font:.8rem/1.45 var(--sans);margin:.3rem 0;padding-left:1.1rem;text-indent:-1.1rem}
.rpm-pos b{text-transform:lowercase;color:var(--accent)}
.rpm-tick{margin-right:.3rem;color:var(--muted)}
.rpm-pos.ok .rpm-tick{color:#3F6B4E}
.rpm-ag{color:var(--muted);font-size:.9em}
.rpm-auth{display:flex;flex-wrap:wrap;gap:.25rem;margin:.4rem 0}
.rpm-chip.rpm-go{border-color:#C1593C;color:#C1593C}.rpm-chip.rpm-web{color:#9C8350}.rpm-chip{font:.7rem/1 var(--sans);border:1px solid var(--line,#e8e0d5);border-radius:999px;padding:.24rem .5rem;color:var(--fg)}
.rpm-def{font:.78rem/1.4 var(--sans);color:var(--muted);margin:.25rem 0}
.rp-cites{display:flex;flex-wrap:wrap;gap:.35rem}
.rp-cite{display:inline-flex;align-items:center;gap:.35rem;font:600 .74rem/1 var(--sans);color:var(--fg);
  border:1px solid var(--border);border-radius:999px;padding:.32rem .62rem;text-decoration:none;transition:border-color .15s,background .15s}
.rp-cite:hover{border-color:var(--accent-soft);background:var(--highlight)}
.rp-cite .cbadge{font:700 .58rem/1.4 var(--sans);border-radius:3px;padding:.02rem .28rem;color:#fff}
.rp-cite .cb-pg{background:#4a6d8c}.rp-cite .cb-pl{background:#8c5a3a}
.rslat{display:block;font:italic .74rem/1.3 var(--font-body);color:var(--muted);margin-top:.02rem}
.rtrad{display:inline-block;font:600 .62rem/1.4 var(--sans);letter-spacing:.03em;color:var(--muted);border:1px solid var(--border);border-radius:999px;padding:.02rem .4rem;margin-left:.4rem;vertical-align:1px}
.rp-pin{position:absolute;top:.35rem;right:.4rem;border:0;background:transparent;color:var(--accent-soft);font-size:.95rem;cursor:pointer;padding:.15rem .25rem;border-radius:6px;transition:color .13s,background .13s,transform .13s;user-select:none}
.rp-pin:hover{color:var(--accent);background:color-mix(in oklab,var(--accent) 8%,transparent)}
.rp-pin.on{color:var(--accent)}
.rp-pin:active{transform:scale(.9)}
.rp-del{position:absolute;top:.35rem;right:.4rem;border:0;background:transparent;color:var(--accent-soft);font-size:.8rem;cursor:pointer;padding:.15rem .25rem;border-radius:6px;user-select:none}
.rp-del:hover{color:var(--accent);background:color-mix(in oklab,var(--accent) 8%,transparent)}
.relpanel .rsr{position:relative;padding-right:2rem}
.relpanel .era,.rp-f .era{font:600 .62rem/1 var(--sans);letter-spacing:.05em;color:var(--muted);border:1px solid var(--border);border-radius:4px;padding:.1rem .28rem;vertical-align:1px}
.rp-pins{border:0;background:transparent;color:var(--masthead-ink);font:600 .74rem/1 var(--sans);cursor:pointer;padding:.3rem .5rem;border-radius:6px;opacity:.85}
.rp-pins:hover{opacity:1;background:rgba(255,255,255,.1)}
.rp-copy{display:block;margin:.6rem 0;border:1px solid var(--border);background:var(--card-bg);color:var(--accent);font:600 .78rem/1 var(--sans);padding:.45rem .7rem;border-radius:8px;cursor:pointer}
.rp-copy:hover{color:var(--accent2)}
.selchip{position:fixed;z-index:85;display:flex;gap:0;overflow:hidden;font:600 12px/1 -apple-system,sans-serif;border-radius:999px;border:1px solid var(--border);background:var(--card-bg);color:var(--accent);cursor:pointer;box-shadow:0 6px 24px -8px rgba(42,28,14,.35);opacity:0;transform:translateY(3px);pointer-events:none;transition:opacity .15s cubic-bezier(.2,0,0,1),transform .15s cubic-bezier(.2,0,0,1)}
.selchip.on{opacity:1;transform:none;pointer-events:auto}
.selchip .sc-b{border:0;background:transparent;color:var(--accent);font:inherit;padding:.45rem .65rem;cursor:pointer;transition:background .13s,color .13s}
.selchip .sc-b+.sc-b{border-left:1px solid var(--border);color:var(--accent2)}
.selchip .sc-b:hover{background:color-mix(in oklab,var(--accent) 8%,transparent)}
.selchip:active{transform:scale(.96)}
.relpanel{position:fixed;top:0;right:0;bottom:0;width:378px;max-width:94vw;z-index:60;background:var(--card-bg);border-left:1px solid var(--border);box-shadow:-12px 0 40px -24px rgba(42,28,14,.5);display:flex;flex-direction:column;transform:translateX(104%);transition:transform .28s var(--ease)}
.relpanel.on{transform:none}
.relpanel:not(.on){transition-duration:.2s}
.relpanel-h{display:flex;align-items:center;gap:.6rem;padding:.75rem 1rem;background:var(--masthead);color:var(--masthead-ink)}
.relpanel-h b{font:600 .95rem/1.2 var(--sans)}
.relpanel-h .rp-pg{font:italic .8rem/1 var(--font-display);color:color-mix(in oklch,var(--masthead-ink) 70%,transparent)}
.relpanel-x{margin-left:auto;background:rgba(255,255,255,.1);color:var(--masthead-ink);border:0;border-radius:6px;width:26px;height:26px;cursor:pointer;font-size:14px}
.relpanel-b{flex:1;overflow-y:auto;padding:.7rem .9rem 2rem}
.rp-sec{font:600 .68rem/1 var(--sans);letter-spacing:.1em;text-transform:uppercase;color:var(--accent);margin:.9rem 0 .5rem}
.rp-sec:first-child{margin-top:.1rem}
.rp-note{color:var(--muted);font:.85rem/1.5 var(--sans);padding:.4rem .1rem}
.rp-f{display:block;padding:.55rem .7rem;border:1px solid var(--border);border-left:3px solid var(--accent-soft);border-radius:7px;margin:0 0 .45rem;background:var(--bg)}
.rp-f .cit{font:600 .78rem/1.3 var(--sans);color:var(--accent2)}
.rp-f .tx{font:.85rem/1.5 var(--font-body);color:var(--fg);display:block;margin-top:.2rem}
.rp-refresh{font:600 .72rem/1 var(--sans);color:var(--accent2);background:none;border:1px solid var(--accent-soft);border-radius:999px;padding:.3rem .7rem;cursor:pointer;margin:.15rem 0 .4rem}
.rp-refresh:hover{background:var(--highlight)}
/* in-reading find: matches painted in the body + a floating step bar */
mark.findhit{background:var(--accent-soft);color:inherit;border-radius:2px;padding:0 .04em}
mark.findhit.cur{background:var(--accent);color:#fff;box-shadow:0 0 0 1px var(--accent)}
.findbar{position:fixed;left:50%;bottom:1.15rem;transform:translateX(-50%) translateY(165%);z-index:120;display:flex;align-items:center;gap:.5rem;background:var(--masthead);color:var(--masthead-ink);border-radius:11px;padding:.4rem .5rem .4rem .8rem;box-shadow:0 10px 30px -10px rgba(42,28,14,.42);transition:transform .22s var(--ease);font:.85rem/1 var(--sans)}
.findbar.on{transform:translateX(-50%)}
.findbar .findterm{font:italic .9rem/1 var(--font-display);max-width:13rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.findbar .findcount{color:color-mix(in oklch,var(--masthead-ink) 68%,transparent);font-variant-numeric:tabular-nums;margin-right:.15rem}
.findbar button{background:rgba(255,255,255,.10);color:var(--masthead-ink);border:0;border-radius:7px;width:1.85rem;height:1.85rem;cursor:pointer;font-size:.95rem;line-height:1}
.findbar button:hover{background:rgba(255,255,255,.22)}
@media print{.findbar{display:none!important}}
.rsgo{flex:none;font:600 .82rem/1 var(--sans);color:#fff;background:var(--accent);border:0;border-radius:8px;padding:.55rem .9rem;cursor:pointer;white-space:nowrap}
.rsaskscope{flex:none;font:.76rem/1 var(--sans);color:var(--muted);display:inline-flex;align-items:center;gap:.3rem;cursor:pointer;white-space:nowrap}
.rsaskscope input{accent-color:var(--accent);margin:0}
.rsgo:hover{filter:brightness(1.08)}
.rsask{font:1rem/1.66 var(--font-body);color:var(--fg);padding:.2rem}
.rsask p{margin:0 0 .7rem}.rsask strong{font-weight:700}.rsask em{font-style:italic}
.rsask .ask-h{font-family:var(--font-display);font-size:1.08rem;color:var(--accent2);margin:1rem 0 .35rem;font-weight:400}
.rsask .cite{display:inline-block;font:600 .66rem/1 var(--sans);color:#fff;background:var(--accent);border-radius:5px;padding:.1rem .3rem;margin:0 .12rem;text-decoration:none;vertical-align:.12em}
.rsask .cite:hover{background:var(--accent2)}
/* Ask = text-message chat thread */
.rsb.askmode{display:flex;flex-direction:column}
.rsa-thread{display:flex;flex-direction:column;gap:.9rem;padding:.2rem .1rem;flex:1}
.rsa-turn{display:flex;flex-direction:column;gap:.4rem}
.rsa-q{align-self:flex-end;max-width:84%;background:var(--accent);color:#fff;border-radius:14px 14px 4px 14px;padding:.5rem .8rem;font:.98rem/1.45 var(--font-body);white-space:pre-wrap;word-break:break-word}
.rsa-a{align-self:flex-start;max-width:96%;background:var(--card-bg);border:1px solid var(--border);border-radius:14px 14px 14px 4px;padding:.6rem .85rem;font:1rem/1.62 var(--font-body);color:var(--fg)}
.rsa-a .rsa-body p{margin:0 0 .6rem}.rsa-a .rsa-body p:last-child{margin:0}
.rsa-a strong{font-weight:700}.rsa-a em{font-style:italic}
.rsa-a .ask-h{font-family:var(--font-display);font-size:1.05rem;color:var(--accent2);margin:.8rem 0 .3rem;font-weight:400}
.rsa-a .cite{display:inline-block;font:600 .66rem/1 var(--sans);color:#fff;background:var(--accent);border-radius:5px;padding:.1rem .3rem;margin:0 .12rem;text-decoration:none;vertical-align:.12em}
.rsa-a .cite:hover{background:var(--accent2)}
.rsa-srcwrap{margin-top:.5em}.rsa-srcwrap summary{cursor:pointer;opacity:.75;font-size:.85em}.rsa-src{margin-top:.6rem;border-top:1px dashed var(--border);padding-top:.5rem}
.rsa-src .rsn2{font:600 .66rem/1 var(--sans);text-transform:uppercase;letter-spacing:.05em;color:var(--muted);display:block;margin:0 0 .35rem .1rem}
.rsa-intro{color:var(--muted);font:.92rem/1.55 var(--font-body);padding:.4rem .2rem .2rem}
.rsa-composer{position:sticky;bottom:0;background:linear-gradient(to top,var(--bg) 74%,transparent);padding:.6rem 0 .2rem;margin-top:.5rem;display:flex;flex-direction:column;gap:.4rem}
.rsa-scope{font:.74rem/1 var(--sans);color:var(--muted);display:inline-flex;align-items:center;gap:.3rem;cursor:pointer;align-self:flex-start}
.rsa-scope input{accent-color:var(--accent);margin:0}
.rsa-row{display:flex;gap:.45rem;align-items:center}
/* the chat box (2026-09-05: one composer idiom across landing, /search, and the reader) */
.rsa-box{position:relative;background:var(--card-bg);border:1px solid var(--border);border-radius:13px;padding:.5rem 2.7rem .35rem .8rem}
.rsa-box:focus-within{border-color:var(--fg);box-shadow:0 0 0 3px color-mix(in oklch,var(--fg) 8%,transparent)}
.rsa-box #rsaInput{width:100%;border:0;background:none;outline:0;box-shadow:none;font:1rem/1.4 var(--font-body);color:var(--fg);padding:.15rem 0 .1rem}
.rsa-box #rsaInput::placeholder{color:var(--muted)}
.rsa-send{position:absolute;right:.5rem;top:.45rem;width:32px;height:32px;border-radius:50%;border:0;background:var(--fg);color:var(--card-bg);font-size:1rem;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}
.rsa-send:disabled{opacity:.35}
.rsa-tools{display:flex;align-items:center;gap:.2rem .45rem;flex-wrap:wrap;font:.74rem/1 var(--sans);color:var(--muted);padding-top:.2rem}
.rsa-t{display:inline-flex;align-items:center;gap:.3rem;color:var(--muted);cursor:pointer;padding:.35rem .4rem;border-radius:6px}
.rsa-t:hover{color:var(--fg)}
.rsa-t input{appearance:none;-webkit-appearance:none;width:0;height:0;margin:0;border:0;position:absolute;left:-9999px;outline:none;pointer-events:none}
.rsa-t:has(input:checked){color:var(--fg);font-weight:700}
.rsa-t:has(input:checked)::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--fg)}
.rsa-tools #rsAskAuth{flex:0 1 9rem;min-width:0;font:.74rem/1 var(--sans);border:0;border-bottom:1px solid var(--border);border-radius:0;background:none;color:var(--fg);padding:.3rem .1rem;outline:0}
.rsa-tools #rsAskAuth:focus{border-bottom-color:var(--fg)}
.rsa-sp{flex:1}
.rsa-send:hover{filter:brightness(1.08)}
.rsa-new{flex:none;border:0;background:none;color:var(--muted);border-radius:6px;font-size:1.05rem;cursor:pointer;line-height:1;padding:.3rem .45rem}
.rsa-new:hover{color:var(--fg)}
.rsa-new:hover{border-color:var(--accent);color:var(--accent)}
/* selection stays in its lane: while a drag lives in EN, LA is unselectable (and vice versa) —
   continuous multi-paragraph copy down one column, never interleaved bilingual soup. */
body.selg-en .row .la,body.selg-en .row .la *{user-select:none;-webkit-user-select:none}
body.selg-la .row .en,body.selg-la .row .en *{user-select:none;-webkit-user-select:none}
#rsBtn{margin-right:.1rem;font-size:1.18rem;line-height:1}
.rsa-fcs{display:inline-flex;gap:.3rem;margin-right:.5rem;vertical-align:middle}
.rsa-fc{font:.72rem/1 var(--sans,sans-serif);padding:.3rem .55rem;border:1px solid var(--border);border-radius:999px;
  background:transparent;color:var(--muted);cursor:pointer;transition:color .14s,border-color .14s,background .14s}
.rsa-fc:hover{color:var(--fg);border-color:var(--accent-soft)}
.rsa-fc.on{color:var(--accent2);border-color:var(--accent);background:color-mix(in oklab,var(--accent) 9%,transparent)}
#rsAskAuth{font:.76rem/1.2 var(--sans,sans-serif);color:var(--fg);background:transparent;border:1px solid var(--border);
  border-radius:999px;padding:.3rem .6rem;width:10.5rem;vertical-align:middle;margin-right:.4rem}
#rsAskAuth:focus{outline:2px solid var(--accent);outline-offset:1px}
.edit-ov{position:fixed;inset:0;z-index:120;background:color-mix(in oklch,var(--fg) 28%,transparent);backdrop-filter:blur(3px);display:flex;align-items:flex-start;justify-content:center;padding:5vh 1rem}
.edit-box{background:var(--bg);border:1px solid var(--border);border-radius:12px;box-shadow:0 30px 80px -20px rgba(40,25,10,.5);width:min(860px,96vw);max-height:88vh;display:flex;flex-direction:column;overflow:hidden}
.edit-h{font-family:var(--font-display);font-size:1.1rem;color:var(--accent2);padding:.9rem 1.1rem;border-bottom:1px solid var(--border)}
.edit-h span{font-family:var(--sans);font-size:.74rem;color:var(--muted);font-weight:400}
.edit-box label{display:flex;flex-direction:column;gap:.3rem;font:600 .68rem/1 var(--sans);letter-spacing:.07em;text-transform:uppercase;color:var(--muted);padding:.8rem 1.1rem 0}
.edit-box textarea{font:14px/1.6 ui-monospace,Menlo,monospace;min-height:11vh;max-height:28vh;padding:.6rem .7rem;border:1px solid var(--border);border-radius:8px;background:var(--card-bg);color:var(--fg);resize:vertical}
.edit-box textarea:focus{outline:0;border-color:var(--accent)}
.edit-btns{display:flex;gap:.6rem;align-items:center;padding:1rem 1.1rem;border-top:1px solid var(--border);margin-top:.6rem}
.edit-btns .pri{font:600 .85rem/1 var(--sans);background:var(--accent);color:#fff;border:0;border-radius:8px;padding:.6rem 1.2rem;cursor:pointer}
.edit-btns .cx{font:600 .85rem/1 var(--sans);background:var(--card-bg);color:var(--accent2);border:1px solid var(--accent-soft);border-radius:8px;padding:.6rem 1rem;cursor:pointer}
.edit-btns .edhint{font:.72rem/1.3 var(--sans);color:var(--muted);margin-left:auto}
.rowx{grid-column:1/-1;margin:.2rem 0 .35rem;padding:.5rem .8rem;border:1px solid var(--rule-soft);border-radius:9px;background:var(--card-bg)}
.rowx .by{display:block;font:600 .62rem/1 var(--sans);letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin-bottom:.3rem}
.rowx.tr{font:italic 1em/1.65 var(--font-body);color:var(--accent2)}
.rowx.note{background:#fff8ec;border-color:var(--accent-soft);font:.95em/1.6 var(--font-body);color:var(--fg)}
.rowx .x{float:right;border:0;background:none;color:var(--muted);cursor:pointer;font-size:13px;padding:0 0 0 .5rem}
.rowx textarea{width:100%;border:1px solid var(--border);border-radius:7px;padding:.5rem .6rem;font:inherit;background:#fff;color:var(--fg);min-height:5.5rem;resize:vertical;outline:none}
.rowx textarea:focus{border-color:var(--accent)}
.rowx .act{display:flex;gap:.45rem;margin-top:.4rem}
.rowx .act button{font:600 11px/1 var(--sans);padding:.42rem .7rem;border-radius:6px;border:1px solid var(--border);background:var(--card-bg);color:var(--muted);cursor:pointer}
.rowx .act button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.selpop{position:fixed;z-index:80;display:none;gap:3px;align-items:center;background:var(--card-bg);border:1px solid var(--border);border-radius:9px;padding:5px;box-shadow:0 10px 30px -12px rgba(80,50,20,.55)}
.selpop.show{display:flex}
.selpop .sw{width:20px;height:20px;border-radius:50%;border:1px solid rgba(80,50,20,.25);cursor:pointer;padding:0}
.selpop .sw.amber{background:#fbe9c8}.selpop .sw.sage{background:#cfe0c2}.selpop .sw.slate{background:#c3d2e6}
.selpop .sw.clear{background:repeating-linear-gradient(45deg,#fff,#fff 3px,#e9dcc4 3px,#e9dcc4 5px)}
.selpop button.pb{font:600 11px/1 var(--sans);color:var(--muted);background:none;border:0;border-left:1px solid var(--rule-soft);padding:.3rem .55rem;cursor:pointer}
.selpop button.pb:hover{color:var(--accent2)}
.rowx.drifted{display:flex;gap:.6rem;align-items:baseline;font-size:.78rem;color:var(--faint,#8a8580);border:1px dashed var(--border);border-radius:6px;padding:.25rem .6rem;margin:.3rem 0}
.rowx.drifted .act button{background:none;border:1px solid var(--border);border-radius:5px;font-size:.72rem;padding:.05rem .45rem;cursor:pointer;color:inherit;margin-left:.3rem}
.row .trpencil{position:absolute;right:-1.9rem;top:.05rem;width:24px;height:24px;border-radius:6px;border:1px solid var(--border);background:var(--card-bg);color:var(--accent);cursor:pointer;display:none;font-size:12px;padding:0}
.row:hover .trpencil{display:block}
@media(max-width:1100px){.row .trpencil{display:none}}
.authbar{display:flex;align-items:center;gap:.6rem;font:600 .76rem/1 var(--sans);color:var(--muted)}
.authbar .ab-note{font-style:italic;font-weight:400}
.authbar button{font:600 .76rem/1 var(--sans);padding:.4rem .7rem;border-radius:7px;border:1px solid var(--border);background:var(--card-bg);color:var(--accent2);cursor:pointer}
.authbar button:hover{background:var(--highlight)}
.nb-pill{cursor:pointer}
.ab-sync{font:600 .72rem/1 var(--sans)}[hidden]{display:none!important}
/* ---- Notebook drawer: collected highlights · notes · my-translations ---- */
.notebook{position:fixed;top:0;right:0;bottom:0;width:min(430px,94vw);z-index:60;background:var(--card-bg);border-left:1px solid var(--border);box-shadow:-14px 0 48px -26px rgba(80,50,20,.6);transform:translateX(102%);transition:transform .3s var(--ease);display:flex;flex-direction:column}
.notebook.open{transform:none}
.nb-scrim{position:fixed;inset:0;z-index:55;background:rgba(45,41,39,.34);opacity:0;pointer-events:none;transition:opacity .3s}
.nb-scrim.open{opacity:1;pointer-events:auto}
.nb-head{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.1rem;border-bottom:1px solid var(--border);font:italic 1.3rem/1 var(--font-display);color:var(--accent)}
.nb-x{border:1px solid var(--border);background:var(--paper);color:var(--muted);width:28px;height:28px;border-radius:6px;cursor:pointer;font-size:18px;line-height:1;padding:0}
.nb-x:hover{background:var(--highlight);color:var(--accent2)}
.nb-mytr{padding:.55rem 1.1rem;border-bottom:1px solid var(--border);font:.8rem/1.4 var(--font-ui,sans-serif);color:var(--muted)}
.nb-mytr input{accent-color:var(--accent)}
.row .en.mytr{background:color-mix(in oklch,var(--highlight) 55%,transparent);border-radius:6px;padding:.15rem .4rem}
.row .en.mytr::after{content:"my translation";display:block;font:italic .66rem/1 var(--font-display);color:var(--accent-soft);margin-top:.3rem}
.nb-tools{display:flex;flex-wrap:wrap;gap:.5rem;padding:.6rem 1.1rem;border-bottom:1px solid var(--border)}
.nb-tools input{flex:1;font:.85rem/1 var(--font-ui,sans-serif);padding:.45rem .6rem;border:1px solid var(--border);border-radius:7px;background:var(--paper);color:var(--fg)}
.nb-tools button{font:600 .74rem/1 var(--sans);padding:.45rem .7rem;border:1px solid var(--border);border-radius:7px;background:var(--card-bg);color:var(--muted);cursor:pointer}
.nb-tools button:hover{color:var(--accent2);border-color:var(--accent-soft)}
.nb-body{flex:1;overflow-y:auto;padding:.4rem .9rem 2rem}
.nb-sec{font:600 .66rem/1 var(--sans);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:1.2rem .2rem .55rem}
.nb-item{display:block;width:100%;text-align:left;border:1px solid var(--rule-soft);border-radius:9px;background:var(--paper);padding:.6rem .7rem;margin:.45rem 0;cursor:pointer;transition:background .13s,color .13s,border-color .13s,opacity .13s,transform .13s;font:inherit}
.nb-item:hover{border-color:var(--accent-soft);background:var(--highlight)}
.nb-item .nb-ex{font:.92rem/1.5 var(--font-body);color:var(--fg);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.nb-item .nb-mine{font:italic .9rem/1.5 var(--font-body);color:var(--accent2);margin-top:.3rem}
.nb-item .nb-cite{font:.67rem/1.3 var(--sans);color:var(--muted);margin-top:.4rem;letter-spacing:.02em}
.nb-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:.4rem;vertical-align:baseline}
.nb-empty{color:var(--muted);font:italic 1rem/1.65 var(--font-body);padding:1.6rem .4rem}
@media(prefers-reduced-motion:reduce){.notebook{transition:none}}
/* ---- owner review layer (only on /review) ---- */
.rvbar,.rv-edit,.rvsum{display:none}
body.review .folio{position:relative}
body.review .rvbar{display:flex;gap:.4rem;align-items:center;flex-wrap:wrap;margin:.1rem 0 .7rem;padding-bottom:.5rem;border-bottom:1px solid var(--rule-soft);font:600 12px/1 var(--sans)}
.rvbar .fol-n{font:italic 1rem/1 var(--font-display);color:var(--accent);margin-right:.2rem}
.rvbar .st{padding:.28rem .6rem;border-radius:999px;border:1px solid var(--border);color:var(--muted);background:var(--card-bg);text-transform:uppercase;letter-spacing:.05em;font-size:10px}
.rvbar .st.viewed{border-color:var(--accent);color:var(--accent2);background:var(--highlight)}
.rvbar .st.ok{border-color:#2f7d52;color:#fff;background:#2f7d52}
.rvbar .st.needs{border-color:#9a2420;color:#fff;background:#9a2420}
.rvbar .ag{padding:.26rem .55rem;border-radius:999px;border:1px solid var(--accent-soft);color:var(--accent2);background:#f7edd6;font:600 10px/1 var(--sans);letter-spacing:.04em;text-transform:uppercase}
.rvbar button{font:inherit;border:1px solid var(--border);background:var(--card-bg);color:var(--muted);border-radius:7px;padding:.36rem .7rem;cursor:pointer;transition:background .13s,color .13s,border-color .13s,opacity .13s,transform .13s}
.rvbar button:hover{background:var(--highlight);color:var(--accent2);border-color:var(--accent-soft)}
.rvbar button.ok:hover{background:#2f7d52;color:#fff;border-color:#2f7d52}
.rvbar button.needs:hover{background:#9a2420;color:#fff;border-color:#9a2420}
/* owner review toolbar in the page header: marks · review-stack chip · redo-model picker */
#ownerMarks .pb{font:600 .72rem/1 var(--sans);color:var(--muted);background:var(--card-bg);border:1px solid var(--border);border-radius:6px;padding:.34rem .5rem;cursor:pointer}
#ownerMarks .pb:hover{background:var(--highlight);color:var(--accent2);border-color:var(--accent-soft)}
#ownerMarks .nschip{color:#fff;background:#9a2420;border-color:#9a2420}
#ownerMarks .redomodel{max-width:12rem}
.rvbar button.edit{border-color:var(--accent);color:var(--accent)}
.rvbar .grow{flex:1}
.rvbar .msg{color:var(--muted);font-weight:400;font-style:italic}
.rv-edit{grid-template-columns:1fr 1fr;gap:.35rem 2.6rem;margin:.2rem 0 .7rem}
.folio.editing .rv-edit{display:grid}.folio.editing .row,.folio.editing .fmark{display:none}
.rv-edit .lbl{font:600 .64rem/1 var(--sans);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:.2rem 0 .25rem}
.rv-edit textarea{width:100%;min-height:46vh;border:1px solid var(--border);border-radius:9px;padding:.7rem .85rem;
font:15.5px/1.62 var(--font-body);background:var(--card-bg);color:var(--fg);resize:vertical;outline:none}
.rv-edit textarea:focus{border-color:var(--accent)}
.rv-edit textarea.la{font-style:normal}.rv-edit textarea.en{font-style:italic}
.rv-edit .save{grid-column:1/-1;display:flex;gap:.5rem;align-items:center;margin-top:.2rem}
.rv-edit .save button{font:600 12px/1 var(--sans);border-radius:7px;padding:.5rem .9rem;cursor:pointer;border:1px solid var(--border);background:var(--card-bg);color:var(--muted)}
.rv-edit .save button.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.rv-edit .save .kbd{margin-left:auto;font:.7rem/1 var(--sans);color:var(--muted)}
.rv-edit .save .kbd b{font-family:var(--sans);font-weight:700;color:var(--accent2)}
.folio.rv-busy{opacity:.5;pointer-events:none}
body.review .rvsum{display:flex;gap:.8rem;align-items:center;flex-basis:100%;margin-top:.5rem;
font:600 .72rem/1.4 var(--sans);color:var(--muted);flex-wrap:wrap;border-top:1px solid var(--rule-soft);padding-top:.5rem}
.rvsum .pill{display:inline-flex;gap:.3rem;align-items:center}.rvsum b{color:var(--accent2)}
.rvsum .dot{width:9px;height:9px;border-radius:999px;display:inline-block}
.rvsum .tools{margin-left:auto}.rvsum .tools a{color:var(--accent);text-decoration:none;border:1px solid var(--border);border-radius:6px;padding:.3rem .6rem}
.rvsum .tools a:hover{background:var(--highlight)}
/* ---- print: clean single-column scholarly output via window.print() (PLD pattern) ---- */
@media print{
  .ph,.sidebar,.facs,.colgrip,.notebook,.nb-scrim,.rvbanner,.sbt,.fh,.toolbar,.selpop,#prog{display:none!important}
  .app{display:block;height:auto;overflow:visible;padding-top:0}
  .main,.scroll{overflow:visible!important;height:auto!important}
  body{background:#fff;color:#000;font-size:11pt;line-height:1.5}
  .folio{page-break-inside:avoid;border:0;margin:0 0 1.2em}
  .row{display:block}.row .la{color:#333}
  .reading{max-width:100%!important;font-size:11pt!important}
  a{color:#000;text-decoration:none}
  /* REHAUL P8 (2026-08-17): this block is the one that flattens .row to display:block for print
     — the P2 sidenote rail's negative-margin float lives in a bare (untyped) @media(min-width:
     1250px) query, so IF a print layout surface happens to evaluate that wide, its float/padding
     would otherwise survive alongside this block's single-column flatten and misrender. Reset it
     explicitly rather than relying on the two media queries never overlapping. */
  .row>.la,.row>.en{padding-left:0!important;padding-right:0!important}
  .mnp>.mnote{float:none!important;width:auto!important;margin:.25rem 0!important}
}
/* scope chips (corpus search): one tradition + any of PL/PG/PO */
.rscope{display:none;flex-wrap:wrap;gap:.3rem;align-items:center;padding:.35rem .15rem 0;width:100%}
.rscope button{font:600 .68rem/1 var(--sans);letter-spacing:.02em;color:var(--muted);background:transparent;
  border:1px solid var(--border);border-radius:999px;padding:.28rem .6rem;cursor:pointer;transition:color .15s,border-color .15s,background .15s}
.rscope button[aria-pressed=true]{color:#fff;background:var(--accent);border-color:var(--accent)}
.rscope .rsc-sep{width:1px;height:1rem;background:var(--border);margin:0 .25rem}
/* ── MOBILE SHELL (Patrologia Graeca port) — html.g-mobile, <880px ── */
.frthumb{display:none}
html.g-mobile .frthumb{position:fixed;left:0;right:0;bottom:0;z-index:58;display:flex;touch-action:manipulation;
  background:var(--card-bg);border-top:1px solid var(--border);
  box-shadow:0 -6px 24px -12px rgba(42,28,14,.28);
  padding:.25rem max(.4rem,env(safe-area-inset-left)) max(.3rem,env(safe-area-inset-bottom)) max(.4rem,env(safe-area-inset-right))}
html.g-mobile .frthumb button{flex:1;display:flex;flex-direction:column;align-items:center;gap:.14rem;
  border:0;background:none;padding:.42rem .2rem;color:var(--muted);border-radius:10px;cursor:pointer;
  transition:color .15s,transform .15s}
html.g-mobile .frthumb button.on{color:var(--accent)}
html.g-mobile .frthumb button:active{transform:scale(.96)}
html.g-mobile .frthumb .ic{font-size:1.02rem;line-height:1}
html.g-mobile .frthumb .lb{font:600 .6rem/1 var(--sans);letter-spacing:.02em}
html.g-mobile #scroll{padding-bottom:calc(3.6rem + env(safe-area-inset-bottom))}
/* the bar replaces the lane seg + facsimile toggle on phones — one control, thumb reach.
   The "?" keyboard cheat-sheet has no meaning on touch. */
html.g-mobile .ctr .seg.lanes,html.g-mobile #tf,html.g-mobile .aakeys{display:none}
/* phone header = one calm row: home mark + one-line title + Aa. Everything else lives in
   the thumb bar or the Aa menu (mobile-only rows below). */
html.g-mobile .ph{padding:.45rem .7rem;flex-wrap:nowrap;gap:.5rem;transition:transform .28s var(--ease)}
/* iOS-book chrome, ALL the way (owner 2026-07-22 "go all the way"): reading down slides BOTH bars
   away and the page reflows to full bleed — the text glides up into the masthead's space (padding
   transition matches the slide) and runs to the bottom edge under the departed thumb bar. Scroll
   up or tap the prose to bring the chrome back. Safe-area top keeps text out of the notch. */
html.g-mobile.mh-hide .ph{transform:translateY(-108%)}
html.g-mobile .app{transition:padding-top .28s var(--ease)}
html.g-mobile.mh-hide .app{padding-top:env(safe-area-inset-top,0px)}
html.g-mobile .frthumb{transition:transform .28s var(--ease)}
/* The thumb bar leaves with the masthead again (owner 2026-09-17) — the rules are below,
   beside the masthead restyle that used to cancel them. */
html.g-mobile .ph .phl{flex:1;min-width:0}
html.g-mobile .ph .ctr{flex:0 0 auto}
html.g-mobile .ph .phl{align-items:center;gap:.5rem}
html.g-mobile .ph h1{font-size:1.02rem;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
html.g-mobile .ph .sub{font-size:.72rem;margin-top:.05rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
html.g-mobile .ph .phl>div{min-width:0}
html.g-mobile #sbT,html.g-mobile .ctr .pnav,html.g-mobile .ctr .pgjump,
html.g-mobile #rdAbout,html.g-mobile #rdFlow,html.g-mobile #rdRel{display:none}
html.g-mobile #rsBtn{min-width:44px;min-height:40px}   /* ⌕ stays — it is the ONLY door to search AND Ask on a phone (owner 2026-08-01) */
html.g-mobile .aamob{display:flex;flex-wrap:wrap;gap:.35rem;padding:.15rem 0 .35rem;border-bottom:1px solid var(--border);margin-bottom:.3rem}
.aamob{display:none}
.aamob button{font:600 .74rem/1 var(--sans);color:var(--muted);background:var(--card-bg);border:1px solid var(--border);border-radius:999px;padding:.42rem .65rem;cursor:pointer}
.aamob button:active{transform:scale(.96)}
/* ── mobile READING pass: tighter rhythm, quiet apparatus, honest headings ──
   body: 1.6 leading + .5rem paragraph gaps + 94% measure (the 17px default is set in JS) */
html.g-mobile .app.only-en .main{line-height:var(--reading-lh)}
html.g-mobile .app.only-en .row .en p{margin:0 0 .5rem}
html.g-mobile .app.only-en #reading,html.g-mobile .app.only-la #reading{max-width:94%}
/* the per-paragraph Latin reveal: a tiny end-aligned chip, not a field label under an "input" */
html.g-mobile .app.only-en .row[id] .la-rev{align-self:flex-end;font-size:.52rem;letter-spacing:.06em;
  border:1px solid var(--border);border-radius:999px;padding:.14rem .5rem;opacity:.38;margin-top:-.1rem}
/* the apparatus bank: one quiet block — smaller, tighter, hairline rule, muted returns */
html.g-mobile .row.rapp{font-size:.72em;line-height:1.45;margin:0 0 .28rem}
html.g-mobile .row.rapp.fst{margin-top:1.1rem;padding-top:.45rem}
html.g-mobile .row.rapp.fst>div:not(:empty)::before{width:3.2rem;border-top-color:var(--border)}
html.g-mobile .fn-ret{font-size:.68rem;color:var(--muted);opacity:.55}
html.g-mobile .row.rapp sup.fnid{font-size:.78em}
/* section headings: clear step above body, tight rhythm — a heading, not a stray label */
html.g-mobile .row.rhead .csub{font-size:1.12em;line-height:1.25;margin:1.15rem 0 .4rem}
/* page marks recede: smaller chip, tighter band */
html.g-mobile .fmark{margin:1.3rem 0 .6rem}
html.g-mobile .fmark .ff{font-size:.72rem;padding:.1rem .5rem}
html.g-mobile .app.rflow .fmark .ff{font-size:.58rem;opacity:.6;margin:.3rem 0 .1rem}
/* Contents sheet rows reach a thumbable height (they were ~30px/25px) */
html.g-mobile .nav-node{padding-top:.6rem;padding-bottom:.6rem}
html.g-mobile .nav-node.nd2,html.g-mobile .nav-node.nd3,html.g-mobile .nav-node.nd4,html.g-mobile .nav-node.nd5{padding-top:.42rem;padding-bottom:.42rem}
/* Contents drawer on phones: full-width sheet ABOVE the thumb bar; its scroll never chains
   to the text behind (owner 2026-08-02: "scrolling on toc is hard because text bleeds") */
html.g-mobile .sidebar{width:100vw;z-index:60;box-shadow:none}
html.g-mobile .app:not(.nosb) #scroll{overflow:hidden}
#nav{overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
/* dock the Contents sheet ABOVE the thumb bar so its button stays tappable as the exit,
   and the last TOC row is never cut off beneath it (Opus audit P0) */
html.g-mobile .sidebar{bottom:calc(52px + env(safe-area-inset-bottom))}
@media(max-width:720px){input[type=search],input[type=text],input[type=number],#nbSearch,#rsaInput,#rsAskAuth{font-size:16px}}  /* iOS focus-zoom defeat */
.nav-node .nn-t{overflow-wrap:anywhere}
/* the search palette becomes a full sheet on phones; 16px input defeats iOS focus-zoom */
html.g-mobile .rsov .rsp{width:100vw;max-width:none;height:100dvh;max-height:none;border-radius:0;margin:0}
html.g-mobile .rsov{padding:0}
html.g-mobile #rsq{font-size:16px}
html.g-mobile .rsov .rsb{max-height:none;flex:1}
.row.rhead .csub .hen{letter-spacing:.01em}.row.rhead+.row{margin-top:.35rem}.row.rhead .csub{text-wrap:balance}#reading .row.rapp .la,#reading .row.rapp .en{padding-left:1.6em;text-indent:-1.6em}   /* 2026-09-01: a later padding rule left the hanging indent 10px deeper than the padding, hiding the first digit of every note row under the column border (Leibniz p525) */
.row.rapp .la,.row.rapp .en{padding-left:1.6em;text-indent:-1.6em;font-size:.92em;line-height:1.5}.fnlem{font-style:italic;color:var(--muted);margin-right:.35em}.fnsep{color:var(--muted);margin-right:.35em}.apptog{opacity:.85}
/* ── mobile Ask/search sheet overhaul (owner 2026-07-30): full-height sheet, thumbable chips,
   sticky safe-area composer, readable bubbles, no horizontal overflow, convo scrolls above input ── */
html.g-mobile .rsov .rsp{padding-bottom:env(safe-area-inset-bottom)}
html.g-mobile .rsb.askmode{padding:.5rem .65rem calc(.5rem + env(safe-area-inset-bottom));overflow:auto;-webkit-overflow-scrolling:touch}
html.g-mobile .rsa-thread{gap:.75rem;padding:.2rem 0 .4rem}
html.g-mobile .rsa-q{max-width:88%;font-size:.95rem;line-height:1.45}
html.g-mobile .rsa-a{max-width:100%;font-size:.97rem;line-height:1.58;padding:.6rem .7rem;overflow-wrap:anywhere}
html.g-mobile .rsa-a table{display:block;overflow-x:auto;max-width:100%}
html.g-mobile .rsa-a pre{white-space:pre-wrap;overflow-wrap:anywhere}
html.g-mobile .rsa-composer{position:sticky;bottom:0;padding:.5rem 0 calc(.35rem + env(safe-area-inset-bottom));gap:.45rem;background:var(--bg);box-shadow:0 -8px 16px -12px rgba(0,0,0,.25)}
html.g-mobile .rsa-scope{display:flex;flex-wrap:wrap;gap:.4rem .5rem;align-items:center;font-size:.78rem;max-width:100%}
html.g-mobile .rsa-fcs{flex-wrap:wrap;gap:.35rem;margin:0}
html.g-mobile .rsa-fc{padding:.42rem .7rem;font-size:.78rem}
html.g-mobile #rsAskAuth{width:100%;flex:1 1 100%;font-size:16px;padding:.45rem .7rem;margin:0}
html.g-mobile #rsResearch{padding:.42rem .7rem}
html.g-mobile .rsa-box #rsaInput{font-size:16px}
html.g-mobile .rsa-send{width:36px;height:36px}
html.g-mobile .rsa-new{padding:.5rem .6rem}
html.g-mobile .rss button{padding:.5rem .75rem;font-size:.82rem}
html.g-mobile .rsh{flex-wrap:wrap;gap:.4rem}
html.g-mobile .rsx{width:44px;height:44px;font-size:1.15rem}
/* search results: roomier tap targets, no clipped snippets */
html.g-mobile .rsb .hit,html.g-mobile .rsb a{overflow-wrap:anywhere}
html.g-mobile .rsb .hit{padding:.55rem .3rem}
/* citations chips wrap instead of pushing width */
html.g-mobile .rsa-a .cite{margin:.05rem .15rem;vertical-align:baseline}

/* iOS mobile polish (2026-08-15): slim reader chrome on phones */
@media(max-width:560px){
  :root{--sans:-apple-system,BlinkMacSystemFont,"SF Pro Text","Segoe UI",sans-serif}
  .mast,.topbar,header.bar{padding-top:7px!important;padding-bottom:7px!important}
  .fnsheet{border-radius:14px 14px 0 0}
}
/* ═══ READING SURFACE vNext (owner 2026-08-17 'full upgrade… the flattening is
   disgusting'): the parallel page sets like a printed book — justified measure,
   paragraph indents on running text, air around heads, quiet furniture. ALL works. */
@media(min-width:700px){
 #reading .row .la p,#reading .row .en p{text-align:justify;hyphens:auto;-webkit-hyphens:auto}
}
#reading .row .la p,#reading .row .en p{line-height:1.74;text-wrap:pretty;margin:.6em 0}
.app.teiflow .row.prow+.row.prow .la p:first-child,
.app.teiflow .row.prow+.row.prow .en p:first-child{text-indent:1.45em}
.app.teiflow .row.prow .la p,.app.teiflow .row.prow .en p{margin:.3em 0}
#reading .rhead .csub{margin:2.2rem 0 1rem;line-height:1.3}
#reading .rhead .csub .hla,#reading .rhead .csub .hen{font-size:1.14em}
#reading .fmark{opacity:.55}
#reading .fmark:hover{opacity:1}
a.plref{color:var(--accent2);text-decoration:none;border-bottom:1px dotted var(--accent-soft)}
a.plref:hover{color:var(--accent);border-bottom-style:solid}
#volnav{margin:.9rem 0 2rem;border-top:1px solid var(--border);padding-top:.6rem}
.vnhead{display:flex;justify-content:space-between;align-items:baseline;gap:.5rem;font:600 .72rem/1.4 var(--sans);color:var(--accent2);margin:0 0 .35rem;padding:0 .2rem}
.vnhead .vnnav a{color:var(--accent);text-decoration:none;font-weight:600;margin-left:.55rem}
.vnhead .vnnav a:hover{text-decoration:underline}
.vnrow{display:flex;gap:.5rem;align-items:baseline;padding:.28rem .3rem;border-radius:6px;text-decoration:none;color:var(--fg);font:.78rem/1.35 var(--sans)}
.vnrow:hover{background:var(--highlight);text-decoration:none}
.vnrow.vnd1{padding-left:1.35rem;font-size:.86em;opacity:.92}
.vnrow.vnd2{padding-left:2.1rem;font-size:.82em;opacity:.85}
.vnrow.vnd3,.vnrow.vnd4{padding-left:2.8rem;font-size:.8em;opacity:.8}
.vnrow.off{opacity:.45;cursor:default}
.vnrow.vnfm{padding-left:1.35rem;opacity:.6;font-size:.9em}
.vnrow.vnfm .vnc{color:var(--muted)}
@media (pointer:coarse),(max-width:700px){
  .inctoc li a{min-height:44px;padding:.42rem .2rem}
  .inctoc-t,.inctoc-d{min-height:44px;padding:.4em .6em}
  #volnav .vnrow{padding-top:.42rem;padding-bottom:.42rem}
}
.vnrow.on{background:var(--highlight);box-shadow:inset 2px 0 0 var(--accent)}
.vnrow .vnc{flex:0 0 3.4rem;color:var(--accent);font-variant-numeric:tabular-nums;font-size:.7rem;white-space:nowrap}
.vnrow .vnt{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.row.solo{grid-template-columns:1fr!important}.row.solo>.la,.row.solo>.en{max-width:68ch;margin-inline:auto}
.row.soloen,.row.solola{grid-template-columns:1fr!important}
.row.soloen>.la,.row.solola>.en{display:none}
.row.soloen>.en,.row.solola>.la{max-width:68ch;margin-inline:auto}
.row.rapp.soloen>.en,.row.rapp.solola>.la{max-width:none;margin-inline:0}   /* apparatus notes read as a BAND, not centered prose (owner 2026-08-28 screenshot) */
.vnsw{display:flex;align-items:center;flex-wrap:wrap;gap:.35rem .5rem;font:600 .74rem/1.6 var(--sans);color:var(--muted);padding:.2rem .6rem .1rem}.vnsw select.vnsel{min-width:0;max-width:100%;margin:0;color:var(--ink);background:var(--paper,#fff);border:1px solid var(--border);border-radius:3px;padding:.2rem .35rem;font:inherit;font-size:.78rem}
@media(max-width:640px){.vnsw select.vnsel{min-height:44px;flex:1 1 10rem}}
#volnext{margin:2.5rem auto 3rem;max-width:44rem;display:flex;align-items:baseline;gap:.8rem;justify-content:space-between;
 padding:1rem .2rem;border-block:1px solid var(--border);background:transparent}
#volnext .vk{font:600 .74rem/1 var(--sans);color:var(--muted)}
#volnext a{font:600 .95rem/1.3 var(--font-display);color:var(--accent2);text-decoration:none}
#volnext a:hover{color:var(--accent)}
/* VOLUME CONTINUITY (corpus owner 2026-09-26): the band above a work's first folio names the work before it in the
   volume (or the start of the volume), and a PG strip shows the plates of columns no work holds. */
#volprev{margin:.4rem auto 2.2rem;max-width:44rem;display:flex;align-items:baseline;gap:.8rem;justify-content:space-between;flex-wrap:wrap;padding:.8rem .2rem;border-bottom:1px solid var(--border)}
#volprev .vk{font:600 .74rem/1 var(--sans);color:var(--muted)}
#volprev a{font:600 .95rem/1.3 var(--font-display);color:var(--accent2);text-decoration:none}
#volprev a:hover{color:var(--accent)}
.volgap{margin:1.2rem auto;max-width:44rem;text-align:center}
.volgap .vk{display:block;font:600 .72rem/1.4 var(--sans);color:var(--muted);margin-bottom:.5rem}
.volgap .vgrow{display:flex;flex-wrap:wrap;gap:.6rem;justify-content:center}
.volgap .vgrow a{display:flex;flex-direction:column;align-items:center;gap:.25rem;text-decoration:none;color:var(--muted);font:600 .68rem/1 var(--sans)}
.volgap .vgrow img{height:96px;width:auto;border:1px solid var(--border);border-radius:3px;background:var(--facs-mat)}
@media(pointer:coarse){
 .vnrow{padding:.55rem .4rem}
 a.plref,a.xref{padding:.15em .1em}
 a.plref.tapped,a.xref.tapped{background:var(--highlight);border-radius:4px}
}
#srcsel{margin:.2rem 0 .9rem;padding:.5rem .2rem .6rem;border-bottom:1px solid var(--border)}
#srcsel .sshead{font:600 .68rem/1 var(--sans);letter-spacing:.04em;color:var(--muted);margin:0 0 .35rem;padding:0 .2rem}
#srcsel .ssopt{display:block;padding:.3rem .4rem;border-radius:6px;font:.78rem/1.4 var(--sans);color:var(--fg);text-decoration:none}
#srcsel .ssopt:hover{background:var(--highlight);text-decoration:none}
#srcsel .ssopt.on{background:var(--highlight);box-shadow:inset 2px 0 0 var(--accent);font-weight:600}
.po-rtl .la{direction:rtl;text-align:right}
.po-src .row .la,.po-src .stkwrap .stk-la .la{font-family:"Noto Sans Syriac","Noto Naskh Arabic","Noto Sans Coptic","Noto Serif Ethiopic","Noto Serif Armenian","Noto Serif Georgian","Cardo","SF Arabic",var(--font-body);font-size:calc(1.05em * var(--lasz,1));line-height:1.9}
#fimgs{width:100%;padding:.2rem 0}
/* SINGLE-LANE PAGE (owner 2026-08-17 screenshot: text hugging the left with a dead
   gulf beside it): when one lane reads alone, it sets as a centered book page —
   capped measure, centered in whatever width the scan pane leaves. Ends the
   specificity contest between the lane-grid, teiflow, and stack rules. */
.app.only-en #reading .row{display:block}
.app.only-la #reading .row{display:block}
.app.only-en #reading .row .en,.app.only-en #reading .row.rapp .en{max-width:68ch;margin-inline:auto!important}
.app.only-la #reading .row .la,.app.only-la #reading .row.rapp .la{max-width:68ch;margin-inline:auto!important}
.app.only-en #reading .row.rhead .csub,.app.only-la #reading .row.rhead .csub{max-width:68ch;margin-inline:auto}
#srcsel .ssnote{font:.68rem/1.45 var(--sans);color:var(--muted);padding:.35rem .3rem 0}
/* GUIDING DESIGN (owner 2026-08-17): orientation lives in the typography itself —
   section entrances carry a short accent rule (the eye finds every turn of the
   argument), and the masthead's running section head reads like a printed book's. */
/* the accent rule marks a MAJOR section entrance only. On dense head runs (chapter
   indexes: every line is a head) it became visual noise — owner 2026-08-20 Suárez vol 16.
   .hmain = top-level head; .ixh = index run, which never carries it. */
#reading .rhead.hmain .csub::before{content:"";display:block;width:2.2rem;height:1px;
 background:color-mix(in oklab,var(--accent-soft) 70%,transparent);margin:0 0 .5rem}
#reading .rhead.ixh .csub::before,#reading .folio.ixfolio .rhead .csub::before{display:none}
.app.only-en #reading .rhead .csub::before,.app.only-la #reading .rhead .csub::before{margin-inline:auto}
.ph .ploc{font-weight:600;letter-spacing:.04em;text-transform:uppercase;font-size:.66rem;opacity:.92}
@view-transition{navigation:auto}
/* MOBILE READING, JOURNAL-SET (owner 2026-08-17 'like how magazines adapt for
   mobile'): narrow measure reads ragged-right with hyphenation, spaced paragraphs
   instead of indents, the reader's chosen text size, and quiet furniture. */
html.g-mobile #reading .row .la p,html.g-mobile #reading .row .en p{
  text-align:left;hyphens:auto;-webkit-hyphens:auto;text-wrap:pretty;
  font-size:inherit;line-height:var(--reading-lh);margin:.75em 0;text-indent:0!important}
html.g-mobile #reading{padding-inline:20px}
html.g-mobile #reading .rhead .csub{margin:1.9rem 0 .8rem}
html.g-mobile #reading .rhead .csub .hla,html.g-mobile #reading .rhead .csub .hen{font-size:1.22em;line-height:1.28}
html.g-mobile #reading .fmark{opacity:.4}
html.g-mobile .app.only-en #reading .row .en,html.g-mobile .app.only-la #reading .row .la{max-width:none}
/* MOBILE SCAN NAV (owner 2026-08-17 'make scan easy to actually navigate'):
   swipe = page turn, double-tap = zoom toggle, and a page scrubber for long works. */
@media(max-width:880px){
  #fscrub{display:flex;align-items:center;gap:.6rem;padding:.45rem .9rem calc(.45rem + env(safe-area-inset-bottom));
    background:color-mix(in srgb,var(--facs-mat) 88%,transparent);border-top:1px solid var(--border)}
  #fscrub input[type=range]{flex:1;accent-color:var(--accent);min-height:32px}
  #fscrub .fsc-n{font:600 .72rem/1 var(--sans);color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
}
@media(min-width:881px){#fscrub{display:none}}
/* Baronius pass (2026-08-17): caps runs as small caps; tighter flow seams; the flow
   page-pill sits on an opaque chip so the lane rule never strikes through it. */
#reading .capsrun{font-variant:small-caps;text-transform:lowercase;letter-spacing:.035em;font-size:1.02em}
#reading .capsrun.blk{display:block;margin:.7em 0 .55em;line-height:1.45;text-align:left;text-indent:0;text-wrap:balance}
#reading .capsrun.grub{font-variant:normal;text-transform:none;letter-spacing:.05em;font-weight:600}
/* ENGLISH HEADINGS (owner 2026-09-23 "beautiful ... reading"): a section head the canon's English marks rend="heading" (the site's heads)
   opens its paragraph on its own line, set as a heading. Display only: tools/pg_english_tei_rich.py keeps the element a <p>. */
#reading .en .enhead{display:block;margin:.1em 0 .5em;font-weight:600;letter-spacing:.012em;line-height:1.42;text-indent:0;text-wrap:balance}
/* untranslated Latin editorial apparatus (Migne's edition notes): quiet register */
#reading .laonly{font-size:.86em;color:var(--muted);border-left:2px solid var(--rule-soft,#e4dcc8);padding-left:.7rem;margin-top:.55rem}
#reading .laonly p{text-indent:0}
#reading p.monogram{text-align:center;font:600 .82em/1.6 var(--font-display,serif);letter-spacing:.35em;color:var(--muted,#8a7a66);margin:.9em 0 .4em}
.row.redit-hid{display:none}
.editchip{border:0;background:none;color:var(--accent,#a04d2c);cursor:pointer;font:500 .78rem/1 var(--sans,sans-serif);
 margin-left:.7em;padding:.2em .6em;border-radius:999px;box-shadow:0 0 0 1px var(--rule-soft,#e3d9c8)}
.editchip:hover{box-shadow:0 0 0 1px var(--accent,#a04d2c)}
.app.rflow .row{margin-bottom:.6rem}
.app.rflow .fmark .ff{background:var(--bg);z-index:2}
/* ═══ FR-CLASSIC begin (owner 2026-09-04: "classy, academic — Loeb / Portico restraint, aquinas.cc simplicity") ═══
   One scoped layer over the reading chrome, nothing structural: Garamond text with old-style figures; ragged-right
   facing lanes with pretty wrapping (Chromium has no Latin hyphenation, so justified Latin set rivers); book indents;
   small-caps heads centred in their lane with a short Loeb rule under main heads; the printed page as a quiet margin
   folio instead of two pills; a text-button masthead; Loeb red for cues, labels and the running head.
   Escape hatches: <html class="fr-plain"> turns the layer off; <html class="fr-justify"> restores justified lanes. */
html:not(.fr-plain){--font-body:'EB Garamond','Source Serif Pro',Palatino,'Times New Roman',Georgia,serif;--font-display:'EB Garamond','Source Serif Pro',Georgia,serif;
  --reading-lh:1.55}  /* monochrome: the base tokens ARE the reading accents now (2026-09-05 'black white, academic journal') */
html:not(.fr-plain)[data-theme="dark"]{}
html:not(.fr-plain)[data-theme="sepia"]{--accent:#8A2A1E;--accent2:#9D3E2A;--accent-soft:#AB8D55;--highlight:#ECDCC9}
/* "locl" 0: EB Garamond's Latin localisation (lang="la") swaps u→v, "Qvamqvam Pantheismvs" — an inscriptional habit, not a reading one */
html:not(.fr-plain) body,html:not(.fr-plain) .row .la,html:not(.fr-plain) .row .en,html:not(.fr-plain) .row.rhead .csub,html:not(.fr-plain) .row.rapp{font-feature-settings:"kern" 1,"liga" 1,"onum" 1,"pnum" 1,"locl" 0;font-variant-numeric:oldstyle-nums proportional-nums}
html:not(.fr-plain) .row.rhead .csub .hla,html:not(.fr-plain) .row.rhead .csub .hen{font-feature-settings:"kern" 1,"liga" 1,"onum" 1,"locl" 0}
/* the `font:` shorthand RESETS font-feature-settings (spec), so every rule that uses it on a lang="la" subtree silently re-enables
   EB Garamond's Latin u→v localisation ("Qvid et qvotvplex", index leaves 2026-09-04) — pin the Latin lane's features outright */
html:not(.fr-plain) .la,html:not(.fr-plain) .la *,html:not(.fr-plain) [lang="la"],html:not(.fr-plain) [lang="la"] *{font-feature-settings:"kern" 1,"liga" 1,"onum" 1,"pnum" 1,"locl" 0!important}
html:not(.fr-plain) .row .la{border-left-color:var(--rule-soft)!important}
/* facing lanes */
html:not(.fr-plain):not(.fr-justify) #reading .row .la p,html:not(.fr-plain):not(.fr-justify) #reading .row .en p{text-align:start;text-wrap:pretty;hyphens:manual;-webkit-hyphens:manual}
html:not(.fr-plain) .app.teiflow .row.prow .la p,html:not(.fr-plain) .app.teiflow .row.prow .en p{margin:.16rem 0;text-indent:1.3em}
html:not(.fr-plain) .app.teiflow .row.rhead+.row.prow .la p:first-of-type,html:not(.fr-plain) .app.teiflow .row.rhead+.row.prow .en p:first-of-type,
html:not(.fr-plain) .app.teiflow .row.prow:first-child .la p:first-of-type,html:not(.fr-plain) .app.teiflow .row.prow:first-child .en p:first-of-type{text-indent:0}
html:not(.fr-plain) .rl{font-weight:500;font-style:italic;font-variant:normal;color:var(--accent2)}
html:not(.fr-plain) sup.fnref{font-variant-numeric:lining-nums;font-size:.62em;color:var(--accent)}
/* heads: small caps, letterspaced, centred in their lane; a short rule under a main division */
html:not(.fr-plain) .row.rhead .csub{font-family:var(--font-display)}
html:not(.fr-plain) .row.rhead.hpair:not(.ixh) .csub,html:not(.fr-plain) .row.rhead.h2col:not(.ixh) .csub{text-align:center}
html:not(.fr-plain) .row.rhead.hpair:not(.ixh) .csub .hla,html:not(.fr-plain) .row.rhead.hpair:not(.ixh) .csub .hen,html:not(.fr-plain) .row.rhead.h2col:not(.ixh) .csub .hla,html:not(.fr-plain) .row.rhead.h2col:not(.ixh) .csub .hen{font-variant-caps:small-caps;letter-spacing:.045em;line-height:1.32;font-weight:400}
/* index-run heads (a printed contents/tabula leaf): one catalogue line per entry — English, then the Latin small and muted
   after it — never centred display heads stacked lane over lane (Urraburu Psychologia II p.5, owner 2026-09-04) */
html:not(.fr-plain) .row.rhead.ixh .csub,html:not(.fr-plain) .folio.ixfolio .csub,html:not(.fr-plain) .folio.ixfolio .row.rhead.h2col.hmain .csub,html:not(.fr-plain) .folio.ixfolio .row.rhead .csub{display:block;text-align:left;margin:.1rem 0;font:400 .95em/1.4 var(--font-body);color:var(--fg);letter-spacing:0;font-variant-caps:normal;text-transform:none;border:0;padding:0}
html:not(.fr-plain) .row.rhead.ixh .csub .hen,html:not(.fr-plain) .folio.ixfolio .csub .hen,html:not(.fr-plain) .folio.ixfolio .row.rhead .csub .hen{display:inline!important;font-size:1em!important;font-family:var(--font-body)!important;font-style:normal!important;font-weight:400!important;font-variant-caps:normal;letter-spacing:0;text-transform:none;color:var(--fg)}
html:not(.fr-plain) .row.rhead.ixh .csub .hla,html:not(.fr-plain) .folio.ixfolio .csub .hla,html:not(.fr-plain) .folio.ixfolio .row.rhead.h2col .csub .hla,html:not(.fr-plain) .folio.ixfolio .row.rhead .csub .hla{display:inline!important;font-size:.82em!important;font-family:var(--font-body)!important;font-style:italic!important;font-weight:400!important;line-height:1.3;color:var(--muted);margin:0 0 0 .55em;padding:0;border:0!important;background:none;opacity:1;font-variant-caps:normal;letter-spacing:0;text-transform:none}
/* the head spans inherit competing sizes from a dozen head rules (hpair 1em display face, h2col 1em, hmain 1.16em…) — on a printed
   index leaf the compact catalogue size must win outright, hence the !important */
html:not(.fr-plain) .folio.ixfolio .csub.inflow{font:400 .95em/1.4 var(--font-body);margin:.15rem 0;text-transform:none}
html:not(.fr-plain) .folio.ixfolio .csub::after,html:not(.fr-plain) .folio.ixfolio .csub::before,html:not(.fr-plain) .folio.ixfolio .row.rhead.hmain .csub::after{display:none}
html:not(.fr-plain) .row.rhead.ixh .csub .hanchor{display:none}
html:not(.fr-plain) .row.rhead.hmain.ixh .csub::after{display:none}
html:not(.fr-plain) .row.rhead.hmain .csub::after{content:"";display:block;width:2.6rem;margin:.55rem auto 0;border-top:1px solid var(--accent-soft)}
html:not(.fr-plain) .app.teiflow .row.prow+.rhead{margin-top:1.7rem}
html:not(.fr-plain) .csub .hanchor{color:var(--accent-soft)}
/* page marks: the printed page as a margin folio in old-style figures; the scan index only on hover */
html:not(.fr-plain) .fmark .ff,html:not(.fr-plain) .app.teiflow .fmark .ff,html:not(.fr-plain) .app.rflow .fmark .ff{border:0;background:none;padding:0 .2rem;font:italic .92rem/1 var(--font-display);color:var(--fg);font-variant-numeric:oldstyle-nums;opacity:.9}   /* legible at a glance (owner 2026-09-05 "can't see the page numbers") */
html:not(.fr-plain) .fmark .ff:hover,html:not(.fr-plain) .app.rflow .fmark:hover .ff{color:var(--accent);background:none;opacity:1}
html:not(.fr-plain) .app.teiflow .fmark{opacity:1;gap:.7rem}
html:not(.fr-plain) .app.teiflow .fmark .fm,html:not(.fr-plain) .app.rflow .fmark .fm{display:none}
html:not(.fr-plain) .app.teiflow:not(.rflow) .fmark:hover .fm{display:inline-block;font:.62rem/1 var(--sans);letter-spacing:.06em;border:0;color:var(--muted);opacity:.8}
html:not(.fr-plain) .app.teiflow:not(.rflow) .fmark .fr{display:block;flex:1;height:1px;background:var(--rule-soft)}
html:not(.fr-plain) .fmark.titlepage .ff{background:none;color:var(--accent);border:0;font-size:1rem;opacity:1}
/* notes: the foot apparatus two steps under the body */
html:not(.fr-plain) .row.rapp{font-size:.8em;line-height:1.48}
html:not(.fr-plain) .apptog{font:italic .82rem/1 var(--font-display)}
/* masthead: text buttons in small caps, no pills; the running head in Loeb red */
html:not(.fr-plain) .ph{font-family:var(--font-body)}
html:not(.fr-plain) .ph h1{font-family:var(--font-display);font-size:1.14rem;letter-spacing:.004em}
html:not(.fr-plain) .ph .sub{font-family:var(--font-body);font-size:.88rem}
html:not(.fr-plain) .ph .ploc{font-family:var(--font-display);font-variant-caps:all-small-caps;letter-spacing:.09em;font-size:.9rem;color:var(--accent);opacity:1}
html:not(.fr-plain) .ph .seg,html:not(.fr-plain) .ph .tgl,html:not(.fr-plain) .ph .sbt,html:not(.fr-plain) .ph .sld{background:transparent;border-color:var(--rule-soft);box-shadow:none}
html:not(.fr-plain) .ph .seg button,html:not(.fr-plain) .ph .tgl{font-family:var(--font-display);font-variant-caps:all-small-caps;letter-spacing:.08em;font-size:.95rem;color:var(--muted);border-right-color:var(--rule-soft)}
html:not(.fr-plain) .ph .seg button[aria-pressed=true],html:not(.fr-plain) .ph .seg.lanes button[aria-pressed=true]{background:transparent;color:var(--fg);box-shadow:none;text-decoration:underline;text-decoration-color:var(--accent);text-decoration-thickness:1px;text-underline-offset:.3em}
html:not(.fr-plain) .ph #aaBtn{font-variant-caps:normal;letter-spacing:0}
html:not(.fr-plain) .ph .tgl[aria-pressed=true]{background:transparent;color:var(--fg);border-color:transparent}
html:not(.fr-plain) .ph .pgjump{background:transparent;border-color:var(--rule-soft)}
html:not(.fr-plain) .ph .pgjump input,html:not(.fr-plain) .ph .pg-total{font-family:var(--font-display);font-variant-numeric:oldstyle-nums;color:var(--fg)}
html:not(.fr-plain) .ph .mh-home{font-family:var(--font-display);font-variant-caps:all-small-caps;letter-spacing:.1em;font-size:1rem;color:var(--muted)}
/* contents sidebar and the scan pane share the book's face */
html:not(.fr-plain) .sidebar,html:not(.fr-plain) .nav,html:not(.fr-plain) .facs{font-family:var(--font-body)}
/* touch has no hover: keep the scan index reachable, faintly, beside the folio */
@media (hover:none){html:not(.fr-plain) .app.teiflow:not(.rflow) .fmark .fm{display:inline-block;font:.62rem/1 var(--sans);letter-spacing:.06em;border:0;color:var(--muted);opacity:.55}}
/* a head or paragraph that survives in ONE lane keeps the two-column grid and sits in ITS lane — never a centred
   full-width block in the middle of the spread (owner 2026-09-04, Baronius XII p.7 "ANNALES ECCLESIASTICI." at the milestone) */
html:not(.fr-plain) .app:not(.only-en):not(.only-la) .row.soloen:not(.rapp):not(.rcit),html:not(.fr-plain) .app:not(.only-en):not(.only-la) .row.solola:not(.rapp):not(.rcit){grid-template-columns:var(--laf,.88fr) var(--enf,1.12fr)!important}
html:not(.fr-plain) .app:not(.only-en):not(.only-la) .row.soloen:not(.rapp):not(.rcit)>.en{grid-column:2;max-width:none;margin-inline:0}
html:not(.fr-plain) .app:not(.only-en):not(.only-la) .row.solola:not(.rapp):not(.rcit)>.la{grid-column:1;max-width:none;margin-inline:0}
html:not(.fr-plain) .app:not(.only-en):not(.only-la) .row.soloen:not(.rapp):not(.rcit)>.la{display:block;grid-column:1}
html:not(.fr-plain) .app:not(.only-en):not(.only-la) .row.solola:not(.rapp):not(.rcit)>.en{display:block;grid-column:2}
/* a one-lane FALLBACK paragraph (.row.solo) inside a two-lane work sits in its lane too; the centred 68ch column stays only for
   works whose English lane is empty throughout (every row .solo) */
html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading:has(.row.prow:not(.solo)) .row.solo:not(.rapp):not(.rcit):has(>.en:only-child),
html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading:has(.row.prow:not(.solo)) .row.solo:not(.rapp):not(.rcit):has(>.la:only-child){grid-template-columns:var(--laf,.88fr) var(--enf,1.12fr)!important}
html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading:has(.row.prow:not(.solo)) .row.solo:not(.rapp):not(.rcit)>.en:only-child{grid-column:2;max-width:none;margin-inline:0}
html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading:has(.row.prow:not(.solo)) .row.solo:not(.rapp):not(.rcit)>.la:only-child{grid-column:1;max-width:none;margin-inline:0}
/* the inline seam anchor ("p. 30" where a paragraph runs across the leaf) wears the same quiet folio dress */
html:not(.fr-plain) .pganchor,html:not(.fr-plain) .app.rflow .pganchor{border:0;background:none;font:italic .8rem/1 var(--font-display);color:var(--muted);font-variant-numeric:oldstyle-nums;opacity:.75}
/* ═══ FR-CLASSIC end ═══ */
/* ═══ FR-EDITION (2026-09-05, the Fine Press pass): the single reading column sits on a SHEET —
   a paper surface a step lighter than the desk, hairline edge, soft shadow — so the page reads
   as a lit object on the mat, the way the facsimile always has. Scroll continues the sheet. ═══ */
html:not(.fr-plain) .app.only-en #reading,html:not(.fr-plain) .app.only-la #reading{
  background:var(--card-bg);max-width:56rem;margin-inline:auto;border-inline:1px solid var(--rule-soft);
  box-shadow:0 0 0 1px rgb(43 38 32 / .015),0 14px 44px -18px rgb(43 38 32 / .18);
  padding:2.6rem 3.4rem 4rem}
/* the parallel spread sits on the same sheet, cut wider for the two lanes */
html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading{
  background:var(--card-bg);max-width:132ch;margin-inline:auto;border-inline:1px solid var(--rule-soft);
  box-shadow:0 0 0 1px rgb(43 38 32 / .015),0 14px 44px -18px rgb(43 38 32 / .18);
  padding:2.6rem 3rem 4rem}
html:not(.fr-plain) .app.only-en #reading .row .en p{margin:.16rem 0}
html:not(.fr-plain) .app.only-la #reading .row .la p{margin:.16rem 0}
/* ALL THREE (owner 2026-09-05 "parallel always, no stacking"): beside the open scan the two
   lanes STAY side by side — the scan cedes width (33vw not 40vw) and the pair sets a step
   smaller, the pocket-parallel cut of the same page. */
html:not(.fr-plain) .app.teiflow:not(.no-facs):not(.only-en):not(.only-la) #reading{
  background:var(--card-bg);border-inline:1px solid var(--rule-soft);
  box-shadow:0 0 0 1px rgb(28 28 26 / .012),0 14px 44px -18px rgb(28 28 26 / .14);
  padding:2rem 2rem 3.2rem}
html:not(.fr-plain) .app.teiflow:not(.no-facs):not(.only-en):not(.only-la) #reading .row{font-size:.92em}
html:not(.fr-plain) .app.teiflow:not(.no-facs):not(.only-en):not(.only-la) #reading .row .la{padding-right:1.1rem}
.cgptl-float .cgptl-dot{background:var(--card-bg)!important;color:var(--muted)!important;border:1px solid var(--border)!important;border-radius:8px!important;box-shadow:0 2px 10px rgb(0 0 0/.14)!important}
@media(max-width:880px){
  /* phones: the sheet chrome (side borders, 3.4rem padding) wasted a fifth of the viewport —
     the page IS the screen; folios stay in-flow (owner 2026-09-05 "get rid of the margin") */
  html:not(.fr-plain) .app.only-en #reading,html:not(.fr-plain) .app.only-la #reading,
  html:not(.fr-plain) .app.teiflow:not(.no-facs):not(.only-en):not(.only-la) #reading,
  html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading{
    border-inline:0;box-shadow:none;max-width:100%;padding:1rem clamp(.9rem,4vw,1.3rem) 3rem}
}
/* ═══ FR-SPREAD (2026-09-06, owner on Ebel Opera philosophica p10: "i dont want stacking of source and
   english in the reader … the margins on the side are too loud … increase the width the text can occupy
   while making page numbers quiet"):
   1. the title leaf keeps its two lanes SIDE BY SIDE like every other leaf — the centred 60ch stack
      (.folio.titlepage .row above) survives only when a single lane is shown, and on phones (whose
      head rows are 1fr by their own rule);
   2. the parallel sheet is cut to the window (148ch cap = both lanes at their 74ch measure, 1.25rem of desk each side) and the row fills
      it — the inner 126ch box that left a third of the sheet empty is gone; phones keep their own rule;
   3. folios are a small muted italic in the gutter, and the title-page mark wears the same dress as
      the rest (no accent fill, no rule line, no "title page" tag). ═══ */
@media(min-width:881px){
  .app:not(.only-en):not(.only-la) .folio.titlepage .row{grid-template-columns:var(--laf,.88fr) var(--enf,1.12fr);max-width:none;margin-left:0;margin-right:0}
  .app:not(.only-en):not(.only-la) .folio.titlepage p{text-align:left}
  /* paired title heads: the Latin span (.hla, display face, caps untouched) sat a size up from the English small caps
     beside it (Poinsot t.7-2 p3) — on the title leaf both lanes take the h3's own register */
  .app:not(.only-en):not(.only-la) .folio.titlepage .row.rhead.hpair .csub .hla{font:inherit;font-size:1em;line-height:inherit;text-transform:inherit;font-variant:inherit;letter-spacing:inherit;color:inherit}
  html:not(.fr-plain) .app:not(.only-en):not(.only-la) #reading{max-width:min(100% - 2.5rem,148ch);padding:2.6rem 3.6rem 4rem}
  .app.rflow:not(.only-en):not(.only-la) #reading .row,.app.rflow:not(.only-en):not(.only-la) #reading .inctoc{max-width:none;margin-left:0;margin-right:0}
}
html:not(.fr-plain) .fmark .ff,html:not(.fr-plain) .app.teiflow .fmark .ff,html:not(.fr-plain) .app.rflow .fmark .ff{font:italic .78rem/1 var(--font-display);color:var(--muted);opacity:.72}
html:not(.fr-plain) .app.rflow .fmark .ff{right:calc(100% + .8rem)}
html:not(.fr-plain) .app.rflow .fmark.titlepage{margin:0;height:0}
html:not(.fr-plain) .app.rflow .fmark.titlepage .ff{position:absolute;background:none;border:0;color:var(--muted);font-size:.78rem;opacity:.72}
html:not(.fr-plain) .app.rflow .fmark.titlepage .fr,html:not(.fr-plain) .app.rflow .fmark.titlepage .fm{display:none}
html[data-theme="dark"] .app.rflow .fmark.titlepage .ff{color:var(--muted)}
/* ═══ FR-SPREAD end ═══ */
/* ═══ FR-EDITION end ═══ */

/* Reader masthead: identity, citation, and primary reading controls. */
html:not(.fr-plain) .ph.fr-reader-head{padding:10px 24px;gap:24px;background:var(--bg);border-bottom:1px solid var(--border);box-shadow:none;transition:transform .28s var(--ease)}
/* ── Reading, uninterrupted ───────────────────────────────────────────────────
   Ported from the corpus site, where the same two declarations that used to end
   this rule — transform:none;transition:none — were the reason the hide never
   moved anything. The engine has driven it since 2026-07-22: down past 90px adds
   mh-hide on a phone or mh-mini on a desktop, up 24px takes them off, a tap on
   the prose toggles them. The thumb bar was held back on 2026-08-02 as the only
   door to Search and Contents on a phone; the owner asked for it on 2026-09-17,
   and that door is still one scroll-up or one tap away.

   No will-change: .ph carries backdrop-filter, and promoting a blurred fixed bar
   to its own layer is where Safari drops the blur. This site's own masthead sits
   above the reader bar, so faith-port-reader-skin.css adds the extra offset the
   bar needs to clear it; everything else is this file's. */
html.g-mobile.mh-hide .frthumb{transform:translateY(101%)}
html.mh-mini .ph.fr-reader-head{transform:translateY(-101%)}
/* The page is held below the bar by .app's own padding, so on a desktop the
   departing bar uncovered its height in bare ground instead of the text it had
   been covering. The phone rule above has always given that padding back; this
   is the other half of it. On this site the skin restates both, because our own
   masthead pads the body as well and the two have to leave together. */
html .app{transition:padding-top .28s var(--ease)}
html.mh-mini .app{padding-top:0}
@media(prefers-reduced-motion:reduce){
 html:not(.fr-plain) .ph.fr-reader-head{transition:none}
 html.g-mobile .frthumb,html .app{transition:none}
}
html:not(.fr-plain) .fr-reader-head .phl{align-items:center;gap:12px;flex:1;min-width:0}
html:not(.fr-plain) .fr-reader-head .reader-identity{display:block;min-width:0;flex:1}
html:not(.fr-plain) .fr-reader-head h1{font-size:20px;line-height:1.25;letter-spacing:0;min-width:0;max-width:100%;margin:0;font-variant:normal}
html:not(.fr-plain) .fr-reader-head .sub,html:not(.fr-plain) .fr-reader-head .ploc{display:none}
html:not(.fr-plain) .fr-reader-head .reader-reference{display:flex;align-items:center;gap:0 8px;min-width:0;margin-top:3px;font:12px/1.5 var(--font-body);color:var(--muted);font-variant-numeric:tabular-nums}
.reader-reference a{color:inherit;text-decoration:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;min-width:0}.reader-reference a:hover{text-decoration:underline}.reader-reference span{white-space:nowrap;flex:none}.reader-reference span:empty{display:none}
html:not(.fr-plain) .fr-reader-head #reader-location{background:none;border:0;border-left:1px solid var(--border);padding:0 0 0 8px;min-height:24px;border-radius:0;color:var(--muted);font:inherit;white-space:nowrap;flex:none;cursor:pointer}
html:not(.fr-plain) .fr-reader-head .mh-home{display:inline-flex;align-items:center;gap:2px;min-height:44px;min-width:44px;padding:0;color:var(--muted);font:13px var(--font-body);letter-spacing:0;text-decoration:none;flex:none}
html:not(.fr-plain) .fr-reader-head .mh-home:hover{color:var(--fg)}
html:not(.fr-plain) .fr-reader-head .ctr{gap:10px;flex-wrap:nowrap}
html:not(.fr-plain) .fr-reader-head .ctr>.seg{border:0;box-shadow:none;border-radius:0;gap:2px}
html:not(.fr-plain) .fr-reader-head .seg button,html:not(.fr-plain) .fr-reader-head .tgl,html:not(.fr-plain) .fr-reader-head .sbt{font:14px/1 var(--font-body);font-variant:normal;letter-spacing:0;min-height:40px;min-width:40px;border:0;border-radius:6px;color:var(--muted);padding:0 10px;background:none}
html:not(.fr-plain) .fr-reader-head .seg button[aria-pressed=true]{background:var(--hl);color:var(--fg);text-decoration:none}
html:not(.fr-plain) .fr-reader-head .seg button:hover,html:not(.fr-plain) .fr-reader-head .tgl:hover{background:var(--hl);color:var(--fg)}
html:not(.fr-plain) .fr-reader-head .seg.pnav{gap:0;margin-right:-10px}
html:not(.fr-plain) .fr-reader-head .pnav button{min-width:30px;padding:0 5px;font-size:22px}
html:not(.fr-plain) .fr-reader-head .pgjump{padding:0 12px 0 2px;border-right:1px solid var(--border)!important}
html:not(.fr-plain) .fr-reader-head .pgjump input{width:5ch;min-height:36px;font:13px var(--font-body);font-variant-numeric:tabular-nums;border:0;border-radius:4px;background:var(--card);color:var(--fg)}
html:not(.fr-plain) .fr-reader-head .pg-total{font:12px var(--font-body);font-variant-numeric:tabular-nums}
html:not(.fr-plain) .fr-reader-head #rdAbout,html:not(.fr-plain) .fr-reader-head .ctr>#rdFlow,html:not(.fr-plain) .fr-reader-head .ctr>#rdRel{display:none}
html:not(.fr-plain) .fr-reader-head #rsBtn{order:2;min-width:40px;min-height:40px;border:0;border-radius:6px}
html:not(.fr-plain) .fr-reader-head .aaw{order:3}
html:not(.fr-plain) .fr-reader-head #aaBtn{font-size:17px;letter-spacing:0;min-height:44px;min-width:44px}
html:not(.fr-plain) .fr-reader-head .aapop{width:min(340px,calc(100vw - 24px));max-height:calc(100dvh - var(--phh) - 24px);overflow:auto;padding:18px;background:var(--card);border:1px solid var(--border);border-radius:10px;box-shadow:0 12px 40px #0002;color:var(--fg)}
html:not(.fr-plain) .fr-reader-head .aamob{display:flex;flex-wrap:wrap;gap:6px;border-bottom:1px solid var(--border);padding-bottom:12px;margin-bottom:12px}
html:not(.fr-plain) .fr-reader-head .aamob button,.reader-jump-form button,.reader-witnesses button{border:1px solid var(--border);background:none;color:var(--fg);border-radius:5px;padding:8px 10px;font:13px var(--font-body);min-height:40px;cursor:pointer}
.reader-jump-form{margin:0 0 14px}.reader-jump-form label,.reader-witnesses>span{display:block;font:13px/1.5 var(--font-body);margin-bottom:6px;color:var(--muted)}.reader-jump-form>div{display:flex;gap:8px}.reader-jump-form input{width:0;min-width:0;flex:1;min-height:40px;border:1px solid var(--border);background:var(--bg);color:var(--fg);border-radius:5px;padding:6px 10px;font:16px var(--font-body)}.reader-jump-form p{font:12px/1.5 var(--font-body);color:var(--muted);margin:5px 0}.reader-jump-form p:empty{display:none}.reader-witnesses{border-top:1px solid var(--border);padding-top:12px;margin-top:12px}.reader-witnesses>div{display:flex;flex-wrap:wrap;gap:6px}.reader-witnesses button[aria-pressed=true]{background:var(--fg);color:var(--bg)}
/* THE SOURCE ROW BELONGS TO THE MASTHEAD, NOT THE Aa MENU. A Migne Greek volume prints
   two columns, Greek and its facing Latin, and which of them you are reading is the first
   thing about the page — the corpus site puts Greek | Latin | Greek · Latin in the reader
   bar on its own wrapped row, and this port had buried the same three buttons inside the
   Aa popover, where nothing showed them. These six rules are that row, ported with it. */
html:not(.fr-plain) .ph.fr-reader-head:has(>.reader-witnesses){flex-wrap:wrap!important}
.fr-reader-head>.reader-witnesses{display:flex;align-items:center;flex-basis:100%;gap:8px;width:100%;margin:4px 0 0;padding:6px 0 0}
.fr-reader-head>.reader-witnesses>span{margin:0;color:var(--muted);font-size:12px}
.fr-reader-head>.reader-witnesses>div{gap:6px}
.fr-reader-head>.reader-witnesses button{min-height:44px;font-size:13px;padding:7px 10px}
.fr-reader-head>.reader-witnesses button:focus-visible{outline:2px solid var(--fg);outline-offset:2px}
html:not(.fr-plain) .fr-reader-head :focus-visible{outline:2px solid var(--fg);outline-offset:3px}
@media(min-width:881px) and (max-width:1180px){html:not(.fr-plain) .ph.fr-reader-head{gap:12px;padding-inline:16px}.fr-reader-head .mh-home span{display:none}html:not(.fr-plain) .fr-reader-head .ctr{gap:6px}html:not(.fr-plain) .fr-reader-head .seg button{padding-inline:7px}html:not(.fr-plain) .fr-reader-head h1{font-size:18px}}
@media(max-width:880px){
 html.g-mobile:not(.fr-plain) .ph.fr-reader-head{padding:7px max(10px,env(safe-area-inset-right)) 7px max(6px,env(safe-area-inset-left));gap:6px;flex-wrap:nowrap}
 html.g-mobile:not(.fr-plain) .fr-reader-head .phl{gap:3px}
 html.g-mobile:not(.fr-plain) .fr-reader-head h1{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;white-space:normal;font-size:18px;line-height:1.18;max-height:2.36em;overflow:hidden}
 html.g-mobile:not(.fr-plain) .fr-reader-head .reader-reference{font-size:12px;gap:6px;margin-top:2px}
 html.g-mobile:not(.fr-plain) .fr-reader-head .mh-home{width:44px;min-width:44px;min-height:44px;justify-content:center}
 html.g-mobile:not(.fr-plain) .fr-reader-head .mh-home span,html.g-mobile:not(.fr-plain) .fr-reader-head #rsBtn,html.g-mobile:not(.fr-plain) .fr-reader-head .seg{display:none}
 html.g-mobile:not(.fr-plain) .fr-reader-head .ctr{gap:0}
 html.g-mobile:not(.fr-plain) .fr-reader-head #reader-location{min-height:24px;padding-left:6px}
 html.g-mobile:not(.fr-plain) .fr-reader-head .aapop{right:0}
 html.g-mobile:not(.fr-plain) .fr-reader-head .aapop .seg{display:flex}
}

/* Settings retain the same readable controls on a phone. */
html:not(.fr-plain) .fr-reader-head #reader-witnesses button[aria-pressed=true]{color:var(--bg);background:var(--fg);box-shadow:none}
html:not(.fr-plain) .fr-reader-head .aapop .sld.szc,
html:not(.fr-plain) .fr-reader-head .aapop .sld.izc,
html:not(.fr-plain) .fr-reader-head .aapop .sld.lnz{display:inline-flex;min-height:40px;border:0;padding:0;background:none}
html:not(.fr-plain) .fr-reader-head .aapop .sld input[type=range]{min-height:40px;max-width:100%;accent-color:var(--fg)}
html:not(.fr-plain) .fr-reader-head .aapop .szc button{min-width:32px;min-height:40px}
@media(max-width:640px){
 /* Present each existing PG pair in full-width reading order; preserve the TEI rows. */
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .row,
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .row.seg .sp{grid-template-columns:minmax(0,1fr);gap:12px}
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) #reading{font-size:var(--rdszm,17px)!important}
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .row .la,
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .row .en{padding-inline:0;border-left:0;min-width:0;overflow-wrap:break-word}
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .row:not(.rhead)>.la::before,
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .sp>.la::before{content:var(--source-label,"Greek");display:block;color:var(--muted);font:12px/1.5 var(--font-body);margin:8px 0}
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .row:not(.rhead)>.en::before,
 html:not(.fr-plain) .app.grcwork:not(.only-en):not(.only-la) .sp>.en::before{content:"English";display:block;color:var(--muted);font:12px/1.5 var(--font-body);margin:8px 0}
}
/* Research follows the book: one side rail, with explicit passage tools. */
html.fr-research-tools .selchip{display:none!important}
.nb-image-preview{margin:20px 0;border-top:1px solid var(--border);padding-top:14px}.nb-image-preview figcaption{font:13px var(--font-body);margin-bottom:10px;color:var(--muted)}.nb-image-preview img{display:block;width:100%;height:auto;border:1px solid var(--border);box-sizing:border-box}.nb-image-preview a{display:inline-flex;align-items:center;min-height:44px;font:13px var(--font-body);color:var(--fg);text-decoration:underline;text-underline-offset:4px}
:root{--fr-rail-width:clamp(390px,34vw,500px)}
#nbCount{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:0 10px;border:0;border-radius:5px;background:none;color:var(--fg);font:14px var(--font-body);white-space:nowrap;cursor:pointer}
#nbCount:hover,#nbCount[aria-expanded="true"]{background:var(--hl)}
#notebook{z-index:10020;box-sizing:border-box;width:min(100%,440px);background:var(--card);color:var(--fg);box-shadow:none;transition:transform .18s ease-out;overflow:hidden}
#notebook [hidden]{display:none!important}
#findbar .findmeta{display:flex;align-items:center;flex-wrap:wrap;gap:2px 12px}
#findbar #findWholeWork{width:auto;height:auto;min-height:44px;padding:4px 0;margin-left:auto;border:0;background:none;color:var(--fg);font:12px/1.4 var(--font-ui);white-space:nowrap;text-decoration:underline;text-underline-offset:3px}
/* The rail names its subject. The work's title is at the top of the reading
   pane on a desktop, but below 1100px the panel is the whole screen and the
   book is not on it, so the reader arrives at five tabs of apparatus with
   nothing saying what they are apparatus FOR. A work's own name is the one
   place the display face belongs, and it is the only display face left in
   this panel. Both lines collapse when empty rather than holding open the
   default h2 margin, which is what left a 60px hole above the buttons. */
#notebook .nb-work-identity{margin:0 0 16px}
#notebook .nb-work-identity h2{margin:0 0 3px;font:500 20px/1.25 var(--font-display);color:var(--fg);overflow-wrap:anywhere}
#notebook .nb-work-identity p{margin:0;font:13px/1.5 var(--font-body);color:var(--muted);overflow-wrap:anywhere}
#notebook .nb-work-identity :is(h2,p):empty{display:none}
/* The analysis fold is the fifth section of the same list, and only its own
   stylesheet knew that: .wrs-section carries a rule above it and a 17px label,
   .nb-analysis-fold carried neither, so "Summaries and analysis" read as a
   stray line hanging off the bottom of "Sources cited". */
#notebook .nb-analysis-fold{border-top:1px solid var(--border);margin-top:12px}
#notebook .nb-analysis-fold>summary{min-height:56px;padding:16px 0;font:17px/1.45 var(--font-body);color:var(--fg)}
#notebook .nb-reading-place{padding:0 0 18px;margin-bottom:18px;border-bottom:1px solid var(--border)}
#notebook .nb-reading-place>div{display:flex;gap:12px;flex-wrap:wrap}
#notebook .nb-reading-place button{min-height:44px;padding:8px 12px;border:1px solid var(--border);border-radius:5px;background:var(--card);color:var(--fg);font:14px var(--font-body);cursor:pointer}
#notebook .nb-reading-place #nbSaveReadingPlace{background:var(--fg);color:var(--bg);border-color:var(--fg)}
#notebook .nb-reading-place p{margin:8px 0 0;font:12px/1.6 var(--font-body);color:var(--muted)}
/* IM Fell is the library's voice for a title page and for a work's own name. It
   is not the voice of a tool, and this panel is a place to work. Ian ruled on
   exactly this once already, on the Ask workspace: "Can we not use IM Fell
   anywhere here?" The size comes DOWN with the swap, because 22px of IM Fell and
   22px of Source Serif are not the same amount of ink. */
#notebook .nb-head{min-height:58px;box-sizing:border-box;padding:10px 18px;font:18px/1.3 var(--font-body);color:var(--fg)}
#notebook .nb-x{width:40px;height:40px;background:none;border:0;font:24px var(--font-body)}
.nb-tabs{display:flex;gap:18px;flex:none;padding:0 18px;border-bottom:1px solid var(--border)}
.nb-tabs button{min-height:44px;border:0;border-bottom:2px solid transparent;background:none;font:13px var(--font-body);color:var(--muted);padding:6px 0;cursor:pointer}
.nb-tabs button[aria-selected="true"]{color:var(--fg);border-bottom-color:var(--fg)}
.nb-tabs span{font-variant-numeric:tabular-nums}
.nb-panel{min-height:0;flex:1;overflow:auto;padding:18px;font:15px/1.65 var(--font-body)}
.nb-guidance{color:var(--muted);font:14px/1.6 var(--font-body);margin:0 0 18px}
.nb-guidance:empty{display:none}
.nb-context-label{color:var(--muted);font:12px/1.6 var(--font-body);margin:0 0 12px;overflow-wrap:anywhere}
#nbSelectionText{margin:0 0 20px;padding:0;font:18px/1.65 var(--font-body);max-height:12em;overflow:auto;white-space:pre-wrap}
/* .nb-work-primary joins this rule rather than getting one of its own. The Work
   tab's four shortcuts and the Passage tab's four actions are the same kind of
   thing one tab apart, and two look-alike rules drift. */
.nb-passage-actions,.nb-work-primary{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:12px 0 20px}
.nb-passage-actions button,.nb-work-primary button,.nb-book-ask{min-height:44px;padding:10px 12px;border:1px solid var(--border);border-radius:5px;background:none;font:13px/1.4 var(--font-body);color:var(--fg);text-align:left;cursor:pointer}
.nb-passage-actions button:hover,.nb-work-primary button:hover,.nb-book-ask:hover{background:var(--hl);border-color:var(--muted)}
.nb-book-ask{display:block;width:100%;margin:16px 0}
.nb-highlight-colors{padding:0;border:0;margin:18px 0;display:flex;flex-wrap:wrap;gap:6px}
.nb-highlight-colors legend{font:12px var(--font-body);color:var(--muted);margin-bottom:10px}
.nb-highlight-colors button{min-height:40px;padding:6px 10px;border:1px solid var(--border);border-radius:4px;background:none;color:var(--fg);font:12px var(--font-body);cursor:pointer}
.nb-highlight-colors button[data-reader-color="amber"]{background:var(--mark-amber)}
.nb-highlight-colors button[data-reader-color="sage"]{background:var(--mark-sage)}
.nb-highlight-colors button[data-reader-color="slate"]{background:var(--mark-slate)}
.nb-more{border-top:1px solid var(--border);padding-top:6px}
.nb-more>summary,.nb-settings>summary,.nb-conversation-group>summary{min-height:44px;box-sizing:border-box;padding:12px 0;cursor:pointer;color:var(--muted);font:13px/1.5 var(--font-body)}
/* ONE WAY TO OPEN A THING. The panel had two disclosure idioms in a single
   scroll: work-research.css gives .wr-group a rotating '›' and hides the native
   marker, while .wrs-section, .wrs-group, .nb-analysis-fold, .nb-more and
   .nb-settings kept the browser's black ▶. Scrolling the Work tab, "Topics in
   this work" and "Sources cited" opened one way and the analysis beneath them
   another. Stated once here at (1,1,1) so it outranks .wr-group's own (0,2,1)
   and every summary in the rail opens the same way. */
#notebook details>summary{display:flex;align-items:center;gap:10px;list-style:none}
#notebook details>summary::-webkit-details-marker{display:none}
#notebook details>summary::before{content:'\203A';flex:none;width:10px;font:20px/1 var(--font-body);color:var(--detail,var(--muted));transition:transform .15s}
#notebook details[open]>summary::before{transform:rotate(90deg)}
@media(prefers-reduced-motion:reduce){#notebook details>summary::before{transition:none}}
#nbSaved{display:flex;flex-direction:column;overflow:hidden}
#nbSearch{box-sizing:border-box;width:100%;min-height:44px;flex:none;padding:8px 10px;border:1px solid var(--border);border-radius:5px;background:var(--bg);color:var(--fg);font:16px var(--font-body);margin-bottom:10px}
#nbSearch::placeholder{color:var(--muted)}
#nbBody{padding:0;min-height:0}
#nbBody .nb-desk-link{display:none}
#nbBody .nb-sec{font:14px/1.5 var(--font-body);color:var(--fg);letter-spacing:0;text-transform:none;margin:20px 0 8px}
#notebook .nb-item{border:0;border-top:1px solid var(--border);border-radius:0;background:none;padding:14px 0;margin:0;cursor:default}
#notebook .nb-item:hover{background:none}
.nb-open{border:0;background:none;color:var(--fg);padding:0;text-align:left;width:100%;font:inherit;cursor:pointer}
#notebook .nb-ex{font:15px/1.65 var(--font-body)}
#notebook .nb-mine{display:block;font:15px/1.6 var(--font-body);color:var(--fg);margin:8px 0}
#notebook .nb-cite{display:block;font:12px/1.55 var(--font-body);color:var(--muted);letter-spacing:0;margin-top:6px}
.nb-item-actions{display:flex;gap:18px;flex-wrap:wrap;margin-top:5px}
.nb-item-actions button{min-height:40px;padding:6px 0;border:0;background:none;font:12px var(--font-body);color:var(--fg);text-decoration:underline;text-underline-offset:4px;cursor:pointer}
.nb-conversation-group{border-top:1px solid var(--border)}
.nb-saved-group{border-top:1px solid var(--border);margin-top:10px}.nb-saved-group>summary{min-height:44px;padding:12px 0;font:14px/1.5 var(--font-body);color:var(--fg);cursor:pointer;box-sizing:border-box}
.nb-chat{display:flex;flex-direction:column;gap:5px;width:100%;min-height:60px;padding:12px 0;text-align:left;background:none;border:0;border-bottom:1px solid var(--border);font:15px/1.5 var(--font-body);color:var(--fg);cursor:pointer}
.nb-chat:hover{text-decoration:underline;text-underline-offset:3px}.nb-chat small{font:12px/1.4 var(--font-body);color:var(--muted)}
.nb-settings{flex:none;border-top:1px solid var(--border);padding:0 18px;max-height:40%;overflow:auto}
.nb-settings .nb-mytr{padding:12px 0;font:13px/1.55 var(--font-body)}
.nb-settings .nb-tools{padding:12px 0;border:0}.nb-settings .nb-tools button{min-height:40px;font:12px var(--font-body);background:none}
.nb-destinations{display:flex;gap:22px;flex:none;padding:8px 18px max(8px,env(safe-area-inset-bottom));border-top:1px solid var(--border)}
.nb-destinations a{display:flex;align-items:center;min-height:40px;font:13px var(--font-body);color:var(--fg);text-decoration:underline;text-underline-offset:4px}
#notebook :is(button,a,input,summary):focus-visible{outline:2px solid var(--fg);outline-offset:2px}
#selpop{z-index:12000;max-width:calc(100vw - 16px);padding:4px;gap:2px;box-sizing:border-box;border:1px solid var(--border);border-radius:8px;background:var(--card);box-shadow:none}
#selpop [hidden]{display:none!important}
#selpop button.pb,#selpop button.sw{width:auto;min-width:44px;min-height:40px;padding:8px 10px;border:0;border-radius:4px;background:none;font:13px/1.4 var(--font-body);color:var(--fg)}
#selpop .sw.amber{background:var(--mark-amber)}
#selpop button:hover{background:var(--hl)}
@media(min-width:1100px){
 html:is(.fr-research-docked,.fra-docked) #app{width:calc(100% - var(--fr-rail-width))}
 html:is(.fr-research-docked,.fra-docked) #scroll{min-width:0}
 html:is(.fr-research-docked,.fra-docked):not(.fr-plain) #reading{max-width:100%;box-sizing:border-box;padding-inline:28px}
 html.fr-research-docked #notebook{top:var(--phh,64px);width:var(--fr-rail-width)}
 html.fr-research-docked #nbScrim{display:none}
 html.fr-research-docked:not(.fr-plain) .ph.fr-reader-head:has(#aaPop.on){z-index:10030}
 html.fr-research-docked #fra-launcher{right:calc(var(--fr-rail-width) + 16px)}
}
@media(max-width:880px){
 #notebook{width:100%;height:100dvh}.nb-tabs{gap:22px}.nb-panel{padding:16px}
 html.g-mobile #nbCount{display:none!important}
 #selpop{left:8px!important;right:8px;top:auto!important;bottom:calc(70px + env(safe-area-inset-bottom));justify-content:space-between}
 #selpop button.pb,#selpop button.sw{min-height:44px;padding:8px}
 .nb-highlight-colors button,.nb-item-actions button{min-height:44px}
}
@media(prefers-reduced-motion:reduce){#notebook{transition:none}}

/* Current-work results share the Research rail and its mobile sheet. */
#notebook .nb-tabs{gap:16px;overflow-x:auto;scrollbar-width:thin}#notebook .nb-tabs button{flex:none;white-space:nowrap}
#notebook #nbWorkSearch{padding-top:0}
#notebook .nb-work-search-controls{position:sticky;top:0;z-index:2;background:var(--card);padding-top:16px;padding-bottom:4px;border-bottom:1px solid var(--border);margin-bottom:12px}
#notebook .nb-work-search-form{margin:0 0 8px}#notebook .nb-work-search-form label{display:block;margin-bottom:8px;font:15px/1.5 var(--font-body)}
#notebook .nb-work-search-form>div{display:flex;gap:8px}#notebook .nb-work-search-form input{box-sizing:border-box;min-width:0;width:0;flex:1;min-height:44px;padding:8px 10px;border:1px solid var(--border);border-radius:5px;background:var(--bg);color:var(--fg);font:16px var(--font-body)}
#notebook .nb-work-search-form button{flex:none;min-height:44px;padding:8px 10px;border:1px solid var(--border);border-radius:5px;background:var(--fg);color:var(--bg);font:13px var(--font-body);cursor:pointer}
#notebook .nb-work-search-tools{display:flex;gap:20px;flex-wrap:wrap;margin:0 0 12px}#notebook .nb-work-search-tools :is(button,a){display:inline-flex;align-items:center;min-height:44px;padding:4px 0;border:0;background:none;color:var(--fg);font:13px var(--font-body);text-decoration:underline;text-underline-offset:4px;cursor:pointer}
#notebook .nb-work-search-hit{display:flex;flex-direction:column;gap:7px;box-sizing:border-box;width:100%;min-height:44px;padding:14px 0;text-align:left;background:none;border:0;border-top:1px solid var(--border);color:var(--fg);font:15px/1.6 var(--font-body);cursor:pointer;overflow-wrap:anywhere}
#notebook .nb-work-search-hit>span:first-child{font:12px/1.5 var(--font-body);color:var(--muted)}#notebook .nb-work-search-hit:hover,#notebook .nb-work-search-hit[aria-current="location"]{background:var(--hl)}
#notebook .nb-work-search-hit mark{background:var(--fg);color:var(--bg);padding:0 1px}#notebook #nbWorkSearchStatus{font-size:12px;line-height:1.6}

.conf-contents{padding:8px 0}.cc-label{display:block;font:13px/1.5 var(--font-body);color:var(--muted)}
.cc-search{box-sizing:border-box;width:100%;min-height:44px;margin-top:6px;padding:9px 10px;border:1px solid var(--border);background:var(--card);color:var(--fg);border-radius:4px;font:16px var(--font-body)}
.cc-search::placeholder{color:var(--muted);opacity:1}.cc-count{font:12px var(--font-body);color:var(--muted);margin:10px 0}.cc-list .nav-node{display:block;min-height:44px;box-sizing:border-box;text-decoration:none;color:var(--fg);padding:10px 8px;border-bottom:1px solid var(--border);font-size:14px;line-height:1.45}.cc-list .nd2{padding-left:18px}.cc-list a:focus-visible{outline:2px solid var(--fg);outline-offset:-2px}
.nl-retry{font:inherit;color:var(--fg);background:none;border:1px solid var(--border);border-radius:4px;min-height:44px;padding:8px 12px;margin:8px}.nl-q{font-size:16px!important}

/* The volume list reads as a sequence. The number is the volume's own order, the
   range the columns Migne gave the piece; nine of PL 140's forty-six carry no
   range, and without the number the list broke into ragged groups at each one. */
.vni{flex:0 0 1.9rem;text-align:right;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.68rem;white-space:nowrap;opacity:.75}
.vnc-none{opacity:.45}
.vnrow--num{align-items:baseline}
/* Folded: the volume is named and reachable, not forty-six rows deep. */
.vncontents>summary.vnhead{cursor:pointer;list-style:none;display:flex;justify-content:space-between;align-items:baseline}
.vncontents>summary.vnhead::-webkit-details-marker{display:none}
.vncontents>summary.vnhead::after{content:"\203A";transform:rotate(90deg);transition:transform .15s ease;display:inline-block}
.vncontents[open]>summary.vnhead::after{transform:rotate(-90deg)}
@media (prefers-reduced-motion: reduce){.vncontents>summary.vnhead::after{transition:none}}

/* ── The editorial notes, as notes ────────────────────────────────────────
   Ported whole from the corpus site's reader (2026-09-17). The markup has been
   rendered here since pld-reading.js started loading on this page; without these
   rules a column's apparatus came out as one undifferentiated run, which is the
   thing the design was built to stop. Two columns, Latin lemma against its
   English, numbered down the margin; one column on a phone. */
.pld-note-label{font:13px/1.55 var(--body);color:var(--muted);margin:0 0 14px;max-width:75ch}
.pld-notes{list-style:none;margin:0;padding:0;counter-reset:pldnote}
.pld-note{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px 28px;align-items:start;padding:10px 0 12px;border-top:1px solid color-mix(in srgb,var(--border) 60%,transparent)}
.pld-notes>.pld-note{counter-increment:pldnote;position:relative;padding-left:2.2em}
.pld-notes>.pld-note::before{content:counter(pldnote);position:absolute;left:0;top:11px;font:600 12px/1.5 var(--body);color:var(--muted);letter-spacing:.02em}
.pld-note p{font:16px/1.65 var(--body);margin:0;white-space:normal;overflow-wrap:anywhere;max-width:none}
.pld-note-la{color:var(--muted)}
.pld-note-lemma{font-style:italic;color:var(--ink,inherit)}
.pld-note-same{grid-template-columns:minmax(0,1fr)}
.pld-note-same .pld-note-la{color:inherit}
@media(max-width:820px){.pld-editorial .pld-note{grid-template-columns:minmax(0,1fr);gap:4px 0}.pld-editorial .pld-note-en{padding-bottom:2px}}

/* The reading theme, back in the bar. It was hidden here and left only inside the
   Aa menu, which is where a reader looks for type size and not for light or dark;
   the control worked the whole time and could not be found. Light, sepia and dark
   cycle on it and the icon says which you are in. The explicit choice is the only
   way dark is reached — the OS preference still does not get to choose it. */
html:not(.fr-plain) .fr-reader-head #thTop{display:inline-flex;align-items:center;justify-content:center}

/* A work printed in one language only (DATA.source_only): no English lane to offer (corpus reader, 2026-09-24). */
.app.source-only #m-en{display:none!important}
