Colors, typography, components, and the self-contained principle — the visual DNA of every generated page
The entire visual identity is built on three core colors, complemented by semantic colors for feedback states. Each color has a clear role — no arbitrary usage, but a coherent system throughout.
Core Colors
Semantic Colors
Three font families cover all use cases. Each has a clear purpose — no mixing, no overlap. Loaded via Google Fonts, the only external dependency.
Headings, card titles, pyramid labels, flow step labels. Weights: 400, 600, 700, 800.
--font-displayParagraphs, card descriptions, breadcrumbs, quiz options, tooltips. Weights: 300–700, including italic.
--font-bodyFile trees, inline code, module numbers in overview, breadcrumb level tags, variable names. Weights: 400, 500, 600.
--font-monoSize Scale (--text-*)
Three font stacks: Bricolage Grotesque for everything that needs attention (headings, titles). DM Sans for everything meant to be read (body text, descriptions). JetBrains Mono for everything technical (code, badges, labels). Fallbacks ensure a clean layout even without Google Fonts.
No external CSS files. Everything is inline in every HTML file. The CSS is defined once in Phase 3 and copied into each individual file. Result: files work offline, no broken links, no CDN dependency (except Google Fonts).
<link rel="stylesheet"> pointing to a missing file. The style is always there.~200 CSS variables in these categories
All visual building blocks follow the structure .module → .module-content → .module-header → .module-body → .screen. Here are the key components at a glance:
.card + .cards-grid.quiz + .quiz-option.file-tree.term + .term-tooltip.deep-dive-link.viz-flow + .viz-flow-stepTwo breakpoints, scroll-snap with proximity (not mandatory!), and IntersectionObserver-based reveal animations.
Breakpoints
scroll-snap-type: y proximity — gentle snapping, no forced jumping. Each .module is a snap point..animate-in + IntersectionObserver. Elements fade in with translateY(20px) → translateY(0).Animation system: Three speed tiers (150ms for quick hover effects, 300ms for normal transitions, 500ms for reveal animations). The easing curve cubic-bezier(.16, 1, .3, 1) provides a natural deceleration. Stagger delays make child elements appear sequentially (120ms apart).
Why is CSS embedded inline instead of using an external stylesheet?