*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;background:var(--surface-page);color:var(--text-1);font-family:var(--font-body);font-size:var(--fs-body);line-height:var(--lh-body);font-weight:var(--fw-book);-webkit-font-smoothing:antialiased;text-wrap:pretty}
body.qb-grain{position:relative}
body.qb-grain::after{content:"";position:fixed;inset:0;background-image:var(--texture-grain);opacity:var(--grain-opacity);pointer-events:none;mix-blend-mode:overlay;z-index:9999}
h1,h2,h3,h4{font-family:var(--font-display);margin:0;text-wrap:balance}
h1{font-size:var(--fs-h1);font-weight:var(--fw-black);line-height:var(--lh-tight);letter-spacing:var(--tr-mega)}
h2{font-size:var(--fs-h2);font-weight:var(--fw-bold);line-height:var(--lh-snug);letter-spacing:var(--tr-tight)}
h3{font-size:var(--fs-h3);font-weight:var(--fw-semi);line-height:var(--lh-snug);letter-spacing:var(--tr-tight)}
p{margin:0;max-width:var(--measure)}
a{color:var(--link);text-decoration:none;border-bottom:1px solid #ffffff2b;transition:color var(--dur-1) var(--ease-out),border-color var(--dur-1) var(--ease-out)}
a:hover{color:var(--link-hover);border-bottom-color:currentColor}
:where(a,button,input,select,textarea,[tabindex]):focus-visible{outline:var(--focus-ring-width) solid var(--focus-ring);outline-offset:var(--focus-ring-offset);border-radius:var(--radius-1)}
code,kbd,samp{font-family:var(--font-mono);font-size:0.92em}
hr{border:0;border-top:1px solid var(--border-subtle);margin:var(--space-6) 0}
::selection{background:var(--accent);color:var(--text-on-accent)}
/* The one orchestrated moment: put .qb-reveal on up to 8 elements and set
   --i on each. Nothing else in the system animates on load. */
.qb-reveal{opacity:0;transform:translateY(var(--reveal-shift));animation:qb-rise var(--dur-3) var(--ease-out) forwards;animation-delay:calc(var(--i,0) * var(--stagger))}
@keyframes qb-rise{to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.qb-reveal{animation-duration:1ms}}
/* Signature primitive: the audit gutter. A mono rail of rule IDs / verdicts to
   the left of a content block. Collapses to a stacked label on mobile. */
.qb-gutter{display:grid;grid-template-columns:var(--gutter-rail) minmax(0,1fr);gap:var(--space-5)}
.qb-gutter > .qb-gutter-rail{font-family:var(--font-mono);font-size:var(--fs-mono);letter-spacing:var(--tr-mono);color:var(--text-3);padding-top:6px;border-top:1px solid var(--border-subtle)}
@media (max-width:720px){.qb-gutter{grid-template-columns:minmax(0,1fr);gap:var(--space-3)}}
