/* ============================================================
   IOG Quarto Book — Unified Stylesheet (cleaned)
   ============================================================ */

/* Source Serif 4 and Noto Sans Symbols 2 are loaded via <link> tags in
   _quarto.yml's include-in-header, not @import here — @import blocks the
   rest of this stylesheet from applying until it resolves, which caused
   a flash of unstyled content on every chapter navigation. */

/* Metric-matched fallback for Source Serif 4. Before the webfont finishes
   loading, the font-family stack falls through to Georgia — but Georgia
   and Source Serif 4 have different ascent/descent/average-character-width
   ratios, so text set in Georgia occupies a different amount of vertical
   and horizontal space. That mismatch is what makes the swap-to-webfont
   moment read as a visible "jump" (line breaks and paragraph height
   shifting), on top of the plain font-style change. size-adjust and the
   three *-override descriptors resize/reposition Georgia's own metrics to
   match Source Serif 4's, so swapping between the two changes letterform
   style without changing layout. Values computed from each font's real
   ascent/descent/xWidthAvg/unitsPerEm (via @capsizecss/metrics) using the
   same size-adjust formula unjs/fontaine and next/font/google use:
   size-adjust = (targetXAvg/targetUnitsPerEm) / (fallbackXAvg/fallbackUnitsPerEm);
   each *-override = targetMetric / (targetUnitsPerEm * size-adjust).
   Only Georgia is metric-matched, not Charter/Times New Roman/serif
   further down the stack — those only apply if Georgia itself isn't
   installed, which is rare enough on any of this site's readers'
   platforms that matching them too wasn't worth the added complexity. */
@font-face {
  font-family: 'Source Serif 4 Fallback';
  src: local('Georgia');
  size-adjust: 107.4471%;
  ascent-override: 96.4195%;
  descent-override: 31.1781%;
  line-gap-override: 0%;
}

/* Prefer system math fonts (Cambria Math on Windows, STIX Two on Mac/Linux)
   for logical and mathematical symbols — these harmonise better with serif
   body text than Noto Sans Symbols 2, which is the fallback when no system
   math font is available. The unicode-range covers modal operators, logical
   connectives, quantifiers, set symbols, and arrows used throughout the text. */
@font-face {
  font-family: 'MathFallback';
  src: local('Cambria Math'), local('STIX Two Math'), local('STIXTwoMath-Regular'),
       local('Latin Modern Math'), local('Asana Math');
  unicode-range:
    U+00AC,              /* ¬ NOT SIGN */
    U+2200-U+22FF,       /* Mathematical Operators block (∧ ∨ ∀ ∃ ∅ ∴ ⊢ ⊨ …) */
    U+2190-U+21FF,       /* Arrows block (→ ↔ ⇒ ⇔ …) */
    U+25A0-U+25FF;       /* Geometric Shapes block (□ ◇ …) */
}

/* Geometric shapes (□ ◇ etc.) and mathematical operators aren't in
   Source Serif 4 — without a named fallback the browser picks a random
   system font that renders them smaller. Noto Sans Symbols 2 fills the
   gap consistently: add it to the fallback chain right after the primary
   font so the browser uses it for any missing character automatically. */

/* MathJax's own CHTML output sets its own inline font-size (a ~117%
   scale correction it applies by default, landing at ~18.7px against
   this book's 16px body text — confirmed live via computed style) —
   noticeably larger/heavier than the surrounding prose, most visible
   on a display equation but present on every inline one too. The
   book's own formal notation is almost always typed as literal
   Unicode (□◇C, ∀x) rather than LaTeX, so this was never prominent
   before a real $$...$$ block called attention to it. 1em, not a
   fraction — !important here overrides MathJax's own inline style
   attribute entirely (inline styles normally win over stylesheet
   rules, but not over !important ones), so the value here IS the
   final font-size, not a multiplier on top of MathJax's own 117%: 1em
   inherits the surrounding paragraph's real 16px directly. (0.854em
   was tried first on the mistaken assumption this was scaling down
   from MathJax's own 18.7px baseline — it was actually scaling from
   the inherited 16px, landing at a too-small 13.7px instead.) */
mjx-container {
	font-size: 1em !important;
}

/* ============================================================
   0. THEME VARIABLES
   Moved to styles/themes/procyon.css (loaded before this file —
   see _quarto.yml's format.html.css list) so a reskin only ever
   touches that file. Every color below should reference one of
   its --book-* custom properties rather than a literal hex value,
   so the whole site follows both the toggle and the active theme.
   ============================================================ */

/* ============================================================
   0b. LAYOUT CONSTANTS
   Not colors (those are in styles/themes/procyon.css) — sizing/
   spacing/opacity values that have needed hands-on tuning more than
   once each: the footer bar, the prev/next divider line, the sidebar
   chapter-number column. Collected here so the next adjustment is a
   one-line edit in one place instead of a search through the whole
   file. Everything else in this stylesheet still uses plain values —
   this isn't a general design-token system, just the handful of
   settings that have actually been revisited in practice.
   ============================================================ */
:root {
	--book-footer-height: 34px;
	--book-footer-padding-x: 2rem;

	/* Settings menu → Typography → Font. Reading-column only (chapter
	   prose, headings, footnotes, margin notes) — navbar/sidebar/dropdown
	   chrome keep their own hardcoded Source Serif 4 regardless of this
	   variable, same "chrome vs. reading column" split the light/dark
	   toggle already follows (see body{} comment further down). No
	   metric-matched fallback for Inter/Atkinson the way Source Serif 4
	   has one for Georgia above — an acceptable small layout shift on a
	   user-initiated font change, not worth the size-adjust math for a
	   toggle nobody hits on every page load. */
	--book-body-font: 'Source Serif 4', 'Source Serif 4 Fallback', 'MathFallback', 'Noto Sans Symbols 2', Charter, Georgia, serif;

	--book-flourish-height: 1px;
	--book-flourish-opacity: 0.3;
	/* Shared by both the space above the prev/next row (flourish's own
	   margin-bottom) and below it (.next-chapter-nav:last-child's
	   margin-bottom, with main.content's own padding-bottom zeroed out
	   for that case) — one variable, so the row's text stays centered
	   between the two by construction. */
	--book-flourish-gap-below: 2.75rem;
	--book-flourish-gap-above: 8rem;

	/* Generic, round defaults for the sidebar's chapter-number column —
	   not measured against this book's own longest chapter title. */
	--book-sidebar-num-opacity: 0.55;
	--book-sidebar-num-font-size: 0.9em;
	--book-sidebar-leader-opacity: 0.35;

	/* Left sidebar (chapter list) overall text size — was 0.76rem. Not
	   the right-hand "Page Contents" TOC sidebar, a separate element
	   this variable intentionally doesn't touch. */
	--book-sidebar-font-size: 0.85rem;

	/* Top navbar — most of its layout (height, edge alignment with the
	   sidebars, link centering) is measured live by JS at runtime, not
	   a fixed number, so it can't live here as a constant. These four
	   are the actual static, hand-picked values: the mobile hamburger
	   icon's size, the site title's text size, the top-level nav links
	   (Home, In Plain Terms, …), and the Appendices/References dropdown
	   items. */
	--book-navbar-hamburger-font-size: 0.75rem;
	--book-navbar-hamburger-padding: 0.2rem;
	--book-navbar-brand-font-size: 1rem;
	--book-navbar-link-font-size: 0.78rem;
	--book-navbar-dropdown-font-size: 0.88rem;
}

/* Always reserve the scrollbar gutter — prevents horizontal layout shift
   on toggle (a page that becomes exactly as tall as the viewport in one
   theme but not the other would otherwise gain/lose a scrollbar). */
html {
	overflow-y: scroll;
	/* Safety net against sideways page scroll — nothing on this site is
	   meant to widen the document itself; anything that could (a wide
	   table, an unbreakable long inline expression) should scroll
	   internally within its own box instead (see §21 TABLES for the
	   table case) rather than stretching the whole page rightward. */
	overflow-x: hidden;
}

/* Settings menu → Typography → text size — reading column only.
   Previously scaled the ROOT html font-size, on the theory that
   "nearly everything is sized in rem" would make headings, prose,
   sidebars, and callouts all scale together automatically — but that
   leaked into the navbar/sidebar/settings-menu chrome too (a reader
   asked for the toggle to leave the menu itself alone), AND it never
   actually resized the one thing a reader most wants to resize: body
   {} sets its own explicit, non-rem font-size (16px, just below),
   so p/li/blockquote/td/th inherit that fixed value directly and
   never picked up the root's rem-relative change at all — only
   headings (rem-based) and chrome (also rem-based) were ever moving.
   Scoping the font-size to main.content/#quarto-document-content
   fixes both at once: paragraphs now actually inherit the chosen
   size (nothing else set an explicit font-size for them to override),
   and chrome outside the reading column never references this
   selector, so it can't be reached by it either way. */
main.content, #quarto-document-content {
	font-size: 16px;
}
/* Four evenly-graduated steps (14/16/18/20px, 2px apart) — see
   _quarto.yml's Size tile group for the full reasoning (the original
   three, 15/16/19px, had an uneven 1px-then-3px jump between steps). */
html[data-book-text-size="small"] main.content,
html[data-book-text-size="small"] #quarto-document-content {
	font-size: 14px;
}
html[data-book-text-size="large"] main.content,
html[data-book-text-size="large"] #quarto-document-content {
	font-size: 18px;
}
html[data-book-text-size="xlarge"] main.content,
html[data-book-text-size="xlarge"] #quarto-document-content {
	font-size: 20px;
}
/* True mobile only: Quarto's own grid-template-columns (_quarto.yml's
   grid.gutter-width: 14px) reserves a flat 14px track at BOTH true
   screen edges even in this single-column layout — there's no
   adjacent column left to separate from at this width, so it's dead
   space, but it's still there. main.content's own background is
   white while the page behind it (--book-bg) is a warm cream, so that
   reserved 14px reads as a visible cream "frame" around the reading
   column instead of just an invisible gap — a reader spotted it and
   asked what it was. Pulling the element's own box out over that
   track with a matching negative margin (so its white background
   fills it) while adding the same 14px back as padding keeps the
   actual text at the exact same visual inset it already had — this
   only erases the color seam, it doesn't change line width or reading
   position. */
@media (max-width: 799.98px) {
	main.content, #quarto-document-content {
		margin-left: -14px;
		margin-right: -14px;
		/* Base inset bumped from 12.75px to 18px — on request, the gap
		   between the screen edge and the prose read as too thin on a
		   phone. The +14px alongside it is unrelated to reading comfort
		   (it's the color-continuity fix above, keeping this rule's own
		   negative margin from exposing the page's cream background) —
		   only the 12.75px baseline is the actual reading-margin knob. */
		padding-left: calc(18px + 14px);
		padding-right: calc(18px + 14px);
	}
}
/* Same color-continuity fix, sub-compact width (800-991.98px): Quarto's
   grid goes single-column (and so reserves the same dead 14px gutter
   track) as soon as Bootstrap's own .navbar-toggler takes over from the
   docked chrome — that happens at max-width: 991.98px (§18,
   #quarto-header .navbar-toggler), not at this file's own 799.98px
   "true mobile" cutoff above. Left unpatched, that 192px band showed
   mobile-style chrome (hamburger, breadcrumb bar) with the reading
   column's cream/dark frame still visible at both edges — reported
   live via screenshot as a visible "sliver" right at that width. Only
   the color fix is duplicated here (-14px margin, +14px matching
   padding) — NOT the extra +18px reading-margin bump above, which was
   tuned specifically for true mobile/phone widths and has no bearing
   on what this block fixes. */
@media (min-width: 800px) and (max-width: 991.98px) {
	main.content, #quarto-document-content {
		margin-left: -14px;
		margin-right: -14px;
		padding-left: 14px;
		padding-right: 14px;
	}
}

/* Settings menu → Typography → Font. No entry for the default (Source
   Serif 4): that's the plain absence of the attribute, same pattern
   data-book-theme and data-book-text-size both already use. */
/* 'MathFallback', 'Noto Sans Symbols 2' in every stack below, not
   just the Source Serif 4 default above — a reader wanted the
   book's formal notation (◇ □ ∧ ∨ ∀ ∃ ¬ → ∅ …) rendered by the same
   dedicated math font regardless of which body font is picked, not
   whatever random system font happens to have those glyphs once the
   chosen font's own don't. Safe to add unconditionally: MathFallback
   is scoped by unicode-range (its own @font-face, above) to exactly
   those symbol codepoints, so it only ever kicks in for characters
   none of these body fonts cover anyway — it never touches ordinary
   prose, which still renders in whichever font was actually chosen. */
html[data-book-font="inter"] {
	--book-body-font: 'Inter', 'MathFallback', 'Noto Sans Symbols 2', -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif;
}
html[data-book-font="atkinson"] {
	--book-body-font: 'Atkinson Hyperlegible', 'MathFallback', 'Noto Sans Symbols 2', -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif;
}
html[data-book-font="literata"] {
	--book-body-font: 'Literata', 'Source Serif 4 Fallback', 'MathFallback', 'Noto Sans Symbols 2', Charter, Georgia, serif;
}
html[data-book-font="lora"] {
	--book-body-font: 'Lora', 'Source Serif 4 Fallback', 'MathFallback', 'Noto Sans Symbols 2', Charter, Georgia, serif;
}
html[data-book-font="newsreader"] {
	--book-body-font: 'Newsreader', 'Source Serif 4 Fallback', 'MathFallback', 'Noto Sans Symbols 2', Charter, Georgia, serif;
}
html[data-book-font="source-sans"] {
	--book-body-font: 'Source Sans 3', 'MathFallback', 'Noto Sans Symbols 2', -apple-system, 'Segoe UI', Helvetica, Arial, sans-serif;
}

/* litera (light) and darkly (dark) each redeclare --bs-navbar-brand-padding-y,
   --bs-navbar-brand-font-size, --bs-nav-link-padding-y, and --bs-nav-link-padding-x
   directly on .navbar/.nav-link themselves (Bootstrap's per-component variable
   pattern), not just on :root. A value set directly on an element always wins
   over one inherited from an ancestor like html/:root, no matter the selector
   specificity — so overriding these at the html level (as a previous pass here
   tried) is silently ignored, and the real per-theme values (e.g. nav-link
   padding-x: 1.1rem in litera vs 2rem in darkly) still reach the rendered
   navbar. Since the navbar's rendered clientHeight feeds directly into
   quarto-nav.js's ResizeObserver, which sets body's padding-top inline, any
   difference here is what makes the whole page shift on toggle. Fixed below
   by hardcoding the actual padding/font-size on .navbar-brand and .nav-link
   (§19) instead of trying to override the variables they read from. */

/* ============================================================
   1. LAYOUT
   ============================================================ */

/* No max-width constraint on the body column.
   Setting max-width: 800px on .column-body (or main.content /
   main#quarto-document-content) collapsed the right margin rail on
   wide viewports and stacked every .column-margin block at the top
   of the page instead of placing it alongside its paragraph.
   Quarto's grid handles body and margin column placement; do not
   reintroduce a body width cap here. */


/* ============================================================
   2. BODY TYPOGRAPHY
   ============================================================ */

/* The page reads as a light/dark "sheet" floating on a permanently dark
   chrome surface — navbar, both sidebars, and the footer always use
   --book-chrome-*, regardless of the light/dark toggle. Only the actual
   reading column (main.content / #quarto-document-content) follows
   --book-bg/--book-text and switches with the toggle. */
body {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', 'MathFallback', 'Noto Sans Symbols 2', Charter, Georgia, 'Times New Roman', serif;
	background-color: var(--book-chrome-bg-solid);
	color: var(--book-text);
	font-size: 16px;
	line-height: 1.7;
	/* Static fallback for the instant before quarto-nav.js measures the
	   navbar and overwrites this with an inline padding-top (see
	   site_libs/quarto-nav/quarto-nav.js: headerOffset() reads
	   header.fixed-top's clientHeight and sets body.style.paddingTop
	   directly — it does not read a CSS variable). Matches the navbar's
	   hardcoded height (§19) so there's no flash before JS runs. Below
	   992px only — see the override just below for why ≥992px forces
	   its own much smaller value instead. */
	padding-top: 52px;
}

/* ≥992px: the navbar (§19) no longer reserves real layout space for
   itself — brand/search/tools all moved into the static sidebars, and
   the nav-link row left in it is a floating overlay, not something
   static content needs to clear. Quarto's own quarto-nav.js still sets
   body.style.paddingTop (and #quarto-sidebar's own inline top) to
   match the navbar's rendered height regardless, which — since the
   floating bar still occupies real space in its own parent's normal
   flow, just narrower — would still be a similar-sized gap as before.
   !important forces this instead of that. 0, not the 1.75rem this
   used to be — a reader initially wanted the whole left column
   "pushed down a little," not flush to the very top, but later asked
   for the reading column to connect flush to the very top of the page
   instead, with the two side rails' own top (§ position: fixed block
   further down) brought to match rather than left at their old offset
   — a mismatched gap on one side while the other sits flush would
   have read as broken, not intentional. */
@media (min-width: 992px) {
	body {
		padding-top: 0 !important;
	}
	#quarto-sidebar {
		/* top: 0, not 1.75rem: position: sticky's "top" only controls
		   the scroll threshold where it starts sticking, not its
		   resting position at the top of the page (learned live — the
		   old 1.75rem value here had zero effect on the title's initial
		   position, since that's set by normal flow/padding instead).
		   padding-top: 0, not Bootstrap's own bundled #quarto-content > *
		   { padding-top: 14px } (confirmed live via document.styleSheets
		   — this is what was actually pushing the sidebar's own content
		   down, independent of body's own 1.75rem top padding above,
		   stacking on top of it) — THIS is the real lever: a reader
		   wanted the title text to read as roughly "in line" with the
		   floating navbar's own nav-link row above it (Home/In Plain
		   Terms/...), not sitting a full navbar-height below it.
		   Measured live: navbar nav-link text centers at ~27.6px from
		   viewport top; title centered at ~56px before this fix — this
		   14px was a third of that gap. body's own 1.75rem top padding
		   is untouched, so the reading column's own top position
		   doesn't move, only the sidebar's. */
		top: 0 !important;
		padding-top: 0 !important;
		max-height: 100vh !important;
	}
}

p, li, blockquote, td, th {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', 'MathFallback', 'Noto Sans Symbols 2', Charter, Georgia, serif;
	line-height: 1.7;
}

strong, b { font-weight: 600; }

/* ============================================================
   3. HEADINGS
   ============================================================ */

h1, h2, h3, h4, h5, h6 {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	color: var(--book-heading);
	font-weight: 600;
	letter-spacing: -0.01em;
}

h1 { font-size: 1.45rem; margin: 4.5rem 0 1rem;   line-height: 1.25; text-align: center; }
h2 { font-size: 1.15rem; margin: 2rem 0 0.75rem;  line-height: 1.3; }
h3 { font-size: 1.0rem;  margin: 1.5rem 0 0.5rem; line-height: 1.35; font-style: italic; font-weight: 600; }
h4, h5, h6 { font-size: 0.9rem; margin: 1.25rem 0 0.5rem; }

main.content :is(h2, h3, h4) { margin-top: 1.75em; }

/* Settings menu → Typography → Font — reading column only. Scoped to
   main.content/#quarto-document-content descendants specifically
   (rather than changing the base p/li/h1-h6 rules above) because those
   base rules are plain type selectors that also match chrome elements
   outside the reading column (sidebar <li> items, footer <td>s, etc.);
   a scoped, higher-specificity override here is what keeps the font
   picker from leaking into the nav chrome. .tippy-box (citation/
   footnote hover-preview tooltips) is included even though it isn't a
   main.content descendant in the DOM — tippy.js portals it to <body>
   for stacking — because it only ever shows reading content. */
main.content p, main.content li, main.content blockquote, main.content td, main.content th,
#quarto-document-content p, #quarto-document-content li, #quarto-document-content blockquote, #quarto-document-content td, #quarto-document-content th,
main.content :is(h1, h2, h3, h4, h5, h6),
#quarto-document-content :is(h1, h2, h3, h4, h5, h6),
#title-block-header .subtitle,
.column-margin,
.book-footnote-margin,
.next-chapter-link,
.tippy-box {
	font-family: var(--book-body-font);
}

/* Reading-column headings scale with the text-size picker too — h1-h6
   above are sized in rem (root-relative), and the root no longer
   moves (previous section), so without this a reader picking "Large"
   would get bigger body paragraphs sitting under headings frozen at
   their default size. em here resolves against each heading's own
   containing block (main.content/#quarto-document-content, whose
   font-size the text-size picker does set), so these scale exactly
   like the rem versions used to — just relative to the reading column
   instead of the page root. Same values as the h1–h6 rule above,
   rem swapped for em. */
main.content h1, #quarto-document-content h1 { font-size: 1.45em; }
main.content h2, #quarto-document-content h2 { font-size: 1.15em; }
main.content h3, #quarto-document-content h3 { font-size: 1.0em; }
main.content :is(h4, h5, h6), #quarto-document-content :is(h4, h5, h6) { font-size: 0.9em; }

/* H2's own rule underneath it — Quarto's bundled Bootstrap sets
   "h2, .h2 { border-bottom: 1px solid rgba(0,0,0,0.1); }", a flat solid
   line unrelated to anything else on the site. Swapped for the same
   dotted-flourish language used everywhere else a decorative rule
   appears (.home-title-divider, the sidebar's own TOC dot leader, the
   chapter-footer flourish) — a reader wanted every "## Section" heading
   on every page (this book's own chapter sections included, not just
   site chrome pages like Connect) to use that same quiet dotted line
   instead of Bootstrap's plain solid one. color-mix(), not the flourish
   rule's own element-level "opacity: var(--book-flourish-opacity)" —
   that technique fades a whole element and only works on
   .home-title-divider because it's a bare decorative div with no text
   of its own; opacity on an h2 would fade its text right along with
   the border. Blending the same 0.3 weight straight into the border's
   own color instead keeps the heading text at full strength. */
main.content h2, #quarto-document-content h2 {
	border-bottom: var(--book-flourish-height) dotted color-mix(in srgb, var(--book-muted) 30%, transparent);
}

/* ============================================================
   3b. TITLE BLOCK — subtitle matches title font and alignment
   ============================================================ */

/* Book-style chapter drop: space above the title, then breathing room
   below before the first paragraph of body text.
   !important on margin-bottom: Bootstrap ships its own #title-block-header
   rule using the logical property margin-block-end (not margin-bottom).
   Logical and physical forms of the same property don't override each
   other by specificity — whichever is declared last in the cascade wins
   — and Bootstrap has a second, mobile-width-scoped margin-block-end:0
   that was winning under ~992px, silently zeroing this out and collapsing
   the gap between a chapter's H1 and its first paragraph on phones. */
#title-block-header {
	/* 6.75rem, not 6rem — matches the actual total space below the title
	   (padding-bottom 6rem + margin-bottom 0.75rem), on request: with no
	   divider line anymore to anchor the eye, the two gaps read as
	   visibly unbalanced at 6rem/6.75rem — confirmed by a reader's own
	   screenshot ("the space above and below aren't visually balanced").
	   Bumped the top to match rather than trimming the bottom, per that
	   reader's own preference. */
	padding-top: 6.75rem;
	padding-bottom: 6rem;
	margin-bottom: 0.75rem !important;
	/* No dotted rule under a title anymore — on request: a chapter
	   opener reading "as real a book as possible" wants the plain
	   print-book move (generous white space, a substantial title,
	   straight into text) rather than the web-page convention of a
	   divider under every heading. The dotted line stays exactly as it
	   was on "## Section" headings inside a chapter (H2's own rule,
	   above) — only the title's own line is gone. This removal also
	   makes the two border-bottom overrides that used to sit below
	   this rule (site-chrome pages, and chapters going straight into an
	   H2) pointless — nothing left to override — so they're gone too. */
}

#title-block-header h1.title {
	/* Bumped from 1.75rem — on request, matched to the room a chapter
	   opener actually has now that there's no divider anchoring the
	   page: without one, a small title read as lost inside 6rem of
	   padding on both sides. Shared by every titled page (chapters and
	   site chrome alike, same as the rest of this block), not scoped to
	   book chapters only. */
	font-size: 2.25rem;
	margin-top: 0;        /* controlled by #title-block-header padding-top */
	margin-bottom: 0;      /* controlled by #title-block-header padding-bottom, kept equal to padding-top for symmetric space around the title */
}

#title-block-header .subtitle {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-weight: 600;
	font-size: 1.1rem;
	text-align: center;
	text-indent: 0 !important;
	font-style: normal;
	color: var(--book-heading);
}

/* Settings menu → Typography → text size: the chapter title and
   subtitle above use rem (root-relative), which no longer moves with
   the text-size picker (§ main.content/#quarto-document-content font-
   size, further up) — same em conversion as the reading-column
   headings there, just placed after these two so it actually wins the
   tie (identical selector specificity; the later rule in source order
   is what decides it, not just the selector itself). */
#title-block-header h1.title { font-size: 1.75em; }
#title-block-header .subtitle { font-size: 1.1em; }

/* Used to give website chrome pages (Contribute, License, How to Cite,
   Changelog, For AI Assistants, etc.) less top padding/bottom margin
   than a book chapter's own title — the reasoning at the time was that
   these aren't "chapter drops" and don't need the same ceremonial
   space. A reader compared Contribute against an actual chapter and
   found it sitting noticeably higher/tighter than every other page's
   header, which read as inconsistent rather than intentional — same
   call as the alignment override just below, which went for the same
   reason. Site pages now fall through to the shared #title-block-header
   rule above (padding-top: 3.5rem; margin-bottom: 3rem;) like every
   other page. */

/* Used to read left-aligned here, deliberately different from the book
   chapters' own centered "chapter drop" title treatment — a reader
   compared the two (Contribute vs. an actual chapter) and wanted every
   page's header consistent instead, so this override is gone; site
   pages now just fall through to the same centered h1/subtitle rules
   the book chapters already use. */

/* ============================================================
   4. LINKS
   ============================================================ */

a, a:visited {
	color: var(--book-link);
	text-decoration: none;
	border-bottom: none;
}

/* Cross-reference links (§x.y.z) match body text — no color, no underline */
main.content a[href*="#sec-"],
#quarto-document-content a[href*="#sec-"] {
	color: inherit;
	border-bottom: none;
}

main.content a[href*="#sec-"]:hover,
#quarto-document-content a[href*="#sec-"]:hover {
	border-bottom: none;
}

/* Subject Index page: every link matches body text, not just the #sec-
   ones above — a reader felt the page's own auto-linked cross-references
   (resources/sidebar-chapter-numbers.js-adjacent runtime linking turns
   bare terms like "Glossary"/"Appendix B" into real <a> tags with no
   #sec- fragment, so they fell through to the sitewide gold link color
   instead) made a dense reference list read as scattered gold noise
   rather than a plain index: "there should not be any golden links on
   that page... for glossary, appendix, and stuff like that, those don't
   need to be gold." Scoped to this page only — gold links stay the
   normal convention everywhere else on the site. */
body.subject-index-page main.content a,
body.subject-index-page #quarto-document-content a {
	color: inherit;
	border-bottom: none;
}

/* ============================================================
   5. CODE
   ============================================================ */

code, pre {
	font-family: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
	font-size: 0.9em;
}

code:not(pre code) {
	background: var(--book-code-bg);
	padding: 0.1em 0.35em;
	border-radius: 3px;
}

/* ============================================================
   6. BOOK-STYLE PROSE
   First-line indent, no paragraph spacing.
   ============================================================ */

main.content p,
#quarto-document-content p {
	text-indent: 1.5em;
	margin-top: 0;
	margin-bottom: 0;
	hyphens: auto;
}

/* Settings menu → Layout → Spacing: "Spaced" — a gap between
   paragraphs. Used to pair with a general per-paragraph Indented/Flush
   toggle here too (Layout → Indentation) — removed; a reader called it
   a useless choice once it was live ("nobody wants all of their
   paragraphs flushed left"). Layout → Indentation now means something
   else entirely: the section-opening-paragraph toggle further below
   (:not(.book-opening-indent), the "First paragraph of any section"
   block). !important: beats the base rule above on source order alone
   otherwise (same selector specificity, this one just needs to always
   win once the class is present, regardless of any other paragraph-
   specific override elsewhere in this file). */
html.book-paragraph-spacing main.content p,
html.book-paragraph-spacing #quarto-document-content p {
	margin-bottom: 0.85em !important;
}

/* Settings menu → Text → "Left-aligned": ragged-right instead of the
   book's default justified prose (§14 below) — some readers find
   justification's variable word-spacing harder to track. !important
   for the same reason as book-paragraph-spacing above: this always
   wins once the class is present, regardless of source order against
   §14. */
html.book-text-align-left main.content p,
html.book-text-align-left #quarto-document-content p {
	text-align: left !important;
	hyphens: manual !important;
}

/* First paragraph of any section: flush-left by default.
   Targets every structural pattern Quarto produces. Gated behind
   :not(.book-opening-indent) so the Settings-menu → Layout →
   Indentation toggle can opt this specific line into a normal
   first-line indent instead. Class name predates the menu label (this
   used to be the separate "Opening Line" control, back when a general
   per-paragraph Indented/Flush toggle also existed under the plain
   "Indentation" name) — that general toggle is gone now, so this one
   inherited the name; ordinary body paragraphs are simply always
   indented; there's no toggle for them anymore. */
html:not(.book-opening-indent) main.content > p:first-of-type,
html:not(.book-opening-indent) main.content section > p:first-of-type,
html:not(.book-opening-indent) main.content .section > p:first-of-type,
html:not(.book-opening-indent) main.content section.level1 > p:first-of-type,
html:not(.book-opening-indent) main.content section.level2 > p:first-of-type,
html:not(.book-opening-indent) main.content section.level3 > p:first-of-type,
html:not(.book-opening-indent) main.content section.level4 > p:first-of-type,
html:not(.book-opening-indent) main.content section.level5 > p:first-of-type,
html:not(.book-opening-indent) main.content :is(h1, h2, h3, h4, h5, h6) + p,
html:not(.book-opening-indent) #quarto-document-content > section > p:first-of-type,
html:not(.book-opening-indent) #quarto-document-content > p:first-of-type,
html:not(.book-opening-indent) #quarto-document-content :is(h1, h2, h3, h4, h5, h6) + p {
	text-indent: 0 !important;
}

/* No indent inside lists, blockquotes, callouts, or margin notes */
main.content li,
main.content blockquote p,
main.content .callout p,
main.content .callout-body p,
main.content .callout-body-container p,
main.content [class*="callout"] p,
.column-margin p {
	text-indent: 0 !important;
}

/* Paragraphs after displayed blocks: flush-left with standard spacing */
main.content :is(blockquote, ol, ul, dl, pre, table, figure) + p,
main.content :is(.callout, [class*="callout"]) + p,
main.content div.callout + p,
main.content div[class*="callout"] + p,
main.content :is(.premise, .definition, .theorem, .lemma, .corollary, .result, .condition, .argument) + p {
	margin-top: 0.5em !important;
	text-indent: 0 !important;
}

/* ============================================================
   7. LISTS — book-style tight markers
   Use CSS counters so marker sits flush against content.
   ============================================================ */

/* Strip default list font normalization */
ol, ul, ol li, ul li, ol li > p, ul li > p {
	font-family: inherit !important;
	font-size: inherit !important;
	font-weight: inherit !important;
	line-height: inherit !important;
	font-feature-settings: normal !important;
	font-variant-numeric: normal !important;
}

/* Roman / lettered / numeric lists in main content:
   suppress default marker, use counter, hang from a fixed left edge */
main.content ol {
	list-style: none !important;
	padding-inline-start: 2.25em !important;
	margin: 0.5em 0 !important;
	counter-reset: item;
}

main.content ol > li {
	position: relative;
	margin-bottom: 0;
	line-height: 1.65;
	padding-left: 0 !important;
	counter-increment: item;
}

/* Decimal (default) */
main.content ol > li::before {
	content: counter(item) ".";
	position: absolute;
	left: -2.25em;
	width: 1.75em;
	text-align: right;
	padding-right: 0.4em;
	font-variant-numeric: tabular-nums;
}

/* Lower-roman lists (i. ii. iii.) */
main.content ol[type="i"] > li::before { content: counter(item, lower-roman) "."; }

/* Upper-roman */
main.content ol[type="I"] > li::before { content: counter(item, upper-roman) "."; }

/* Lower-alpha (a. b. c.) */
main.content ol[type="a"] > li::before { content: counter(item, lower-alpha) "."; }

/* Upper-alpha */
main.content ol[type="A"] > li::before { content: counter(item, upper-alpha) "."; }

/* Unordered lists keep the default disc, but tighten padding */
main.content ul {
	padding-inline-start: 1.5em !important;
	margin: 0.5em 0 !important;
}

main.content ul > li {
	margin-bottom: 0;
	line-height: 1.65;
}

/* Two structural-position rules used to live here: one colored the last
   <em> in a list item as a "citation" (real citations are markdown
   links, never italics — it just mis-colored whatever emphasized phrase
   happened to be last, e.g. "one state, then another" in the
   Changeless-Ground Reductio) and one colored the first <strong> in a
   list item as a "premise label" (premise lists are paragraph-wrapped,
   so this never matched real premises — it only ever fired on unrelated
   bold lead-ins, e.g. the bullet list on the Peer Review note page).
   Both removed: a box's type identity already comes from its border
   color and inline label per §12, not from guessing at list position. */

/* ============================================================
   8. ROMAN / LETTER LIST FIX
   Force hanging-indent rendering for type="i", "I", "a", "A".
   ============================================================ */

main.content ol[type="i"],
main.content ol[type="I"],
main.content ol[type="a"],
main.content ol[type="A"],
main.content ol[style*="lower-roman"],
main.content ol[style*="upper-roman"],
main.content ol[style*="lower-alpha"],
main.content ol[style*="upper-alpha"] {
	list-style-position: inside !important;
	padding-inline-start: 0 !important;
	padding-left: 0 !important;
	margin-left: 1.5em !important;
}

main.content ol[type="i"] > li,
main.content ol[type="I"] > li,
main.content ol[type="a"] > li,
main.content ol[type="A"] > li,
main.content ol[style*="lower-roman"] > li,
main.content ol[style*="upper-roman"] > li,
main.content ol[style*="lower-alpha"] > li,
main.content ol[style*="upper-alpha"] > li {
	padding-left: 0 !important;
	text-indent: -1.5em !important;
	margin-left: 0 !important;
	margin-bottom: 0 !important;
}

/* Tighten the gap between marker and text */
main.content ol[type="i"] > li::marker,
main.content ol[type="I"] > li::marker,
main.content ol[type="a"] > li::marker,
main.content ol[type="A"] > li::marker {
	font-variant-numeric: tabular-nums;
	margin-right: 0;
}

/* Kill paragraph indent inside list items (Pandoc wraps long li content in <p>) */
main.content li p,
main.content li > p,
main.content ol li p,
main.content ul li p {
	text-indent: 0 !important;
}


/* ============================================================
   9. SIDEBAR
   ============================================================ */

.sidebar, #quarto-sidebar, .sidebar-navigation,
nav.sidebar, .bs-sidebar, aside.sidebar,
.sidebar-menu-container {
	background-color: var(--book-chrome-bg-solid);
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: var(--book-sidebar-font-size);
	line-height: 1.3;
}
/* No border anymore — had one while this was first split into its own
   box (§9 below), removed on request once the box itself had settled
   into place: just the shared --book-chrome-bg-solid fill now (from
   the broad .sidebar-menu-container selector above), no hairline edge
   drawn around it. */

/* This rail and its right-hand counterpart (#quarto-margin-sidebar,
   below) were both sitting at the exact same color as the page itself
   (--book-chrome-bg-solid, unchanged since body uses that same
   variable) — by original design, so the reading column reads as a
   sheet floating on one continuous dark surface. That left neither
   rail with any actual visible boundary; a reader only ever perceived
   the left one as "a solid block" because 13 tightly-packed chapter
   rows happened to fill most of its own height, while the right one's
   much shorter per-chapter TOC left a lot of same-colored empty space
   below it and read as no block at all. color-mix(), not a semi-
   transparent overlay layered on top (background-image: linear-
   gradient(rgba(255,255,255,.035),...) was tried first): the right
   rail's own box-shadow: 9999px 0 0 9999px trick (below) needs a
   literal solid color, not a second background layer it can't inherit
   — color-mix() resolves to one, so both the fill and that shadow can
   share the exact same lightened value with no seam between the box's
   own edge and the shadow bleeding out past it. Second declaration,
   not a replacement: an unsupporting browser drops the invalid
   color-mix() line and keeps the plain color-mix()-free one right
   above it, so this degrades to the old flush-with-the-page look
   rather than losing its background outright. Automatic on every
   theme (this file's own or any of the 24 in styles/themes/) — it's
   relative to whatever --book-chrome-bg-solid already is, not a fixed
   color of its own, so nothing here needs per-theme retuning. The
   border traces the one edge that actually matters (facing the
   reading column) rather than boxing the whole rail in, since both
   sides are otherwise flush against the true viewport edge or another
   chrome element, not floating with margin around them the way an
   ordinary card would be. */
/* No background/border of its own anymore — used to be one continuous
   panel wrapping the title and the chapter list together (the ::after
   comment above still describes why a panel treatment exists at all).
   Split into two separate boxes instead, on request: the title
   (.book-sidebar-title, below) and the chapter list (.sidebar-menu-
   container, §9 above) each carry their own background/border now,
   with the gap between them being wherever the title's own existing
   margin-bottom already fell — nothing repositioned, just where the
   background/border live. #quarto-sidebar itself goes back to being a
   plain positioning container.
   !important: #quarto-sidebar is also swept into the broad selector
   list at the very top of this section (.sidebar, #quarto-sidebar,
   ...), which still sets a flat --book-chrome-bg-solid fill — this is
   the one place that needs overriding back to nothing, or the "split
   into two boxes" look was just the same solid panel with two borders
   drawn on top of it instead of an actual gap between two independent
   boxes. Scoped to ≥1338px (the Full stage floor) — this element is a
   completely different thing below that width (§22/23: an off-canvas
   drawer, #quarto-sidebar.book-left-drawer-open, sliding out from
   underneath the reading column rather than a docked rail sitting
   beside it), and a plain unscoped rule here was making that
   drawer fully transparent too, confirmed live via getComputedStyle
   (rgba(0, 0, 0, 0)) and by screenshot — the reading column's own text
   visibly bled straight through the open drawer instead of the drawer
   showing its own solid fill. That drawer never got its own explicit
   background (§22's own rule doesn't set one, relying on the shared
   fill above), so once this override wasn't there to fight anymore,
   it falls back to that shared --book-chrome-bg-solid correctly. */
/* BUG FOUND during the 3-stage consolidation: this was actually still
   scoped to the OLD 1120px right-rail floor, not the 1200px value the
   comment above always claimed — meaning it silently made the drawer
   transparent throughout the entire old 1120–1199.98px range this
   whole time, contradicting its own documented intent. Fixed to match
   the comment (and the new 1338px Full floor) rather than just carried
   forward unchanged. */
@media (min-width: 1338px) {
	#quarto-sidebar {
		background-color: transparent !important;
	}
}

/* No longer a boxed panel — pulled out of the sidebar's own flow
   entirely (≥1200px fixed-position rule, §23) so it can float in line
   with the navbar's nav-link row above it instead of sitting inside
   the chapter-list rail. Transparent: a reader wanted it to read as
   floating text, not a box, once it left the rail. */
.book-sidebar-title {
	background-color: transparent;
	border: none;
}

/* Title, search, "Table of Contents," and the chapter list all live
   inside this one wrapper now (include-after-body script physically
   moves all four in) — one shared padding is the actual fix for
   keeping their left/right edges consistent with each other, replacing
   several rounds of independently-tuned padding/margin on each of them
   trying to approximate the same numbers (chapter-list-edge
   measurements, a margin-left nudge, a correction pass for Bootstrap's
   leftover mx-auto silently fighting that nudge — all now moot: with
   one shared box there's nothing left for them to drift apart from).
   min-width: 0 — #quarto-sidebar is display:flex/flex-direction:
   column, and flex items default to min-width:auto, which refuses to
   shrink a nowrap-content child (the title, see below) below its own
   full unwrapped text width; confirmed live this fed back into the
   title-font-scaling IIFE's own width measurement without it, each
   resize compounding the previous run's now-too-large font-size into
   a still-larger one. */
.book-sidebar-content {
	display: block;
	min-width: 0;
	/* !important: Quarto's own bundled Bootstrap CSS has a generic
	   #quarto-sidebar > * { padding-right: 1em; } rule (an ID selector,
	   confirmed live via document.styleSheets — beats this class
	   selector on specificity alone regardless of source order), which
	   was silently winning over the padding-right declared here.
	   27px right padding — title/search/"Table of Contents"/chapter-
	   list all share this one box, so every one of them insets by the
	   exact same amount and all four stay flush with each other. This
	   value used to cause visible per-element drift (0.5rem, then this
	   same 27px, both tried and reverted earlier) — but that drift's
	   real cause turned out to be two separate bugs downstream of this
	   padding entirely: the chapter row's own width was capped instead
	   of 100% (fixed, § chapter-title.has-chapter-num), and Quarto's
	   bundled .sidebar-section carried its own padding-left: 0.5em that
	   silently narrowed the chapter row's available width further
	   (fixed, § below). With both of those actually fixed, this shared
	   padding is safe again and every element tracks it identically.
	   27px matches the reading-column-to-margin-sidebar-text gap on the
	   opposite side of the page (measured live: #toc-title/margin-tools
	   text starts 31px right of the reading column's own right edge;
	   the reading column's border/shadow eats a few of those px on this
	   side, so 27px here lands the two gaps visually even). */
	padding: 1rem 27px 1rem 1rem !important;
}
/* Below the 1338px Full-stage floor only: the compact drawer's own
   chapter titles need to reach further right, flush with .book-
   mobile-brand's own right edge (now the same font-size as the docked
   title, previous comment) — the shared 27px right padding above is
   deliberately matched to the opposite rail for the ≥1338px docked
   sidebar specifically, so it can't just be lowered unconditionally
   without breaking that. Placed after the base rule (same
   specificity, both !important) so it actually wins for this
   narrower range instead of being silently overridden by source
   order. */
@media (max-width: 1337.98px) {
	.book-sidebar-content {
		padding-right: 8px !important;
	}
}
/* max-width: none !important — this element still carries its
   original .navbar-brand-container class underneath (not stripped,
   just added to; only its Bootstrap mx-auto sibling class was
   explicitly removed, in the include-after-body script) and some
   bundled Quarto/Bootstrap rule for that class still sets a
   responsive max-width (calc(100% - 115px), confirmed live) meant for
   its old horizontal-navbar context — silently clipping the title
   text and, worse, corrupting the title-font-scaling IIFE's own
   "natural width" measurement into a too-small number, which then
   scaled the font size up to compensate for a clipped box instead of
   the real one (confirmed live: title rendered a clipped "The
   Inversion" at 39px instead of the full text at a sane size). */
.book-sidebar-title {
	display: block;
	max-width: none !important;
	margin: 0 0 1rem;
}
/* Below the 1338px Full-stage floor, the site title already lives in
   the persistent header bar (.book-mobile-brand) — this drawer's own
   copy just repeated it a second time the moment the drawer opened,
   right above a "Table of Contents" row that already makes clear what
   the drawer itself is. Hidden here, not removed at the source: the
   docked ≥1338px rail still needs the real element (its own copy of
   the title is this rail's only one). */
@media (max-width: 1337.98px) {
	#quarto-sidebar .book-sidebar-title {
		display: none !important;
	}
}
/* Study mode's own width-independent copy — same reasoning as its
   other class-triggered duplicates elsewhere in this file: this needs
   to also hide at Stage 1 widths (≥1200px) whenever Study mode forces
   the sidebar off-canvas there, or its real title (revealed once the
   drawer opens) doubles up with .book-mobile-brand's fixed navbar
   copy at the same on-screen position — confirmed live, illegible
   overlapping text the moment a reader opened the drawer. */
html.book-study-mode #quarto-sidebar .book-sidebar-title {
	display: none !important;
}
/* Unlike the title above, this one isn't width-gated — the header bar's
   own search icon (.book-navbar-search-toggle) is now visible at every
   width, including the ≥1200px docked rail, so this drawer's copy
   (sitting right next to "Table of Contents") is a redundant second
   entry point to the same modal everywhere, not just below some
   breakpoint. Hidden here, not removed at the source: navSearch itself
   still physically lives inside this element (see the sidebar title/
   search relocation in _quarto.yml) — it's what the header icon's own
   click proxies through to — so the real widget still needs a home in
   the DOM even though nothing here is ever shown. */
#quarto-sidebar .book-sidebar-search {
	display: none !important;
}

/* .book-mobile-brand — the lightweight clone _quarto.yml leaves behind
   in the navbar itself (see the title-relocation IIFE) so the header
   still shows a site title even when the real title isn't on-screen —
   below 992px it's inside the off-canvas drawer, and from 992px up to
   1199.98px it's inside the docked-style drawer too (the fixed rail
   itself doesn't exist below 1200px, see §23), so a reader only ever
   sees the real title by opening that drawer. Hidden only at ≥1200px,
   where the always-visible docked rail's own copy already does this
   job — showing both would be a duplicate. No font-scaling override
   here (unlike .book-sidebar-title .navbar-brand) — this clone keeps
   Bootstrap's own default navbar-brand sizing, which is already right
   for a compact header slot. */
.book-mobile-brand {
	display: flex;
	align-items: center;
	color: var(--book-chrome-text) !important;
	font-family: Georgia, 'Times New Roman', serif;
	font-size: 1rem;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	max-width: none !important;
}
/* The wrapper's own color/font-size above don't actually reach the
   text — Quarto's bundled CSS sets its own explicit color and
   font-size directly on .navbar-brand/.navbar-title (the two elements
   this clone's own markup actually renders the title text through,
   confirmed live via cloneNode(true) carrying them over unchanged),
   and an explicit declaration on a descendant always wins over
   whatever an ancestor's own color/font-size resolves to, inheritance
   or not. That bundled color — confirmed live: rgb(89, 89, 89), a
   plain mid-gray — reads fine against Quarto's own white/light-per-
   theme secondary-nav bar it was written for, but this clone lives in
   the dark header bar instead, where a reader flagged it as "not
   gray," not matching the docked rail's own crisp --book-chrome-text
   title one width up. Same fix .book-navbar-search-toggle's own
   header comment already describes needing for the same reason.
   font-size forced back to this wrapper's own 1rem too — the bundled
   default was rendering at 23.375px, a good deal larger than the
   "compact header slot" sizing the rule above actually intends. */
.book-mobile-brand .navbar-brand,
.book-mobile-brand .navbar-title {
	color: var(--book-chrome-text) !important;
	/* Matches .book-sidebar-title .navbar-brand's own 1.15rem (§4349) —
	   was a flat 1rem, on the reasoning that this compact header slot
	   needed to render smaller than the full desktop sidebar's title.
	   A reader pointed out the real fix for the compact drawer's own
	   chapter-list alignment (numbers under the icon, titles flush with
	   this title's own right edge) was making this title render at the
	   same size/width it already does in full-width mode, rather than
	   chasing the gap with padding tweaks on the list below it. */
	font-size: var(--book-sidebar-title-font-size, 1.15rem) !important;
	font-family: Georgia, 'Times New Roman', serif !important;
}
@media (min-width: 1338px) {
	.book-mobile-brand {
		display: none !important;
	}
}
/* 992–1337.98px only: this bar also carries the full inline nav-link
   row here (Home/In Plain Terms/Appendices/…, not yet collapsed into
   the hamburger — that's Bootstrap's own native ≥992px behavior). Left
   as a normal flex item in .navbar-container, the title sat inside
   .navbar's own box — which is only as wide as the reading column, not
   the full viewport (§19c) — so it ate into that narrower box's own
   left side, shoving the nav-link row (centered *within that box*, not
   the page) visibly right of true page-center. Pulled out of flow with
   position: fixed instead: left: 1rem lands it at the true viewport
   edge regardless of .navbar's own narrower, off-center box, and the
   nav-links left behind now center correctly on the reading column
   again. #quarto-header (this title's positioned ancestor once
   headroom.js's own translateY transform is active on scroll) spans
   the full viewport width itself even though .navbar inside it
   doesn't, so left: 1rem resolves the same way whether or not that
   transform is currently applied — and the title correctly slides out
   with the rest of the header when headroom hides it, rather than
   staying pinned on-screen. */
@media (max-width: 1337.98px) {
	.book-mobile-brand {
		position: fixed;
		left: 1rem;
		top: 0;
		height: 52px;
		flex: 0 0 auto;
	}
}
@media (min-width: 992px) and (max-width: 1337.98px) {
	.book-mobile-brand {
		/* Pulling the title out of flow (above) fixed its own position,
		   but the nav-link row is still centered *within .navbar's own
		   box*, which itself shrinks and slides left as the viewport
		   narrows toward 992px — "Home" 's own left edge moves as the
		   window narrows, confirmed live. A flat max-width sized for the
		   wider end overlapped "Home" at the narrow end. clamp() tracks
		   the same live-measured relationship instead.
		   FLAGGED FOR LIVE RE-MEASUREMENT: this clamp's own endpoints
		   (90px at 992px, 195px at 1199px) were measured against the OLD
		   1199.98px ceiling of this range — the new 1337.98px ceiling
		   almost certainly has more room to spare at its own upper end,
		   so the 195px figure (and possibly the slope) needs re-measuring
		   against .navbar-nav's actual rect at 1359px before this is
		   considered correct, not just carried over unchanged. */
		max-width: clamp(90px, calc(90px + (100vw - 992px) * 0.5), 195px) !important;
	}
}
@media (max-width: 991.98px) {
	.book-mobile-brand {
		/* Below 992px there's no inline nav-link row to avoid (it's
		   collapsed into the hamburger entirely at this width) — the
		   constraint here is the icon cluster now fixed to the opposite
		   edge instead (.book-margin-tools/.book-navbar-search-toggle,
		   above), which this title clone started silently overlapping
		   the moment those two also became position: fixed across this
		   width too: still a normal, unconstrained flex item until now,
		   it could grow wide enough (295px, confirmed live at 500px) to
		   paint over the icon cluster outright, hiding them completely
		   (confirmed live: elementFromPoint over the icons' own
		   coordinates returned .book-mobile-brand, not the icons
		   underneath). ~160px reserved the icon cluster's own width
		   (search 28px + this row's own ~88px + gaps/insets) regardless
		   of exactly how many icons are showing at a given moment — but
		   went stale the moment the Typography/Margin settings dropdowns
		   (.book-settings-dropdown, two of them, 28px each) were added to
		   this same cluster later and never fed back into this figure.
		   Confirmed live: at 375px the icon cluster's own left edge
		   (.book-settings-dropdown, the Typography toggle, now the
		   cluster's true leftmost member) sits a constant 145px from the
		   viewport's right edge — stable across every width tested,
		   200–991px, since the whole cluster is itself right-anchored via
		   position: fixed, not flowed — while this rule was only reserving
		   160px total including the 50px left offset below, works out to
		   110px of headroom past this box's own right edge, well short of
		   the real 145px: the title visibly ran into "Aa," the first
		   dropdown's own icon, exactly as a reader reported ("The
		   Inversion of Greatn.Aa" with no gap at all, confirmed live via
		   screenshot at 375px and 320px both). 203px (145 + this rule's
		   own 50px left offset, below, + 8px of breathing room) is the
		   real figure now. */
		max-width: calc(100vw - 203px) !important;
		/* left: 50px, not the shared rule's own 1rem (16px, above) — the
		   hamburger toggler shares this same left edge below 992px
		   (unlike 992–1199.98px, where nav-links show inline and the
		   toggler never appears at all, the context the plain 1rem was
		   originally written for), and its own box runs to ~40.65px
		   (confirmed live, stable across every width tested). This title
		   becoming position: fixed at 1rem here too — the same change
		   that fixed the icon-cluster overlap, above — silently covered
		   the toggler with itself instead, since a link now sat directly
		   on top of the button at those same coordinates: confirmed
		   live, clicking the toggler navigated home (the title's own
		   link target) instead of opening the hamburger menu. 50px
		   clears the toggler's own right edge with a small gap. */
		left: 50px !important;
	}
}
/* Search, top right of the bar — right after "Resources" below 1200px
   (nav-links end, .quarto-navbar-tools picks up immediately after), the
   same right edge in that range too. Used to have no width-gated hide
   rule at all ("one icon, visible at every breakpoint" — see the
   .book-margin-search-toggle comment, further down, for why that's now
   split instead): hidden at ≥1200px below, where the right rail's own
   icon row carries its own copy (_quarto.yml's marginSearchToggle) as
   the docked view's real, always-visible entry point — the same "real
   widget in the docked rail, clone in the navbar for everything
   narrower" split .book-sidebar-title/.book-mobile-brand already use.
   Bare icon on the dark header bar (this bar stays --book-chrome-bg-
   solid at every width, unlike the white/dark-per-theme secondary-nav
   bar further down), so it needs the light chrome-text color
   .book-mobile-brand itself uses, not that bar's hsl(0,0%,35%). */
.book-navbar-search-toggle {
	display: flex;
	align-items: center;
	justify-content: center;
	margin-left: auto;
	background: transparent;
	border: none;
	padding: 0;
	width: 28px;
	height: 28px;
	color: var(--book-chrome-text) !important;
	opacity: 0.85;
}
.book-navbar-search-toggle:hover {
	opacity: 1;
}
.book-navbar-search-toggle i {
	/* 19px, matching Font/Palette (bi-type/bi-droplet-half) in this
	   same row exactly — was 15px with no line-height set, so the
	   inherited line-height (1.5) inflated its actual bounding box to
	   15×22.5 rather than a clean 15×15, reading as visibly bigger
	   than its neighbors despite a SMALLER nominal font-size.
	   Confirmed live via getBoundingClientRect(). line-height: 1 here
	   removes that inflation entirely, and 19px brings the glyph size
	   itself in line with the other two. */
	font-size: 19px;
	line-height: 1;
}
@media (max-width: 1119.98px) {
	.book-navbar-search-toggle i {
		/* Matches .book-margin-search-toggle i.bi exactly (§ its own
		   comment) — the docked rail's own search icon, same fixed
		   19×19 box (not font-size alone) as Font/Dark-Light's own
		   matching fix just below. A first pass here just lowered
		   font-size (19px, then 12px), scoped to 800-1119.98px only —
		   got sub-compact's three icons consistent with EACH OTHER and
		   with the docked rail, but true mobile (<800px) still used the
		   old flat 19px/no-box version, on direct confirmation still a
		   real, visible mismatch: "I want the true mobile to have the
		   same thing." No min-width floor anymore — one rule now covers
		   every width below the docked/Compact floor uniformly. 17px
		   matches Font/every other icon in that row (not Dark-Light's
		   smaller 14px, § its own comment). */
		font-size: 17px;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 19px;
		height: 19px;
	}
}
/* .book-navbar-font-toggle / .book-navbar-dark-light-toggle — Font and
   Dark/Light's own independent header clones, same reasoning as
   .book-navbar-search-toggle just above (resources/book-scripts.html
   has the full comment): the real controls live inside
   .book-margin-tools, a genuine DOM child of #quarto-margin-sidebar,
   which already works fine pulled into the header at 800-1337.98px and
   docked at ≥1338px — the one place it actually breaks is true mobile
   (<800px), where opening the off-canvas drawer reverts
   #quarto-margin-sidebar's overflow-y from visible back to auto for
   its own real scrolling content (nav#TOC), and that auto/scroll
   ancestor clips .book-margin-tools's own position:fixed paint (the
   same clipping bug this file's closed-state rule already fixes,
   just not the open one). Scoped to true mobile only, not
   .book-navbar-search-toggle's own wider ≤1119.98px range — the
   800-1337.98px range has no drawer-open state to break in the first
   place (anchored popup there, not this sliding drawer), so cloning
   there too would just be a second, redundant copy alongside the
   already-working original. display: none by default, shown only
   within the true-mobile block below. */
.book-navbar-font-toggle,
.book-navbar-dark-light-toggle {
	display: none;
	align-items: center;
	justify-content: center;
	background: transparent;
	border: none;
	padding: 0;
	width: 28px;
	height: 28px;
	color: var(--book-chrome-text) !important;
	opacity: 0.85;
}
.book-navbar-font-toggle:hover,
.book-navbar-dark-light-toggle:hover {
	opacity: 1;
}
.book-navbar-font-toggle i,
.book-navbar-dark-light-toggle i {
	/* Unscoped fallback only — every real width below the docked/
	   Compact floor now gets its own override just below, covering both
	   sub-compact and true mobile alike. */
	font-size: 19px;
	line-height: 1;
}
@media (max-width: 1119.98px) {
	/* Matches the docked rail's own .book-light-dark-toggle i.bi /
	   .book-margin-search-toggle i.bi exactly (§ each one's own
	   comment) — on request: "I want the size of the icons to be the
	   same[,] whether it's in full screen mode or... smaller modes."
	   A flat font-size on its own doesn't get there: the docked rail's
	   own icons render a fixed 19×19 BOX regardless of font-size (14px
	   and 17px both measured 19×19 there, confirmed live) via
	   display: inline-flex + explicit width/height centering the glyph
	   inside, not by letting font-size drive the box directly the way
	   these clones' own line-height: 1 approach does. Two earlier passes
	   (19px, then 12px) only ever adjusted font-size, scoped to
	   800-1119.98px only — got sub-compact matching the docked rail, but
	   true mobile (<800px) still used the old flat 19px/no-box version,
	   on direct confirmation still a real mismatch: "I want the true
	   mobile to have the same thing." No min-width floor anymore — one
	   rule now covers every width below the docked/Compact floor
	   uniformly. font-size itself still differs from Font's own 17px on
	   purpose — this is Dark-Light's icon specifically, matching
	   .book-light-dark-toggle's own smaller 14px (its glyph reads
	   heavier at the same nominal size, same reasoning as that rule's
	   own comment). */
	.book-navbar-dark-light-toggle i {
		font-size: 14px;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 19px;
		height: 19px;
	}
	/* Font's own icon — matches .book-margin-search-toggle/every other
	   icon in that row's shared 17px, not Dark-Light's smaller 14px. */
	.book-navbar-font-toggle i {
		font-size: 17px;
		display: inline-flex;
		align-items: center;
		justify-content: center;
		width: 19px;
		height: 19px;
	}
}
@media (min-width: 1120px) {
	.book-navbar-search-toggle {
		display: none !important;
	}
}
/* 992–1199.98px only: mirrors the title's own fix just above — left as
   a normal flex item, this icon sat at .navbar's own right edge, which
   is only as wide as the reading column, not the full viewport (§19c),
   so it read as adrift from the true page edge once the title moved to
   sit flush against it on the other side. Pulled out to the true right
   edge the same way, via position: fixed. No clamp() needed here like
   the title's: the nav-link row's own right edge ("Resources") never
   comes closer than ~158px from the true viewport edge anywhere in
   this range (confirmed live at 992/1100/1199px), well clear of a
   plain 1rem inset. */
@media (max-width: 1119.98px) {
	/* Was min-width: 992px too (a "transition width only" range) — a
	   reader who first asked for this treatment explicitly excluded
	   "the mobile" at the time, then asked for it there too once they'd
	   seen it work. Below 992px .navbar itself is already full viewport
	   width (only the 992–1199.98px range narrows it to mimic the
	   docked view's own floating bar, §19), so .book-navbar-search-
	   toggle's base rule (no media query, further up) would otherwise
	   leave it a normal flex item inside .quarto-navbar-tools instead of
	   fixed at a predictable right: 1rem — confirmed live at 500px
	   before this: position: static, sitting ~12.75px off the true
	   edge, not the exact 16px .book-margin-tools (below) assumes.
	   Extending this same fixed/right: 1rem treatment down through
	   every width below 1200px keeps that anchor point consistent
	   everywhere .book-margin-tools also needs it. */
	.book-navbar-search-toggle {
		position: fixed;
		right: 1rem;
		top: 0;
		height: 52px;
		margin-left: 0;
	}
	/* The right drawer's own icon row (Dim margin/Font/Layout/Palette —
	   search excluded, see .book-margin-search-toggle just below) moves
	   up into the header bar at every width below 1200px instead,
	   sitting immediately left of .book-navbar-search-toggle above — a
	   reader wanted these reachable "up in the top menu" without opening
	   the drawer first, the same way search already was, on mobile too
	   and not just the 992–1199.98px range this started in. Same fixed/
	   viewport-right-edge technique .book-navbar-search-toggle itself
	   uses here, not the --book-navbar-bar-left-relative one .book-
	   margin-tools uses at ≥1200px (§23) — that positions relative to
	   the floating nav bar specifically, a different visual target than
	   this width's simpler edge-anchored header icons. 28px clears
	   .book-navbar-search-toggle's own 1rem-inset 28px-wide box; 0.75rem
	   (was 0.5rem) is the same "search sits apart from the rest of the
	   row" gap the ≥1200px docked view now uses too (§23's own .book-
	   margin-search-toggle margin-left) — one consistent separation at
	   every width, not a smaller one here just because this side
	   happened to reach the right edge first. */
	.book-margin-tools {
		position: fixed !important;
		top: 0 !important;
		right: calc(1rem + 28px + 0.75rem) !important;
		left: auto !important;
		width: auto !important;
		height: 52px !important;
		margin-bottom: 0 !important;
		/* Same stacking-context trap #quarto-sidebar/#quarto-margin-
		   sidebar themselves needed fixing (§23's own comment has the
		   full reasoning) — this element is a descendant of #quarto-
		   margin-sidebar, which carries its own inline z-index: 5 from
		   Quarto's positioning script at every width too, trapping this
		   row below #quarto-header's own z-index: 1070 regardless of its
		   own value here without a matching override. 1075, not 1071 —
		   1071 only ever needed to clear the header (1070); .book-
		   running-head (the scrolled-state breadcrumb bar, § its own
		   rule) sits at 1074, ABOVE that old 1071, and once a reader
		   scrolls past the top this row's own real Font/Dark-Light/
		   Search controls sat exactly in the path of that bar sliding
		   into place — confirmed live: the icons' own rects never
		   actually moved, they were simply painted over. Directly
		   reported: "when you're scrolling down in subcompact mode, the
		   [Aa] and the dark light does not... stay there. It goes up
		   with the top menu... it's supposed to stick, whatever the
		   search icon is doing." .book-navbar-search-toggle (the search
		   icon specifically) never had this problem because it's a
		   plain descendant of .navbar itself, which the running-head bar
		   never covers (different stacking branch); this row needed its
		   own bump to match. */
		z-index: 1075 !important;
	}
	/* Redundant with .book-navbar-search-toggle (above, already covering
	   every width below 1200px) now that the rest of this row joins it
	   up here too — hidden rather than removed at the source, matching
	   every other "real widget vs. narrow-width clone" split in this
	   file (.book-sidebar-title/.book-mobile-brand, etc.). */
	.book-margin-search-toggle {
		display: none !important;
	}
	/* Focus mode / Layout / Chapter Contents / Margin Notes: below this
	   width both #quarto-sidebar and #quarto-margin-sidebar are already
	   off-canvas (confirmed live: both measured left/right: -300px at
	   1072px, book-compact-mode alone — the auto-crunch class — isn't
	   what pushes them off-canvas; this narrower breakpoint is), so all
	   four of these buttons control a docked rail that no longer
	   exists at this width: Focus mode dims a rail that isn't shown,
	   Layout crunches a sidebar that's already off-canvas regardless,
	   Chapter Contents/Margin Notes switch content inside a margin rail
	   that isn't docked either. A reader spotted them sitting in the
	   header with nothing left to do: "those don't need to be in the
	   top menu anymore at this stage... it should just be the font,
	   the search, and the colors." Font (.book-settings-dropdown),
	   the light/dark toggle, and search are untouched — none of them
	   depend on a docked rail. */
	.book-quick-toggle {
		display: none !important;
	}
}
/* Layout specifically (not Chapter Contents/Margin Notes, which stay
   meaningful all the way down to the 1119.98px cutoff just above) hides
   at the wider 1337.98px boundary instead — this button only ever
   toggles html.book-study-mode, a manual opt-in for the same crunched
   layout html.book-compact-mode already applies AUTOMATICALLY at any
   width below 1338px (confirmed: dozens of rules elsewhere in this file
   pair the two classes on the identical selector body, e.g. html.book-
   compact-mode .book-mobile-brand, html.book-study-mode .book-mobile-
   brand — compact-mode alone already satisfies them). Below 1338px,
   toggling Layout genuinely changes nothing on screen — on request:
   "anything in compact mode or less... if it doesn't have the space for
   full mode, does the compact icon hide from view? That way people
   don't click it, and it does nothing." :has() targets the button
   containing Layout's own distinguishing element (COMPACT_ICON_SVG,
   resources/book-scripts.html) rather than Chapter Contents/Margin
   Notes, which share the exact same .book-quick-toggle class with no
   button-specific class of their own to select by instead. */
@media (max-width: 1337.98px) {
	.book-quick-toggle:has(.book-compact-icon) {
		display: none !important;
	}
}
/* True mobile ONLY (below 800px) — .book-margin-tools (Font/Palette/
   dark-mode-toggle/Search) needs to scroll away with the top menu
   here, and ONLY here. This range flip-flopped three times live before
   landing on this as the actually-confirmed spec: "the right side
   icons stay put [at] compact mode... if it's larger than compact
   mode, the right side icons stay put... permanent stay put. When it
   gets smaller than compact mode, that's when those disappear off the
   screen." Full stage (≥1338px, genuinely docked inline, never
   position: fixed) and Compact mode (800-1337.98px) both keep the
   ORIGINAL always-stationary behavior, full stop — no scroll tie at
   all in either. A middle attempt widened this same range to
   max-width: 1337.98px (covering Compact too) chasing a DIFFERENT bug
   (nav-links + reading-column width, fixed separately, see
   .navbar-collapse's own two rules above/below) that only happened to
   look similar in symptom — narrowed back to where it always should
   have been. .book-margin-tools is the ONLY place Font/dark-mode-
   toggle/search actually work below 800px too (.quarto-navbar-tools'
   own copy has no font control at all and its native dark-toggle is
   deliberately display:none — book-scripts.html hides it in favor of
   this custom one), so this can't just disappear outright down there;
   it has to keep existing, just tied to the header's own hide state
   instead of floating independently. Same html.book-chrome-unpinned
   tracker plus top-swap technique .book-running-head/.book-floating-
   *-toggle already use (resources/book-scripts.html's own independent
   scroll tracker, not Quarto's bundled headroom class directly - see
   .book-running-head's own comment for why that distinction matters
   here). -52px matches the navbar's own translateY(-100%) hide
   distance at this height. */
@media (max-width: 799.98px) {
	.book-margin-tools {
		/* 200ms linear — matches headroom's own transition timing (§19,
		   .book-running-head's identical comment) — added back on
		   direct, repeated correction: an instant snap read as "hiding,"
		   not as sliding away with the rest of the top menu the way the
		   nav-links and search icon already visibly do. Removed once
		   already to fix a real crossing-paths glitch against
		   .book-running-head's own opposite-direction slide (see git
		   history) — that trade is being made the other way now, on
		   explicit request: a smooth slide that visually matches the
		   navbar is the actual ask, taking priority over the brief
		   crossover artifact this reintroduces. */
		transition: top 200ms linear;
	}
	html.book-chrome-unpinned .book-margin-tools {
		top: -52px !important;
	}
	/* .book-navbar-search-toggle (the search icon) looked like it
	   needed the same top-swap .book-margin-tools just got — on
	   request, "the search icon is already sliding up" while Aa/dark-
	   mode-toggle weren't. Tried adding the identical rule here first;
	   confirmed live that it DOUBLE-offset the icon (-104px, not
	   -52px) instead of fixing anything. Root cause: unlike
	   .book-margin-tools, this element's parent chain runs through
	   .quarto-navbar-tools inside .navbar itself — and .navbar carries
	   its own transform: translateY(-100%) when headroom hides it,
	   which makes .navbar the containing block for any position:fixed
	   descendant (the same transform-breaks-fixed-descendant trap
	   this file has hit before). That's WHY the search icon already
	   moved correctly with no rule of its own: it rides its
	   transformed ancestor's own hide motion for free, automatically,
	   the same way any ordinary child would. Adding a second, separate
	   -52px on top of that stacked two hides into one. No rule needed
	   here at all — left alone on purpose. */

	/* Font/Dark-Light's own header clones — same free ride as
	   .book-navbar-search-toggle above (same parent, same reasoning),
	   so no headroom top-swap rule needed here either. Positioned
	   immediately left of search (1rem + 28px + 0.75rem per icon,
	   matching .book-margin-tools's own pulled-up spacing formula
	   elsewhere in this file), in the same Font/Dark-Light/Search
	   left-to-right order the drawer itself always used. The real
	   controls (.book-settings-dropdown/.book-light-dark-toggle) are
	   hidden for the width of this block — these clones take over
	   their job entirely down here, the same real-widget/narrow-clone
	   split .book-navbar-search-toggle/.book-margin-search-toggle
	   already use. */
	.book-navbar-dark-light-toggle {
		display: flex;
		position: fixed;
		right: calc(1rem + 28px + 0.75rem);
		top: 0;
		height: 52px;
	}
	.book-navbar-font-toggle {
		display: flex;
		position: fixed;
		right: calc(1rem + (28px + 0.75rem) * 2);
		top: 0;
		height: 52px;
	}
	/* .book-light-dark-toggle: plain display:none is enough — its click
	   handler is a normal listener with no visibility guard of its own.
	   .book-settings-dropdown needs a different technique: Bootstrap's
	   own Dropdown component refuses to open a toggle whose element has
	   display: none (confirmed live — .book-navbar-font-toggle's own
	   proxy click went through, aria-expanded stayed "false" regardless,
	   only once display:none was in the way), so it's moved off-screen
	   instead — display stays non-none, keeping Bootstrap satisfied,
	   while pointer-events: none and the -9999px offset keep a reader
	   from ever seeing or reaching it directly. */
	.book-settings-dropdown {
		position: absolute !important;
		left: -9999px !important;
		pointer-events: none !important;
	}
	.book-light-dark-toggle {
		display: none !important;
	}
}
/* 800-1119.98px: Font/Dark-Light's navbar clones are now the ONLY
   version shown at this width, full stop — not gated behind
   body.mobile-margin-open the way this range originally had it (that
   version only swapped the clones in while the right drawer was open,
   to dodge a clipping bug, and left .book-margin-tools's own real
   controls as the everyday version the rest of the time). Reverted to
   a plain, permanent embed on direct, repeated request: "why are they
   doing their own thing? They're supposed to be embedded [in] the top
   menu the same way as everything else is." Title, the nav-links, and
   search (.book-navbar-search-toggle) are all genuine DOM children of
   .navbar and always were — they get the header's own hide/show
   motion for free, automatically, with zero synced CSS of any kind.
   .book-margin-tools's own real Font/Dark-Light controls live outside
   .navbar entirely (inside #quarto-margin-sidebar's own subtree), so
   every attempt to make THEM match search's motion needed hand-tuned,
   parallel CSS (a top-swap with matching transition timing, a z-index
   bump to clear .book-running-head, and still ran into the drawer's
   own clipping bug on top of all that) — real motion parity, but never
   truly identical, and a second, differently-sized element (§ its own
   19px vs the real controls' own smaller glyph, confirmed live) swapped
   in on drawer-open, reading as the icons "getting bigger." Making
   these two clones (already built, already genuine .navbar children,
   already perfectly in sync with search for free) the ONLY version at
   this width — same one .book-margin-search-toggle already gets — is
   simpler than continuing to hand-sync a second, separate element:
   one element, one native mechanism, nothing left to keep in sync. */
@media (min-width: 800px) and (max-width: 1119.98px) {
	.book-navbar-dark-light-toggle,
	.book-navbar-font-toggle {
		display: flex;
		position: fixed;
		top: 0;
		height: 52px;
	}
	.book-navbar-dark-light-toggle {
		right: calc(1rem + 28px + 0.75rem);
	}
	.book-navbar-font-toggle {
		right: calc(1rem + (28px + 0.75rem) * 2);
	}
	.book-settings-dropdown {
		position: absolute !important;
		left: -9999px !important;
		pointer-events: none !important;
	}
	.book-light-dark-toggle {
		display: none !important;
	}
	/* .book-margin-tools itself has nothing left to show at this width
	   once Font/Dark-Light (above) and Search (.book-margin-search-
	   toggle, already display: none below 1200px, § its own comment)
	   are both accounted for elsewhere — .book-quick-toggle (Layout/
	   Chapter Contents/Margin Notes) is already hidden here too (§ its
	   own rule). Hidden outright rather than left as an empty box still
	   competing for z-index against .book-running-head or clipped by
	   the drawer's own overflow — none of that machinery has anything
	   left to protect. */
	.book-margin-tools {
		display: none !important;
	}
}
/* max-width/overflow overrides: some combination of Bootstrap's/
   Quarto's own bundled CSS for these classes (built for their
   original spot in a horizontal navbar, where the title needs to
   truncate rather than push other nav items around) was clipping the
   title to a single truncated line here — "The …" — confirmed live.
   white-space stays nowrap deliberately, not switched to wrapping —
   see the title-font-scaling IIFE (include-after-body script) just
   below, which scales the font-size itself to exactly fill
   .book-sidebar-content's own available width on one line, the
   "flexible width" behavior this title always had back when it lived
   in the navbar, just re-targeted at its new column instead of a
   navbar slot. */
.book-sidebar-title .navbar-brand {
	max-width: none !important;
	overflow: visible !important;
	white-space: nowrap !important;
}
/* Search sits to the left of "Table of Contents," on the same row (see
   .book-sidebar-toc-row) — no longer its own full-width block, no
   bottom margin of its own needed. */
.book-sidebar-search {
	display: block;
	flex: 0 0 auto;
}
/* One row, icon on the left / label on the right — search used to be
   styled as a full-width bar (background, border, padding, a
   ::after: 'Search' label) sitting above "Table of Contents" on its
   own line. A reader felt that read as "a real search field" when it
   isn't one (Algolia's own detached-search-button markup is a button
   that opens a separate modal, not an inline text input, no matter how
   it's styled) — shrunk down to what it actually is: a bare icon,
   sized and placed the same as the sidebar's own other small icons. */
.book-sidebar-toc-row {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	/* 0, not 0.405rem — that value dated from before #toc-title (the
	   right rail's own equivalent header) was refactored to produce its
	   own "gap before the list below" via internal padding-bottom
	   instead of external margin-bottom (see #toc-title's own comment,
	   "padding-top/-bottom: 0.4rem replaces the old margin-bottom: 0.4rem
	   here"), specifically so it and .book-sidebar-brand shared one box
	   model. This row's own margin-bottom never got the matching update,
	   so it kept adding ~6.9px of external space "Preface" fell into
	   that "Heading Level Two" (the right rail's own first entry, sitting
	   flush against #toc-title with zero extra margin) never had — a
	   reader compared the two side by side and asked for them to match.
	   Zero here, same as #toc-title's now-zero margin, makes the two
	   flush the same way. */
	margin-bottom: 0;
}
.book-sidebar-search .aa-DetachedSearchButton {
	display: flex !important;
	align-items: center;
	justify-content: center;
	/* Sized to exactly match the icon inside it (17×17, see
	   .aa-SubmitIcon below) — a bigger box centered the icon inside its
	   own extra padding, insetting the actual glyph a few px right of
	   the chapter list's own number column instead of sitting flush
	   with it. */
	width: 17px;
	height: 17px;
	background: transparent !important;
	border: none !important;
	border-radius: 4px;
	padding: 0 !important;
	color: var(--book-chrome-text) !important;
	/* 0.55 — matches the chapter list's own number column exactly
	   (.sidebar-chapter-num, confirmed live), not the 0.65 the other
	   right-rail icons use. */
	opacity: 0.55;
	transition: opacity 120ms ease;
}
.book-sidebar-search .aa-DetachedSearchButton:hover {
	opacity: 1;
}
.book-sidebar-search .aa-DetachedSearchButtonIcon {
	display: flex;
	flex-shrink: 0;
}
.book-sidebar-search .aa-SubmitIcon {
	width: 15px !important;
	height: 15px !important;
}
.book-sidebar-search .aa-DetachedSearchButtonPlaceholder,
.book-sidebar-search .aa-DetachedSearchButtonQuery {
	display: none;
}

/* 0, not 0.1rem — the last residual sliver once .book-sidebar-toc-row's
   own margin-bottom (above) was zeroed to match #toc-title's zero
   margin on the right rail; zeroing this too lands "Preface" flush
   against "Table of Contents" the same way "Heading Level Two" already
   sits flush against "Page Contents." */
#quarto-sidebar .sidebar-menu-container ul.mt-1 {
	margin-top: 0 !important;
}

#quarto-sidebar .sidebar-menu-container {
	/* Was padding-top: 0 (and no padding at all on the other three
	   sides) — a reader compared this box to a reference mockup and
	   pointed out the content ("Table of Contents" and the chapter
	   list) sat flush against all four of its own edges, confirmed
	   live (padding: 0px). The mockup's own "inner box" reads as
	   genuinely inset from its own boundary on every side, not just
	   visually close to the outer rail. This box's own outer footprint
	   is left alone (still positioned by .book-sidebar-content's own
	   padding, one level up) — only this element's own padding
	   changes, so the chapter list itself reflows a little narrower to
	   sit inset within the same box rather than the box growing to
	   accommodate it. */
	padding: 0.75rem 1rem !important;
}
/* Docked rail only (≥1338px): 17px left/right, matching #toc-title's
   own real inset on the opposite rail (confirmed live: 17px from
   #quarto-margin-sidebar's own edges on every side, on the Table of
   Contents page specifically) — not the 0 an earlier pass here briefly
   used. That zeroing was aimed at a different, narrower comparison
   (this box against .book-sidebar-title directly above it, both flush)
   and did make those two match each other — but a reader's actual
   reference all along was the opposite rail's own already-correct
   inset, not flush-against-.book-sidebar-title. .book-sidebar-title's
   own matching 17px (§ its own comment, below) keeps the two in sync
   with each other again, now both matching the right rail's real
   value instead of both matching a flush edge that was never the
   target. Every narrower view (true mobile, the 800–1337.98px popup)
   keeps the shared rule's own 1rem, unrelated to this comparison and
   already tuned separately.
   padding-top reverted to the shared rule's own 0.75rem (was briefly
   1.5rem): that doubling was aimed at the same superseded flush-title
   comparison above, and it pushed "Table of Contents" 12.75px lower
   than #toc-title/"Page Contents" on the opposite rail — confirmed
   live, a reader compared the two side by side and found them
   visibly misaligned, off by exactly the one extra 0.75rem this
   rule had added. Back to 0.75rem lines the two up again. */
@media (min-width: 1338px) {
	#quarto-sidebar .sidebar-menu-container {
		padding-left: 17px !important;
		padding-right: 17px !important;
		padding-top: 0.75rem !important;
	}
}
/* True mobile only (below 800px): the off-canvas drawer's own chapter
   titles need to reach further right, flush with .book-mobile-brand's
   own right edge — stacked on top of .book-sidebar-content's own 27px
   right padding, the combined inset otherwise left chapter titles
   ending well short of the drawer's own "The Inversion of Greatness"
   title above it. A flat, unscoped version of this same override
   previously also hit the ALWAYS-DOCKED ≥1338px sidebar by accident —
   a reader confirmed that rail used to be exactly 255px wide, lined up
   precisely under the title, and this same change had silently
   widened it. Scoping the override to the compact range (max-width:
   1337.98px) fixed that, but that same range also covers the Compact-
   mode anchored POPUP (800-1337.98px, a different UI entirely, no
   .book-mobile-brand title sitting above it to align with) — the zero
   right-padding leaked in there too, on request compared directly
   against the Page Contents popup: "the table of contents needs a
   little bit more padding out to the right... it's too close to the
   right edge." Narrowed to max-width: 799.98px, matching only the true
   off-canvas drawer this was actually written for; Compact mode's own
   popup now keeps the base rule's symmetric 0.75rem/1rem padding on
   all four sides, same as it had before this override ever existed. */
@media (max-width: 799.98px) {
	#quarto-sidebar .sidebar-menu-container {
		padding-right: 0 !important;
	}
}

/* !important: this element's own class="sidebar margin-sidebar"
   (confirmed live) puts it inside the same broad .sidebar, #quarto-
   sidebar, ... selector (§9 above) that still sets a flat
   --book-chrome-bg-solid fill — same fix #quarto-sidebar itself needed
   for the exact same reason. Scoped to ≥1200px, same as that fix —
   below that width this element is a completely different thing (§24:
   an off-canvas drawer sliding in over the page, background-color:
   var(--book-chrome-bg-solid) set explicitly in that same section),
   and this unscoped override was beating that explicit color anyway
   (!important vs. none), making the open drawer fully transparent —
   confirmed live via getComputedStyle (rgba(0, 0, 0, 0)) and by
   screenshot: the reading column's own text visibly bled straight
   through it, exactly the "translucent, needs to not be" a reader
   reported. */
@media (min-width: 1120px) {
	#quarto-margin-sidebar {
		background-color: transparent !important;
	}
}
#quarto-margin-sidebar {
	/* No background/border of its own anymore — split into two separate
	   boxes on request, same as the left rail (§9 above has the full
	   reasoning): .book-margin-tools (the icon row, below) and nav#TOC
	   (the chapter-contents list, below) each carry their own now,
	   with the gap between them being wherever .book-margin-tools's own
	   existing margin-bottom already fell. This element goes back to
	   being a plain positioning container.
	   min-height: 100vh removed — with a background that now actually
	   reads as a distinct panel instead of matching the page exactly,
	   forcing this box to always run the full viewport height left a
	   short chapter's TOC (a handful of entries) sitting inside a tall
	   panel that dead-ended in a large blank area below it, the same
	   "not a block" complaint a reader raised about a bare content-
	   length mismatch even before this panel treatment existed. Auto
	   height instead — this rail now closes around whatever it
	   actually holds, the same way the left rail already does.
	   padding-top: var(--book-navbar-height, 52px), not a flat 2.1rem —
	   this unscoped default was quietly the only rule covering the
	   800–991.98px gap between the transition range's own explicit
	   override (§ below, 992–1199.98px) and the true-mobile one (§21,
	   below 799.98px), landing nav#TOC's content ~36px lower than the
	   header there. Tracking --book-navbar-height instead lands it
	   flush with the header's own live height in that gap the same way
	   the ≥1200px docked rail (§24) and the two explicitly-scoped
	   ranges below now do — a reader compared this rail to the left
	   one and asked for both flush with the reading column's own top,
	   at every width, not just ≥1200px. */
	padding-top: var(--book-navbar-height, 52px);
	padding-left: 1rem;
	padding-right: 0.5rem;
	/* No max-width cap: the element's own width (set below, ≥1200px) and
	   the grid track it sits in (body-end/page-end) both read the same
	   --book-margin-w variable, so they can't drift apart the way a
	   literal fixed width once did against a narrower track. Letting
	   this grow unbounded is intentional — on very wide displays the
	   sidebar should never wrap. */
}
/* Compact mode's own anchored-popup form (800-1337.98px, § the two
   ranges below) doesn't need this outer inset at all — nav#TOC inside
   it already carries its own full padding: 0.75rem 1rem !important
   (§ its own comment), so the two layers stacked: this element's own
   1rem/0.5rem PLUS nav#TOC's own 1rem/0.75rem on top of it, well over
   double the single-layer inset the left ToC popup uses (its own
   .sidebar-menu-container padding, nothing above it). Confirmed live
   directly against that popup, on request: "there's way too much
   space on the outside... it needs to be looking the same as the
   table of contents." Zeroed here, leaving nav#TOC's own padding as
   the only layer — same single-layer structure as the left popup,
   not attempting to hand-tune two stacked values into looking right
   together. Left alone at every other width (≥1338px docked, <800px
   drawer) — neither of those stacks with nav#TOC the same way, since
   the popup-specific version of nav#TOC's own padding only exists in
   this one range. */
@media (min-width: 800px) and (max-width: 1337.98px) {
	#quarto-margin-sidebar {
		padding-left: 0 !important;
		padding-right: 0 !important;
	}
}
/* A "bleed the panel color out to the true viewport edge" mechanism
   used to live here (originally a box-shadow: 9999px 0 0 9999px trick,
   later a ::after pseudo-element after that shadow's own spread turned
   into a giant, wrongly-tall gray block once this box stopped being
   forced to min-height: 100vh) — removed outright rather than patched
   a third time. Its whole premise was "for whenever this box's own
   rendered width is narrower than the grid track it sits in," but
   --book-margin-w drives both this box's width (below) and that same
   grid track's own size (§19c's grid-template-columns) — the same
   variable, not two that could independently drift — so the gap it
   was defending against can't actually occur. The pseudo-element
   version's own 9999px width also turned out to silently count toward
   this box's scrollable overflow (its overflow-y: auto below promotes
   overflow-x to auto too, per the CSS Overflow spec, once one axis
   isn't visible), creating a phantom horizontal scrollbar confirmed
   live as a reader's own report — a second bug from code defending
   against a scenario the CSS itself doesn't allow. */

/* Font/Layout/Palette/Dim-margin — moved here from the navbar
   (include-after-body script's marginToolsHome) so the right sidebar
   reads the same "one static block" way the left one does: tools on
   top, Page Contents below. Reuses .book-quick-toggle/.book-settings-
   dropdown as-is (their own styling was never navbar-specific — only
   their old container's positioning was, which this replaces). */
.book-margin-tools {
	display: flex;
	align-items: center;
	gap: 0.15rem;
	margin-bottom: 1.25rem;
	/* No longer a boxed panel — see .book-sidebar-title's matching
	   comment (§9): pulled out of the rail's own flow (≥1200px
	   fixed-position rule, §23) to float in line with the navbar's
	   nav-link row, transparent instead of boxed. */
	background-color: transparent;
	border: none;
}
/* Tried a Notes-mode-specific background + box-shadow halo here at one
   point, on the theory that a solid fill on this box would mask
   scrolling notes behind it. Removed — that theory was wrong:
   .book-margin-tools is itself position: fixed with its own z-index
   (1071, confirmed live via getComputedStyle) — one BELOW the note
   overlay's 1072, so it loses that comparison directly regardless of
   what background or box-shadow sits on it, or what #quarto-margin-
   sidebar's own (higher, 1075) z-index is: an independently fixed-
   position element competes on its OWN z-index, not its ancestor's.
   The visible "fix" earlier only ever held on pages that also happened
   to have #book-margin-fade-scrim active (a genuine sibling of the
   overlay at the right stacking level — see that element's own
   comment, just below) — the scrim was always the real, working fix
   for this row; it's been widened to cover this box and extended down
   to cover #toc-title below it too, once both turned out to need it. */

.book-settings-dropdown {
	position: relative;
}

#quarto-margin-sidebar nav,
#quarto-margin-sidebar nav#TOC {
	width: 100%;
	max-width: none;
	/* Matches .sidebar-menu-container's own background (§9, the left
	   rail's chapter list) — that rule's flat --book-chrome-bg-solid
	   fill sits on top of the lightened panel color the outer #quarto-
	   sidebar itself now uses, reading as a distinct "box within the
	   box" around the list specifically. This rail's own TOC list had
	   no matching fill at all (fully transparent, just showing the
	   lightened panel straight through), so the two rails read as
	   structurally different — a reader wanted both to actually match:
	   same box, same width, under each rail's own label. No border —
	   briefly matched .sidebar-menu-container's own border when that
	   still had one, removed from both on the same later request once
	   each box had settled into its final position. */
	background-color: var(--book-chrome-bg-solid);
}
/* Same "content sat flush against every one of this box's own edges"
   fix as .sidebar-menu-container's matching comment (§9) — padding on
   nav#TOC specifically (not the bare nav selector above, to avoid
   touching some other unrelated nav this rail might ever contain),
   same values as the left rail's own box so the two read as genuinely
   symmetric insets, not just matching outer footprints. */
#quarto-margin-sidebar nav#TOC {
	padding: 0.75rem 1rem !important;
}
/* Compact mode's own anchored popup (1120-1337.98px — narrowed down
   from the old 800-1337.98px once 800-1119.98px got its own true
   sliding drawer instead, § #quarto-margin-sidebar's matching
   800-1119.98px block above; that range now has its own dedicated
   alignment rule below rather than sharing this one) needs its own
   top padding tightened to match — the left popup's inner box drops
   to padding-top: 5px in this range, but nav#TOC here kept the
   unscoped 0.75rem/12px above, landing its content 7px lower than the
   left popup's relative to each popup's own (near-identical)
   icon-anchored top offset. Confirmed live and directly reported:
   "table of contents... lines up perfectly with the icon, whereas
   page contents... does not." Placed after the base rule above so it
   actually wins — same specificity, later source order. */
@media (min-width: 1120px) and (max-width: 1337.98px) {
	#quarto-margin-sidebar nav#TOC {
		padding-top: 5px !important;
	}
}
/* 800-1119.98px: a first pass here tried to line this rail's title up
   pixel-for-pixel with .book-floating-margin-toggle's own floating
   position (the icon that opens this drawer), deriving a calc()
   formula from the toggle's own right: position. Reverted on further
   request: this drawer needs to "still look like the sliding menus
   from mobile modes... that same appearance" — true mobile's own
   version doesn't chase its trigger button's position at all, it just
   uses a plain fixed inset, and chasing the icon here specifically
   had a real cost besides being the wrong look: the icon sits deep
   enough into the drawer (positioned relative to the READING COLUMN's
   own varying edge, not this drawer, which has its own separately
   variable min(300px, 85vw) width) that matching it consumed most of
   the drawer's own width, truncating longer entries ("1.1.1 Reali...",
   confirmed live). A second pass then left this at the plain 34px
   stack (#quarto-margin-sidebar's own base padding-left: 1rem + nav#TOC's
   own base 0.75rem 1rem, no override needed), reasoning it matched true
   mobile's own left rail — reverted again, on a more specific request:
   the actual reference should be how far the docked rail's own content
   sits from the READING COLUMN, not an unrelated true-mobile figure.
   Confirmed live at 1600px: 10px between the reading column and the
   docked #quarto-margin-sidebar box itself, plus 17px more inside that
   box before nav#TOC's own text — 27px total, not 34px. A third pass
   then set padding-left: 10px here, on the assumption it would stack
   with #quarto-margin-sidebar's own unchanged base padding-left: 1rem
   to reach that same 27px (17 + 10) — wrong assumption, confirmed live:
   this rail's OUTER padding-left is actually 0px at this width, not
   17px, because a wider, older rule (§ its own comment, "Compact mode's
   own anchored-popup form (800-1337.98px)... zeroed here") predates
   this session's split of that single 800-1337.98px range into this
   drawer (800-1119.98px) plus Compact's own separate popup
   (1120-1337.98px) and still covers both. That rule's own reasoning
   ("nav#TOC's own padding as the only layer") is exactly the pattern to
   follow here too — nav#TOC just needs the FULL 27px itself, not a
   second 10px expecting a nonexistent 17px to already be there:
   "there's, like, no space between the menu and the left side column
   edge... it's a dumpster fire over there." */
@media (min-width: 800px) and (max-width: 1119.98px) {
	#quarto-margin-sidebar nav#TOC {
		padding-left: 27px !important;
	}
}

/* .book-floating-margin-toggle's own independent "peek" popup
   (book-page-contents-peek-open, the force-show-nav#TOC-directly
   mechanism this whole block once was) is retired — the icon now
   proxies to the real .mobile-margin-toggle button instead (resources/
   book-scripts.html), reusing #quarto-margin-sidebar's own true
   edge-sliding drawer (§ its own 800–1119.98px block) the same way
   .book-floating-sidebar-toggle already proxies to the real sidebar
   toggle on the left. On request: "I want those two to bring out the
   menus from the sides... similar to the mobile thing, instead of the
   popups." Nothing sets book-page-contents-peek-open anymore
   (confirmed live via a full grep of resources/book-scripts.html), so
   removed rather than left as unreachable dead weight. */

/* TOC entries read as plain chrome text by default (always-dark
   sidebar, not toggle-following); only the active (currently
   scrolled-to) section is gold — same "one gold word" pattern as the
   chapter-list sidebar below. */
#quarto-margin-sidebar nav[role="doc-toc"] ul > li > a {
	color: var(--book-chrome-text) !important;
	border-left-color: var(--book-chrome-scrollbar) !important;
}

#quarto-margin-sidebar nav[role="doc-toc"] ul > li > a:hover,
#quarto-margin-sidebar nav[role="doc-toc"] ul > li > a.active,
#quarto-margin-sidebar nav[role="doc-toc"] ul > li > ul > li > a.active {
	color: var(--book-chrome-text-hover) !important;
}

#quarto-margin-sidebar nav[role="doc-toc"] ul > li > a.active,
#quarto-margin-sidebar nav[role="doc-toc"] ul > li > ul > li > a.active {
	border-left-color: var(--book-chrome-text-hover) !important;
}

/* Match the "Table of contents" heading to the sidebar's own nav-link
   style (e.g. "About") instead of the generic, larger/bolder h2. Same
   box model as .book-sidebar-brand ("Table of Contents," the left
   rail's own header) now too, not just the same font — a reader
   compared the two live and found this one sitting in a visibly
   shorter, flush-top box (0 padding, just a margin-bottom pushing the
   list below it down) while the left one sat centered in a taller,
   padded box (0.4rem top and bottom) — different objects wearing the
   same font, not actually "the same kind of object" the way a reader
   wanted. padding-top/-bottom: 0.4rem replaces the old margin-bottom:
   0.4rem here — same visual gap before the list below, now produced
   the same way (padding inside this element's own box) instead of a
   margin outside it. color switched from color + a separate opacity:
   0.6 to one rgba() value for the same reason .book-sidebar-brand's
   own color already moved off opacity earlier — opacity here was
   harmless (this element was never wide enough to show the whole-box
   compositing artifact that fix was for), but the two headers being
   textually identical CSS, not just visually similar, is the actual
   ask. text-align is the one deliberate difference left standing: the
   left header sits right-aligned next to its own search icon in a
   shared row and matches the chapter list's own dot-leader edge; this
   one stays left-aligned to match the plain Page/Chapter Contents
   list directly below it, which has no equivalent right edge to
   match. */
#toc-title {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: 0.83rem;
	font-weight: 400;
	font-style: normal;
	color: rgba(var(--book-chrome-text-rgb), 0.6);
	padding-top: 0.4rem;
	padding-bottom: 0.4rem;
	margin: 0;
	border: none;
}
/* The bi-stickies icon Margin Notes mode prepends to this label
   (resources/book-scripts.html, syncTocTitle) — sized and spaced to
   sit as a plain inline glyph before the text, not a separate button:
   currentColor + the label's own rgba() alpha (rather than a flat
   color of its own) keeps it exactly as dim/bright as the text next
   to it in both themes, matching every other icon-plus-label pairing
   in this file that reuses the label's own color instead of hardcoding
   a second one. */
#toc-title i.bi {
	color: currentColor;
	font-size: 0.85em;
	margin-right: 0.3em;
	vertical-align: -0.05em;
}
/* Tried the same solid-backdrop fix here as .book-margin-tools once
   had (that rule's own comment, above, has the full history of why it
   didn't work) — removed for the same reason. #toc-title lives inside
   nav#TOC, which is ALSO independently position: fixed with its own
   z-index (1020, confirmed live — even further below the note
   overlay's 1072 than .book-margin-tools's own 1071 was), so no
   background on this element could ever actually win either. A reader
   drew the fix that actually works directly on a screenshot: one box
   covering the icon row AND this label, not two separate patches with
   a gap between them — #book-margin-fade-scrim (below) is that one
   box, widened and extended down to reach this label's own bottom
   edge. */

#quarto-margin-sidebar::-webkit-scrollbar {
	width: 4px;
}
#quarto-margin-sidebar::-webkit-scrollbar-thumb {
	background: var(--book-chrome-scrollbar);
	border-radius: 2px;
}
#quarto-margin-sidebar::-webkit-scrollbar-track {
	background: transparent;
}

/* (collapsible TOC removed) */

/* Make the flex container stretch to fill the full viewport so
   main.content can grow to match it. */
#quarto-content {
	padding-top: 0 !important;
	margin-top: 0 !important;
	min-height: 100vh;
	align-items: stretch !important;
}

/* An earlier pass here zeroed out the flexible outer margins Quarto's
   grid uses to center the whole reading experience above ~1367px, on the
   theory that the empty column before the left sidebar was what made it
   read as "floating." That traded away the centering on wide screens for
   no real gain — turned out the felt disconnect was about the sidebar
   header's own spacing, not the screen-edge distance (see .book-sidebar-brand
   below). Reverted; Quarto's native centering is back. */


main.content,
#quarto-document-content {
	background-color: var(--book-bg);
	/* Faint paper-grain texture (procyon.css, --book-paper-texture) —
	   falls back to none in dark mode/any theme that doesn't declare
	   it, so this is safe to apply unconditionally. background-repeat
	   explicit since the SVG's own natural tiling would otherwise
	   depend on this property's initial value being "repeat" (it is,
	   but not worth relying on implicitly for something this visible). */
	background-image: var(--book-paper-texture, none);
	background-repeat: repeat;
	padding-top: 2rem !important;
	/* 75px — the reading column's own outer box is 800px, and the
	   actual prose measure is what's asked to be a specific width
	   (650px), achieved by padding inward from that fixed outer frame
	   rather than shrinking the frame/border itself: 800 - 650 = 150px
	   total, 75px per side. */
	padding-left: 75px !important;
	padding-right: 75px !important;
	padding-bottom: 4rem !important;
	margin-top: 0 !important;
	border-left: 1px solid #1a1a1a;
	border-right: 1px solid #1a1a1a;
	box-shadow: 0 0 12px rgba(0, 0, 0, 0.45);
	/* flex: 1 lets the column grow to fill #quarto-content's height;
	   min-height: 100% as fallback for non-flex contexts. */
	flex: 1 0 auto;
	min-height: 100%;
}
/* #quarto-document-content.page-full (any page with a real margin
   note — see the .page-full notes elsewhere in this file) spans the
   ENTIRE page width by design, not just the reading column — so its
   own background-color/border-left/border-right/box-shadow above,
   which assume they're painting a narrow constrained column, instead
   paint across the FULL width, covering the margin gutter that should
   show the page's own dark chrome background through (confirmed live:
   a bright white slab where a dark gap was expected, only on pages
   with a margin note — Home, with none, was never affected). Reset
   all four to nothing here, and recreate them on a ::before sized to
   the actual body-content-start/body-content-end grid track instead
   — the same narrow-track trick every other page-full fix in this
   file already relies on. z-index: -1 keeps it behind the real text
   content, which still renders directly on #quarto-document-content
   itself. */
#quarto-document-content.page-full {
	/* !important on all four: confirmed live that #quarto-document-
	   content's background is pure white (255,255,255) — not even this
	   file's own intended var(--book-bg) cream — on EVERY page, page-
	   full or not, meaning some Quarto-bundled rule already beats this
	   file's own plain (non-!important) background-color declaration
	   above unconditionally. That pre-existing loss is invisible on a
	   narrow, non-page-full reading column (white vs. cream reads as
	   indistinguishable there) but became the actual white-bleed bug
	   once page-full made this box span the full page width — and it
	   meant this reset needed !important too, or it would lose to that
	   same Quarto rule exactly the way the base declaration already
	   does. */
	background-color: transparent !important;
	border-left: none !important;
	border-right: none !important;
	box-shadow: none !important;
	position: relative;
	/* padding-left/-right: 0 — the base rule above (non-page-full pages)
	   uses a flat 75px side padding as its ENTIRE mechanism for producing
	   a narrower reading column out of a normally-full-width box; that's
	   fine there since the box itself is never wider than body-content-
	   start/-end (800px) to begin with. On a page-full page this box is
	   ALSO stamped full-bleed (screen-start/screen-end, Quarto's own
	   generic .page-full rule) — its OWN nested grid (§19c) and the
	   max-width: 650px + margin: auto rule on its direct children (both
	   elsewhere in this file) already do the real work of narrowing the
	   reading column back down, at whatever width the viewport actually
	   is. The inherited 75px padding was never zeroed for this case, so
	   it was ALSO eating 150px total out of this box's own content area
	   before either of those two newer mechanisms even started — harmless
	   at ≥1200px where there's slack to spare (the outer minmax(0, 1fr)
	   flex tracks just absorbed the difference, still reading as
	   centered), but confirmed live as the actual cause of a real bug in
	   the 800–991.98px range: with only ~797px of padded content area
	   left to fit an 800px fixed track into, the grid ran out of room to
	   flex-center in and fell back to anchoring at its own start edge —
	   "the reading content to the left, the background to the right," a
	   reader's own description of exactly this. */
	padding-left: 0 !important;
	padding-right: 0 !important;
}
#quarto-document-content.page-full::before {
	content: "";
	position: absolute;
	/* Horizontal placement used to be grid-column: body-content-start /
	   body-content-end — correct in principle (#quarto-document-content
	   is display: grid, so a grid-column value places this pseudo
	   against the same named tracks the sidebars' own CSS calc()
	   formula also targets), but confirmed live as unreliable in
	   practice: at some viewport widths (1420px, not 1357 or 1609,
	   the only two this had been checked at) the cream fill only
	   painted down to some point partway down the page before reverting
	   to plain dark page background for the rest of the column, with NO
	   element or rule of any kind found sitting on top of it — every
	   introspection technique (elementsFromPoint at a grid of y values,
	   a full-document element scan for anything covering the same
	   point, computed style of the pseudo itself) agreed the pseudo's
	   own geometry was exactly correct (800px wide, full page height,
	   cream background-color) right up until the point it visibly
	   wasn't. That combination — computed style correct, actual paint
	   wrong, only at specific widths — points at a genuine interaction
	   between being simultaneously a grid item (via grid-column) AND
	   absolutely positioned with unset grid-row (relying on the grid's
	   own auto-placement/sizing algorithm for anything grid-row doesn't
	   pin down), not a value this file's own CSS was setting wrong.
	   Rather than debug that interaction further, this drops out of
	   grid placement entirely: left/width now read the exact same
	   --book-navbar-bar-left/-width variables the sidebars' own CSS
	   calc() already depends on (JS-measured off the real reading
	   column, resources/book-scripts.html's setBarBounds) — the same
	   "measure the one true position live, don't make two systems
	   agree on it independently" approach already used everywhere else
	   the reading column's position matters. With all four position
	   properties (top/right-via-width/bottom/left) explicitly set to
	   non-auto values, this element's rendered box is determined
	   entirely by them, regardless of whatever grid-row auto-placement
	   would otherwise have contributed — sidestepping the ambiguity
	   instead of resolving it. */
	left: var(--book-navbar-bar-left, 0px);
	width: var(--book-navbar-bar-width, 800px);
	/* #quarto-document-content's own box starts at the true top of the
	   page (y: 0, confirmed live), not below the fixed navbar — normal
	   for a page-full element sized to the whole document, and correct
	   for THIS box to extend that high too so it doesn't run out before
	   reaching the actual top of the reading column once scrolled. The
	   navbar itself (#quarto-header, §19) floats on top with a
	   deliberately transparent background of its own (a "translucent
	   pill," not a solid bar — brand text and the icon row are
	   separately floated pieces with no backdrop of their own, by
	   design), relying on whatever sits behind it at y: 0–52px to
	   already read as plain dark chrome. Confirmed live: with this
	   box's top at 0 too, its cream fill sits directly behind those
	   same transparent gaps, showing through as two stray pale patches
	   in an otherwise dark bar — a reader spotted it as a genuine
	   visual bug, not a screenshot artifact (ruled out by hiding this
	   pseudo-element entirely and watching both patches disappear).
	   Insetting just the top by the navbar's own live-measured height
	   stops this box from ever painting behind the navbar at all, so
	   whatever's actually there — the plain dark page background — is
	   what shows through the navbar's transparent gaps instead, while
	   every other requirement (full height for the rest of the page,
	   correct body-content-start/-end width below) is untouched. */
	top: var(--book-navbar-height, 52px);
	bottom: 0;
	background-color: var(--book-bg);
	/* Same paper-grain texture as the non-page-full rule above — this
	   pseudo is what actually paints the reading column's background
	   on any page WITH a margin note, so it needs its own copy of the
	   same two declarations, not just the base rule. */
	background-image: var(--book-paper-texture, none);
	background-repeat: repeat;
	border-left: 1px solid #1a1a1a;
	border-right: 1px solid #1a1a1a;
	box-shadow: 0 0 12px rgba(0, 0, 0, 0.45);
	z-index: -1;
}
/* A same-day first attempt at fixing this pseudo's own left/width
   below 1200px lived here — a pure-CSS media-query override
   (min(800px, calc(100vw - 28px)), mirroring the reading column's own
   grid formula) meant to route around setBarBounds() never having
   measured on a page loaded directly below 992px. Reverted: raw 100vw
   includes the vertical scrollbar's own width in some browsers, a trap
   this file's own --book-viewport-width comment already documents
   elsewhere — confirmed live as a real mismatch against the grid's own
   true rendered width (which measures the scrollbar-excluded
   clientWidth), not just a headless-testing artifact. The actual fix
   now lives in resources/book-scripts.html's setBarBounds() itself
   (its own comment has the full account): it no longer skips measuring
   below 992px, so left/width above are correct real DOM measurements
   at every width, and this pseudo-element's own rule needed no CSS-side
   special case at all once that was true. */
/* #quarto-document-content's own padding-left/-right (above) do
   nothing on a page-full page: Quarto's own default grid-child rule
   (.page-columns > * { grid-column: body-content-start / body-
   content-end }) positions every DIRECT CHILD — the real title block,
   each section, any bare paragraph — independently via that grid
   track, which bypasses the parent's own padding box entirely (padding
   only insets content that's actually laid out WITHIN the parent's
   content box, not content grid-placed to an explicit track). Applying
   the same padding directly to every direct child instead was the
   first fix here, and it DID reach real text — a paragraph's own text
   correctly wrapped at 650px — but padding only insets a box's
   CONTENT, never the box itself, so anything a child draws at its own
   border-box edge rather than flowing as content stayed at the full
   800px track regardless: confirmed live, .home-title-divider's own
   border-top (an empty div with no text to pad around) and every
   section's own box both measured 800px wide even after the padding
   fix, only the actual paragraph text inside them was narrower. A
   width constraint on the box itself, not an inset around its
   content, is what makes a border/background genuinely match the same
   650px a reader sees text wrap at — max-width + auto margins centers
   a real 650px box inside the 800px track (the same numeric 86px gap
   the padding version produced, arrived at differently), so a bare
   decorative div is exactly as narrow as a paragraph next to it, not
   just optically similar because both happen to have text-free edges
   at the same x-coordinate. */
#quarto-document-content.page-full > * {
	max-width: 650px;
	/* width: 100% alongside max-width, not max-width alone: a grid
	   item's own width: auto is supposed to stretch to fill its grid
	   area by default (justify-self: auto resolving to stretch), which
	   is what every OTHER direct child here does correctly — but
	   confirmed live, .home-title-text-emulation specifically (the big
	   home-page-style title block, centered text with two block
	   children of its own) came out shrink-wrapped to its own content
	   width (579px) instead, computed margin-left/-right both 0 rather
	   than the ~86px an actually-centered 650px box would need — some
	   interaction between its own text-align: center, its block
	   children, and grid stretch sizing that isn't worth chasing
	   further. An explicit width: 100% removes the ambiguity outright:
	   it fills the grid area first the same way a normal block child
	   would, and max-width then caps that at 650px same as everywhere
	   else, with margin: auto centering the result — one rule, not a
	   special case for the title alone. */
	width: 100%;
	margin-left: auto;
	margin-right: auto;
}
/* Recursion, take three: a SECTION containing a margin note is itself
   walked into .page-columns.page-full by the same Quarto build step
   (see the .page-full notes elsewhere in this file). Two problems
   from that, not one. First (chased across two earlier, now-abandoned
   attempts — matching padding at this level too, which compounded
   instead of matching; then grid-column: unset on its children, which
   auto-placed them into the wrong 255px sidebar track) — that section
   became its OWN nested grid, independently placing its children
   again the same way page-full did one level up. Second, and the one
   that was still live after "take two" below switched this section to
   display: block: .page-full isn't just a marker this file reacts to,
   it's a real Quarto utility class with its OWN grid-column:
   screen-start / screen-end rule, generic and unscoped — it applies to
   ANY element carrying it, not only the one #quarto-document-content
   this file's own .page-full styling was written for. Confirmed live:
   with the section merely set to display: block, its own grid-column
   (inherited from that generic rule, since ITS parent — #quarto-
   document-content — is still display: grid) resolved to the full
   screen-start/screen-end span, not body-content-start/-end — so the
   section itself rendered 1428px wide, full page-full bleed, and its
   now-block children obediently filled that width (1256px measured
   live, 1428 minus this section's own 172px padding). A section
   containing a margin note was never meant to visually bleed full
   width itself — only the ONE outer #quarto-document-content box
   should do that — so its grid-column needs its own explicit
   override back to the reading column's own track, not just a display
   change.
   The first problem (independent nested placement) still doesn't need
   solving directly: the ONLY reason this section needed to be its own
   grid at all was to resolve its .column-margin child's own
   grid-column: body-end / page-end against real tracks, and that
   child no longer lives here by the time a reader sees it —
   resources/book-scripts.html now relocates every .book-annotation-
   note into a genuine top-level overlay under #quarto-content (the
   same technique already used for footnotes-in-the-margin below),
   *before* anything reads this section's layout, at any width where a
   docked margin rail exists to receive it. With no .column-margin
   descendant left to place, display: block still stands: it flows the
   section's remaining children (ordinary paragraphs) as normal block
   content inside whatever box this rule gives the section, instead of
   trying to grid-place them individually. Below the breakpoint where
   the relocation script leaves notes in place instead (narrow widths,
   where Quarto's own responsive stacking already handles a nested
   .column-margin correctly on its own), both rules are harmless: a
   single-column layout doesn't visibly differ between full-bleed and
   body-content-width for content that's already 100% of a narrow
   viewport either way. */
#quarto-document-content.page-full section.page-columns.page-full {
	grid-column: body-content-start / body-content-end !important;
	display: block;
}

/* Tabula Rasa only — the hardcoded #1a1a1a border/dark box-shadow
   above is a literal, unconditional dark line down a page that's
   otherwise deliberately all-white top to bottom (chrome included, see
   that theme's own header comment in reader-themes-drafts.css) — a
   reader asked for it gone specifically here, replaced with something
   much quieter: a thin dotted line in the theme's own --book-border
   gray, no shadow at all. */
html[data-book-theme="tabula-rasa"] main.content,
html[data-book-theme="tabula-rasa"] #quarto-document-content {
	border-left: 1px dotted var(--book-border);
	border-right: 1px dotted var(--book-border);
	box-shadow: none;
}

/* Default Procyon Light only — plain flat white. Used to carry a
   pure-CSS paper texture here (two soft off-center radial-gradient
   highlights over first a diagonal crosshatch, then briefly an SVG
   feTurbulence grain) — a reader tried both, decided neither was worth
   chasing further right now, and asked for plain white instead. Kept
   scoped to html:not([data-book-theme]) body:not(.quarto-dark) rather
   than folding this into --book-bg directly, in case a textured
   version is worth revisiting later; this rule is the one place that
   would go. */
html:not([data-book-theme]) body:not(.quarto-dark) main.content,
html:not([data-book-theme]) body:not(.quarto-dark) #quarto-document-content {
	background-color: #ffffff;
}

/* Zero out Quarto's forced 1em top padding on the first sidebar child */
#quarto-sidebar.sidebar-navigation > *:first-child,
#quarto-sidebar .sidebar-item-section {
	padding-top: 0 !important;
}

/* Hide individual group headers (Front Matter / Chapters / Back Matter) —
   replaced by a single "Book Contents" label injected via JS */
#quarto-sidebar .sidebar-item-section > .sidebar-item-container {
	display: none !important;
}

/* Hide Quarto's natively rendered sidebar title — JS injects .book-sidebar-brand instead */
#quarto-sidebar .sidebar-brand:not(.book-sidebar-brand) {
	display: none !important;
}

.book-sidebar-brand {
	display: block;
	/* Flex child of .book-sidebar-toc-row now, sharing the row with the
	   search icon beside it — flex: 1 so it still fills the row's
	   remaining width and text-align: right still lands it on the same
	   right edge the chapter list's own dot-leaders use. */
	flex: 1 1 auto;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: 0.83rem;
	font-weight: 400;
	font-style: normal;
	/* rgba color, not color: var(--book-chrome-text) + opacity: 0.6 —
	   opacity on the element composited this whole link (a wide flex: 1
	   box, stretched to fill the row well past its own right-aligned
	   text — confirmed live via getBoundingClientRect()) as one
	   semi-transparent group, and rendering that group apparently left
	   a faint rectangular seam across the box's own empty flex space, a
	   reader spotted as looking like "a shadow below the words" that
	   #toc-title (plain text, no opacity-driven stacking context of its
	   own, and never stretched wider than its own text either) never
	   had. Confirmed live: setting this element's opacity back to 1
	   made the visible band disappear entirely. Baking the same 0.6
	   dimming into the color's own alpha instead only affects the
	   glyphs themselves — no stacking context, no compositing buffer
	   sized to the whole (mostly empty) flex box, no artifact. */
	color: rgba(var(--book-chrome-text-rgb), 0.6) !important;
	text-decoration: none;
	/* !important on both: Quarto forces a 1em top padding on sidebar
	   children (see the zero-out rule below, "Zero out Quarto's forced
	   1em top padding on the first sidebar child") — that rule only
	   matches :first-child, but this label isn't the DOM's first child
	   (Quarto's own hidden .sidebar-brand precedes it), so the 1em still
	   won, at !important, over this rule's plain (non-important)
	   padding-top. padding-top used to be 0.98rem specifically to match
	   this label's own top edge against #toc-title's, back when this
	   was the very top of the left sidebar's own content — moot now
	   that the title/search block sits above it (a reader wanted this
	   label to sit closer to the search bar instead, tightening the
	   rhythm between the two, not aligned against the other sidebar
	   anymore). */
	padding-top: 0.4rem !important;
	padding-bottom: 0.4rem !important;
	text-align: right;
	border: none;
}

/* Gold the "Table of Contents" label whenever the current page has no
   visible entry of its own in the left-hand chapter spine — the home
   page, and every page reached only through a navbar dropdown
   (Appendices, References, Resources, Author's Notes, In Plain Terms).
   Doubles as a signal that clicking the label (now a real link to the
   Table of Contents page) gets you back to an overview. body.no-active-chapter is set by the
   include-after-body script in _quarto.yml, in the same pass that hides
   those pages' entries from the sidebar — see the comment there. Reverts
   automatically the moment you're on a page that DOES have a visible
   sidebar entry: that entry picks up the gold instead, via the existing
   .sidebar-link.active / .sidebar-item-text.active rules. */
body.no-active-chapter .book-sidebar-brand {
	color: var(--book-chrome-text-hover) !important;
}

/* Single "Book Contents" label at the top of the left sidebar */
.sidebar-book-label {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: 0.83rem;
	font-weight: 400;
	font-style: normal;
	color: var(--book-chrome-text);
	opacity: 0.6;
	padding-top: 0.3rem;
	padding-bottom: 0.4rem;
	display: block;
	text-align: right;
	border: none;
}

/* Left sidebar chapter list — right-aligned, flush to content edge */
#quarto-sidebar .sidebar-item-text,
#quarto-sidebar .sidebar-link,
#quarto-sidebar .menu-text {
	text-align: right;
	font-size: var(--book-sidebar-font-size);
	font-weight: 400;
	line-height: 1.3;
	border: none !important;
	text-decoration: none !important;
}

/* Chapter number pinned to the row's left edge, title pinned to the
   right, a classic table-of-contents leader line filling the gap
   between them — sidebar-chapter-numbers.js splits "1. Groundwork"
   into a .sidebar-chapter-num span ("1."), an empty flex-grow
   .sidebar-chapter-leader span, and a .sidebar-chapter-title-text span
   ("Groundwork"), and adds .has-chapter-num to the row itself at the
   same time. No justify-content needed: the leader's flex: 1 1 auto
   absorbs whatever space num + title don't use, which both spreads
   the row and draws the connecting line in one mechanism — the same
   reason this reads as an actual TOC leader instead of a fixed-length
   rule that would overshoot short titles or fall short of long ones.
   Two selectors, not one: .has-chapter-num is the primary one (:has()
   isn't supported in every browser still in real use, and where it
   silently fails to match, this whole rule stopped applying and rows
   fell back to plain left-aligned block flow instead of right-aligning
   to the shared edge — confirmed live as a real bug, not a theoretical
   one). :has(.sidebar-chapter-num) stays alongside it as a second,
   independent path to the same rule — belt and suspenders against the
   class ever not being on the element yet for any reason (a stale
   render, a page loaded from an older build, etc.), since both
   selectors converge on identical styling either way.
   width: 100% — not a capped clamp() width anymore. A capped width
   plus margin-left: auto still lands the row's own right edge flush
   (a plain, universally-supported CSS mechanic — a block box with a
   set width and margin-left: auto pushes flush right within its
   containing block, no flex-parent needed), but it left this row a
   genuinely different width (230px) than title/search/TOC (253px+),
   which read as suspect/inconsistent even though the right edges
   still matched. 100% removes that entirely: this row is now exactly
   as wide as every sibling in the shared box, no separate width
   value left to distrust. The leader span's flex: 1 1 auto still
   fills whatever's left between number and title either way — a
   short title like "Preface" just gets a longer dot-leader now
   instead of the row itself staying narrow. */
#quarto-sidebar .chapter-title.has-chapter-num,
#quarto-sidebar .chapter-title:has(.sidebar-chapter-num) {
	display: flex;
	align-items: baseline;
	width: 100%;
}

/* Subdued relative to the title text — a quiet label, not a second
   focal point competing with the chapter name for attention. Same
   trick as the flourish/footer text elsewhere on the site: opacity
   down, not a whole new color. Nested inside the sidebar item's own
   0.88 opacity (line below), so the effective result is dimmer still. */
#quarto-sidebar .sidebar-chapter-num {
	opacity: var(--book-sidebar-num-opacity);
	font-size: var(--book-sidebar-num-font-size);
}

/* The leader line itself — height: 0 plus align-self: baseline sits
   its border-bottom right at the text baseline, the same height a
   printed TOC's dot leader runs at. Small dots (border-style: dotted,
   not a solid rule) reads as classic TOC leader rather than a divider.
   Same color and opacity as .sidebar-chapter-num just above — opacity
   on the element itself, not baked into the border color, so it stays
   in lockstep with the number if that variable ever changes. */
#quarto-sidebar .sidebar-chapter-leader {
	flex: 1 1 auto;
	height: 0;
	align-self: baseline;
	border-bottom: 1px dotted var(--book-chrome-text);
	/* Its own opacity, dimmer than the number's — asked to be lighter
	   independently of the number/letter, not tied to it. */
	opacity: var(--book-sidebar-leader-opacity);
	margin: 0 0.5em;
}

#quarto-sidebar .sidebar-item-container,
#quarto-sidebar .sidebar-link,
#quarto-sidebar .sidebar-item-text {
	color: var(--book-chrome-text) !important;
	opacity: 0.88;
}

#quarto-sidebar .sidebar-item-container:hover,
#quarto-sidebar .sidebar-item-container:focus,
#quarto-sidebar .sidebar-link:hover,
#quarto-sidebar .sidebar-link:focus,
#quarto-sidebar .sidebar-item-text:hover,
#quarto-sidebar .sidebar-item-text:focus {
	color: var(--book-chrome-text) !important;
	opacity: 1;
}

#quarto-sidebar .sidebar-link.active,
#quarto-sidebar .sidebar-item-text.active {
	color: var(--book-chrome-text-hover) !important;
	opacity: 1;
}

/* The container div matched above (line ~707) also gets opacity:0.88 from
   that same shared rule — resetting the active <a> itself to opacity:1
   isn't enough, since CSS opacity compounds down the tree: a
   fully-opaque child inside an 0.88-opaque parent still renders at 88%.
   That's what made the left sidebar's gold read visibly duller than the
   right sidebar's TOC gold, which has no such wrapping element to dim it.
   Reset the container too whenever it holds the active link. */
#quarto-sidebar .sidebar-item-container:has(> .sidebar-link.active),
#quarto-sidebar .sidebar-item-container:has(> .sidebar-item-text.active) {
	opacity: 1;
}

/* Right-side chapter indicator — mirrors the right sidebar's scrollspy spine */
#quarto-sidebar .sidebar-item-container a {
	border-right: 2px solid rgba(var(--book-chrome-text-rgb), 0.08);
}
#quarto-sidebar .sidebar-item-container a.sidebar-link.active,
#quarto-sidebar .sidebar-item-container a.sidebar-item-text.active {
	border-right-color: var(--book-chrome-text-hover);
}

#quarto-sidebar .sidebar-item {
	padding-top: 0;
	padding-bottom: 0;
	margin: 0;
}

#quarto-sidebar .sidebar-section,
#quarto-sidebar .sidebar-item-container {
	margin: 0;
	padding-bottom: 0;
}

/* Quarto's own bundled Bootstrap CSS gives .sidebar-section a plain
   padding-left: 0.5em (indentation for nested TOC sub-levels) —
   confirmed live via document.styleSheets — which was silently
   narrowing every chapter row's available width by that same 0.5em
   (measured ~7px), the actual reason chapter rows kept computing a
   different width than title/search/"Table of Contents" even after
   both were set to the same width: 100% — 100% of a narrower content
   box is still narrower. Zeroed here so the row's own width: 100%
   (above) resolves against the full, unindented box, matching every
   other sidebar element exactly. */
#quarto-sidebar .sidebar-section {
	padding-left: 0;
}

/* Match left sidebar item spacing to right sidebar (0.2rem top/bottom) */
#quarto-sidebar .sidebar-item-container a {
	padding-top: 0.2rem;
	padding-bottom: 0.2rem;
	display: block;
}

/* Breadcrumbs — hide the part breadcrumb Quarto generates for part: groups */
.quarto-breadcrumbs,
nav[aria-label="breadcrumb"],
ol.breadcrumb {
	display: none !important;
}

/* Hide the Bootstrap collapse toggles on left sidebar group headers */
#quarto-sidebar .sidebar-item-toggle {
	display: none !important;
}

/* Chrome moved to the top navbar (Author's Notes / Resources /
   Appendices / References menus) — hidden here so the
   docked sidebar holds only the linear reading spine (Preface through
   Excursus). Subject Index, Bibliography, Glossary, Notes, and Symbols
   moved to the navbar's "References" dropdown the same way, leaving
   nothing left in the sidebar's old Back Matter part. These
   pages still have to stay listed under book.chapters: in _quarto.yml for
   Quarto to render them at all (book projects only render chapters
   explicitly in that manifest); this just keeps them out of the left
   rail. Quarto flattens every chapter's output to the site root
   regardless of its source subdirectory (book/front-copyright.qmd renders
   to /front-copyright.html, not /book/front-copyright.html) and Netlify's
   pretty-URL post-processing then strips the ".html" on top of that for
   the live site (see the include-after-body script below) — so each
   selector below matches both the bare local-preview form and the
   extensionless live form, with no "/book/" or "/site/" prefix in either.
   A previous version of this rule hardcoded a "/book/" prefix that never
   matches Quarto's actual (flattened) output, so this CSS was silently
   inert on every build and 100% of the hiding was resting on the
   include-after-body script — which only runs after the page parses,
   producing a visible flash of the full, ungrouped chapter list on every
   navigation before JS caught up. Fixed selectors mean CSS now does the
   hiding itself, which the browser applies before first paint, same as
   any other rule in this stylesheet — no JS wait, no flash. The
   Resources part (Connect/License/How to Cite/Changelog) has no
   href of its own on its part header — it's a pure divider — so it's
   matched instead via a nested link unique to that group (":has()"
   matches descendants at any depth, not just direct children — so
   matching on Connect's own href hides the whole shared <li> the entire
   part lives inside, without needing a selector of its own for every
   sibling in the group).
   index.qmd (the site's home page) is the one exception to the "match by
   own href" pattern: some client-side script canonicalizes its href down
   to a bare trailing "/" instead of leaving "...index.html" intact
   (confirmed by dumping the live DOM after scripts run), so it's matched
   on a trailing "/" rather than "/index.html". No other page on this
   site renders a bare trailing-slash href, so this is safe and doesn't
   also catch subject-index.html. The include-after-body script in
   _quarto.yml is kept as a fallback for browsers without :has() support
   (all major browsers have shipped it since late 2023) and still does
   the separate work of numbering/TOC restructuring, so it isn't removed
   — it just no longer needs to win the race against first paint. */
#quarto-sidebar li.sidebar-item:has(> div.sidebar-item-container > a[href$="/"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/front-copyright.html"], a[href$="/front-copyright"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/acknowledgments.html"], a[href$="/acknowledgments"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/modal-logic-primer.html"], a[href$="/modal-logic-primer"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/formal-proof-summary.html"], a[href$="/formal-proof-summary"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/derivation-map.html"], a[href$="/derivation-map"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/empirical-predictions.html"], a[href$="/empirical-predictions"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/authors-notes.html"], a[href$="/authors-notes"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/in-plain-terms.html"], a[href$="/in-plain-terms"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/for-ai-assistants.html"], a[href$="/for-ai-assistants"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/subject-index.html"], a[href$="/subject-index"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/bibliography.html"], a[href$="/bibliography"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/glossary.html"], a[href$="/glossary"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/notes.html"], a[href$="/notes"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/symbols.html"], a[href$="/symbols"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/table-of-contents.html"], a[href$="/table-of-contents"]),
#quarto-sidebar li.sidebar-item:has(a[href$="/reading-guide.html"], a[href$="/reading-guide"]),
#quarto-sidebar li.sidebar-item-section:has(a[href$="/connect.html"], a[href$="/connect"]) {
	display: none !important;
}


/* ── Right sidebar page TOC — visual styles ─────────────────────── */

/* Scrollspy spine — every entry has a border so the gold indicator
   travels the full length of the line */
#quarto-margin-sidebar nav[role="doc-toc"] ul a {
	border-left: 2px solid rgba(var(--book-chrome-text-rgb), 0.08) !important;
	padding-left: 0.65rem !important;
}
#quarto-margin-sidebar nav[role="doc-toc"] > ul > li > a.active,
#quarto-margin-sidebar nav[role="doc-toc"] > ul > li:has(a.active) > a {
	border-left-color: var(--book-chrome-text-hover) !important;
}
#quarto-margin-sidebar nav[role="doc-toc"] ul a.active {
	border-left-color: var(--book-chrome-text-hover) !important;
}
#quarto-margin-sidebar nav[role="doc-toc"] ul a:hover {
	border-left-color: rgba(var(--book-chrome-text-rgb), 0.25) !important;
}
/* Subsection indent — keep border so spine runs all the way down */
#quarto-margin-sidebar nav[role="doc-toc"] ul ul a {
	border-left: 2px solid rgba(var(--book-chrome-text-rgb), 0.08) !important;
	padding-left: 1.25rem !important;
}
#quarto-margin-sidebar nav[role="doc-toc"] ul ul ul a {
	padding-left: 1.85rem !important;
}

#quarto-margin-sidebar nav#TOC a.nav-link {
	display: flex;
	justify-content: flex-start;
	align-items: baseline;
	gap: 0.4em;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	color: var(--book-chrome-text) !important;
	opacity: 0.75;
	/* This is the top-level (section) size — was 0.76rem for every
	   level, top and nested alike, with only font-weight telling them
	   apart. Bumped up specifically for this tier; the nested override
	   below brings subsections back down to the original size. */
	font-size: 0.88rem;
	font-weight: 400;
	line-height: 1.3;
	padding: 0.2rem 0;
	text-decoration: none;
}
/* Subsection entries (e.g. 2.1.1, nested one level deeper than 2.1) —
   smaller and lighter than the section level above them, so the two
   tiers read as clearly distinct rather than near-identical text.
   font-weight: 300 silently did nothing before this — the Google
   Fonts request for Source Serif 4 (_quarto.yml) only ever loaded
   400/600/700, no 300 file, so the browser substituted 400 for it and
   both tiers rendered at the same weight regardless of what this rule
   said. Fixed by adding 300 to that font request; this rule was
   already correct. */
#quarto-margin-sidebar nav#TOC ul ul a.nav-link {
	font-size: 0.76rem;
	font-weight: 300;
}
#quarto-margin-sidebar nav#TOC a.nav-link:hover {
	opacity: 1;
	color: var(--book-chrome-text) !important;
}
#quarto-margin-sidebar nav#TOC a.nav-link.active {
	opacity: 1;
	color: var(--book-chrome-text-hover) !important;
}

.toc-entry-num {
	order: -1;
	flex-shrink: 0;
}
.toc-entry-title {
	/* Truncates with an ellipsis instead of wrapping once the rail
	   narrows toward its floor — the mirror, on this side, of how the
	   left sidebar's chapter titles never wrap either (its own long
	   titles are handled by the dot-leader system instead). min-width:0
	   overrides the flex item default of min-width:auto, which would
	   otherwise refuse to shrink this span below its own text's natural
	   width and silently defeat text-overflow. */
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	min-width: 0;
	order: 1;
}

/* Sidebar chapter numbers ("1.", "2." …) fade into the background until
   the chapter link is hovered, decluttering the reading-spine list while
   keeping the number a hover away. The include-after-body script in
   _quarto.yml splits the leading "N." off the chapter-title text into
   this span at runtime, since CSS can't target part of a text node.
   color: transparent (not a specific background hex) so this works
   correctly in both the light and dark theme. */

/* ============================================================
   10. MARGIN NOTES (Tufte-style)
   ============================================================ */

.column-margin {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: 0.85em;
	line-height: 1.45;
	color: var(--book-margin-text);
	margin-top: 0.25em;
	margin-bottom: 1.5em;
	padding-left: 0.5em;
	border-left: 2px solid var(--book-border-soft);
}

.column-margin .callout-header,
.column-margin .callout-icon-container,
.column-margin .callout-title { display: none; }

.column-margin .callout-body,
.column-margin .callout-body-container {
	padding: 0; margin: 0; background: none; border: none;
}

.column-margin p           { margin: 0 0 0.5em; }
.column-margin p:last-child { margin-bottom: 0; }
.column-margin strong       { color: var(--book-margin-strong); font-weight: 600; }

/* ============================================================
   11. CALLOUTS — 5-type semantic system
   ============================================================ */

.callout.callout-style-default {
	border-top: none;
	border-right: none;
	border-bottom: none;
	/* Square corners, not rounded — a reader compared the rounded
	   version against the rest of the box system and asked for sharp
	   corners across every callout/semantic-block type instead. */
	border-radius: 0;
	margin: 1.5em 0;
	padding: 0.25em 1em;
	box-shadow: 0 1px 3px var(--book-callout-shadow);
}

.callout.callout-style-default > .callout-header {
	background-color: transparent !important;
	font-weight: 600;
	font-variant: small-caps;
	letter-spacing: 0.05em;
	/* !important on all three: Quarto's own bundled bootstrap.min.css
	   carries .callout.callout-style-default > div.callout-header
	   (border-bottom-style: none; plus, from a sibling rule for
	   .callout-titled, margin-bottom: -0.2em) — that selector's own
	   element-type-qualified div.callout-header is more specific than
	   this plain .callout-header, and wins regardless of load order.
	   Confirmed live: border-bottom-width computed to 0px and margin-
	   bottom to a negative value despite this rule's own (non-
	   important) declarations — a reader asked for Tip/Warning/
	   Important/Caution to all show a visible title-then-divider the
	   same way the semantic blocks' own .box-header does, and this
	   Bootstrap collision was silently erasing exactly that border on
	   all five default-style callout types (Note included, though its
	   own header is separately hidden outright below). */
	border-bottom: 1px solid var(--book-callout-header-border) !important;
	padding-bottom: 0.4em !important;
	margin-bottom: 0.6em !important;
}

/* Per-type header-background nuke. Quarto's stock CSS sets a tinted
   header background per callout type (light-green for tip, light-red
   for important, light-yellow for warning, light-orange for caution,
   light-blue for note) with a type-specific selector that beats the
   general .callout.callout-style-default rule above on specificity.
   Without these explicit per-type overrides the type-specific tint
   wins — leaving a green strip behind the "TIP" label on callout-tip
   blocks (and equivalent tints on the other four). */
.callout.callout-style-default.callout-tip       > .callout-header,
.callout.callout-style-default.callout-note      > .callout-header,
.callout.callout-style-default.callout-warning   > .callout-header,
.callout.callout-style-default.callout-important > .callout-header,
.callout.callout-style-default.callout-caution   > .callout-header {
	background-color: transparent !important;
}

/* Hide callout icons entirely. In recent Quarto versions the icon
   is rendered as an inline SVG, not a ::before pseudo-element, so
   `display: none` on ::before alone leaves the SVG visible — and
   its fill color (green for callout-tip, red for callout-important,
   yellow for callout-warning, orange for callout-caution, blue for
   callout-note) shows alongside our navy/red/gold/sage/grey overrides.
   Hide the whole icon container so only our small-caps header label
   and left-border color define the callout's visual identity. */
.callout.callout-style-default .callout-icon,
.callout.callout-style-default .callout-icon-container,
.callout.callout-style-default .callout-icon::before { display: none !important; }

/* Definition — navy. Same chassis as .callout-note below (and the
   semantic blocks, §12) — full border, thicker left accent, lightly
   tinted background (color-mix at 6%, not a flat --book-definition-bg
   fill) — rather than the old plain left-border-only treatment these
   four (tip/important/warning/caution) had kept while .callout-note
   alone got upgraded. That old version wasn't broken so much as
   unfinished: technically themed (the correct border/bg variables were
   already there), but at full-strength color instead of the same
   light touch every other box on the page uses, so it read as a
   generic Bootstrap alert next to them rather than a sibling. */
.callout.callout-style-default.callout-tip {
	border: 1px solid color-mix(in srgb, var(--book-definition-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-width: 4px;
	border-left-color: var(--book-definition-border, var(--book-link));
	border-radius: 0;
	background-color: color-mix(in srgb, var(--book-definition-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.09);
	padding: 0.65em 1em 0.6em 1em;
}
/* border-left-color re-declared here (and in the other 4 callouts'
   own dark-mode overrides below) for the same reason the semantic-
   block dark-mode overrides needed it, above — border-color is a
   shorthand covering all four sides, and this selector's own higher
   specificity in dark mode was silently overriding the base rule's
   explicit, full-strength border-left-color with the shorthand's own
   diluted one, flattening the left accent to match the other three
   sides instead of standing out from them. */
body.quarto-dark .callout.callout-style-default.callout-tip {
	border-color: color-mix(in srgb, var(--book-definition-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	background-color: color-mix(in srgb, var(--book-definition-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-color: var(--book-definition-border, var(--book-link));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
.callout.callout-style-default.callout-tip > .callout-header { color: var(--book-definition-border, var(--book-link)); }

/* Theorem — deep red. Same reasoning as .callout-tip above. */
.callout.callout-style-default.callout-important {
	border: 1px solid color-mix(in srgb, var(--book-theorem-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-width: 4px;
	border-left-color: var(--book-theorem-border, var(--book-link));
	border-radius: 0;
	background-color: color-mix(in srgb, var(--book-theorem-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.09);
	padding: 0.65em 1em 0.6em 1em;
}
body.quarto-dark .callout.callout-style-default.callout-important {
	border-color: color-mix(in srgb, var(--book-theorem-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	background-color: color-mix(in srgb, var(--book-theorem-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-color: var(--book-theorem-border, var(--book-link));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
.callout.callout-style-default.callout-important > .callout-header {
	color: var(--book-theorem-border, var(--book-link));
	font-weight: 700;
}

/* Note / site-chrome family (📝 generic notes, 🚪 reader on-ramp, 📥
   utility — per the locked Callout Box Formatting Guide) — matched to the
   established semantic-block chassis (§12 below: same border, left
   accent, tint, and shadow as .definition/.untyped/etc) instead of
   Quarto's stock callout treatment, so it reads as a sibling of the rest
   of the box system rather than a differently-skinned default. These
   carry no Label · symbol · Tag header at all — the content's own bold
   lead line already does that job (see the guide) — so the callout-header
   row (icon + "Note" label) is hidden outright rather than just de-tinted. */
.callout.callout-style-default.callout-note > .callout-header {
	display: none !important;
}
.callout.callout-style-default.callout-note {
	/* A plain, uniform 1px border all around — no thicker/colored
	   left-accent bar like the typed semantic boxes get. That accent
	   read as a second line sitting just inside the box rather than
	   marking its edge, which is what was actually asked to go; the
	   thin outer border itself stays. */
	/* Border strength: 22% -> 40%, back up to the same mix the typed
	   semantic-block chassis uses (§12) — an earlier pass had lightened
	   this specifically to 22% ("lighter... less flat," that request
	   preserved in the background tint below, still 3%), but set beside
	   the chassis boxes (Premise/Argument/etc.) on the same page this
	   read as the one box with a noticeably fainter edge, "the odd man
	   out" a reader later flagged directly — border weight specifically,
	   not the corner radius or background tint, which stay as they were. */
	border: 1px solid color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	/* Square corners, matching every other callout/semantic-block type
	   (went 4px → 8px → 14px → 8px → 0, this round explicitly asked
	   for sharp corners everywhere, not rounded). */
	border-radius: 0;
	background-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 3%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 2px 7px rgba(0, 0, 0, 0.07);
	padding: 0.65em 1em 0.6em 1em;
}
body.quarto-dark .callout.callout-style-default.callout-note {
	border-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	background-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 3%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
.callout.callout-style-default.callout-note > .callout-body-container {
	padding: 0;
	margin: 0;
}
.callout.callout-style-default.callout-note p {
	text-indent: 0 !important;
	margin: 0;
	text-align: left;
	hyphens: manual;
}
/* Title + divider, matching Tip/Warning/Important/Caution's own
   .callout-header treatment (§ above) — a reader compared a Note
   callout against those four and wanted the same visual structure
   here too. Quarto's own native header (icon + the bare word "Note")
   stays hidden, deliberately: it carries no real information, unlike
   this callout's own first line, which is always written as a bold
   lead-in that already names what the box is about (per the Callout
   Box Formatting Guide) — that's the thing worth setting apart with a
   line under it, not a second, more generic "Note" title stacked
   above it. */
.callout.callout-style-default.callout-note > .callout-body-container > p:first-child:not(:last-child) {
	/* The "line under it" this comment already described was never
	   actually built — this rule carried the matching spacing
	   (margin-bottom) but not the rule/line-height pair the semantic-
	   block chassis's own .box-header (§ above) uses for the identical
	   job, so a Note's title line sat with extra space below it but no
	   visible divider, unlike every other box type on the page.
	   padding-bottom + border-bottom, matching .box-header exactly (same
	   variable, same 0.4em/1px), plus the same 1.3 line-height so this
	   single short line doesn't sit inside the reading column's own
	   1.7× prose line-height with visible empty space above and below
	   the text (.box-header's own comment has the full reasoning).
	   :not(:last-child): some Note callouts (site/how-to-cite.qmd's and
	   site/license.qmd's own "Web build only" boxes) are just ONE
	   paragraph — a bold lead-in and its explanation together, no
	   separate body paragraph after it. Unqualified p:first-child still
	   matched that single paragraph and drew the divider under it
	   anyway, rendering as a stray line at the bottom of an otherwise
	   plain box with nothing to divide from — a reader's own report.
	   Excluding :last-child means the divider only appears when a real
	   second paragraph actually follows the title line. */
	padding-bottom: 0.4em !important;
	border-bottom: 1px solid var(--book-callout-header-border);
	line-height: 1.3;
	margin-bottom: 0.6em !important;
}
.callout.callout-style-default.callout-note p + p,
.callout.callout-style-default.callout-note ul,
.callout.callout-style-default.callout-note ol {
	margin-top: 0.4em;
}
.callout.callout-style-default.callout-note ul,
.callout.callout-style-default.callout-note ol {
	padding-left: 1.3em;
	margin-bottom: 0;
}
.callout.callout-style-default.callout-note li {
	margin-bottom: 0.3em;
}
.callout.callout-style-default.callout-note li:last-child {
	margin-bottom: 0;
}

/* Lemma — muted gold. Same reasoning as .callout-tip above. */
.callout.callout-style-default.callout-warning {
	border: 1px solid color-mix(in srgb, var(--book-warning-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-width: 4px;
	border-left-color: var(--book-warning-border, var(--book-link));
	border-radius: 0;
	background-color: color-mix(in srgb, var(--book-warning-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.09);
	padding: 0.65em 1em 0.6em 1em;
}
body.quarto-dark .callout.callout-style-default.callout-warning {
	border-color: color-mix(in srgb, var(--book-warning-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	background-color: color-mix(in srgb, var(--book-warning-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-color: var(--book-warning-border, var(--book-link));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
.callout.callout-style-default.callout-warning > .callout-header { color: var(--book-warning-border, var(--book-link)); }

/* Corollary — sage green. Same reasoning as .callout-tip above. */
.callout.callout-style-default.callout-caution {
	border: 1px solid color-mix(in srgb, var(--book-caution-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-width: 4px;
	border-left-color: var(--book-caution-border, var(--book-link));
	border-radius: 0;
	background-color: color-mix(in srgb, var(--book-caution-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.09);
	padding: 0.65em 1em 0.6em 1em;
}
body.quarto-dark .callout.callout-style-default.callout-caution {
	border-color: color-mix(in srgb, var(--book-caution-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	background-color: color-mix(in srgb, var(--book-caution-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	border-left-color: var(--book-caution-border, var(--book-link));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
.callout.callout-style-default.callout-caution > .callout-header { color: var(--book-caution-border, var(--book-link)); }

/* Tip/Warning/Important/Caution get the same "Note method" text
   treatment Note already has — hide the native header row (icon +
   bare type word) entirely and let the body's own bold lead-in
   sentence do that job instead — on request: the box chassis/colors
   above stay exactly as they are ("looks pretty good"), only the text
   inside changes. Box styling (border/background/radius/shadow) is
   deliberately untouched here — these four keep their own existing
   2px corners and full-strength left accent, not copied from Note's
   own separately-tuned 8px/thin-border treatment. */
.callout.callout-style-default.callout-tip > .callout-header,
.callout.callout-style-default.callout-warning > .callout-header,
.callout.callout-style-default.callout-important > .callout-header,
.callout.callout-style-default.callout-caution > .callout-header {
	display: none !important;
}
.callout.callout-style-default.callout-tip > .callout-body-container,
.callout.callout-style-default.callout-warning > .callout-body-container,
.callout.callout-style-default.callout-important > .callout-body-container,
.callout.callout-style-default.callout-caution > .callout-body-container {
	padding: 0;
	margin: 0;
}
.callout.callout-style-default.callout-tip p,
.callout.callout-style-default.callout-warning p,
.callout.callout-style-default.callout-important p,
.callout.callout-style-default.callout-caution p {
	text-indent: 0 !important;
	margin: 0;
	text-align: left;
	hyphens: manual;
}
.callout.callout-style-default.callout-tip > .callout-body-container > p:first-child,
.callout.callout-style-default.callout-warning > .callout-body-container > p:first-child,
.callout.callout-style-default.callout-important > .callout-body-container > p:first-child,
.callout.callout-style-default.callout-caution > .callout-body-container > p:first-child {
	margin-bottom: 0.6em !important;
}
.callout.callout-style-default.callout-tip p + p,
.callout.callout-style-default.callout-warning p + p,
.callout.callout-style-default.callout-important p + p,
.callout.callout-style-default.callout-caution p + p {
	margin-top: 0.4em;
}

/* ============================================================
   12. SEMANTIC BLOCKS — analytic monograph box style
   All formal statement types share one chassis: thin full border,
   thicker left accent strip, background and border both very lightly
   tinted toward that same accent. Type identity comes from the left
   strip's color plus the header row (name · handle · spelled-out tag),
   not from a full-box tint.

   Source convention:
     ::: {.theorem}        — Theorem N (T-lines)
     ::: {.lemma}          — Lemma N (L-lines)
     ::: {.premise}        — Premise N where numbered (P-lines), or an
                              unlabeled named derivation otherwise
     ::: {.corollary}      — Result (R-lines; renamed from "Corollary" —
                              same box/class, "Result" is the displayed
                              tag). 🟢 in Notion — see ICON_CLASS_MAP in
                              export-pages.js.
     ::: {.definition}     — Definitions (D-lines)
     ::: {.identification} — Identifications (a first-person/phenomenal
                              term's definition — split out of .definition
                              by wrap-premises.js when the label reads
                              "Identification")
     ::: {.principle}      — Principles
     ::: {.condition}      — foundational structural conditions (T, S, Φ);
                              the include-after-body script still adds a
                              .condition-time/-space/-substance modifier
                              class per letter (used to derive which
                              letter shows in the header), but all three
                              now share one color — see --book-sb-
                              condition-border, not a per-letter variable
     ::: {.argument}       — displayed derivations ("Move")
     ::: {.quick-reference} — summary / reference tables
   ============================================================ */

/* Shared box chassis — full border on all four sides, thicker left accent.
   Border and background are lightly tinted toward each type's own accent
   (color-mix, see below); Move (.argument) stays on the plain neutral
   chassis, matched to its neutral-grey strip. */
main.content .theorem,
main.content .premise,
main.content .lemma,
main.content .corollary,
main.content .definition,
main.content .identification,
main.content .principle,
main.content .condition,
main.content .argument,
main.content .untyped,
main.content .quick-reference {
    border: 1px solid #c8c4c0;
    border-left-width: 4px;
    /* Square corners, matching the native callouts' own rule (§11) —
       both box systems flattened together so they read as one
       consistent family, not two systems that happen to look similar. */
    border-radius: 0;
    margin: 1.5em 0;
    padding: 0.65em 1em 0.6em 1em;
    background-color: var(--book-chassis-neutral, var(--book-bg));
    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.09);
}
body.quarto-dark main.content .theorem,
body.quarto-dark main.content .premise,
body.quarto-dark main.content .lemma,
body.quarto-dark main.content .corollary,
body.quarto-dark main.content .definition,
body.quarto-dark main.content .identification,
body.quarto-dark main.content .principle,
body.quarto-dark main.content .condition,
body.quarto-dark main.content .argument,
body.quarto-dark main.content .untyped,
body.quarto-dark main.content .quick-reference {
    border-color: #505050;
    background-color: var(--book-chassis-neutral, var(--book-bg));
    box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
/* Kill default paragraph bottom margin inside boxes so it doesn't
   double up with the box's own padding-bottom */
main.content .theorem > p:last-child,
main.content .premise > p:last-child,
main.content .lemma > p:last-child,
main.content .corollary > p:last-child,
main.content .definition > p:last-child,
main.content .identification > p:last-child,
main.content .principle > p:last-child,
main.content .condition > p:last-child,
main.content .argument > p:last-child,
main.content .untyped > p:last-child {
    margin-bottom: 0 !important;
}

/* Per-type color coding. The left accent strip is always the type's own
   color; border and background are also tinted toward it (40% / 6% mixed
   into the shared neutral chassis color) — Move (.argument) is the one
   exception, staying on the plain neutral chassis to match its neutral
   strip. Condition used to key its color off which of the three
   .condition-time/-space/-substance modifier classes was present (still
   added at runtime, one per letter, but now only to drive which letter
   shows in the header) — consolidated to a single shared color on
   request: T/S/Φ are all the same kind of thing, and three different
   colors implied a distinction between them that was never actually
   intended. */
main.content .definition {
    border-color: color-mix(in srgb, var(--book-sb-definition-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-definition-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-definition-border, var(--book-link));
}
main.content .identification {
    border-color: color-mix(in srgb, var(--book-sb-identification-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-identification-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-identification-border, var(--book-link));
}
main.content .principle {
    border-color: color-mix(in srgb, var(--book-sb-principle-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-principle-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-principle-border, var(--book-link));
}
main.content .theorem {
    border-color: color-mix(in srgb, var(--book-sb-theorem-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-theorem-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-theorem-border, var(--book-link));
}
main.content .lemma {
    border-color: color-mix(in srgb, var(--book-sb-lemma-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-lemma-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-lemma-border, var(--book-link));
}
main.content .premise {
    border-color: color-mix(in srgb, var(--book-sb-premise-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-premise-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-premise-border, var(--book-link));
}
main.content .corollary {
    border-color: color-mix(in srgb, var(--book-sb-corollary-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-corollary-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-corollary-border, var(--book-link));
}
main.content .condition {
    border-color: color-mix(in srgb, var(--book-sb-condition-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-condition-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-condition-border, var(--book-link));
}
main.content .argument {
    /* Was border-left-color only, staying on the plain neutral chassis
       for its border/background while every other type got the full
       40%/6% color-mix tint — on request, now matches Definition's
       full treatment (the two share --book-sb-argument-border ===
       --book-sb-definition-border, procyon.css), not just the strip. */
    border-color: color-mix(in srgb, var(--book-sb-argument-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-argument-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-argument-border, var(--book-link));
}
main.content .untyped {
    border-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-untyped-border, var(--book-link));
}

/* border-left-color re-declared in every one of these 9 dark-mode
   overrides, not just border-color — a pre-existing gap, unrelated to
   today's chassis-neutral work but found while re-verifying it: border-
   color is a shorthand that sets all four sides (including left) as
   part of the SAME declaration, and this selector (body.quarto-dark
   main.content .X, 0-2-2) is more specific than the base rule's own
   plain main.content .X { border-left-color: ... } (0-1-1) — so in dark
   mode specifically, this shorthand's own implied border-left-color
   silently beat the base rule's explicit, full-strength one, leaving
   every box's left accent the same 40%-diluted shade as its other three
   sides instead of the bold, distinct strip the design comment above
   (§12) describes. Confirmed live on both Procyon Dark and Cosmos
   before this fix: getComputedStyle's own borderTopColor and
   borderLeftColor were identical on every box tested. */
body.quarto-dark main.content .definition {
    border-color: color-mix(in srgb, var(--book-sb-definition-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-definition-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-definition-border, var(--book-link));
}
body.quarto-dark main.content .identification {
    border-color: color-mix(in srgb, var(--book-sb-identification-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-identification-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-identification-border, var(--book-link));
}
body.quarto-dark main.content .principle {
    border-color: color-mix(in srgb, var(--book-sb-principle-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-principle-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-principle-border, var(--book-link));
}
body.quarto-dark main.content .theorem {
    border-color: color-mix(in srgb, var(--book-sb-theorem-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-theorem-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-theorem-border, var(--book-link));
}
body.quarto-dark main.content .lemma {
    border-color: color-mix(in srgb, var(--book-sb-lemma-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-lemma-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-lemma-border, var(--book-link));
}
body.quarto-dark main.content .premise {
    border-color: color-mix(in srgb, var(--book-sb-premise-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-premise-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-premise-border, var(--book-link));
}
body.quarto-dark main.content .corollary {
    border-color: color-mix(in srgb, var(--book-sb-corollary-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-corollary-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-corollary-border, var(--book-link));
}
/* .argument was missing from this dark-mode set entirely — its own
   light-mode color-mix rule (added earlier tonight, unscoped to any
   theme) has the SAME specificity as the shared dark chassis rule
   above (body.quarto-dark main.content .argument, among others),
   which sets a flat border-color: #505050 on all four sides including
   left. In dark mode that shared rule comes later in the cascade and
   wins on source order at equal specificity, silently reverting
   Argument back to plain gray there — confirmed live via
   getComputedStyle (rgb(80,80,80) instead of the shared Definition
   blue). Every other type already had its own dark-scoped override
   for exactly this reason; Argument just never got one before. */
body.quarto-dark main.content .argument {
    border-color: color-mix(in srgb, var(--book-sb-argument-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-argument-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-argument-border, var(--book-link));
}
body.quarto-dark main.content .condition {
    border-color: color-mix(in srgb, var(--book-sb-condition-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-condition-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-condition-border, var(--book-link));
}
body.quarto-dark main.content .untyped {
    border-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
    border-left-color: var(--book-sb-untyped-border, var(--book-link));
}

main.content .quick-reference {
    /* Was the raw, full-strength --book-sb-quickref-border value
       directly — every OTHER typed box dilutes its own border color
       through the same color-mix(...40%...) formula (above), which is
       most of why they read as a light, consistent family; this one
       skipped that step and used its variable neat, landing visibly
       darker/heavier than its siblings at the identical 1px/4px width —
       confirmed live as the "way too thick" a reader flagged, a color-
       strength problem, not an actual width one. Matched to the same
       40% formula here. */
    border-color: color-mix(in srgb, var(--book-sb-quickref-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
    background-color: var(--book-sb-quickref-bg, var(--book-bg));
}

/* Paragraphs inside any block: no first-line indent, tight, left-aligned */
main.content .theorem p,
main.content .premise p,
main.content .lemma p,
main.content .corollary p,
main.content .definition p,
main.content .identification p,
main.content .principle p,
main.content .condition p,
main.content .argument p,
main.content .untyped p,
main.content .quick-reference p {
    text-indent: 0 !important;
    margin: 0;
    text-align: left;
    hyphens: manual;
}

main.content .theorem p + p,
main.content .premise p + p,
main.content .lemma p + p,
main.content .corollary p + p,
main.content .definition p + p,
main.content .identification p + p,
main.content .principle p + p,
main.content .condition p + p,
main.content .argument p + p,
main.content .untyped p + p {
    margin-top: 0.4em;
}

/* Gap between the (now unlined) title paragraph and the body — still
   useful for boxes like .definition where the term-name and its body
   text are genuinely separate paragraphs. */
main.content .theorem > p + p,
main.content .premise > p + p,
main.content .lemma > p + p,
main.content .corollary > p + p,
main.content .definition > p + p,
main.content .identification > p + p,
main.content .principle > p + p,
main.content .condition > p + p,
main.content .argument > p + p,
main.content .untyped > p + p {
    padding-top: 0.75em;
}

/* Box header row: the box's own name, then — for types with a numbered
   claim-cite-key or a Condition letter — an interpunct and a bold handle
   (T1/L7/P3, or a bare T/S/Φ), then always an interpunct and the
   spelled-out type tag, italic (Theorem 1, Premise, Definition, Result,
   Condition, Move…). A rule underneath separates the header from
   the body. Inserted as a real DOM element (.box-header, with
   .box-header-title/-handle/-dot/-tag children) by the include-after-body
   script rather than CSS generated content — a single ::before can only
   hold one string, and this needs several independently-styled ones on
   the same line. */
main.content .box-header {
	padding-bottom: 0.4em;
	margin-bottom: 0.6em;
	border-bottom: 1px solid var(--book-callout-header-border);
	/* Neither this element nor its own margin/padding were ever the
	   issue a reader kept describing as "too much space above the
	   title" — both measured 0 live. The real cause: this is a single
	   short line, but with no line-height of its own it inherits the
	   reading column's own prose line-height (1.7×, tuned for
	   multi-line body paragraphs), so the text sits centered in a line
	   box nearly twice its own glyph height — visible empty space above
	   (and below) the text even though no element actually has a
	   top offset. 1.3 is tight enough to read as a label/heading line,
	   not a paragraph. */
	line-height: 1.3;
}
main.content .box-header-title {
	font-size: 1em;
	font-weight: 600;
	font-style: normal;
	color: var(--book-heading);
}
main.content .box-header-dot {
	margin: 0 0.4em;
	font-weight: 700;
	font-size: 1em;
	color: var(--book-heading);
}
main.content .box-header-handle {
	font-size: 1em;
	font-weight: 700;
	font-style: normal;
}
main.content .box-header-tag {
	font-size: 1em;
	font-weight: normal;
	font-style: italic;
}
/* Per the locked guide: for ordinary types (a numbered claim or not), the
   dot, handle, and tag all run in the type color, so the header reads as
   one continuous band. Move (.argument) has no accent at all — dot/handle/
   tag stay the shared neutral color, same as the title. Darkened a touch
   (mixed toward black) in light mode only, so they hold contrast against
   the boxes' lightly-tinted background; dark mode's accent values are
   already tuned light enough to pop as-is.
   Condition used to be the one exception here — the guide had its identity
   color riding on the symbol (handle) alone, dot/tag left neutral gray, "so
   the standout is the letter, not the whole line." Reversed on request: a
   reader compared it against the other six types and wanted the whole
   header — dot and spelled-out tag included, not just the T/S/Φ handle —
   to carry the same blue every other type's full header does; the neutral
   tag in particular read as "the one that doesn't have a blue thing." */
main.content .definition .box-header-dot,     main.content .definition .box-header-handle,     main.content .definition .box-header-tag     { color: color-mix(in srgb, var(--book-sb-definition-border, var(--book-link)) 80%, black); }
main.content .identification .box-header-dot, main.content .identification .box-header-handle, main.content .identification .box-header-tag { color: color-mix(in srgb, var(--book-sb-identification-border, var(--book-link)) 80%, black); }
main.content .principle .box-header-dot,      main.content .principle .box-header-handle,      main.content .principle .box-header-tag      { color: color-mix(in srgb, var(--book-sb-principle-border, var(--book-link)) 80%, black); }
main.content .theorem .box-header-dot,        main.content .theorem .box-header-handle,        main.content .theorem .box-header-tag        { color: color-mix(in srgb, var(--book-sb-theorem-border, var(--book-link)) 80%, black); }
main.content .lemma .box-header-dot,          main.content .lemma .box-header-handle,          main.content .lemma .box-header-tag          { color: color-mix(in srgb, var(--book-sb-lemma-border, var(--book-link)) 80%, black); }
main.content .premise .box-header-dot,        main.content .premise .box-header-handle,        main.content .premise .box-header-tag        { color: color-mix(in srgb, var(--book-sb-premise-border, var(--book-link)) 80%, black); }
main.content .corollary .box-header-dot,      main.content .corollary .box-header-handle,      main.content .corollary .box-header-tag      { color: color-mix(in srgb, var(--book-sb-corollary-border, var(--book-link)) 80%, black); }
main.content .condition .box-header-dot,      main.content .condition .box-header-handle,      main.content .condition .box-header-tag      { color: color-mix(in srgb, var(--book-sb-condition-border, var(--book-link)) 80%, black); }
/* Move has no accent color, but its tag now carries real, variable gloss
   text (the "route to result" — see the header script) rather than a
   static word, so it still needs an explicit, consistent neutral rather
   than falling through to whatever the ambient text color happens to be. */
main.content .argument .box-header-dot,
main.content .argument .box-header-tag { color: var(--book-sb-argument-border, var(--book-link)); }

body.quarto-dark main.content .definition .box-header-dot,     body.quarto-dark main.content .definition .box-header-handle,     body.quarto-dark main.content .definition .box-header-tag     { color: var(--book-sb-definition-border, var(--book-link)); }
body.quarto-dark main.content .identification .box-header-dot, body.quarto-dark main.content .identification .box-header-handle, body.quarto-dark main.content .identification .box-header-tag { color: var(--book-sb-identification-border, var(--book-link)); }
body.quarto-dark main.content .principle .box-header-dot,      body.quarto-dark main.content .principle .box-header-handle,      body.quarto-dark main.content .principle .box-header-tag      { color: var(--book-sb-principle-border, var(--book-link)); }
body.quarto-dark main.content .theorem .box-header-dot,        body.quarto-dark main.content .theorem .box-header-handle,        body.quarto-dark main.content .theorem .box-header-tag        { color: var(--book-sb-theorem-border, var(--book-link)); }
body.quarto-dark main.content .lemma .box-header-dot,          body.quarto-dark main.content .lemma .box-header-handle,          body.quarto-dark main.content .lemma .box-header-tag          { color: var(--book-sb-lemma-border, var(--book-link)); }
body.quarto-dark main.content .premise .box-header-dot,        body.quarto-dark main.content .premise .box-header-handle,        body.quarto-dark main.content .premise .box-header-tag        { color: var(--book-sb-premise-border, var(--book-link)); }
body.quarto-dark main.content .corollary .box-header-dot,      body.quarto-dark main.content .corollary .box-header-handle,      body.quarto-dark main.content .corollary .box-header-tag      { color: var(--book-sb-corollary-border, var(--book-link)); }
body.quarto-dark main.content .condition .box-header-dot,      body.quarto-dark main.content .condition .box-header-handle,      body.quarto-dark main.content .condition .box-header-tag      { color: var(--book-sb-condition-border, var(--book-link)); }

/* Lists inside an .argument block pull tight to the chassis */
main.content .argument > ol,
main.content .argument > ul {
    margin: 0.35em 0 !important;
}
main.content .argument ol > li { margin-bottom: 0; }
main.content .argument ol > li:last-child { margin-bottom: 0; }

/* ============================================================
   13. LEVEL-2 SECTION SPACING
   Quarto wraps each ## heading in <section class="level2">. The first
   level-2 section in a chapter sits next to raw chapter-overview prose;
   subsequent level-2 sections sit next to sibling sections. Default
   margin behavior differs across those two cases, producing a larger
   gap above the first subsection than above subsequent ones. Normalize.
   ============================================================ */

main section.level2,
main .section.level2 {
	margin-top: 1.5rem;
}

main section.level2 > h2:first-child,
main .section.level2 > h2:first-child,
main section.level2 > .header-section-number + h2,
main .section.level2 > .header-section-number + h2 {
	margin-top: 0;
}

/* ============================================================
   14. JUSTIFIED BODY TEXT
   Justify paragraphs in main content; hyphenate to avoid white-space
   rivers. Left-align contexts where justification creates ugly gaps.
   ============================================================ */

main p {
	text-align: justify;
	hyphens: auto;
	-webkit-hyphens: auto;
	-ms-hyphens: auto;
}

main li,
main .callout p,
main blockquote p,
main figcaption {
	text-align: left;
	hyphens: manual;
}

/* Standalone rhetorical beat — front-introduction.qmd's "But where is
   the word God?" set apart from the surrounding justified prose:
   centered, no first-line indent, generous breathing room above and
   below so it reads as a pause rather than another sentence in the
   paragraph flow. */
main.content .standout-line p,
#quarto-document-content .standout-line p {
	text-align: center;
	text-indent: 0 !important;
	margin: 2.75rem 0 !important;
	hyphens: none;
}

/* Extra room under a standout-line that ISN'T part of a blurred
   scroll-reveal sequence — the plain 2.75rem shared by every
   standout-line is fine between hidden lines sitting back-to-back,
   but a line meant to be read immediately (not blurred, always
   visible) wants more air under it than that default gives. The
   book's introduction (book/front-introduction.qmd) currently uses
   two plain, always-visible standout-lines back to back rather than
   any .scroll-reveal ones — a reader asked for the blur/reveal effect
   dropped there specifically — so both lines pick up this rule now;
   .scroll-reveal itself (below) is still live CSS/JS, just not
   currently used by any page. */
main.content .standout-line:not(.scroll-reveal) p,
#quarto-document-content .standout-line:not(.scroll-reveal) p {
	margin-bottom: 5.5rem !important;
}

/* .standout-tight — for a standout-line that's the SETUP half of a
   pair rather than the payoff, sitting right before another
   standout-line. On request, front-introduction.qmd's closing run of
   three ("Something about reality makes reading this possible." / "But
   where is the word God?" / "Within the opening line, the inversion
   begins.") reads as three equally-weighted beats with the standard
   5.5rem gap doing the same job everywhere — the reader wants the
   first two read as one tightly-coupled move (restate, then
   immediately question) and the third held apart as the actual reveal.
   Only the first line gets this class: its own bottom margin drops to
   match its top margin (2.75rem, the plain base rule above) instead of
   the extra-breathing 5.5rem every other standout-line's bottom gets,
   so the gap above and below it are visually equal. The second line
   keeps its own 5.5rem bottom margin untouched, so the gap before the
   third (reveal) line stays exactly as generous as it was. */
main.content .standout-line.standout-tight p,
#quarto-document-content .standout-line.standout-tight p {
	margin-bottom: 2.75rem !important;
}

/* .standout-reveal — the payoff line itself. Was margin-top:
   var(--book-flourish-gap-above) (8rem), a deliberately large pause
   from when this closing run was THREE lines (restate/question/
   reveal) and the reveal needed real separation from the other two.
   Now that the ending is two lines, on request: "close the space...
   give it the same amount of space as [the line above] has above
   it" — matching the 2.75rem gap sitting above the FIRST line (the
   base standout-line rule's own top margin), so the gap between the
   two lines now collapses to the same 2.75rem instead of standing out
   as a much bigger pause than the one above the whole pair. */
main.content .standout-line.standout-reveal p,
#quarto-document-content .standout-line.standout-reveal p {
	margin-top: 2.75rem !important;
}

.standout-line.standout-reveal + .next-chapter-nav {
	margin-top: var(--book-flourish-gap-below);
	padding-top: 0;
}

/* Same 5.5rem gap between two consecutive blurred scroll-reveal lines
   as sits above the first of them, whenever a page does use this
   effect — matches the gap above so a run of blurred lines reads as
   evenly spaced, not just the first pair. */
main.content .scroll-reveal + .scroll-reveal p,
#quarto-document-content .scroll-reveal + .scroll-reveal p {
	margin-top: 5.5rem !important;
}

/* A .scroll-reveal line starts blurred rather than invisible — the
   words are physically there but illegible, an actual redaction
   instead of empty space, so no separate placeholder glyph is needed
   to hint something's there.
   On touch devices they sharpen into focus as each scrolls into view
   (JS: IntersectionObserver in _quarto.yml adds .is-visible once an
   element crosses into the viewport, then stops watching it — a
   one-time reveal, not something that re-blurs on scrolling back up).
   Hover/focus and a tap/click (JS click handler, same file) both also
   clear the blur on every device — a reader who wants the line early
   doesn't have to wait for the scroll trigger. cursor: pointer
   signals that's possible.
   Hover-capable devices (a real mouse/trackpad — matches the JS's own
   window.matchMedia('(hover: hover) and (pointer: fine)') check, not a
   width breakpoint) skip the automatic scroll-into-view reveal
   entirely: the JS never sets up the IntersectionObserver at all on
   these devices, so .is-visible there only ever gets added by an
   actual click — the blur itself is what invites the hover, no
   separate cue needed.
   If IntersectionObserver isn't available at all, the JS clears every
   blur immediately instead of leaving it permanently illegible. */
.scroll-reveal {
	cursor: pointer;
}

.scroll-reveal p {
	filter: blur(10px);
	transition: filter 900ms ease;
}

.scroll-reveal:hover p,
.scroll-reveal:focus-visible p,
.scroll-reveal.is-visible p {
	filter: blur(0);
}

/* ----- Breadcrumb opt-out ---------------------------------
   Quarto's page breadcrumb is rendered as <ol class="breadcrumb">.
   The counter rules above would otherwise overwrite the breadcrumb's
   ::before slot — which is where the ">" separator lives — and put a
   numeric "1." in front of the first crumb. Reset the counter machinery
   on .breadcrumb and restore the separator between items. */

main.content ol.breadcrumb {
	list-style: none !important;
	padding-inline-start: 0 !important;
	margin: 0 0 1rem !important;
	counter-reset: none !important;
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
}

main.content ol.breadcrumb > li {
	position: static;
	counter-increment: none !important;
	padding-left: 0 !important;
	margin-bottom: 0 !important;
}

main.content ol.breadcrumb > li::before {
	content: none !important;
	position: static !important;
	left: auto !important;
	width: auto !important;
	padding: 0 !important;
}

main.content ol.breadcrumb > li + li::before {
	content: "›" !important;
	position: static !important;
	width: auto !important;
	padding: 0 0.45em !important;
	color: var(--book-breadcrumb-sep);
	font-weight: 400;
}

/* ============================================================
   15. REFERENCES PAGE — hanging-indent bibliography
   Targets the bibliography page (body-classes: references-page).
   ============================================================ */

body.references-page main.content p,
body.references-page #quarto-document-content p {
	text-indent: -1.5em !important;
	padding-left: 1.5em !important;
	margin-top: 0 !important;
	margin-bottom: 0.3em !important;
	font-size: 0.85rem;
	line-height: 1.45;
	text-align: left;
	hyphens: manual;
	-webkit-hyphens: manual;
	-ms-hyphens: manual;
}

/* Settings menu → Layout → Indentation (html.book-opening-indent, §6)
   toggles whether a SECTION'S FIRST paragraph is flush or indented —
   meaningless on this page, which has no ordinary prose paragraphs at
   all, only a flat run of hanging-indent bibliography entries. Its own
   rule above already forces every entry to -1.5em regardless, but the
   toggle's own :first-of-type selector (§6) targets the exact same
   entries with MORE class selectors in it (:not(.book-opening-indent),
   :first-of-type) than this page's own rule has, so it wins on
   specificity for the very first entry alone — confirmed by walking
   the cascade: with the toggle at its default (off) state, that one
   entry silently loses its hanging indent (forced flush) while every
   entry below it keeps it, and toggling "Indented" on repairs it again
   purely as a side effect of no longer matching. On request, after the
   identical bug was confirmed on the Subject Index page below: this
   page's own indent must hold for every entry unconditionally, so the
   toggle simply has nothing left to affect here. Repeats this rule's
   own selector combined with the toggle's exact structural patterns
   (§6) so specificity is guaranteed to beat it either way, rather than
   just re-asserting a plain .content p rule and hoping it's enough. */
body.references-page main.content > p:first-of-type,
body.references-page main.content section > p:first-of-type,
body.references-page main.content .section > p:first-of-type,
body.references-page #quarto-document-content > p:first-of-type,
body.references-page #quarto-document-content :is(h1, h2, h3, h4, h5, h6) + p {
	text-indent: -1.5em !important;
}

/* ============================================================
   16. GLOSSARY PAGE + SYMBOLS PAGE — no first-line indent on entries
   ============================================================ */

body.glossary-page main.content p,
body.glossary-page #quarto-document-content p,
body.symbols-page main.content p,
body.symbols-page #quarto-document-content p {
	text-indent: 0 !important;
	margin-bottom: 0.75em;
	text-align: left !important;
	hyphens: manual;
	-webkit-hyphens: manual;
	-ms-hyphens: manual;
}

/* ============================================================
   16c. HOME PAGE (index.qmd) — reads like any other page: title +
   subtitle only, no auto-generated Author/Status metadata block.
   Body paragraphs are deliberately NOT overridden here — they fall
   through to the book's normal prose rules (§6: first-line indent, no
   paragraph spacing, fully justified), the same as every chapter. An
   earlier version of this section styled them like the Glossary
   (no indent, left-aligned, paragraph-spaced instead) for a page that
   reads more like a narrative intro than a reference page — removed
   so the whole site reads as one consistent typographic voice rather
   than switching styles at the front door.
   ============================================================ */

body.home-page #title-block-header,
body.style-preview-page #title-block-header {
	display: none !important;
}

body.home-page main.content,
body.home-page #quarto-document-content,
body.quarto-dark.home-page main.content,
body.quarto-dark.home-page #quarto-document-content,
body.style-preview-page main.content,
body.style-preview-page #quarto-document-content,
body.quarto-dark.style-preview-page main.content,
body.quarto-dark.style-preview-page #quarto-document-content {
	/* Was 1.5rem, then 4rem, then 7rem across earlier rounds. Briefly
	   dropped to 2rem (matching every other page's own default) on the
	   theory that the large gap read as broken/inconsistent once
	   compared against a real chapter — reverted back on direct
	   correction: the smaller gap looked worse, not better, on this
	   page's own hero-title treatment ("The Inversion of Greatness"
	   still needs real room above it here). Back to 7rem. The oscillating
	   nav-item bug reported alongside this is a separate, deeper issue
	   (the reading column's own width isn't continuous across the
	   1120px breakpoint) — not caused by and not fixed by this padding
	   value either way. */
	padding-top: 7rem !important;
}

/* The home-page title: plain scannable text set to match
   resources/web-banner-*.png's typography closely enough that the
   image itself was retired (see git history for the old <img> markup
   and its home-title-image/home-banner-light/-dark rules). */
.home-title-text-emulation {
	display: block;
	text-align: center;
	/* Was 3.25rem, then 2.5rem, then 1.3rem — two earlier rounds moved
	   the title higher; this round reverses direction and asks for it
	   back down again, ~15px worth (the "ten or twenty pixels" a reader
	   asked for). 2.25rem (36px, +15.2px off 1.3rem's own 20.8px). */
	margin-top: 2.25rem;
	/* Was 2.25rem, then 11rem, then 9rem, then 7.75rem, then 6.5rem,
	   then 5.3rem, then 4.7rem (79.9px) — see git history for the
	   earlier rounds' own reasoning, all previously trending smaller.
	   This round moves the opposite way: the dotted divider below reads
	   as this element's own margin-bottom (nothing between them has a
	   top offset of its own), so widening this by ~20px pushes the
	   divider down that same amount, independent of the title's own
	   move above. 6rem (96px, +20.8px off 4.7rem). */
	margin-bottom: 6rem;
}

/* Full-width dotted rule under the home-page title — same dotted
   border-bottom-on-a-zero-height-element technique as the sidebar's
   own TOC dot leader (§ .sidebar-chapter-leader) and the chapter-
   footer's .next-chapter-flourish, just spanning edge to edge here
   instead of per-row or scoped to the nav row. */
.home-title-divider {
	display: block;
	width: 100%;
	height: 0;
	margin: 0 0 2.5rem;
	border-bottom: var(--book-flourish-height) dotted var(--book-muted);
	opacity: var(--book-flourish-opacity);
}
.home-title-text-main {
	/* Georgia first, deliberately — this block exists to mimic
	   resources/web-banner-*.png, which was set in actual Georgia.
	   Source Serif 4 (the site's usual serif) has a taller x-height/
	   narrower letterform ratio than Georgia and read visibly "taller"
	   at the same font-size, not just a fallback-order technicality. */
	font-family: Georgia, 'Source Serif 4', 'Source Serif 4 Fallback', Charter, serif;
	font-weight: 700;
	/* A JS auto-fit pass (measure natural width, scale to match the
	   reading column) was tried here and pulled in favor of a fixed
	   size, bisected empirically against the real rendered element
	   rather than calculated: #quarto-document-content's own
	   getBoundingClientRect() reads 800px, but that includes its own
	   padding — a plain child block's actual usable content width
	   comes out to ~651px, confirmed live by testing directly against
	   scrollWidth/clientWidth at several sizes (3.3rem was the exact
	   zero-margin boundary; 3.9rem visibly overflowed). 3rem clears it
	   with real margin. The earlier JS approach measured against the
	   800px figure without accounting for that padding, which is most
	   of why it kept overflowing despite "correct" math. clamp() only
	   for the width the column itself actually still changes at
	   (<800px, where it starts shrinking, §19c). White-space: nowrap:
	   this is genuinely a one-line design (the image it's standing in
	   for never wraps either), not a shrink-to-two-lines fallback. */
	font-size: 2.5rem;
	line-height: 1.1;
	letter-spacing: -0.01em;
	white-space: nowrap;
	max-width: 100%;
	overflow: hidden;
	text-overflow: ellipsis;
	color: var(--book-heading);
}
@media (max-width: 799.98px) {
	.home-title-text-main {
		/* Bounds re-bisected for Georgia (switched from Source Serif 4
		   above) — Georgia's letterforms run wider, so the old 1.3rem
		   floor / 6.5vw preferred / 3rem cap (tuned for the narrower
		   font) clipped "Greatness" to "Great…" at a 375px phone width.
		   Cap now tracks the base size above (2.5rem, not the old 3rem)
		   too, so mobile doesn't render larger than desktop right above
		   this query's 799.98px edge. */
		font-size: clamp(1.2rem, 6vw, 2.5rem);
	}
	/* The title above scales down on mobile via clamp(), but this rule
	   was missing entirely — confirmed live on an actual phone (a
	   screenshot from inversionofgreatness.org), the subtitle stayed
	   fixed at its desktop 1.3rem while the title shrank around it, so
	   it read as louder than the title it's subordinate to and wrapped
	   across three lines. Same proportion as the desktop sizes (1.3rem
	   is ~52% of 2.5rem) carried into the mobile clamp: floor and cap
	   scaled by that same ratio off .home-title-text-main's own
	   1.2rem/2.5rem, preferred value at half the vw coefficient. */
	.home-title-text-subtitle {
		font-size: clamp(0.62rem, 3vw, 1.3rem);
	}
}
.home-title-text-subtitle {
	margin-top: 0.35rem;
	font-family: Georgia, 'Source Serif 4', 'Source Serif 4 Fallback', Charter, serif;
	font-style: italic;
	font-size: 1.3rem;
	color: var(--book-heading);
}
.home-title-text-subtitle em {
	font-weight: 400;
}
/* "from the" / "to" — same italic, same color, same font as the rest of
   the subtitle (the banner image renders them in identical ink, just
   smaller and already lowercase); no small-caps, no faded opacity. */
.home-title-text-subtitle .home-title-connector {
	font-size: 0.52em;
}

/* Home page sidebar: chapter list padding. padding-bottom only now —
   the padding-top: 0 this rule used to also carry is REMOVED outright
   (not just re-scoped, which was tried once already and wasn't enough):
   it collides with padding-TOP itself at every width where "Table of
   Contents" is supposed to match the opposite rail's own title —
   docked, Compact, true mobile, all of it — because those alignment
   fixes all work by giving .sidebar-menu-container the SAME padding-top
   nav#TOC already has at that width (§ its own comments elsewhere), and
   this rule's flat 0 silently beat every one of them here, the exact
   same out-specifies-everything trap the left/right values already hit
   once (§ below). A patch scoped to just sub-compact was tried first —
   wrong fix, confirmed live directly against a fresh screenshot at full
   desktop width still showing the same gap that patch never touched:
   "does it seriously look like those are the same to you? Because
   table of contents is still too high." Removing this declaration
   entirely lets .sidebar-menu-container's own per-width padding-top
   (already correct for every other page) apply on the home page too,
   same as left/right already do below. Whatever the original ~8.5px-
   gap problem this used to guard against was, nothing about removing
   it reintroduced any visible gap on retest.
   padding-top/padding-bottom only, not the old padding: 0 0.75rem 1rem
   0 shorthand — that shorthand's left/right values were never actually
   chosen for a home-page-specific reason (nothing in this rule's own
   history explains them), just carried along incidentally by using the
   4-value shorthand to set top. Because body.home-page adds an extra
   class, this selector out-specifies EVERY width-based padding rule for
   this same element (docked ≥1338px's 17px, Compact's 16px, and
   sub-compact's 34px alike — all just #quarto-sidebar .sidebar-menu-
   container, one ID + one class, regardless of which media query wraps
   them), so the home page silently got 0/12.75px left/right at every
   width instead of whichever figure was actually supposed to apply
   there — confirmed live and directly reported: "I noticed this on the
   full screen mode too... compact mode, and... this mode," a single
   root cause behind what looked at first like three separate bugs (and
   wasn't a mysterious second sub-compact breakpoint either — the two
   "layouts" were the home page, broken, vs. every other page, fine, at
   the same width). Longhand top/bottom only, so left/right fall through
   to whichever breakpoint rule actually applies, same as every other
   page. */
body.home-page #quarto-sidebar .sidebar-menu-container {
	padding-bottom: 1rem !important;
}

/* Strip Quarto's default left padding on sidebar sections/items
   so the home page chapter list aligns like the nav#TOC */
body.home-page #quarto-sidebar .sidebar-item,
body.home-page #quarto-sidebar .sidebar-item-container,
body.home-page #quarto-sidebar .sidebar-section {
	padding-left: 0 !important;
	margin-left: 0 !important;
}

/* Home page: number on left of title */
body.home-page .toc-entry-num {
	order: -1 !important;
	opacity: 1 !important;
	font-size: inherit !important;
}
body.home-page .toc-entry-title {
	flex: 0 1 auto !important;
}

/* Style chapter list items to match the TOC link look */
body.home-page #quarto-sidebar .sidebar-item-container a.sidebar-item-text {
	display: flex !important;
	justify-content: flex-end !important;
	align-items: baseline !important;
	gap: 0.4em !important;
	text-align: left !important;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-weight: 400;
	color: var(--book-chrome-text) !important;
	opacity: 0.75;
	font-size: 0.83rem;
	line-height: 1.35;
	padding: 0.2rem 0;
	border-left: none !important;
}
body.home-page #quarto-sidebar .sidebar-item-container a.sidebar-item-text:hover {
	opacity: 1;
	color: var(--book-chrome-text) !important;
}
body.home-page #quarto-sidebar .sidebar-item-container a.sidebar-item-text.active {
	color: var(--book-chrome-text-hover) !important;
	opacity: 1;
}
/* Hide section dividers that have no href (e.g. collapsed group headers) */
body.home-page #quarto-sidebar .sidebar-item-section > .sidebar-item-container > a:not([href]) {
	display: none !important;
}

/* Group separators — deliberately removed. This rule used to draw a
   border-top/spacing gap on the first chapter and first back-matter
   item, but the JS that assigns .home-chapter-first/.home-backmatter-
   first never actually worked until a same-session bug fix elsewhere
   (the two classes depend on .sidebar-chapter-num, which a since-fixed
   script only started producing correctly on the home page) — so this
   rule had been sitting dormant, unseen, since whenever it was
   written. The first time it actually rendered live, it read as a
   stray, unintended line. Left the class-assignment JS itself alone
   (home-backmatter-first is still a real marker other rules key off,
   see the opacity/font-size rule below) — only the visual border/
   spacing here is gone. */

/* Numbered chapters — same muted color as the rest of the list, just
   slightly larger to signal they're the main event. */
body.home-page #quarto-sidebar .sidebar-item-container a.sidebar-item-text:has(.toc-entry-num) {
	opacity: 0.75 !important;
	font-size: 0.88rem !important;
}

/* Back matter — muted, slightly smaller */
body.home-page #quarto-sidebar li.home-backmatter-first ~ li .sidebar-item-container a.sidebar-item-text,
body.home-page #quarto-sidebar li.home-backmatter-first .sidebar-item-container a.sidebar-item-text {
	opacity: 0.5 !important;
	font-size: 0.76rem !important;
}

/* Procyon byline — the closing "Procyon—the genus of the raccoon…"
   paragraphs at the very bottom of the home page. Was an ordinary
   Markdown blockquote (>), which pulled in the site's general
   blockquote treatment (left border, indent, italic) — reads as a
   quoted excerpt, not a signature; plain paragraphs instead, same as
   the rest of the page's prose. */
.procyon-byline p {
	margin: 0;
	text-indent: 0 !important;
}
.procyon-byline p + p {
	margin-top: 0.5em;
}

/* Table of Contents + Back Matter page titles: every other page
   (chapters and site chrome alike) shares #title-block-header's big
   "chapter drop" treatment on purpose (§3b's own comment — a reader
   wanted every page's header consistent, not this page special-cased
   smaller). But on the Table of Contents page specifically, a reader
   said the outline itself is the content — the big centered title
   block above it reads like its own chapter opener eating space that
   belongs to the list below, not a heading over a reference page. On
   request, the same call extends to every true back-matter reference
   page (Symbols, Glossary, Bibliography, Notes, Subject Index —
   body-classes: back-matter-page, added alongside each page's own
   existing class by merge-chapters.js/collect-notes.js/combine-
   references.js): "I want all the back matter pages to kind of have
   that back matter look and not the chapter title look." NOT applied
   to the numbered appendices (Modal Logic Primer, Formal Proof
   Summary, Derivation Map, Empirical Predictions) — those read as
   substantive chapters in their own right, not pure reference lists,
   and weren't part of this request. Cut down to a plain compact
   title, plus a full-width dotted rule under it in the same quiet
   language as .home-title-divider/.next-chapter-flourish elsewhere
   (border-bottom on the header itself, not a separate empty div,
   since there's nothing else here to hang one off). color-mix(), not
   the flourish rule's own element-level opacity — this element still
   has real title text in it, and opacity would fade that along with
   the border (same reasoning as the H2 rule, above, which hit the
   identical problem). */
body.table-of-contents-page #title-block-header,
body.back-matter-page #title-block-header {
	padding-top: 2.5rem;
	padding-bottom: 1.5rem;
	margin-bottom: 2rem !important;
	border-bottom: var(--book-flourish-height) dotted color-mix(in srgb, var(--book-muted) 30%, transparent);
}

/* Mobile "Page Contents" drawer toggle (.mobile-margin-toggle,
   resources/book-scripts.html): on this page (and the same handful of
   back-matter pages below) there are no ##-level headings at all —
   checked each back-matter file directly rather than assuming
   symmetry across all of them: Bibliography and Glossary have zero
   headings, Subject Index has zero, but Symbols (4 headings: The
   Conditions/Structural terms/Logical notation/Variables) and Notes
   (6, one per originating chapter) genuinely do, so the drawer this
   toggle opens has real, useful content there and keeps it. On the
   headerless pages, that drawer has nothing left to show except an
   empty nav#TOC. That toggle is normally kept on toc-less pages on
   purpose — it also opens the Font/Layout/Palette/Dim-margin tools
   row, reverted back on request after an earlier attempt hid it on
   every headerless page (see that file's own "Reverted on request"
   comment) — but on these specific pages the redundancy (a Page
   Contents button with nothing in it) was confirmed worth losing that
   mobile access for. .glossary-page.back-matter-page (both classes
   required), not plain .glossary-page: that class is shared with
   Derivation Map, a numbered appendix that DOES have real headings
   (§1–§9) and needs to keep this — back-matter-page is only ever
   added to the actual Glossary page (merge-chapters.js's
   BODY_CLASSES), so the combination reaches Glossary alone. */
body.table-of-contents-page .mobile-margin-toggle,
body.references-page .mobile-margin-toggle,
body.subject-index-page .mobile-margin-toggle,
body.glossary-page.back-matter-page .mobile-margin-toggle {
	display: none !important;
}

/* Table of Contents page: each entry is "[**1.1 Reality**](...)[·
   description]{.toc-entry-desc}" — Notion's own prose, one bullet per
   section. link-table-of-contents.js wraps the description in its own
   span specifically so it can be sized/colored independently of the
   title beside it, rather than inheriting one shared color/size for
   the whole line (a plain trailing text node, with nothing of its own
   to select, was the original approach — too coarse once a reader
   wanted the description noticeably lighter AND smaller than the
   title, not just a different color at the same weight).
   rgba(...0.75), lighter than a flat var(--book-muted) — this page's
   own description text sits directly under a bold linked title, more
   contrast than --book-muted's other, less print-dense uses elsewhere
   on the site were designed for. table-of-contents-page (export-
   pages.js's own EXTRA_BODY_CLASSES table) scopes all of this to just
   this page.
   --book-heading on the title, not --book-link — chapter headings
   (h3, since link-table-of-contents.js links the heading text itself)
   and entry titles are still real links, but a reader wanted them
   reading as plain outline text, not "every single line on the page
   is gold," which is what Quarto's own default link color did here by
   default once these became clickable. */
/* The bold linked title beside .toc-entry-desc (below), matched to
   that same span's own font-size — on request: "I want the table of
   contents [entries]... each line to be the same size... time, space,
   substance, triconditional structure, I want those words to be the
   same size as the lines that they're on... maybe slightly smaller...
   that way everything's just kinda even." Reverses the size GAP
   between title and description this page used to have on purpose
   (§ .toc-entry-desc's own "it doesn't need to be as big" comment,
   just below) — that request was about the description alone being
   smaller than a fixed-size title; this one is about the title itself
   coming down to meet it, so the two read as one even line rather
   than a bold headline over a caption. Scoped to li (level 2, e.g.
   "1.1 Reality," and level 3 nested under it, e.g. "1.1.1 Reality
   Precludes") — chapter-level titles ("1. Groundwork") are h2
   headings, not <li>s, so they're untouched, matching "level one can
   stay at the top." Both a bare li > strong (unlinked entries, e.g.
   "On Composition") and li > a > strong (every linked entry) are
   covered — the title text lives in one or the other depending on
   whether link-table-of-contents.js found a matching anchor for it. */
body.table-of-contents-page #quarto-document-content li > strong,
body.table-of-contents-page #quarto-document-content li > a > strong {
	/* Was 0.78em — on request, "increase the second level by a size or
	   so," a bump up from the exact-match-to-description size just
	   established. */
	font-size: 0.85em;
}
body.table-of-contents-page #quarto-document-content .toc-entry-desc {
	color: rgba(var(--book-muted-rgb), 0.85);
	/* Was 0.85em, then 0.78em (matched to the title beside it) — on
	   request, "increase the second level by a size or so," bumped up
	   alongside the title's own identical change, just above, so the
	   two stay matched at the new size rather than drifting apart
	   again. */
	font-size: 0.85em;
	/* This span shares its first line with the bold title beside it
	   (both inline, same bullet), but wraps onto lines of its own past
	   that — the chapter-level description ("4. Metaphysical Rivals")
	   is a genuine block <p> with no such mixed-size line to share, and
	   reads with better spacing between its own wrapped lines as a
	   result. p/li's own site-wide line-height (1.7, unitless) is
	   inherited here as a NUMBER, so it already scales with this span's
	   own smaller font-size rather than the title's larger one — same
	   ratio, not the bug — but a genuinely comfortable wrap for text
	   this small still wants a taller ratio than body prose does, not
	   just the same one scaled down. On request: "the line height
	   should be based on the smaller text... except for the top line,"
	   i.e. the shared first line (title + start of description) stays
	   whatever it already is; this only changes how this span's own
	   later, description-only lines space themselves. 1.95 tried
	   first — overshot: "the gap... needs to be closed a little bit,"
	   a reader's own direct comparison against "6.4 Cognition"'s own
	   two-line wrap. 1.8 is a smaller step up from the page's own 1.7
	   body-text baseline than that first attempt was, not a reversion
	   all the way back to it. */
	line-height: 1.8;
}
/* Nested (third-tier) entries — "Awareness," "Knowledge," "Holiness,"
   the subsection bullets one level in from "6.4 Cognition" etc. — were
   rendering at the exact same size as their parent tier, no visual
   step-down at all, which read as too tall/loose over a page this
   long: "I really need this... to be a little bit more compact." Set
   on the nested <ul> itself, not the <li>/.toc-entry-desc individually
   — font-size cascades, so this one rule shrinks the bold title AND
   (compounding with .toc-entry-desc's own already-relative 0.85em
   above) the description text together, in the same proportion they
   already relate to each other at the top tier. line-height is a
   unitless 1.7 inherited from the page's general prose rule, so each
   row's own height shrinks right along with the font — no separate
   margin/line-height override needed for the more-compact feel this
   was actually asked for. */
body.table-of-contents-page #quarto-document-content ul ul {
	/* !important: a sitewide "ol, ul, ol li, ul li ... { font-size:
	   inherit !important }" rule elsewhere beats this on specificity
	   alone otherwise, confirmed live — !important is the only thing
	   that rule ever loses to. Was 0.88em — on request, "increase the
	   third level by a size or so" (a separate ask from the second
	   level's own identical bump just above/below this rule): this is
	   the one multiplier that scales the whole nested tier at once
	   (title and description together, whatever their own local
	   em-values are), so bumping it here reaches level 3 specifically,
	   on top of whatever it already inherits from level 2's own
	   increase. */
	font-size: 0.92em !important;
	/* Was 21.12px (1.5em at this rule's own 0.88em-scaled font-size) —
	   confirmed live via computed style that this was actually coming
	   from main.content ul's own padding-inline-start: 1.5em !important
	   (§ its own rule, "Unordered lists keep the default disc, but
	   tighten padding"), a sitewide reset that matches any <ul>
	   including this nested one — plain padding-left here, no
	   !important, silently lost to it regardless of this selector's own
	   higher specificity, the same logical/physical-property trap this
	   file already documents elsewhere (see §3b's margin-bottom/margin-
	   block-end comment). padding-inline-start, not padding-left, plus
	   !important, is what actually reaches this element: a little more
	   room between this nested tier's own bullets ("6.4.1 Awareness",
	   "6.4.2 Knowledge", ...) and the parent tier above them ("6.4
	   Cognition"), on request, so the hierarchy reads more clearly at a
	   glance. */
	padding-inline-start: 2rem !important;
}
/* Fallback only, for any nested entry link-table-of-contents.js still
   can't resolve to a real anchor (left as plain "**Bold Title** ·
   description" text, no .toc-entry-desc span of its own) — most of
   these ("1.1.1 Reality Precludes", "2.7.1 Null State (∅)", ...) are
   now properly linked and wrapped by that script (its own subMatch
   handling, fixed to strip the entry's leading number before looking
   it up against buildSubsectionIndex's bare-name keys), which is what
   actually reaches .toc-entry-desc's own font-size for them, same as
   every other tier — no separate sizing needed here at all. An earlier
   version of this rule tried to fake that same effect with a
   compensating font-size increase on the bold title (to cancel out a
   shrink applied to the whole <li>) — reverted on request: "I did not
   mean to increase the size of the sub... I didn't say increase the
   other size in relation to it." Color only, matching what a plain
   miss should look like next to its now-properly-styled neighbors. */
body.table-of-contents-page #quarto-document-content ul ul li {
	color: rgba(var(--book-muted-rgb), 0.85);
}
body.table-of-contents-page #quarto-document-content ul ul li strong {
	color: var(--book-heading);
}

/* Every entry's ink should read the same regardless of tier — only
   size/weight (§ the three-tier rules above) should carry the
   hierarchy, on request after a screenshot showed the subsection tier
   ("1.1.1 Reality Precludes" etc.) rendering in the sitewide link-blue/
   condition-teal while the tiers above it sat in plain dark ink, an
   inconsistency rather than an intentional third color. The rule
   above already targets ul ul li strong and should reach every tier
   on its own — this is a belt-and-suspenders !important override
   directly on the <a> as well, so nothing upstream (the sitewide
   a[href*="#sec-"] { color: inherit } rule, §4, or linkProseTerms'
   auto-linking) can still win for some entries and not others. */
body.table-of-contents-page #quarto-document-content li a,
body.table-of-contents-page #quarto-document-content li strong {
	color: var(--book-heading) !important;
}

/* No bullet markers — on request, after a screenshot read as "a
   generic web list" rather than a book contents page: every entry
   already carries its own number (1., 1.1, 1.1.1), so a disc/circle/
   square marker in front of it is pure redundancy, doubling up on
   work the numbering already does. Removing it leaves plain hanging
   indentation to carry the hierarchy, the same way a printed TOC
   does. padding-inline-start (§7 and the ul ul override above) is
   untouched — that's what actually creates the step-in per tier;
   list-style alone only ever controlled the marker glyph itself. */
body.table-of-contents-page #quarto-document-content ul {
	list-style: none !important;
}

/* Three-tier size/weight step-down, on request: "the top level to be
   kind of bigger and bolder... the second layer to be maybe not as
   big... still bold... the third layer to just be smaller and not
   bold at all." The rules above already left a size gap between tiers
   (chapter-level li>strong at 0.85em, further shrunk once by .ul ul's
   own 0.92em for section-level, and shrunk AGAIN for subsection-level
   since its own <ul> is itself nested inside the section-level <ul> —
   both match "ul ul", compounding), but every tier still rendered at
   the same font-weight (the sitewide "strong, b { font-weight: 600 }"
   reset, §2, applies uniformly regardless of depth) — the actual ask
   here is a weight step-down too, which nothing existing provided, and
   the existing size gap alone read as too subtle to call "noticeable."
   Exact depth is targeted with chained child combinators (> ul > li),
   not the "ul ul" descendant selector used elsewhere in this section —
   that selector matches ANY ul with an ancestor ul, which is both
   tier 2 and tier 3's own list, fine for a blanket shrink but useless
   for singling out exactly one tier the way a font-weight override
   here needs to. !important on all three: needed to beat this same
   page's own li > strong rule above (font-size only, no weight) and
   the sitewide ol/ul font-size:inherit reset these child-combinator
   selectors would otherwise lose to on specificity alone (confirmed
   necessary elsewhere in this file for the identical reason). */
body.table-of-contents-page #quarto-document-content > ul > li > strong,
body.table-of-contents-page #quarto-document-content > ul > li > a > strong {
	font-size: 1em !important;
	font-weight: 800 !important;
}
body.table-of-contents-page #quarto-document-content > ul > li > ul > li > strong,
body.table-of-contents-page #quarto-document-content > ul > li > ul > li > a > strong {
	font-size: 0.92em !important;
	font-weight: 700 !important;
}
body.table-of-contents-page #quarto-document-content > ul > li > ul > li > ul > li > strong,
body.table-of-contents-page #quarto-document-content > ul > li > ul > li > ul > li > a > strong {
	font-size: 0.85em !important;
	font-weight: 400 !important;
}

/* Vertical rhythm: on request, "close the gap... doesn't need to be
   as tall of a table... a lot of white space between the items,
   especially between h2 level [and h3] — that one in particular has
   a lot more white space than the others." The height wasn't really
   coming from li spacing at all — main.content ul > li has
   margin-bottom: 0 (§7) — it was every NESTED <ul> (one wraps each
   entry's own children: "1.1 Reality"'s <ul> holding "1.1.1 Reality
   Precludes" etc.) carrying the sitewide main.content ul rule's own
   margin: 0.5em 0 !important (§7, meant for ordinary body-text bullet
   lists elsewhere on the site). A nested <ul> sitting as a li's first
   or last child has no padding/border of its own to stop that margin
   from collapsing straight through the li and merging with whatever's
   adjacent — its top margin surfaces as extra space ABOVE the first
   child, its bottom margin as extra space AFTER the last child,
   compounding once per nesting level. That's why "1.1 Reality" down
   to "1.1.1 Reality Precludes" read as taller than the gaps beside
   it: the child <ul> starting there adds its own top-margin on top of
   whatever gap the entries above it already had. Zeroing every ul's
   own margin on this page removes that collapsing-margin gap
   entirely; a small deliberate margin-bottom on every li (not on the
   ul) replaces it with one small, consistent gap between successive
   entries regardless of depth, instead of a compounding one. */
body.table-of-contents-page #quarto-document-content ul {
	margin: 0 !important;
}
body.table-of-contents-page #quarto-document-content li {
	margin-bottom: 0.15em;
}

/* Chapter/section summary paragraphs — the prose line right under
   each ## chapter heading (italic) and ### section heading (plain)
   that Notion writes as the first paragraph of the section, e.g.
   "Begins from what it means for anything to be real...". Quarto
   renders these as a plain <p> immediately after the heading inside
   its own section.levelN wrapper, so h2+p/h3+p (scoped to a direct
   child of section.level2/3, not just any following <p>, so a
   heading's own *second* paragraph two nodes down is left alone)
   reaches exactly that line and nothing else on the page. Set smaller
   and tighter than body text — shortens the page's overall scroll
   length, which was the point. The chapter-level (h2) paragraph stays
   flush with its own heading, not indented — only the section-level
   (h3) paragraph is indented, since only sections read as nested
   underneath a chapter, not the chapter's own summary under itself. */
body.table-of-contents-page #quarto-document-content section.level2 > h2 + p {
	/* Was 0.85em — same across-the-board step down as .toc-entry-desc's
	   own identical change, just above: "it doesn't need to be as big." */
	font-size: 0.78em;
	color: rgba(var(--book-muted-rgb), 0.85);
	margin-top: 0.25em;
	margin-bottom: 0.75em;
}
/* Section-level paragraphs now flow inline right after their own h3
   (see the h3 rule below — "Reality · Begins from what it means...",
   the same look as "Preface · description" in the Front Matter
   bullets), not stacked as a block underneath it — so none of the
   block-era spacing/indent props apply here anymore. display: inline
   is what actually makes it continue the heading's own line instead
   of starting a new one; margin: 0 clears the old block-paragraph
   spacing, which would otherwise still reserve dead vertical space
   even once display stopped being block (top/bottom margins are
   no-ops on true inline elements, but left/right margins are NOT —
   left over here it would shove the paragraph away from the
   interpunct). */
body.table-of-contents-page #quarto-document-content section.level3 > h3 + p {
	display: inline;
	/* Was 0.85em, then 0.78em — same "increase the second level" bump
	   as .toc-entry-desc's own identical change, above, reaching this
	   chapter's h3-based tier instead of the bracket-linked one. */
	font-size: 0.85em;
	color: rgba(var(--book-muted-rgb), 0.85);
	margin: 0;
	/* Same reasoning as .toc-entry-desc's own identical line-height,
	   above (including the 1.95 → 1.8 walk-back) — this is the same
	   "inline, shares its first line with a bold heading, wraps on its
	   own past that" shape. */
	line-height: 1.8;
}

/* Section headings ("1.1 Reality", "1.2 Modal Status", ...) — on
   request, merged onto one visual line with their own paragraph below
   ("Reality · Begins from what it means..."), matching how "Preface ·
   description" already reads in the Front Matter bullets above. display:
   inline is what does this: the <h3> stays a REAL heading in the DOM
   (deliberately — Quarto's right-rail Page Contents nav scans actual
   h1-h6 elements regardless of their CSS display, so this still shows
   up there scrolling past), it just no longer forces its own block/
   line the way a heading normally does. The ::after interpunct (" · ")
   is generated content, not real text, so it inherits nothing from the
   link/heading — colored to match the paragraph's own muted gray
   rather than the dark heading-ink, reading as connective punctuation
   between the two rather than part of either. margin-top moved to
   section.level3 (below) — margin-top is a no-op on an inline element,
   so it stopped doing anything the moment this became display: inline;
   the section wrapper itself is still block and still spaces one
   subsection from the next. */
body.table-of-contents-page #quarto-document-content section.level3 > h3,
body.table-of-contents-page #quarto-document-content section.level3 > h3 a {
	/* The visible text lives inside the heading's own <a> (link-table-
	   of-contents.js links the heading itself), and font-weight/style
	   set only on the h3 don't reliably survive down into it — some
	   earlier-cascade rule sets the anchor's own font-weight directly,
	   and a same-element declaration always beats an inherited one
	   regardless of specificity. Confirmed live: h3 itself computed to
	   the intended 700 but its <a> computed to 400 anyway. Setting the
	   anchor selector explicitly, not just the heading, is what
	   actually reaches the rendered text. 600 (not 700) to exactly
	   match "Preface"/"Introduction"'s own <strong> weight in the Front
	   Matter bullets above — confirmed via computed style, not the
	   heavier 700 tried first. */
	font-weight: 600;
	font-style: normal;
	/* Matches its own h3 + p description right after it (§ that rule's
	   own comment) and li > strong's identical treatment for the
	   bracket-linked entries elsewhere on this page — same "each line
	   the same size" request, just reaching this chapter's own h3-based
	   section tier (e.g. "1.1 Reality"), which isn't a <li> at all so
	   that rule alone never touched it. Bumped to 0.85em alongside both
	   of those on request, "increase the second level by a size or
	   so." */
	font-size: 0.85em;
}
body.table-of-contents-page #quarto-document-content section.level3 > h3 {
	display: inline;
	margin-left: 2.2rem;
}
body.table-of-contents-page #quarto-document-content section.level3 > h3::after {
	content: " · ";
	color: rgba(var(--book-muted-rgb), 0.85);
	font-weight: 400;
}
body.table-of-contents-page #quarto-document-content section.level3 {
	margin-top: 1rem;
}
/* The section number ("2.1", "2.10", "E.24") hung out in the left
   gutter so the title itself ("The S5 Pipeline") lines up flush with
   the paragraph below it — replaces the dot that used to mark this
   spot. A fixed-width box with a matching negative margin-left, not
   just a visual nudge: the box reserves exactly 2.2rem in the text
   flow, so the title always resumes at the h3's own 2.2rem position
   regardless of the number's own width. 2.2rem specifically — sized
   for the longest real number on this page (4 characters: "2.10",
   "E.24", not just the common 3-character "1.1" case). The original
   1.5rem box was too narrow for those: text-content wider than an
   inline-block's own width isn't clipped, it overflows and visually
   overlaps whatever comes right after it in flow — confirmed live,
   "2.10 Three Logical Strata" rendered with the "0" swallowed behind
   the title text, reading as "2.1". Right-aligned so the numbers form
   a tidy ragged-left column against the title rather than a ragged-
   right one, with a little padding-right so the number doesn't sit
   flush against the first letter of the title — the gap comes from the
   literal space already in the generated markdown between the number
   span and the title, same as before, not padding on this box (padding
   would add to the box's own width without a matching increase to the
   negative margin, pushing the title past 2.2rem). inline-block is
   required for width/text-align to apply at all — a plain inline span
   ignores both. */
body.table-of-contents-page #quarto-document-content .toc-h3-num {
	display: inline-block;
	width: 2.2rem;
	margin-left: -2.2rem;
	text-align: right;
}

/* Chapter headings ("1. Groundwork", "2. The Argument", ...) — same
   <a>-overrides-inherited-weight issue as the h3 fix above (the h2
   element itself computed to its normal 600, but its own link
   computed to 400), fixed the same way: set weight directly on the
   anchor, not just the heading. Chunkier than the h3/entry-title 600
   on request, so the chapter level reads as clearly heavier than the
   sections nested under it. */
body.table-of-contents-page #quarto-document-content section.level2 > h2,
body.table-of-contents-page #quarto-document-content section.level2 > h2 a {
	font-weight: 800;
}
body.table-of-contents-page #quarto-document-content h2 a,
body.table-of-contents-page #quarto-document-content h3 a,
body.table-of-contents-page #quarto-document-content li a {
	color: var(--book-heading);
}

/* In-prose subsection links — link-table-of-contents.js's linkProseTerms
   wraps each bold term in a chapter/section summary paragraph that
   names a real subsection (e.g. "**Possibility** and **Impossibility**
   are the primitives...") in a link to it. Back to the shared T/S/Φ
   condition color (--book-sb-condition-border) — tried dark
   --book-heading ink (matching every other link on the page) once the
   surrounding paragraph went muted gray, but asked to revisit the
   teal now that the rest of the page's palette has settled. Specificity
   (id + 2 classes) deliberately beats the general main.content
   a[href*="#sec-"] rule above, which would otherwise force these back
   to plain inherited color — every subsection anchor in the book is
   named #sec-..., so these links match that selector too. */
body.table-of-contents-page #quarto-document-content .toc-prose-link {
	color: var(--book-sb-condition-border, var(--book-link));
	border-bottom: none;
}
body.table-of-contents-page #quarto-document-content .toc-prose-link:hover {
	text-decoration: underline;
}

/* Procyon mark — a small centered sign-off below the byline text: the
   logo shrunk down to a tiny stamp (was sized to match the byline
   text's own line-height, which read as too large once seen live)
   flanked by a short dotted flourish line on each side, same dotted-
   flourish language as .home-title-divider/.next-chapter-flourish
   elsewhere on the site, to fill the trailing white space as a quiet
   ornament rather than another content row. Pandoc wraps the line/
   image/line inline sequence in one <p> — flex lives there so the
   three sit centered on one row regardless of that wrapper. */
.procyon-mark {
	margin-top: 1.5em;
}
.procyon-mark p {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 0.75em;
	margin: 0;
	text-indent: 0 !important;
}
.procyon-mark-line {
	display: inline-block;
	width: 3rem;
	height: 0;
	border-bottom: var(--book-flourish-height) dotted var(--book-muted);
	opacity: var(--book-flourish-opacity);
}
.procyon-mark img {
	/* Fixed and tiny, not derived from anything else — the previous
	   version's height was set by JS to match the adjacent text block
	   it used to sit beside; there's no text to match anymore now that
	   this is its own centered row, so a plain fixed size is enough.
	   max-width: none clears Quarto's own .img-fluid class (max-width:
	   100%, resolved against the parent <p>) — harmless at this size but
	   kept for the same reason noted the first time this was a fixed
	   pixel size: cheap insurance against the two chasing each other
	   into a squashed, non-square render. */
	width: 34px;
	height: 34px;
	max-width: none;
	flex-shrink: 0;
	opacity: 0.85;
}

/* ============================================================
   16b. SUBJECT INDEX PAGE — hanging indent: each entry's first line
   sits flush left; a wrapped continuation line nests in by 1em so it
   reads as part of the same entry rather than a new one.
   ============================================================ */

body.subject-index-page main.content,
body.subject-index-page #quarto-document-content {
	column-count: 2;
	column-gap: 2.5rem;
}

/* The title block lives inside the same column-count container as the
   entries (Quarto nests #title-block-header in main.content), so without
   this it gets squeezed into column 1 instead of sitting above both. */
body.subject-index-page #title-block-header {
	column-span: all;
}

body.subject-index-page main.content p,
body.subject-index-page #quarto-document-content p {
	text-indent: -1em !important;
	padding-left: 1em !important;
	font-size: 0.72rem;
	margin-bottom: 0.3em;
	text-align: left;
	hyphens: manual;
	-webkit-hyphens: manual;
	-ms-hyphens: manual;
}

/* Settings menu → Layout → Indentation is a useless, actively broken
   choice on this page: "it should not have the ability to switch
   between indented and flush for the top paragraph... it needs to not
   work on that page." Same root cause as the identical fix on the
   References page, above — the toggle's own :first-of-type selector
   (§6) outranks this page's own blanket rule just above on
   specificity, so at the toggle's default (off) state the very first
   index entry loses its hanging indent while every other entry keeps
   it, and switching "Indented" on incidentally fixes it again just by
   no longer matching. Reasserted here with the toggle's own exact
   structural selectors so it wins regardless of toggle state, leaving
   nothing left for that control to actually change on this page. */
body.subject-index-page main.content > p:first-of-type,
body.subject-index-page main.content section > p:first-of-type,
body.subject-index-page main.content .section > p:first-of-type,
body.subject-index-page #quarto-document-content > p:first-of-type,
body.subject-index-page #quarto-document-content :is(h1, h2, h3, h4, h5, h6) + p {
	text-indent: -1em !important;
}

/* ============================================================
   16c. TABLE OF CONTENTS PAGE — no longer a compact nav list (the
   previous design here, small/tight/dimmed like the right-rail Page
   Contents nav). This page is becoming its own thing: each entry
   eventually carries a short prose summary of what that section
   argues, not just its title — a table of contents that doubles as a
   summary of the argument. That means the deepest tier (x.x.x) needs
   to read as genuine body prose, not a muted UI label, with the two
   tiers above it (x.x, then the chapter itself) scaling up from that
   same baseline the way the book's own real headings already do
   (em, not rem — h1/h2/h3 elsewhere: 1.45/1.15/1.0em off whatever
   main.content's own font-size is, so this tracks the reader's Text
   Size setting the same way). Border-left ticks stay as the nesting
   cue (indent alone reads ambiguous once every level is full-color,
   readable text rather than shrinking/graying out), just no longer
   paired with reduced opacity now that every tier is meant to be read,
   not skimmed past.
   ============================================================ */

body.toc-page main.content h3,
body.toc-page #quarto-document-content h3 {
	font-size: 1.3em;
	font-style: normal;
	font-weight: 700;
	line-height: 1.3;
	margin: 1.8rem 0 0.4rem;
	text-align: left;
}
body.toc-page main.content h3 a,
body.toc-page #quarto-document-content h3 a {
	color: var(--book-heading);
	border-bottom: none;
}
body.toc-page main.content ul,
body.toc-page #quarto-document-content ul {
	list-style: none;
	margin: 0;
	padding-left: 0;
}
body.toc-page main.content ul ul,
body.toc-page #quarto-document-content ul ul {
	margin: 0;
	padding-left: 1.1rem;
}
body.toc-page main.content li,
body.toc-page #quarto-document-content li {
	margin: 0;
	text-align: left;
}
/* Top-level entries (1.1, 1.2 …) — a step down from the chapter
   heading, a step up from the x.x.x prose below. */
body.toc-page main.content li > a,
body.toc-page #quarto-document-content li > a {
	display: block;
	font-size: 1.08em;
	font-weight: 600;
	line-height: 1.4;
	padding: 0.15rem 0 0.15rem 0.6rem;
	border-left: 2px solid rgba(var(--book-muted-rgb), 0.15);
	color: var(--book-text);
}
/* x.x.x — the deepest tier, and the one meant to eventually carry a
   real prose summary, not just a short title: plain body-text weight/
   size/color, the same as an ordinary paragraph would read, rather
   than a smaller, dimmed, UI-list treatment. */
body.toc-page main.content ul ul li > a,
body.toc-page #quarto-document-content ul ul li > a {
	font-size: 1em;
	font-weight: 400;
	line-height: 1.5;
}
body.toc-page main.content li > a:hover,
body.toc-page #quarto-document-content li > a:hover {
	border-left-color: var(--book-link);
	color: var(--book-link);
}

/* ============================================================
   17. PAGE NAVIGATION
   Quarto's auto-generated prev/next bar (book.page-navigation) is off —
   at this book's scale, moving between chapters via the sidebar/navbar
   is already easy, so a bar for it wasn't earning its place. In its
   stead: a single quiet "Read Next Chapter" link, built and inserted
   by the include-after-body script, sitting right above the footnotes
   (or at the end of the prose, on pages without any).
   ============================================================ */

.next-chapter-nav {
	text-align: center;
	/* Was margin:3rem 0 2rem + padding-top:2rem (5rem total above) — far
	   more gap above the flourish than the prose above it warranted. */
	margin: 1.25rem 0 2rem;
	padding-top: 1rem;
}

/* A .standout-line's own bottom margin (2.75rem, §6b) already reads as
   a deliberate pause — stacked with this nav's own 2.25rem top spacing
   (margin + padding above), pages that end in a standout line (only
   front-introduction.qmd today) got an ~80px gap nothing else on the
   site has. This nav's own top spacing was zeroed out entirely so the
   standout-line's own margin was the only gap — but the last standout
   line on this page is "But where is the word God?", a line meant to
   hang on its own for a moment before anything else appears, and the
   plain 2.75rem it shared with every other gap on the page didn't give
   it that. --book-flourish-gap-above adds extra space back in on top
   of the standout-line's own margin, specific to this one spot. */
.standout-line + .next-chapter-nav {
	margin-top: var(--book-flourish-gap-above);
	padding-top: 0;
}

/* On pages with no footnotes, this nav is the last thing in
   main.content. main.content's own padding-bottom is zeroed out for
   this exact case (§17b below), so this margin is the only source of
   space between the row and the footer — reusing --book-flourish-
   gap-below, the same variable that sets the space between the
   flourish line and the row above it, so the row's text sits
   centered between the two by construction: whatever that value is,
   both sides match automatically. Pages that DO have footnotes are
   unaffected — this nav sits before them there, so it's never
   :last-child in that case. */
.next-chapter-nav:last-child {
	margin-bottom: var(--book-flourish-gap-below);
}

.next-chapter-arrow {
	/* Deliberately plain: no weight/size change from the link text
	   itself, just enough visual separation to read as a directional
	   marker rather than another word. */
	opacity: 0.6;
}

.next-chapter-link:hover .next-chapter-arrow {
	opacity: 1;
}

/* Was three letter-spaced middot characters — read as too faint/thin
   a divider between the prose above and the prev/next row below.
   A short horizontal rule reads as a more deliberate section break. */
/* 60px/1px/0.4 opacity (this rule's first version) turned out
   functionally invisible — confirmed live with a pixel-level scan
   showing only a rgb(253→195) difference against the page background,
   a barely-there smudge rather than a visible rule. Wider, thicker,
   and considerably less transparent is the combination that actually
   reads as a horizontal line at a glance. */
/* Dotted, not a solid fill — same technique and spirit as the sidebar's
   own chapter-list leader (§ .sidebar-chapter-leader): border-bottom
   on a zero-height element rather than a background-filled bar, so
   this reads as the same quiet dotted language as the rest of the
   site instead of a plain rule. */
.next-chapter-flourish {
	display: block;
	width: 100%;
	height: 0;
	margin: 0 0 var(--book-flourish-gap-below);
	border-bottom: var(--book-flourish-height) dotted var(--book-muted);
	opacity: var(--book-flourish-opacity);
}

/* Two-sided prev/next row — previous chapter at the left edge, next
   chapter at the right, each pointing outward toward the direction it
   leads. Always exactly two children (an empty placeholder span takes
   the slot when a page has no previous or no next — the first
   navigable page, or the last), so space-between keeps whichever
   real link there is pinned to its correct side instead of drifting
   to center. */
.chapter-nav-row {
	display: flex;
	justify-content: space-between;
	align-items: baseline;
	gap: 1.5rem;
}

.prev-chapter-link .next-chapter-arrow {
	margin-right: 0.3em;
}

/* One line, in the book's own body serif (no new font stack) rather
   than the two-line label+title treatment this started as — reads
   more like a quiet authorial aside than a UI element. */
.next-chapter-link {
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-style: italic;
	font-size: 1rem;
	color: var(--book-text); /* was --book-heading — reads better as prose than as a heading-weight element */
	text-decoration: none;
}

.next-chapter-link:hover {
	color: var(--book-link);
}

main.content,
#quarto-document-content {
	margin-bottom: 0 !important;
	/* Was 2rem — fine on pages that end in footnotes or the Read Next
	   Chapter link (each carries its own margin/padding on top of this),
	   but too tight on the rare page with neither (the last chapter,
	   Excursus), where the prose just stopped a couple lines above the
	   footer. */
	padding-bottom: 4rem !important;
}

/* Pages that end in the prev/next row: this 4rem plus the row's own
   bottom margin (below) was stacking to 102px below the row while the
   row only had 34px above it (between it and the flourish line) —
   confirmed live, a 3x mismatch the row's text was supposed to sit
   centered against. Zeroed here so the row's own margin-bottom
   (.next-chapter-nav:last-child, using the same --book-flourish-gap-
   below variable as the space above it) is the only source of space
   below, guaranteeing the two stay equal by construction rather than
   by matching two numbers by hand. */
main.content:has(.next-chapter-nav:last-child),
#quarto-document-content:has(.next-chapter-nav:last-child) {
	padding-bottom: 0 !important;
}

/* ============================================================
   18. FOOTER
   ============================================================ */

/* <footer class="footer"> (the element that actually holds .nav-footer)
   is itself a grid item on the outer page grid — Quarto's own base CSS
   places it at grid-row: contents-bottom / page-bottom. Grid items
   stretch to fill their row by default, and on any page short enough
   that the content doesn't reach the bottom of the viewport, that row
   is tall. .footer's own layout is plain block flow, so its child
   .nav-footer (sized to its own min-height, not stretched) just sits
   at the top of that stretched box — leaving the leftover row height
   as a visible black gap below the text, worse the shorter the page.
   align-self: end stops .footer from stretching at all: it now sizes
   to its own content (= .nav-footer's height) and sits flush at the
   bottom of the row instead, so the bar is only ever as tall as the
   text actually needs, on every page regardless of content length. */
.footer {
	align-self: end;
}

/* Quarto's own #quarto-content.page-columns grid reserves a second,
   fixed 60px row after the content row itself — confirmed live via
   computed grid-template-rows: "[content-top] <content-height>px
   [content-bottom] 60px [page-bottom]". That 60px is empty grid track,
   not padding on any visible element, so it rendered as a gap of bare
   chrome background between the white content column's own bottom edge
   and the footer bar. Zeroed out now that the footer is a full black
   bar matching the navbar (§18b): the content column is meant to run
   flush into it, the same way it runs flush against the navbar at the
   top of the page. (An earlier pass here used 16px instead of 0,
   reasoning a fully flush join would read as cramped — that held when
   the footer was a slim, chrome-toned strip, but doesn't when it's a
   full-weight black bar the content is meant to visibly meet.) Doesn't
   touch the content-top/page-bottom span the sidebars and the
   footnote-margin overlay (§ margin notes) still rely on for their own
   placement. */
#quarto-content.page-columns {
	grid-template-rows: [content-top] auto [content-bottom] 0px [page-bottom] !important;
}

.nav-footer {
	/* No background — blends into whatever's behind it (the dark chrome
	   margins) instead of reading as a separate solid bar. Was #000,
	   deliberately matching .navbar (§19) to mirror it as a bar of the
	   same weight; asked to be removed so the footer text just sits
	   quietly at the bottom of the page instead. */
	background-color: transparent;
	/* No divider here — the only horizontal line this page wants is
	   .next-chapter-flourish, above the prev/next row further up the
	   page. A border here was a misreading of an earlier request;
	   removed per explicit direction, confirmed live via an annotated
	   screenshot. */
	border-top: none;
	font-size: 0.78rem;
	/* Dimmed from the navbar's own --book-chrome-text (#e8e3da) — that
	   full brightness suits nav links but read as too bright for a quiet
	   copyright line. */
	color: rgba(232, 227, 218, 0.6);
	justify-content: center;
	/* Quarto's own base CSS sets align-items: baseline on .nav-footer —
	   with only one line of content in a bar taller than it, baseline
	   alignment left the leftover vertical space sitting entirely below
	   the text instead of split evenly. center fixes that. */
	align-items: center;
	/* Fixed height, not min-height + vertical padding — a plain fixed
	   height with align-items: center and zero vertical padding means
	   the single line of text is centered in a box of exactly this
	   height, full stop, no ambiguity from padding/min-height
	   interaction. Was 52px, matching the navbar's own height — reads
	   as too thick for a bar holding only one small line of dim text,
	   confirmed repeatedly against actual screenshots. 34px is close to
	   the text's own line-height plus a small margin, not an arbitrary
	   round number matched to something else in the page. Five segments
	   (copyright, license, how-to-cite, contribute, email) is too long
	   to guarantee on one line at every viewport width, so this bar
	   must never wrap to a second line — flex-wrap: nowrap plus
	   overflow-x: auto lets it scroll sideways on narrow screens
	   instead of growing taller. */
	height: var(--book-footer-height);
	/* Quarto's own base CSS sets min-height: 3.5em on .nav-footer — at
	   this bar's own 0.78rem font-size that resolves to ~44px, which
	   was silently winning over the height above (min-height always
	   wins over height when the two conflict) and is exactly why the
	   bar kept rendering taller than --book-footer-height said.
	   Confirmed live: without this override, computed height stayed
	   ~46px regardless of the height value above. */
	min-height: 0 !important;
	padding: 0 var(--book-footer-padding-x);
	flex-wrap: nowrap;
	overflow-x: auto;
}

.nav-footer-left,
.nav-footer-center,
.nav-footer-right {
	white-space: nowrap;
	/* Quarto's base CSS gives .nav-footer-center its own min-height: 3em,
	   margin-top: 3em, and margin-bottom: 1em — rules meant for a layout
	   where left/center/right stack into separate rows on narrow
	   screens, not this single always-one-line footer. That margin-top
	   alone was eating all the bar's height, confirmed live: it left
	   .nav-footer-center only ~0.6px of centered space to work with
	   inside the 34px bar while .nav-footer-left/-right (untouched by
	   that rule) sat correctly centered with ~7.7px on each side. */
	min-height: 0 !important;
	margin: 0 !important;
}

.nav-footer a,
.nav-footer a:visited {
	color: rgba(232, 227, 218, 0.6);
	border-bottom: none;
}

/* Smaller text and tighter side padding on phones reclaims enough
   width that most phones show the whole line without needing the
   horizontal scroll above — the bar still never grows taller. */
@media (max-width: 767.98px) {
	.nav-footer {
		font-size: 0.68rem;
		padding-left: 1rem;
		padding-right: 1rem;
	}
}

.nav-footer a:hover {
	color: var(--book-chrome-text-hover);
	border-bottom: none;
}

/* ============================================================
   19. NAVBAR — floating overlay (nav-links only)
   ============================================================
   Brand (site title) and search moved to the top of the static left
   sidebar; Font/Layout/Palette/Dim-margin moved to the top of the
   static right margin sidebar (both physically re-parented by the
   include-after-body script, not duplicated). All that's left here is
   the nav-link row (Home/In Plain Terms/Appendices/etc) — a reader
   wanted that reduced to a slim floating bar: translucent, never
   wider than the reading column, and never reserving layout space of
   its own (so nothing on the static page ever jumps when it appears/
   disappears), showing near the top of the page or on scroll-up and
   getting out of the way on scroll-down otherwise. */

#quarto-header {
	background: transparent !important;
	/* Quarto's own base CSS sets this fixed header to z-index: 1030 —
	   lower than the mobile drawers (#quarto-sidebar/#quarto-margin-
	   sidebar, 1055/1060) and their shared backdrop (1059). Any
	   positioned z-index:1030 element establishes its own stacking
	   context for everything inside it, which traps its descendants —
	   including .book-floating-sidebar-toggle/-margin-toggle, appended
	   here in _quarto.yml — at that same 1030 ceiling no matter how high
	   their own z-index is set individually; a child's z-index only ever
	   competes within its ancestor's stacking context, never against
	   the ancestor's own siblings directly. Raising the header itself
	   (not just the buttons inside it) is what actually lets those
	   floating toggles stay above an open drawer, matching
	   .quarto-secondary-nav's own 1070 for the same reason. */
	/* 1070 -> 1080: the same trap one level up. .navbar .dropdown-menu
	   (Appendices/References/Resources) is a descendant of this header,
	   declared z-index: 1075 of its own — but that only ever competes
	   against this header's OTHER children, never against things
	   outside the header entirely, since this positioned z-index
	   element walls its descendants into their own stacking context.
	   #quarto-margin-sidebar (the docked right rail, its own separate
	   top-level context) sits at z-index: 1075 too — confirmed live via
	   a reader's own screenshot: the rail's page-contents icon painted
	   on top of an open dropdown menu, poking through it, even though
	   the dropdown's own declared z-index (1075) is equal to, not less
	   than, the rail's. 1080 clears the rail's 1075 with the same one-
	   level-plus margin this file's other z-index fixes already use,
	   letting the header's real internal order (dropdown at 1075,
	   floating toggles at 1070) finally decide what it was always
	   supposed to decide. */
	z-index: 1080;
	/* pointer-events: none, restored to auto only on this header's own
	   real content just below — without this, raising z-index (just
	   above) made the WHOLE thing block clicks, not just win paint
	   order. This header spans the full viewport width at every width,
	   but its own actual content (the nav-link cluster) only occupies
	   the middle of that strip — the right third or so, where
	   #quarto-margin-sidebar's icon row (Focus mode/Layout/Chapter
	   Contents/Margin Notes/Font/Palette/dark mode/Search — a separate
	   element, just visually landing in that same top strip) physically
	   sits, was always empty, transparent header background, nothing
	   this box needed to catch clicks for. Confirmed live: a reader
	   reported being unable to click ANY of those icons right after the
	   z-index change above landed — elementFromPoint at every one of
	   their coordinates returned this header, not the icon underneath,
	   even though the icon still visually painted on top (z-index only
	   ever decides paint order, never hit-testing — a transparent box
	   with a plain z-index still eats every click inside its own
	   bounds regardless of what's rendered beneath it). */
	pointer-events: none;
}
#quarto-header .navbar-nav,
#quarto-header .navbar-toggler,
#quarto-header .navbar-brand,
#quarto-header #quarto-search,
.book-floating-sidebar-toggle,
.book-floating-margin-toggle,
/* .quarto-secondary-nav (the true-mobile hamburger/breadcrumb/search
   bar, <800px) is ALSO a direct child of #quarto-header — confirmed
   live via its own parentElement chain — so its left/right toggle
   buttons inherited this same pointer-events: none and were never
   restored to auto anywhere in this file, same bug as every other
   entry in this list, just never caught here specifically until a
   reader reported the whole mobile nav dead: "I cannot click on the
   left icon or the right icon that are supposed to open up the
   menus." Both buttons listed explicitly (Quarto's own native
   .quarto-btn-toggle for the left/chapter-list drawer, this file's own
   .mobile-margin-toggle for the right/margin drawer) rather than a
   broad .quarto-secondary-nav selector, matching this list's existing
   one-entry-per-real-control pattern above. */
.quarto-secondary-nav .quarto-btn-toggle,
.mobile-margin-toggle,
.book-navbar-font-toggle,
.book-navbar-dark-light-toggle,
/* .book-navbar-search-toggle (the header's own search icon, appended
   into .quarto-navbar-tools — a genuine descendant of #quarto-header,
   confirmed via its own parentElement chain) — same exact bug as
   every other entry in this list, just never caught for THIS icon
   specifically until a reader reported it directly: clickable at
   ≥1120px (a different element, .book-margin-search-toggle, takes
   over there — outside #quarto-header, in the right rail, never
   affected), but dead at every width below that, true mobile
   included — confirmed live via elementFromPoint at the icon's own
   coordinates, which returned <body> itself, not the button: nothing
   was catching the click at all, it fell straight through. */
.book-navbar-search-toggle {
	pointer-events: auto;
}

/* <992px: plain solid bar, untouched by the floating rewrite below —
   Bootstrap's own hamburger/collapse takes over at that point anyway,
   and the brand/search/tools moves above are unconditional (not
   breakpoint-gated), so this bar's own content is just the hamburger
   toggler + (once opened) the nav-link list. */
.navbar {
	background-color: var(--book-chrome-bg-solid) !important;
	border: none !important;
	box-shadow: none !important;
	padding-top: 0.3rem;
	padding-bottom: 0.3rem;
	padding-left: 0 !important;
	padding-right: 0 !important;
	/* Locked, not left to its content: below 992px this row also holds
	   .book-mobile-brand (the mobile title clone) alongside the hamburger
	   toggler, and that title's own line height is taller than the
	   icon-only row above 992px needed — without an explicit height the
	   bar itself grew to fit it, a visible ~9px jump in the header's own
	   height right at the 991.98px edge (confirmed live). A fixed height
	   plus centering keeps every width's content vertically centered in
	   the same box instead of the box resizing around whatever's inside
	   it. */
	height: 52px !important;
	align-items: center;
}

@media (min-width: 992px) {
	/* Left/width come from #quarto-document-content's own rendered
	   rect (--book-navbar-bar-left/-width, include-after-body script's
	   setBarBounds()) — "I don't want it to be any wider than the edge
	   of this website," a reader's own words, so this tracks the
	   reading column's actual width rather than guessing a fixed one.
	   position: relative (not absolute/fixed) is enough: #quarto-header
	   itself is already the position:fixed, viewport-pinned element
	   (Bootstrap's .fixed-top) that headroom.js's own translateY
	   transform already targets (confirmed live — .headroom--pinned/
	   --unpinned toggle back and forth on #quarto-header on every
	   scroll, already, with no JS of this project's own involved); this
	   bar just needs to be narrower than its full-width parent, not
	   independently fixed itself. */
	.navbar {
		position: relative;
		/* Extends past the reading column's own edges on each side —
		   went through +5px/side (covers the reading column's own
		   box-shadow bleed, §7), flush (0/side), a couple px narrower
		   (3px/side, then 1px/side), before landing back on extending
		   again, wider than the original 5px this time. */
		left: calc(var(--book-navbar-bar-left, 0) - 10px);
		width: calc(var(--book-navbar-bar-width, 100%) + 20px);
		/* Flat, solid chrome color — same --book-chrome-bg-solid the
		   left/right sidebars use, not the translucent --book-chrome-bg
		   (rgba) + backdrop-filter blur this used to have. Plain
		   rectangle: no border-radius, no box-shadow, no gradient — a
		   reader explicitly didn't want this reading as a "floating
		   card" (rounded corners + shadow implying it's raised off the
		   page), just a flat solid bar. */
		background-color: var(--book-chrome-bg-solid) !important;
		border-radius: 0;
		box-shadow: none;
		background-image: none;
		/* Horizontal padding only now — vertical padding moved onto
		   .navbar-container below instead (see its own comment for why:
		   a reader wanted that box's own bottom edge, shadow included,
		   flush against the reading column with no gap, which needs it
		   to fill this bar's full height, not sit centered inside a
		   padded one). margin-top used to be 0.75rem — #quarto-header
		   itself is background: transparent (so the narrower .navbar bar
		   reads as floating over content-width, not a full-bleed strip),
		   and a MARGIN sits outside the navbar's own opaque box, in the
		   transparent header. Confirmed live: once scrolled (headroom
		   re-pinning the header while the page is scrolled down), the
		   reading column's own text — already scrolled up behind the
		   fixed header — was visible through that gap, then cut off
		   hard where the navbar's opaque background begins, reading as
		   a stray white sliver with a "shadow" edge under it. */
		padding: 0 1rem !important;
		/* stretch, not the base rule's center — lets .navbar-container
		   below fill this bar's full 52px height instead of sitting
		   centered at its own intrinsic (shorter) height. */
		align-items: stretch;
	}

	/* .navbar-container is Quarto's own existing markup (a plain
	   .container-fluid div, the one direct child of <nav class=
	   "navbar">) — already nested exactly one level inside the bar
	   above, already housing everything actually visible in it
	   (brand/tools are reparented out via JS, so what's left is just
	   the nav-link row) — so this doesn't need a new wrapper element,
	   just new rules on the one Quarto already built. The outer .navbar
	   bar above stays deliberately wider than the reading column (its
	   own comment has the history: covers the reading column's own
	   box-shadow bleed at the top of the page) — a flat, unshadowed
	   rectangle whose only job is hiding that spillover. This inner
	   box does the opposite on purpose: sized to the reading column's
	   TRUE width (not the outer bar's +20px one) and centered inside
	   it. Bootstrap's own .container-fluid sets width: 100% !important
	   on this same element, hence the !important here too. */
	.navbar-container {
		width: var(--book-navbar-bar-width, 800px) !important;
		max-width: 100%;
		/* Fills .navbar's own full height (that bar's own vertical
		   padding was removed above specifically so this could reach
		   its true top/bottom edges) — confirmed live: without this,
		   the shadow below sat on a shorter, vertically-centered box,
		   leaving a visible gap between the shadow's own bottom edge
		   and the reading column starting beneath it. display:flex +
		   align-items:center re-centers this box's OWN children (the
		   nav-link row) now that the box itself is full height —
		   Bootstrap's own .navbar > .container-fluid rule already sets
		   both, !important here just guarantees it survives this height
		   change too. */
		height: 100% !important;
		display: flex !important;
		align-items: center !important;
		margin-left: auto !important;
		margin-right: auto !important;
		/* inset, not a plain drop shadow (the reading column's own
		   box-shadow, first tried here, spread OUTSIDE this box's own
		   edges — confirmed live, and not what was asked: "only inside
		   that box"). inset clips the shadow to this box's own interior
		   entirely, no bleed past its border. Negative Y offset, not
		   positive — inset shadow direction is the inverse of a normal
		   drop shadow's: negative Y concentrates it at the BOTTOM inner
		   edge (the standard "content is cut off below" scroll-shadow
		   trick, run backwards on purpose) rather than the top, so it
		   reads as shadow pressing up into the box from the book below
		   it, fading out before it reaches the top — not a shadow
		   sitting on all four inner edges evenly. Negative spread
		   (-6px) keeps the band relatively thin instead of washing out
		   the whole box interior. Opacity brought down from 0.45 to
		   0.2, and the blur/spread eased off slightly too (10px/-6px →
		   7px/-5px) — on request, "a little less pronounced... a little
		   more subtle" than the first pass. Turned down once more
		   (0.2 -> 0.12, 7px/-5px -> 6px/-4px) on a second look — still
		   too much of "a thing." */
		box-shadow: inset 0 -6px 6px -4px rgba(0, 0, 0, 0.12);
	}

	/* No longer needs the old absolute-position/50%-center-transform
	   trick — the bar itself is already exactly the reading column's
	   width now, so simply centering this row within it lands in the
	   same place with far less machinery. */
	.navbar-collapse > .navbar-nav {
		position: static;
		display: flex;
		justify-content: center;
		width: 100%;
		margin: 0 !important;
	}

	.navbar-collapse > .navbar-nav .nav-link,
	.navbar-collapse > .navbar-nav .dropdown-toggle {
		white-space: nowrap;
	}
}

@media (max-width: 991.98px) {
	/* Bootstrap's default toggler is sized for a large touch target
	   (~37px, confirmed live) — noticeably heavier than every other
	   icon in this row. Shrinking the icon itself (font-size, which
	   Bootstrap's .navbar-toggler-icon sizes itself off via 1.5em)
	   while keeping a bit of padding preserves a reasonable tap area
	   without the icon looking oversized next to its neighbors. */
	#quarto-header .navbar-toggler {
		font-size: var(--book-navbar-hamburger-font-size);
		padding: var(--book-navbar-hamburger-padding);
		/* A reader kept seeing a brief black outline flash the instant
		   this button was tapped on an actual phone, after the :focus
		   box-shadow below was already confirmed gone in a desktop-
		   browser check — the box-shadow fix was real but incomplete:
		   -webkit-tap-highlight-color is a separate, mobile-Safari/
		   Chrome-only default (a translucent gray/black overlay matching
		   the tapped element's own box on touch, nothing to do with
		   :focus/:active CSS states at all), invisible to a mouse-click
		   simulated in a desktop check and never addressed by the rule
		   below. This button was the only icon in the row still showing
		   it — every other icon here is small enough, or already dark
		   enough against the header, that the same default highlight
		   never read as visible on them the way it did on this larger
		   toggler. transparent removes the overlay outright. */
		-webkit-tap-highlight-color: transparent;
	}
	/* Bootstrap's own default :focus state puts a box-shadow ring around
	   this button (confirmed live: rgb(89,89,89), a dark gray flashing
	   as a "black outline" the instant the button is tapped) — a reader
	   found it distracting and asked for it gone. No keyboard-focus
	   concern here: opening the dropdown itself already gives a reader
	   a much clearer "this worked" signal than a ring around the icon
	   that tapped it. :active included, !important, plus the child <i>
	   icon — a reader kept seeing a ring appear the instant this button
	   (and the matching .book-floating-*-toggle pair, § below) was
	   pressed and vanish the instant it was released, :active's own
	   exact timing, after :focus alone was already confirmed "none" by
	   computed style and didn't account for it. */
	#quarto-header .navbar-toggler:focus,
	#quarto-header .navbar-toggler:focus-visible,
	#quarto-header .navbar-toggler:active,
	#quarto-header .navbar-toggler-icon {
		box-shadow: none !important;
		outline: none !important;
		border: none !important;
		-webkit-tap-highlight-color: transparent !important;
	}
	/* The expanded nav-link list (tapped open via the hamburger) had no
	   background of its own — confirmed live: rgba(0, 0, 0, 0), fully
	   transparent — so it read as barely legible, the reading column's
	   own page content showing straight through behind "Home" and the
	   rest of the links. .book-nav-collapse-backdrop (§ below) dims the
	   page behind the whole dropdown, but that's a separate full-
	   viewport overlay one z-index lower — it was never meant to be
	   this list's own opaque fill, and isn't one. Same solid
	   --book-chrome-bg-solid every other piece of chrome on this page
	   already uses. */
	.navbar-collapse {
		background-color: var(--book-chrome-bg-solid);
	}
	/* Breathing room below the last item ("Contact") and the panel's
	   own bottom edge — on request, it sat flush against it with
	   nothing below. */
	.navbar-collapse > .navbar-nav {
		padding-bottom: 0.75rem;
	}
	/* Left padding for the expanded nav-link list — on request, the
	   items ("Author's Notes", "Appendices", ...) sat with almost no
	   gap against the panel's own left edge. */
	.navbar-collapse > .navbar-nav {
		padding-left: 1rem;
		padding-right: 1rem;
	}

	/* ── Appendices/References/Resources: real accordion, not Bootstrap
	   Dropdown ──────────────────────────────────────────────────────
	   Several earlier rounds tried to force Bootstrap's Dropdown — a
	   component built for a floating popup, positioned by Popper.js —
	   into behaving like an in-place "button extends downward" shape
	   purely via CSS (position: static, transform: none, clipping the
	   parent to hide Popper's own leftover offset, ...). Never fully
	   worked live. resources/book-scripts.html now intercepts the tap
	   on these three toggles at true-mobile width and prevents
	   Bootstrap's own Dropdown from ever engaging at all (no .show
	   class, no Popper positioning to fight), driving a plain
	   .mobile-submenu-open class instead — everything below reacts to
	   that class, not to Bootstrap's own dropdown state. Above
	   991.98px this same markup is untouched, real Bootstrap Dropdown,
	   exactly as it always was. */

	/* Base toggle look — every top-level item (Author's Notes,
	   Appendices, References, Resources, Contact) is its own pill
	   button, matching the nested .dropdown-item buttons' own look
	   (§ above) rather than reading as two different visual languages. */
	.navbar-collapse > .navbar-nav > .nav-item > .nav-link,
	.navbar-collapse > .navbar-nav > .nav-item > .dropdown-toggle {
		background-color: rgba(var(--book-chrome-text-rgb), 0.04);
		border-radius: 5px;
		padding: 0.5rem 0.75rem;
	}
	/* !important + explicit margin-top: 0, not just margin-bottom: the
	   gap stayed visibly large (~20px+) after the previous, non-
	   !important version — bigger than a plain 0.3rem (~5px) could
	   produce alone, meaning something else was still stacking with
	   it: either Quarto's bundled Bootstrap CSS still winning some
	   part of the margin shorthand (no !important on the first
	   attempt), or a leftover margin-top on the item itself adding to
	   the previous item's own margin-bottom instead of the two
	   collapsing into one shared gap the way block margins normally
	   would (which can happen once flex/grid or certain overflow
	   contexts are involved, both already in play on this page). Both
	   possibilities are covered by forcing all four margin sides
	   explicitly rather than only ever setting margin-bottom. */
	.navbar-collapse > .navbar-nav > .nav-item {
		margin: 0 0 0.3rem 0 !important;
	}

	/* The submenu itself: always in the DOM and laid out (display:
	   block), but clipped to zero height until opened — a max-height
	   transition needs a real, laid-out box to animate, unlike
	   Bootstrap's own display:none/.show pair, which can't animate at
	   all. Zeroed hard across the board (border/padding/margin on both
	   the list and its own items) so the collapsed state is genuinely
	   nothing — a first version left a hairline visible between closed
	   items, on request: "what's that little line... I can click [it]."
	   !important throughout: beats Quarto's bundled Bootstrap CSS, the
	   same fight every other override in this section has needed. 400px
	   is a generous cap comfortably taller than any of these three
	   submenus' real content (4-5 short items) — max-height transitions
	   need a fixed target, "auto" doesn't animate, so this just needs
	   to clear the tallest real case, not match it exactly.
	   No border, no background-shade change, no divider line anywhere
	   in this whole block — on request: "I want the container... to
	   look the same throughout the transition, just taller and more
	   compact. That's the only difference." An earlier version tried a
	   deeper background tint + a border wrapping the open state, meant
	   to read as "one shape, distinct from the page" — reversed: it
	   read as decoration nobody asked for, not clarity. The toggle and
	   its open submenu now share the exact same background as the
	   toggle's own closed/resting state (rgba(--book-chrome-text-rgb,
	   0.04), § the base toggle rule above) in every state, open or
	   closed. */
	.navbar-collapse .dropdown-menu {
		/* Plain instant show/hide, no animation — on request: "I don't
		   think these need to actually slide... whatever is making it
		   slide is causing the problems." Several real bugs (text
		   bleeding through the clipped edge, a bigger-than-expected gap
		   under items with a hidden submenu, a delay clicking through
		   to References) all traced back to the max-height/visibility
		   transition machinery this used before — animating a height
		   change reliably across browsers is genuinely fiddly, and
		   nothing here actually needs it. display: none contributes
		   ZERO to layout while closed (no residual height/margin
		   questions to chase) and paints nothing at all (no clip-edge
		   bleed possible) — strictly simpler than max-height +
		   visibility + overflow ever was, at the cost of losing the
		   slide animation, which is exactly the tradeoff asked for. */
		position: static !important;
		display: none !important;
		background: transparent !important;
		background-color: transparent !important;
		border: none !important;
		box-shadow: none !important;
		border-radius: 0 !important;
		margin: 0 !important;
		padding: 0 !important;
		min-width: 0 !important;
		/* Several different property changes in a row (padding, margin,
		   text-align, display) produced literally zero visible movement
		   on a reader's own screenshot — a strong signal none of those
		   was ever the actual cause. Forcing the menu's own width to
		   fill its container explicitly, box-sizing included, rules out
		   a different possibility entirely: the menu shrinking to fit
		   its own content instead of stretching full width, which would
		   make it (and everything inside it) render narrower than the
		   toggle above it regardless of any internal padding/margin
		   tuning. */
		width: 100% !important;
		max-width: 100% !important;
		box-sizing: border-box !important;
	}
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-menu {
		display: block !important;
		/* Left/right matched to the same 0.4rem the bottom already
		   uses — on request: "underneath empirical predictions... that's
		   kind of how I want the right side border and the left side
		   border to be." The item's own margin-left/-right (just below)
		   is zeroed to match, since the total gap is container padding
		   + item margin combined, not container padding alone. */
		padding: 0.25rem 0.4rem 0.4rem !important;
	}

	/* Same background the toggle already has at rest — the whole
	   assembly (toggle + its open submenu) reads as one continuous
	   fill, not two pieces meeting at a seam. Rounded only where the
	   whole shape actually ends: top corners always (the toggle's own
	   base rule), bottom corners here, only while open — closed, the
	   toggle alone already has all four corners rounded from its own
	   base rule, untouched. */
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-toggle {
		border-bottom-left-radius: 0;
		border-bottom-right-radius: 0;
		margin-bottom: 0;
	}
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-menu {
		background-color: rgba(var(--book-chrome-text-rgb), 0.04) !important;
		border-bottom-left-radius: 5px !important;
		border-bottom-right-radius: 5px !important;
		/* The real markup carries Bootstrap's own dropdown-menu-end
		   class (confirmed live in the rendered HTML) — built for
		   right-aligning a FLOATING desktop popup against its toggle,
		   via Popper's own positioning. position: static (§ the base
		   .dropdown-menu rule) already neutralizes Popper itself, but
		   if that class (or its own bundled CSS) also nudges text-
		   align toward the end/right, an inline-block button would
		   shift toward that side within its row — matching a reader's
		   repeated report of the buttons crowding the right edge with
		   more room on the left. Forcing left/start explicitly here
		   rules that out regardless of what dropdown-menu-end itself
		   actually does under the hood. */
		text-align: left !important;
	}
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-menu li,
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-menu .dropdown-item {
		text-align: left !important;
		display: block !important;
		float: none !important;
	}
	.navbar-collapse .nav-item.mobile-submenu-open {
		margin-bottom: 0.3rem;
	}

	/* The little buttons nested inside — indented from the outer
	   shape's own left edge (position cue) and set smaller than the
	   parent toggle's own text (size cue) — on request: "the size of
	   the text on those is larger than the menu on top... shrink them." */
	/* The <li> wrapper itself, not the button inside it — on request,
	   a sharp guess: "is it because it's a list item or something?"
	   Very likely yes. A sitewide rule elsewhere in this file resets
	   ordinary content <ul>s to padding-inline-start: 1.5em !important
	   (reserved space for a now-hidden bullet), and this <li> may be
	   inheriting something equivalent that reserves LEFT-only space
	   with nothing matching on the right — exactly the asymmetry
	   described. Zeroed here on the <li> directly, leaving the button
	   (.dropdown-item) itself and its own margin/padding, just below,
	   completely untouched. */
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-menu li {
		padding: 0 !important;
		padding-inline-start: 0 !important;
		margin: 0 !important;
	}
	.navbar-collapse .nav-item.mobile-submenu-open > .dropdown-menu .dropdown-item {
		/* Equal margin-left/-right (not left-only) and symmetric padding
		   override — on request, the buttons read as "not centered,"
		   crowding the right edge. Two things were stacking to cause
		   that: an indent applied only to the left side (margin-left,
		   with nothing matching on the right), and .dropdown-item's own
		   base padding (elsewhere in this file) being asymmetric to
		   begin with — 1rem left, 0.75rem right, built for a desktop
		   dropdown's own left-edge hover accent, irrelevant here. Both
		   corrected to equal values so the button sits evenly inset
		   from both container edges instead of only the left one. */
		margin-left: 0;
		margin-right: 0;
		padding: 0.5rem 0.75rem !important;
		width: auto !important;
		box-sizing: border-box !important;
		/* Absolute rem, not em, and !important: the toggle text itself
		   ("Appendices") renders at --book-navbar-link-font-size
		   (0.78rem); .dropdown-item's own base rule elsewhere in this
		   file sets --book-navbar-dropdown-font-size (0.88rem) — already
		   LARGER than the toggle before this override, which is exactly
		   what a reader flagged. A relative em value here depends on
		   inheriting the right ancestor size to end up smaller than
		   0.78rem, which wasn't reliably happening; a plain absolute
		   value smaller than 0.78rem guarantees it regardless. */
		font-size: 0.68rem !important;
	}
}

/* .book-sidebar-title — the site title's new home (moved out of the
   navbar into the static left sidebar; see include-after-body script).
   Still the same .navbar-brand/.navbar-title elements Quarto renders,
   just re-parented, so this keeps the one deliberate typographic
   difference (Georgia, not the book's own Source Serif 4) that always
   set the brand apart from the rest of the chrome. */
.book-sidebar-title .navbar-brand {
	font-family: Georgia, 'Times New Roman', serif;
	font-size: var(--book-sidebar-title-font-size, 1.15rem);
	line-height: 1.3 !important;
	/* inline-block, not block — this is the actual root cause behind
	   every version of the title-font-scaling bug this session: a
	   block-level element with no explicit width always reports its
	   *parent's* content width via getBoundingClientRect(), not its
	   own text's true rendered width, regardless of white-space:
	   nowrap. Confirmed live: "naturalWidth" was measuring 170.5px
	   (exactly .book-sidebar-search's width, its parent) instead of
	   the ~230px "The Inversion of Greatness" actually needs at that
	   font-size — so the scale ratio computed to 1 (no-op) every time,
	   leaving the title stuck at its unscaled 1.15rem fallback, wide
	   enough to overflow and read as clipped inside its own (correctly
	   sized) box. inline-block sizes to content by default, the same
	   way a plain inline <a> would, while still accepting the
	   font-size/line-height overrides above the way inline can't. */
	display: inline-block;
	color: var(--book-chrome-text) !important;
}
.book-sidebar-title .navbar-brand:hover {
	color: var(--book-chrome-text-hover) !important;
}

.navbar,
.navbar .nav-link,
.navbar .navbar-nav .nav-link,
.navbar-nav .dropdown-toggle,
.navbar .quarto-navigation-tool,
.navbar .quarto-navigation-tool i {
	color: rgba(var(--book-chrome-text-rgb), 0.85) !important;
}

.navbar .nav-link:hover,
.navbar .navbar-nav .nav-link:hover,
.navbar .navbar-nav .show > .nav-link {
	color: var(--book-chrome-text) !important;
}

/* Algolia's search-trigger SVG (#quarto-search, built at runtime by
   its own bundled JS, not something this stylesheet's markup ever
   sees directly) carries its own 20×20 attributes but rendered at
   26×26 live — some other rule in that same bundle scales it up
   further. Confirmed live: visibly larger than the gear/eye icons
   right beside it despite sharing the same nominal font-size. Pinned
   to match their glyph size directly rather than chasing whichever
   upstream rule is doing the scaling. */
#quarto-search .aa-SubmitIcon {
	width: 17px !important;
	height: 17px !important;
}

/* The opened search modal (Algolia Autocomplete's own DetachedOverlay/
   Panel, built at runtime — not something this stylesheet's markup
   ever sees directly, same as .aa-SubmitIcon above) had no dark-theme
   handling at all: confirmed live, a plain white input box and white
   results panel regardless of the site's own active theme. Scoped to
   body.quarto-dark, same convention every other themed component in
   this file uses. Algolia's own class names throughout (aa-*), not
   guessed at — inspected live via getComputedStyle on each. */
/* .aa-DetachedOverlay — the full-screen backdrop behind the modal
   itself, a DIFFERENT element from .aa-DetachedContainer just below
   (that one's own comment covers the input/panel; this one was never
   actually touched despite being named in that same comment). Algolia's
   own default is a semi-transparent WHITE wash (confirmed live:
   rgba(255,255,255,0.4)) — fine over a light theme, but in dark mode it
   washes the entire page out to a bright gray regardless of how dark
   everything else in the modal already is, exactly backwards from what
   "dark mode" should look like. A reader's own report: "it pops up and
   it washes everything out with a really bright backdrop... I want it
   to be darker." rgba(0,0,0,0.6) — dark and semi-transparent, so the
   page dims and blurs into the background rather than the reverse. */
body.quarto-dark .aa-DetachedOverlay {
	background-color: rgba(0, 0, 0, 0.6) !important;
}
body.quarto-dark .aa-DetachedContainer {
	background-color: var(--book-chrome-bg-solid) !important;
	color: var(--book-chrome-text) !important;
	/* Algolia draws this container's own outline as a box-shadow, not a
	   border — confirmed live: box-shadow: rgba(173,181,189,0.6) 0 0 0
	   1px, a light steel-gray ring around the WHOLE modal (search box
	   and results panel both, since this element wraps both) left over
	   from its own light-mode default. A reader spotted it directly:
	   "white borders on it... in dark mode," pointing at exactly this
	   ring. Swapped for the same --book-border color every other themed
	   box in this file outlines itself with. */
	box-shadow: 0 0 0 1px var(--book-border) !important;
}
/* .aa-DetachedFormContainer — the wrapper around the input+Cancel row
   specifically, a DIFFERENT element from both .aa-DetachedContainer
   (above) and .aa-Form (below). Same recurring light steel-gray, same
   unstyled-for-dark-mode story: border-bottom: 1px solid
   rgb(173,181,189), confirmed live sitting right at the bottom edge of
   the search row, visible as its own thin line even with an empty
   query and no results panel showing yet. A reader spotted this one
   separately from the container's own ring: "this line at the very
   bottom of the search bar." */
body.quarto-dark .aa-DetachedFormContainer {
	border-bottom-color: var(--book-border) !important;
}
body.quarto-dark .aa-Form {
	background-color: var(--book-bg) !important;
	border-color: var(--book-border) !important;
	/* Same fix as .aa-DetachedContainer just above: this element's own
	   focus-state box-shadow (rgba(55,90,127,0.6), a blue ring visible
	   whenever the input has focus/text) isn't literally white, but it
	   doesn't match this site's own gold focus language anywhere else
	   either — swapped to the same --book-link accent every other
	   focus/active state on the site already uses. */
	box-shadow: 0 0 0 1px var(--book-link) !important;
}
body.quarto-dark .aa-Input {
	color: var(--book-text) !important;
}
body.quarto-dark .aa-Input::placeholder {
	color: var(--book-muted) !important;
}
body.quarto-dark .aa-InputWrapperPrefix .aa-SubmitIcon,
body.quarto-dark .aa-InputWrapperSuffix .aa-ClearIcon {
	color: var(--book-muted) !important;
}
body.quarto-dark .aa-DetachedCancelButton {
	background-color: transparent !important;
	color: var(--book-chrome-text) !important;
}
body.quarto-dark .aa-Panel,
body.quarto-dark .aa-PanelLayout {
	background-color: var(--book-bg) !important;
	color: var(--book-text) !important;
}
body.quarto-dark .aa-SourceHeader,
body.quarto-dark .aa-SourceHeaderTitle {
	color: var(--book-muted) !important;
}
body.quarto-dark .aa-SourceHeaderLine {
	border-color: var(--book-border) !important;
}
/* Quarto's own search-result template (not raw Algolia markup — its
   own search-result-* classes, confirmed live by walking every element
   inside .aa-Panel and checking for a real border/box-shadow/outline)
   draws a divider ABOVE each new document's own result group with
   border-top: 1px solid rgb(173,181,189) — the exact same light
   steel-gray as .aa-DetachedContainer's own box-shadow ring (above),
   left just as unstyled for dark mode. A reader spotted it directly:
   "there's still the white line that's right underneath the thing,
   and then there's more white lines" — one per document boundary in a
   multi-document result set. Only .search-result-doc (not
   .search-result-doc-section, the sub-entries within the same
   document) carries this border — confirmed live, sub-entries have no
   border-top of their own, matching the visible pattern of one divider
   per document, not one per result row. */
body.quarto-dark .search-result-doc.search-item {
	border-top-color: var(--book-border) !important;
}
/* .search-result-doc-section (the sub-entries within one document —
   "E.25 What God Could..." sitting under "E. Excursus") had no border
   of its own at all, document-boundary or otherwise — just 8px top/
   bottom padding, no line. A reader wanted these to "look more
   separate" from each other too, not just from the next document's own
   group. --book-border-soft (a step quieter than --book-border, which
   the document-boundary divider just above uses) keeps that hierarchy
   readable: a stronger line between documents, a fainter one between
   results within the same document. */
body.quarto-dark .search-result-doc-section.search-item {
	border-top: 1px solid var(--book-border-soft) !important;
}
/* The results panel's own scrollbar (.aa-Panel, overflow-y: auto) —
   unstyled, so it rendered as the browser's plain light-mode default.
   Same webkit-scrollbar treatment #quarto-margin-sidebar already uses
   elsewhere in this file, reused here rather than invented fresh. */
body.quarto-dark .aa-Panel::-webkit-scrollbar {
	width: 8px;
}
body.quarto-dark .aa-Panel::-webkit-scrollbar-thumb {
	background: var(--book-chrome-scrollbar);
	border-radius: 4px;
}
body.quarto-dark .aa-Panel::-webkit-scrollbar-track {
	background: transparent;
}
body.quarto-dark .aa-Item {
	color: var(--book-text) !important;
}
body.quarto-dark .aa-Item[aria-selected="true"],
body.quarto-dark .aa-Item:hover {
	background-color: var(--book-border-soft) !important;
}
body.quarto-dark .aa-ItemContentTitle,
body.quarto-dark .aa-ItemContentDescription {
	color: var(--book-text) !important;
}
body.quarto-dark mark {
	background-color: rgba(var(--book-link-rgb), 0.35) !important;
	color: var(--book-text) !important;
}

.navbar .dropdown-menu,
.book-settings-menu {
	/* .book-settings-menu: the Font/Layout/Palette dropdowns' own class
	   on the menu element itself (buildMenu, _quarto.yml), not scoped
	   through any ancestor. It has to be self-scoped, not
	   .book-margin-tools .dropdown-menu (an earlier version of this
	   rule) — those menus get physically moved to the end of <body>
	   while open (same script, show.bs.dropdown/hide.bs.dropdown
	   listeners) so they can't get trapped behind nav#TOC or the
	   reading column by some sidebar stacking/compositing quirk no
	   z-index tweak alone actually fixed (confirmed live across several
	   attempts). An ancestor-based selector would stop matching the
	   instant the menu leaves .book-margin-tools, so this has to work
	   from the menu's own class regardless of where in the DOM it
	   currently sits. Reuses --book-chrome-bg-solid, the same "lighter
	   than pure black" tone the sidebars already use, instead of a
	   one-off value, so the dropdown reads as part of the same chrome
	   hierarchy as the rest of the site. The rounded corners and drop
	   shadow borrow the same "raised card" language as the callout/
	   semantic boxes in the body (§11–12) — a soft shadow lifting it
	   off the page — so the dropdown reads as part of the same design
	   system instead of a bare Bootstrap popover dropped on top of it.
	   The gold accent itself lives on each item (below), not the menu's
	   own edge — kept off the top border so the gold reads as "this
	   item is active," not as a permanent frame. Was lightened off the
	   flat chrome color at one point (color-mix, 85% chrome/15% white),
	   on an earlier request for "a little lighter gray" — reverted on
	   direct correction, comparing this menu side by side against the
	   Table of Contents popup (#quarto-sidebar's own anchored-popup
	   form, plain var(--book-chrome-bg-solid), never touched): "washed
	   out... that's the depth, the saturation, the visibility... that's
	   what I want it to look like," pointing at the ToC popup as the
	   reference. Back to the plain, unlit chrome color, matching it
	   exactly. */
	background-color: var(--book-chrome-bg-solid);
	border: 1px solid rgba(var(--book-chrome-text-rgb), 0.1);
	border-radius: 8px;
	box-shadow: 0 14px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);
	/* 1075 was never actually enough on its own: the portal (moving this
	   menu to the end of <body> while open, show.bs.dropdown above)
	   solves getting trapped behind nav#TOC/the reading column's own
	   stacking context, but once reparented this menu is a direct
	   sibling of #quarto-header — which sits at z-index: 1080 (§19) —
	   and 1075 loses that comparison outright, painting the menu
	   UNDER the header/secondary-nav wherever they overlap (confirmed
	   live via a reader's own screenshot: the open Font menu's top
	   portion hidden behind the header bar). 1082 clears it, matching
	   the same one-or-two-level-plus margin this file's other
	   #quarto-header-adjacent z-index fixes already use. */
	z-index: 1082;
	/* Bootstrap's own .navbar ul.dropdown-menu rule sets padding-top/
	   -bottom: 0 with a selector one type-selector more specific than
	   this one (.navbar ul.dropdown-menu vs. .navbar .dropdown-menu),
	   so a plain padding: 0.4rem shorthand here only ever actually won
	   the left/right sides — confirmed live, computed padding-top/
	   -bottom read 0px despite this rule. !important on the vertical
	   sides specifically is what makes all four actually match, which
	   is the whole point (a reader wants the same breathing room around
	   the menu on every side, not just left/right). */
	padding: 0.4rem;
	padding-top: 0.4rem !important;
	padding-bottom: 0.4rem !important;
}
/* .navbar .dropdown-menu (Appendices/References/Resources — the native
   Bootstrap navbar dropdowns) specifically, not .book-settings-menu
   (Font/Layout/Palette already has its own explicit "no forced
   min-width" decision just below, kept as-is). Both share the exact
   same item/hover CSS already (menu chassis + .dropdown-item rules,
   directly above/below) — confirmed live, computed styles identical —
   but Appendices' own 4 items ("A: Modal Logic Primer" ... "D:
   Empirical Predictions") are all close to the same length, so the
   menu shrinks tight to them and the hovered item's own rounded pill
   (border-radius: 5px, below) has almost no dark gutter around it to
   read against — unlike Palette, whose 24 varied-length theme names
   (some as short as "Sepia") leave visibly more breathing room in the
   same box. A reader wanted Appendices/References/Resources to "look
   like" Palette's own dropdown; giving the menu itself some room
   beyond its tightest-fit content is what actually produces that same
   visibly outlined/inset look, since the underlying item styling was
   already identical. */
.navbar .dropdown-menu {
	min-width: 12rem;
}

.navbar .dropdown-menu .dropdown-item,
.book-settings-menu .dropdown-item {
	/* Serif to match the book's own body/heading type rather than
	   Bootstrap's default sans — the one deliberate typographic echo that
	   ties this menu back to the rest of the site. Slightly dimmer than
	   the top-level nav-links (0.85 opacity) so the tier still reads from
	   color, not just position. */
	font-family: 'Source Serif 4', Charter, Georgia, serif;
	font-size: var(--book-navbar-dropdown-font-size);
	color: rgba(var(--book-chrome-text-rgb), 0.7);
	padding: 0.5rem 0.75rem 0.5rem 1rem;
	border-radius: 5px;
	border-left: 2px solid transparent;
	transition: background-color 120ms ease, border-left-color 120ms ease, color 120ms ease;
}
/* Appendices/References/Resources specifically (plain Bootstrap
   .dropdown-item, generated straight from _quarto.yml's menu: entries —
   no custom class to hook like .book-settings-option gets): a reader
   wanted these to "look like" Palette's own items, which already get
   their own resting background tint + a gap between each one via
   .book-settings-option (below) so every row reads as its own small
   button even before hovering. Reproducing just those two properties
   here — background-color at rest, margin-bottom between rows — gets
   the same look without duplicating .book-settings-option itself onto
   markup Quarto generates automatically and this project doesn't
   template by hand. */
.navbar .dropdown-menu .dropdown-item {
	background-color: rgba(var(--book-chrome-text-rgb), 0.04);
	margin-bottom: 0.3rem;
}
.navbar .dropdown-menu li:last-child .dropdown-item {
	margin-bottom: 0;
}

.navbar .dropdown-menu .dropdown-item:hover,
.navbar .dropdown-menu .dropdown-item:focus,
.book-settings-menu .dropdown-item:hover,
.book-settings-menu .dropdown-item:focus {
	background-color: rgba(var(--book-chrome-text-rgb), 0.08);
	/* No gold left-border on hover anymore — a reader tried it for a
	   while, decided against it everywhere it appears. border-left
	   stays declared (2px solid transparent) on the base .dropdown-item
	   above purely so nothing shifts by 2px; it just never gets a
	   real color now. */
	color: var(--book-chrome-text-hover);
}

/* ── Settings dropdowns (Theme / Margin / Typography) ────────────
   Reuses the .navbar .dropdown-menu/.dropdown-item chassis above
   (same dark card, same gold hover accent) rather than a one-off
   style — reads as three more entries in the same top-nav dropdown
   family, not a bolted-on control panel. Three separate instances of
   this same class/markup (_quarto.yml's buildMenu()), not one shared
   dropdown — each with its own icon, its own toggle, its own menu.
   Section labels, a checkmark-prefixed active state (radio-style
   within a section — Theme and Margin content are each mutually
   exclusive — plus one plain on/off item for margin dimming), and a
   disabled placeholder style for "Reader's gloss," which has no
   content to switch to yet. */
.book-settings-dropdown {
	display: flex;
	align-items: center;
}
/* Bootstrap's default .dropdown-toggle draws its caret via border-width
   tricks on ::after (not visible text content, so content:"" alone —
   already the default — doesn't remove it); content: none does. Every
   other icon in the tools row (search) is a bare icon with no menu
   indicator, so this one shouldn't read as visually different just
   because it happens to open a dropdown instead of navigating. */
.book-settings-dropdown > a.dropdown-toggle::after {
	content: none;
}
/* Resting color used to be a hardcoded rgb(89, 89, 89) — a plain dark
   gray with no relation to any of the site's own chrome variables,
   matched to #quarto-search .aa-SubmitIcon's own live color (an
   Algolia default) purely by coincidence of both landing in the
   navbar together at the time. A reader wanted these to read the same
   as the sidebar's own chapter links instead: var(--book-chrome-text)
   at rest (confirmed live: rgb(232, 227, 218), the sidebar's own
   resting link color) — the active/open state below already used
   --book-chrome-text-hover correctly, so only the resting color was
   ever actually off. Sized up slightly too (15/17/17 → 17/19/19), a
   reader felt them a touch small next to the sidebar's own text. */
.book-settings-dropdown i.bi {
	color: var(--book-chrome-text) !important;
	/* 0.75 (matching the right sidebar's own resting "Chapter Contents"
	   TOC links) still read a shade too bright against the rest of the
	   chrome — nudged down further on its own judgment, no longer tied
	   to matching the TOC links exactly. */
	opacity: 0.65;
	font-size: 17px;
	width: 19px;
	height: 19px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: color 120ms ease, opacity 120ms ease;
}
/* bi-droplet-half is a solid/filled glyph (that's the whole point of a
   "half" icon — half of it is a filled shape), unlike its row-mates
   here: bi-type's bare letterform, bi-text-paragraph's thin lines,
   bi-eye's outline. Same font-size and box as the rest of the row still
   read as visibly heavier/larger purely from how much of its own box
   the glyph fills — sized down a notch just for this one icon so the
   row reads as uniform again rather than matching every icon's box to
   a glyph that doesn't carry the same ink. */
.book-settings-dropdown i.bi-droplet-half {
	font-size: 14px;
}
/* Lit gold while its own menu is open — Bootstrap adds .show to the
   toggle <a> itself (not the outer .dropdown wrapper — checked live)
   the moment it opens the menu, so this needs no JS of its own. 2
   classes beats the 1-class rule above at equal !important. Opacity 1
   too — matches the sidebar's own active-link pattern (confirmed
   live: both the active chapter link and the active TOC entry sit at
   opacity 1, only the resting ones are dimmed), so this icon goes
   fully vivid at the same moment those do rather than staying at the
   resting 0.75. */
.book-settings-dropdown .dropdown-toggle.show i.bi {
	color: var(--book-chrome-text-hover) !important;
	opacity: 1;
}
/* No forced min-width (used to be 15rem, uniform across all three
   dropdowns) — a reader felt Layout/Palette in particular carried a
   lot of dead space next to their own short content once the
   checkmark gutter was gone too. Bootstrap's own dropdown-menu has no
   min-width by default; letting that show through means each menu
   just shrinks to whatever its own content actually needs (Font's own
   longest option, "Atkinson Hyperlegible", ends up closest to the old
   15rem; Layout/Palette land noticeably narrower). */
.book-settings-menu {
	max-height: 80vh;
	overflow-y: auto;
}
/* Palette specifically: two columns instead of one long list — a light
   theme on the left, dark on the right — rather than one 24-entry
   scroll. Two real, independent sub-lists (.book-palette-column,
   built in _quarto.yml right after all 24 options are added) side by
   side, not one CSS grid split by row count: a shared grid gives every
   row in BOTH columns the same height (sized off whichever column has
   content there), so with 17 light entries and only 7 dark ones the
   dark column inherited 10 phantom empty rows below its last real
   item — the light column read as a clean block, the dark one as a
   ragged shape with a big gap under it (confirmed as a reader's own
   report, comparing the two side by side). Flexbox with two
   independently-sized children has no such shared-track behavior:
   each column is exactly as tall as its own content. Twice the width
   of the single-column menu it replaces, per an earlier request,
   rather than the narrower "shrink to content" sizing the other two
   dropdowns (Font/Layout) still use. */
.book-palette-grid {
	align-items: flex-start;
	column-gap: 0.5rem;
	width: max-content;
	max-width: 90vw;
	/* max-height/overflow-y come from the shared .book-settings-menu
	   rule above (80vh, auto) — this menu carries that class too. */
}
/* !important, and scoped to .show specifically (not the bare class
   above) — Bootstrap's own .dropdown-menu.show{display:block} (two
   classes, specificity 0-2-0) otherwise beats a plain .book-palette-
   grid{display:flex} (one class) regardless of source order, so the
   layout never actually applied. Scoping to .show matters just as much
   as the !important itself: an earlier version forced the layout
   unconditionally, which won even after Bootstrap removed .show on
   close — the menu stayed rendered (and, since its position/top/right
   are only ever set while genuinely open, adrift off-screen) instead
   of actually disappearing, confirmed live as a reader's own "it
   won't go away" report. */
.book-palette-grid.show {
	display: flex !important;
}
.book-palette-column {
	display: flex;
	flex-direction: column;
	/* Browser default <ul> margin/padding-left (list indent + bullet
	   gutter) — not reset anywhere upstream, since every other .book-
	   settings-menu is a single flat <ul> with no nested list inside
	   it to expose this. */
	margin: 0;
	padding: 0;
	list-style: none;
}
.book-palette-column + .book-palette-column {
	/* No border-left anymore — a reader didn't want a dividing line
	   between the light/dark columns. padding-left: was 0.5rem — a
	   reader felt the two columns' own buttons read as too far apart
	   once the dividing line between them was gone, nothing left to
	   visually justify the gap. */
	padding-left: 0.15rem;
}
/* !important on font-size/-weight: §7 LISTS above ("Strip default list
   font normalization") sets font-size/font-weight: inherit !important
   on every ul/li sitewide, meant for the book's own prose lists —
   these dropdown items are <li>s too, so without matching !important
   here that rule silently wins and this label was rendering at
   whatever size/weight its ancestor happened to have (16.36px/400,
   not the 0.7rem/600 below) the entire time, uppercase/color/spacing
   aside since §7 doesn't touch those. 0.7rem computes smaller than
   the sidebar's own ~14.45px chapter-list text (a reader asked for
   these to be no bigger than that) even once actually applying. */
.book-settings-label {
	font-family: 'Source Serif 4', Charter, Georgia, serif;
	font-size: 0.7rem !important;
	font-weight: 600 !important;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: rgba(var(--book-chrome-text-rgb), 0.4);
	padding: 0.3rem 0.75rem 0.3rem 1rem;
}
/* A tile group's own label + its row of tiles, sharing one line
   (label left, tiles right) rather than the label sitting on its own
   line above — a reader asked for this after four unlabeled/stacked
   rows in the Typography menu read as harder to scan than it should
   have. Reuses .book-settings-label's exact type treatment (same
   !important reasoning as above applies here too) rather than
   duplicating it. */
.book-settings-tile-group {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 0.5rem;
	/* Right padding 0 (unlike .book-settings-option's 0.75rem, applied
	   to its own inner button instead of the li) so the tile row's own
	   right edge lands flush with the same boundary the option rows'
	   full-width buttons already reach — before this the two read as
	   sharing different right edges, off by exactly the 0.75rem this
	   used to carry. Left padding was 1rem — on request, "paragraph is
	   a little bit too far to the right, and size is a little too far
	   [too]... they can go a little bit to the left": confirmed live,
	   that 1rem sat the "PARAGRAPH"/"SIZE" labels a full 17px right of
	   "Source Serif 4" and every other option row just below them,
	   which shared no such left inset of their own. 0.5rem instead
	   brings the labels closer to that same left edge without matching
	   it exactly (still its own group with a row of tiles beside it,
	   not a plain option row). */
	padding: 0.3rem 0 0.3rem 0.5rem;
	/* A little breathing room below each group — matters most for the
	   last tile group butting directly against the flat option list
	   right after it (Font menu: Size row → Source Serif 4), which
	   read as no gap at all without this. */
	margin-bottom: 0.25rem;
}
/* Two tile groups back to back (Font menu: Layout → Size) stacked
   this rule's own padding-bottom (0.3rem) + margin-bottom (0.25rem)
   on top of the next group's own padding-top (0.3rem) — 0.85rem
   total, written for the one-tile-group-into-a-plain-list transition
   above (Size → the typeface list), which this class was never used
   for twice in a row before. A reader wanted Layout → Size exactly
   as tight as the 0.3rem gap between tiles inside one row, not this
   much wider — zeroing this group's own trailing space when another
   tile group follows leaves just the next one's own 0.3rem top
   padding as the gap, matching the tile row's own rhythm exactly. */
.book-settings-tile-group:has(+ .book-settings-tile-group) {
	padding-bottom: 0;
	margin-bottom: 0;
}
.book-settings-tile-group-label {
	font-family: 'Source Serif 4', Charter, Georgia, serif;
	font-size: 0.7rem !important;
	font-weight: 600 !important;
	text-transform: uppercase;
	letter-spacing: 0.06em;
	color: rgba(var(--book-chrome-text-rgb), 0.4);
	white-space: nowrap;
}
.book-settings-tile-group .book-settings-tile-row {
	padding: 0;
}
.book-settings-option {
	display: flex;
	align-items: baseline;
	gap: 0.5rem;
	width: 100%;
	text-align: left;
	/* Every row gets its own subtle resting "button" box now, not just
	   on hover/active — a reader wanted each option (font names, palette
	   themes) to read as its own button at rest, with :hover/.active
	   (both 0.08 below) as the lighter, "picked" version of this same
	   darker base. */
	background-color: rgba(var(--book-chrome-text-rgb), 0.04);
	border: none;
	cursor: pointer;
	/* Same gap as .book-settings-tile-row's own 0.3rem between tiles —
	   a reader wanted the flat option rows (font names, palette themes)
	   to have that same visible breathing room between each button,
	   not sit flush against each other. Zeroed on the last row in a
	   menu below so it doesn't stack with the menu's own bottom
	   padding. */
	margin-bottom: 0.3rem;
	/* Smaller than the shared .dropdown-item font-size (0.88rem, also
	   used by native dropdowns like Appendices/References) — a reader
	   felt these specifically read too large. Scoped to just this
	   class so those other dropdowns are untouched. !important: the
	   base .navbar .dropdown-menu .dropdown-item rule (3 classes)
	   otherwise beats this 1-class selector on specificity alone. */
	font-size: 0.8rem !important;
}
.book-settings-menu li:last-child .book-settings-option {
	margin-bottom: 0;
}
/* Bootstrap's own .dropdown-item.active otherwise wins here (a plain
   blue fill, --bs-dropdown-link-active-bg) — a reader didn't want
   that blue and asked for the active state to just look like :hover
   (same background tint, same gold left-border accent) instead of a
   distinct "selected" treatment. !important: the base .navbar
   .dropdown-menu .dropdown-item rule (3 classes) otherwise beats this
   2-class selector for color/border-left-color specifically —
   background has no such competing rule so it was already winning,
   color/border-left-color weren't. */
/* No gold left-border on the active item — a reader liked that
   treatment for :hover (kept, below, untouched) but not as a
   persistent "this is selected" marker; the background tint + gold
   text carry that on their own. */
.book-settings-option.active {
	background-color: rgba(var(--book-chrome-text-rgb), 0.08);
	color: var(--book-chrome-text-hover) !important;
}
.book-settings-option.disabled {
	opacity: 0.45;
	cursor: default;
}
.book-settings-option.disabled:hover {
	background-color: transparent !important;
	border-left-color: transparent !important;
	color: rgba(var(--book-chrome-text-rgb), 0.7) !important;
}
.book-settings-note {
	margin-left: auto;
	font-size: 0.75em;
	font-style: italic;
	opacity: 0.7;
	white-space: nowrap;
}

/* ── Settings dropdown: icon tiles ──────────────────────────────
   Small rounded-square icon buttons for exclusive-choice groups
   (Margin Content, Text Size, Indentation, Alignment) — same dark
   card / gold-hover language as the plain list rows above (.book-
   settings-option), just laid out as a row of compact tiles instead
   of one-per-line text, closer to how a system settings picker
   presents a handful of small choices. */
.book-settings-tile-row {
	display: flex;
	gap: 0.3rem;
	padding: 0.3rem 1rem 0.6rem;
}
/* Same three-value scheme as .book-settings-option now: 0.04 at rest,
   0.08 on hover/active, gold text once hovered/active — a reader
   wanted the size/layout tiles to look like the same kind of button
   as the font/palette list rows, not their own separate visual
   language. Border stays declared but always transparent (never
   colored, unlike an earlier version of this) purely so the box
   doesn't resize by 2px on state change — the tiles never actually
   show a border, matching .book-settings-option's border: none. */
.book-settings-tile {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex: 0 0 auto;
	width: 2rem;
	height: 2rem;
	padding: 0;
	border-radius: 0.5rem;
	border: 1px solid transparent;
	background-color: rgba(var(--book-chrome-text-rgb), 0.04);
	color: rgba(var(--book-chrome-text-rgb), 0.7);
	cursor: pointer;
	font-family: 'Source Serif 4', Charter, Georgia, serif;
	transition: background-color 120ms ease, color 120ms ease;
}
.book-settings-tile:hover {
	background-color: rgba(var(--book-chrome-text-rgb), 0.08);
	color: var(--book-chrome-text-hover);
}
.book-settings-tile .bi {
	font-size: 0.85rem;
	line-height: 1;
}
.book-settings-tile-glyph {
	font-size: 0.8rem;
	line-height: 1;
	font-weight: 700;
}
/* Opening Line tiles: a tiny two-line paragraph mockup rather than an
   icon, so the tile itself shows the thing being chosen (first line
   flush vs. indented) instead of a generic arrow that could be
   mistaken for the separate Indentation control above it. Bars use
   currentColor so they follow .book-settings-tile's own resting/
   hover/active color automatically, same as the .bi icons do. */
.book-settings-tile-parglyph {
	display: flex;
	flex-direction: column;
	gap: 0.2rem;
	width: 1rem;
}
.book-settings-tile-parglyph-line {
	height: 2px;
	border-radius: 1px;
	background-color: currentColor;
}
.book-settings-tile-parglyph-line:first-child {
	width: 100%;
}
.book-settings-tile-parglyph-line:last-child {
	width: 80%;
}
.book-settings-tile-parglyph.indented .book-settings-tile-parglyph-line:first-child {
	width: 65%;
	margin-left: 35%;
}
/* Back to icon-only — visible captions (tried right above, briefly)
   didn't land; reverted to the visually-hidden clip technique. Name
   still there for screen readers and still drives the title=""
   tooltip on hover/long-press, just not painted. */
.book-settings-tile-label {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}
/* Matches .book-settings-option.active exactly now (same 0.08 bg,
   same gold text) — an earlier version used a much brighter plain-gray
   fill instead specifically because gold read as too "yellow" at that
   higher opacity; at this same subtler 0.08 both a reader now wants
   tiles and option rows to look like one consistent button family. */
.book-settings-tile.active {
	background-color: rgba(var(--book-chrome-text-rgb), 0.08);
	color: var(--book-chrome-text-hover);
}
/* .book-settings-dropdown i.bi (further down, meant for the top-level
   toggle icon — gear/palette/etc) forces a fixed dark gray with
   !important and matches these tile icons too, since they're
   technically descendants of that same wrap div. Harmless against the
   near-black resting tile, but invisible — dark gray icon on a
   near-black fill — once active without this. */
.book-settings-tile.active .bi {
	color: var(--book-chrome-text-hover) !important;
}
.book-settings-tile.disabled {
	opacity: 0.35;
	cursor: default;
	pointer-events: none;
}

/* Standalone single-choice control (Dim margin) styled with the same
   tile language as the groups above, but as one full-width row —
   a whole grid would read strangely for just one on/off choice. */
.book-settings-tile-toggle-row {
	display: flex;
	align-items: center;
	gap: 0.65rem;
	width: 100%;
	padding: 0.4rem 0.75rem 0.4rem 1rem;
	background: none;
	border: none;
	border-radius: 5px;
	color: rgba(var(--book-chrome-text-rgb), 0.7);
	font-family: 'Source Serif 4', Charter, Georgia, serif;
	font-size: var(--book-navbar-dropdown-font-size);
	cursor: pointer;
	text-align: left;
	transition: background-color 120ms ease, color 120ms ease;
}
.book-settings-tile-toggle-row:hover {
	background-color: rgba(var(--book-chrome-text-rgb), 0.08);
	color: var(--book-chrome-text-hover);
}
/* This tile never carries a caption of its own (addToggleTile never
   builds a .book-settings-tile-label — the real text sits beside it
   in the row instead), so it doesn't need the taller icon+caption
   footprint .book-settings-tile grew to above; kept back to a small
   icon-only square. */
.book-settings-tile-toggle-row .book-settings-tile {
	width: 2.1rem;
	height: 2.1rem;
	cursor: pointer;
}
.book-settings-tile-toggle-row .book-settings-tile .bi {
	font-size: 0.95rem;
}
.book-settings-tile-toggle-row.active .book-settings-tile {
	background-color: rgba(var(--book-chrome-text-rgb), 0.28);
	border-color: rgba(var(--book-chrome-text-rgb), 0.4);
	color: var(--book-chrome-text);
}
.book-settings-tile-toggle-row.active .book-settings-tile .bi {
	color: var(--book-chrome-text) !important;
}

/* Expandable sections (Font, Palette) — same toggle-row chassis as
   Dim margin above, plus a label that grows to fill the middle (so
   the chevron always lands at the row's right edge regardless of
   label length) and a chevron that rotates 180° open/closed. The
   revealed list (.book-settings-accordion-body) reuses the exact
   .book-settings-option/.dropdown-item styling the old standalone
   Palette menu used — same checkmark, same hover/active treatment —
   just indented under its own toggle row instead of living in the
   menu root. */
.book-settings-accordion-label {
	flex: 1 1 auto;
	text-align: left;
}
/* Smaller than the shared toggle-row tile size (2.1rem) — a reader
   felt the Font/Palette icons read too large. */
.book-settings-accordion-toggle .book-settings-tile {
	width: 1.7rem;
	height: 1.7rem;
}
.book-settings-accordion-toggle .book-settings-tile .bi {
	font-size: 0.8rem;
}
.book-settings-accordion-chevron {
	font-size: 0.65rem;
	opacity: 0.55;
	transition: transform 150ms ease;
	flex: 0 0 auto;
}
.book-settings-accordion-toggle.open .book-settings-accordion-chevron {
	transform: rotate(180deg);
}
/* No border-left/indent guide — a reader didn't want the vertical
   line running down the left side of the expanded list, and asked
   for the content to sit closer to the menu's own left edge instead
   of nested in further under it. */
.book-settings-accordion-body {
	list-style: none;
	margin: 0;
	padding: 0.1rem 0 0.2rem;
}
.book-settings-accordion-body[hidden] {
	display: none;
}
/* Smaller and tighter than the standalone-menu original this reuses
   — a reader felt the theme names (Procyon, Sepia, High Contrast…)
   read too large/loose once nested under an already-open accordion. */
.book-settings-accordion-body .book-settings-option {
	font-size: 0.72rem !important;
	padding: 0.2rem 0.75rem 0.2rem 1rem;
}
.navbar .navbar-nav .nav-link,
.navbar .navbar-nav .dropdown-toggle {
	font-family: 'Source Serif 4', Charter, Georgia, serif;
	font-size: var(--book-navbar-link-font-size);
	padding-top: 0.5rem !important;
	padding-bottom: 0.5rem !important;
	padding-left: 0.5rem !important;
	padding-right: 0.5rem !important;
}

.navbar a,
.navbar a:visited,
.navbar .nav-link,
.book-sidebar-title .navbar-brand {
	border-bottom: none !important;
	text-decoration: none !important;
}

.navbar a:hover,
.navbar a:focus,
.navbar .nav-link:hover,
.navbar .nav-link:focus {
	border-bottom: none !important;
}

/* ============================================================
   19b. FOCUS MODE — dim the two side rails.
   Toggled by the eye icon the include-after-body script injects next
   to Quarto's own dark-mode toggle; state lives on <html> (both the
   early include-in-header script and the toggle's own click handler
   set/clear this same class) and in localStorage, so it survives
   navigation instead of resetting on every page load. The top navbar
   is deliberately untouched here — it already gets out of the way on
   its own (headroom.js hides it on scroll-down); it's the two
   always-present side rails that read as peripheral clutter while
   reading, so those are what this dims.
   The old version also restored full opacity on :hover/:focus-within
   for either whole rail, meant so a rail wouldn't dim out from under
   you while actively using it — dropped because it backfired on the
   one thing that actually needs to stay reachable while dimmed: the
   toggle button itself lives inside #quarto-margin-sidebar, so right
   after clicking it the cursor is still sitting on it, and :hover on
   the whole rail was undimming everything the click had just dimmed,
   confirmed live as a reader's actual "dimming doesn't do anything"
   report, not a theoretical one. */

/* >=1200px only — below that, #quarto-sidebar/#quarto-margin-sidebar
   switch from docked, always-visible rails to off-canvas drawers
   opened/closed on demand (§19c/§21/§23), and this class's own state
   lives in localStorage, surviving navigation AND window resizes. Left
   unscoped, turning Dim margin on at desktop width and then narrowing
   the window carried the dimming straight into the mobile drawers too
   — including, after the fix just above, the Dim-margin button's own
   row — with no separate mobile entry point to switch it back off
   again: a reader's own report, "there's no way to turn off focus
   mode, so it can't carry over to any other stage." Scoping the
   effect itself to >=1200px (not the underlying class or its
   localStorage value, which stay exactly as they were) means the
   dimming simply doesn't render at all below that width — reappearing
   correctly, with no extra logic needed, the moment the window widens
   back past 1200px and the toggle itself is reachable again. */
@media (min-width: 1120px) {
html.book-focus-mode #quarto-sidebar {
	opacity: 0.2;
	transition: opacity 200ms ease;
}

/* Right sidebar: can't use the same blanket opacity #quarto-sidebar
   gets above, because the Dim-margin toggle itself lives inside this
   one — a parent's opacity always caps every descendant's own
   rendered opacity too (a child can't opt back up to 1 underneath a
   dimmed parent), so the button would dim right along with everything
   else and be hard to find again to turn back off. Dimming each
   sibling that ISN'T the toggle instead — the "Chapter Contents" list
   (nav#TOC) and the other tool icons — gets the same visual result
   everywhere except the one button that needs to stay reachable.
   :not(.book-quick-toggle), not just :not([title="Dim margin (focus
   mode)"]) — this used to exempt EVERY .book-quick-toggle button, not
   just Dim margin itself: harmless when Dim margin was the only one,
   but the Page Contents/Gloss/Footnotes three-way group (added later,
   sharing the same .book-quick-toggle class for the same gold-when-
   active styling) got accidentally exempted right along with it. A
   reader wanted those three to dim like everything else in the rail —
   only the Dim-margin button itself needs to stay reachable so a
   reader can find their way back out of focus mode. */
html.book-focus-mode #quarto-margin-sidebar > *:not(.book-margin-tools),
html.book-focus-mode .book-margin-tools > *:not([title="Dim margin (focus mode)"]) {
	opacity: 0.2 !important;
	transition: opacity 200ms ease;
}
/* nav#TOC specifically needs its own rule, not just the generic one
   above: a much earlier fix (§ "Force the real nav visible") pins
   #quarto-margin-sidebar nav#TOC { opacity: 1 !important; } to work
   around a duplicate-id/fade-in issue, and that rule's 2 IDs (
   #quarto-margin-sidebar + #TOC) beat the generic rule above's 1 ID
   even with matching !important — confirmed live, the toggle and the
   other icons dimmed correctly but the TOC list itself stayed at
   opacity 1 without this. Matching that same #TOC id here is what
   actually wins the specificity fight. */
html.book-focus-mode #quarto-margin-sidebar nav#TOC {
	opacity: 0.2 !important;
}

/* Margin notes (#book-annotation-note-overlay) and footnotes-in-margin
   (#book-footnote-margin-overlay) are direct children of #quarto-
   content, not of #quarto-margin-sidebar — they're positioned by their
   own live-measured overlay mechanism (see resources/book-scripts.html),
   not the sidebar's box model — so neither one was covered by the
   dimming rules above at all. Confirmed live: pressing Dim margin
   faded Page Contents and the tool icons but left any visible margin
   note or footnote note at full brightness, reading as "half the
   margin dimmed" rather than the one continuous field a reader asked
   for. Same opacity/transition, same !important (needed here for the
   same reason nav#TOC's own rule above needed it — these overlays
   carry their own specific IDs a bare class rule wouldn't reliably
   beat). */
html.book-focus-mode #book-annotation-note-overlay,
html.book-focus-mode #book-footnote-margin-overlay {
	opacity: 0.2 !important;
	transition: opacity 200ms ease;
}
} /* @media (min-width: 1120px) — focus mode's own dimming, above */

/* The eye glyph (bi-eye) is a mostly-solid shape — at the same nominal
   color/opacity as the search icon's thin outline and the dark-mode
   toggle's half-filled circle, it still reads visibly brighter/heavier
   than either, just from having more filled area. Dim the glyph itself
   to bring its PERCEIVED weight in line with its two neighbors, rather
   than trying to chase a "correct" opacity value analytically. */
.book-focus-mode-toggle i.bi {
	opacity: 0.6;
}

/* Not useful once the side rails it dims are already gone — below
   1199.98px both rails are already off-canvas drawers (§19c/§21), so
   there's nothing left for this toggle to do, just a third icon
   crowding the two that still matter (search, dark mode). */
@media (max-width: 1119.98px) {
	.book-focus-mode-toggle {
		display: none !important;
	}
}

/* Genuine on/off switch: one fixed icon per button (set once in
   _quarto.yml, never swapped), dimmed at rest and lit up gold — the
   same accent color the rest of the site already uses for "this is
   the active one" (TOC active-chapter highlight, hover states) —
   while pressed, driven by aria-pressed rather than a class so each
   button's own accessibility state and its visual state can never
   drift apart. Only Dim margin uses this today — Navigation/
   Footnotes/Glossary (which shared this same class/pattern) are
   pulled from the navbar for now, not shipping yet; kept as one
   reusable class rather than folded into a Dim-margin-only rule in
   case they come back. */
/* Resting color used to fall through to the generic a, a:visited {
   color: var(--book-link); } rule (this toggle is itself an <a>) —
   confirmed live, rgb(160, 120, 40), the body-text link color, not
   any of the chrome variables. var(--book-chrome-text) at rest matches
   the sidebar's own chapter/TOC links' color; opacity 0.75 matches
   their resting opacity too (confirmed live: the right sidebar's own
   "Chapter Contents" entries sit at 0.75 at rest — a reader felt full
   opacity read as brighter than everything around it rather than
   matching it, even though the color itself was already right).
   Sized up to match the settings-dropdown icons beside it
   (17px/19×19). */
.book-quick-toggle i.bi {
	color: var(--book-chrome-text) !important;
	opacity: 0.65;
	font-size: 17px;
	width: 19px;
	height: 19px;
	/* display: inline-flex is load-bearing, not decorative — same fix,
	   same reason .book-light-dark-toggle i.bi (below) already needed
	   it: width/height are no-ops on a plain inline element (the
	   default for <i>), so this box never actually became 19×19 the
	   way the comment above always claimed. Confirmed live via
	   getBoundingClientRect(): 17×24, the 24 coming from ordinary
	   inherited line-height inflating the glyph's real height with
	   nothing constraining it, on every quick-toggle icon (Focus mode,
	   Chapter Contents, Margin Notes) — a reader spotted the whole row
	   reading visibly inconsistent in size/alignment, and this was the
	   actual cause: three of the four bi-* icons in this row were
	   quietly ignoring their own width/height rule the entire time.
	   align-items/justify-content center the glyph inside the new true
	   19×19 box. */
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: opacity 120ms ease, color 120ms ease;
}
/* bi-stickies is a solid/filled glyph (two overlapping filled note
   shapes), unlike its row-mates (bi-eye's outline, bi-list-ul's thin
   lines, the Layout SVG's thin bars) — same box (19×19) but reads
   visibly bigger/chunkier purely from how much ink fills it, matching
   the same issue bi-droplet-half already had in the Palette toggle
   (§ .book-settings-dropdown i.bi-droplet-half). Sized down so the row
   reads as uniform weight again. */
.book-quick-toggle i.bi-stickies {
	font-size: 14px;
}
.book-quick-toggle[aria-pressed="true"] i.bi {
	opacity: 1;
	/* !important: .navbar .quarto-navigation-tool i's own color rule
	   (§ navbar tools, way earlier in this file) is also !important and
	   otherwise wins regardless of selector specificity — confirmed
	   live, opacity took but color silently stayed at the default
	   rgba(255,255,255,.85) without this. */
	color: var(--book-chrome-text-hover, #d4a857) !important;
}
/* Compact mode's own custom SVG icon (resources/book-scripts.html,
   COMPACT_ICON_SVG) — three bars standing in for sidebar/column/margin,
   not a bi-* glyph, so it needs its own copy of the color/opacity/hover
   treatment every i.bi icon in this row already gets above. currentColor
   (the SVG's own fill) resolves against this element's CSS color, which
   these rules are what actually set. */
.book-quick-toggle .book-compact-icon {
	color: var(--book-chrome-text) !important;
	opacity: 0.65;
	/* Matches i.bi's own 19×19 box (§ .book-quick-toggle i.bi, above) —
	   this SVG's own width/height attributes are 16, smaller than
	   every sibling icon in this row and the actual reason "Layout"
	   measured visibly smaller than the rest, on top of that same
	   row's i.bi sizing bug. display: inline-flex + centering for the
	   same reason as that fix: an <svg> is inline by default too, so
	   width/height alone won't reliably center a 16px shape inside a
	   19px box without it. */
	width: 19px;
	height: 19px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
/* Every .book-quick-toggle button, not just Layout: without this, each
   <a> is block-level with a single inline-flex icon inside it, and the
   button's own height comes from an anonymous line box sized off
   inherited line-height × font-size — coincidentally consistent across
   the three <i.bi> icons (same font, same metrics, ~22.8px), but a
   plain <svg> (Layout's icon) computes that line box differently and
   landed ~2.4px lower, confirmed live via getBoundingClientRect() (a
   reader spotted it reading "too low," not centered with the row).
   That's a fragile coincidence to depend on even where it happens to
   work, not a deliberate centering rule — making every button a flex
   container with align-items/justify-content: center sidesteps
   line-box/baseline metrics entirely so any icon, of any type, lands
   in the exact same spot by construction rather than accident. */
.book-quick-toggle {
	display: inline-flex;
	align-items: center;
	justify-content: center;
}
.book-quick-toggle[aria-pressed="true"] .book-compact-icon {
	opacity: 1;
	color: var(--book-chrome-text-hover, #d4a857) !important;
}
.book-quick-toggle:hover .book-compact-icon {
	opacity: 1;
}
/* The sidebar bar (leftmost of the three) fades out once Compact mode
   is actually on — a reader asked for the icon to show what the button
   does: full three-bar layout at rest, sidebar bar gone once compact
   mode has crunched it away, leaving column + margin (the two bars that
   actually still show and this button never touches). Opacity, not
   display: none — keeps the icon's own width/layout stable rather than
   the remaining two bars visibly shifting left to fill the gap. */
.book-quick-toggle[aria-pressed="true"] .book-compact-icon-sidebar {
	opacity: 0;
	transition: opacity 150ms ease;
}
/* The light/dark toggle that replaced the Palette dropdown in this
   row (_quarto.yml) is a plain <a class="quarto-navigation-tool ...">
   like every other icon here, but isn't a .book-quick-toggle (no
   aria-pressed state — its own icon swaps between sun/moon instead)
   and isn't inside .navbar either, so neither of this file's two
   existing icon-color rules ever matched it — it fell through to the
   site's own plain link color instead, rendering gold/gray-a07828
   at rest, a color no other icon in this row uses. Same treatment as
   .book-quick-toggle's own icon just above (--book-chrome-text at
   0.65 resting opacity, sized to match), minus the aria-pressed gold
   state this one has no use for. */
.book-light-dark-toggle i.bi {
	color: var(--book-chrome-text) !important;
	opacity: 0.65;
	/* 14px, not the 17px every other icon in this row uses — was 15px
	   first, still read a hair too big. bi-moon-fill's own glyph just
	   fills more of its em-box than the sun/eye/Aa/etc. icons beside
	   it, so matching visual weight means a genuinely smaller nominal
	   size, not the shared 17px. */
	font-size: 14px;
	/* display: inline-flex is load-bearing, not decorative — width/
	   height are no-ops on a plain inline element (the default for
	   <i>), so this box never actually became 19×19 the way it reads:
	   confirmed live via getBoundingClientRect() at 14×20, the 20
	   coming from ordinary inherited line-height inflating the glyph's
	   real height with nothing constraining it. inline-flex is what
	   makes width/height (and centering the glyph inside them) take
	   effect at all, giving a true 19×19 footprint matching Font/
	   Palette beside it, with the 14px glyph itself still visually
	   smaller inside that box exactly as intended above. */
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 19px;
	height: 19px;
	transition: opacity 120ms ease, color 120ms ease;
}
.book-light-dark-toggle:hover i.bi {
	opacity: 1;
}
/* Same brightening on hover for every other icon in this row (Font,
   Layout, the eye/dim-margin toggle, search) — a reader wanted them
   all consistent with the light/dark toggle just above, which already
   had this. Each icon sets its own resting opacity: 0.65 independently
   (four near-duplicate rules above this one — .book-settings-dropdown
   i.bi, .book-quick-toggle i.bi, .book-margin-search-toggle i.bi, this
   toggle's own), so the hover bump is added the same way rather than
   consolidating those four into one shared rule and risking an
   unrelated regression this pass isn't about. */
.book-settings-dropdown:hover i.bi,
.book-quick-toggle:hover i.bi,
.book-margin-search-toggle:hover i.bi {
	opacity: 1;
}

/* Unused for now — was Glossary's disabled/"coming soon" treatment.
   Kept in case a future quick-toggle needs the same disabled look;
   Glossary itself isn't in the navbar at all currently. */
.book-quick-toggle.disabled {
	opacity: 0.35;
	pointer-events: none;
	cursor: default;
}

/* .book-margin-search-toggle — the magnifying glass's own copy in the
   right rail's icon row (≥1200px docked view, appended last in
   _quarto.yml so it lands after Font/Layout/Palette). Not a toggle
   (no on/off state, no aria-pressed) and not a dropdown (no menu of
   its own — it proxies a click through to the real, hidden Algolia
   button, same as .book-navbar-search-toggle in the header bar below
   1200px), so it gets its own resting/hover treatment rather than
   reusing .book-quick-toggle's aria-pressed styling or .book-settings-
   dropdown's open-state styling — sized and colored to match both of
   them regardless (17px/19×19, var(--book-chrome-text) at 0.65,
   brightening on hover the same way .book-navbar-search-toggle and
   .book-sidebar-search's own icon already do). */
/* No margin-left of its own anymore — used to be auto, deliberately
   pushing this icon out to .book-margin-tools's own far edge while
   that box held a fixed 255px width wider than its actual content. A
   reader later asked for the opposite (every icon clustered together,
   not spread across the box), so that box is width: auto now at every
   width (see .book-margin-tools's own comment) — exactly as wide as
   its content, meaning this icon already sits flush against its
   neighbor via the row's own gap, with no slack left for an auto
   margin to absorb. */
.book-margin-search-toggle i.bi {
	color: var(--book-chrome-text) !important;
	opacity: 0.65;
	font-size: 17px;
	width: 19px;
	height: 19px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	transition: color 120ms ease, opacity 120ms ease;
}
.book-margin-search-toggle:hover i.bi {
	color: var(--book-chrome-text-hover) !important;
	opacity: 1;
}

/* .book-debug-toggle — style-preview page only (_quarto.yml gates its
   own creation to body.style-preview-page, and appends it straight to
   <body> rather than into any menu). Used to live inside the icon row
   up top, sized/colored to match its neighbors there — a reader
   wanted it fully separate instead, pinned to its own fixed spot in
   the far bottom-left corner of the viewport, as far into that corner
   as it can go: bottom: 0; left: 0 with no inset of its own, a small
   dark square just large enough for the icon rather than a full-size
   copy of the icon-row treatment it left behind. z-index set high
   (above this page's own content, which can run the full page height)
   since it has to stay reachable/visible regardless of scroll
   position — position: fixed alone already keeps it viewport-pinned
   vertically, this is purely about paint order. Lit gold while active
   (html.book-debug-outline present) so a reader can tell at a glance
   the outlines are on, the same "opacity 1 + hover color" active-state
   language .book-settings-dropdown's own open state already uses. */
.book-debug-toggle {
	position: fixed;
	bottom: 0;
	left: 0;
	z-index: 99999;
	display: flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	background-color: var(--book-chrome-bg-solid);
	border: 1px solid rgba(var(--book-chrome-text-rgb), 0.2);
	border-bottom: none;
	border-left: none;
	border-radius: 0 4px 0 0;
	padding: 0;
	cursor: pointer;
}
.book-debug-toggle i.bi {
	color: var(--book-chrome-text) !important;
	opacity: 0.65;
	font-size: 16px;
	transition: color 120ms ease, opacity 120ms ease;
}
.book-debug-toggle:hover i.bi {
	color: var(--book-chrome-text-hover) !important;
	opacity: 1;
}
html.book-debug-outline .book-debug-toggle i.bi {
	color: var(--book-chrome-text-hover) !important;
	opacity: 1;
}

/* Layout-debug outlines — toggled by .book-debug-toggle above. A red
   outline (not border: doesn't affect box-sizing/layout, so nothing
   actually shifts when these switch on) on every box this project has
   spent the most time hand-tuning to line up: both rails' own outer
   edges, both title/tools rows, both inner list boxes, and the reading
   column they're all measured against. outline-offset: -1px pulls the
   line just inside each box's own edge rather than overlapping its
   neighbor's, so two adjacent boxes' outlines don't visually merge
   into one thicker line. z-index left alone deliberately — these are
   outlines on the existing elements, not new overlaid ones, so there's
   nothing to stack above anything else. */
html.book-debug-outline #quarto-sidebar,
html.book-debug-outline #quarto-margin-sidebar,
html.book-debug-outline .book-sidebar-title,
html.book-debug-outline .book-margin-tools,
html.book-debug-outline .sidebar-menu-container,
html.book-debug-outline #quarto-margin-sidebar nav#TOC,
html.book-debug-outline .book-sidebar-toc-row,
html.book-debug-outline #toc-title,
html.book-debug-outline #quarto-document-content,
/* The actual mechanism behind the 650px reading-content width (as
   opposed to #quarto-document-content's own 800px outer box, already
   outlined above): #quarto-document-content.page-full > * (§ "real
   650px box" fix) is what puts max-width: 650px directly on the title
   block, the divider, and each top-level section — a reader asked to
   see this specific box, not just infer it from where text happens to
   wrap. Outlining the selector itself, not a narrower stand-in for
   it, so what's on screen matches what the CSS rule actually says. */
html.book-debug-outline #quarto-document-content.page-full > * {
	outline: 2px solid red !important;
	outline-offset: -1px;
}

/* ============================================================
   19d. FOOTNOTES IN THE MARGIN — Tufte-style sidenotes, toggleable
   Built by the include-after-body script as a direct child of
   #quarto-content (the .column-margin grid-column CSS above only
   takes effect on a direct grid child — confirmed by testing it
   against a real, deeply-nested paragraph, where it computed but had
   no visual effect) holding one absolutely-positioned .book-footnote-
   margin per footnote, each placed at a `top` measured live off its
   own citing reference. Off by default; mutually exclusive with focus
   mode (see the registry note by that toggle in _quarto.yml) — one
   empties the margin, the other fills it back in.
   ============================================================ */

/* Page Contents fully hidden while margin notes are on — not folded
   down to its own collapsed-header state (an earlier version tried
   that, reusing the manual collapse-on-click mechanism, but that left a
   visible collapsed header behind on a plain page load any time a
   reader had ever tried margin notes, since a Bootstrap-collapse class
   is DOM/localStorage state, not something scoped to margin notes being
   active). Both copies: #quarto-margin-sidebar is the docked panel
   itself, #quarto-toc-toggle is a second, separate copy of the entire
   Page Contents nav Quarto's own JS builds at runtime (confirmed live —
   it's nowhere in the rendered page source, only appears once quarto.js
   has run) that sits behind/under the docked one and shows through on
   its own if only the docked one is hidden. Keyed off html.book-
   footnotes-margin (toggled by sync() in _quarto.yml) rather than JS
   setting .style.display directly, since #quarto-toc-toggle may not
   exist in the DOM yet at whatever moment the toggle's build()/
   teardown() happen to run relative to Quarto's own script — a CSS rule
   keyed off a class applies to a matching element whenever it shows up,
   a one-time JS assignment doesn't. */
/* #quarto-margin-sidebar uses visibility:hidden, not display:none: the
   navbar's own edge alignment (§19, setNavbarEdges in _quarto.yml) measures
   this element's getBoundingClientRect() on load to line the navbar's brand/
   tools/nav-links up with the sidebar system's outer walls. display:none
   collapses that rect to all-zero, which fed a huge bogus value into
   --book-navbar-content-right and squeezed the entire navbar (brand, nav
   links, tools icons) into a sliver at the left edge — confirmed live: this
   is what actually broke the navbar, not just the icon-wrap symptom fixed
   above. visibility:hidden keeps the element's box (and thus its rect) in
   place for that measurement while still making it fully invisible and
   unclickable, matching "make that menu invisible" without perturbing
   layout elsewhere. */
/* Right-margin content chooser: Page Contents / Gloss / Footnotes —
   a three-way exclusive group (resources/book-scripts.html,
   bookSetRailMode) replacing what used to be two separate, only
   loosely-related mechanisms: a Focus-mode-paired Footnotes toggle
   (bookExclusiveToggles) and an independent Table-of-Contents/Notes
   pair (a single boolean class). One shared data-book-rail-mode
   attribute now drives all three; exactly one value is ever active,
   "contents" by default. Page Contents (#quarto-margin-sidebar)
   yields to whichever of the other two is active — visibility, not
   display, so its own child .book-margin-tools (Dim margin/Page
   Contents/Gloss/Footnotes/Font/Layout/Palette, the icon row itself)
   can be explicitly un-hidden again right below: a reader switching
   away from Page Contents still needs that row reachable to switch
   back, and visibility (unlike display) can be restored on a
   descendant even while an ancestor sets it. */
/* >=1200px only — below that, #quarto-margin-sidebar switches from a
   docked, always-visible rail (where Page Contents genuinely competes
   with Gloss/Footnotes for the same box) to an off-canvas drawer
   opened/closed by its own separate mechanism (body.mobile-margin-open,
   §21/§23). That drawer only ever shows Page Contents regardless of
   rail-mode (below), so this rule staying unscoped meant switching to
   Gloss or Footnotes at ≥1200px, then narrowing the window, hid the
   drawer PERMANENTLY — a reader's own report: "if you have footnotes
   or something on and then you close it into mobile mode, you can't
   actually open up the right side menu anymore." Nothing below 1200px
   ever sets data-book-rail-mode back to "contents" on its own (there's
   no UI for Gloss/Footnotes down there to have set it away from
   "contents" in the first place, at this rail at least — a reader was
   describing exactly this: getting stuck on a mode with no way back). */
@media (min-width: 1120px) {
	html:not([data-book-rail-mode="contents"]) #quarto-margin-sidebar {
		visibility: hidden !important;
	}
	html:not([data-book-rail-mode="contents"]) .book-margin-tools {
		visibility: visible !important;
	}
	/* #toc-title lives inside nav#TOC, itself inside #quarto-margin-
	   sidebar — so it inherited "hidden" from the rule above with nothing
	   un-hiding it back, the same gap .book-margin-tools already had a
	   fix for. The label's own JS (resources/book-scripts.html,
	   syncTocTitle) correctly rewrites its text to "Reading Companion"/
	   "Footnotes" whenever the mode changes, so that text was silently
	   sitting there the whole time — a reader's own screenshot showed
	   the margin notes/gloss content with no heading above it at all,
	   which is what an invisible-but-present label produces. Same
	   visibility:visible restore as .book-margin-tools above; the rest
	   of nav#TOC (the actual link list) stays hidden since nothing
	   overrides ITS inherited visibility, only this specific label's. */
	html:not([data-book-rail-mode="contents"]) #toc-title {
		visibility: visible !important;
	}
}
/* The book-page-contents-peek-open #toc-title hide-rule that used to
   live here is retired along with the popup it supported — see the
   longer note above (§ .book-floating-margin-toggle's own independent
   "peek" popup, ~line 1848). #toc-title now just follows
   data-book-rail-mode as normal; the sliding drawer it briefly needed
   to defer to no longer carries a competing title of its own. */
/* Hides margin notes whenever rail-mode is genuinely "contents" — a
   real, persisted switch (the settings-menu button, bookSetRailMode)
   still means Chapter Contents replaces Margin Notes in the docked
   rail exactly as before. :not(.book-rail-peek-active) is the one
   exception: the docked right icon's own momentary peek at Chapter
   Contents (Compact mode, resources/book-scripts.html) sets rail-mode
   to "contents" too, the same as a real switch would, but that class
   is the one signal distinguishing "just looking" from "actually
   switched" — on request, a peek should pop Chapter Contents open in
   its own popup "and it should not remove margin notes in the right
   side column," while genuinely switching modes still should. Focus
   mode ("Dim margin") hides these regardless, unchanged (§ html.book-
   focus-mode rules elsewhere in this file). */
html[data-book-rail-mode="contents"]:not(.book-rail-peek-active) .book-annotation-note {
	display: none;
}

/* #quarto-toc-toggle is a raw, unstyled duplicate of the Page Contents
   panel Quarto's own JS builds at runtime for its native responsive-
   collapse pattern — never covered by this stylesheet's dark theme, so it
   renders as a plain white Bootstrap box wherever it shows through. It
   isn't scoped to margin-notes mode: hide it outright, in every state. */
#quarto-toc-toggle {
	display: none !important;
}

/* The duplicate above doesn't just sit there unused — both copies share
   the same ids (#toc-title, #TOC), and Quarto's own runtime script
   resolves those via getElementById, which always finds the FIRST match
   in DOM order. Confirmed live: that's the duplicate inside
   #quarto-toc-toggle, not the real, styled panel inside #quarto-margin-
   sidebar. So Quarto's own fade-in reveal (nav#TOC starts at inline
   style="opacity:0", then gets flipped to opacity:1 once ready) was
   firing on the duplicate we just hid, leaving the real panel stuck
   invisible at opacity:0 forever — which is what actually produced the
   raw white box: the only copy Quarto ever revealed was the unstyled
   one. Force the real nav visible with !important, which beats Quarto's
   plain (non-important) inline style.
   display: block !important — a separate, previously uncaught bug found
   the same way: Quarto's own bundled bootstrap.min.css carries
   @media (max-width: 767.98px) { nav[role="doc-toc"] { display: none; } },
   its native assumption that phone widths never show a TOC at all. This
   book's own custom mobile margin-drawer (§21/§24) was built to show
   this panel at every width, including true phone widths below that
   767.98px line, so that native rule was silently winning there —
   confirmed live, the drawer opened (right: 0, correctly positioned)
   but its own content stayed a genuinely empty box, not just faded or
   misaligned. Every other override in this rule already beats Quarto's
   own inline styles; this beats its native stylesheet the same way. */
#quarto-margin-sidebar nav#TOC {
	display: block !important;
	opacity: 1 !important;
	overflow: visible !important;
	pointer-events: auto !important;
}

#book-footnote-margin-overlay {
	position: relative;
	pointer-events: none; /* only the notes themselves (and their links) should be clickable */
	/* Inherits a 2px solid border-left from Quarto's own default
	   .column-margin styling — invisible while it holds real notes (each
	   note draws its own border-left instead, see .book-footnote-margin
	   below), but with zero children (margin notes off, or simply no
	   footnotes above the fold yet) that inherited border still rendered
	   as a bare vertical line with no content next to it, floating in the
	   Page Contents panel above the chapter list. Confirmed live at
	   {top:43, left:1070, width:291, height:14} — this box's own default
	   line-height, not a stray child. Only the border is neutralized, not
	   font-size: the actual notes (.book-footnote-margin below) size
	   themselves in em relative to this box, so zeroing its font-size
	   would zero their text too. With no border and no background, the
	   leftover line-height box is already fully invisible on its own. */
	border: none;
	/* Without this, the grid's own auto-placement algorithm puts this
	   overlay in the row AFTER main.content's own (content-top/
	   content-bottom), since it's the only other page-end/body-end
	   grid item without an explicit grid-row — landing it below the
	   entire chapter (confirmed live: its own top ended up matching
	   main.content's full rendered height almost exactly, ~33000px
	   down). #quarto-sidebar and #quarto-margin-sidebar both pin
	   content-top/page-bottom explicitly for the same reason; matching
	   that here keeps this overlay's own top flush with the actual top
	   of the chapter, where the position:absolute notes inside it
	   measure their own placement from. align-self:start, not the grid
	   default stretch: a grid item stretches to fill its full grid-row
	   height unless told otherwise, which — confirmed live — turned
	   this box into a full chapter-height (~33000px) transparent sheet
	   sharing #quarto-margin-sidebar's exact grid cell, and something
	   about that box competing for the same cell was enough to visibly
	   break the real Page Contents panel underneath it. This box was
	   only ever meant to be a positioning anchor for its
	   position:absolute children (a 0-height box works exactly as well
	   for that — position:absolute isn't clipped by its parent's own
	   height), never an actual filled shape of its own. */
	grid-row: content-top / page-bottom;
	align-self: start;
}

.book-footnote-margin {
	position: absolute;
	left: 0;
	right: 0;
	pointer-events: auto;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: 0.85em;
	line-height: 1.45;
	/* --book-chrome-text (the sidebars' own light-on-dark text color), not
	   the light-mode-prose #555 dark gray a first pass used here — this
	   overlay sits in the same always-dark chrome margin the sidebars
	   occupy (§9), constant regardless of the reading area's own light/
	   dark theme, not over the page itself. #555 against that near-black
	   backdrop rendered as barely-legible dim gray-on-black. */
	color: var(--book-chrome-text, #e8e3da);
	padding-left: 0.5em;
	padding-bottom: 1.25em;
	border-left: 2px solid rgba(var(--book-chrome-text-rgb), 0.15);
	opacity: 0.8;
}

.book-footnote-margin p {
	text-indent: 0 !important;
	margin: 0 0 0.5em;
	text-align: left !important;
	hyphens: manual;
}
.book-footnote-margin p:last-child {
	margin-bottom: 0;
}

.book-footnote-margin-num {
	font-weight: 600;
	color: var(--book-chrome-text-hover, #d4a857);
	margin-right: 0.4em;
}

/* Only meaningful with the margin rail actually docked (§19c) — below
   1200px there's no column for the footnotes overlay to place its
   content in, so it's hidden rather than left to render somewhere it
   doesn't fit. */
@media (max-width: 1119.98px) {
	#book-footnote-margin-overlay {
		display: none;
	}
}
/* .book-quick-toggle (Dim margin, Compact, Page Contents/Gloss/
   Footnotes) used to hide here too, at the same 1119.98px boundary —
   on the reasoning that Dim margin specifically has no docked side
   rail left to dim below that width. True for Dim margin, but this
   rule hid every quick-toggle, including the three that choose what
   the off-canvas margin drawer itself shows — the ONE thing a reader
   can still meaningfully do with that drawer at this width. Worse: the
   floating toggle that opens this exact drawer (.book-floating-margin-
   toggle, above) is visible across this SAME 800–1119.98px range, so
   a reader opening it on any page landed on a drawer with its own
   settings row rendered but every button inside it display:none'd —
   on a page with no chapter TOC of its own (Preface, Introduction),
   that's a drawer with genuinely nothing in it at all, the exact
   "empty panel" outcome a reader's own report already flagged once
   before (see the JS gates this same complaint reverted, resources/
   book-scripts.html). A reader's own words this time: "they need to
   be persistent across all pages... they're global settings" — and
   accepted these disappearing at true mobile widths ("that kind of
   stuff") specifically, where a narrower boundary now applies. */
@media (max-width: 799.98px) {
	.book-quick-toggle {
		display: none !important;
	}
}

/* Annotation-database margin notes (attach-margin-notes.js's own
   ::: {.column-margin .book-annotation-note} blocks) — same
   direct-child overlay technique as #book-footnote-margin-overlay
   above (see that block's own header comment in resources/
   book-scripts.html for the full reasoning: a .column-margin div
   nested inside a chapter section computes the right grid-column but
   renders with zero visual effect, or worse once that section is
   itself forced into a nested grid — see the display: block fix
   elsewhere in this file). Unlike footnotes-in-margin, these notes
   are the ONLY copy of their content (no endnotes-list fallback), so
   the relocation script only moves them here at ≥1200px, where the
   docked margin rail this overlay lives in actually exists; below
   that it leaves every note exactly where it was written, letting
   Quarto's own responsive stacking handle it unchanged.
   padding-left/-right match #quarto-margin-sidebar's own inset (§9)
   exactly, not nav#TOC's combined inset — a reader asked for the note
   boxes to align flush with Page Contents' own visible box (its
   background edge), not with the text inside it, which sits inset
   further by nav#TOC's own additional padding on top of the
   sidebar's. */
/* Hides the WHOLE overlay (and everything relocated into it) whenever
   rail-mode is genuinely "contents" — same :not(.book-rail-peek-
   active) exception as the plain .book-annotation-note rule above,
   same reasoning: a real, persisted switch to Chapter Contents mode
   still replaces Margin Notes as before; only the docked icon's own
   momentary peek is exempted. (This rule's original job, before that
   exception existed: html:not([data-book-rail-mode="notes"]) .book-
   annotation-note {display:none} above only ever targeted the
   ORIGINAL elements attach-margin-notes.js writes into the page — the
   relocation script below moves each one's own CONTENT into a
   freshly-created .book-annotation-note-box div that never carries
   the .book-annotation-note class itself, so that rule alone never
   touched it; hiding the whole overlay is what actually closes that
   gap.) */
html[data-book-rail-mode="contents"]:not(.book-rail-peek-active) #book-annotation-note-overlay {
	display: none !important;
}
#book-annotation-note-overlay {
	position: relative;
	pointer-events: none;
	border: none;
	grid-row: content-top / page-bottom;
	align-self: start;
	padding-left: 1rem;
	padding-right: 0.5rem;
	/* #quarto-margin-sidebar is position: fixed + z-index: 1071 —
	   which, per CSS stacking rules, doesn't just paint that box high,
	   it establishes a whole new stacking context, and nav#TOC (its
	   descendant, itself position: fixed with its own lower z-index:
	   1020) is compared WITHIN that context, not against this overlay's
	   siblings directly. This overlay is just an ordinary position:
	   relative grid item with no z-index of its own, so it never
	   entered that comparison at all — confirmed live: giving the note
	   box itself z-index: 1072 (below) did nothing, elementFromPoint
	   at the note's own center still landed on a Page Contents nav
	   link, because a descendant's z-index can only ever compete
	   within its NEAREST ANCESTOR stacking context, never reach past it
	   to compete with a sibling context directly (the same trap
	   .book-sidebar-title's own z-index note elsewhere in this file
	   describes, hitting a second element here). Explicit z-index here
	   is what actually makes this overlay ITS OWN stacking context,
	   putting its own z-index in direct competition with #quarto-
	   margin-sidebar's 1071 at the right level instead of trapping the
	   note box's z-index one level too deep to matter. */
	z-index: 1072;
}

/* Same box chassis as #quarto-margin-sidebar nav#TOC (§9) — flat
   fill, no border, no radius — so a margin note reads as a sibling of
   the Page Contents box below it, not a different kind of object. */
.book-annotation-note-box {
	position: absolute;
	left: 0;
	right: 0;
	pointer-events: auto;
	background-color: var(--book-chrome-bg-solid);
	/* Was plain var(--book-chrome-text) at full strength — the near-
	   white color meant for high-contrast UI chrome, not note prose. A
	   reader compared this box against the Page Contents links right
	   below it in the same rail and flagged it as visibly brighter.
	   NOT --book-margin-text (a first attempt at this fix, reverted) —
	   that variable flips between a dark gray in light mode and a light
	   gray in dark mode because it's built for .column-margin notes,
	   which sit on the reading column's own background and DO flip with
	   the site's light/dark theme. This box's background
	   (--book-chrome-bg-solid) never flips — the chrome stays dark in
	   both themes — so a theme-flipping text color goes nearly
	   illegible in light mode (dark-on-dark). The Page Contents links
	   themselves (§9, #quarto-margin-sidebar nav#TOC a.nav-link)
	   already solve exactly this: same always-dark chrome background,
	   dimmed via opacity on --book-chrome-text-rgb rather than a
	   different, theme-dependent color. 0.75 -> 0.92: matching the Page
	   Contents links' own resting opacity read fine for short nav
	   labels, but a reader found actual note PROSE at that opacity too
	   dim/muted against the reading column's own full-strength body
	   text sitting right next to it — legibility for a paragraph of
	   argument needs closer to full contrast than a one-line link does,
	   even reading from the same chrome-relative color. */
	color: rgba(var(--book-chrome-text-rgb), 0.92);
	padding: 0.75rem 1rem;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	/* 0.85em -> 0.9em -> 0.95em: a reader found this text "chunky" at
	   0.85em (fine-detail serif leaning on hinting/antialiasing more
	   than body-text size needs), fixed with a first bump to 0.9em plus
	   the rendering hints below. A later pass still found it "not clear
	   enough, not big enough" even with the color fix above — the size
	   alone wasn't the whole story, but pushing closer to the reading
	   column's own body-text size (1em) removes it as a variable rather
	   than re-guess at just the color again. */
	font-size: 0.95em;
	line-height: 1.45;
	/* Crisper small-text rendering: optimizeLegibility turns on the
	   browser's own kerning/ligature pass (most engines already default to
	   this at body-text sizes, but a shrunk-down 0.9em box like this one
	   doesn't always get it automatically), and antialiased subpixel
	   smoothing avoids the slightly bolder, fuzzier edge some engines
	   otherwise apply to small text by default — both aimed at the same
	   "precise, not chunky" a reader asked for. */
	text-rendering: optimizeLegibility;
	-webkit-font-smoothing: antialiased;
	/* nav#TOC (Page Contents) is position: fixed with z-index: 1071
	   (§ elsewhere in this file) — it stays pinned near the top of the
	   VIEWPORT regardless of scroll, while this box scrolls with the
	   document, so at whatever scroll position happens to land a note
	   in that same viewport band, the two visually collide. Confirmed
	   live: with no z-index of its own this box painted BELOW nav#TOC
	   there, invisible. One higher than nav#TOC's own 1071 — real
	   content should win a collision with chrome, not the other way
	   around, and a reader can always scroll past. */
	z-index: 1072;
}
/* The bold lead-in ("Core concept." etc.) gets its own lifted color
   plus real weight, everything else stays at the dimmer rgba(...0.75)
   above — a reader's own framing: "the core concept... could be in
   bold, and the rest not," rather than the whole note reading at one
   uniform brightness with no distinction between the label and the
   prose that follows it. --book-chrome-text-hover, not --book-margin-
   strong — same reasoning as the base color just above: this box's
   background never flips with the site theme, so its own accent color
   shouldn't either. --book-chrome-text-hover is already the chrome's
   own "this one matters" color elsewhere in this exact rail (an
   active Page Contents entry, right below this box, uses the same
   variable), so a Gloss note's own lead-in reads as the same kind of
   emphasis, not an unrelated one-off gold. */
.book-annotation-note-box strong {
	color: var(--book-chrome-text-hover);
	font-weight: 600;
}
.book-annotation-note-box p {
	margin: 0;
	text-indent: 0 !important;
	text-align: left !important;
	hyphens: manual;
}
.book-annotation-note-box p + p {
	margin-top: 0.5em;
}

@media (max-width: 1119.98px) {
	#book-annotation-note-overlay {
		display: none;
	}
}

/* Fade scrim above the margin-note overlay, covering the icon row
   (.book-margin-tools, top: 0–52px) — a reader noticed margin notes
   scrolling straight up UNDER those icons as illegible crossed-over
   text. The icons themselves can't just get a higher z-index: they're
   a DOM descendant of #quarto-margin-sidebar, itself position: fixed
   with its own z-index (1071) — any positioned ancestor with a
   non-auto z-index establishes a new stacking context, which traps
   every descendant's own z-index inside it (the same trap this file's
   other z-index comments describe hitting more than once already), so
   no z-index put on .book-margin-tools itself can ever outrank
   #book-annotation-note-overlay's 1072, which is compared one level
   up, against #quarto-margin-sidebar's own 1071, not against anything
   nested inside it. Rather than reparent the icon row in the DOM to
   escape that trap (risky: resources/book-scripts.html's own
   rescueMarginSidebar function specifically looks for a populated
   .book-margin-tools INSIDE #quarto-margin-sidebar to tell Quarto's
   real rail apart from its own duplicate mobile-drawer clone — moving
   it out would break that detection), this sidesteps the stacking
   fight entirely: a plain, content-free div, built once by resources/
   book-scripts.html as a genuine sibling of the overlay (so its own
   z-index competes at the right level without touching the icon row
   at all), painted with a top-to-transparent gradient in the exact
   chrome color notes would otherwise show through. Notes scrolling up
   behind it fade to invisible before they ever reach the icons,
   instead of visibly crossing them. pointer-events: none — this is
   pure decoration, the real icons underneath (higher in the DOM, so
   naturally still clickable through — but see the JS comment on why
   it's inserted where it is) must stay reachable. left/width mirror
   nav#TOC's own formula exactly (§ Page Contents) so this fades
   precisely the same column the notes and the icons both occupy, not
   a guessed width. */
/* 68px -> 105px: this scrim used to stop right at the icon row's own
   bottom edge, covering .book-margin-tools but not the "Margin Notes"
   label (#toc-title) sitting just below it — confirmed live, the
   label's own bottom edge measures 97px, well past the old 68px cutoff.
   That label lives inside nav#TOC, itself independently position:
   fixed with its own z-index (1020, its own comment above has the
   history) — the SAME stacking trap this scrim was built to sidestep
   for the icon row, just never extended to cover the second box that
   turned out to have it too. A reader spotted the label going
   translucent-over-scrolling-notes directly, drew the box it should
   sit inside on a screenshot: full rail width (already true here),
   top of the icon row down through the bottom of the label. 105px
   covers both with a small margin past the label's own 97px edge; the
   gradient's solid portion grows to 75% (up from 62%) to hold the same
   ~26px fade band this always had, just moved to the new, taller
   bottom instead of shrinking to fit the old height. */
#book-margin-fade-scrim {
	position: fixed;
	top: 0;
	left: calc(var(--book-navbar-bar-left, 0) + var(--book-navbar-bar-width, 0) + 10px);
	width: var(--book-margin-w);
	/* 150px, up from 105px — at 105px the gradient's own fade zone
	   (75%-100%, ~26px) started at 79px, INSIDE #toc-title's own text
	   row (bottom edge at 97-98px, confirmed live) — the scrim was
	   already fading toward transparent while the label's own text was
	   still being painted on top of it, so a scrolling note's text
	   became partially legible right where it met the label, reading as
	   the two "bunched up" against each other with no real gap.
	   Directly reported: "there's a little too much overlap with the
	   title... maybe a little more space so they're not bunched up like
	   that where they meet." 80% now lands the solid portion at 120px —
	   a real ~22px buffer past the label's own edge before any fading
	   starts at all — then fades out over 120-150px, a slightly longer
	   transition than the old 26px band, not just a shifted one. */
	height: 150px;
	background: linear-gradient(
		to bottom,
		var(--book-chrome-bg-solid) 0%,
		var(--book-chrome-bg-solid) 80%,
		rgba(0, 0, 0, 0) 100%
	);
	pointer-events: none;
	z-index: 1073;
}
@media (max-width: 1119.98px) {
	#book-margin-fade-scrim {
		display: none;
	}
}

/* Two floating icon buttons that plug the 800–1199.98px reachability
   gap above: the docked side rails are gone below 1200px (§19c), but
   .quarto-secondary-nav — which normally carries the toggle buttons
   for both — doesn't appear until 799.98px (§21). position:fixed, not
   part of any bar: they stand in for where that bar's own buttons
   would sit (same top offset, hugging the left/right edges) without
   reserving any layout space of their own, so nothing about the page's
   height changes when they appear — unlike showing the whole bar
   early, which pushes body content down via its own padding-top
   compensation. Bare icon, no pill: just hsl(0,0%,35%), the exact same
   color .quarto-secondary-nav's own real buttons already use — no
   background of their own, so when that bar actually appears at
   799.98px it reads as the same two icons simply gaining the white bar
   underneath them, not a different pair of buttons taking over.
   !important on color: a, a:visited's own site-wide gold (§4 LINKS)
   otherwise wins here, since these buttons are themselves <a> tags.
   Hidden everywhere else: above 1200px the rails are docked and don't
   need a toggle at all, and below 800px .quarto-secondary-nav's own
   copies already cover it, so showing these too would just be two
   duplicate buttons. */
.book-floating-sidebar-toggle,
.book-floating-margin-toggle {
	display: none;
	position: fixed;
	/* Flush against the navbar, then nudged down (52px bar - 2.25rem/
	   36px icon = 16px slack, 8px each side) to sit vertically centered
	   in .book-running-head's own now-matching 52px height — on
	   request, these two icons need to read as embedded INSIDE that
	   bar (like .quarto-secondary-nav's own toggle buttons are embedded
	   in it on true mobile: "it needs to look like the mobile menu...
	   exactly like that"), not floating independently above it. Was
	   + 0.6rem with no accompanying bar at all — this offset only
	   started mattering once .book-running-head existed to align
	   against. */
	top: calc(var(--book-navbar-height, 52px) + 8px);
	/* --book-navbar-height is live-measured (_quarto.yml, navbar.offset-
	   Height) across this icon's entire 800–1199.98px visible range, not
	   just below 992px — the navbar itself is the same 52px-tall bar the
	   whole way up to 1199.98px (.quarto-secondary-nav, the only thing
	   that ever grows it, doesn't appear until 799.98px), so one formula
	   already lands correctly everywhere this icon shows. A separate
	   992–1199.98px override used to force a hardcoded 1.75rem baseline
	   here instead — stale by the time a reader actually resized across
	   that range: the icon visibly jumped upward at 992px, then back down
	   at the 991.98px edge, instead of holding still. Removed. */
	/* Above both drawers' own z-index — otherwise the popup paints over
	   this same button once the two are made to visually overlap (on
	   request, so the icon reads as sitting inside the popup's own
	   top-left corner rather than floating separately above it), so a
	   second click in the exact same spot lands on the popup's own
	   content instead of closing it. Staying on top means one button
	   genuinely opens and closes the popup, not just opens it.
	   1082, not the original 1080: #quarto-margin-sidebar's own popup
	   was later raised from 1075 to 1081 (to clear #quarto-header's own
	   1080, a separate fix — § that rule's own comment), which put it
	   back ABOVE this icon's old 1080 without anyone touching this rule
	   at the same time — confirmed live, the right popup's own icon
	   went missing from its corner specifically (the left one, whose
	   own popup stayed at 1075, was never affected): "the other one on
	   the right side... there's no little icon there to click it off."
	   1082 clears the right popup's new 1081 the same one-level margin
	   this file's other z-index fixes already use, and stays clear of
	   the left popup's unchanged 1075 too. */
	z-index: 1082;
	width: 2.25rem;
	height: 2.25rem;
	align-items: center;
	justify-content: center;
	color: hsl(0, 0%, 35%) !important;
	font-size: 1rem;
	text-decoration: none !important;
	border-bottom: none !important;
	transition: color 120ms ease, top 200ms linear;
	/* Same fix as #quarto-header .navbar-toggler (the true-mobile
	   hamburger, below 800px): a reader spotted this button's own
	   default focus/tap ring too, a curved outline flashing around it
	   the instant it's tapped — this button never had any focus-state
	   rule of its own at all, so the browser's bare default (an outline
	   on :focus, plus this same -webkit-tap-highlight-color overlay on
	   actual touch devices, invisible to a desktop mouse-click check)
	   went unaddressed here specifically. */
	-webkit-tap-highlight-color: transparent;
}
/* Was #000 (pure black) — tuned back when this icon only ever sat over
   the light reading column, where darkening on hover reads as normal.
   Once the anchored-popup redesign (§ .book-floating-sidebar-toggle's
   own drawer conversion) made this icon read as sitting INSIDE its own
   dark popup, black-on-hover became nearly invisible there — confirmed
   live (a reader's own report and a follow-up test): the icon all but
   disappeared the instant the cursor rested on it, which is exactly
   what happens right after the click that opens the popup in the
   first place. This icon has never actually sat over the light reading
   column at all (its own top offset keeps it in the dark chrome strip
   above it) — brightening toward white on hover, matching the "more
   prominent on hover" direction the docked icon row already uses
   (opacity, not color, but the same lighter-not-darker intent), is the
   version that was always correct for where this icon actually lives. */
.book-floating-sidebar-toggle:hover,
.book-floating-margin-toggle:hover {
	color: #fff !important;
}
/* :active too, not just :focus — a reader confirmed the ring they were
   seeing appears the instant the button is pressed and disappears the
   instant it's released, which is :active's own exact timing, not
   :focus's (focus persists after release until it moves elsewhere).
   !important and the child <i> icon included: outline/box-shadow were
   already confirmed "none" by computed style on the button itself
   before this, so whatever a reader kept seeing survived that fix —
   most likely the icon glyph rendering its own separate default ring
   as a nested tappable target, a known cross-browser inconsistency
   with -webkit-tap-highlight-color not always propagating to a flex
   child the same way it does the parent.
   :focus-visible explicitly, not just :focus — traced every loaded
   stylesheet on the page (bootstrap, every theme file, this one; 5654
   rules total) confirmed nothing else here sets an outline, yet a
   reader still saw a ring specifically on this button after all of the
   above — some browsers give :focus-visible its own native outline via
   a user-agent rule that a plain :focus override doesn't always fully
   suppress, even where :focus itself computes to "none." border: none
   added too, defensively, in case what's actually rendering is a
   border rather than an outline. */
.book-floating-sidebar-toggle:focus,
.book-floating-margin-toggle:focus,
.book-floating-sidebar-toggle:focus-visible,
.book-floating-margin-toggle:focus-visible,
.book-floating-sidebar-toggle:active,
.book-floating-margin-toggle:active,
.book-floating-sidebar-toggle i,
.book-floating-margin-toggle i {
	outline: none !important;
	box-shadow: none !important;
	border: none !important;
	-webkit-tap-highlight-color: transparent !important;
}
/* left/right now anchored to the reading column's own measured edges
   (--book-navbar-bar-left/-width, --book-viewport-width — all three
   JS-measured every resize, resources/book-scripts.html) instead of a
   flat viewport-edge inset, so each icon sits at the reading column's
   own top corner — symmetrical with its counterpart on the opposite
   side — rather than floating separately out toward the true screen
   edge. Same formula §23/§24 already use to anchor the docked rails
   themselves to this same column at wider widths, reused here rather
   than a new one-off calculation. 0.5rem nudges each icon slightly
   inside the column's own edge instead of sitting flush on the border. */
.book-floating-sidebar-toggle {
	left: calc(var(--book-navbar-bar-left, 0.75rem) + 0.5rem);
}
html.book-compact-mode .book-floating-sidebar-toggle,
html.book-study-mode .book-floating-sidebar-toggle {
	left: calc(var(--book-navbar-bar-left, 0.75rem) + 0.5rem);
}
.book-floating-margin-toggle {
	right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0px) - var(--book-navbar-bar-width, 0px) + 0.5rem);
}
.book-floating-margin-toggle i {
	transform: scaleX(-1);
}
/* .book-floating-sidebar-toggle (LEFT) covers the whole 800–1337.98px
   Compact range (both the wide/centered and narrow/flush-left sub-
   phases) — the left sidebar is off-canvas throughout all of Compact
   now, on request: "I want it to look exactly like that in the exact
   same spot... just like when you're in the third stage, it's already
   doing the thing anyway" — reusing this existing, already-built
   floating toggle for Compact/Study mode instead of a separate custom
   control (an earlier attempt built its own hamburger + expand-in-
   place mechanism; reverted, this is simpler and was already right
   there). .book-floating-margin-toggle (RIGHT) keeps its narrower
   800–1119.98px range — the right margin rail stays docked throughout
   all of Compact, only going off-canvas at the unchanged 1120px
   Mobile floor. */
@media (min-width: 800px) and (max-width: 1337.98px) {
	.book-floating-sidebar-toggle {
		display: flex;
	}
}
/* Off-canvas range only (800–1119.98px): unconditional, any trigger,
   any rail-mode — the WHOLE rail is hidden until this icon reveals
   it, so there's always something worth bringing up regardless of
   which mode it opens to. */
@media (min-width: 800px) and (max-width: 1119.98px) {
	.book-floating-margin-toggle {
		display: flex;
	}
}
/* Auto Compact (1120–1337.98px) deliberately gets NO version of this
   icon at all now — a reader had this same conditional-peek shortcut
   in Compact once before, asked for it removed as confusing next to
   the always-visible real toggle in the same settings row, got it
   reinstated for a while as a narrower "only while on Margin Notes"
   version (the block this comment replaces), and then asked for it
   gone from Compact specifically a second time: "I don't think I
   should have that right side icon until mobile or sub-compact... I
   don't feel like it's right for compact mode." Below 1120px (true
   mobile, the 800–1119.98px popup) the icon stays — there the WHOLE
   rail is off-canvas, so it's the only way to reach Margin Notes/
   Chapter Contents at all, not a redundant shortcut next to a
   docked row. Study mode's own copy (this same rule, previously kept
   deliberately separate as an untouched, manually-opted-into mode) is
   gone too now — a reader hit this same icon while Study mode was on
   ("you press the margin notes thing on the top right, and then on
   the left of margin notes is that icon... I don't want it there
   anymore"), confirmed live: Study mode's own copy was exactly what
   was still showing it, the Compact-mode removal above never
   reaching a docked rail in Study mode specifically. Docked-in-Study-
   mode now behaves identically to docked-in-Compact: no floating
   icon, the persistent settings-row toggle only. */
/* Study mode is width-independent — a reader can turn it on at full
   Stage 1 desktop width, where the media queries above never fire. */
@media (min-width: 800px) {
	html.book-study-mode .book-floating-sidebar-toggle {
		display: flex;
	}
}
/* The crossfade this floating toggle used to do against the docked
   right rail's own --book-sidebar-fade is gone along with the taper
   itself (§ the flat --book-sidebar-w block, above) — the rail is now
   either fully docked (Full/Compact-wide/-narrow) or fully off-canvas
   (Mobile), nothing in between to crossfade against. This icon's own
   plain visibility rules (800–1119.98px auto-reveal, plus Study
   mode's own width-independent copy, both above) already cover every
   width it needs to appear at without a separate fade-in range. */

/* Running head: mirrors a printed book's own running head — current
   chapter/section, live on scroll — for exactly the range that has
   neither the Full-stage docked left sidebar (which already shows the
   active chapter) nor true mobile's own .quarto-secondary-nav copy
   (§20 below, unchanged, still <800px only): the 800–1337.98px gap
   covering both Compact sub-phases plus the reachability gap above
   them. On request: "without the left margin... you kind of lose
   track of what chapter you're on... I kinda want that the same on
   the compact mode... except for the full screen mode. Full screen
   mode doesn't need that." Deliberately a NEW element (resources/
   book-scripts.html, built alongside .book-floating-sidebar-toggle/
   -margin-toggle) rather than widening .quarto-secondary-nav's own
   visible range — that bar is deeply coupled to true-mobile-only
   mechanics (headroom pin/unpin fix, hamburger-open guards, its own
   JS chrome-height gate) that were never built to run this wide, and
   reusing it here would also duplicate the two floating icons with
   its own native toggle buttons. Same row as those two icons (same
   top/height, same --book-navbar-bar-left/-width anchoring) so the
   icons visually sit at this bar's own left/right corners — one
   shared strip, not two stacked ones. Text content is the exact same
   string .mobile-current-section gets, written by the same
   updateCurrentSection() call (book-scripts.html) — no separate
   scroll-tracking logic. */
.book-running-head {
	display: none;
	position: fixed;
	/* Flush against the navbar's own bottom edge — no gap — matching
	   .quarto-secondary-nav's own top: var(--book-navbar-height) exactly
	   (§20/§24 below). A gap here used to leave a sliver of reading-
	   column content visible scrolling past underneath, between the
	   navbar's bottom edge and this bar's own top edge: confirmed live,
	   "there is a space above it where content can leak behind it, and
	   you see through it." Still needs to actually move once scrolling
	   starts, though, same as that bar: top swaps to 0 once #quarto-
	   header is headroom--unpinned, sliding up to occupy the space the
	   hidden navbar vacated instead of sitting fixed in place. Same
	   transition timing as that bar's own top-swap. */
	top: var(--book-navbar-height, 52px);
	transition: top 200ms linear, opacity 150ms ease;
	/* Hidden at the very top of the page, on request: "before any
	   scrolling happens, I want there to be no line and no content
	   within the submenu... it would just be the icon itself until the
	   moment you scroll." The floating ToC/Page-Contents icons are
	   separate, independently-positioned elements (§ their own rules,
	   above) that keep their own unconditional visibility in this same
	   width range — hiding just this bar leaves them showing exactly as
	   before, which is the whole point: at the very top the chapter
	   title itself is already on screen doing this bar's job, so the
	   breadcrumb (and the hairline border under it) has nothing to add
	   yet. html.book-scrolled (resources/book-scripts.html's existing
	   scroll tracker, extended to also set this) flips it back on the
	   moment the reader actually scrolls away from the top — including
	   on load, if a reader arrives already scrolled down via an anchor
	   link or restored history state, not just after a live scroll
	   gesture. opacity, not display/visibility: this bar's own
	   position/top-swap transition already runs on scroll, and opacity
	   is what actually animates smoothly between the two states here. */
	opacity: 0;
	/* + 2px / - 4px: --book-navbar-bar-left/-width (JS-measured off
	   #title-block-header or #quarto-document-content, resources/
	   book-scripts.html's setBarBounds) run a hair wide of the reading
	   column's own visible white paper edges — never visible before
	   this bar existed, since the icons are too small/isolated to
	   reveal a 1-2px slop and .navbar deliberately over-extends past
	   it anyway (§19's own comment on that). A full-width solid sheet
	   makes it obvious: confirmed live, "it extends to the left and
	   right by, like, one extra pixel... not clearly within the white
	   reading column." Insetting slightly is simpler and safer than
	   re-deriving a second, more precise measurement just for this. */
	left: calc(var(--book-navbar-bar-left, 0.75rem) + 2px);
	width: calc(var(--book-navbar-bar-width, auto) - 4px);
	/* 2.25rem -> 52px: matches .quarto-secondary-nav's own min-height
	   exactly (§24 below) and gives the two floating icons (2.25rem/
	   36px tall, vertically centered in this box per their own top
	   formula, §19 above) real room inside the bar instead of nearly
	   filling it edge to edge — on request, "the submenu needs to
	   actually be a little bit taller... it needs to look like the
	   mobile menu." */
	height: 52px;
	z-index: 1074;
	/* Flat, square, and matching .quarto-secondary-nav's own background
	   exactly — not the dark chrome color used elsewhere in this file,
	   on request: "it needs to be white... it's not supposed to be
	   black. It's not supposed to have curves." This is meant to read
	   as the same bar as true mobile's, not a themed floating card.
	   Hardcoded to a literal #fff at the time, though, which is only
	   half of what .quarto-secondary-nav actually does: that bar isn't
	   literally always white, it switches to #222 in dark mode via
	   Quarto's own bundled dark Bootstrap stylesheet (confirmed live) —
	   the same --bs-body-bg value already sitting on every page
	   regardless of theme. The literal #fff here never followed that
	   switch, so this bar stayed white even once the reading column
	   around it went dark — "the submenu is white, and it does not
	   need to be white in dark mode... copy the mobile version's dark
	   gray." var(--bs-body-bg) is that exact copy: identical #fff in
	   light mode (no visual change there), #222 in dark mode.
	   Reconsidered once more after actually looking at dark mode side by
	   side: #222 read as barely distinct from the reading column right
	   below it, not its own separate bar — on further request, dark
	   mode specifically (this bar and true mobile's alike) should go
	   "almost black" instead. Overridden separately just below rather
	   than changed here, since #fff/var(--bs-body-bg) is still exactly
	   right for light mode. */
	background-color: var(--bs-body-bg, #fff);
	/* Same hairline weight/color the rest of this file already uses for
	   subtle rules (§21 TABLES' own body-cell border-bottom) — a plain
	   flat bar with no visual break at its own bottom edge read as
	   unfinished next to .quarto-secondary-nav's, on request: "it still
	   doesn't have the same border at the bottom." */
	border-bottom: 0.5px solid rgba(0, 0, 0, 0.08);
	align-items: center;
	/* flex-start, not center — on request, so the breadcrumb (resources/
	   book-scripts.html's own updateCurrentSection) reads left-to-right
	   from a fixed starting point instead of re-centering itself every
	   time its own text gets longer or shorter as a reader scrolls
	   between a short top-level heading and a long nested one. The
	   3rem left padding below (unchanged) already clears the left
	   icon's own footprint, same as it did when this was centered. */
	justify-content: flex-start;
	/* Clears both icons' own ~2.75rem footprint (2.25rem width + 0.5rem
	   inset) on each side — kept symmetric even after the switch to
	   left-aligned text above, since the right side's 3rem still does
	   real work: it's what stops a long breadcrumb from actually
	   reaching the right icon before this element's own overflow:
	   hidden + text-overflow: ellipsis (below) kicks in. */
	padding-inline: 3rem;
	font-size: 0.8rem;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	color: var(--book-link);
	pointer-events: none;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}
/* Near-black in dark mode specifically, for this bar and true
   mobile's .quarto-secondary-nav alike — fifth value tried here, each
   one a reader's own direct comparison against the last: #222 (barely
   distinct from the reading column), var(--book-chrome-bg-solid)
   (confirmed live as rgb(20,20,20), "almost black" in name only),
   #000 ("too black... such a stark difference"), #0a0a0a (still "too
   black"), #0f0f0f (the exact midpoint between #0a0a0a and rgb(20,20,
   20), on request — still "too dark"). Since #0f0f0f (15,15,15,
   already closer to 20 than to 0) still read as too dark, the target
   sits past that original rgb(20,20,20) reference point, not between
   it and black. #1c1c1c (28,28,28) steps a deliberate amount beyond
   it rather than another small nudge, both directions having already
   overshot once each at smaller step sizes. Literal value, not a
   variable, since the ask is a specific point tuned by direct
   comparison, not "whatever some existing token happens to be." Left
   as a separate override rather than folded into the base rule above
   since #fff is still exactly right for light mode.
   .quarto-secondary-nav's own copy sits right below, next to that
   bar's own display rules. */
body.quarto-dark .book-running-head {
	background-color: #1c1c1c;
	/* Base rule's border-bottom (rgba(0,0,0,0.08)) is a hairline tuned
	   for a light background — against this dark-mode fill it's
	   essentially invisible, on request: "the submenu of compact mode
	   is supposed to have the same visual border at the bottom as
	   mobile mode." Same opacity, flipped to white. */
	border-bottom-color: rgba(255, 255, 255, 0.08);
}
/* html.book-scrolled: see the base rule's own opacity comment above. */
html.book-scrolled .book-running-head {
	opacity: 1;
}
@media (min-width: 800px) and (max-width: 1337.98px) {
	.book-running-head {
		display: flex;
	}
}
/* Slides up to the true top of the viewport in step with the navbar
   hiding. Keyed off html.book-chrome-unpinned (resources/book-
   scripts.html's own independent scroll tracker) rather than #quarto-
   header's own .headroom--unpinned class — a CSS sibling selector
   reading that class directly was tried first and reverted: opening
   the ToC popup (the left floating icon) and then scrolling or
   clicking away left this bar and the two icons permanently stuck in
   whichever state they were in, toggling between "stuck open" and
   "stuck collapsed" depending on how many times the popup had been
   opened (book-scripts.html's own comment on that tracker has the
   full account) — something about the popup's own open/close code
   was interfering with Quarto's bundled headroom instance itself.
   This class has no relationship to that popup at all. */
html.book-chrome-unpinned .book-running-head {
	top: 0;
}
/* Same slide, same trigger, for the two floating icons — same
   reasoning as .book-running-head's own copy just above. */
html.book-chrome-unpinned .book-floating-sidebar-toggle,
html.book-chrome-unpinned .book-floating-margin-toggle {
	top: 8px;
}
/* .book-margin-tools's own scroll-tied top-swap for this width (top:
   -52px on html.book-chrome-unpinned, plus a matching 200ms linear
   transition) is RETIRED — several passes were spent hand-tuning it to
   move in exact sync with the search icon (confirmed live, at one
   point down to a 0.007px difference mid-transition), but a synced
   parallel animation on a second, separate element was never actually
   the ask: "why are they doing their own thing? They're supposed to be
   embedded [in] the top menu the same way as everything else." .book-
   margin-tools is display: none outright at this width now (§ its own
   rule, above) — Font/Dark-Light render exclusively through their
   navbar clones here, genuine .navbar children that get the header's
   own hide motion natively, the same free ride the title/nav-links/
   search already have. Nothing left to sync, because there's no longer
   a second element trying to shadow the first one's motion. */
/* Study mode is width-independent, same as the two floating icons'
   own copy of this exact rule (§19, .book-floating-sidebar-toggle) —
   a reader can turn it on at full Stage 1 desktop width, which sends
   the left sidebar off-canvas there too, so "Full stage doesn't need
   this, the docked sidebar already shows the active chapter"
   (this rule's own reasoning above) stops holding the moment Study
   mode is on, regardless of how wide the window actually is. Without
   this, the pure-width media query above never fired at ≥1338px even
   with Study mode active — confirmed live as the running head simply
   never appearing while testing at full desktop width with Layout on,
   even though both floating icons (which do have this override
   already) showed up correctly in the same screenshot. */
@media (min-width: 800px) {
	html.book-study-mode .book-running-head {
		display: flex;
	}
}

/* ============================================================
   20. FOOTNOTES — list formatting and tooltip styling
   ============================================================ */

/* Remove the browser-default 40px left indent on the footnote list itself,
   keep just enough room for the numbers. */
section.footnotes ol,
.footnotes ol {
	padding-left: 1.4em;
}

section.footnotes ol > li,
.footnotes ol > li {
	margin-bottom: 0.15em;
	line-height: 1.55;
	font-size: 0.8rem;
}

section.footnotes ol > li p,
.footnotes ol > li p {
	text-indent: 0 !important;
	margin: 0;
	text-align: left !important;
	hyphens: manual;
	-webkit-hyphens: manual;
}

/* Citation/footnote links often display the raw URL as their visible
   text (e.g. a full https://... address with no spaces or hyphens to
   break on). Without this, a long enough URL renders as one unbroken
   line that doesn't shrink to fit — on mobile specifically, browsers
   respond by silently widening the whole page's layout viewport to fit
   it, which is what caused the entire site to become horizontally
   pannable into blank space on narrow screens, not just the link itself
   overflowing. Applies broadly (not just inside footnotes) since the
   same raw-URL pattern shows up in the bibliography and body links too. */
main.content a,
#quarto-document-content a {
	overflow-wrap: anywhere;
}

/* Back-link arrow — subdued so it doesn't compete with the text */
.footnote-back {
	font-size: 0.8em;
	opacity: 0.5;
	margin-left: 0.3em;
	text-decoration: none !important;
}

/* ── Tippy footnote tooltips ──────────────────────────────────
   Dark charcoal box, white text — easy to read over any background. */
.tippy-box {
	background-color: #2a2827;
	color: #f0ede8;
	border: none;
	border-radius: 3px;
	box-shadow: 0 3px 14px rgba(0, 0, 0, 0.35);
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	font-size: 0.82rem;
	line-height: 1.55;
	max-width: 340px;
}

.tippy-box .tippy-content {
	padding: 8px 12px;
}

/* Paragraphs inside the tooltip: no indent, no margin bleed */
.tippy-box .tippy-content p {
	text-indent: 0 !important;
	margin: 0;
	text-align: left;
}

/* Arrow matches the dark background */
.tippy-arrow {
	color: #2a2827 !important;
}

/* ============================================================
   21. TABLES — booktabs-style academic table: horizontal rules
   only (no vertical lines, no grid), clean whitespace.
   ============================================================ */

main.content table,
#quarto-document-content table {
	font-size: 0.83rem;
	line-height: 1.45;
	border-collapse: collapse;
	border: none;
	border-left: 1px solid currentColor;
	border-right: 1px solid currentColor;
	width: auto;
	max-width: 100%;
	margin: 1.8em auto;
	/* Lets a table that's genuinely too wide for its columns (long
	   unbreakable formulas/notation in a cell, a table with many
	   columns) scroll horizontally within its own box instead of
	   forcing the whole page wider — plain markdown tables render with
	   no wrapping <div> to hang overflow-x on otherwise, and
	   max-width:100% alone doesn't stop a table from overflowing when
	   its cells can't shrink to fit. Deliberately not display:block:
	   that would also change width:auto's meaning from "shrink to
	   content" to "fill the container," stretching every small
	   reference table (Symbols, Glossary) to the full column width —
	   overflow-x alone already creates a scroll container on a table
	   box in every current browser, without that side effect. */
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
}

/* Top rule (above the header) */
main.content table thead tr:first-child,
#quarto-document-content table thead tr:first-child {
	border-top: 1.5px solid currentColor;
}

/* Rule below the header — nowrap prevents "First use" splitting to two lines */
main.content table thead th,
#quarto-document-content table thead th {
	font-size: 0.83rem;
	font-weight: 600;
	text-align: left;
	white-space: nowrap;
	padding: 0.35em 1em 0.45em;
	border-bottom: 0.75px solid currentColor;
	border-top: none;
	border-left: none;
	border-right: none;
}

/* Body cells — left-aligned so long description columns read naturally;
   centering long prose looks bad even if short symbol/ref cells would
   benefit from it. First and last columns can be centered explicitly
   if needed on a per-table basis. */
main.content table tbody td,
#quarto-document-content table tbody td {
	padding: 0.35em 1em;
	text-align: left;
	border-top: none;
	border-left: none;
	border-right: none;
	border-bottom: 0.5px solid rgba(0, 0, 0, 0.08);
	vertical-align: top;
}

/* Bottom rule — after the last row */
main.content table tbody tr:last-child td,
#quarto-document-content table tbody tr:last-child td {
	border-bottom: 1px solid currentColor;
}

/* Kill Bootstrap's default striping/hover that conflicts with this */
main.content table.table-striped tbody tr:nth-of-type(odd),
main.content table.table-hover tbody tr:hover {
	background-color: transparent;
}

/* Every table in the book, not just the style-preview page — this used
   to be scoped to body.style-preview-page only (a reader had asked for
   the box chassis there specifically, on the reasoning that a bare
   table sitting next to boxed callouts on that one design-reference
   page read as visually unrelated to everything around it), leaving
   the book's own tables (Symbols, Glossary, chapter listings, and
   in-prose tables like 1.4.4's Time/Space/Substance one) on the plain
   booktabs rules-only look above. Reversed on request: a reader
   compared 1.4.4's own table against the "Sample Table" here and
   wanted the book to match it, not the other way around. Same untyped/
   neutral color a reader already uses for boxes with no specific type
   (§12/§ callouts above), full border on all four sides (not just
   left/right, unlike the base table rule) so it reads as its own
   contained box the way the callouts do. The booktabs-style header/row
   rules above still apply unchanged inside this box — only the outer
   shape changes. */
main.content table,
#quarto-document-content table {
	border: 1px solid color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	border-radius: 2px;
	background-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.09);
}
body.quarto-dark main.content table,
body.quarto-dark #quarto-document-content table {
	border-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 40%, var(--book-chassis-neutral, var(--book-bg)));
	background-color: color-mix(in srgb, var(--book-sb-untyped-border, var(--book-link)) 6%, var(--book-chassis-neutral, var(--book-bg)));
	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.35);
}
/* Now that every table sits inside its own box (above), the base
   booktabs rule's own bold top-of-header rule doubles up against that
   box's own top edge — dropped everywhere for the same reason it was
   dropped on the style-preview page originally, leaving the box's own
   border as the only line at the very top. */
main.content table thead tr:first-child,
#quarto-document-content table thead tr:first-child {
	border-top: none;
}
/* The rule under the header stays, just quieter — 0.75px solid
   currentColor (near-black/near-white depending on theme) read as a
   second bold line immediately below the new outer-box border, close
   enough to it to look like a doubled edge. A reader wanted it just a
   little darker than the plain row-to-row dividers below (rgba(0,0,0,
   0.08)) rather than full-strength — enough to mark "header ends
   here," not a second bold boundary. */
main.content table thead th,
#quarto-document-content table thead th {
	border-bottom: 1px solid rgba(0, 0, 0, 0.18);
}
body.quarto-dark main.content table thead th,
body.quarto-dark #quarto-document-content table thead th {
	border-bottom: 1px solid rgba(255, 255, 255, 0.18);
}

/* ============================================================
   22. MOBILE — flatten the "floating sheet" chrome
   Desktop deliberately reads as a light/dark page floating on a dark
   chrome surface (§1, §9): border-left/right + box-shadow (§9) plus
   3.5rem of horizontal padding (§9) frame that sheet. On a phone
   viewport there's no surrounding chrome visible either side to float
   on top of, so the same border+shadow just reads as a boxed-in strip
   with dead margin on both sides. Strip it back to a flush, full-width
   page below phone width; desktop (≥768px) is untouched.
   ============================================================ */
@media (max-width: 767.98px) {
	/* Kill the dark chrome color everywhere it could still show through —
	   body and #quarto-content are the chrome-colored layers main.content
	   sits on top of on desktop (§2, §9); on a phone there's no side
	   column left for that color to read as "chrome around a page," so
	   it just shows as unwanted dark margin. Match it to the reading
	   column's own background instead of removing it, since several
	   descendants (nav-footer, sidebars) still legitimately paint it. */
	body,
	#quarto-content {
		background-color: var(--book-bg) !important;
	}

	main.content,
	#quarto-document-content {
		border-left: none;
		border-right: none;
		box-shadow: none;
		/* This rule's own padding wins over the earlier margin-
		   compensation rule (§ "True mobile only," near the top of this
		   file) on !important. That earlier rule's margin-left/-right:
		   -14px only cancels Quarto's own 14px grid-gutter reservation at
		   this width, landing this box's border edge flush with the true
		   screen edge (confirmed live: getBoundingClientRect() reads
		   exactly 0 to viewportWidth) — the padding value here is
		   therefore the WHOLE visible gutter, not something to be added
		   on top of the -14px. 16px — the low end of a normal mobile
		   reading-app side margin — instead of the previous 0.75rem
		   (12px), which read as too tight. Confirmed by request: "it has
		   to have enough of a gutter... to be, like, a norm." */
		padding-left: 16px !important;
		padding-right: 16px !important;
	}

	/* On mobile this sidebar stacks in normal flow instead of a side
	   column, so the panel treatment (§9) reads as unwanted dark
	   margin rather than a floating rail. Drop it. */
	#quarto-margin-sidebar {
		background-color: transparent;
	}
}

/* Dark mode, Compact/Study mode: a past session dropped main.content's
   border-left/right + box-shadow here entirely, to fix a different,
   narrower glitch — the shadow's own blur (extending past main.content's
   edges) reading as a stray line right where .book-running-head sits
   almost flush against the reading column's corner. On request, that
   trade was rejected outright: "the shadow needs to be there no matter
   what... it looks like garbage without the shadow, flat." The shadow/
   border are restored unconditionally; if the running-head/floating-icon
   seam glitch reappears, it needs its own fix (e.g. adjusting
   .book-running-head's own inset or z-index) rather than suppressing the
   shadow. */
@media (min-width: 800px) {
	/* Two search UIs exist on every page: the navbar's search icon
	   (.quarto-navbar-tools, always present) and a second full search
	   box docked at the top of the left chapter sidebar (from
	   book.sidebar.search: true in _quarto.yml). Both query the same
	   site-wide index, so on desktop they read as "navbar icon" vs.
	   "sidebar box" — spatially distinct. On phone width the sidebar
	   becomes its own slide-out menu, so opening it surfaces a second,
	   redundant search bar right below the navbar's. Drop the sidebar
	   copy; the navbar's still searches the whole site including
	   chapters. */
	.sidebar-search {
		display: none !important;
	}
}

/* ============================================================
   20. MOBILE RUNNING "WHERE YOU ARE" INDICATOR
   .quarto-secondary-nav (the second header bar) is already hidden
   outright above 799.98px (§21/§24), so nothing here needs its own
   media query — this only ever renders inside that bar.
   Populated/updated by the include-after-body script in _quarto.yml,
   which mirrors whichever nav#TOC link Bootstrap's scrollspy currently
   marks .active.
   ============================================================ */
.mobile-current-section {
	font-size: 0.8rem;
	font-family: 'Source Serif 4', 'Source Serif 4 Fallback', Charter, Georgia, serif;
	color: var(--book-link);
	/* Was margin-left/padding-left:0.7em with a border-left separator —
	   sized to sit apart from a breadcrumb that's actually hidden (see
	   §14's global breadcrumb display:none), so it was just pushing this
	   text well past where the navbar's own title starts above it, with
	   a separator line that (now the bar is white, not dark) was nearly
	   invisible anyway. Tightened so this text sits closer to flush with
	   the toggle icon, lining up with "The" in the navbar above. */
	margin-left: 0.35em;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	max-width: 42vw;
	flex-shrink: 1;
}

/* ============================================================
   21. MOBILE: ONE SEARCH ICON, SYMMETRIC LEFT/RIGHT SIDEBAR TOGGLES
   Quarto's template renders TWO search triggers — the navbar's own
   #quarto-search widget and a second hardcoded .quarto-search-button in
   .quarto-secondary-nav — which only both become visible at once on
   mobile widths (desktop only ever shows one of the two bars). Drop the
   secondary one; the navbar's still opens the same site-wide search.
   In its place: a right-sidebar toggle, mirroring the left toggle
   that's already in that same bar. #quarto-margin-sidebar (the "Page
   Contents" TOC) has no show/hide mechanism at all on mobile out of the
   box — Quarto's own CSS just sets it to display:none with nothing to
   turn it back on — so this builds a self-contained slide-in drawer
   rather than trying to reuse the left sidebar's Bootstrap collapse
   plugin instance, which is wired to a shared .quarto-sidebar-collapse-
   item class and isn't meant to run two independent instances at once.
   ============================================================ */
.quarto-secondary-nav .quarto-search-button {
	display: none !important;
}

/* (Closed-state display:none for #quarto-sidebar below 992px removed —
   see the two width-scoped blocks further down, which now each keep
   this element permanently rendered and slide it off-screen via
   `left` instead, the same technique the 992–1199.98px range already
   used. display:none couldn't animate open (nothing to transition
   from "not rendered"), which is exactly why it was never used in
   that range either; below 992px it only got away with it because
   Bootstrap's own width-collapse animation was providing the visible
   motion instead, going from width:0 to full width as the element
   simultaneously became visible — confirmed dead now that this
   drawer no longer runs through Bootstrap's Collapse component at
   all (resources/book-scripts.html), which is also why 800–991.98px
   needed a dedicated block of its own below, where it never had one
   before: Quarto's own native .show-scoped position:fixed/width rule
   used to cover it silently, and stopped the moment Bootstrap's JS
   stopped touching this element.) */

/* .quarto-secondary-nav (the hamburger/breadcrumb/search bar) is a
   separate cutover from the rails going away above: the rails disappear
   at 1200px because that's the point they'd otherwise have to start
   eating into the reading column, but the reading column itself doesn't
   actually start shrinking until ~800px (§21's own reading-column
   override holds it fixed at 800px the entire way down to there). This
   bar showing up at 1200px — a good 400px of window width before
   there's any actual squeeze to explain it — read as its own,
   unprompted pop. Its own cutover moves down to match the point
   something is really giving: 799.98px, not 1199.98px. (The sidebar
   toggle it carries becomes unreachable in the 800–1199.98px gap this
   opens up — the rails are already gone there per the block above, and
   this is now the only way to reach them — but nothing in that range
   needs reaching: the reading column hasn't moved, so there's nothing
   this bar would be helping a reader do yet either.) Two rules, not
   one: Quarto's own native CSS already shows this bar on its own below
   991.98px, so from 800–991.98px that vendor rule has to be overridden
   shut, not just left alone. */
@media (min-width: 800px) {
	.quarto-secondary-nav {
		display: none !important;
	}
}
@media (max-width: 799.98px) {
	.quarto-secondary-nav {
		display: block !important;
	}
}

/* Below Quarto's own native 992px, #quarto-sidebar.show correctly becomes
   an off-canvas drawer (position:fixed, ~245px wide) via Bootstrap's own
   unconditional .sidebar.sidebar-navigation.show{position:fixed} rule —
   confirmed by inspecting its computed style directly. But
   body.floating .sidebar.sidebar-navigation{grid-column:page-start/
   body-start} (also unconditional) ALSO still applies, and below the
   Full-stage floor that grid-column assignment wins instead: the §19b
   override above collapses page-start and body-start onto the same
   line, so with no explicit position:fixed to take it out of grid flow
   here, the "drawer" rendered as a full-width grid item over the reading
   column instead of a narrow overlay. Forcing position:fixed directly
   sidesteps that grid conflict without touching the toggle button, its
   JS, or the vendor rule itself.
   padding-top: var(--book-navbar-height, 52px) lands this rail's
   content flush with the reading column's own top edge, the same way
   its ≥1338px docked counterpart (§23) already does — tracking the
   live-measured header height rather than a flat guess keeps this
   correct across the whole range, including true mobile's own taller
   header/secondary-nav stack below 800px.
   top: 0 with padding-top set, not top set directly on its own — the
   box's own dark background only painted from its top offset down, so
   the gap above it (#quarto-header's own transparent zone, see §19's own
   comment on why the header itself carries no opaque fill) went
   uncovered: a bare strip showing whatever sits behind the header
   instead of the drawer's own fill, read live as a stray gray gap
   above the title, with the floating toggle icon stranded in it.
   Padding pushes the visible content down while the box itself — and
   its background — still starts at the very top.
   ONE block, not three: this used to be split across 992–1199.98px
   (width-driven), a byte-identical 800–1199.98px html.book-study-mode
   copy, and a third 800–991.98px width-driven copy covering the gap
   Bootstrap's own native rules used to silently paper over — three
   near-duplicate rule bodies, every property identical, existing only
   because the ranges were once tuned independently before Compact mode
   became a single consolidated stage. The manual html.book-study-mode
   copy was always fully redundant even under the old design: Compact
   mode (book-compact-mode) is unconditionally true throughout the
   entire off-canvas range anyway, so the width-driven rule alone
   already covered every width the class-driven copy claimed to add.
   Consolidating to one 800–1337.98px range — the left sidebar is
   off-canvas throughout all of Compact now, both the wide/centered and
   narrow/flush-left sub-phases — removes the duplication with no
   behavior change for either trigger.
   (A later attempt narrowed this to 1120–1337.98px, adding a separate
   800–1119.98px true-slide-drawer block below, to match true mobile's
   own edge-slide instead of this popup — reverted the same night:
   confirmed live, both rails ended up permanently visible, squeezing
   the reading column, instead of off-canvas by default. Redone below,
   this time verified: the earlier attempt's bug was never diagnosed,
   just reverted from, so this version was built by transplanting true
   mobile's own already-working position:fixed/off-canvas-left/
   transition mechanism property-for-property (§20, unchanged) rather
   than re-deriving it, specifically to avoid whatever left a gap in
   the off-canvas default that first time. On request, a second time:
   "I want those two to bring out the menus from the sides... similar
   to the mobile thing, instead of the popups" for 800–1119.98px
   specifically — Compact (1120–1337.98px) keeps this popup unchanged,
   narrowed to just that range below. */
@media (min-width: 1120px) and (max-width: 1337.98px) {
	/* Not split by Bootstrap's own .show/.collapsing/base classes —
	   those three still gate visibility/collapse-plugin bookkeeping,
	   but NOT this box's left position anymore. Reason, found live:
	   Bootstrap holds an element in .collapsing for its own internal
	   transition duration (~320–350ms, confirmed live via a
	   MutationObserver + hide.bs.collapse/hidden.bs.collapse timestamps)
	   before swapping to the final class — and since .collapsing is the
	   SAME class name Bootstrap uses on the way in and the way out,
	   grouping it with .show (an earlier version of this rule did, to
	   keep the drawer visually "open" while Bootstrap's own — invisible,
	   since height/etc. are all overridden above regardless — internal
	   animation ran) meant a reader's close-click didn't visibly move
	   this box at all for that whole ~320ms; only once Bootstrap
	   finished and dropped back to the plain, non-collapsing class did
	   this rule's own left transition even start, on top of its own
	   300ms — a reader felt as "the left drawer has a delay the right
	   one doesn't." .book-left-drawer-open (below, toggled by
	   show.bs.collapse/hide.bs.collapse — confirmed live those fire
	   immediately, not after Bootstrap's own animation) is a class this
	   file fully owns instead, so this rule's own left transition starts
	   the instant a reader actually triggers open/close, the same way
	   #quarto-margin-sidebar's plain body class toggle (§24) already
	   does. Keeping the drawer always rendered, just moved off-screen
	   when closed rather than display: none, is that same #quarto-
	   margin-sidebar technique too, just mirrored to the opposite edge. */
	/* Anchored popup, not an edge-sliding drawer — on request: "instead
	   of pushing it out to the left... I think I wanna push it out on
	   top, kind of like the same type of menu that the font menu is,
	   kind of like a little pop up... it's just kind of like popping up
	   right where the menu is, just kind of above the text." Same
	   underlying show/hide mechanism as before (.book-left-drawer-open,
	   toggled by show.bs.collapse/hide.bs.collapse — unchanged, §
	   above's own comment has the full reasoning) and the same outside-
	   click/scroll/resize dismissal already wired up elsewhere in this
	   file — only the VISUAL treatment changes here: position/size
	   anchored to the floating toggle icon itself instead of the true
	   viewport edge, and opacity+transform instead of a left slide.
	   top/left match the icon's own position (§ .book-floating-sidebar-
	   toggle, above) plus the icon's own height and a small gap, so the
	   icon reads as sitting at this panel's own top-left corner — the
	   same "icon stays put, panel hangs from it" relationship the Font
	   menu's own dropdown-toggle/dropdown-menu pair already has. */
	#quarto-sidebar {
		display: flex !important;
		position: fixed !important;
		/* A uniform 5px inset PAST the reading column's own top/left
		   edges, not a flat distance from the true viewport corner (an
		   earlier version of this fix tried that — reverted: it reads
		   fine at the widths tested, but decouples the popup from
		   --book-navbar-bar-left entirely, so at wider Compact widths,
		   where the reading column itself sits well inset from the true
		   edge, the popup would land far from the floating icon that
		   triggers it, which stays anchored to that same column edge).
		   Anchoring both sides to the reading column instead — top past
		   its (effectively-)top edge (the header's own bottom, since the
		   column starts right under it), left past its actual left edge
		   (barLeft) — keeps the same "5px of breathing room past the
		   column" framing on both sides, so the two gaps read as the same
		   kind of margin even though their absolute screen-space distance
		   from the true viewport corner differs (top: navbarHeight+5px
		   flat; left: barLeft+5px, which grows with the column's own
		   inset at wider widths) — matches "five pixels on the top, five
		   pixels on the left," a tightened-up version of the original
		   10px/10px ask, once a reader compared the two side by side and
		   found even 10/10 still read as slightly loose. barLeft feeds
		   this popup's own fixed position only, one-way — it doesn't
		   reserve any layout space of its own or feed back into the
		   reading column's width/centering, so opening this popup never
		   shifts the page.
		   top's own +5px REMOVED on later, more emphatic request: "Table
		   of contents needs to line up with margin notes... in every
		   single iteration of this website... exactly on the same
		   horizontal[,] the same vertical alignment." Confirmed live,
		   the two titles ("Table of Contents" vs. #toc-title/"Margin
		   Notes") landed 6px apart at this width specifically — this
		   popup's own top (this rule) is 5px lower than nav#TOC's own
		   plain var(--book-navbar-height) (no equivalent +5px there),
		   plus a ~1px .book-sidebar-content box offset neither side can
		   avoid. Dropping the top-side +5px (left's own +5px is
		   untouched — a different, still-valid "5px past the reading
		   column's own edge" reason, unrelated to matching the opposite
		   rail's title) lines this popup's own top up with nav#TOC's,
		   closing the gap to that ~1px residual instead of 6px. */
		top: var(--book-navbar-height, 52px) !important;
		left: calc(var(--book-navbar-bar-left, 0.75rem) + 5px) !important;
		right: auto !important;
		bottom: auto !important;
		padding-top: 0 !important;
		/* 240px, not the docked rail's own 300px — the docked rail's
		   width has to fit the flush-left "1. Groundwork" layout it
		   normally sits in, but this popup only ever holds this same
		   list, nothing else needs the extra room. At the wider 300px,
		   the dot-leader between each number and title (.sidebar-
		   chapter-leader, flex: 1 1 auto filling whatever space is left
		   in the row) ran noticeably longer than it needed to — a reader
		   found the popup itself didn't need to be that wide just to
		   avoid it. 240px is the narrowest that still keeps every
		   chapter title on one line (confirmed live against the longest
		   ones — "Metaphysical Rivals," "Expanding the Field," "Maximum
		   Possibility" — 220px wrapped several of them to two lines,
		   which reads worse than a longer leader). */
		width: min(240px, 85vw) !important;
		max-width: none !important;
		/* auto + max-height/overflow, not a flat 100vh — this is a
		   compact popup sized to its own content now, not a full-height
		   panel; max-height keeps it from running off the bottom of a
		   short viewport, with the list itself scrolling past that
		   rather than the popup overflowing the screen. */
		height: auto !important;
		max-height: calc(100vh - (var(--book-navbar-height, 52px) + 0.6rem - 6px) - 1rem) !important;
		min-height: 0 !important;
		overflow-y: auto !important;
		background-color: var(--book-chrome-bg-solid) !important;
		/* Same "raised card" chassis as .book-settings-menu (the Font/
		   Layout/Palette dropdowns, § their own comment) — rounded
		   corners, soft border, drop shadow — so this reads as the same
		   kind of floating panel instead of a bare edge-to-edge drawer. */
		border: 1px solid rgba(var(--book-chrome-text-rgb), 0.1);
		border-radius: 8px;
		box-shadow: 0 14px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);
		z-index: 1075 !important;
		opacity: 0;
		pointer-events: none;
		/* opacity only, deliberately no transform — a transform on this
		   box would make IT the containing block for its own position:
		   fixed descendants (.book-sidebar-title, .sidebar-menu-
		   container are static in this range, but the same trap has bit
		   .book-margin-tools on the right-side popup, § its own comment,
		   confirmed live) — every other fade-in-place rail treatment in
		   this file already avoids transform for exactly this reason. */
		transition: opacity 150ms ease;
	}
	#quarto-sidebar.book-left-drawer-open {
		opacity: 1;
		pointer-events: auto;
	}
	/* Popup-only indent reduction — "Table of Contents" and the chapter
	   numbers below it both end up considerably right of this popup's
	   own left edge, stacked from THREE separate paddings on the way
	   down to them: #quarto-sidebar's own native 20px (Quarto's bundled
	   sidebar-navigation CSS, confirmed live via getComputedStyle — not
	   anything in this file), plus .book-sidebar-content's own 1rem
	   (§9), plus .sidebar-menu-container's own 1rem on top of that
	   (§9 again) — 34px combined, none of it scoped to this popup, all
	   three left untouched here for the always-docked ≥1338px rail,
	   which still needs its own full padding stack. Against the
	   floating icon sitting right at this same corner (independently
	   positioned, unaffected by any of this), the combined 34px read as
	   adrift rather than aligned: "the numbers... need to have a little
	   space on the left... vertically aligned with the top menu icon."
	   Zeroing the first two of the three and consolidating the "little
	   space" into just the third (.sidebar-menu-container, the
	   innermost of the three, right next to the numbers themselves)
	   lands the list a small, single, legible inset past the popup's
	   own edge — close to the icon's own left edge, not stacked three
	   paddings deep past it — instead of removing all indent outright,
	   which would look chapter numbers flush against the box's own
	   border. */
	#quarto-sidebar {
		padding-left: 0 !important;
	}
	.book-sidebar-content {
		padding-left: 0 !important;
		/* padding-right was left alone when the left-side fix above was
		   written, so this box's own unscoped 8px right padding (§9,
		   the max-width: 1337.98px block) kept stacking with .sidebar-
		   menu-container's own 1rem/16px right padding below — 24px on
		   the right against just the 16px .sidebar-menu-container alone
		   provides on the left, confirmed live and directly reported:
		   "the padding on the right side of the box is a little bit too
		   wide... it should be even/symmetrical to the left side." Zeroed
		   here too, same reasoning as padding-left above — leaves
		   .sidebar-menu-container's own 1rem as the only layer on both
		   sides. */
		padding-right: 0 !important;
	}
	/* #quarto-sidebar prefix required: .sidebar-menu-container's own
	   base rule (§9) is itself written as #quarto-sidebar .sidebar-
	   menu-container — an ID ancestor outranks a bare class regardless
	   of which comes later in the file, so a plain .sidebar-menu-
	   container override here would have silently lost to it. */
	#quarto-sidebar .sidebar-menu-container {
		padding-top: 5px !important;
		padding-left: 16px !important;
		padding-bottom: 6px !important;
	}
	/* The chapter list's own outer <ul class="mt-1"> carries a stray
	   17px margin-bottom (Bootstrap's own .mt-1 utility only ever sets
	   margin-TOP; this bottom value is inherited from a browser default
	   list margin never reset elsewhere for this element specifically)
	   — invisible in the always-docked ≥1338px rail (where the rail's
	   own available height already exceeds the list, so this just
	   added dead space no one scrolled far enough to notice) but, once
	   this popup's own box wraps snugly around a much shorter visible
	   slice of the same list (only "P." through "E." render here to
	   begin with — the Home/Resources/Connect/… and Back-Matter groups
	   are hidden from this specific view by other rules entirely,
	   unrelated to this fix), it stacked with .book-sidebar-content's
	   own 1rem and .sidebar-menu-container's own 0.75rem bottom padding
	   into a combined ~48px gap under "Excursus" — visibly more than
	   the ~6px gap above "Table of Contents," confirmed live: "that
	   should have about the same amount of space as the space above
	   table of contents." Zeroing all three for this popup and handing
	   the one remaining bit of breathing room to .sidebar-menu-
	   container's own padding-bottom above (same consolidation as the
	   left-padding fix just above it) matches the two gaps. */
	#quarto-sidebar .sidebar-menu-container ul.mt-1 {
		margin-bottom: 0 !important;
	}
	.book-sidebar-content {
		padding-bottom: 0 !important;
	}
	/* Follows the floating icon's own scroll-triggered reposition —
	   html.book-chrome-unpinned (resources/book-scripts.html's own
	   scroll tracker, unrelated to Quarto's bundled headroom class —
	   see .book-floating-sidebar-toggle's own comment, above, for why)
	   slides the icon itself up to top: 8px once the navbar has hidden
	   on scroll-down, but this popup's own top (calc(navbarHeight+5px))
	   never had a matching override, so it stayed anchored to where the
	   header USED to be — confirmed live: scroll down, open the popup,
	   and it renders well below the now-relocated icon, floating over
	   reading-column text instead of hanging from the icon's own corner
	   the way it does at the top of the page. 5px, not 8px, to keep the
	   same small icon-above-popup offset the pinned case already has
	   (navbarHeight+8 for the icon vs. navbarHeight+5 for the popup, a
	   3px difference) — this is that same 3px below the icon's own new
	   8px, not a flat copy of it. */
	html.book-chrome-unpinned #quarto-sidebar {
		top: 5px !important;
	}
}
/* 800–1119.98px: true edge-slide drawer, matching mobile's own
   left:0/off-canvas-left mechanism (§20) instead of the Compact
   range's anchored popup just above — a second attempt at exactly
   the conversion the "later attempt" comment above describes
   reverting once already ("both rails ended up permanently visible,
   squeezing the reading column, instead of off-canvas by default").
   That bug was never actually diagnosed, just reverted from, so
   every property below is transplanted directly from mobile's own
   already-working version rather than re-derived from scratch,
   specifically to avoid leaving the same gap in the off-canvas
   default a second time: display:flex is unconditional (not gated
   behind .book-left-drawer-open), so there's an actual box, already
   correctly off-canvas via position:fixed + a negative left, for the
   left-transition to animate between — mobile's own rule has the
   full reasoning for why gating display behind the open class
   instead goes back to a display:none↔flex jump with no frame to
   transition from. top uses var(--book-navbar-height) alone, not
   mobile's own --book-mobile-chrome-height (header + secondary nav
   combined) — .quarto-secondary-nav doesn't exist at this width at
   all (confirmed by the Compact popup's own top formula just above,
   which already used the bare navbar height here for the same
   reason), so there's no second bar's height to add in. */
@media (min-width: 800px) and (max-width: 1119.98px) {
	#quarto-sidebar {
		display: flex !important;
		position: fixed !important;
		right: auto !important;
		bottom: auto !important;
		width: min(300px, 85vw) !important;
		max-width: none !important;
		top: var(--book-navbar-height, 52px) !important;
		height: calc(100vh - var(--book-navbar-height, 52px)) !important;
		background-color: var(--book-chrome-bg-solid) !important;
		max-height: none !important;
		z-index: 1075 !important;
		overflow-y: auto !important;
		transition: left 0.3s ease;
		left: calc(-1 * min(300px, 85vw)) !important;
	}
	#quarto-sidebar.book-left-drawer-open {
		left: 0 !important;
	}
	/* Once the primary header hides on scroll (headroom), nothing at
	   all remains on screen at this width to reserve space for —
	   unlike true mobile, where .quarto-secondary-nav stays visible
	   and this same class only shrinks the reserved offset down to
	   its height, not to zero. */
	html.book-chrome-unpinned #quarto-sidebar {
		top: 0 !important;
		height: 100vh !important;
	}
	/* Same three-stacked-paddings trap as the Compact-mode popup's own
	   "Popup-only indent reduction" (§ 1120-1337.98px block, above) and
	   true mobile's own copy (§21) — #quarto-sidebar's native 20px,
	   .book-sidebar-content's own 17px, and .sidebar-menu-container's
	   own 17px all stack unmodified for this range too (confirmed live:
	   "Table of Contents" measured 54px from the drawer's own left
	   edge), nobody having extended either existing fix down to this
	   width once it got its own dedicated drawer. A first pass here
	   replaced this stack with a calc() chasing .book-floating-sidebar-
	   toggle's own exact left position instead of a plain figure, a
	   second pass then settled on 34px (matching true mobile's own
	   .sidebar-menu-container inset) — both reverted on further
	   request: the real target is how far the docked rail's own content
	   sits from the READING COLUMN, not true mobile's own unrelated
	   figure. Confirmed live at 1600px: 10px between the reading column
	   and the docked box itself, plus 17px more inside that box before
	   the text — 27px total (§ nav#TOC's own matching comment, above,
	   has the full derivation). 27px here reproduces that same total
	   directly, since every outer layer is already zeroed and this is
	   the only one left standing. */
	#quarto-sidebar {
		padding-left: 0 !important;
	}
	.book-sidebar-content {
		padding-left: 0 !important;
		padding-right: 0 !important;
		/* #quarto-sidebar is display: flex, and this box is its direct
		   flex child with no explicit width of its own — the same
		   flex-child-shrinks-instead-of-stretching quirk this file's own
		   true-mobile fix already hit one level down the tree
		   (.sidebar-menu-container's own width: 100% fix, § its own
		   comment), just one level higher here. Confirmed live: measured
		   239.734px, not the drawer's real 300px, capping everything
		   nested inside (including "Table of Contents" own available
		   room to the right) short by the same amount regardless of how
		   this box's own padding was set. */
		width: 100% !important;
	}
	#quarto-sidebar .sidebar-menu-container {
		padding-left: 27px !important;
		/* Right-hand match for the left value above — the shared base
		   rule's own 1rem/17px right padding was left untouched here at
		   first, so "Table of Contents" (text-align: right, § its own
		   rule) landed only 17px from this box's right edge while the
		   chapter list sat 27px from the left, an asymmetric box despite
		   both numbers individually matching something real. On request:
		   "the table of contents on the left side needs to fill the
		   space properly on the right of that container... symmetrical."
		   27px both sides mirrors the right rail's own single 27px inset
		   (there measured from nav#TOC's one and only edge that matters,
		   the left one, since its content reads left-to-right) — here
		   the content that matters (the right-aligned title) reads
		   toward the right edge instead, so the right side is the one
		   that needs the match. */
		padding-right: 27px !important;
	}
	/* The home-page-specific padding-top patch that used to live here
	   (11px, chasing .book-floating-sidebar-toggle's own vertical
	   center) is retired — its own root cause, body.home-page's flat
	   padding-top: 0 override, is gone now (§ that rule's own comment,
	   way above), so .sidebar-menu-container's plain padding-left/right
	   rule just above already gets the correct padding-top for free from
	   its own unscoped base (§9), same as every non-home page. Patching
	   one width at a time here was the wrong layer to fix this at in the
	   first place — confirmed directly once the real fix (removing the
	   override outright) resolved every width at once, this patch
	   included. */
	/* .book-floating-sidebar-toggle's own left: (§ its base rule, above)
	   anchors to the READING COLUMN's own edge — correct while this
	   drawer is closed (that's the whole point: the icon has to sit
	   over the reading column to be reachable there), but once the
	   drawer is OPEN it no longer has any relationship to what's
	   actually underneath it. On request: the icon needs to "live...
	   right above" the chapter-number column ("P. I. 1. 2. 3...") —
	   confirmed live, that column's own visible glyphs start at exactly
	   27px from this drawer's own left edge (the same figure
	   .sidebar-menu-container's own padding-left above was just set to,
	   since both come from the same box), while the icon's own
	   reading-column-derived position landed at 83.5px in the same test
	   — well past the numbers, closer to where "Table of Contents"
	   itself (right-aligned, a different comparison entirely) happens
	   to sit instead. body.book-left-drawer-open is a real, already-set
	   class (§ the backdrop rule that also keys off it) — no new JS
	   needed, just a width- and state-scoped override. */
	/* 14.023px, not 16.375px — that value lined up the icon glyph's own
	   LEFT edge with "P."'s own left edge (both 27, confirmed live), but
	   a reader wanted the icon actually CENTERED over the marker, not
	   just left-aligned with it: "it's still not... centered over it...
	   it could still move over just a little bit." "P." specifically
	   (not whichever chapter the current page belongs to) is what's
	   always directly under this icon regardless of page — Preface is
	   always the chapter list's own first, topmost entry, identical on
	   every page, so there's no cross-page inconsistency to reconcile
	   here despite different chapters' own markers ("1." vs "9." vs
	   "C.") measuring anywhere from 9.2px to 12.9px wide live. "P."
	   itself measures 12.296875px wide, centered at 27 + 12.296875/2 =
	   33.148 — the icon glyph (17px wide) needs its own left edge at
	   33.148 - 17/2 = 24.648 to share that same center, 2.352px left of
	   where the previous left-edge-matching value put it. Same
	   10.625px glyph-vs-button offset as before, just measured against
	   the new 24.648 target instead of the old 27: 24.648 - 10.625 =
	   14.023. */
	body.book-left-drawer-open .book-floating-sidebar-toggle {
		left: 14.023px !important;
	}
}
/* ≥1338px (Full stage), Study mode: same anchored popup as the
   Compact-mode range above, not the docked rail's own normal position
   — on request: "it doesn't matter whether the site is fully maxed
   out or whether it's the size of the compact mode. It doesn't
   matter. It's going to just show up right there every time." This
   used to fade the sidebar in/out in its own normal docked position
   instead (opacity only, no reflow) — that older approach was itself
   a deliberate fix for an even earlier off-canvas-slide attempt at
   this same width ("it keeps coming in from the side instead of going
   out from underneath the reader column"), but a reader later asked
   for the popup treatment to be consistent everywhere it appears,
   superseding it. Properties mirror the 800–1337.98px block above
   exactly (position/size anchored to the floating toggle icon,
   opacity-only show/hide, no transform — same reasoning, that block's
   own comments have the full detail) — only the width range differs,
   since ≥1338px is the one place the icon isn't shown automatically
   and needs Study mode to reveal it first. The independent-fixed-
   descendant cancellation for .book-sidebar-title/.sidebar-menu-
   container (further below, already scoped to this same html.book-
   study-mode + ≥1338px combination) still applies unchanged — it
   already resolves against whatever width #quarto-sidebar itself
   currently has, popup or docked, with no changes needed there. */
@media (min-width: 1338px) {
	html.book-study-mode #quarto-sidebar {
		display: flex !important;
		position: fixed !important;
		/* Same reading-column-relative inset as the 800–1337.98px block
		   above — see its own comment for the full reasoning. */
		top: calc(var(--book-navbar-height, 52px) + 5px) !important;
		left: calc(var(--book-navbar-bar-left, 0.75rem) + 5px) !important;
		right: auto !important;
		bottom: auto !important;
		padding-top: 0 !important;
		/* 240px, matching the 800–1337.98px block above — see its own
		   comment for the full reasoning. */
		width: min(240px, 85vw) !important;
		max-width: none !important;
		height: auto !important;
		max-height: calc(100vh - (var(--book-navbar-height, 52px) + 0.6rem - 6px) - 1rem) !important;
		overflow-y: auto !important;
		background-color: var(--book-chrome-bg-solid) !important;
		border: 1px solid rgba(var(--book-chrome-text-rgb), 0.1);
		border-radius: 8px;
		box-shadow: 0 14px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);
		z-index: 1075 !important;
		opacity: 0;
		pointer-events: none;
		transition: opacity 150ms ease;
	}
	html.book-study-mode #quarto-sidebar.book-left-drawer-open {
		opacity: 1;
		pointer-events: auto;
	}
	/* Same popup-only indent reduction as the 800–1337.98px block above
	   — see its own comment for the full reasoning. #quarto-sidebar
	   included in all three selectors (matching html.book-study-mode
	   #quarto-sidebar .book-sidebar-content's own ID-qualified
	   specificity further below, § the position:static case) so these
	   reliably win regardless of source order. */
	html.book-study-mode #quarto-sidebar {
		padding-left: 0 !important;
	}
	html.book-study-mode #quarto-sidebar .book-sidebar-content {
		padding-left: 0 !important;
		padding-right: 0 !important;
		padding-bottom: 0 !important;
	}
	html.book-study-mode #quarto-sidebar .sidebar-menu-container {
		padding-top: 5px !important;
		padding-left: 16px !important;
		padding-bottom: 6px !important;
	}
	/* Same stray-margin fix as the 800–1337.98px block above — see its
	   own comment for the full reasoning. */
	html.book-study-mode #quarto-sidebar .sidebar-menu-container ul.mt-1 {
		margin-bottom: 0 !important;
	}
	/* Same scroll-follow fix as the 800–1337.98px block above — see its
	   own comment for the full reasoning. */
	html.book-study-mode.book-chrome-unpinned #quarto-sidebar {
		top: 5px !important;
	}
}
/* Right margin rail's docked-mode peek now DOES get the same anchored-
   popup treatment as the left sidebar (below) — reversing an earlier
   decision documented right here ("tried once, reverted... the side
   margin itself is going to stay put exactly where it should be").
   Revisited on request: "I want the right side menu to be the same as
   the left side menu on compact mode... instead of putting the
   chapter contents over on the right side, it's gonna bring it up
   over like a menu just like the table of contents." The rail's own
   persistent docked position/content (Margin Notes) is unchanged —
   this only affects the momentary peek (bookRailPeekActive, resources/
   book-scripts.html), which now floats a popup over the icon instead
   of swapping content in place within the docked box. */

/* Below 800px, .quarto-secondary-nav (the hamburger/breadcrumb bar,
   §21) is a second fixed bar stacked under the main header — but both
   this drawer's default top (matching just the main header) and
   #quarto-margin-sidebar's below (top: 0) predate the title/search/
   tools relocation into these same two rails. Before that relocation,
   whatever rendered under the secondary nav's own 1070 z-index in
   that dead zone didn't matter; now the left rail's title and the
   right rail's tool icons both land exactly there, and the secondary
   nav — sitting at a higher z-index — painted over them instead of
   the other way around (confirmed live: elementFromPoint() on the
   title's own coordinates returned the secondary nav's container, not
   the title). Pushing both drawers' own top down to clear the
   combined header + secondary nav height avoids the overlap in the
   first place, rather than trying to out-rank 1070.
   --book-mobile-chrome-height (_quarto.yml, measured live off the
   actual rendered header/secondary-nav, not a hardcoded number) is
   what that combined height actually is — a first pass hardcoded it
   as a single 99px, measured once, and it went stale the same day:
   adding the mobile title clone (.book-mobile-brand, elsewhere in
   this file) grew the header itself by about 15px, quietly leaving
   every one of those hardcoded 99pxs short on every single page, not
   just the one it was first noticed on. The navbar's own expanded
   nav-link list (.navbar-collapse, tapped open via the hamburger) hits
   the exact same problem for the exact same reason — "Home," its
   first item, was rendering right under the secondary nav's own white
   bar and reading as missing entirely — but as a normal-flow (not
   fixed) element it already clears the header's own height just by
   sitting after it in the same growing .navbar box, so it only needs
   --book-mobile-secondary-nav-height (that bar's height alone) as a
   margin, not the full combined figure the two fixed drawers need. */
/* Base/closed state, unscoped — needs a real display:none here since
   the reveal trigger below only exists inside a 799.98px-max media
   query; without a default of its own outside it, this div fell back
   to its native block display at every width that query doesn't
   match, staying permanently visible regardless of the open/closed
   class (confirmed live: the exact darkened-page bug this was meant to
   fix, just moved from "always dark below 1199.98px" to "always dark
   above 799.98px" instead of actually going away). */
.mobile-margin-backdrop {
	display: none;
	position: fixed;
	inset: 0;
	background-color: rgba(0, 0, 0, 0.4);
	z-index: 1059;
}

/* Quarto's own native backdrop for #quarto-sidebar — a real,
   full-viewport, pointer-events:auto element (confirmed live:
   z-index jumps from -1 to 1000 the instant Bootstrap's Collapse
   opens the group it belongs to) that this file never styled,
   positioned, or accounted for until a reader's own drawer-desync
   report traced back to it: since it shares the sidebar's Bootstrap
   collapse-target class, tapping ANYWHERE on it independently
   toggled the whole group via Bootstrap's own data-api, racing
   against this file's own outside-click handler on the exact same
   tap. resources/book-scripts.html now strips its data-bs-toggle on
   load, so Bootstrap never touches it and it should already sit
   inert — this is belt-and-suspenders, not load-bearing, so a stray
   full-screen element with no purpose left doesn't linger as a
   future trap. */
#quarto-sidebar-glass {
	display: none !important;
}

@media (max-width: 799.98px) {
	/* book-left-drawer-open, not Bootstrap's own .show/.collapsing —
	   this element no longer runs through Bootstrap's Collapse
	   component at all (see resources/book-scripts.html), so those
	   classes never appear on it now, and neither does the sliding
	   animation this breakpoint used to get for free from it:
	   Quarto's own native CSS bundle supplies position:fixed and a
	   constrained width only while its own .show class is present,
	   and the actual open/close motion came from Bootstrap's default
	   .collapse-horizontal width transition (0 → full width) —
	   neither ever fires now. Confirmed live: without a replacement,
	   this box fell back to the page's normal block flow at 100% of
	   the viewport width the instant it displayed, an accidental
	   full-screen takeover instead of a ~300px overlay, no slide at
	   all. position/width/left/transition below are the same
	   mechanism the 992–1199.98px range above already uses for the
	   exact same reason (its own comment explains why .show/
	   .collapsing were dropped there first) — left-position
	   animation, not Bootstrap's width one, driven by this one class
	   at every width below 1200px now. z-index still needs its own
	   explicit value: without it this box sinks below .mobile-
	   margin-backdrop (z-index: 1059, shared by both drawers so each
	   dims the page the same way while open), covering its own links
	   entirely — confirmed live, this was the original version of
	   this rule's own bug before the drawer mechanism was rebuilt:
	   elementFromPoint on every visible chapter-list link returned
	   the backdrop div, not the link, and a real click attempt timed
	   out. 1060 matches the transition range's own value. display: flex
	   is unconditional here too (not gated behind .book-left-drawer-
	   open) — same "keep it permanently rendered, just move it off-
	   screen via left" technique as the 992–1199.98px range, so there
	   really is something for the left transition to animate between.
	   Gating display behind the open class instead (closer to how
	   this used to work) goes back to a display:none↔flex jump with
	   no frame in between for the browser to transition from —
	   confirmed live, the drawer just appeared at its final position
	   instantly, no slide at all. */
	#quarto-sidebar {
		display: flex !important;
		position: fixed !important;
		right: auto !important;
		bottom: auto !important;
		width: min(300px, 85vw) !important;
		max-width: none !important;
		top: var(--book-mobile-chrome-height, 99px) !important;
		height: calc(100vh - var(--book-mobile-chrome-height, 99px)) !important;
		background-color: var(--book-chrome-bg-solid) !important;
		max-height: none !important;
		z-index: 1060 !important;
		transition: left 0.3s ease;
		left: calc(-1 * min(300px, 85vw)) !important;
	}
	/* left: 0 — true mobile has no floating bar (the navbar spans the
	   full width), so a left inset built for aligning with the
	   FLOATING navbar bar's own inset edge at Compact widths (where
	   the navbar itself sits off the true viewport edge) just left a
	   ~12.75px sliver of the page's own cream background visible down
	   the drawer's opening edge — confirmed live, the drawer's own
	   rect.x measured 12.75px, not 0, while its parent's background
	   (--book-bg) showed through the gap. A reader spotted it as "a
	   little border on the left side" of the open drawer. */
	#quarto-sidebar.book-left-drawer-open {
		left: 0 !important;
	}
	/* --book-mobile-chrome-height (104px) is the combined header +
	   secondary-nav height — right when the primary header (#quarto-
	   header's own .navbar) is actually on screen, pinned. Once
	   scrolled down past the top, headroom hides that primary header
	   (html.book-chrome-unpinned, resources/book-scripts.html's own
	   scroll tracker) and the secondary nav alone slides up to cover
	   for it (top: 0, its own rule above) — only ~52px of real chrome
	   left on screen, not 104px. This drawer's own top never had a
	   matching adjustment, so it kept reserving the full 104px
	   regardless: confirmed live via a reader's own screenshot,
	   scrolled down then back up (still unpinned at that point) and
	   opened this drawer — a blank ~52px gap of plain page background
	   showed between the visible secondary nav's own bottom edge and
	   "Table of Contents," a phantom slot sized exactly like the
	   now-hidden primary header. --book-navbar-height (52px) matches
	   where the drawer's real top edge needs to be once only the
	   secondary nav remains; height grows by the same 52px so the
	   drawer's own bottom edge doesn't move. */
	html.book-chrome-unpinned #quarto-sidebar {
		top: var(--book-navbar-height, 52px) !important;
		height: calc(100vh - var(--book-navbar-height, 52px)) !important;
	}
	/* .book-sidebar-content's own 1rem top padding (§9) reads fine at
	   ≥800px, where the drawer/rail's own top offset already puts real
	   distance between the header and the title above it. On mobile the
	   drawer's top sits flush against the secondary nav's own bottom
	   edge (immediately above, no gap of its own) — that same 1rem was
	   the only thing separating the title from it, and read as crowded,
	   almost touching.
	   html.book-compact-mode prefix, not a bare #quarto-sidebar
	   .book-sidebar-content: an earlier, unconditional rule ("Zero out
	   Quarto's forced 1em top padding on the first sidebar child", §2)
	   targets this same element via #quarto-sidebar.sidebar-navigation
	   > *:first-child — one ID + one class + one pseudo-class, a higher
	   specificity than this rule's plain one ID + one class, so it won
	   regardless of !important or source order, leaving "Table of
	   Contents" sitting flush against the top edge with none of this
	   2.5rem ever actually applying (confirmed live: computed
	   padding-top read 0px here, and a reader's own screenshot showed
	   the title crowded against the header — the right rail's own
	   equivalent title, #toc-title, has no such competing rule and
	   showed the correct gap by comparison). html.book-compact-mode is
	   already true at every width this block covers, so adding it here
	   costs nothing functionally but raises this rule to the SAME
	   specificity as the one it was losing to — at that point source
	   order (this rule comes later in the file) finally decides in its
	   favor instead. */
	html.book-compact-mode #quarto-sidebar .book-sidebar-content {
		/* 0, not the 0.75rem this briefly held (and not the 2.5rem
		   before that, which never actually reached the page at all —
		   the specificity fix above this comment explains why). 0.75rem
		   was tuned to match the right rail's own "Margin Notes"/
		   #toc-title gap (12.75px) — a real, correct target, just
		   applied to the wrong layer: nav#TOC (the right rail's
		   innermost box) already provides that exact 12.75px on its OWN
		   (§9's base rule, unconditional), with #quarto-margin-sidebar
		   (the OUTER box) deliberately zeroed at this same true-mobile
		   width specifically to avoid doubling it (§21's own comment).
		   This box's opposite-side counterpart, .sidebar-menu-container,
		   already carries that identical unconditional 0.75rem too — so
		   setting ANOTHER 0.75rem here, one layer further out, doubled
		   it to 25.5px total instead of matching the right rail's single
		   12.75px, confirmed live: "Table of Contents" landed 12.75px
		   lower than #toc-title at this width specifically. On request:
		   "in every single iteration of this website... exactly on the
		   same horizontal[,] the same vertical alignment." Zeroing here
		   mirrors #quarto-margin-sidebar's own already-correct fix
		   exactly, leaving .sidebar-menu-container's single layer as the
		   only one, same as the right rail's structure. */
		padding-top: 0 !important;
		/* #quarto-sidebar is display: flex, and this box is its direct
		   flex child with no explicit width of its own — confirmed live,
		   it shrank to its own content's intrinsic size (225px) instead
		   of stretching to fill the drawer's full 300px, the actual
		   source of the "gap on the right" a reader reported (the
		   .sidebar-menu-container fix below is a real, separate issue,
		   but harmless without this: 100% of an already-too-narrow
		   parent is still too narrow). Same flex-child-shrinks-instead-
		   of-stretching quirk this file's own Study-mode fix elsewhere
		   describes hitting, just one level up the tree here. */
		width: 100% !important;
		/* Same left/right consolidation as the 800–1337.98px anchored
		   popup's own identical fix (§ "Popup-only indent reduction",
		   above) — that one was written for a reader's report ("the
		   padding on the right side of the box is a little bit too
		   wide... it should be even/symmetrical to the left side")
		   that never got carried down to true mobile, which stacks the
		   exact same three paddings on the left (#quarto-sidebar's own
		   native 20px + this box's own 1rem + .sidebar-menu-container's
		   own left padding) with nothing matching on the right — a
		   reader hit the identical asymmetry here too, confirmed live:
		   ~37px gap before "Preface" on the left vs. the dot-leaders
		   trailing off well short of the drawer's own right edge.
		   Zeroing both here and moving the one remaining inset onto
		   .sidebar-menu-container (below), same split as the other
		   breakpoint. */
		padding-left: 0 !important;
		padding-right: 0 !important;
	}
	html.book-compact-mode #quarto-sidebar {
		padding-left: 0 !important;
	}
	html.book-compact-mode #quarto-sidebar .sidebar-menu-container {
		/* 34px, not the 16px this first landed on — that number came
		   from .sidebar-menu-container's own pre-existing left padding
		   (§9's base rule), carried over on the assumption it was
		   already correct. A reader compared this drawer directly
		   against the right rail's own equivalent ("Margin Notes"/
		   #toc-title) and confirmed live: #toc-title sits 34px from
		   its own drawer's left edge, not 16px — .book-sidebar-brand
		   ("Table of Contents") is the one that needed to move, to
		   match that real reference, not the other way around. */
		padding-left: 34px !important;
		padding-right: 34px !important;
		/* #quarto-sidebar is display: flex — without an explicit width,
		   this flex child shrunk to its own content's intrinsic size
		   instead of stretching across the drawer's full width (the
		   same flex quirk this file's own Study-mode fix elsewhere
		   describes hitting), confirmed live: right edge measured 225px
		   into a 300px-wide drawer, a ~75px dead gap past the dot-
		   leaders where 16px of padding was supposed to be the whole
		   story. width: 100% forces it to actually fill the drawer. */
		width: 100% !important;
	}
	#quarto-margin-sidebar {
		top: var(--book-mobile-chrome-height, 99px) !important;
		height: calc(100vh - var(--book-mobile-chrome-height, 99px)) !important;
		/* This rail's own unscoped default (§9) sets padding-top: var(
		   --book-navbar-height, 52px) to stay flush with the header in
		   ranges where top: 0 (transition, the 800–991.98px gap) — but
		   here top already IS the full combined header+secondary-nav
		   height (--book-mobile-chrome-height), so that same padding-top
		   would stack a second header's worth of space on top of it.
		   Confirmed live: nav#TOC's content landed at 156px (104 + 52)
		   instead of flush against this rail's own 104px top. 0 here
		   removes the double-count. */
		padding-top: 0 !important;
	}
	.navbar-collapse {
		margin-top: var(--book-mobile-secondary-nav-height, 52px);
	}
	/* Reveals the backdrop defined just below — true mobile only, not the
	   wider 800–1199.98px range this drawer mechanism is otherwise
	   shared with (§ below). At that wider range a reader found it
	   darkened the entire page — header included, since #quarto-header's
	   own background is transparent outside the narrow .navbar bar
	   itself, letting this full-viewport tint show straight through it —
	   for a drawer that's only ever a few hundred px wide against a much
	   bigger screen there. Below 799.98px the drawer is a much larger
	   fraction of a much smaller screen, where the same "floating over
	   dimmed content" cue this book uses for the hamburger dropdown and
	   the left drawer's own reachability still reads as intentional
	   rather than as the whole page going dark for no reason.
	   body.book-left-drawer-open included, not just body.mobile-margin-
	   open — this backdrop element used to only ever respond to the
	   right drawer's own open state; the left drawer had no backdrop of
	   its own at all. A reader wanted both drawers to behave identically
	   (backdrop while open, gone while closed, on both sides), so the
	   left drawer's own open/close handlers (_quarto.yml) now toggle
	   this same class/element too, reusing the one backdrop rather than
	   building a second, duplicate one. */
	body.mobile-margin-open .mobile-margin-backdrop,
	body.book-left-drawer-open .mobile-margin-backdrop {
		display: block;
	}
}

/* True mobile (<800px) keeps its own edge-slide drawer, unchanged —
   this whole file's "don't touch true-mobile chrome" boundary, same
   as the left sidebar's own true-mobile block a little above. Was one
   shared max-width:1119.98px rule covering both true mobile AND the
   800–1119.98px gap; split so the 800–1119.98px range below can move
   to the anchored-popup treatment (§ .book-floating-sidebar-toggle's
   own left-side conversion, above, has the full reasoning) without
   touching phone-width behavior at all. */
@media (max-width: 799.98px) {
	#quarto-margin-sidebar {
		display: block !important;
		position: fixed;
		top: var(--book-mobile-chrome-height, 99px) !important;
		right: calc(-1 * min(300px, 85vw));
		height: calc(100vh - var(--book-mobile-chrome-height, 99px)) !important;
		max-height: 100vh !important;
		width: min(300px, 85vw);
		max-width: none !important;
		background-color: var(--book-chrome-bg-solid);
		/* 1081, not this rail's own long-standing 1072 — #quarto-header
		   (§19) sits at z-index: 1080, HIGHER than this rail, so its own
		   subtree (.navbar's solid dark fill included) painted straight
		   over this rail's entire contents at every point the two
		   overlap on screen. Invisible in every OTHER state this rail
		   is in — the always-docked ≥1120px rail sits well below the
		   header (top: 64px) with nothing to overlap in the first
		   place — but .book-margin-tools (Font/Palette/dark-mode-
		   toggle/Search) is independently position: fixed and visually
		   relocated up INTO the header's own y:0–52px band at every
		   width below 1200px (§23), which is exactly where this rail's
		   own trapped 1072 lost to the header's 1080. A descendant's
		   z-index only ever competes within its nearest positioned
		   ancestor's own stacking context (this file's other z-index
		   comments hit this same trap more than once) — .book-margin-
		   tools's own 1071 could never have out-ranked the header no
		   matter how high it went, only this rail's OWN number,
		   compared against the header one level up, actually mattered.
		   Confirmed live the hard way: correct geometry, correct color,
		   correct opacity, even a freshly injected test element with a
		   forced lime background — none of it painted, only a flat
		   z-index bump finally did. */
		z-index: 1081 !important;
		/* visible while closed, not auto — same rail, same descendant,
		   a second independent bug stacked on top of the first: overflow
		   other than visible on an ancestor clips a fixed descendant's
		   own PAINTED content to that ancestor's box, regardless of
		   position: fixed's own viewport-relative offset math (a
		   genuinely separate mechanism from both containing-block
		   computation and the z-index fix just above — confirmed live,
		   fixing z-index alone still wasn't enough on its own). This
		   rail sits off-screen entirely while closed (right: calc(-1 *
		   ...), well past the true right edge), so its own overflow-y:
		   auto was clipping every one of those icons to a box that
		   isn't on screen at all — "there needs to be a [font toggle]
		   and [dark mode toggle]... on the top menu on mobile" turned
		   out to mean they existed and were positioned correctly, just
		   invisible, for two independent reasons at once. Switched back
		   to auto once actually open, below —
		   that state needs real internal scrolling if this rail's own
		   content runs taller than the viewport, and once open this
		   rail's own box IS on screen, so there's nothing left to clip
		   away by then. */
		overflow-y: visible;
		transition: right 0.3s ease, box-shadow 0.3s ease;
	}
	body.mobile-margin-open #quarto-margin-sidebar {
		z-index: 1060 !important;
		right: 0;
		box-shadow: -6px 0 16px rgba(0, 0, 0, 0.45);
		overflow-y: auto;
	}
	/* Same fix as #quarto-sidebar's own identical rule just above (its
	   comment has the full reasoning) — this rail has the exact same
	   static top: var(--book-mobile-chrome-height) with no adjustment
	   for the primary header being scrolled away, leaving the same
	   phantom ~52px gap above "Margin Notes"/nav#TOC once unpinned. */
	html.book-chrome-unpinned #quarto-margin-sidebar {
		top: var(--book-navbar-height, 52px) !important;
		height: calc(100vh - var(--book-navbar-height, 52px)) !important;
	}
}

/* 800–1119.98px: true edge-slide drawer, matching mobile's own
   right:0/off-canvas-right mechanism (§21) instead of the anchored
   popup this range used before — a second attempt at exactly the
   conversion the "later attempt" comment above (its own copy of this
   same history) describes reverting once already ("both this rail
   and the left one ended up permanently visible, squeezing the
   reading column, instead of off-canvas by default"). That bug was
   never actually diagnosed, just reverted from, so every property
   below is transplanted directly from mobile's own already-working
   version rather than re-derived, including the z-index dance and
   overflow-y visible/auto swap mobile's own version needs for
   .book-margin-tools (Font/Palette/dark-mode-toggle/Search,
   independently position: fixed, pulled up into the header at every
   width below 1120px) to stay both on top of the header and un-
   clipped while this rail is off-canvas — see mobile's own comments
   on both of those for the full reasoning, unchanged here. top uses
   var(--book-navbar-height) alone, not mobile's own
   --book-mobile-chrome-height (header + secondary nav combined) —
   .quarto-secondary-nav doesn't exist at this width at all (this
   range's own now-replaced popup already used the bare navbar height
   here for the same reason). 300px, not the old popup's 240px — that
   narrower figure was tuned for a small anchored card sitting next to
   the Font menu's own popup, a comparison that no longer applies once
   this is a full edge-to-edge drawer like mobile's; 300px is mobile's
   own already-confirmed-working width for this exact chapter-list
   content. No backdrop — a reader already found one here darkened the
   whole page for a drawer only ever a few hundred px wide against a
   much bigger screen (§ mobile's own backdrop comment, above, has
   this reasoning in full); mobile's <800px backdrop stays exclusive
   to that range, unchanged. */
@media (min-width: 800px) and (max-width: 1119.98px) {
	#quarto-margin-sidebar {
		display: block !important;
		position: fixed;
		top: var(--book-navbar-height, 52px) !important;
		right: calc(-1 * min(300px, 85vw));
		height: calc(100vh - var(--book-navbar-height, 52px)) !important;
		max-height: 100vh !important;
		width: min(300px, 85vw);
		max-width: none !important;
		background-color: var(--book-chrome-bg-solid);
		z-index: 1081 !important;
		overflow-y: visible;
		transition: right 0.3s ease, box-shadow 0.3s ease;
		/* Same double-count this rail's own unscoped default (§9,
		   padding-top: var(--book-navbar-height)) already needed fixing
		   for at true mobile (§21's identical comment) — this block's own
		   top: var(--book-navbar-height) already clears the header once,
		   so that base padding-top would stack a second, redundant
		   navbar-height's worth of space above nav#TOC's content. */
		padding-top: 0 !important;
	}
	/* 1075, not mobile's own 1060 — 1060 was transplanted straight from
	   true mobile (where it only ever needs to clear that range's
	   backdrop, 1059) without accounting for .book-running-head, which
	   doesn't exist at true mobile at all (§ its own display rule) but
	   DOES show here, at 1074 — above 1060, painting over this rail's
	   own top ~52px whenever both are visible at once. Directly
	   reported: "you scroll down, you scroll back up[,] the little sub
	   menu shows back up... you click on the right side menu icon[:] it
	   should pull up the menu above, on top of everything. But instead,
	   it pulls it up below the sub menu." 1075 clears running-head's
	   1074 by the same one-level margin every other z-index fix in this
	   file already uses, while staying below the floating toggle
	   buttons' own 1082 (still reachable to close this rail again) and
	   still above the shared backdrop's 1059 (unchanged, not competing
	   with anything new). */
	body.mobile-margin-open #quarto-margin-sidebar {
		z-index: 1075 !important;
		right: 0;
		box-shadow: -6px 0 16px rgba(0, 0, 0, 0.45);
		overflow-y: auto;
	}
	html.book-chrome-unpinned #quarto-margin-sidebar {
		top: 0 !important;
		height: 100vh !important;
	}
	/* .book-floating-margin-toggle's own right: (§ its base rule) anchors
	   to the READING COLUMN's own edge — correct while closed, but once
	   this drawer is open it has no relationship to what's underneath it
	   anymore, the same disconnect the left rail's own icon already had
	   (§ .book-floating-sidebar-toggle's matching fix, above). A first
	   pass here mirrored this against #toc-title's own small icon
	   (bi-list-ul, before "Home") — wrong mirror, confirmed directly:
	   "the icon needs to be on the right, man... on the right menu, the
	   icon needs to be on the far right, just like on the left menu, the
	   icon is on the far left." #toc-title's own icon sits near the
	   drawer's LEFT edge (text reads left-to-right, same as every other
	   language element on the page), so matching it landed this button
	   near the left side of a RIGHT-side drawer — content-position
	   symmetry, not the actual left-right MIRROR symmetry that was
	   wanted. True mirror is simpler than either attempt: the left
	   button's own left: 14.023px (§ its own comment) is its distance
	   from the LEFT drawer's own left edge; this button needs that same
	   distance from the RIGHT drawer's own RIGHT edge instead — and
	   since .book-floating-margin-toggle is already right-anchored by
	   its own base rule, that's the identical numeric value, just on
	   the opposite property. No re-derivation needed. */
	body.mobile-margin-open .book-floating-margin-toggle {
		right: 14.023px !important;
	}
}
/* Docked ranges (1120–1337.98px Compact, or Study mode at any width
   ≥1120px): the rail is normally docked showing Margin Notes, but a
   peek at Chapter Contents (bookRailPeekActive, resources/book-
   scripts.html — sets both data-book-rail-mode="contents" and the
   .book-rail-peek-active class, without touching the reader's own
   persisted mode) now gets the exact same anchored-popup treatment as
   the 800–1119.98px block just above and the left ToC popup, rather
   than swapping content in place within the docked box. Same anchor
   formula (.book-floating-margin-toggle's own right/top, mirrored
   from the left popup's left/top), same card chassis, same
   opacity-only show/hide (no transform — same fixed-descendant trap
   as that block, .book-margin-tools is independently position: fixed
   here too). .book-rail-peek-active is the trigger (not
   data-book-rail-mode="contents" alone) — the persistent top-row
   Chapter Contents toggle also sets that attribute but is NOT a peek,
   and should show the rail docked in place rather than as a popup. */
@media (min-width: 1120px) and (max-width: 1337.98px) {
	html.book-compact-mode.book-rail-peek-active #quarto-margin-sidebar,
	html.book-study-mode.book-rail-peek-active #quarto-margin-sidebar {
		display: block !important;
		position: fixed !important;
		top: calc(var(--book-navbar-height, 52px) + 0.6rem - 6px) !important;
		right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0px) - var(--book-navbar-bar-width, 0px) + 0.5rem - 6px) !important;
		left: auto !important;
		bottom: auto !important;
		padding-top: 0 !important;
		height: auto !important;
		max-height: calc(100vh - (var(--book-navbar-height, 52px) + 0.6rem - 6px) - 1rem) !important;
		/* 240px, matching the 800–1119.98px block above — see its own
		   comment for the full reasoning. */
		width: min(240px, 85vw) !important;
		max-width: none !important;
		background-color: var(--book-chrome-bg-solid) !important;
		border: 1px solid rgba(var(--book-chrome-text-rgb), 0.1);
		border-radius: 8px;
		box-shadow: 0 14px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);
		z-index: 1075 !important;
		overflow-y: auto !important;
		opacity: 1;
		pointer-events: auto;
		transition: opacity 150ms ease;
	}
	html.book-compact-mode.book-rail-peek-active .book-margin-tools,
	html.book-study-mode.book-rail-peek-active .book-margin-tools {
		pointer-events: auto !important;
	}
	/* nav#TOC (the actual Chapter Contents list a reader sees) is its
	   own independently position:fixed element in the docked range (§
	   its own base rule further below, ~8485) — anchored to the reading
	   column's edge with the DOCKED rail's own 255px width, completely
	   unaware of #quarto-margin-sidebar's own box. Resizing/repositioning
	   the outer rail above did nothing visible without also freeing this
	   element from that independent anchor: confirmed live, the popup
	   "worked" (attribute correctly flipped, outer box correctly
	   resized) but the visible content kept rendering at its old full-
	   rail-width position regardless. Dropping it back into normal flow
	   lets it size and position itself off its own now-popup-sized
	   parent instead, the same way nav#TOC already behaves inside the
	   left sidebar's own popup (where the equivalent left-rail content
	   was never independently fixed to begin with, so this exact
	   problem never came up there). Only during a peek — persistent
	   contents mode (contentsBtn, no .book-rail-peek-active) leaves
	   nav#TOC in its own docked position:fixed, which is correct. */
	html.book-compact-mode.book-rail-peek-active #quarto-margin-sidebar nav#TOC,
	html.book-study-mode.book-rail-peek-active #quarto-margin-sidebar nav#TOC {
		position: static !important;
		top: auto !important;
		left: auto !important;
		width: 100% !important;
		margin-top: 0 !important;
	}
}
/* Same peek-popup treatment, width-independent copy for Study mode at
   full desktop width (≥1338px) — mirrors the left sidebar's own
   Study-mode popup block (above) needing a separate ≥1338px rule
   since the 1120–1337.98px block above doesn't reach that far.
   Same .book-rail-peek-active trigger as above — not data-book-rail-
   mode="contents" — so the persistent Chapter Contents toggle shows
   the rail docked in place rather than as a popup. */
@media (min-width: 1338px) {
	html.book-study-mode.book-rail-peek-active #quarto-margin-sidebar {
		display: block !important;
		position: fixed !important;
		top: calc(var(--book-navbar-height, 52px) + 0.6rem - 6px) !important;
		right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0px) - var(--book-navbar-bar-width, 0px) + 0.5rem - 6px) !important;
		left: auto !important;
		bottom: auto !important;
		padding-top: 0 !important;
		height: auto !important;
		max-height: calc(100vh - (var(--book-navbar-height, 52px) + 0.6rem - 6px) - 1rem) !important;
		/* 240px, matching the 800–1337.98px popup blocks above — see
		   their own comments for the full reasoning. */
		width: min(240px, 85vw) !important;
		max-width: none !important;
		background-color: var(--book-chrome-bg-solid) !important;
		border: 1px solid rgba(var(--book-chrome-text-rgb), 0.1);
		border-radius: 8px;
		box-shadow: 0 14px 32px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.3);
		z-index: 1075 !important;
		overflow-y: auto !important;
		opacity: 1;
		pointer-events: auto;
		transition: opacity 150ms ease;
	}
	html.book-study-mode.book-rail-peek-active .book-margin-tools {
		pointer-events: auto !important;
	}
	/* Same nav#TOC fix as the 1120–1337.98px block above — see its own
	   comment for the full reasoning. Only during a peek. */
	html.book-study-mode.book-rail-peek-active #quarto-margin-sidebar nav#TOC {
		position: static !important;
		top: auto !important;
		left: auto !important;
		width: 100% !important;
		margin-top: 0 !important;
	}
}
/* .quarto-secondary-nav's own left/right toggle icons only ever exist
   below 799.98px (that bar itself is display:none above it) — moved
   back into the true-mobile block above (was briefly caught inside
   the 800–1119.98px popup block above during the split, where
   .quarto-secondary-nav can't ever be present to match against). */
@media (max-width: 799.98px) {
	/* Mirrors the left toggle's own icon treatment in that bar. Color is
	   set further down (§ .mobile-margin-toggle, near the secondary-nav
	   rules) — this bar is white, not the dark chrome the rest of the
	   sidebar tooling assumes, and that later rule is the one that
	   actually corrects for it. */
	.mobile-margin-toggle {
		background: transparent;
		border: none;
	}
	.mobile-margin-toggle i {
		transform: scaleX(-1);
	}
	/* Same focus/tap-ring fix as #quarto-header .navbar-toggler and
	   .book-floating-sidebar-toggle/-margin-toggle above — this pair
	   (the true-mobile secondary-nav bar's own left/right toggle icons,
	   one of them Quarto's own native .quarto-btn-toggle) never had any
	   focus-state rule of its own either, so the same default outline/
	   tap-highlight went unaddressed here too. */
	.quarto-secondary-nav .quarto-btn-toggle,
	.mobile-margin-toggle {
		-webkit-tap-highlight-color: transparent;
	}
	/* :active + the child <i> icon, !important — see the matching
	   comment on #quarto-header .navbar-toggler (§18) for why :focus
	   alone wasn't the whole fix. */
	.quarto-secondary-nav .quarto-btn-toggle:focus,
	.mobile-margin-toggle:focus,
	.quarto-secondary-nav .quarto-btn-toggle:focus-visible,
	.mobile-margin-toggle:focus-visible,
	.quarto-secondary-nav .quarto-btn-toggle:active,
	.mobile-margin-toggle:active,
	.quarto-secondary-nav .quarto-btn-toggle i,
	.mobile-margin-toggle i {
		outline: none !important;
		box-shadow: none !important;
		border: none !important;
		-webkit-tap-highlight-color: transparent !important;
	}
}

/* Stage 2 restructuring: the rules below (the hamburger nav-link
   dropdown's own backdrop/positioning) are a genuinely separate
   mechanism from #quarto-margin-sidebar above — they're about the
   navbar's own collapsed link list, which still only ever appears
   below Bootstrap's native ~991.98px hamburger threshold, unrelated
   to wherever the docked rails' own off-canvas cutover happens to
   sit. Split into its own block, deliberately left at the original
   1199.98px (a harmless superset of the ~991.98px range where the
   toggler that triggers this is actually visible) rather than moved
   down with the rail mechanics above and below it. */
@media (max-width: 1199.98px) {
	/* Same treatment as .mobile-margin-backdrop just above, for the
	   hamburger's own nav-link list (.navbar-collapse): that list is
	   already a fixed, non-reflowing overlay (#quarto-header itself is
	   position:fixed), but a solid black box with nothing behind it to
	   read as "the page, dimmed" looked like it had pushed the page
	   down instead of floating over it. z-index sits below the header
	   (1070) and above ordinary content, same as the margin drawer's
	   own backdrop — only one of the two is ever visible at once, since
	   opening either drawer closes the other (see _quarto.yml). */
	.book-nav-collapse-backdrop {
		display: none;
		position: fixed;
		inset: 0;
		background-color: rgba(0, 0, 0, 0.4);
		z-index: 1059;
	}
	body.book-nav-collapse-open .book-nav-collapse-backdrop {
		display: block;
	}
	/* The secondary nav's own left/right toggle icons (Page Contents /
	   Chapter list) live inside the same fixed header as the nav-link
	   list, and were rendering visible mid-dropdown — sandwiched between
	   the toggler row and the nav-links below it — while the hamburger
	   menu was open. Nothing in that state should be reachable but the
	   nav links themselves.
	   display: none, not visibility: hidden — hidden still reserved this
	   bar's own 52px, which .navbar-collapse's own margin-top (below)
	   was built to clear specifically so the dropdown wouldn't render
	   underneath it. With the bar itself actually hidden, that reserved
	   52px just sat empty — the dimmed backdrop showing through a gap
	   between the header and the dropdown instead of the two reading as
	   one connected piece, a reader's own report. display: none reclaims
	   the space; .navbar-collapse's own margin-top is zeroed to match,
	   just below. */
	body.book-nav-collapse-open .quarto-secondary-nav {
		display: none !important;
	}
	/* Same gap, different pair: .book-floating-sidebar-toggle/-margin-
	   toggle (the sub-compact/docked-Compact stand-ins for this same
	   secondary-nav row, § their own "reachability gap" comment) are
	   fixed-position page-level elements, not children of the navbar
	   at all, so hiding .quarto-secondary-nav above never touched them
	   — confirmed live: the left-sidebar toggle's icon sat right on
	   top of "In Plain Terms," the dropdown's own first item, once the
	   hamburger menu opened. Same fix, same reasoning as above. */
	body.book-nav-collapse-open .book-floating-sidebar-toggle,
	body.book-nav-collapse-open .book-floating-margin-toggle {
		display: none !important;
	}
	/* Full-bleed + flush, while open: this list otherwise sits inside
	   .navbar-container's own 12.75px side padding (inherited, not
	   overridden) and in normal flow below the toggler row plus this
	   bar's own now-reclaimed margin-top — both together read as an
	   inset "island" floating below the header with gray showing on
	   all four sides, not attached to it, the same report as the gap
	   above. position: fixed with left/right: 0 escapes the container's
	   own padding; margin-top: 0 plus top: var(--book-navbar-height)
	   lands this flush against the header's own bottom edge now that
	   the secondary nav bar it used to clear is removed from layout
	   while open (above). */
	body.book-nav-collapse-open .navbar-collapse {
		position: fixed !important;
		top: var(--book-navbar-height, 52px) !important;
		left: 0 !important;
		right: 0 !important;
		width: 100% !important;
		margin-top: 0 !important;
	}

}

/* Stage 2 restructuring: back to the rail-mechanics boundary (1120px)
   for this grid-track formula — it must stay in sync with wherever
   #quarto-margin-sidebar is ACTUALLY a fixed off-canvas drawer (moved
   above, and again just below), not the unrelated hamburger-dropdown
   block just above this comment. Letting a grid formula and the rail
   state it's compensating for drift to different breakpoints is
   exactly the bug pattern (grid-template-columns silently resolving
   wrong for a whole width range) fixed earlier this session. */
@media (max-width: 1119.98px) {
	/* Quarto's own responsive #quarto-content grid only fully collapses
	   its margin-sidebar column (and that column's own outer inset track)
	   below 767.98px — it doesn't know #quarto-margin-sidebar just became
	   a position:fixed drawer at this same 1199.98px breakpoint (above),
	   so from 1200px down to 768px the grid would otherwise still reserve
	   space for a sidebar that's no longer actually sitting in that
	   column. The reading column would get squeezed by dead, empty space.
	   !important throughout: beats Quarto's own per-breakpoint
	   grid-template-columns rule, which this stylesheet — loaded after
	   Quarto's own — would otherwise lose to only on selector order, not
	   specificity.

	   body-content-start's own width, min(800px, calc(100vw - 28px)), not
	   a flexible track: the reading column should hold the exact same
	   800px it's pinned to above 1200px (§19c) here too, not spring open
	   to fill whatever space the rails just vacated. A reader who's just
	   watched the rails disappear at 1200px would otherwise immediately
	   see the text itself jump wider for no reason they asked for — the
	   opposite of "nothing moves unless it has to." The extra room instead
	   goes to the two minmax(0, 1fr) tracks flanking it, which just center
	   the fixed-width column in the newly-freed space. Only once the
	   viewport itself can no longer fit 800px (below ~800px) does the
	   min() clause take over and let the reading column start shrinking
	   again, down to phone widths — the same point it would have started
	   shrinking at anyway, just reached by a straight line instead of a
	   jump. (Not a bare 1fr, either: an frtrack's implicit minimum is its
	   content's own min-content size, not zero — a bare 1fr here stopped
	   shrinking past ~572px, wide enough for this page's widest
	   unbreakable content, well above true phone widths. min() with a
	   definite calc() doesn't carry that automatic floor.

	   #quarto-document-content.page-columns, mirrored alongside — this
	   rule only ever pinned the OUTER grid (#quarto-content). The INNER
	   grid (#quarto-document-content, its own separate nested .page-
	   columns — see the note on .page-full elsewhere in this file for
	   why it exists at all) kept using Quarto's own native responsive
	   tracks the whole way down to 767.98px, since nothing below 992px
	   (§19c, min-width scoped) ever touched it. Confirmed live: from
	   991px down to ~768px the reading column drifted left (title block
	   x: 109px, shrinking width) while a growing dead gap — Quarto's own
	   still-reserved margin-sidebar track, sized for a rail that's
	   already an off-canvas fixed drawer by this width (§ above, same
	   1199.98px cutover) and no longer actually sitting in that column —
	   sat empty on the right, exactly "reading content to the left,
	   background to the right." Same track list, same reasoning: once
	   both grids agree, the reading column reads as one continuous 800px
	   (down to the min() floor) column the whole way from 1199.98px to
	   true mobile, not just above 992px. */
	#quarto-content.page-columns,
	#quarto-document-content.page-columns {
		grid-template-columns:
			[screen-start] minmax(0, 1fr)
			[screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] min(800px, calc(100vw - 28px))
			[body-content-end body-end body-end-outset page-end-inset page-end screen-end-inset] minmax(0, 1fr)
			[screen-end] !important;
		/* Same defense-in-depth as the ≥1200px block's own pairing
		   (§ Stage 1 fix, above): the two minmax(0, 1fr) flex tracks only
		   center this column when there's real leftover space to split.
		   Now that the stray 86px side padding is zeroed for page-full
		   pages (§ #quarto-document-content.page-full, elsewhere in this
		   file) there normally IS room to spare here, but a reader
		   dragging the window to an exact width where min(800px, 100vw -
		   28px) still barely doesn't fit shouldn't see the whole column
		   snap to a left-anchored overflow instead of just clipping
		   symmetrically the way the wider range already does. */
		justify-content: center;
	}
}

/* The old "top: 0 + padding-top: navbar-height" pairing that used to
   live here is gone along with the full-height edge-slide drawer it
   was built for: that trick existed only to let the drawer's own
   background fill start at the true top of the screen while its
   visible content stayed pushed down below the header. The anchored-
   popup version (§ .book-floating-margin-toggle's own conversion,
   above) positions its whole box directly via `top`, already landing
   right below the header with nothing left to push past — no separate
   padding needed, and no rail left in this range for the old rule to
   apply to that would still want it. */

/* ============================================================
   19c. DESKTOP: READING COLUMN NEVER SHRINKS — THE RAILS DO
   Quarto's own grid shrinks all three columns together as the window
   narrows: on this book's own configured grid (sidebar 280px / body
   800px / margin 300px), the reading column started losing width the
   moment the viewport dropped below ~1380px, well before either side
   rail was touched — so a reader dragging the window in even slightly
   would see the prose itself reflow, long before the sidebars had
   given up any room to it. That reads as choppy: the one thing a
   reader is actually looking at moves for no reason legible to them.

   Fix: pin the reading column (#quarto-document-content's grid track)
   to its full 800px (850px configured minus the 2×14px gutters either
   side of it — the actual rendered content width, confirmed by
   inspecting the grid at a wide viewport) and let the two side rails
   absorb 100% of the narrowing instead, shrinking continuously from
   their full width down to a 186px floor — still legible for a
   chapter list or a page's table of contents — exactly by 1200px.
   Below 1200px neither rail has any room left to give without cutting
   into the reading column itself, so instead they disappear outright
   (§21/§24, both moved from Quarto's native 992px cutover up to this
   same 1200px). The reading column itself doesn't react to that at
   all — it stays pinned at the same 800px it was already holding,
   centered in whatever space the rails just vacated (§21's own
   grid-template-columns override carries the same 800px figure down
   through that entire range) — rather than springing open to fill the
   freed space, which would just trade one unprompted jump for another.
   Only once the viewport itself can no longer fit 800px, well below
   1200px, does the reading column finally start shrinking again. The
   result: the reading column's width never changes because of
   anything the rails do, at any point in the whole range — it only
   ever moves when the viewport itself can no longer fit it.

   186px floor, 1200px handoff: derived from the arithmetic, not
   picked by eye — 800px (reading column) + 2×14px (its gutters) +
   2×14px (outer edges) leaves 1200 − 828 = 372px for both rails
   together once they've bottomed out, i.e. 186px apiece.
   ============================================================ */
/* NOTE ON .page-full: Quarto's own bundled HTML post-processor walks
   up the DOM from every .column-margin element and stamps .page-full
   on each ancestor, all the way up to and including #quarto-document-
   content itself — this is REQUIRED, not a bug: every ancestor in
   that chain needs to share the outer grid's own named lines (body-
   end, page-end, ...) for the deeply-nested .column-margin child to
   resolve its own grid-column: body-end / page-end against anything
   at all. An earlier attempt forced #quarto-document-content back to
   grid-column: body-content-start / body-content-end specifically to
   stop it spanning full width — which "fixed" that symptom by
   breaking the very nesting margin notes depend on: the note's own
   grid-column then resolved against #quarto-document-content's own
   (now artificially narrowed) internal grid instead of the true outer
   one, landing it well short of the real margin column. Reverted. The
   real fix is below: stop measuring #quarto-document-content itself
   for the sidebar's own position (see book-scripts.html's
   setBarBounds) — it's supposed to span full width now, so its own
   rect was never a valid proxy for "where the reading column visually
   is" once a chapter has any margin content at all. */

@media (min-width: 1120px) {
	:root {
		/* Flat 255px, not a clamp() taper — three discrete stages (Full/
		   Compact/Mobile) replaced the old continuous shrink-as-you-
		   narrow behavior a reader found produced "three or four or five
		   different stages of transitions" instead of clean, delineated
		   jumps: "I need it to be three." A rail is now only ever at its
		   full 255px (docked, Full or Compact) or off-canvas entirely
		   (Mobile) — nothing in between to taper. One governing width
		   still shared by the (invisible) rail and every visible box
		   inside it — title, chapter list, "Page Contents" header,
		   page-TOC list — same reasoning as when this was first
		   unified, just without the vw-dependent formula. */
		--book-sidebar-w: 255px;
		/* Same value as --book-sidebar-w, not its own formula — the two
		   rails read symmetrically at every stage this way. A long
		   page-content TOC entry no longer needs a wider column to avoid
		   wrapping; instead .toc-entry-title itself truncates with an
		   ellipsis as the rail narrows (see "Right sidebar page TOC"
		   below), the same way the left sidebar's own long chapter
		   titles are handled by its dot-leader system rather than by
		   growing the rail. */
		--book-sidebar-w-extended: var(--book-sidebar-w);
		/* Also a plain alias now, not a separate "-normal" indirection —
		   that extra hop only existed so this could keep pointing at the
		   sidebar's UNCRUNCHED width even while Compact mode redefined
		   --book-sidebar-w itself to something smaller. There's no more
		   crunched value to diverge from: the right rail is always
		   255px, docked, at both Compact sub-phases and Full alike (§
		   "COMPACT MODE / STUDY MODE" below — the left sidebar goes
		   off-canvas instead of shrinking in place, so nothing left ever
		   needed a smaller number to distinguish itself from). */
		--book-margin-w: var(--book-sidebar-w);
	}

	/* Variant A (Full stage, ≥1338px) — !important throughout: overriding
	   Quarto's own per-breakpoint grid-template-columns, loaded before
	   this stylesheet — see the matching note on the mobile-zone
	   override above. Outer minmax(0, 1fr) tracks on both edges so the
	   whole block — sidebar, reading column, margin — stays centered on
	   the page the way the rest of the site already does, rather than
	   pinning to the left wall. (A same-day attempt at fixing a separate
	   sidebar-item layout complaint pinned the left edge instead and
	   left the whole site off-center on wide screens — reverted;
	   whatever was actually wrong with the sidebar items needs its own,
	   narrower fix that doesn't touch overall page centering.)
	   Nested in its own min-width:1338px query (inside this file's outer
	   min-width:1120px wrapper, since --book-margin-w is only ever
	   defined there) rather than a bare, unqualified rule — Variants C
	   and D below now cover the entire 1120–1337.98px Compact range that
	   used to fall through to this one by default (only ever winning
	   there because it came first in source order, before those two
	   narrower overrides). Both rails reserved, matching Full's docked
	   look exactly. */
	@media (min-width: 1338px) {
		#quarto-content.page-columns,
		/* #quarto-document-content is its OWN nested CSS grid (also carrying
		   .page-columns — required for a deeply-nested .column-margin
		   element to resolve grid-column: body-end / page-end at all, see
		   the note on .page-full elsewhere in this file), not just a grid
		   ITEM inside #quarto-content above. Its own internal column widths
		   were still coming from Quarto's own default SCSS sizing, never
		   overridden the way the outer grid was — confirmed live: a margin
		   note rendered at 300px wide against this rail's own 255px
		   (var(--book-margin-w)), a mismatch that showed up as a sliver of
		   uncovered note text right at the top edge of the Page Contents
		   box. Mirroring the exact same track list here (not just reusing a
		   shared class) is what actually gives the two grids matching
		   coordinate systems — this is the same reasoning Quarto's own
		   nested .page-columns design already depends on, just extended to
		   cover our own custom widths instead of only its stock ones.
		   section.page-columns does NOT get the same treatment (a version
		   of this rule once included it): a section containing a margin
		   note is ALSO its own nested grid, but recreating a full page's
		   worth of named tracks against a box that's only ~650–800px wide
		   doesn't resolve to anything sensible — the fixed-px tracks
		   (sidebar width, margin width) just overflow it, which is what
		   was actually landing a paragraph in a 255px sidebar-width track
		   instead of the reading column. See the display: block fix by the
		   old grid-column: unset rule elsewhere in this file for how that
		   section-level nesting is avoided now instead of chased here. */
		#quarto-document-content.page-columns {
			grid-template-columns:
				[screen-start] minmax(0, 1fr)
				[screen-start-inset page-start page-start-inset body-start-outset] var(--book-sidebar-w-extended)
				[body-start] 14px
				[body-content-start] 800px
				[body-content-end] 14px
				[body-end body-end-outset page-end-inset page-end] var(--book-margin-w)
				[screen-end-inset] minmax(0, 1fr)
				[screen-end] !important;
		}
	}
	/* justify-content: center — the two outer minmax(0, 1fr) tracks
	   above only center the block when there's actually leftover space
	   to split between them. A CSS grid with overflowing fixed-width
	   tracks and no explicit justify-content defaults to anchoring at
	   the grid's own start edge (screen-start) and letting the excess
	   spill past the end (screen-end) — which is exactly "squeezes the
	   right side from the left" a reader described: the whole three-
	   column block stays pinned to the left, and whatever doesn't fit
	   gets clipped off the right by html's own overflow-x: hidden,
	   rather than the composition shrinking/staying centered as a
	   whole. justify-content: center doesn't change anything when the
	   flex tracks have room to spare (the existing, working case) —
	   it only changes how the SAME overflow gets distributed once
	   there isn't any: symmetrically past both edges instead of
	   entirely past one. Left unconditional here (not nested inside
	   Variant A's own min-width:1338px block above) since Variants C
	   and D below both still carry their own trailing minmax(0, 1fr)
	   track(s) too — this rule is a harmless no-op wherever a variant's
	   own flex track(s) already absorb 100% of any leftover space by
	   definition (Variant D's own comment, below, explains why that's
	   true even with only one flex track instead of two). */
	#quarto-content.page-columns,
	#quarto-document-content.page-columns {
		justify-content: center;
	}

	/* Variant C (Compact — wide, 1180–1337.98px): the left sidebar is
	   off-canvas throughout Compact (§ the consolidated drawer block,
	   above), but the right margin rail stays docked — a track list
	   Variant A doesn't have, since that one either reserves BOTH
	   rails' tracks (Full) or, per Variant D just below, drops the
	   left flex track down to a fixed core padding instead of omitting
	   it the same way. Omits the left-sidebar track and its adjacent
	   gutter entirely, keeps the right-margin track, flanks both sides
	   with minmax(0, 1fr) — this is the "everything comes into a
	   centered view together" reflow a reader described as the whole
	   point of Compact mode: "the whole point of compact mode is to
	   center the website when there's nothing in the left margin —
	   that brings the reading column and the side margin notes into a
	   more centered view together so it's not off-weighted... I can't
	   have it so that if I wanted the whole website to just remain
	   centered the whole time and just turn the menu on and off, I
	   could have just done that without adjusting the template." An
	   earlier attempt scoped this rule away from ≥1200px entirely,
	   assuming the reflow was itself a bug — it wasn't; the real bug
	   was Variant C′ (a second, contradictory copy of this same rule,
	   deleted below) fighting the sidebar's own reveal-position math.
	   Same specificity and !important as Variant A; wins here purely
	   by coming later in the file, inside this narrower media query. */
	@media (min-width: 1180px) and (max-width: 1337.98px) {
		#quarto-content.page-columns,
		#quarto-document-content.page-columns {
			/* body-content-end's own gutter is 10px, not the usual 14px —
			   on request: "it needs to be exactly centered... reading
			   column on the left, the right side margin on the right, both
			   of them together is the total width, and on either side of
			   them, it is exactly centered from the edges of the window."
			   The right margin rail is never actually a grid item (it's
			   position: fixed, independently computed from --book-navbar-
			   bar-left/-width, § its own docked-position rule) — its own
			   real gap from the reading column has always been 10px there
			   (tuned against its own inner boxes, unrelated to this grid's
			   own convention), not the 14px this track reserved for it.
			   Full mode (Variant A, above) has the exact same 10-vs-14
			   mismatch on BOTH its gutters at once, which cancels out
			   invisibly (both flanking 1fr tracks absorb the same excess,
			   still centered) — but this variant only has ONE real gutter
			   (the left sidebar is off-canvas, no left gutter reserved at
			   all), so the same mismatch here was purely one-sided: the
			   grid's own centering math assumed a combined block 4px wider
			   than the reading-column-plus-rail actually rendered,
			   confirmed live as a consistent 4px asymmetry between the two
			   outer margins at every width in this range (e.g. 91px/95px
			   at 1250px). Matching the rail's own real 10px here is what
			   actually centers the true rendered width instead of a
			   slightly-too-generous assumed one. */
			grid-template-columns:
				[screen-start] minmax(0, 1fr)
				[screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] min(800px, calc(100vw - 28px))
				[body-content-end] 10px
				[body-end body-end-outset page-end-inset page-end] var(--book-margin-w)
				[screen-end-inset] minmax(0, 1fr)
				[screen-end] !important;
		}
	}
	/* Same shape as Variant C, extended to ≥1338px whenever Study mode
	   is the reason the left sidebar is gone (rather than width) — a
	   gap in the ≥1338px Study-mode conversion above: that block made
	   the SIDEBAR's own reveal use the same anchored popup at every
	   width, but never told the GRID to stop reserving its track to
	   match, so Variant A (below, unconditional) kept holding a 255px+
	   14px space open for a rail that Study mode had already faded out
	   of it. Confirmed live at 1846px with Layout on: the reading
	   column + margin rail sat at leftGap 523px / rightGap 258px —
	   nowhere near centered, still respecting the phantom left track's
	   own width. On request: "the whole point of compact mode is to
	   shrink it down so that everything, the whole body, is centered
	   in the middle" — true here for exactly the same reason it's true
	   in Compact: there's nothing in the left margin regardless of
	   whether width or Study mode is why. Full width never needs
	   Variant D's own narrow/flush-left snap (≥1338px is always wider
	   than Compact-narrow's own 1180px floor), so this is Variant C's
	   shape alone, not a second sub-phase. */
	@media (min-width: 1338px) {
		html.book-study-mode #quarto-content.page-columns,
		html.book-study-mode #quarto-document-content.page-columns {
			grid-template-columns:
				[screen-start] minmax(0, 1fr)
				[screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] min(800px, calc(100vw - 28px))
				[body-content-end] 10px
				[body-end body-end-outset page-end-inset page-end] var(--book-margin-w)
				[screen-end-inset] minmax(0, 1fr)
				[screen-end] !important;
		}
	}
	/* Variant D (Compact — narrow, 1120–1179.98px): the hard snap a
	   reader asked for — "Compact mode should have no margin on the
	   left side, unless core padding... It should just connect
	   straight to the left side screen when it gets close enough and
	   should snap into place." Identical to Variant C's own track list
	   with exactly one change: the leading minmax(0, 1fr) flex track
	   becomes a flat 14px, the same core-padding figure the true-mobile
	   formula above already uses (half of its own 28px total). Below
	   1180px there's no longer enough room to read as "comfortably
	   centered" rather than "squeezed" (roughly 44px of margin per side
	   at 1180px itself) — 1180px is a judgment call, not a mathematically
	   forced number, and may need live tuning.
	   The right rail keeps its same fixed 255px and gutter, unchanged
	   from Variant C — only the LEFT side's own treatment changes
	   between the two Compact sub-phases, matching a reader's own
	   description: the right side of the screen keeps closing in
	   toward the reading column's own right edge as the window narrows
	   further, right up until nothing's left to give and Mobile begins
	   at the unchanged 1120px floor.
	   No justify-content: center override needed for this narrower
	   track list even though the shared rule above still applies to
	   it: a grid's own explicit trailing minmax(0, 1fr) track always
	   absorbs 100% of any leftover space by definition, so there's
	   nothing left over for justify-content to redistribute — this is
	   intentional, not an oversight, should a future editor go looking
	   for a missing override here. */
	@media (min-width: 1120px) and (max-width: 1179.98px) {
		#quarto-content.page-columns,
		#quarto-document-content.page-columns {
			/* body-content-end's own gutter matches Variant C's own 10px
			   fix, above, for the same reason (the margin rail's real gap
			   from the reading column has always been 10px, not 14px) —
			   this variant isn't centered (no flanking 1fr on the left to
			   balance against), so the mismatch never caused a visible
			   centering bug here, but the real value is still the more
			   accurate one to reserve. */
			grid-template-columns:
				[screen-start] 14px
				[screen-start-inset page-start page-start-inset body-start-outset body-start body-content-start] min(800px, calc(100vw - 283px))
				[body-content-end] 10px
				[body-end body-end-outset page-end-inset page-end] var(--book-margin-w)
				[screen-end-inset] minmax(0, 1fr)
				[screen-end] !important;
		}
	}

	/* ── COMPACT MODE / STUDY MODE ───────────────────────────────────
	   Two independent triggers, same effect on the left sidebar:
	   - html.book-compact-mode — pure width check (< 1338px, no
	     localStorage, no button), set in book-head-includes.html's
	     pre-paint sentinel and kept in sync by book-scripts.html's
	     "floating nav" resize listener. This is Compact: the layout's
	     own automatic response to running out of room, not a reader
	     preference — covering both the wide/centered and narrow/
	     flush-left sub-phases, plus Mobile below that.
	   - html.book-study-mode — the manual, reader-opt-in toggle
	     (book-scripts.html, the mortarboard icon). Also dims the
	     navbar's reader-companion links (further down) — the one piece
	     that's manual-only.
	   Both now just mean "the left sidebar behaves like it's off-canvas"
	   — reusing the EXISTING consolidated drawer/floating-toggle
	   mechanism (§ above, one shared 800–1337.98px range) rather than a
	   separate docked-but-crunched rail. An earlier version kept the
	   sidebar docked at a 56px crunch with its own hamburger-in-place
	   control — reverted on request: "I want it to look exactly like
	   that in the exact same spot [Mobile's own floating toggle]...
	   just like when you're in the third stage, it's already doing the
	   thing anyway." What's left here is just the navbar's own title
	   relocation and nav-link right-alignment — the sidebar itself no
	   longer needs any special-casing beyond already being off-canvas. */

	/* Title moves into the navbar itself instead of a sidebar-slot icon
	   (a reader tried a Home icon there and didn't like it — removed).
	   .book-mobile-brand already exists exactly for "site title, normal
	   navbar-brand sizing, no auto-scale-to-fill" (see its own comment
	   above, § "the lightweight clone") — normally only shown <1338px,
	   since .book-sidebar-title's own copy in the docked rail already
	   covers ≥1338px. Compact/Study mode hides that rail copy (above)
	   and shows this one instead.
	   First attempt let it flow as a normal flex child of .navbar,
	   sharing space with .navbar-container (the nav-link row) — but
	   .navbar itself is deliberately only as wide as the reading column
	   (§ its own comment, "I don't want it to be any wider than the
	   edge of this website"), and the two together didn't fit, so the
	   title silently truncated to "The Inversio…" via its own
	   overflow:hidden/ellipsis (confirmed live, not a hypothetical).
	   Reusing this element's OWN <1338px treatment instead — pulled out
	   of flow with position: fixed, anchored to the true viewport edge
	   via #quarto-header (see that treatment's own comment for why this
	   works regardless of .navbar's narrower box or headroom.js's
	   transform) — gives it as much room as it actually needs, fully
	   independent of .navbar-container's own centered box, which is
	   what "go all the way across, left-aligned" actually needs: a
	   track of its own, not a shared one.
	   left: 0.75rem — matches .book-floating-sidebar-toggle's own left
	   offset exactly (§ above) — true at narrow widths, where the
	   reading column sits close to the true viewport edge anyway. Broke
	   once Study mode could be turned on at full desktop width, though:
	   confirmed live at 1550px, the reading column started at x=316
	   while a flat 0.75rem left the title/icon stranded at x=13, over
	   300px of empty dark margin away from "the book" — a reader's own
	   report, "the title... is not where it needs to be, right up on
	   top of the body of the book." max(0.75rem, ...) keeps the narrow-
	   width behavior (the reading column's own left edge is already
	   close to 0.75rem there, so that branch wins) while switching to
	   tracking the reading column's own measured left edge, minus a
	   fixed icon-width gap, once that gap would otherwise grow large —
	   adaptive across the whole range instead of needing its own
	   breakpoint.
	   The title itself doesn't share the icon's own left offset, though
	   — a reader flagged it separately: "I want the Inversion of
	   Greatness to be inside the top menu. I don't want it to hang over
	   the left." The icon sits a fixed gap outside the navbar bar's own
	   edge (so it reads as a floating control, not part of the bar's
	   content); the title tracks the bar's actual left edge instead,
	   with a small inset so it doesn't sit flush against it — which is
	   exactly wrong for the icon, which needs to read as separate from
	   the bar's own content. */
	html.book-compact-mode .book-mobile-brand,
	html.book-study-mode .book-mobile-brand {
		display: flex !important;
		position: fixed;
		left: calc(var(--book-navbar-bar-left, 0) + 12px);
		top: 0;
		height: 52px;
		flex: 0 0 auto;
	}
	/* The REAL fix for the truncation this alignment change caused
	   (confirmed live: "The Inversion of G." colliding straight into
	   "Home" at 1160px) — not a nav-container spacing issue after all.
	   .book-mobile-brand's own 992–1199.98px sub-range rule (§ above,
	   "Was min-width: 992px too") sets max-width: clamp(90px, ...,
	   195px) !important, sized for when this element used to be a
	   normal flex child sharing row space with the inline nav-link row
	   in THAT range's own (non-compact) layout. It was left unmoved
	   when Compact/Study mode was built — wrongly: once this element is
	   position: fixed here (above), it's no longer in that flex row at
	   all and doesn't need to squeeze for it, but the old clamp still
	   applied anyway (measured live: rendered width 174px at 1160px,
	   matching that formula exactly), silently truncating the title via
	   its own overflow: hidden regardless of how much real room existed. */
	html.book-compact-mode .book-mobile-brand,
	html.book-study-mode .book-mobile-brand {
		max-width: none !important;
	}
	/* Removing the max-width above returns the title to its full,
	   untruncated rendered width (~202px at its base 1rem) — but
	   measured live, that's still ~60-70px more than the actual gap
	   between the hamburger-aligned start point and "Home" at every
	   width in this range (not just the narrow end — the shortfall was
	   confirmed consistent from 1120px to 1199px).
	   First attempt shrunk the title's own font instead of moving the
	   nav-links — reverted on request ("still tiny ass... top menu is
	   not right aligned"). The actual fix is the one originally asked
	   for: pull .navbar-collapse (the nav-link row) out of
	   .navbar-container's own box the same way .book-mobile-brand
	   already escaped it above, position: fixed against the TRUE right
	   edge instead of sitting inside a box that's deliberately only as
	   wide as the reading column. margin-left: auto on .navbar-
	   container (tried earlier) never worked because that container is
	   already ~96% of its own bar's width — there was no slack inside
	   it to push into. Anchoring to where the DOCKED MARGIN RAIL itself
	   starts (var(--book-navbar-bar-left) + var(--book-navbar-bar-
	   width) + 10px, the exact left-edge formula #quarto-margin-sidebar
	   itself uses) lands the nav row's own right edge well clear of
	   .book-margin-tools (the icon cluster, which hugs the margin
	   rail's own far-right edge instead), recovering real room instead
	   of borrowing it from the title's own legibility. */
	html.book-compact-mode .navbar-collapse,
	html.book-study-mode .navbar-collapse {
		position: fixed !important;
		top: 0 !important;
		/* -10px above used to land "Resources" flush against the bar's own
		   right edge — confirmed live, a 0px gap, while the title (left
		   edge, above) sits ~22px inside the bar's own left edge. A reader
		   flagged the asymmetry directly: "Resources should also have that
		   same amount of space between it and the edge of the book." +12px
		   (a 22px swing from the old -10px) brings the right side in to
		   match. */
		right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0) - var(--book-navbar-bar-width, 0) + 12px) !important;
		left: auto !important;
		height: 52px;
		display: flex !important;
		align-items: center;
	}

}
/* Same fixed-positioning treatment as the min-width: 1120px block just
   above, extended down to cover the REST of Compact mode where
   Bootstrap's own hamburger toggler is already hidden (992-1119.98px)
   — that range had no equivalent rule at all, so once the window
   narrowed past 1120px, .navbar-collapse fell back to Bootstrap's own
   default (position: static) even though html.book-compact-mode was
   still active. A static-positioned .navbar-collapse sits in NORMAL
   DOCUMENT FLOW instead of floating over the page — confirmed live as
   the actual mechanism behind two things reported together: nav items
   that had just been hidden for space reappeared once static
   positioning changed how the row gets measured, and the reading
   column visibly got pushed down by the row's own height landing in
   flow above it ("I feel like it's kicking the big menu down... that's
   the reason why the whole reading column drops down" — confirmed
   exactly right). Duplicated rather than widening the block above's
   own min-width, since that block also holds several other
   sub-ranged rules (1338px/1180-1337.98px/1120-1179.98px) not meant to
   move. min-width: 992px specifically, NOT 800px down to where
   book-compact-mode itself starts: a first attempt used 800px and
   broke the true 800-991.98px range instead of fixing it — confirmed
   live, nav items rendered as a vertical stack spilling down the
   right edge of the page. Root cause: below 991.98px Bootstrap's own
   navbar-toggler takes over and .navbar-nav is expected to stay
   collapsed/hidden until the hamburger is clicked (updateNavPriority
   Collapse itself, resources/book-scripts.html, early-returns whenever
   the toggler is visible, for the same reason); forcing position:fixed
   + display:flex on it down there fought that collapsed state instead
   of complementing it. 992px is exactly where the toggler itself goes
   display:none (§ .navbar-toggler's own media query), matching the
   condition the JS function already gates on. */
@media (min-width: 992px) and (max-width: 1119.98px) {
	/* Centered, not right-anchored like the Compact-mode block above
	   this shares its position:fixed/display:flex mechanism with — on
	   request: "the menu that's on top... needs to be centered to the
	   in plain terms, author's notes, appendices, references...
	   [currently] only right aligned on the compact mode, [should not
	   be] on the subcompact mode." left: 50% + translateX(-50%) centers
	   this row's own fixed width (551.66px, confirmed live) in the
	   viewport directly, rather than anchoring one edge to the reading
	   column like the Compact-mode copy does — this range doesn't have
	   the docked left/right rails Compact still needs to clear space
	   for, so there's no reading-column-relative position left to
	   preserve here. */
	html.book-compact-mode .navbar-collapse,
	html.book-study-mode .navbar-collapse {
		position: fixed !important;
		top: 0 !important;
		left: 50% !important;
		right: auto !important;
		transform: translateX(-50%);
		height: 52px;
		display: flex !important;
		align-items: center;
	}
}

/* Study mode's own navbar dimming REMOVED on request — used to fade
   the reader-companion on-ramp links (In Plain Terms, Author's Notes,
   Connect) to 0.45 opacity in Study/Compact mode, restoring full
   opacity on hover/focus. A reader reversed that call outright: "none
   of the links on the top menu dim... all of the link items on the
   top just stay the same color." Every navbar link now stays at full,
   undimmed opacity in Study/Compact mode, same as Full mode. Reading
   Guide's own separate treatment (fully hidden, not dimmed, in Study
   mode) is untouched below — a distinct decision this request wasn't
   about. */
/* Reading Guide specifically: fully hidden in Study mode rather than
   just dimmed like its former group-mates above — a reader's own
   reasoning: "if it's an introductory thing, then compact mode is
   people actually getting into it, they're not being introduced
   anymore." Unlike In Plain Terms/Connect/Author's Notes (each useful at any
   point in a reading session), a guide to how to approach the book has
   nothing left to offer once a reader is deep enough in to have
   switched on a focused-reading layout — dimming still left it taking
   up space for something no longer relevant. This does cut against the
   "keep everything reachable, just dim it" call the group above was
   built on ("I don't know if we actually need to remove anything...
   just dim the stuff that's not really necessary, but keep all of
   it") — a later, narrower reversal for this one link specifically,
   not a rejection of that reasoning for the other three. */
html.book-study-mode .navbar-nav > li.nav-item:has(a[href$="/reading-guide.html"], a[href$="/reading-guide"]) {
	display: none;
}

/* A same-day "Stage 2" fix used to live here — a second, separate
   grid-template-columns declaration for #quarto-content.page-columns/
   #quarto-document-content.page-columns scoped to @media (min-width:
   992px), reusing var(--book-sidebar-w-extended) and var(--book-
   margin-w). REMOVED — it was both redundant and silently broken.
   Redundant: the max-width: 1199.98px block above (§ "keep the whole
   composition centered") already covers this entire sub-1200px range
   on its own, with a pure min(800px, calc(100vw - 28px)) formula that
   holds the reading column at a flat 800px from 1200px down to
   ~828px, then shrinks gracefully below that — exactly the behavior
   this block was independently trying to (re-)achieve. Broken: both
   --book-sidebar-w-extended and --book-margin-w are only ever DEFINED
   inside :root within @media (min-width: 1200px) — confirmed live,
   getComputedStyle at any width below that returns an empty string
   for both. A grid-template-columns value containing an unresolvable
   var() with no fallback is invalid at computed-value time for the
   WHOLE declaration, and since this rule shared the other block's own
   selector, specificity, and !important (making it win the cascade
   purely by appearing later in the file) before that invalidity was
   ever detected, the outcome wasn't "the next-highest-priority rule
   takes over" — it was grid-template-columns quietly resolving to its
   own initial value, none, for this rule's own selector. That
   collapsed #quarto-content's grid down to a single implicit,
   content-sized column across the ENTIRE 992–1199.98px range, on
   every page: #quarto-document-content (screen-start/screen-end,
   Quarto's own generic .page-full rule) lost its intended full-bleed
   box entirely, confirmed live at 650px wide instead — exactly
   matching its own max-width: 650px child constraint with nothing
   left over, which is what an implicit auto-sized track does with a
   650px-wide piece of content and no explicit sizing telling it
   otherwise. Every symptom reported this session inside this range —
   the reading-column background painting in the wrong place, a
   reader's own screenshot showing a dark overlay across part of the
   page, "the right side column isn't showing up" — traces back to
   this one collapse, not to any of the individual pieces (the
   background pseudo-element, the mobile-drawer rail-mode logic) that
   got investigated and adjusted along the way while chasing it. */

/* Back to the original 1200px+ block this rule always lived in — the
   fixed-width-reading-column rule just above needed its own wider
   992px range (see its own comment), but .nav-footer and everything
   else that follows here was never part of that ask and stays scoped
   to 1200px same as before. */
@media (min-width: 1120px) {
	/* .nav-footer sits outside #quarto-content entirely (a sibling under
	   <body>, not a grid item), so its own justify-content:center centers
	   against the full viewport width — not the reading column above it.
	   The left sidebar (--book-sidebar-w) and right margin rail
	   (--book-margin-w) aren't the same width (280px vs 300px at rest), so
	   viewport-centered text lands measurably off from the actual white
	   column's own center, confirmed live (~22px right of true center).
	   Padding the footer by those same two variables narrows its box to
	   match the reading column's own footprint, so centering inside it
	   lines up with the column above rather than the screen edges.
	   !important: Quarto's own base CSS carries a higher-specificity
	   compound selector for this same property (footer.footer .nav-footer
	   { padding-left/right: 1em }, specificity 0-2-1 vs. this rule's bare
	   .nav-footer at 0-1-0) — confirmed live via the matched-rules
	   cascade that it wins over this rule on specificity alone,
	   regardless of source order, without !important here. */
	.nav-footer {
		padding-left: calc(var(--book-sidebar-w) + 14px) !important;
		padding-right: calc(var(--book-margin-w) + 14px) !important;
	}

}

/* Compact/Study mode: the padding formula just above assumes BOTH
   sidebars are docked, each eating a fixed, known width next to the
   reading column — true only at the Full stage (≥1338px, book-
   compact-mode off). Once either off-canvas trigger is active
   (book-compact-mode, any width below 1338px; book-study-mode, the
   reader's own toggle, which can be on even at full desktop width)
   the left sidebar stops reserving that space, and the reading
   column's own left edge shifts — but the right margin rail's dock
   state is governed entirely by its own separate width-based media
   queries, not by these two classes, so a reader can easily be in
   Study mode with the left sidebar off-canvas and the right rail
   still docked, an asymmetric layout the sidebar-width formula can't
   express at all. Confirmed live: the footer stayed centered on the
   full viewport instead of the reading column in Compact mode,
   visibly off-center against the white column above it.
   --book-navbar-bar-left/-width are the same JS-measured reading-
   column bounds the floating navbar and popups already anchor to
   (book-scripts.html's "floating nav" resize listener) — using them
   here instead of the sidebar-width assumption keeps this correct
   through every combination of the two triggers, not just the one
   sidebar-width math happened to get right. */
html.book-compact-mode .nav-footer,
html.book-study-mode .nav-footer {
	padding-left: var(--book-navbar-bar-left, 0) !important;
	padding-right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0) - var(--book-navbar-bar-width, 0)) !important;
}

/* #quarto-sidebar's own docked positioning is 1338px-only (the Full
   stage floor): the left sidebar has no docked state anywhere in
   Compact (1120–1337.98px) — it's off-canvas throughout, reusing the
   consolidated drawer mechanism (§ above) — so this rule must stop
   firing below 1338px or the two would fight over position/width with
   roughly equal !important specificity, source order deciding the
   winner unpredictably. #quarto-margin-sidebar (right rail) is
   unaffected and stays docked down to 1120px, hence its own block,
   and .book-sidebar-title/.sidebar-menu-container further below,
   split out the same way for the same reason — they're both the left
   rail's own content. */
@media (min-width: 1338px) {
	/* #quarto-sidebar and #quarto-margin-sidebar aren't literally grid
	   items (sidebar:style:floating keeps the left rail position:sticky,
	   outside the true grid; the right rail's own width is likewise set
	   independently of its grid track) — their own width has to be
	   pinned to the same variables directly, or they'd drift out of
	   sync with the track sizes above and either gap or overlap the
	   reading column. */
	#quarto-sidebar {
		width: var(--book-sidebar-w-extended) !important;
		/* position: fixed, not the sticky Quarto's own floating-sidebar
		   template sets by default — a reader wanted the sidebar to
		   never move at all during scroll, not even sticky's normal
		   "stays in flow until the threshold, then catches up" feel.
		   Fixed removes it from the grid entirely (a position: fixed
		   element doesn't participate in grid layout — confirmed live,
		   the reading column's own position didn't shift at all once
		   this landed), so its position has to be computed independently
		   instead of inherited from the grid column it used to occupy.
		   top: 64px — pushed back down off the flush-0 it briefly held
		   (matching the reading column and right rail, both still at 0):
		   a reader wanted the top menu to drop down to just above the
		   title, with the title itself landing roughly where the search
		   box used to sit (measured live: 74px), then nudged up "just a
		   touch" from there to 64px. Left as this side rail's own
		   number, not shared with the reading column/right rail's 0 —
		   only this box was asked to move.
		   right (not left), anchored purely to --book-navbar-bar-left
		   (JS-measured, §19's setBarBounds) with the grid's 4px gutter —
		   was left: calc(--book-navbar-bar-left - 4px - --book-sidebar-
		   w-extended), which mixed that same JS-measured value with
		   --book-sidebar-w-extended (a pure CSS clamp(), always
		   instantly current). A reader dragging the window narrower live
		   saw this rail transiently overlap the reading column with a
		   stray horizontal scrollbar, self-correcting once the drag
		   stopped — the two inputs briefly disagreeing mid-drag, since
		   only one of them waits on a JS resize-event handler. right +
		   an explicit width lets the browser resolve this rail's own
		   actual left edge from (this one JS anchor) minus (the live CSS
		   width) natively, in the same synchronous layout pass as the
		   width itself, the same way the right rail's own two inputs
		   (--book-navbar-bar-left/-width, §24) were already both from
		   that one measurement pass and never had this bug. */
		position: fixed !important;
		top: 64px !important;
		left: auto !important;
		/* will-change: auto — Quarto's own bundled sidebar CSS sets
		   will-change: top on this element (confirmed live via
		   getComputedStyle; not anything in this file), presumably left
		   over from before this rail was converted to position: fixed —
		   a will-change hint promotes the element to its own GPU
		   compositing layer, which nested position: fixed descendants
		   (.book-margin-tools, nav#TOC, both living inside this rail)
		   can fall on the wrong side of during compositing. Confirmed
		   live and via a reader's own screenshot: the whole right-hand
		   icon row rendered with fully correct layout geometry (position,
		   size, color, opacity, z-index all checked individually) but
		   painted nothing — genuinely invisible, though still clickable,
		   the textbook symptom of a layer that computed correctly but
		   never got composited into the final frame. A freshly-injected
		   test element with no relation to this rail's own CSS painted
		   fine in the same region, ruling out a general rendering
		   problem — this rail's own compositing-layer hint was the
		   actual cause. !important: matching this file's own existing
		   convention on every other property in this rule, needed here
		   too since Quarto's own rule already carries real specificity. */
		will-change: auto !important;
		/* +10px, not +4px — this invisible rail's own right edge landed
		   6px further right than .book-sidebar-title/.sidebar-menu-
		   container's own right edge (both now on the shared 10px gap,
		   above), poking out past them toward the reading column. A
		   reader spotted this directly in the debug-outline tool: a small
		   red sliver sticking out past the inner boxes' own outline on
		   both rails. Matching the same 10px here removes it — this rail
		   and its two inner boxes now share one gap value, not two. */
		right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0) + 10px) !important;
		max-height: calc(100vh - 64px) !important;
		/* Quarto's own bundled CSS sets this element's z-index: 1 —
		   position: fixed + a non-auto z-index establishes its own
		   stacking context, which traps .book-sidebar-title's later
		   z-index: 1071 (below) inside it: a descendant's z-index only
		   ever competes within its nearest ancestor's own stacking
		   context, never past it. #quarto-header (§19) sits at z-index:
		   1070 in the real root context, well above this rail's trapped
		   1 — confirmed live (elementFromPoint over the title landed on
		   the header, not the title link, until this was raised). 1071
		   here, matching .book-sidebar-title itself, is what actually
		   lets the title escape being covered. !important: Quarto's own
		   positioning script sets z-index: 5 as an inline style (confirmed
		   live via getAttribute('style')) — inline styles beat an external
		   stylesheet at any specificity short of !important. */
		z-index: 1071 !important;
	}
}

/* Same will-change: top trap as #quarto-margin-sidebar's own ≥1120px
   fix just below (that rule's own comment has the full "confirmed
   live, painted nothing" account) — Quarto's bundled sidebar CSS sets
   this unconditionally, not just ≥1120px, so the same invisible-
   descendant bug hits .book-margin-tools (the Font/Palette/dark-mode/
   Search icon row, a position: fixed descendant of this rail) below
   1120px too — confirmed live at 500px: Font and the dark-mode toggle
   had fully correct geometry (elementFromPoint found them, opacity:1,
   visibility:visible) but painted nothing, the exact same symptom —
   "there needs to be a [font toggle] and [dark mode toggle]... on the
   top menu on mobile" turned out to mean they were already there,
   just invisible. Split into its own rule here rather than widening
   the ≥1120px block's own range, since that block sets several other
   properties (width, position, left, padding-top, z-index) tuned
   specifically for the always-docked rail, none of which apply to
   this rail's off-canvas states below 1120px. */
@media (max-width: 1119.98px) {
	#quarto-margin-sidebar {
		will-change: auto !important;
	}
}
@media (min-width: 1120px) {
	#quarto-margin-sidebar {
		width: var(--book-margin-w) !important;
		/* Same reasoning as #quarto-sidebar above — fixed instead of
		   sticky, left computed off the same --book-navbar-bar-left/
		   -width pair (reading column's own right edge + the grid's
		   14px gutter). top: 64px, matching the left rail exactly (used
		   to be 28px, independently tuned so this rail's own icon row
		   lined up with the left rail's title text rather than its
		   box) — a reader wanted the two rails to actually read as the
		   same kind of box now, same top, not just visually close once
		   each one's own padding was accounted for. padding-top drops
		   to 1rem to match (below) for the same reason: with both
		   boxes now starting at the same y, keeping the old 2.1rem here
		   would have put this rail's own content noticeably lower than
		   the left rail's, undoing the alignment top: 64px was just
		   asked to fix. */
		position: fixed !important;
		top: 64px !important;
		padding-top: 1rem !important;
		/* will-change: auto — same fix, same reason as #quarto-sidebar's
		   own identical override above (its own comment has the full
		   explanation): Quarto's bundled CSS sets will-change: top here
		   too, which was the actual cause of this rail's own icon row/
		   nav#TOC painting nothing despite fully correct layout. */
		will-change: auto !important;
		/* +10px, not +14px — same fix as #quarto-sidebar's own right
		   value above: this invisible rail's own left edge landed 4px
		   further right than .book-margin-tools/nav#TOC's own left edge
		   (both now on the shared 10px gap, above), poking out past them
		   away from the reading column — the matching sliver a reader
		   spotted on this side in the debug-outline tool.
		   */
		left: calc(var(--book-navbar-bar-left, 0) + var(--book-navbar-bar-width, 0) + 10px) !important;
		max-height: calc(100vh - 64px) !important;
		/* Same stacking-context trap as #quarto-sidebar above (this
		   element's own bundled z-index: 5, not this file's own) —
		   see that rule's comment for the full reasoning. !important
		   for the same reason: this element's z-index: 5 is also set as
		   an inline style by Quarto's own script.
		   1071 -> 1075: this element ALSO gets z-index: 5 set as an
		   inline style directly by resources/book-scripts.html's own
		   rescueMarginSidebar() (a second, independent script, not
		   Quarto's) — confirmed live this !important rule already beats
		   that inline 5 the same way it beats Quarto's own, so the
		   rail's real computed z-index was already 1071, not 5. That
		   still wasn't enough once #book-margin-fade-scrim (built later,
		   z-index: 1073, its own comment explains why) was added as a
		   SIBLING of this rail, not a descendant: raising a CHILD's own
		   z-index (.book-margin-tools, above) can't help here — a
		   descendant's z-index only ever competes within its nearest
		   ancestor's own stacking context, and this rail (position:
		   fixed with a non-auto z-index) IS that context, trapping every
		   child inside it at whatever level THIS rail itself sits.
		   Confirmed live and via a reader's own report: the whole right-
		   hand icon row painted with fully correct geometry/color/font
		   but was invisible, sitting directly behind the scrim's own
		   solid fill (which happens to exactly match the surrounding
		   chrome color) — genuinely covered, not just visually similar.
		   1075 clears the scrim's 1073 with the same one-level margin
		   the icon row's own now-redundant 1074 already used. */
		z-index: 1075 !important;
	}
	/* Notes mode: the per-child backgrounds on .book-margin-tools/
	   #toc-title (above) mask a scrolling note wherever those two boxes
	   themselves paint, but this rail's own box starts at top: 64px —
	   whatever's above that (down to the true viewport top, y:0) is
	   outside both children entirely, normally covered by the navbar
	   sitting right there instead. headroom.js hides that navbar on
	   scroll-down, though, and #quarto-margin-sidebar's own top: 64px
	   doesn't move to compensate — a reader's own screenshot showed
	   stray note text ("3 A1") bleeding through in exactly that gap
	   once the navbar had scrolled away, plus a second, thinner leak
	   right at the seam between the icon row and the label itself
	   (.book-margin-tools' own margin-bottom, which neither child's
	   background covers — margin is painted by neither box, only the
	   space between them). Both gaps belong to the same rail, so one
	   fix at the rail level closes both at once: extend this box's own
	   top edge to the true viewport top and give IT the solid fill,
	   with padding-top compensating so everything inside still starts
	   exactly where it used to sit. Real content now paints on top of
	   one continuous opaque box, not two separate patches with seams
	   between them. */
	html[data-book-rail-mode="notes"] #quarto-margin-sidebar {
		top: 0 !important;
		max-height: 100vh !important;
		padding-top: calc(64px + 1rem) !important;
		background-color: var(--book-chrome-bg-solid) !important;
	}
	/* Converted to position: fixed, same as .sidebar-menu-container on
	   the opposite rail (§9) — used to stay in #quarto-margin-sidebar's
	   own flow at a width derived from that rail's own padding stack
	   (--book-sidebar-w minus 53px), which came out 227px, a fourth
	   width distinct from the other three boxes'. Now independently
	   positioned with the same 10px reading-column gap as .book-margin-
	   tools/.book-sidebar-title/.sidebar-menu-container, instead of
	   tracking this rail's own box model. width: var(--book-margin-w)
	   (not a flat 255px literal) — a reader wanted ONE governing width
	   shared by the invisible rail and every visible box inside it; this
	   variable is that one shared number (currently capped at 255px,
	   see its own declaration above). top: var(--book-navbar-height,
	   52px), matching .sidebar-menu-container's own fix on the opposite
	   rail (same comment there has the full reasoning) — flush with the
	   reading column's own visible top edge instead of sitting 9px below
	   it. */
	#quarto-margin-sidebar nav#TOC {
		position: fixed !important;
		top: var(--book-navbar-height, 52px) !important;
		left: calc(var(--book-navbar-bar-left, 0) + var(--book-navbar-bar-width, 0) + 10px) !important;
		width: var(--book-margin-w) !important;
		margin-top: 0 !important;
	}

	/* .book-sidebar-title/.book-margin-tools now float independently of
	   these rails (pulled out of flow, position: fixed, own top/left/
	   width) — a reader wanted them to line up with the floating
	   navbar's own nav-link row above instead of sitting inside the
	   chapter-list/TOC rail below. Left/width computed off the same
	   --book-navbar-bar-left/-width pair every other floating element in
	   this file uses, with a 31px gap on each side (matching the gap the
	   two rails' own text already sat at from the reading column,
	   measured live before this change) — so the two boxes land
	   symmetrically distant from the reading column by construction, not
	   by coincidence of leftover padding math. Shared 255px width (the
	   icon row's own natural width, the wider of the two) — text-align:
	   right on the title keeps its own auto-scaled text hugging the
	   reading-column-facing edge instead of drifting into the new open
	   space on its left. top values bottom-align both boxes with the
	   nav-link row's own text (measured live: bottom ~46px from viewport
	   top). Removing each from its rail's flow leaves a gap there — the
	   chapter list/TOC below compensate with their own margin-top, so
	   neither one's own position moves. z-index: 1071 on both — this
	   new top position now overlaps #quarto-header's own vertical band
	   (0–52px), and that header carries z-index: 1070 (§19) with no
	   z-index of its own here, so without this the (visually transparent)
	   header was silently intercepting every click meant for the title
	   link/icon row underneath it — confirmed live via Playwright
	   (page.click timing out, "header intercepts pointer events"). One
	   above the header's own value is enough. top: 13.24px, not the
	   21.8px this was — a reader pointed out the line-box-bottom match
	   this originally used doesn't actually align the visible glyphs:
	   the nav-link row's own <a> elements are all sized by the row's
	   tall line-height (its box runs 40.5px, way past any actual
	   glyph), not shrink-wrapped to "Home"'s own letterforms, so
	   matching box-bottoms left the title's own text sitting ~8.5px
	   lower than "Home"'s text, not level with it. Measured live via
	   Range.getBoundingClientRect() on each element's own text node
	   (the tight glyph box, ignoring line-height padding): "Home" tight-
	   bottom 35.23px, this title's own tight-bottom 43.80px at the old
	   21.8px top — 8.5625px is that gap, subtracted from the old value. */
	/* All four boxes — title, tools, and both content boxes below —
	   share one flat spec now: width var(--book-sidebar-w)/var(--book-
	   margin-w) (currently capped at 255px, see that variable's own
	   declaration above — no more independent 255px literals on each
	   box), 10px gap to the reading column, on both sides. A reader
	   flagged the four as visibly asymmetric after using the layout-
	   debug tool to outline them (confirmed live: gaps of 4/31/20px on
	   the left and 14/27/31px on the right — four different values on
	   each side, nothing actually matching despite several earlier
	   rounds each independently tuning one box at a time). 10px
	   replaces the old 31px (title) and 27px (tools, itself a glyph-vs-
	   box correction off the old 31px) uniformly — this drops that
	   glyph-specific nuance in favor of the same plain, round box-edge
	   gap on every box, matching what the debug tool actually outlines.
	   Switching the width itself from a flat 255px to var(--book-
	   sidebar-w) came a request later: a reader wanted the invisible
	   rail and every visible box inside it governed by one shared
	   number rather than the rail capping at its own 280px while the
	   visible boxes independently held 255px. */
}

/* .book-sidebar-title/.sidebar-menu-container: left rail content,
   split back out to 1338px-only (Full stage) for the same reason
   #quarto-sidebar itself was above — these must stop firing anywhere
   in Compact (1120–1337.98px) now that the left rail goes off-canvas
   there instead of staying docked. */
@media (min-width: 1338px) {
	.book-sidebar-title {
		position: fixed !important;
		/* 13.24px, not 15.24px — this box's text now scales to fill a
		   narrower target (221px content width, inset by the new left/
		   right padding above) than it did before that padding existed,
		   and the resulting slightly different font-size shifted the
		   text's own tight-bottom ~2px off its "Home" nav-link alignment
		   target (measured live: 37.23px vs Home's own 35.23px).
		   Subtracted that 2px straight from the old value. */
		top: 13.24px !important;
		left: calc(var(--book-navbar-bar-left, 0) - 10px - var(--book-sidebar-w)) !important;
		width: var(--book-sidebar-w) !important;
		/* 17px, not the 0 this briefly shipped with, and not the plain
		   1rem it originally had either — a reader compared this rail
		   directly against #toc-title ("Page Contents," the right
		   rail's own equivalent, unrelated to this rail and never
		   touched by any of this) and confirmed live: #toc-title sits
		   exactly 17px inset from its own container's edges on every
		   side, not flush. An earlier pass here zeroed this box's own
		   inset entirely on the theory that "flush" was the actual
		   target (a different reader comment, comparing this box only
		   against .sidebar-menu-container below it, not the opposite
		   rail) — reverted once the real cross-rail reference came back
		   inset, not flush. 17px keyed as a literal px value, not 1rem,
		   so it can't silently drift again if the root font-size ever
		   changes elsewhere. The title-font-scaling script (include-
		   after-body) already subtracts this box's own left/right
		   padding from its target width, so it scales the title down to
		   correctly fill 255 - 17 - 17 = 221px automatically — no
		   separate JS change needed. */
		padding: 0 17px !important;
		text-align: right;
		z-index: 1071;
	}
	/* Converted to position: fixed, same as .book-sidebar-title/.book-
	   margin-tools above — used to stay in #quarto-sidebar's own flow,
	   positioned via a margin-top hack compensating for the title's own
	   departure from that same flow, with its width (227px) just
	   whatever its content-driven box happened to render at. Now
	   independently positioned with the same spec as the other three
	   boxes (width: var(--book-sidebar-w), see the shared-governing-
	   width comment above), rather than a fourth different width/gap
	   combination. top: var(--book-navbar-height, 52px), not a flat
	   60px — a reader wanted this box flush with the reading column's
	   own visible top edge (where main.content's white background
	   actually starts being visible, right at the header's own bottom
	   edge, not 8px below it). --book-navbar-height is the JS-measured
	   live header height (§19, setBarBounds) already used elsewhere in
	   this file for the same "align to where the header ends" purpose,
	   with the 52px fallback matching this header's own resting height
	   at this breakpoint. */
	#quarto-sidebar .sidebar-menu-container {
		position: fixed !important;
		top: var(--book-navbar-height, 52px) !important;
		left: calc(var(--book-navbar-bar-left, 0) - 10px - var(--book-sidebar-w)) !important;
		width: var(--book-sidebar-w) !important;
		margin-top: 0 !important;
	}
	/* Study mode at Stage 1 width cancels this independent fixed
	   positioning entirely (position: static, no left/width override)
	   rather than hiding it outright — confirmed live as a real bug:
	   #quarto-sidebar itself correctly goes off-canvas (its own class-
	   triggered copy, § above), but .sidebar-menu-container is a
	   position: fixed element in its own right, computing its position
	   independently of its parent rather than inheriting it — so the
	   actual chapter list kept rendering at its normal DOCKED location
	   regardless of the parent being off-canvas, the exact "full-ass
	   left menu just out" a reader reported. Reverting to position:
	   static is what the native <1200px off-canvas world already
	   relies on (this rule is scoped to ≥1200px only, so nothing below
	   that width was ever affected) — with no override, this element is
	   just a normal in-flow child of #quarto-sidebar, moving together
	   with it whether off-canvas or open, exactly like it already does
	   below 1200px.
	   width: 100%, not auto — #quarto-sidebar (the parent) is a flex
	   container, and a flex item's own width: auto shrinks to its
	   content's intrinsic size rather than filling the container's
	   cross axis the way a plain block child would.
	   100% resolves against this box's own DOM parent, though — not
	   #quarto-sidebar directly, but .book-sidebar-content (the shared
	   title/search/TOC/chapter-list wrapper, § its own comment) one
	   level in, which carries its own 1rem/27px/1rem/1rem padding of
	   its own, and #quarto-sidebar itself carries a further 20px left
	   padding on top of that (Quarto's own bundled sidebar default,
	   confirmed live via document.styleSheets — nothing in this file
	   sets it). Neither padding was ever a problem before: every child
	   that actually needs to respect them (the ≥1200px OFF case, the
	   <1200px drawer) is either position: fixed (ignores its DOM
	   parent's padding entirely, computing purely against its own
	   positioned ancestor's coordinates instead — same reasoning as
	   .book-sidebar-title, .book-margin-tools, nav#TOC elsewhere in
	   this file) or has a genuinely smaller 300px drawer to work with,
	   where the same ~44px combined padding still leaves plenty of
	   room. This static, 255px-wide case is the one place both losses
	   stack against a budget too tight to absorb them: confirmed live,
	   width: 100% correctly resolved to 191px (255 - 20 - 44), not the
	   255 a reader's own screenshot showed missing, wrapping chapter
	   titles that fit on one line everywhere else ("Expanding the
	   Field," "Maximum Possibility"). Canceling both paddings for this
	   state specifically — not touching either rule's own base
	   declaration, which every OTHER state still needs — hands the
	   inset job entirely to .sidebar-menu-container's own existing
	   0.75rem/1rem padding (§9, already unconditional, already what the
	   position: fixed case's own 255px box relies on for its ~223px
	   content width), so this static case ends up with the exact same
	   footprint instead of two independent inset systems stacking. */
	html.book-study-mode #quarto-sidebar {
		padding-left: 0 !important;
	}
	html.book-study-mode #quarto-sidebar .book-sidebar-content {
		padding: 0 !important;
	}
	html.book-study-mode #quarto-sidebar .sidebar-menu-container {
		position: static !important;
		top: auto !important;
		left: auto !important;
		width: 100% !important;
		margin-top: revert !important;
	}
	/* right-anchored, width: auto — not left: ... + a fixed
	   width: var(--book-margin-w) (255px), which is what this used to
	   be. That fixed width was wider than the icon row's own content
	   (Dim margin/Font), and .book-margin-search-toggle's own
	   margin-left: auto (below) pushed search out to that box's far
	   edge specifically — on request, at the time: "the icon flush
	   against the far edge, not just visually broken out from the
	   rest of the row by some fixed amount." A reader later asked for
	   the opposite — every icon clustered together immediately next
	   to search, not spread across the box's full width — so this
	   flips to anchoring the box's RIGHT edge at the same spot its
	   right edge already sat (nav#TOC's own right edge below it, kept
	   via the same --book-navbar-bar-left/-width/--book-margin-w
	   figures, just converted from a left+width pair to a right
	   value), with width: auto shrinking the box to fit its actual
	   content from there — the same technique the <1200px version of
	   this rule already used (§ above), which never had this gap to
	   begin with. */
}

/* .book-margin-tools: right rail content, back to 1120px (unaffected
   by the left-rail split above — the right margin rail stays docked
   throughout Stage 2). */
@media (min-width: 1120px) {
	.book-margin-tools {
		position: fixed !important;
		top: 16.94px !important;
		left: auto !important;
		right: calc(var(--book-viewport-width, 100vw) - var(--book-navbar-bar-left, 0) - var(--book-navbar-bar-width, 0) - 10px - var(--book-margin-w)) !important;
		width: auto !important;
		/* The real fix for this box being invisible behind #book-margin-
		   fade-scrim lives on #quarto-margin-sidebar's own z-index,
		   above (1071 -> 1075) — this rail is a genuine stacking context
		   (position: fixed + non-auto z-index), so a child's own z-index
		   here only ever competed within THAT context, never against the
		   scrim (a sibling of the rail, not a descendant of it). Left at
		   the plain 1071 every other floating box in this rail shares. */
		z-index: 1071;
	}
}

/* ============================================================
   24. MOBILE: SECONDARY NAV STAYS FIXED, INDEPENDENT OF THE NAVBAR
   headroom.js (quarto-nav.js) hides/shows the header by adding
   .headroom--pinned / .headroom--unpinned to #quarto-header itself,
   which Quarto's bundled CSS turns into transform: translateY(0%) /
   translateY(-100%) on that same element. A transform on an element
   makes it the containing block for any position:fixed descendant
   (per spec) — and .quarto-secondary-nav lives inside #quarto-header,
   so as long as #quarto-header is what's being transformed, the
   secondary nav can never be independently fixed to the real
   viewport; it's only ever fixed relative to its ancestor's own
   (moving) box, so it slides away together with the navbar instead of
   staying put. (An earlier version of this fix tried to solve that by
   moving the secondary nav out to be #quarto-header's sibling via
   JS — fragile, and it depended on that script running before
   anything else touched the DOM. This version doesn't move anything.)

   Fix: stop #quarto-header itself from transforming, and apply the
   exact same transform to its .navbar child instead, still driven by
   the same pinned/unpinned classes (just read via a descendant
   selector rather than relying on the class living on the same
   element). With #quarto-header no longer transformed,
   .quarto-secondary-nav's position:fixed now binds to the true
   viewport — top offset switches between sitting just below the
   visible navbar and snapping up to true top:0 once the navbar's
   hidden, using those same pinned/unpinned classes directly.

   799.98px, not 1199.98px: matches §21's own cutover for
   .quarto-secondary-nav itself — this block exists purely to fix a
   position:fixed conflict that only exists once that bar is actually
   on screen, so its own breakpoint has to track wherever that one
   ends up, not the (now different) point the docked rails disappear
   at.
   ============================================================ */
@media (max-width: 799.98px) {
	#quarto-header.headroom--pinned,
	#quarto-header.headroom--unpinned {
		transform: none !important;
	}
	#quarto-header .navbar {
		transition: transform 200ms linear;
	}
	#quarto-header.headroom--unpinned .navbar {
		transform: translateY(-100%);
	}
	#quarto-header.headroom--pinned .navbar {
		transform: translateY(0%);
	}

	.quarto-secondary-nav {
		position: fixed;
		/* Was a hardcoded 52px — close, but not exact, and the gap
		   between that estimate and the navbar's real rendered height
		   was visible as a sliver of page content showing through above
		   this bar. Now measured live (include-after-body script) and
		   set as a CSS variable, so this always matches exactly. */
		top: var(--book-navbar-height, 52px);
		left: 0;
		right: 0;
		/* Above both drawers (1055/1060) and their shared backdrop
		   (1059) — this bar holds the sidebar/margin toggle buttons at
		   widths below 800px, and without this it got covered by
		   whichever drawer just opened, same issue as the floating
		   toggles above. Staying on top keeps both buttons clickable
		   the whole time a drawer is open, so either one closes it
		   again from the same spot it opened from. */
		z-index: 1070;
		transition: top 200ms linear; /* matches headroom's own transition timing */
		/* Quarto's own default height here is shorter than the navbar's
		   ~52px, which is what left a sliver of the dark chrome
		   background visible below this bar once it's pinned to the
		   true top of the screen. min-height matches it to the navbar.
		   Background stays Quarto's own white in light mode — that was
		   never the problem; the right-side toggle icon being colored
		   white-on-white (fixed below) was. Dark mode's own background
		   is overridden separately just below, though — see that rule's
		   own comment. */
		min-height: 52px;
		/* Without this, .container-fluid (centered internally via the
		   rule below) still sits flush at the *top* of this bar's own
		   taller min-height box — the min-height added the right amount
		   of space, but nothing was centering the content-row within
		   it, leaving the extra space as a visible gap below the text
		   instead of split evenly above and below it. !important: §21's
		   own display:block !important (forcing this bar visible below
		   799.98px) has equal selector specificity and otherwise wins
		   over this plain display:flex regardless of source order,
		   silently reverting the bar to block layout — which is exactly
		   what let .container-fluid go back to sitting flush at the
		   top, undoing the fix this rule exists for. */
		display: flex !important;
		align-items: center;
	}
	/* Near-black in dark mode — same fix, same reasoning, and the same
	   #1c1c1c as .book-running-head's own copy (§ its own comment,
	   above): #222, rgb(20,20,20), #000, #0a0a0a, and #0f0f0f were each
	   tried in turn and each missed in one direction or the other;
	   #1c1c1c is where that search landed. !important: Quarto's own
	   dark stylesheet rule (nav.quarto-secondary-nav, element+class)
	   already carries real specificity of its own, and this needs to
	   beat it regardless of which stylesheet's own link tag happens to
	   load second. */
	body.quarto-dark .quarto-secondary-nav {
		background-color: #1c1c1c !important;
	}
	.quarto-secondary-nav .container-fluid {
		/* Bootstrap's .d-flex doesn't set align-items itself (defaults
		   to stretch), which put the button/breadcrumb/section-text
		   baselines slightly above true center of the bar. */
		align-items: center;
	}
	/* Color is set live in JS now (_quarto.yml, syncSecondaryNavIconColor)
	   — copied straight off the native .quarto-btn-toggle rather than
	   hardcoded here, since Quarto bakes a different literal color into
	   its light vs. dark compiled stylesheet (hsl(0,0%,35%) vs.
	   hsl(0,0%,67.93%)) with no shared custom property either build
	   exposes. A plain hardcoded value here matched exactly one of the
	   two and went visibly wrong (duller than its neighbor) in the
	   other. No !important, deliberately: an inline style (set by that
	   same JS) needs to be able to win over this rule. */
	.mobile-margin-toggle {
		/* Mirrors .quarto-btn-toggle's own margin-left:-0.75rem;
		   margin-right:.15rem (Quarto's bundled CSS) in the opposite
		   direction, so this button sits flush with the true right edge
		   the same way the left toggle sits flush with the true left
		   edge, instead of inset by the container's own right padding. */
		margin-right: -0.75rem;
		margin-left: 0.15rem;
	}
	#quarto-header.headroom--unpinned .quarto-secondary-nav {
		top: 0;
	}

	/* While the mobile hamburger menu is open, the expanded nav-link
	   list grows taller than the collapsed navbar and would otherwise
	   sit underneath (and be partly obscured by) the secondary nav,
	   fixed as it is at a constant top offset. The current-section
	   indicator isn't useful while the reader's attention is on that
	   menu anyway, so just hide it for as long as the menu is open. */
	#quarto-header:has(#navbarCollapse.show) .quarto-secondary-nav {
		display: none;
	}

	/* Extra top clearance for page content so it isn't covered by the
	   fixed secondary nav — quarto-nav.js's own headerOffset() only
	   accounts for #quarto-header's own height, not this. Was + 4px
	   of slack on top of the measured heights, meant to cover a brief
	   window on first paint before Source Serif 4 finishes loading and
	   both bars get re-measured — but the measured custom properties
	   are already accurate once set (confirmed live: navbar-height 52
	   + secondary-nav-height 52 exactly matches the real fixed-chrome
	   bottom edge), so that slack wasn't fixing a real inaccuracy, just
	   overshooting on top of a correct number — permanently, not just
	   during the brief loading window it was meant for. The tradeoff
	   flipped: a reader spotted the permanent cream sliver this left
	   below the secondary nav ("a little border... right above
	   Groundwork"), worse than the rare, brief flash the buffer was
	   guarding against in the first place. */
	body {
		padding-top: calc(var(--book-navbar-height, 52px) + var(--book-secondary-nav-height, 44px)) !important;
	}
}

/* ============================================================
   CONTACT PAGE — contact form (site/contact.qmd). Briefly merged into
   a combined "Read and Connect" page and split back apart the same
   day (2026-08-01) — Support the Work (site/support.qmd) now carries
   the Ko-fi button, this page just the form below.
   Netlify Forms: a plain HTML form with data-netlify="true" and a
   matching name/form-name pair, no JS or backend of this project's
   own involved — Netlify's own build step scans the static HTML output
   for this exact shape and wires up submission handling automatically.
   netlify-honeypot="bot-field" + the hidden .connect-form-hp field is
   Netlify's own recommended spam trap: real visitors never see or fill
   it (visually hidden, not display:none — some bots skip fields that
   are display:none but still fill visually-hidden ones, so this uses
   the same off-screen-positioning trick real accessibility-hidden
   content uses instead), so anything landing in it is safely assumed
   to be a bot and Netlify silently discards the submission.
   ============================================================ */
.connect-form {
	/* Was max-width: 32rem (512px) — narrower than the callout box it
	   actually sits inside, on request: the fields need to be "max
	   width within that padded area... the same distance from their
	   left side to also on their right side." Removed the cap entirely
	   so the form fills its real container (the callout-note box) full
	   width, symmetric insets on both sides instead of a narrower,
	   off-center column. */
	margin: 1.5rem 0;
	display: flex;
	flex-direction: column;
	gap: 1rem;
}
.connect-form p {
	margin: 0;
	display: flex;
	flex-direction: column;
	gap: 0.35rem;
	/* Flex-column's own default align-items: stretch should already
	   make block children fill this row's width, but <input>/<textarea>
	   are replaced form elements with their own intrinsic sizing (a
	   native ~20-character default) that doesn't reliably yield to
	   stretch alone in every browser — width: 100% below is the actual,
	   explicit fix; this comment just documents why it's needed even
	   though the layout looks like it should already do this for free. */
	width: 100%;
}
.connect-form label {
	font-family: var(--book-body-font);
	font-size: 0.9rem;
	color: var(--book-muted);
}
.connect-form input[type="text"],
.connect-form input[type="email"],
.connect-form textarea {
	font-family: var(--book-body-font);
	font-size: 1rem;
	color: var(--book-text);
	background-color: var(--book-bg);
	/* var(--book-border) is a warm cream/tan in light mode (#d8cebc) —
	   part of the same "yellow" reaction the focus-state fix above
	   addresses, even at rest. Light-mode-only override just below
	   swaps it for a plain neutral gray; dark mode keeps this same
	   var(--book-border) unchanged, confirmed fine as-is. */
	border: 1px solid var(--book-border);
	border-radius: 4px;
	padding: 0.6em 0.75em;
	/* The actual fix for full-width fields — see .connect-form p's own
	   comment just above for why flex-stretch alone wasn't enough.
	   box-sizing: border-box so the field's own border/padding count
	   inward from that 100%, instead of adding to it and overflowing
	   its container by a few px. */
	width: 100%;
	box-sizing: border-box;
}
body:not(.quarto-dark) .connect-form input[type="text"],
body:not(.quarto-dark) .connect-form input[type="email"],
body:not(.quarto-dark) .connect-form textarea {
	border-color: #ccc;
}
.connect-form input[type="text"]:focus,
.connect-form input[type="email"]:focus,
.connect-form textarea:focus {
	outline: none;
	/* Was var(--book-link) — the site's gold link/accent color
	   (#a07828 in light mode), on request dialed back to a neutral
	   gray here specifically: "I don't like how yellow the form
	   looks... dial it back and be kind of grayish." Dark mode was
	   confirmed fine as-is, so this only changes the light-mode
	   default; the override just below restores --book-link for dark
	   mode specifically. */
	border-color: var(--book-muted);
}
body.quarto-dark .connect-form input[type="text"]:focus,
body.quarto-dark .connect-form input[type="email"]:focus,
body.quarto-dark .connect-form textarea:focus {
	border-color: var(--book-link);
}
.connect-form textarea {
	resize: vertical;
	font-family: inherit;
}
.connect-form button[type="submit"] {
	align-self: flex-start;
	font-family: var(--book-body-font);
	font-size: 0.95rem;
	font-weight: 600;
	color: var(--book-bg);
	background-color: var(--book-link);
	border: none;
	border-radius: 4px;
	padding: 0.6em 1.75em;
	cursor: pointer;
	transition: opacity 150ms ease;
}
.connect-form button[type="submit"]:hover {
	opacity: 0.85;
}
/* Off-screen, not display:none — see the file-header comment above for
   why this specific hiding technique matters for a spam-trap field. */
.connect-form-hp {
	position: absolute;
	width: 1px;
	height: 1px;
	overflow: hidden;
	left: -9999px;
}
/* Format-download and Support links: a small icon to the left of each
   plain-text link, matched by href rather than a wrapper class since
   the links themselves are authored as plain Notion markdown, not raw
   HTML. Bootstrap Icons ship pre-bundled with Quarto's own theme (no
   new dependency) — codepoints below are copied straight out of the
   bundled bootstrap-icons.css. Replaces the old Ko-fi *button widget*
   treatment entirely (author decision: "drop the default Ko-fi button
   widget... a plain coffee-cup icon... to the left of a plain text
   link, the same link format as the other things") — the
   .connect-kofi-row/.connect-kofi-caption rules this used to live
   under are gone with it, since there's no button+caption row left to
   lay out. */
/* bi-file-earmark-pdf — plain, unbranded Bootstrap glyph rather than
   Adobe's own PDF mark: Adobe's icons/legal page reserves third-party
   use of its product icons for partnership agreements, so this stays
   generic rather than reproducing their actual trademark. */
a[href$="the-inversion-of-greatness.pdf"]::before {
	font-family: "bootstrap-icons" !important;
	font-style: normal;
	font-weight: normal !important;
	display: inline-block;
	margin-right: 0.4em;
	vertical-align: -0.1em;
	content: "\f63e";
}
/* Support link: a real button rather than Ko-fi's own static image
   (resources/kofi-button-dark.png, now unused — kept on disk in case
   this reverts) — the fixed text baked into that PNG couldn't say
   "Support the work" instead of "Support me on Ko-fi", so this
   reproduces its exact look (sampled the real button's own background
   pixel: solid black, rgb(0,0,0)) as a genuine styled <a>, free to
   carry whatever text is wanted. bi-cup-hot rather than the multi-
   color Ko-fi symbol mark for the icon — that mark's own white halo
   layer (meant to sit on varied backgrounds) hasn't been tested
   against a solid black fill and risks reading as a stray white
   blotch; a plain white glyph is the safer, already-proven choice
   here (matches the earlier PDF/EPUB/Markdown icon treatment too). */
.kofi-custom-button {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	background: #000000;
	color: #ffffff;
	font-family: var(--book-body-font);
	font-weight: 600;
	font-size: 0.95rem;
	padding: 0.65em 1.3em;
	border-radius: 8px;
	text-decoration: none;
}
.kofi-custom-button:hover {
	opacity: 0.85;
}
.kofi-custom-button img {
	width: 1.3em;
	height: 1.3em;
}
.kofi-custom-button .bi-cup-hot {
	font-size: 1.1em;
}
/* No universal EPUB glyph exists in Bootstrap Icons (or anywhere else
   in common use) — bi-book stands in as the generic book/e-reader
   fallback, matching what the Notion-side plan itself authorized. */
a[href$="the-inversion-of-greatness.epub"]::before {
	font-family: "bootstrap-icons" !important;
	font-style: normal;
	font-weight: normal !important;
	display: inline-block;
	margin-right: 0.4em;
	vertical-align: -0.1em;
	content: "\f194";
}
/* Markdown link: a plain generic markdown-format glyph, matching the
   PDF/EPUB treatment — Obsidian and Notion moved off this link
   entirely, onto their own real outbound links in the description text
   ("for Obsidian or Notion, or any markup-based tool") instead of
   sitting as decorative icons here. */
a[href$="the-inversion-of-greatness-markdown.zip"]::before {
	font-family: "bootstrap-icons" !important;
	font-style: normal;
	font-weight: normal !important;
	display: inline-block;
	margin-right: 0.4em;
	vertical-align: -0.1em;
	content: "\f481";
}
/* Downloads callout: the three format icons above stand in for list
   bullets instead of sitting next to one — Bootstrap's default marker
   and left indent are stripped from just this one list (matched by
   containing the Markdown link, unique to this list on the site) so
   each icon lands flush at the line start, where a bullet would
   otherwise be. */
ul:has(> li > a[href$="the-inversion-of-greatness-markdown.zip"]) {
	list-style: none;
	padding-left: 0;
}
/* Quarto auto-generates a ".callout-header" reading "Note" for every
   plain .callout-note — not wanted here, since this box holds nothing
   but the three format links (author decision: intro/closing sentences
   live outside it as ordinary page text). Hides just that generic
   header, scoped to this one callout via the same download-link
   :has() match used above. */
.callout:has(a[href$="the-inversion-of-greatness-markdown.zip"]) .callout-header {
	display: none;
}
/* Obsidian's own icon (resources/obsidian-icon.png, author-supplied) on
   the real link to obsidian.md in the Markdown line's own description —
   a fixed-color mark, fine unchanged in both themes, same as on
   Obsidian's own site. */
a[href^="https://obsidian.md"]::before {
	content: "";
	display: inline-block;
	width: 1em;
	height: 1em;
	background-image: url("../resources/obsidian-icon.png");
	background-size: contain;
	background-repeat: no-repeat;
	background-position: center;
	margin-right: 0.3em;
	vertical-align: -0.15em;
}
/* Notion's own icon (resources/notion-icon.svg, Simple Icons' mirror of
   their published mark, plain black fill) on the real link to
   notion.so — applied as a mask rather than a background-image so it
   can be recolored with var(--book-text) and stay legible in dark mode
   too, since a flat black glyph would vanish against a dark background
   otherwise. */
a[href^="https://notion.so"]::before {
	content: "";
	display: inline-block;
	width: 1em;
	height: 1em;
	margin-right: 0.3em;
	vertical-align: -0.15em;
	background-color: var(--book-text);
	-webkit-mask-image: url("../resources/notion-icon.svg");
	mask-image: url("../resources/notion-icon.svg");
	-webkit-mask-size: contain;
	mask-size: contain;
	-webkit-mask-repeat: no-repeat;
	mask-repeat: no-repeat;
	-webkit-mask-position: center;
	mask-position: center;
}
