@@ -44,8 +44,8 @@ Exactly one file: `output/decks/<slug>/index.html`.
4444It must be ** self-contained** : NO external ` <link rel="stylesheet"> ` , NO
4545external ` <script src> ` , NO remote ` <img> ` , ** and NO web fonts** (no Google
4646Fonts link — that is an external link and breaks self-containment). All CSS in
47- one inline ` <style> ` ; the scale-to-fit script (§Frame) and keyboard-nav JS in
48- one inline ` <script >` at end of ` <body> ` . Use the local font stacks in §Type system — do not reach for Inter,
47+ one inline ` <style> ` ; keyboard-nav JS in one inline ` <script> ` at end of
48+ ` <body >` (no scaling script needed — CSS fills the viewport) . Use the local font stacks in §Type system — do not reach for Inter,
4949Chakra Petch, Orbitron, or any ` fonts.googleapis.com ` import.
5050
5151The body is a sequence of ` <section class="slide" data-type="..."> ` blocks;
@@ -92,12 +92,13 @@ Display titles use `--font-display` at weight 800 with `letter-spacing:-.02em`.
9292The tech character here comes from ** mono for every label / number / kicker /
9393code** , not from a fancy downloaded display face.
9494
95- Type scale (size / line-height):
96- * ` --type-display ` : 64px / 1.05 — cover/chapter big titles
97- * ` --type-title ` : 40px / 1.12 — normal slide titles
98- * ` --type-body ` : 19px / 1.6 — body copy (color: var(--ink))
99- * ` --type-quote ` : 30px / 1.35 — pull quotes
100- * ` --type-label ` : 11px / 1.0 / letter-spacing:.22em uppercase mono — tracks
95+ Type scale — use ` clamp() ` so type scales with the viewport (fixed px look tiny
96+ on a 2560px screen). vw drives the middle value; the rem caps keep it sane:
97+ * ` --type-display ` : clamp(2.8rem, 5.2vw, 5.5rem) / 1.05 — cover/chapter titles
98+ * ` --type-title ` : clamp(1.9rem, 3.2vw, 3rem) / 1.12 — normal slide titles
99+ * ` --type-body ` : clamp(1.05rem, 1.4vw, 1.4rem) / 1.6 — body copy (var(--ink))
100+ * ` --type-quote ` : clamp(1.6rem, 2.6vw, 2.2rem) / 1.35 — pull quotes
101+ * ` --type-label ` : clamp(.66rem, .8vw, .8rem) / .22em uppercase mono — tracks
101102
102103### Atmosphere (fixed background layers on every slide)
103104
@@ -111,24 +112,24 @@ These three layers are what stop the dark background from looking flat/cheap.
111112
112113### Frame (every slide)
113114
114- * ** Fixed 16:9 stage that scales to fill the viewport. ** Author every slide at
115- a fixed ` 1280×720 ` design size (so px-based type sizes stay predictable),
116- then scale the WHOLE deck to fit the window — never cap it with ` max-width ` :
115+ * ** Every slide fills the entire viewport — edge to edge, no letterbox, no
116+ fixed card. ** The slide IS the window; design for a wide canvas and let
117+ flexbox + ` clamp() ` sizing adapt to any window ratio :
117118 ``` css
118119 html ,body {height :100% ;margin :0 ;overflow :hidden ;background :var (--bg )}
119- #stage {position :fixed ;inset :0 ;display :grid ;place-items :center }
120- .slide {width :1280px ;height :720px ;transform-origin :center ;display :none }
121- .slide.active {display :flex } /* flex/grid inside as the layout needs */
120+ .slide {position :fixed ;inset :0 ;display :none ;flex-direction :column ;
121+ justify-content :center ;
122+ padding :clamp (40px ,5vh ,72px ) clamp (56px ,5vw ,128px )}
123+ .slide.active {display :flex }
122124 ```
123- ``` js
124- const fit = ()=> {const s = Math .min (innerWidth/ 1280 ,innerHeight/ 720 );
125- document .querySelectorAll (' .slide' ).forEach (el => el .style .transform = ` scale(${ s} )` );};
126- addEventListener (' resize' ,fit); fit ();
127- ```
128- Result: the deck letterbox-fills ANY window size and fullscreen — never a
129- small 1280px card stranded in a large viewport. One slide visible at a time;
130- ← / → swap the active slide (they do not scroll).
131- * Padding: 64px top/bottom, 80px left/right.
125+ No scaling/transform tricks — CSS alone fills the viewport. On an ultrawide
126+ window the slide is simply wider than 16:9; content reflows and the dark
127+ background + aurora bleed to all four edges — never a centered card with dark
128+ side-bands. One slide visible at a time; ← / → swap the active slide, ` F `
129+ fullscreen, ` P ` print (they do not scroll).
130+ * The aurora, dot-grid, top label row and the bottom signature bar all span the
131+ FULL viewport width (they live on ` .slide ` , which is the whole window). Inner
132+ padding uses the ` clamp() ` values above so content breathes on any size.
132133* ** Visual signature:** a glowing 3px bar along the bottom edge, gradient
133134 ` teal → sky → magenta ` , with ` box-shadow:0 0 14px ` of --teal. This is the
134135 deck's signature — present on every slide.
@@ -148,10 +149,21 @@ These three layers are what stop the dark background from looking flat/cheap.
148149
149150### Composition rules
150151
151- * Cover/chapter titles: ` max-width:18ch ` ; never wrap an article onto its own line.
152- * ` data ` slides center the big number (` align-items:center; text-align:center ` );
153- all other types stay left-aligned.
154- * Cover/closing bodies: ` max-width:26em ` .
152+ * ** Wrap each slide's content in one ` .inner ` block with an EXPLICIT
153+ ` max-width ` .** This is mandatory under fill-viewport — without it a centered
154+ box sizes to ` min-content ` and collapses into a narrow sliver on a wide
155+ screen (the #1 bug). Never let a content box use ` min-content ` /` fit-content ` .
156+ * Left-aligned types (cover/chapter/thesis/closing): `.inner{
157+ max-width: min (60ch,62vw); margin-right: auto }` — hugs the left.
158+ * Centered types (` data ` , ` quote ` ): `.inner{max-width: min (840px,80vw);
159+ margin:0 auto; text-align: center }`.
160+ * ` compare ` : `.inner{max-width: min (1100px,88vw); margin:0 auto;
161+ display: grid ; grid-template-columns:1fr 1fr; gap: clamp (24px,3vw,56px)}`
162+ with the glowing teal rule between columns.
163+ * ` data ` big number: ` white-space:nowrap ` (so ` 93.1% ` never wraps) at
164+ ` clamp(3.5rem,11vh,9rem) ` ; body beneath stays centered in the SAME ` .inner `
165+ as a readable ~ 3-line paragraph — never a 3-word column.
166+ * Cover/chapter titles never wrap an article ("the"/"an"/"to") onto its own line.
155167* Maintain contrast: body text is ` --ink ` on ` --bg ` . Never set body copy to
156168 ` --muted ` /` --soft ` as its main color — it disappears on dark. (Exception:
157169 a ` quote ` slide's pull-quote is intentionally ` --soft ` , and ` cover ` /` closing `
@@ -203,14 +215,22 @@ Cover/closing have no chapter context → top-left label is "OPENKB".
2032156 . ** Wall of text** — slide body >~ 80 words. Cut or split.
2042167 . ** Visual monotony** — 3+ consecutive slides of one ` data-type ` .
2052178 . ** Decorative-only viz** — an SVG/graph that says nothing. If you draw a
206- graph, its nodes/edges must encode real concepts/links from the KB. In a
207- 16:9 slide prefer a small, exact, hand-placed SVG over a fake "force layout".
218+ graph, its nodes/edges must encode real concepts/links from the KB. On a
219+ single slide prefer a small, exact, hand-placed SVG over a fake "force layout".
2082209 . ** Generic titles** — "Introduction"/"Background". Titles carry content.
20922110 . ** Definition-grade content** — "X is Y where Y is…" with no named
210222 technique, number, or source quote. Re-read sources (step 3) first.
211- 11 . ** Fixed-size card** — capping the deck with ` max-width ` so it sits as a
212- small 1280px card in a big window. Use the scale-to-fit stage (§Frame) so
213- it letterbox-fills any viewport and fullscreen.
223+ 11 . ** Letterbox / fixed-size card** — capping the slide with ` max-width ` or a
224+ fixed ` 1280×720 ` box, leaving dark side-bands on a wide window. Slides are
225+ ` position:fixed;inset:0 ` and fill the viewport edge-to-edge (§Frame).
226+ 12 . ** Collapsed content column** — a centered / ` data ` box sizing to
227+ ` min-content ` or a tiny ` max-width ` , squashing text into a narrow sliver on
228+ a wide screen (and breaking big numbers). Wrap content in an ` .inner ` with
229+ an explicit ` max-width ` (§Composition); big numbers ` white-space:nowrap ` .
230+ 13 . ** Invalid SVG sizing** — ` height="auto" ` written as an SVG * attribute*
231+ (invalid; fires a console error). Give inline SVG a ` viewBox ` and size it
232+ with CSS (` width:100%;height:auto ` in a ` style ` ) or fixed ` width ` /` height `
233+ attributes — never ` height="auto" ` as an attribute.
214234
215235## Self-check (before reporting back)
216236
@@ -222,5 +242,9 @@ Cover/closing have no chapter context → top-left label is "OPENKB".
2222425 . Is body copy in ` --ink ` (readable on dark) — ` quote ` pull-quotes and
223243 cover/closing subtitles in ` --soft ` being the only allowed exceptions — and
224244 is glow limited to titles / big numbers / graph nodes only?
245+ 6 . Do slides fill the viewport edge-to-edge (` position:fixed;inset:0 ` , no
246+ ` max-width ` / fixed ` 1280px ` box, no letterbox side-bands)?
247+ 7 . Is content wrapped in an ` .inner ` with an explicit ` max-width ` — no narrow
248+ sliver / ` min-content ` collapse, and big numbers ` white-space:nowrap ` ?
225249
226250If any answer is no, revise and re-run this self-check.
0 commit comments