@opendirectory.dev/skills 0.1.57 → 0.1.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,461 @@
1
+ # Page Library — graphic-ebook
2
+
3
+ 11 page layout types for A4 portrait ebooks (1200×1697px). Each layout is a content block inside `<section class="slide">`. Multiple sections can stack within a single page (e.g., chapter-intro + short text-column).
4
+
5
+ All dimensions assume: viewport 1200px wide × 1697px tall (A4 portrait).
6
+
7
+ ---
8
+
9
+ ## 1. cover
10
+
11
+ **Purpose:** Opening page — title, subtitle, brand
12
+ **Density:** Very open
13
+ **Content limits:** Title ≤10 words (leads with value or tension), subtitle ≤15 words, brand name, optional category label
14
+
15
+ **HTML structure:**
16
+ ```html
17
+ <section class="slide page--cover">
18
+ <div class="cover-inner">
19
+ <div class="cover-top reveal">
20
+ <span class="cover-category-label">Lead Magnet</span>
21
+ </div>
22
+ <div class="cover-body">
23
+ <h1 class="cover-title reveal">[Title — leads with value or tension]</h1>
24
+ <p class="cover-subtitle reveal">[Subtitle — 15 words max]</p>
25
+ </div>
26
+ <div class="cover-bottom reveal">
27
+ <div class="brand-logo">[CSS initials or img]</div>
28
+ <span class="brand-name">[Brand Name]</span>
29
+ </div>
30
+ </div>
31
+ <!-- No footer on cover page -->
32
+ </section>
33
+ ```
34
+
35
+ **CSS approach:**
36
+ - Background: style preset's most distinctive (dark, full-color, or richly styled — this is the first impression)
37
+ - Decorative element: ghost letter or abstract geometric in `::before` pseudo-element, `opacity: 0.05`
38
+ - `.cover-title`: `font-family: var(--font-display); font-size: clamp(2rem, 5vw, 3.5rem); letter-spacing: -0.03em; line-height: 1.08;`
39
+ - `.cover-subtitle`: `font-size: clamp(0.875rem, 1.5vw, 1.2rem); line-height: 1.55; max-width: 36ch;`
40
+ - `.cover-inner`: `display: flex; flex-direction: column; justify-content: space-between; height: 100%; padding: var(--page-padding);`
41
+
42
+ **Do NOT:** Put any body copy, bullets, or chapter content here. Cover = one idea only.
43
+
44
+ ---
45
+
46
+ ## 2. toc
47
+
48
+ **Purpose:** Table of contents — numbered chapter list
49
+ **Density:** Open, scannable
50
+ **Content limits:** Max 8 entries. Chapter title ≤6 words. Right-aligned page/section numbers.
51
+
52
+ **HTML structure:**
53
+ ```html
54
+ <section class="slide page--toc">
55
+ <div class="toc-inner">
56
+ <h2 class="toc-heading reveal">Contents</h2>
57
+ <ol class="toc-list">
58
+ <li class="toc-item reveal">
59
+ <span class="toc-num">01</span>
60
+ <span class="toc-title">[Chapter Title]</span>
61
+ <span class="toc-page">[N]</span>
62
+ </li>
63
+ <!-- repeat for each chapter -->
64
+ </ol>
65
+ </div>
66
+ <div class="page-footer"><span>[Brand]</span><span>2</span></div>
67
+ </section>
68
+ ```
69
+
70
+ **CSS approach:**
71
+ - `.toc-list`: `list-style: none; display: flex; flex-direction: column; gap: clamp(0.5rem, 1.2%, 1rem);`
72
+ - `.toc-item`: `display: flex; align-items: baseline; gap: clamp(0.75rem, 1.5%, 1.25rem); padding-bottom: clamp(0.5rem, 1%, 0.875rem); border-bottom: 1px solid var(--divider);`
73
+ - `.toc-num`: `font-family: var(--font-display); font-size: clamp(1.1rem, 2vw, 1.6rem); color: var(--accent); min-width: 2.5ch; font-weight: var(--display-weight);`
74
+ - `.toc-title`: `font-size: clamp(0.875rem, 1.4vw, 1.1rem); font-weight: 600; flex: 1;`
75
+ - `.toc-page`: `font-size: clamp(0.75rem, 1.1vw, 0.875rem); color: var(--text-muted); font-weight: 600;`
76
+ - `.toc-heading`: `font-family: var(--font-display); font-size: clamp(1.5rem, 3.5vw, 2.8rem); letter-spacing: -0.02em; margin-bottom: clamp(1.5rem, 3%, 2.5rem);`
77
+
78
+ ---
79
+
80
+ ## 3. chapter-intro
81
+
82
+ **Purpose:** Section opener — signals the start of a new chapter
83
+ **Density:** Very open
84
+ **Content limits:** Chapter number (decorative) + chapter title ≤8 words + teaser paragraph 2–3 sentences
85
+
86
+ **HTML structure:**
87
+ ```html
88
+ <section class="slide page--chapter-intro">
89
+ <div class="chapter-intro-inner">
90
+ <span class="chapter-number-deco" aria-hidden="true">01</span>
91
+ <div class="chapter-intro-content">
92
+ <p class="chapter-label reveal">Chapter One</p>
93
+ <h2 class="chapter-title reveal">[Chapter Title — ≤8 words]</h2>
94
+ <p class="chapter-teaser reveal">[2–3 sentence teaser. Sets expectation for the chapter.]</p>
95
+ </div>
96
+ </div>
97
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
98
+ </section>
99
+ ```
100
+
101
+ **CSS approach:**
102
+ - `.chapter-number-deco`: `font-family: var(--font-display); font-size: clamp(6rem, 18vw, 14rem); font-weight: var(--display-weight); opacity: 0.06; position: absolute; top: -0.1em; right: var(--page-padding); line-height: 1; color: var(--accent); pointer-events: none; user-select: none;`
103
+ - `.chapter-intro-inner`: `position: relative; display: flex; flex-direction: column; justify-content: center; height: 100%; padding: var(--page-padding); padding-bottom: 3rem;` (leave room for footer)
104
+ - `.chapter-title`: `font-family: var(--font-display); font-size: clamp(1.5rem, 3.5vw, 2.8rem); letter-spacing: -0.02em; line-height: 1.15; font-weight: var(--display-weight); max-width: 20ch;`
105
+ - `.chapter-teaser`: `font-size: clamp(0.875rem, 1.25vw, 1.05rem); color: var(--text-secondary); line-height: 1.65; max-width: 55ch; margin-top: clamp(0.875rem, 1.5%, 1.5rem);`
106
+ - `.chapter-label`: `font-size: clamp(0.6rem, 0.85vw, 0.7rem); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--text-muted); margin-bottom: 0.75rem;`
107
+
108
+ **Background:** Style preset's alt section background OR full-bleed brand color. This page must be visually distinct from body pages.
109
+
110
+ ---
111
+
112
+ ## 4. text-column
113
+
114
+ **Purpose:** Primary reading content — body paragraphs
115
+ **Density:** Moderate
116
+ **Variants:** 1-column (default) / 2-column
117
+
118
+ ### 1-Column:
119
+ **Content limits:** Section heading + body paragraphs. Max 250 words per page.
120
+
121
+ **HTML structure:**
122
+ ```html
123
+ <section class="slide page--text-column">
124
+ <div class="text-col-inner">
125
+ <h3 class="section-heading reveal">[Section Heading]</h3>
126
+ <div class="body-content">
127
+ <p class="body-text reveal">[Body paragraph. Max 250 words total on page.]</p>
128
+ <!-- OR a bullet list: -->
129
+ <ul class="body-list reveal">
130
+ <li class="body-list-item">[List item — max 3 items before text looks like a bullet dump]</li>
131
+ </ul>
132
+ </div>
133
+ </div>
134
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
135
+ </section>
136
+ ```
137
+
138
+ **CSS (1-col):**
139
+ - `.text-col-inner`: `padding: var(--page-padding); padding-bottom: 3rem; height: 100%; display: flex; flex-direction: column; gap: var(--content-gap); overflow: hidden;`
140
+ - `.body-text`: `font-size: clamp(0.875rem, 1.25vw, 1.05rem); line-height: 1.75; color: var(--text-secondary); max-width: min(65ch, 100%);`
141
+ - `.section-heading`: `font-family: var(--font-display); font-size: clamp(1rem, 1.8vw, 1.4rem); font-weight: 700; letter-spacing: -0.01em; color: var(--text-primary); line-height: 1.2;`
142
+ - `.body-list`: `list-style: none; display: flex; flex-direction: column; gap: clamp(0.5rem, 1%, 0.875rem); max-width: min(65ch, 100%);`
143
+ - `.body-list-item`: `display: flex; gap: 0.75em; font-size: clamp(0.875rem, 1.25vw, 1.05rem); line-height: 1.7; color: var(--text-secondary);`
144
+ - `.body-list-item::before`: `content: "→"; color: var(--accent); flex-shrink: 0; line-height: 1.7;`
145
+
146
+ ### 2-Column:
147
+ **Content limits:** 140–190 words per column. Use for comparisons, step pairs, before/after.
148
+
149
+ **CSS additions:**
150
+ ```css
151
+ .text-col-2 {
152
+ display: grid;
153
+ grid-template-columns: 1fr 1fr;
154
+ gap: clamp(2rem, 4%, 3.5rem);
155
+ align-items: start;
156
+ }
157
+ .text-col-2 .col-left {
158
+ border-right: 1px solid var(--divider);
159
+ padding-right: clamp(1.5rem, 3%, 2.5rem);
160
+ }
161
+ .col-heading {
162
+ font-size: clamp(0.875rem, 1.3vw, 1.1rem);
163
+ font-weight: 700;
164
+ padding-bottom: 0.5rem;
165
+ border-bottom: 2px solid var(--accent);
166
+ margin-bottom: 0.875rem;
167
+ color: var(--text-primary);
168
+ }
169
+ ```
170
+
171
+ ---
172
+
173
+ ## 5. text-sidebar
174
+
175
+ **Purpose:** Reading content with a typed callout in the sidebar
176
+ **Density:** Moderate
177
+ **Layout:** 2/3 main content + 1/3 callout sidebar
178
+
179
+ **HTML structure:**
180
+ ```html
181
+ <section class="slide page--text-sidebar">
182
+ <div class="text-sidebar-inner">
183
+ <div class="sidebar-main">
184
+ <h3 class="section-heading reveal">[Section Heading]</h3>
185
+ <p class="body-text reveal">[Body — max 180 words]</p>
186
+ </div>
187
+ <aside class="sidebar-callout reveal">
188
+ <div class="callout callout--tip">
189
+ <p class="callout-label">Pro Tip</p>
190
+ <p class="callout-body">[Sidebar content — max 70 words. One of: tip, warning, stat, quote, checklist.]</p>
191
+ </div>
192
+ </aside>
193
+ </div>
194
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
195
+ </section>
196
+ ```
197
+
198
+ **CSS approach:**
199
+ - `.text-sidebar-inner`: `display: grid; grid-template-columns: 2fr 1fr; gap: clamp(1.5rem, 3%, 2.5rem); padding: var(--page-padding); padding-bottom: 3rem; height: 100%; align-items: start; overflow: hidden;`
200
+ - `.sidebar-main .body-text`: same as text-column 1-col
201
+ - `.callout`: `border-left: 3px solid; border-radius: var(--card-radius, 4px); padding: clamp(0.75rem, 1.5%, 1.1rem);`
202
+ - `.callout-label`: `font-size: clamp(0.58rem, 0.8vw, 0.68rem); font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; margin-bottom: 0.5em; display: block;`
203
+ - `.callout-body`: `font-size: clamp(0.8rem, 1.1vw, 0.95rem); line-height: 1.6; color: var(--text-secondary);`
204
+
205
+ **Callout type tokens:**
206
+ ```css
207
+ .callout--tip { background: rgba(22, 163, 74, 0.07); border-color: #16A34A; }
208
+ .callout--tip .callout-label { color: #16A34A; }
209
+ .callout--warning { background: rgba(217, 119, 6, 0.07); border-color: #D97706; }
210
+ .callout--warning .callout-label { color: #D97706; }
211
+ .callout--stat { background: rgba(var(--accent-rgb, 100,100,100), 0.07); border-color: var(--accent); }
212
+ .callout--stat .callout-label { color: var(--accent); }
213
+ .callout--quote { background: var(--bg-elevated, #1A1A1A); border-color: var(--divider); }
214
+ .callout--quote .callout-body { font-style: italic; }
215
+ .callout--quote .callout-label { color: var(--text-muted); }
216
+ .callout--checklist { background: rgba(8, 145, 178, 0.07); border-color: #0891B2; }
217
+ .callout--checklist .callout-label { color: #0891B2; }
218
+ ```
219
+
220
+ ---
221
+
222
+ ## 6. quote-callout
223
+
224
+ **Purpose:** Full-page pull quote — builds authority, breaks visual rhythm
225
+ **Density:** Very open
226
+ **Content limits:** Quote ≤40 words + attribution (name, title, company or source)
227
+
228
+ **HTML structure:**
229
+ ```html
230
+ <section class="slide page--quote-callout">
231
+ <div class="quote-callout-inner">
232
+ <blockquote class="pull-quote reveal">
233
+ <span class="quote-mark" aria-hidden="true">"</span>
234
+ <p class="quote-text">[Quote — ≤40 words]</p>
235
+ <footer class="quote-attribution">
236
+ <span class="attribution-name">[Name]</span>
237
+ <span class="attribution-role">[Title], [Company]</span>
238
+ </footer>
239
+ </blockquote>
240
+ </div>
241
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
242
+ </section>
243
+ ```
244
+
245
+ **CSS approach:**
246
+ - `.quote-callout-inner`: `display: flex; align-items: center; justify-content: center; height: 100%; padding: var(--page-padding); padding-bottom: 3rem;`
247
+ - `.pull-quote`: `position: relative; max-width: 32ch;`
248
+ - `.quote-mark`: `position: absolute; font-family: var(--font-display); font-size: clamp(6rem, 15vw, 10rem); opacity: 0.07; top: -0.35em; left: -0.15em; color: var(--accent); line-height: 1; pointer-events: none; user-select: none;`
249
+ - `.quote-text`: `font-family: var(--font-display); font-style: italic; font-size: clamp(1.2rem, 2.2vw, 1.75rem); line-height: 1.4; color: var(--text-primary);`
250
+ - `.attribution-name`: `font-weight: 700; font-size: clamp(0.7rem, 1vw, 0.85rem); display: block; margin-top: 1.5rem;`
251
+ - `.attribution-role`: `font-size: clamp(0.65rem, 0.9vw, 0.78rem); color: var(--text-muted); display: block;`
252
+ - Background: preset's alt section bg OR full accent-color inversion for maximum impact
253
+
254
+ **Do NOT:** Add bullets, headings, body text, or statistics to this page. The quote is the entire content.
255
+
256
+ ---
257
+
258
+ ## 7. stat-grid
259
+
260
+ **Purpose:** Key metrics with visual emphasis — the results section
261
+ **Density:** Open (numbers need breathing room)
262
+ **Content limits:** 3–6 metrics. One hero metric in accent color. Optional 1-sentence narrative below.
263
+
264
+ **HTML structure:**
265
+ ```html
266
+ <section class="slide page--stat-grid">
267
+ <div class="stat-grid-inner">
268
+ <div class="stat-heading-row">
269
+ <p class="section-label reveal">By the Numbers</p>
270
+ <h2 class="section-heading reveal">[Heading — ≤8 words]</h2>
271
+ </div>
272
+ <div class="stat-row">
273
+ <div class="stat-item stat-item--hero reveal" style="--i:0">
274
+ <div class="stat-rule"></div>
275
+ <div class="stat-number">[80%]</div>
276
+ <div class="stat-label">[Label — uppercase, ≤4 words]</div>
277
+ <div class="stat-context">[Context — ≤12 words]</div>
278
+ </div>
279
+ <div class="stat-item reveal" style="--i:1">
280
+ <div class="stat-rule"></div>
281
+ <div class="stat-number">[N]</div>
282
+ <div class="stat-label">[Label]</div>
283
+ <div class="stat-context">[Context]</div>
284
+ </div>
285
+ <!-- 3rd stat -->
286
+ </div>
287
+ <p class="stat-narrative reveal">[Optional: 1-sentence narrative below the stats]</p>
288
+ </div>
289
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
290
+ </section>
291
+ ```
292
+
293
+ **CSS approach:**
294
+ - `.stat-row`: `display: flex; gap: clamp(2rem, 5%, 4rem); align-items: flex-start; margin-top: clamp(1.5rem, 3%, 2.5rem);`
295
+ - `.stat-item`: `flex: 1; display: flex; flex-direction: column; gap: clamp(0.35rem, 0.7%, 0.6rem); opacity: 0; transform: translateY(20px); transition: opacity 0.7s var(--ease-out-expo, ease), transform 0.7s var(--ease-out-expo, ease);`
296
+ - `.slide.visible .stat-item`: `opacity: 1; transform: none;`
297
+ - `.slide.visible .stat-item:nth-child(1)`: `transition-delay: 0.05s;`
298
+ - `.slide.visible .stat-item:nth-child(2)`: `transition-delay: 0.2s;`
299
+ - `.slide.visible .stat-item:nth-child(3)`: `transition-delay: 0.35s;`
300
+ - `.stat-rule`: `width: 20px; height: 2px; background: var(--accent); margin-bottom: 0.5rem;`
301
+ - `.stat-number`: `font-family: var(--font-display); font-size: clamp(2.5rem, 7vw, 5rem); font-weight: var(--display-weight); letter-spacing: -0.04em; line-height: 0.9; color: var(--text-secondary);`
302
+ - `.stat-item--hero .stat-number`: `font-size: clamp(3rem, 8vw, 5.5rem); color: var(--accent);`
303
+ - `.stat-label`: `font-size: clamp(0.62rem, 0.9vw, 0.78rem); font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--text-secondary);`
304
+ - `.stat-context`: `font-size: clamp(0.6rem, 0.85vw, 0.72rem); color: var(--text-muted); line-height: 1.4;`
305
+ - `.stat-narrative`: `font-size: clamp(0.75rem, 1.05vw, 0.875rem); color: var(--text-muted); border-top: 1px solid var(--divider); padding-top: 0.875rem; margin-top: 0.875rem; max-width: 70ch;`
306
+
307
+ **ZERO body copy competing with the numbers.** The optional narrative goes BELOW the stat row in smaller body text, clearly subordinate.
308
+
309
+ ---
310
+
311
+ ## 8. key-takeaways
312
+
313
+ **Purpose:** Summary of learnings — leave-behind/reference
314
+ **Density:** Open, scannable
315
+ **Content limits:** 5–8 takeaways, ≤15 words each. Imperative where possible.
316
+ **Position:** Second-to-last page, before closing-cta.
317
+
318
+ **HTML structure:**
319
+ ```html
320
+ <section class="slide page--key-takeaways">
321
+ <div class="takeaways-inner">
322
+ <h2 class="section-heading reveal">Key Takeaways</h2>
323
+ <ol class="takeaway-list">
324
+ <li class="takeaway-item reveal">
325
+ <span class="takeaway-num">01</span>
326
+ <span class="takeaway-text">[Takeaway — ≤15 words, imperative]</span>
327
+ </li>
328
+ <!-- repeat for 5–8 items -->
329
+ </ol>
330
+ </div>
331
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
332
+ </section>
333
+ ```
334
+
335
+ **CSS approach:**
336
+ - `.takeaway-list`: `list-style: none; display: flex; flex-direction: column; gap: clamp(0.75rem, 1.5%, 1.25rem); margin-top: clamp(1.5rem, 3%, 2.5rem);`
337
+ - `.takeaway-item`: `display: flex; gap: clamp(1rem, 2%, 1.5rem); align-items: flex-start; padding-bottom: clamp(0.75rem, 1.5%, 1.25rem); border-bottom: 1px solid var(--divider);`
338
+ - `.takeaway-num`: `font-family: var(--font-display); font-size: clamp(1.2rem, 2vw, 1.6rem); color: var(--accent); min-width: 2.5ch; font-weight: var(--display-weight); line-height: 1.4; flex-shrink: 0;`
339
+ - `.takeaway-text`: `font-size: clamp(0.875rem, 1.3vw, 1.05rem); line-height: 1.6; color: var(--text-secondary); font-weight: 500;`
340
+
341
+ ---
342
+
343
+ ## 9. full-image
344
+
345
+ **Purpose:** Full-page visual — abstract composition, process diagram, or decorative break
346
+ **Density:** Very open
347
+ **Use:** Sparingly — maximum 1 per ebook. CSS-generated visuals only.
348
+
349
+ **HTML structure:**
350
+ ```html
351
+ <section class="slide page--full-image">
352
+ <div class="full-image-canvas">
353
+ <!-- CSS-generated visual: shapes, gradient mesh, abstract pattern -->
354
+ <div class="visual-element" aria-hidden="true"></div>
355
+ </div>
356
+ <div class="full-image-caption reveal">[Optional caption — ≤15 words]</div>
357
+ <div class="page-footer"><span>[Brand]</span><span>[N]</span></div>
358
+ </section>
359
+ ```
360
+
361
+ **CSS approach:**
362
+ - `.full-image-canvas`: `position: absolute; inset: 0; overflow: hidden;` — fill the entire slide
363
+ - `.full-image-caption`: `position: absolute; bottom: clamp(2.5rem, 5%, 3rem); left: var(--page-padding); right: var(--page-padding); font-size: clamp(0.65rem, 0.9vw, 0.78rem); color: var(--text-muted); font-style: italic;`
364
+ - CSS visual patterns: gradient mesh, radial dot grid, geometric shapes via `::before`/`::after`, abstract layered elements
365
+
366
+ ---
367
+
368
+ ## 10. closing-cta
369
+
370
+ **Purpose:** Final page — single conversion action
371
+ **Density:** Open
372
+ **Content limits:** Headline ≤5 words (imperative) + 1 sentence body + email + URL (both required)
373
+
374
+ **HTML structure:**
375
+ ```html
376
+ <section class="slide page--closing-cta">
377
+ <div class="cta-inner">
378
+ <div class="cta-top">
379
+ <p class="cta-label reveal">Ready to start</p>
380
+ <h2 class="cta-headline reveal">[Headline — ≤5 words, imperative]</h2>
381
+ <p class="cta-body reveal">[1-sentence body — ≤25 words]</p>
382
+ </div>
383
+ <div class="cta-bottom">
384
+ <div class="cta-contacts reveal">
385
+ <a href="mailto:[email]" class="cta-email">[email]</a>
386
+ <a href="[url]" class="cta-url">[url]</a>
387
+ </div>
388
+ <div class="cta-brand-logo reveal">[CSS initials or img]</div>
389
+ </div>
390
+ </div>
391
+ <!-- No footer on closing-cta — it IS the closer -->
392
+ </section>
393
+ ```
394
+
395
+ **CSS approach:**
396
+ - `.page--closing-cta`: Background — style preset's darkest or most distinctive. This is the closing statement.
397
+ - `.cta-inner`: `display: flex; flex-direction: column; justify-content: space-between; height: 100%; padding: var(--page-padding);`
398
+ - `.cta-headline`: `font-family: var(--font-display); font-size: clamp(1.5rem, 4vw, 3rem); letter-spacing: -0.03em; line-height: 1.05; font-weight: var(--display-weight);`
399
+ - `.cta-email`: `font-size: clamp(0.875rem, 1.4vw, 1.2rem); font-weight: 700; display: block;`
400
+ - `.cta-url`: `font-size: clamp(0.75rem, 1.1vw, 0.9rem); opacity: 0.55; display: block;`
401
+
402
+ **ONE action only.** Email + URL — both mandatory. No bullets, no stats, no feature lists. Fails QA if either is missing.
403
+
404
+ ---
405
+
406
+ ## Standard Page Assemblies
407
+
408
+ ### 3-pager (quick guide / lead magnet)
409
+ ```
410
+ Page 1: [cover]
411
+ Page 2: [stat-grid] OR [text-column]
412
+ Page 3: [closing-cta]
413
+ ```
414
+ No TOC. Cover may include "What's inside" 3-bullet list.
415
+
416
+ ### 5-pager (short guide)
417
+ ```
418
+ Page 1: [cover]
419
+ Page 2: [toc]
420
+ Page 3: [chapter-intro]
421
+ Page 4: [text-column] OR [text-sidebar]
422
+ Page 5: [closing-cta]
423
+ ```
424
+
425
+ ### 6-pager (standard)
426
+ ```
427
+ Page 1: [cover]
428
+ Page 2: [toc]
429
+ Page 3: [chapter-intro] — Chapter 1
430
+ Page 4: [text-column] — Chapter 1 body
431
+ Page 5: [stat-grid] OR [quote-callout]
432
+ Page 6: [closing-cta]
433
+ ```
434
+
435
+ ### 8-pager (standard + depth)
436
+ ```
437
+ Page 1: [cover]
438
+ Page 2: [toc]
439
+ Page 3: [chapter-intro] — Chapter 1
440
+ Page 4: [text-sidebar]
441
+ Page 5: [chapter-intro] — Chapter 2
442
+ Page 6: [text-column]
443
+ Page 7: [quote-callout] OR [stat-grid]
444
+ Page 8: [closing-cta]
445
+ ```
446
+
447
+ ### 10-pager (deep dive)
448
+ ```
449
+ Page 1: [cover]
450
+ Page 2: [toc]
451
+ Page 3: [chapter-intro] — Chapter 1
452
+ Page 4: [text-column]
453
+ Page 5: [chapter-intro] — Chapter 2
454
+ Page 6: [text-sidebar]
455
+ Page 7: [chapter-intro] — Chapter 3
456
+ Page 8: [text-column]
457
+ Page 9: [key-takeaways]
458
+ Page 10: [closing-cta]
459
+ ```
460
+
461
+ **Visual rhythm enforcement:** In all assemblies, no 2+ consecutive text-column or text-sidebar pages. Always break with chapter-intro, quote-callout, stat-grid, or key-takeaways.