/* ========================================================= TOKENS / CUSTOM PROPERTIES ========================================================= */ :root { --gutter: 2rem; --margin: 420px; --body-pad: 1rem; --content-min: 60ch; --content-max: 880px; --content: clamp( var(--content-min), calc(100vi - (2 * var(--body-pad)) - (2 * (var(--margin) + var(--gutter)))), var(--content-max) ); --bleed: 48px; --fullwidth-cap: 860px; --bg: #fff; --page-bg: #fafafc; --fg: #000; --heading: #004c99; --link: #0a84ff; --link-2: var(--link); --code-bg: #f0f0f0; --border: #d7d7d7; --active-toc: #cacaca; --muted: #666; --note-color: #555; --note-bg: transparent; --chip-bg: #f0f0f0; --chip-fg: #444; /* Compatibility aliases (you reference these later) */ --border-color: var(--border); --text-color: var(--fg); --muted-text: var(--muted); --link-color: var(--link); --link-hover-color: var(--fg); --bg-alt: #fafafa; } /* ========================================================= BASE / TYPOGRAPHY ========================================================= */ html, body { margin: 0; background-color: var(--page-bg); color: var(--fg); transition: background-color 0.3s, color 0.3s; font-family: Inter, sans-serif; } /* Keep your layout intent (column app shell) */ body { display: flex; flex-direction: column; } h1, h2, h3 { color: var(--heading); } a { color: var(--link-2); text-decoration: none; } a:hover { text-decoration: underline; } /* ========================================================= PREAMBLE / HEADER ========================================================= */ #preamble { top: 0; z-index: 20; background: var(--bg); border-bottom: 1px solid var(--border); } #preamble .banner-header, #preamble #updated { max-width: 100%; } .banner-header { position: relative; /* anchor for Close All */ display: flex; justify-content: center; /* center main group */ align-items: center; gap: 1rem; padding: 0.5rem 1rem; } .banner-logo { height: 80px; width: auto; margin-right: 1.5rem; border-radius: 50%; } nav { display: flex; gap: 1rem; font-weight: 600; font-size: 1.1rem; } #updated { font-size: 0.75rem; color: var(--muted); opacity: 0.7; white-space: nowrap; } #close-all { position: absolute; right: 1rem; top: 50%; transform: translateY(-50%); background: transparent; border: 1px solid var(--border); border-radius: 4px; padding: 0.25rem 0.5rem; /* smaller so it doesn’t dominate */ font-size: 0.8rem; color: var(--muted); cursor: pointer; } #close-all:hover { color: var(--fg); border-color: var(--fg); } .banner-header > a { display: flex; align-items: center; } @media (max-width: 768px) { .banner-header { grid-template-columns: 1fr; gap: 0.75rem; text-align: center; } .banner-logo { margin: 0 auto; } #close-all { justify-self: center; } } /* ========================================================= CONTENT WRAPPER ========================================================= */ #content.content { max-width: var(--content); margin-left: auto !important; margin-right: auto !important; padding-left: var(--body-pad); padding-right: var(--body-pad); box-sizing: content-box; position: relative; } #content .figure, #content img:not(.fullwidth) { max-width: 100%; height: auto; } /* ========================================================= STACKED PANE LAYOUT ========================================================= */ #stack-root { position: relative; width: 100vw; height: calc(100vh - 120px); overflow-x: auto; overflow-y: hidden; flex: 1 1 auto; scroll-snap-type: x proximity; } .stack-track { display: flex; flex-direction: row; align-items: stretch; width: max-content; height: 100%; } .stack-pane { flex: 0 0 auto; width: clamp(420px, 33vw, 860px); max-width: 100vw; height: 100%; overflow-y: auto; overflow-x: hidden; position: relative; /* needed for ::after positioning */ background-color: var(--bg); border-right: 1px solid var(--border); } .stack-pane::after { content: ""; position: absolute; top: 0; right: 0; width: 12px; height: 100%; pointer-events: none; opacity: 0.15; } .stack-pane:last-child { box-shadow: -4px 0 16px rgba(0, 0, 0, 0.06); } /* Scrollbar (WebKit) */ .stack-pane::-webkit-scrollbar { width: 8px; } .stack-pane::-webkit-scrollbar-thumb { background-color: color-mix(in oklab, var(--fg) 25%, transparent); border-radius: 4px; } /* ========================================================= PANE HEADER + CLOSE BUTTON ========================================================= */ .pane-root { background-color: var(--bg); } .pane-header { position: sticky; top: 0; z-index: 5; display: flex; justify-content: flex-end; background: inherit; padding: 0.25rem 0.5rem; border-bottom: 1px solid var(--border); } .pane-close { background: none; border: none; font-size: 1.4rem; line-height: 1; cursor: pointer; color: var(--muted); padding: 0.1rem 0.4rem; } .pane-close:hover { color: var(--fg); } /* ========================================================= FOOTER ========================================================= */ footer { color: var(--fg); padding: 1rem; border-radius: 6px; text-align: center; font-size: 0.9rem; font-style: italic; flex-shrink: 0; margin-top: 0; border-top: 1px solid var(--border); background: var(--bg); /* If you want it sticky later, use: position: sticky; bottom: 0; */ bottom: 0; z-index: 10; } /* ========================================================= LISTS ========================================================= */ ul, ol { margin: 1rem 0 1.5rem 1.5rem; padding: 0; line-height: 1.5; } ul { list-style: none; } ul li { position: relative; padding-left: 1.2em; } ul li::before { content: "•"; position: absolute; left: 0; top: 0; color: var(--heading); font-weight: bold; } ol { counter-reset: list-counter; list-style: none; } ol li { counter-increment: list-counter; position: relative; padding-left: 1.8em; } ol li::before { content: counter(list-counter) "."; position: absolute; left: 0; top: 0; color: var(--heading); font-weight: bold; } li { margin-bottom: 8px; display: flow-root; } li::after { content: none; } li ul, li ol { margin-top: 0.5rem; margin-bottom: 0.5rem; } li ul li::before { content: "–"; font-weight: normal; color: var(--note-color); } li ol li::before { font-weight: normal; color: var(--note-color); } /* ========================================================= EPIGRAPH ========================================================= */ .epigraph { margin: 2rem auto; max-width: 80%; font-style: italic; } .epigraph blockquote { margin: 0; padding: 1rem 1.5rem; border-left: 4px solid var(--heading); background-color: color-mix(in oklab, var(--bg) 94%, var(--fg) 6%); color: var(--fg); line-height: 1.6; } .epigraph blockquote footer { margin-top: 0.75rem; font-style: normal; font-size: 0.9em; color: var(--muted); text-align: right; } .epigraph blockquote cite { font-style: italic; font-weight: 500; color: var(--link); } .epigraph blockquote::before, .epigraph blockquote::after { content: none; } /* ========================================================= UTILITIES / MISC ========================================================= */ .hidden { display: none !important; } /* bigger-picture.js controls */ .bp-x { right: 72px; } .bp-next, .bp-prev { right: 8px; } .bp-prev { left: 8px; } .bp-wrap { transition: opacity 0.18s ease; } .bp-wrap.bp-fadeout { opacity: 0; } .bp-controls { padding-top: env(safe-area-inset-top, 0); padding-right: calc(env(safe-area-inset-right, 0) + 8px); } /* code copy button */ .copy-btn { position: absolute; top: 0.4em; right: 0.4em; background-color: var(--code-bg); color: var(--heading); border: 1px solid var(--heading); border-radius: 4px; padding: 0.2em 0.6em; font-size: 0.8rem; cursor: pointer; z-index: 10; transition: background-color 0.3s; } /* ========================================================= BACKLINKS ========================================================= */ .backlinks-section { margin-top: 4rem; padding-top: 1.5rem; border-top: 1px solid var(--border); opacity: 0.95; color: var(--muted); } .backlinks-list { margin-top: 0.75rem; padding-left: 0; } .backlinks-list li { margin-bottom: 0.4rem; font-size: 0.9rem; list-style: none; } .backlinks-list li::before { content: "↩ "; opacity: 0.5; margin-right: 0.2rem; } .backlinks-list li a { text-decoration: none; font-weight: 500; color: var(--link); border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding-bottom: 0.05em; transition: color 0.15s ease, border-color 0.15s ease; } .backlinks-list li a:hover, .backlinks-list li a:focus { color: var(--fg); border-bottom-color: currentColor; } /* ========================================================= SEARCH ========================================================= */ .banner-search { position: relative; max-width: 28rem; } #search-box { width: 100%; padding: 0.55rem 0.75rem; font-size: 0.95rem; font-family: inherit; background-color: var(--bg-alt); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease; } #search-box:focus { outline: none; background-color: #fff; border-color: var(--link); box-shadow: 0 0 0 2px rgba(42, 93, 176, 0.15); } #search-box::placeholder { color: #888; font-style: italic; } #search-results { position: absolute; top: calc(100% + 0.3rem); left: 0; right: 0; background-color: #fff; border: 1px solid var(--border); border-radius: 4px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08); max-height: 18rem; overflow-y: auto; z-index: 1000; } #search-results > * { padding: 0.45rem 0.65rem; font-size: 0.9rem; line-height: 1.3; cursor: pointer; border-bottom: 1px solid rgba(0, 0, 0, 0.05); } #search-results > *:last-child { border-bottom: none; } #search-results > *:hover, #search-results > *.active { background-color: rgba(42, 93, 176, 0.08); } /* ========================================================= RESPONSIVE ========================================================= */ @media (max-width: 768px) { #stack-root { overflow-x: hidden; overflow-y: auto; } .stack-track { flex-direction: column; width: 100%; } .stack-pane { width: 100%; height: auto; border-right: none; border-bottom: 1px solid var(--border); } } /* ========================================================= FULLSCREEN PANE MODE ========================================================= */ body.pane-fullscreen #stack-root { overflow: hidden; } body.pane-fullscreen .stack-track { width: 100%; } body.pane-fullscreen .stack-pane { width: 100% !important; max-width: none; border-right: none; } body.pane-fullscreen .stack-pane::after { display: none; } /* Only the active fullscreen pane remains */ body.pane-fullscreen .stack-pane:not(.is-fullscreen) { display: none; } /* Optional: make content breathe more in fullscreen */ body.pane-fullscreen #content.content { max-width: 900px; }