@opendirectory.dev/skills 0.1.56 → 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.
- package/package.json +1 -1
- package/registry.json +18 -0
- package/skills/graphic-case-study/README.md +121 -0
- package/skills/graphic-case-study/SKILL.md +312 -0
- package/skills/graphic-case-study/evals/evals.json +35 -0
- package/skills/graphic-case-study/references/design-system.md +104 -0
- package/skills/graphic-case-study/references/page-library.md +333 -0
- package/skills/graphic-case-study/references/style-presets.md +346 -0
- package/skills/graphic-ebook/README.md +123 -0
- package/skills/graphic-ebook/SKILL.md +396 -0
- package/skills/graphic-ebook/assets/viewport-base.css +153 -0
- package/skills/graphic-ebook/evals/evals.json +35 -0
- package/skills/graphic-ebook/references/design-system.md +241 -0
- package/skills/graphic-ebook/references/page-library.md +461 -0
- package/skills/graphic-ebook/references/style-presets.md +346 -0
- package/skills/graphic-ebook/scripts/export-pdf.sh +361 -0
|
@@ -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.
|