/* layout.css, page-wide structural primitives: tab-lede (paragraph below banner), default vertical section rhythm, part dividers (DEMO / MODEL signposts), section eyebrow / title / lede / takeaway typography, and the .section--two-col layout that parks narrative in a sticky rail next to the demo. */ /* --- Tab lede ------------------------------------------------------------ Short narrative paragraph that opens each tab. Treated as an editorial "lede" (the deck under a magazine headline): one design accent (a thin green left-rail that echoes the green caret in the wordmark above) plus a typographic step-up to make it clearly *the entry point* rather than just the first body paragraph. Structure: .tab-lede , outer wrapper, centers the block at page width .tab-lede__rail , green left-rail + padding + max-width on the text .tab-lede__eyebrow, small mono "§ Intro" label up top p , the lede text itself (large, light, dark ink) --------------------------------------------------------------------------- */ .tab-lede { max-width: 1200px; margin: 56px auto 0; padding: 0 32px; } .tab-lede__rail { /* The accent. 3px is just thick enough to read as a deliberate rail and not a stray border; the green matches --green / the wordmark caret. */ border-left: 3px solid #317f3f; padding: 4px 0 4px 22px; max-width: 820px; } .tab-lede__eyebrow { display: block; font-family: "JetBrains Mono", ui-monospace, monospace; font-size: 11px; font-weight: 500; letter-spacing: 0.22em; text-transform: uppercase; color: #317f3f; margin-bottom: 12px; } .tab-lede p { margin: 0; font-family: "Inter", "Helvetica Neue", sans-serif; font-size: 19px; font-weight: 300; line-height: 1.5; letter-spacing: -0.005em; color: #2d2d2a; max-width: 760px; } /* Release-hero figure (pareto frontier). Sits below the lede rail, left-aligned with the text column so the figure feels anchored to the announcement rather than floating. Caption mirrors the secondary-note typography for visual continuity. */ .tab-lede__figure { margin: 28px 0 0; max-width: 640px; padding: 0; } .tab-lede__figure img { display: block; width: 100%; height: auto; border: 1px solid var(--hairline); } .tab-lede__figure figcaption { margin-top: 10px; font-family: "Inter", "Helvetica Neue", sans-serif; font-size: 13px; line-height: 1.55; color: #5b5b56; } /* Secondary "navigator" paragraph that follows the lede. Drops a step in size + weight + saturation so the eye reads it as a follow-up / table of contents rather than another full lede paragraph; the inline §X references are styled as chip anchors (below) to keep it scannable. */ .tab-lede p + p.tab-lede__note { margin-top: 14px; font-size: 14px; line-height: 1.6; color: #5b5b56; } /* Inline chip anchors for the §1..§7 section references. Mono + warm green border so they read as deliberate "jump-to" markers within the prose. Subtle by default, fill in on hover/focus. */ .lede-chip { display: inline-block; padding: 0 6px; font-family: "JetBrains Mono", ui-monospace, monospace; font-size: 11px; font-weight: 500; letter-spacing: 0.04em; color: #1f5024; background: rgba(49, 127, 63, 0.06); border: 1px solid rgba(49, 127, 63, 0.35); border-radius: 3px; text-decoration: none; vertical-align: 1px; /* nudge up so it sits on the baseline of 14px prose */ line-height: 1.4; transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease; } .lede-chip:hover, .lede-chip:focus-visible { background: rgba(49, 127, 63, 0.16); border-color: #317f3f; color: #1f1f1d; outline: none; } /* --- Sections --- */ section { border-bottom: 1px solid #eee; padding: 64px 0; } section:last-of-type { border-bottom: none; } /* --- Part dividers (DEMO / MODEL) --- */ .part-divider { text-align: center; padding: 80px 32px 48px; border-top: 1px solid #eee; border-bottom: 1px solid #eee; background: linear-gradient(to bottom, rgba(49,127,63,0.04), transparent); } .part-divider .part-eyebrow { font-family: "JetBrains Mono", monospace; font-size: 10px; color: #317f3f; letter-spacing: 4px; text-transform: uppercase; margin-bottom: 6px; } .part-divider h2 { font-family: "JetBrains Mono", monospace; font-size: 26px; font-weight: 300; letter-spacing: -0.3px; margin-bottom: 8px; } .part-divider p { color: #666; font-size: 13px; max-width: 580px; margin: 0 auto; } .section-num { font-family: "JetBrains Mono", monospace; font-size: 10px; color: #317f3f; letter-spacing: 2px; text-transform: uppercase; margin-bottom: 8px; } .section-title { font-family: "JetBrains Mono", monospace; font-size: 22px; font-weight: 400; letter-spacing: -0.3px; margin-bottom: 24px; color: #1f1f1d; } .lede { color: #444; font-size: 14px; margin-bottom: 32px; max-width: 640px; } .takeaway { margin-top: 32px; padding: 16px 20px; border-left: 3px solid #317f3f; background: #f4f8f4; color: #333; font-size: 13px; max-width: 640px; } .takeaway strong { font-family: "JetBrains Mono", monospace; font-weight: 500; letter-spacing: 1px; text-transform: uppercase; font-size: 10px; color: #317f3f; display: block; margin-bottom: 4px; } /* Two-subsection takeaway: each

is its own labeled block (Try it / What to look for) sitting inside the same card. */ .takeaway p { margin: 0 0 14px; } .takeaway p:last-child { margin-bottom: 0; } /* === Two-column section layout ========================================= The default layout stacks vertically: title → lede → demo → takeaway. For demo-heavy sections that means narrative and visualization never share visual space, by the time the visitor is mid-demo, the lede is scrolled away. .section--two-col places the eyebrow + title + lede in a sticky rail on the left and stacks the demo + takeaway in the right column. Narration stays in view while the visitor scrolls through the demo; the takeaway then appears right under the demo, on the right column, as a "now that you've played with it…" debrief, same flow on both the Demo and Model tabs. Layout math: container.wide is 1200px max with 32px padding => 1136px usable. 280px rail + 28px gap + 828px right column. Below 960px the right column gets squeezed under ~620px (280 + 28 + ~620 ≈ 928px usable inside a ~960px viewport), which is the point where the demos (gene tracks, SVG bars, 3D viewers) start clipping or becoming unreadable. We collapse to single-column and unstick the rail there so the narrative stacks above the demo + takeaway. */ .section--two-col { display: grid; grid-template-columns: 280px 1fr; column-gap: 28px; align-items: start; /* Land cleanly under the sticky header on anchor jumps (#folding). */ scroll-margin-top: 104px; } .section--two-col .section-narrative { position: sticky; /* Sticky header is ~88px tall (title + tab strip on its border); +16px so the rail doesn't kiss the underline. */ top: 104px; align-self: start; /* Cap on short viewports so a tall narrative still fits without pushing demo content off-screen. The narrative scrolls inside its own track if it ever overflows. */ max-height: calc(100vh - 120px); overflow-y: auto; scrollbar-width: thin; } /* The 640px cap on .lede exists to keep line length readable in the single-column layout. Inside a 280px rail that cap is moot, drop it so the text fills the rail. */ .section--two-col .section-narrative .lede { max-width: none; font-size: 13px; margin-bottom: 0; } /* Right column: demo stacked over takeaway, flex-column with a clear visual beat between them. */ .section--two-col .section-body { display: flex; flex-direction: column; gap: 24px; min-width: 0; /* let inner svg/canvas shrink instead of overflowing */ } .section--two-col .demo { margin: 0; /* default 24px y-margin is for single-column rhythm */ } .section--two-col .takeaway { margin: 0; /* gap on section-body handles vertical rhythm */ max-width: none; /* fill the right column rather than capping at 640 */ } @media (max-width: 960px) { .section--two-col { grid-template-columns: 1fr; row-gap: 16px; } .section--two-col .section-narrative { position: static; max-height: none; overflow: visible; } } /* --- "Try it" / "What you can do here" callout. Drops in above an interactive widget to spell out the affordances in one line. Subtle green-edge card so the reader sees it as a hint, not a heading. --- */ .widget-howto { margin: 0 0 12px; padding: 8px 12px; background: #f4f8f4; border-left: 2px solid var(--green); font-size: 12px; line-height: 1.55; color: #3a4a3d; display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; } .widget-howto__label { font-family: "JetBrains Mono", monospace; font-size: 10px; font-weight: 600; color: var(--green); letter-spacing: 1.5px; text-transform: uppercase; white-space: nowrap; flex: 0 0 auto; } .widget-howto__body { flex: 1 1 0; min-width: 0; } .widget-howto__body kbd { font-family: inherit; background: rgba(31, 31, 29, 0.06); border-radius: 3px; padding: 1px 5px; }