buildSlides runs once and returns plain layers — the geometry constants, how a composition is chosen, and what each of the eight compositions produces.
buildSlides(texts, theme, roles?, options?) → Slide[]. Runs once and returns plain layers.
W 1080 · H 1350 · M 96 · COL 888 · BAND 430 · BAND_GAP 56, inner height 1158.
| Image setting | Image band | Text region |
|---|---|---|
| No image | — | 96, 96, 888, 1158 |
above | 96, 96, 888, 430 | 96, 582, 888, 672 |
below | 96, 824, 888, 430 | 96, 96, 888, 672 |
With images off, text gets the whole safe box — which is why "never" produces a visibly larger hook.
CYCLE = [heading-body, statement, numbered, quote, underline, caps]. BY_ROLE = { hook: title, cta: block, takeaway: statement, lesson: statement, turn: quote, result: numbered }.
Without roles: slide 1 is title, the last is block (when total > 2), everything else cycles. With roles, a pinned composition is used unless it would repeat the previous slide.
| Framework | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|
| problem | title | heading-body | statement | numbered | quote | underline | caps | block | |
| showcase | title | heading-body | statement | numbered | quote | underline | numbered | block | |
| educational | title | heading-body | statement | numbered | quote | underline | statement | block | |
| story | title | heading-body | statement | numbered | quote | underline | numbered | statement | block |
| id | Band | Ladder | Layers |
|---|---|---|---|
title | above | 104→40, w700 | Rule (accent bar), Title |
heading-body | above | head 58→30 (capped at 40% of region), body 40→22 in muted | Heading, Body |
statement | below | 76→30, w700, centred | Statement |
numbered | below | body 46→22, numeral fixed 100px | Number, Tick, Text |
quote | above | 62→26, italic, indent 44 | Bar, Quote |
underline | below | 70→30, w700 | Text, Underline |
caps | below | 56→22, uppercase, tracked 0.06 | Text |
block | above | 68→26, centred, text in theme.bg | Block (full-bleed 0→1080), Text |
heading-body silently delegates to underline when the text has no sentence break, so a slide whose composition "is" heading-body can render as a single underlined block. caps is the only composition that measures uppercased and tracked, since that is what renders. block is the only layer that ignores the 96px margin. numbered’s numeral is the slide’s position in the deck, not the nth point — "Fix 1" on slide 5 displays 05.
0 removes accent rules, 1 normal, 1.8 bold. It scales the rule’s height (quote’s bar: width). block ignores it entirely. title and underline also reserve vertical space for the rule, so turning decor off changes the type fit, not just the graphics.