@cyber-dash-tech/revela 0.1.11 → 0.1.13

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.
@@ -31,6 +31,8 @@ Apply this visual style when generating all slides in this session.
31
31
  --accent-danger: #b94a3c;
32
32
  --accent-sage: #9eb0a6;
33
33
  --shadow-soft: rgba(0, 0, 0, 0.18);
34
+ --font-display: 'IBM Plex Sans Condensed', 'Inter', ui-sans-serif, sans-serif;
35
+ --font-body: 'Inter', ui-sans-serif, sans-serif;
34
36
  }
35
37
  ```
36
38
 
@@ -150,7 +152,7 @@ html {
150
152
  body {
151
153
  background: var(--bg-frame);
152
154
  color: var(--text-primary);
153
- font-family: 'Inter', ui-sans-serif, sans-serif;
155
+ font-family: var(--font-body);
154
156
  -webkit-font-smoothing: antialiased;
155
157
  height: 100%;
156
158
  }
@@ -202,7 +204,7 @@ body {
202
204
  }
203
205
 
204
206
  h1, h2, h3, h4 {
205
- font-family: 'IBM Plex Sans Condensed', 'Inter', ui-sans-serif, sans-serif;
207
+ font-family: var(--font-display);
206
208
  font-weight: 600;
207
209
  letter-spacing: -0.02em;
208
210
  color: var(--text-primary);
@@ -572,6 +574,8 @@ Every slot accepts 1 or more components. The LLM decides what each slot contains
572
574
 
573
575
  Equal N-column layout. Use when 3 or more parallel items of roughly equal visual weight should appear side by side — proof blocks, highlights, feature comparisons, stat groups, or any multi-column editorial spread.
574
576
 
577
+ A short section header is optional but recommended. In Summit, that header should stay lean: eyebrow plus title only, with no intro paragraph competing with the columns below.
578
+
575
579
  Structural intent:
576
580
  - each slot: 1fr column — any component(s)
577
581
  - column count: determined by the number of direct child divs in the grid container; `auto-fit` distributes space equally
@@ -582,6 +586,11 @@ Every slot accepts 1 or more components. Add or remove child divs to control col
582
586
  <section class="slide" slide-qa="true" data-index="N">
583
587
  <div class="slide-canvas">
584
588
  <div class="page">
589
+ <div style="display:flex;flex-direction:column;gap:10px;margin-bottom:28px;max-width:520px;">
590
+ <p class="eyebrow">Section Label</p>
591
+ <h2 style="font-size:52px;line-height:0.94;text-transform:uppercase;">Short framing title for the parallel columns</h2>
592
+ </div>
593
+
585
594
  <div class="highlight-cols-grid" style="flex:1;min-height:0;">
586
595
 
587
596
  <!-- [slot: 1] — 1+ components; suggested: editorial-image-top, editorial-text-top, echart-panel -->
@@ -619,8 +628,10 @@ Every slot accepts 1 or more components. Add or remove child divs to control col
619
628
 
620
629
  ##### Tips
621
630
  - **Grid container needs `flex:1;min-height:0` inline** when inside `.page` (which is flex-column). The class handles column sizing; the inline style handles row stretch.
631
+ - **Header stays lean.** If you add a section header above the grid, use only `eyebrow + title`. Do not add an intro paragraph; the columns themselves should carry the explanation.
622
632
  - **Column count = number of direct child divs.** `repeat(auto-fit, minmax(0, 1fr))` distributes available width equally across however many children exist. Add a 4th or 5th div to get 4 or 5 columns — no CSS change needed.
623
633
  - **Equal columns — no hierarchy.** All slots carry the same visual weight. Adjust content density to suit the slide purpose; do not artificially inflate one column to create false hierarchy.
634
+ - **When using 4-5 columns, compress the header.** Keep the title to one or two short lines so the grid retains most of the slide height.
624
635
  - **Do not set fixed heights on editorial components.** Let components fill height via flexbox stretch.
625
636
  <!-- @layout:highlight-cols:end -->
626
637
 
@@ -860,6 +871,79 @@ Rules:
860
871
  - **`editorial-list` inside `--dark`.** Add `style="--accent-earth:rgba(247,244,238,0.72)"` on the `<ul>` wrapper so the bullet squares read against the dark background.
861
872
  <!-- @component:text-panel:end -->
862
873
 
874
+ <!-- @component:stat-card:start -->
875
+ #### Stat Card
876
+
877
+ Lightweight editorial metric module for a single highlighted number. Use when one data point should carry the visual emphasis while the metric name and guiding sentence stay quiet and compact.
878
+
879
+ This is **not** a dashboard card. It has no border, no background fill, no shadow, and no corner treatment. Hierarchy comes from number scale, spacing, and restrained typography.
880
+
881
+ ```html
882
+ <!-- variant A: default vertical composition -->
883
+ <div class="stat-card">
884
+ <p class="caption" style="color:var(--text-muted);">Performance signal</p>
885
+ <div class="stat-card-value" style="color: var(--accent-gold);">27%</div>
886
+ <div class="text-panel-body" style="gap:10px;max-width:330px;">
887
+ <h3 style="font-size:24px;line-height:1.04;text-transform:uppercase;">EBIT Margin</h3>
888
+ <p style="font-size:14px;line-height:1.56;color:var(--text-secondary);">Expanded for the third consecutive quarter as premium mix offset freight pressure and held pricing discipline through softer volume.</p>
889
+ </div>
890
+ </div>
891
+
892
+ <!-- variant B: horizontal composition -->
893
+ <div class="stat-card stat-card--horizontal">
894
+ <div style="display:flex;flex-direction:column;gap:12px;flex:0 0 220px;min-width:0;">
895
+ <p class="caption" style="color:var(--text-muted);">Operational baseline</p>
896
+ <div class="stat-card-value" style="color: var(--accent-olive);">4.8x</div>
897
+ </div>
898
+ <div class="text-panel-body" style="gap:10px;max-width:330px;">
899
+ <h3 style="font-size:24px;line-height:1.04;text-transform:uppercase;">Inventory Turnover</h3>
900
+ <p style="font-size:14px;line-height:1.56;color:var(--text-secondary);">Higher cycle efficiency reduced working-capital drag without adding new capacity, leaving more headroom for seasonal demand swings.</p>
901
+ </div>
902
+ </div>
903
+ ```
904
+
905
+ ```css
906
+ .stat-card {
907
+ height: 100%;
908
+ display: flex;
909
+ min-height: 0;
910
+ flex-direction: column;
911
+ justify-content: flex-start;
912
+ gap: 16px;
913
+ padding-top: 8px;
914
+ }
915
+
916
+ .stat-card--horizontal {
917
+ flex-direction: row;
918
+ align-items: flex-start;
919
+ gap: 30px;
920
+ }
921
+
922
+ .stat-card-value {
923
+ font-family: var(--font-display);
924
+ font-size: 88px;
925
+ line-height: 0.9;
926
+ letter-spacing: -0.04em;
927
+ font-weight: 600;
928
+ font-variant-numeric: tabular-nums;
929
+ color: inherit;
930
+ }
931
+ ```
932
+
933
+ Rules:
934
+ - Use this component only for a **single** highlighted metric. If the slide needs several peer metrics, switch to a multi-item layout instead of stacking several stat cards together without hierarchy.
935
+ - The number color is chosen semantically from the Summit palette via inline `style="color: var(--accent-xxx)"`; do not hardcode a fixed color in the component CSS.
936
+ - Do not add background fills, borders, shadows, or rounded corners. The module must remain typographic and editorial.
937
+ - Use `h3` for the metric name and a single compact `p` for the guiding sentence. Keep the copy to one or two sentences.
938
+ - Default `stat-card` is vertical. Add `stat-card--horizontal` only when the number and explanation need a side-by-side read.
939
+
940
+ ##### Tips
941
+ - **Horizontal width discipline.** In the horizontal variant, keep the number column narrow (`~220px`) so the prose still reads as the explanatory side, not as a second visual block.
942
+ - **Long numbers.** For values such as `12,450` or `83.6%`, reduce the inline font size slightly before tightening letter-spacing further.
943
+ - **Semantic color choice.** `--accent-gold` works for primary emphasis, `--accent-olive` for stable or positive operational metrics, `--accent-danger` for negative indicators, and `--accent-sage` for environmental or resilience-oriented signals.
944
+ - **Do not over-explain.** If the description starts to become paragraph-length, switch to `text-panel` or pair the stat card with a narrative component in the neighboring slot.
945
+ <!-- @component:stat-card:end -->
946
+
863
947
  <!-- @component:editorial-image-top:start -->
864
948
  #### Editorial Image Top
865
949
 
@@ -1115,7 +1199,7 @@ Rules:
1115
1199
  - The left copy zone holds a kicker row followed by a `text-panel-body`. The body accepts prose `<p>`, an `<ul class="editorial-list">`, or both — choose based on content.
1116
1200
  - The right visual slot is open: use a plain `media-frame img`, an `echart-container`, or a full `image-title` component. Choose based on content — there is no default.
1117
1201
  - When using `editorial-list` inside `text-panel-body`, add `<strong>` around the first 2–5 words of each `<li>` to create a bold lead phrase for scannable hierarchy.
1118
- - When the card carries a large statistic or callout number, place it between the header and the copy zone using an inline style (`font-size: 48px; font-family: IBM Plex Sans Condensed; font-weight: 700; color: var(--accent-gold); line-height: 1;`).
1202
+ - When the card carries a large statistic or callout number, place it between the header and the copy zone using an inline style (`font-size: 48px; font-family: var(--font-display); font-weight: 700; color: var(--accent-gold); line-height: 1;`).
1119
1203
 
1120
1204
  ##### Tips
1121
1205
  - **Parent must supply height.** `.editorial-text-left` uses `height: 100%` and `flex: 1` internally. The parent slot must have a defined height (grid cell, `height:100%` chain, or `flex:1;min-height:0`).
@@ -1239,6 +1323,34 @@ Horizontal step or phase sequence. Use for process stages, numbered definitions,
1239
1323
  ```
1240
1324
 
1241
1325
  ```css
1326
+ /* Shared by flow-horizontal and flow-vertical */
1327
+ .flow-number {
1328
+ font-family: var(--font-display);
1329
+ font-size: 13px;
1330
+ font-weight: 700;
1331
+ letter-spacing: 0.12em;
1332
+ color: var(--text-muted);
1333
+ border: 1px solid var(--line-strong);
1334
+ width: 34px;
1335
+ height: 34px;
1336
+ display: flex;
1337
+ align-items: center;
1338
+ justify-content: center;
1339
+ flex-shrink: 0;
1340
+ }
1341
+
1342
+ .flow-body h4 {
1343
+ font-size: 20px;
1344
+ font-weight: 600;
1345
+ line-height: 1.14;
1346
+ }
1347
+
1348
+ .flow-body p {
1349
+ font-size: 14px;
1350
+ line-height: 1.6;
1351
+ color: var(--text-secondary);
1352
+ }
1353
+
1242
1354
  .flow-horizontal {
1243
1355
  position: relative;
1244
1356
  display: flex;
@@ -1273,30 +1385,6 @@ Horizontal step or phase sequence. Use for process stages, numbered definitions,
1273
1385
  position: relative;
1274
1386
  z-index: 1;
1275
1387
  background: var(--bg-page);
1276
- font-family: 'IBM Plex Sans Condensed', sans-serif;
1277
- font-size: 13px;
1278
- font-weight: 700;
1279
- letter-spacing: 0.12em;
1280
- color: var(--text-muted);
1281
- border: 1px solid var(--line-strong);
1282
- width: 34px;
1283
- height: 34px;
1284
- display: flex;
1285
- align-items: center;
1286
- justify-content: center;
1287
- flex-shrink: 0;
1288
- }
1289
-
1290
- .flow-horizontal .flow-body h4 {
1291
- font-size: 20px;
1292
- font-weight: 600;
1293
- line-height: 1.14;
1294
- }
1295
-
1296
- .flow-horizontal .flow-body p {
1297
- font-size: 14px;
1298
- line-height: 1.6;
1299
- color: var(--text-secondary);
1300
1388
  }
1301
1389
  ```
1302
1390
 
@@ -1372,21 +1460,6 @@ Vertical step or timeline sequence. Use for chronological phases, execution stag
1372
1460
  flex-shrink: 0;
1373
1461
  }
1374
1462
 
1375
- .flow-vertical .flow-number {
1376
- font-family: 'IBM Plex Sans Condensed', sans-serif;
1377
- font-size: 13px;
1378
- font-weight: 700;
1379
- letter-spacing: 0.12em;
1380
- color: var(--text-muted);
1381
- border: 1px solid var(--line-strong);
1382
- width: 34px;
1383
- height: 34px;
1384
- display: flex;
1385
- align-items: center;
1386
- justify-content: center;
1387
- flex-shrink: 0;
1388
- }
1389
-
1390
1463
  .flow-vertical .flow-line {
1391
1464
  width: 1px;
1392
1465
  flex: 1;
@@ -1404,17 +1477,11 @@ Vertical step or timeline sequence. Use for chronological phases, execution stag
1404
1477
  }
1405
1478
 
1406
1479
  .flow-vertical .flow-body h4 {
1407
- font-size: 20px;
1408
- font-weight: 600;
1409
- line-height: 1.14;
1410
1480
  margin-top: 4px;
1411
1481
  }
1412
1482
 
1413
1483
  .flow-vertical .flow-body p {
1414
1484
  margin-top: 8px;
1415
- font-size: 14px;
1416
- line-height: 1.6;
1417
- color: var(--text-secondary);
1418
1485
  }
1419
1486
  ```
1420
1487
 
@@ -1502,7 +1569,7 @@ Annual-report format data table. Use for year-on-year comparisons, emissions dat
1502
1569
  .data-table {
1503
1570
  width: 100%;
1504
1571
  border-collapse: collapse;
1505
- font-family: 'Inter', sans-serif;
1572
+ font-family: var(--font-body);
1506
1573
  font-size: 13px;
1507
1574
  font-variant-numeric: tabular-nums;
1508
1575
  color: var(--text-primary);
@@ -1907,7 +1974,7 @@ Flat editorial quote block. Wide and short (width > height). Transparent backgro
1907
1974
  display: flex;
1908
1975
  align-items: center;
1909
1976
  justify-content: center;
1910
- font-family: 'IBM Plex Sans Condensed', sans-serif;
1977
+ font-family: var(--font-display);
1911
1978
  font-size: 14px;
1912
1979
  font-weight: 700;
1913
1980
  color: var(--text-muted);
@@ -2015,7 +2082,7 @@ Omit `--light` only on slides with a white/light background.
2015
2082
  position: absolute;
2016
2083
  bottom: 36px;
2017
2084
  right: 52px;
2018
- font-family: 'IBM Plex Sans Condensed', sans-serif;
2085
+ font-family: var(--font-display);
2019
2086
  font-size: 11px;
2020
2087
  font-weight: 700;
2021
2088
  letter-spacing: 0.18em;
@@ -2149,7 +2216,7 @@ A horizontal milestone timeline with a central axis line. Nodes sit on the axis;
2149
2216
 
2150
2217
  /* Date: inherits node colour via --tjh-item-color */
2151
2218
  .tjh-date {
2152
- font-family: 'IBM Plex Sans Condensed', sans-serif;
2219
+ font-family: var(--font-display);
2153
2220
  font-size: 11px;
2154
2221
  font-weight: 700;
2155
2222
  letter-spacing: 0.16em;
@@ -2160,7 +2227,7 @@ A horizontal milestone timeline with a central axis line. Nodes sit on the axis;
2160
2227
  }
2161
2228
 
2162
2229
  .tjh-title {
2163
- font-family: 'IBM Plex Sans Condensed', sans-serif;
2230
+ font-family: var(--font-display);
2164
2231
  font-size: 16px;
2165
2232
  font-weight: 600;
2166
2233
  letter-spacing: -0.01em;
@@ -2344,7 +2411,7 @@ Can be placed inside any layout slot that provides a defined height (`narrative`
2344
2411
 
2345
2412
  /* Date — colored per node via --tjv-item-color */
2346
2413
  .tjv-date {
2347
- font-family: 'IBM Plex Sans Condensed', sans-serif;
2414
+ font-family: var(--font-display);
2348
2415
  font-size: 11px;
2349
2416
  font-weight: 700;
2350
2417
  letter-spacing: 0.16em;
@@ -2355,7 +2422,7 @@ Can be placed inside any layout slot that provides a defined height (`narrative`
2355
2422
  }
2356
2423
 
2357
2424
  .tjv-title {
2358
- font-family: 'IBM Plex Sans Condensed', sans-serif;
2425
+ font-family: var(--font-display);
2359
2426
  font-size: 18px;
2360
2427
  font-weight: 600;
2361
2428
  letter-spacing: -0.01em;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyber-dash-tech/revela",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "OpenCode plugin that turns AI into an HTML slide deck generator",
5
5
  "type": "module",
6
6
  "main": "./index.ts",
package/skill/SKILL.md CHANGED
@@ -34,7 +34,39 @@ Before writing any HTML, ask the user these questions **in a single message**
34
34
 
35
35
  If the user's first message already answers most of these, skip what's clear and
36
36
  only ask about what's missing. If the message is detailed enough, proceed directly
37
- to Phase 2.
37
+ to Phase 1.5.
38
+
39
+ Once you have the user's answers, **derive the deck slug** from the topic:
40
+ lowercase, hyphens, no spaces (e.g. "AI Investment Shift" → `ai-investment-shift`).
41
+ Tell the user: "I'll save this deck as `slides/{slug}.html`." They can correct the
42
+ name at this point.
43
+
44
+ ### Phase 1.5 — Deck Initialization & Resume Check
45
+
46
+ After confirming the deck slug, check whether this deck has been worked on before:
47
+
48
+ 1. Run `ls researches/{slug}/` (or `glob researches/{slug}/*.md`).
49
+ 2. **If the directory does not exist (new deck):** proceed to Phase 2.
50
+ 3. **If research files already exist (resuming):** list the files and ask the user:
51
+
52
+ > 我发现 `researches/{slug}/` 下已有以下研究文件:
53
+ > - `market-data.md`
54
+ > - `competitor-profile.md`
55
+ > - _(etc.)_
56
+ >
57
+ > 你想:
58
+ > a. 直接使用现有研究,跳到幻灯片计划阶段
59
+ > b. 补充某些方向的研究(请告诉我哪些方向)
60
+ > c. 全部重新研究
61
+
62
+ Then act based on the user's reply:
63
+ - **a** → skip Phase 3, go directly to Phase 4 (read existing files first)
64
+ - **b** → run research agents only for the specified axes, then Phase 4
65
+ - **c** → proceed to Phase 2 normally (full research)
66
+
67
+ All subsequent file paths in this session use the confirmed slug:
68
+ - Slides file: `slides/{slug}.html`
69
+ - Research dir: `researches/{slug}/`
38
70
 
39
71
  ### Phase 2 — Select Design
40
72
 
@@ -127,8 +159,9 @@ research workhorse — not an optional enhancement.
127
159
 
128
160
  The research agent searches the web using `websearch` for broad discovery and
129
161
  `webfetch` for depth on specific pages, reads workspace documents, and writes
130
- structured findings to a single file `researches/{topic-slug}/{axis-name}.md`
131
- in the workspace.
162
+ structured findings to a single file `researches/{slug}/{axis-name}.md`
163
+ in the workspace. Use the deck slug confirmed in Phase 1.5 — do not invent a
164
+ different slug at this point.
132
165
 
133
166
  ##### Parallelization Rule
134
167
 
@@ -151,14 +184,14 @@ need 2 axes; a complex comparison may need 4 or more. Typical decompositions:
151
184
  Launch ALL agents in a single message (parallel Task tool calls).
152
185
 
153
186
  Each agent's brief should specify:
154
- - The topic slug (shared, e.g. `ai-investment-shift`)
187
+ - The deck slug from Phase 1.5 (e.g. `ai-investment-shift`) — all agents share the same slug
155
188
  - The axis name for their file (e.g. `anthropic-profile`, `openai-challenges`, `market-trends`)
156
189
  - What to research and what time period to focus on
157
190
  - An explicit instruction to use `websearch` (e.g. "Use the websearch tool to find relevant market reports, news, and data for this axis.")
158
191
 
159
192
  ##### After Agents Complete
160
193
 
161
- List and read the findings files: `ls researches/{topic-slug}/`, then `read`
194
+ List and read the findings files: `ls researches/{slug}/`, then `read`
162
195
  each `.md` file. Each file contains structured `## Data`, `## Cases`,
163
196
  `## Images`, and `## Gaps` sections — use these directly as slide material.
164
197
  Cross-reference agent findings with workspace documents (Layer 1). Flag any
@@ -313,8 +346,7 @@ Once the fetch is complete, generate the complete HTML file in one shot.
313
346
 
314
347
  - Output **only** the raw HTML — no markdown fences, no explanation before or after
315
348
  - Create a `slides/` directory in the current working directory if it doesn't already exist
316
- - Write the file to `slides/<topic-slug>.html`
317
- (e.g. "AI Future" → `slides/ai-future.html`)
349
+ - Write the file to `slides/{slug}.html` using the deck slug confirmed in Phase 1.5
318
350
  - The file must be completely self-contained (all CSS and JS inline)
319
351
 
320
352
  ### Phase 6 — Iterate
@@ -325,7 +357,7 @@ After generating, briefly tell the user:
325
357
  - One line invitation to request changes
326
358
 
327
359
  For change requests: re-generate the **entire** file (don't patch). Apply the
328
- change and silently overwrite the same `slides/<topic-slug>.html` filename.
360
+ change and silently overwrite the same `slides/{slug}.html` filename.
329
361
 
330
362
  ---
331
363
 
@@ -450,130 +482,6 @@ Lowercase, hyphens, no spaces, `.html` extension. Always place files inside the
450
482
 
451
483
  ---
452
484
 
453
- ## Design Generation Mode
454
-
455
- Enter this mode when the user wants to create a new visual design — triggered by
456
- phrases like "create a design", "save this style as a design", "generate a
457
- design from this image/screenshot/design", "make a design based on this".
458
-
459
- Design generation produces a reusable **style definition** (not a full
460
- presentation). Once saved, the design appears in the design picker and
461
- applies its visual style to all future presentations.
462
-
463
- ---
464
-
465
- ### Phase T1 — Analyse the reference
466
-
467
- Study the uploaded image(s) or described style and extract:
468
-
469
- - **Color palette**: exact hex values for background, surface, text (primary +
470
- secondary), accent, border. If extracting from an image, sample the dominant
471
- colors precisely.
472
- - **Typography feel**: serif vs sans-serif, weight choices, size hierarchy.
473
- Pick real web fonts from Fontshare (`https://api.fontshare.com`) or Google
474
- Fonts that match the feel — never use system fonts.
475
- - **Layout density**: generous whitespace vs compact, centered vs left-aligned.
476
- - **Animation mood**: subtle & professional, bold & energetic, or minimal
477
- (no animation).
478
- - **Aesthetic name**: 2–3 words in kebab-case that describe the look, e.g.
479
- `warm-editorial`, `neon-brutalist`, `soft-corporate`. Never include the word
480
- "design".
481
-
482
- Briefly tell the user what you extracted (palette, fonts, mood) and the name
483
- you chose. Ask if they want any adjustments before proceeding.
484
-
485
- ---
486
-
487
- ### Phase T2 — Generate skill text
488
-
489
- Write the complete DESIGN.md body for the new design. Use the **default design's
490
- DESIGN.md** as the canonical reference for section structure. Your output must
491
- include all of the same sections: Color Palette, Typography, Background Layers,
492
- Slide Layout, Component Library, Layout Primitives, Data Visualization (ECharts),
493
- Composition Guide, Code Blocks, Do & Don't, Reduced Motion.
494
-
495
- ---
496
-
497
- ### Phase T3 — Generate preview.html
498
-
499
- Write a self-contained HTML file with **at least 7 slides** that demonstrates
500
- the design can handle all common presentation content types:
501
-
502
- 1. **Cover** — title, subtitle, date/author
503
- 2. **Content with parallel items** — multiple items presented side by side
504
- (e.g., features, principles, team members)
505
- 3. **Content with quantitative data** — large numbers, metrics, or statistics
506
- 4. **Content with two distinct areas** — narrative paired with supporting
507
- evidence, or data paired with explanation
508
- 5. **Content with sequential process** — ordered steps or timeline
509
- 6. **Content with a quote or key message** — emphasis on a single statement
510
- 7. **Closing** — thank you, CTA, or summary
511
-
512
- Rules:
513
- - Use the exact CSS variables from the skill text you just generated
514
- - Each slide should demonstrate the design's visual style — collectively
515
- showcase all components at least once (cards, stat cards, quote block,
516
- step flow, evidence lists, chart containers, decorative fills, etc.)
517
- - Must use the 1920×1080 canvas with `transform: scale()` and `setupScaling()` JS
518
- - Must look great at 900×600px (DesignModal preview iframe size — canvas auto-scales)
519
- - Include working keyboard navigation, nav dots, and progress bar
520
-
521
- ---
522
-
523
- ### Phase T4 — Save the design
524
-
525
- Save the new design by writing the files and installing via the `designs` tool.
526
-
527
- **Step 1 — Write files to a temporary directory:**
528
-
529
- Create a temporary directory and write two files:
530
- - `DESIGN.md` — with YAML frontmatter (`name`, `description`, `author`, `version`)
531
- followed by the full skill text body from Phase T2
532
- - `preview.html` — the full HTML from Phase T3
533
-
534
- ```
535
- /tmp/revela-design-<name>/
536
- ├── DESIGN.md
537
- └── preview.html
538
- ```
539
-
540
- **Step 2 — Install the design:**
541
-
542
- Call the `designs` tool with action `"install"` and `source` pointing to the
543
- temporary directory path. Optionally pass `name` to override the design name.
544
-
545
- **Step 3 — Activate the design:**
546
-
547
- Call the `designs` tool with action `"activate"` and the design name.
548
-
549
- **Step 4 — Clean up:**
550
-
551
- Remove the temporary directory.
552
-
553
- ---
554
-
555
- ### Phase T5 — Confirm
556
-
557
- Tell the user:
558
-
559
- > Design **`<name>`** has been created and activated.
560
- > Open the design picker (the design button in the bottom bar) to see it.
561
- > Your next presentation will use this style automatically.
562
-
563
- Do not generate a presentation unless the user asks for one.
564
-
565
- ---
566
-
567
- ### Design Generation Rules
568
-
569
- - **Never** hardcode colors — always use CSS custom properties.
570
- - **Never** name a design after a brand or person. Use descriptive aesthetic names.
571
- - The `skill_md` you generate becomes the AI's only style reference — be precise.
572
- - preview.html must use the **exact same CSS variables** as the skill text.
573
- - If the user uploads multiple images with conflicting styles, ask which one to use.
574
-
575
- ---
576
-
577
485
  ## Active Design Reference
578
486
 
579
487
  The active design name is in the HTML comment at the top of this prompt: