wand-decks-kit 0.8.0

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.
Files changed (170) hide show
  1. package/PROMPT.md +461 -0
  2. package/README.md +137 -0
  3. package/START-HERE.md +98 -0
  4. package/assets/README.md +40 -0
  5. package/assets/_icon-contact-sheet.png +0 -0
  6. package/assets/bg-cover-dark.png +0 -0
  7. package/assets/bg-overlay-dark.png +0 -0
  8. package/assets/bg-statement-dark.png +0 -0
  9. package/assets/glyphs/README.md +29 -0
  10. package/assets/glyphs/activity.svg +15 -0
  11. package/assets/glyphs/atom.svg +17 -0
  12. package/assets/glyphs/badge-check.svg +16 -0
  13. package/assets/glyphs/bell.svg +16 -0
  14. package/assets/glyphs/blocks.svg +16 -0
  15. package/assets/glyphs/book-open.svg +16 -0
  16. package/assets/glyphs/bot.svg +20 -0
  17. package/assets/glyphs/boxes.svg +26 -0
  18. package/assets/glyphs/brain.svg +23 -0
  19. package/assets/glyphs/briefcase.svg +16 -0
  20. package/assets/glyphs/building-2.svg +21 -0
  21. package/assets/glyphs/calendar.svg +18 -0
  22. package/assets/glyphs/chart-column.svg +18 -0
  23. package/assets/glyphs/chart-line.svg +16 -0
  24. package/assets/glyphs/chart-pie.svg +16 -0
  25. package/assets/glyphs/circle-check.svg +16 -0
  26. package/assets/glyphs/clipboard-check.svg +17 -0
  27. package/assets/glyphs/clock.svg +16 -0
  28. package/assets/glyphs/cloud.svg +15 -0
  29. package/assets/glyphs/coins.svg +18 -0
  30. package/assets/glyphs/compass.svg +16 -0
  31. package/assets/glyphs/cpu.svg +24 -0
  32. package/assets/glyphs/database.svg +17 -0
  33. package/assets/glyphs/eye.svg +16 -0
  34. package/assets/glyphs/file-check.svg +17 -0
  35. package/assets/glyphs/filter.svg +15 -0
  36. package/assets/glyphs/fingerprint.svg +23 -0
  37. package/assets/glyphs/flag.svg +16 -0
  38. package/assets/glyphs/gauge.svg +16 -0
  39. package/assets/glyphs/gavel.svg +19 -0
  40. package/assets/glyphs/git-branch.svg +18 -0
  41. package/assets/glyphs/globe.svg +17 -0
  42. package/assets/glyphs/graduation-cap.svg +17 -0
  43. package/assets/glyphs/handshake.svg +19 -0
  44. package/assets/glyphs/hexagon.svg +15 -0
  45. package/assets/glyphs/index.json +175 -0
  46. package/assets/glyphs/infinity.svg +15 -0
  47. package/assets/glyphs/key.svg +17 -0
  48. package/assets/glyphs/landmark.svg +20 -0
  49. package/assets/glyphs/layers.svg +17 -0
  50. package/assets/glyphs/lightbulb.svg +17 -0
  51. package/assets/glyphs/link.svg +16 -0
  52. package/assets/glyphs/list-checks.svg +19 -0
  53. package/assets/glyphs/lock.svg +16 -0
  54. package/assets/glyphs/map.svg +17 -0
  55. package/assets/glyphs/megaphone.svg +16 -0
  56. package/assets/glyphs/message-square.svg +15 -0
  57. package/assets/glyphs/milestone.svg +17 -0
  58. package/assets/glyphs/network.svg +19 -0
  59. package/assets/glyphs/orbit.svg +19 -0
  60. package/assets/glyphs/package.svg +18 -0
  61. package/assets/glyphs/plug.svg +18 -0
  62. package/assets/glyphs/puzzle.svg +15 -0
  63. package/assets/glyphs/radar.svg +22 -0
  64. package/assets/glyphs/receipt.svg +17 -0
  65. package/assets/glyphs/refresh-cw.svg +18 -0
  66. package/assets/glyphs/rocket.svg +18 -0
  67. package/assets/glyphs/route.svg +17 -0
  68. package/assets/glyphs/scale.svg +19 -0
  69. package/assets/glyphs/search.svg +16 -0
  70. package/assets/glyphs/server.svg +18 -0
  71. package/assets/glyphs/settings.svg +16 -0
  72. package/assets/glyphs/share-2.svg +19 -0
  73. package/assets/glyphs/shield-check.svg +16 -0
  74. package/assets/glyphs/shuffle.svg +19 -0
  75. package/assets/glyphs/sparkles.svg +19 -0
  76. package/assets/glyphs/square-stack.svg +17 -0
  77. package/assets/glyphs/target.svg +17 -0
  78. package/assets/glyphs/trending-up.svg +16 -0
  79. package/assets/glyphs/triangle-alert.svg +17 -0
  80. package/assets/glyphs/trophy.svg +20 -0
  81. package/assets/glyphs/users.svg +18 -0
  82. package/assets/glyphs/wallet.svg +16 -0
  83. package/assets/glyphs/wand-sparkles.svg +22 -0
  84. package/assets/glyphs/workflow.svg +17 -0
  85. package/assets/glyphs/zap.svg +15 -0
  86. package/assets/icons/icon-11.png +0 -0
  87. package/assets/icons/icon-12.png +0 -0
  88. package/assets/icons/icon-13.png +0 -0
  89. package/assets/icons/icon-14.png +0 -0
  90. package/assets/icons/icon-15.png +0 -0
  91. package/assets/icons/icon-16.png +0 -0
  92. package/assets/icons/icon-17.png +0 -0
  93. package/assets/icons/icon-18.png +0 -0
  94. package/assets/icons/icon-20.png +0 -0
  95. package/assets/icons/icon-23.png +0 -0
  96. package/assets/icons/icon-24.png +0 -0
  97. package/assets/icons/icon-25.png +0 -0
  98. package/assets/icons/icon-27.png +0 -0
  99. package/assets/icons/icon-28.png +0 -0
  100. package/assets/icons/icon-30.png +0 -0
  101. package/assets/icons/icon-31.png +0 -0
  102. package/assets/icons/icon-32.png +0 -0
  103. package/assets/icons/icon-33.png +0 -0
  104. package/assets/icons/icon-34.png +0 -0
  105. package/assets/icons/icon-35.png +0 -0
  106. package/assets/icons/icon-36.png +0 -0
  107. package/assets/icons/icon-37.png +0 -0
  108. package/assets/icons/icon-39.png +0 -0
  109. package/assets/icons/icon-40.png +0 -0
  110. package/assets/icons/icon-41.png +0 -0
  111. package/assets/icons/icon-43.png +0 -0
  112. package/assets/icons/icon-44.png +0 -0
  113. package/assets/icons/icon-45.png +0 -0
  114. package/assets/icons/icon-46.png +0 -0
  115. package/assets/icons/icon-48.png +0 -0
  116. package/assets/icons/icon-49.png +0 -0
  117. package/assets/icons/icon-50.png +0 -0
  118. package/assets/icons/icon-51.png +0 -0
  119. package/assets/icons/icon-52.png +0 -0
  120. package/assets/icons/icon-53.png +0 -0
  121. package/assets/icons/icon-9.png +0 -0
  122. package/assets/mark-dark.png +0 -0
  123. package/assets/mark-white.png +0 -0
  124. package/assets/orb-cover.png +0 -0
  125. package/assets/wordmark-dark.png +0 -0
  126. package/assets/wordmark-white.png +0 -0
  127. package/build.js +192 -0
  128. package/build_example.js +91 -0
  129. package/build_infinite.js +283 -0
  130. package/docs/LAYOUTS.md +86 -0
  131. package/docs/PIPELINE.md +116 -0
  132. package/docs/SPEC.md +89 -0
  133. package/embed_fonts.py +193 -0
  134. package/examples/template.json +164 -0
  135. package/fonts/Geist-Bold.ttf +0 -0
  136. package/fonts/Geist-BoldItalic.ttf +0 -0
  137. package/fonts/Geist-ExtraBold.ttf +0 -0
  138. package/fonts/Geist-ExtraBoldItalic.ttf +0 -0
  139. package/fonts/Geist-Italic.ttf +0 -0
  140. package/fonts/Geist-Light.ttf +0 -0
  141. package/fonts/Geist-LightItalic.ttf +0 -0
  142. package/fonts/Geist-Medium.ttf +0 -0
  143. package/fonts/Geist-MediumItalic.ttf +0 -0
  144. package/fonts/Geist-Regular.ttf +0 -0
  145. package/fonts/Geist-SemiBold.ttf +0 -0
  146. package/fonts/Geist-SemiBoldItalic.ttf +0 -0
  147. package/lib/README.md +23 -0
  148. package/lib/brand.js +51 -0
  149. package/lib/glyphs.js +87 -0
  150. package/lib/layouts_client.js +212 -0
  151. package/lib/layouts_consult.js +301 -0
  152. package/lib/layouts_dense.js +361 -0
  153. package/lib/measure.js +109 -0
  154. package/lib/pdf.js +517 -0
  155. package/lib/plan.js +305 -0
  156. package/lib/render_pdf.js +203 -0
  157. package/lib/schema.js +399 -0
  158. package/lib/shared.js +15 -0
  159. package/lib/trace.js +88 -0
  160. package/lib/ttf.py +167 -0
  161. package/lib/wandxml.py +37 -0
  162. package/package.json +17 -0
  163. package/preview/preview.css +112 -0
  164. package/preview/preview.html +24 -0
  165. package/preview/preview.js +169 -0
  166. package/qa_coverage.py +120 -0
  167. package/requirements.txt +9 -0
  168. package/tools/extract.py +199 -0
  169. package/wand.js +397 -0
  170. package/wand_kit.js +1016 -0
package/build.js ADDED
@@ -0,0 +1,192 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * build.js — build a deck from a spec file.
4
+ *
5
+ * node build.js deck.json out.pptx build the deck
6
+ * node build.js deck.json out.pdf the same deck, as a PDF
7
+ * node build.js deck.json --preview write preview/trace.js and stop
8
+ * node build.js deck.json --check fit report only, no output
9
+ *
10
+ * The spec is plain data (see schema.md). Same spec feeds the .pptx build and
11
+ * the browser preview, so the two can't drift.
12
+ */
13
+
14
+ const fs = require("fs");
15
+ const path = require("path");
16
+ const pptxgen = require("pptxgenjs");
17
+ const W = require("./wand_kit");
18
+ const { trace } = require("./lib/trace");
19
+ const M = require("./lib/shared").measure;
20
+
21
+ const FULL_BLEED = new Set(["cover", "divider", "closing"]);
22
+
23
+ function loadSpec(p) {
24
+ const raw = fs.readFileSync(p, "utf8");
25
+ const spec = p.endsWith(".js") ? require(path.resolve(p)) : JSON.parse(raw);
26
+ if (!Array.isArray(spec.slides)) throw new Error("spec has no `slides` array");
27
+ return spec;
28
+ }
29
+
30
+ /** Build the .pptx. */
31
+ function build(spec, out) {
32
+ const pres = W.newDeck(pptxgen);
33
+ const total = spec.slides.length;
34
+ spec.slides.forEach((sl, i) => {
35
+ const fn = W[sl.layout];
36
+ if (typeof fn !== "function") throw new Error(`slide ${i + 1}: unknown layout "${sl.layout}"`);
37
+ const args = { ...sl, n: i + 1, total };
38
+ if (!FULL_BLEED.has(sl.layout)) {
39
+ args.deck = sl.deck || spec.deck;
40
+ args.confidential = sl.confidential || spec.confidential;
41
+ }
42
+ fn(pres, args);
43
+ });
44
+ return pres.writeFile({ fileName: out }).then(() => {
45
+ console.log(`wrote ${out} (${total} slides)`);
46
+ });
47
+ }
48
+
49
+ /**
50
+ * Fit report. Walks the trace, re-measures every text shape in real Geist, and
51
+ * lists anything that overflows its box. This is the check LibreOffice cannot
52
+ * do (§9) — it substitutes DejaVu and lies about widths in both directions.
53
+ */
54
+ function check(spec) {
55
+ const t = trace(W, spec);
56
+ t.errors.forEach((e) => console.error("ERROR " + e));
57
+ let bad = 0, checked = 0;
58
+ for (const sl of t.slides) {
59
+ for (const sh of sl.shapes) {
60
+ if (sh.kind !== "text" || !sh.w || !sh.h) continue;
61
+ const text = sh.runs.map((r) => r.text).join("");
62
+ if (!text.trim()) continue;
63
+ const o = sh.runs[0].options || {};
64
+ const opts = {
65
+ family: o.fontFace || sh.fontFace || "Geist",
66
+ fontSize: o.fontSize || sh.fontSize || 12,
67
+ bold: o.bold ?? sh.bold ?? false,
68
+ italic: o.italic ?? sh.italic ?? false,
69
+ lineSpacingMultiple: sh.lineSpacingMultiple || 1.2,
70
+ };
71
+ checked++;
72
+ // Measure the runs as they are actually set, not the whole string in the
73
+ // first run's face. The accent-italic device puts an italic in the middle
74
+ // of a bold title, and italic is wider — so a title could pass here and
75
+ // still drop its closing period onto a second line. The PDF renderer
76
+ // lays runs out individually, so this has to as well or the gate and the
77
+ // page disagree.
78
+ const v = sh.runs.length > 1 ? fitsRuns(sh) : M.fits(text, sh.w, sh.h, opts);
79
+ if (!v.ok) {
80
+ bad++;
81
+ const snip = text.length > 52 ? text.slice(0, 52) + "…" : text;
82
+ console.log(
83
+ ` S${String(sl.index).padStart(2, "0")} ${String(sl.layout).padEnd(14)} ` +
84
+ `+${v.overflowIn}" ${v.lines}ln @${opts.fontSize}pt "${snip}"`
85
+ );
86
+ }
87
+ }
88
+ }
89
+ // Bounds check. A shape can fit its own box and still be off the slide or
90
+ // buried under the footer — coverage QA won't catch that, because the text is
91
+ // present in the XML either way.
92
+ const FULL_BLEED = new Set(["cover", "divider", "closing"]);
93
+ let oob = 0;
94
+ for (const sl of t.slides) {
95
+ // 5.10 not 5.05: the reference deck's own six-up rows end at 5.08
96
+ const limit = FULL_BLEED.has(sl.layout) ? 5.625 : 5.10;
97
+ for (const sh of sl.shapes) {
98
+ if (sh.w == null || sh.h == null) continue;
99
+ const bottom = (sh.y || 0) + sh.h, right = (sh.x || 0) + sh.w;
100
+ const past = bottom > limit + 0.01, off = right > 10.01 || (sh.x || 0) < -0.01;
101
+ if (!past && !off) continue;
102
+ // full-bleed art legitimately covers the slide; the footer band legitimately
103
+ // sits below the content limit
104
+ if (sh.kind === "image" && (sh.w >= 9.9 || FULL_BLEED.has(sl.layout))) continue;
105
+ if ((sh.y || 0) >= 5.15) continue;
106
+ oob++;
107
+ const label = sh.kind === "text" ? `"${sh.runs.map((r) => r.text).join("").slice(0, 40)}"` : sh.type || sh.kind;
108
+ console.log(` S${String(sl.index).padStart(2, "0")} ${String(sl.layout).padEnd(14)} ` +
109
+ `${past ? `bottom ${bottom.toFixed(2)}\" past ${limit}\"` : "off canvas"} ${label}`);
110
+ }
111
+ }
112
+ // Asset check. A missing glyph used to surface as a pptxgenjs stack trace
113
+ // during writeFile, after every other gate had passed - so the failure looked
114
+ // like a bug in the writer rather than a typo in the spec.
115
+ let missing = 0;
116
+ const seen = new Set();
117
+ for (const sl of t.slides) {
118
+ for (const sh of sl.shapes) {
119
+ if (sh.kind !== "image" || !sh.path || seen.has(sh.path)) continue;
120
+ seen.add(sh.path);
121
+ if (fs.existsSync(sh.path)) continue;
122
+ missing++;
123
+ console.log(` S${String(sl.index).padStart(2, "0")} ${String(sl.layout).padEnd(14)} ` +
124
+ `no such asset ${path.relative(path.dirname(require("./lib/brand").resolve("assets")), sh.path)}`);
125
+ }
126
+ }
127
+
128
+ console.log(`\nfit check : ${checked - bad}/${checked} text shapes fit in Geist` +
129
+ (bad ? ` — ${bad} overflow${bad > 1 ? "s" : ""} above` : " — clean"));
130
+ console.log(`bounds check: ${oob ? oob + " shape(s) outside the content band — listed above" : "clean"}`);
131
+ console.log(`asset check : ${missing ? missing + " missing — listed above" : `${seen.size} resolved`}`);
132
+ return bad + oob + missing;
133
+ }
134
+
135
+ /** The same trace, as a PDF. Fonts embedded, no LibreOffice, no conversion. */
136
+ function pdf(spec, out) {
137
+ const t = trace(W, spec);
138
+ t.errors.forEach((e) => console.error("ERROR " + e));
139
+ const { renderTrace } = require("./lib/render_pdf");
140
+ const r = renderTrace(t, out, { fontkit: require("fontkit") });
141
+ r.missing.forEach((m) => console.log(` missing asset ${m}`));
142
+ console.log(`wrote ${out} (${r.pages} pages)`);
143
+ return r.missing.length;
144
+ }
145
+
146
+ /** Fit, measured run by run — the same layout the PDF renderer performs. */
147
+ function fitsRuns(sh) {
148
+ const { layoutRuns } = require("./lib/render_pdf");
149
+ const lines = layoutRuns(sh);
150
+ const mult = sh.lineSpacingMultiple || 1.2;
151
+ const h = lines.reduce((a, l) => a + (Math.max(...l.parts.map((p) => p.st.size)) * mult) / 72, 0);
152
+ const widest = Math.max(0, ...lines.map((l) => l.parts.reduce((a, p) => a + p.w, 0)));
153
+ const boxW = (sh.w || 0) - (sh.margin === 0 ? 0 : 0.1);
154
+ return {
155
+ ok: h <= (sh.h || 0) + 1e-6 && widest <= boxW + 1e-6,
156
+ lines: lines.length,
157
+ overflowIn: +Math.max(0, h - (sh.h || 0)).toFixed(3),
158
+ };
159
+ }
160
+
161
+ /** Emit the trace as a JS file the preview page can load without a web server. */
162
+ function preview(spec, specPath) {
163
+ const t = trace(W, spec);
164
+ t.errors.forEach((e) => console.error("ERROR " + e));
165
+ t.title = spec.deck || path.basename(specPath);
166
+ // The preview lives next to the kit but the brand payload may not: in the
167
+ // repo it is three levels up, in a packaged zip it is one. Resolve it once
168
+ // here and hand the preview a relative URL, so preview.js needs no rule.
169
+ const brand = require("./lib/brand");
170
+ const previewDir = path.join(__dirname, "preview");
171
+ const url = (d) => path.relative(previewDir, brand.resolve(d)).split(path.sep).join("/") + "/";
172
+ t.assetsBase = url("assets");
173
+ t.fontsBase = url("fonts");
174
+ const out = path.join(previewDir, "trace.js");
175
+ fs.writeFileSync(out, "window.__WAND_TRACE__ = " + JSON.stringify(t, null, 1) + ";\n");
176
+ console.log(`wrote ${out} (${t.slides.length} slides) — open preview/preview.html`);
177
+ }
178
+
179
+ const [, , specPath, arg] = process.argv;
180
+ if (!specPath) {
181
+ console.error("usage: node build.js <spec.json> [out.pptx | out.pdf | --preview | --check]");
182
+ process.exit(2);
183
+ }
184
+ const spec = loadSpec(specPath);
185
+ if (arg === "--preview") preview(spec, specPath);
186
+ else if (arg === "--check") process.exit(check(spec) ? 1 : 0);
187
+ else if (arg && arg.endsWith(".pdf")) process.exit(pdf(spec, arg) ? 1 : 0);
188
+ else {
189
+ const bad = check(spec);
190
+ if (bad) console.log("(building anyway — fix the overflows above before shipping)\n");
191
+ build(spec, arg || "out.pptx").catch((e) => { console.error(e); process.exit(1); });
192
+ }
@@ -0,0 +1,91 @@
1
+ /* build_example.js — smoke test + usage reference for wand_kit.
2
+ node build_example.js -> example.pptx */
3
+ const pptxgen = require("pptxgenjs");
4
+ const W = require("./wand_kit");
5
+
6
+ const DECK = "KIT SMOKE TEST", TOTAL = 8;
7
+ const pres = W.newDeck(pptxgen);
8
+
9
+ W.cover(pres, {
10
+ tag: "THE SHIFT", eyebrow: "The agentic workforce advantage",
11
+ titleLines: ["A New Class", "Of Labor Is Here"],
12
+ body: "The next decade of enterprise performance won't be won with better tools. It will be won by the companies that build a workforce of humans and AI agents — governed as one.",
13
+ kickerPlain: "Others build AI tools.", kickerBold: "We build workforces.",
14
+ });
15
+
16
+ W.divider(pres, {
17
+ tag: "THE SHIFT", eyebrow: "Wand · The agentic workforce",
18
+ titleText: ["Infinite ", "labor", "."],
19
+ body: "The first workforce in history with human drives — curiosity, initiative, learning, growth — working beside people.",
20
+ });
21
+
22
+ W.threeUp(pres, {
23
+ tag: "THE SHIFT", deck: DECK, n: 3, total: TOTAL, dark: true, arrows: true,
24
+ titleText: "A new class of labor.",
25
+ subtitleText: "AI agents are no longer tools. They are a new form of labor — faster, more affordable, improving every quarter.",
26
+ items: [
27
+ { eyebrow: "Today · every company", title: "Human-Centric", pill: "100% human", body: "Humans think, decide, and execute. AI shows up in pockets, as tools. Sophisticated — but slow, costly, capped." },
28
+ { eyebrow: "The target model", title: "Hybrid / Dual", pill: "humans + AI agents", body: "One workforce, two kinds of colleagues — shared roles, shared objectives, shared accountability.", emph: true },
29
+ { eyebrow: "The horizon", title: "Autonomous", pill: "10:1 – 500:1 agents", body: "Agents are the primary workforce. Humans set direction. The emerging frontier." },
30
+ ],
31
+ });
32
+
33
+ W.fourUpIcon(pres, {
34
+ tag: "THE BREAKTHROUGH", deck: DECK, n: 4, total: TOTAL, dark: true,
35
+ titleText: ["We didn't build tools for humans. ", "We built workers that want", "."],
36
+ subtitleText: "Every Wand agent runs on intrinsic drives, not prompts.",
37
+ items: [
38
+ { icon: "icon-11.png", title: "Curiosity", body: "Explores what it doesn't understand — probing, questioning, mapping its world without being asked." },
39
+ { icon: "icon-12.png", title: "Initiative", body: "Generates and prioritizes its own work from a continuous loop of internal goals." },
40
+ { icon: "icon-13.png", title: "Learning", body: "Ends every task in structured reflection. Every lesson propagates into new patterns." },
41
+ { icon: "icon-14.png", title: "Growth", body: "Evolves measurably, quarter after quarter — compounding like your best hire." },
42
+ ],
43
+ kickerText: "The difference between software you operate and a colleague you trust.",
44
+ });
45
+
46
+ W.sixUpIcon(pres, {
47
+ tag: "THE WAND AGENT TECHNOLOGY", deck: DECK, n: 5, total: TOTAL, dark: false,
48
+ titleText: ["What makes a ", "Wand agent", " different."],
49
+ subtitleText: "The deepest agentic core in the category, built around drives.",
50
+ items: [
51
+ { icon: "icon-15.png", title: "Intrinsic motivation", body: "A continuous loop of internal drives generating and prioritizing its own work." },
52
+ { icon: "icon-16.png", title: "Self-improving by design", body: "Every task ends in structured reflection; lessons propagate into new patterns." },
53
+ { icon: "icon-17.png", title: "Safety on commit", body: "A validation gate sandboxes every risky action before anything happens." },
54
+ { icon: "icon-18.png", title: "Persistent strategy", body: "Operating theses are first-class objects — versioned, lineage-tracked." },
55
+ { icon: "icon-20.png", title: "Real organizations", body: "Manager/worker hierarchy, shared goals, deliberation channels." },
56
+ { icon: "icon-23.png", title: "One system, any domain", body: "The same primitives run alpha-trading or customer support." },
57
+ ],
58
+ });
59
+
60
+ W.rows(pres, {
61
+ tag: "THE FULL STACK", deck: DECK, n: 6, total: TOTAL, dark: true,
62
+ titleText: ["A workforce needs more than workers — it needs ", "institutions", "."],
63
+ subtitleText: "Wand builds the civic layer of AI labor.",
64
+ items: [
65
+ { icon: "icon-24.png", label: "Hybrid Human–AI OS", description: "The operating system of the intelligent organization — humans and agents governed as one.", badge: "WAND" },
66
+ { icon: "icon-25.png", label: "AI Labor", description: "The governed agentic workforce — a Network, a University, Governance and an Economy.", badge: "WAND" },
67
+ { icon: "icon-27.png", label: "Autonomous Agents", description: "Self-initiating agents with persistent memory — each owning KPIs and a seat in the org chart.", badge: "WAND" },
68
+ { icon: "icon-28.png", label: "LLMs", description: "The reasoning layer. Anthropic · OpenAI · Google · Meta · Mistral · open source.", badge: "BRING YOUR OWN", ours: false },
69
+ { icon: "icon-30.png", label: "Compute · Cloud · GPU", description: "The physical capacity layer. AWS · Azure · GCP · Oracle · CoreWeave · Nebius.", badge: "BRING YOUR OWN", ours: false },
70
+ ],
71
+ });
72
+
73
+ W.parity(pres, {
74
+ tag: "HUMAN PARITY", deck: DECK, n: 7, total: TOTAL, dark: false,
75
+ titleText: ["Two kinds of colleagues. ", "One set of drives", "."],
76
+ subtitleText: "For the first time, people and machines share more than tasks — they share temperament.",
77
+ left: { label: "A great human hire", icon: "icon-31.png", items: ["Curious about the problem", "Committed to the goal", "Learns from every outcome", "Owns a role, answers for results", "Grows year over year"] },
78
+ right: { label: "A Wand agent", icon: "icon-32.png", items: ["Curious by architecture", "Committed to the KPIs it owns", "Reflects and learns after every task", "Holds a seat in the org chart", "Evolves quarter over quarter"] },
79
+ badge: "=",
80
+ kickerText: "Not automation replacing people — humanity gaining a second workforce built in its own image.",
81
+ });
82
+
83
+ W.closing(pres, {
84
+ eyebrow: "The mission",
85
+ line1: "The biggest transition in human history.",
86
+ line2: "Humanity's next level of evolution.",
87
+ body: "Infinite labor, human direction. People and agents — curious, committed, evolving.",
88
+ url: "wand.ai",
89
+ });
90
+
91
+ pres.writeFile({ fileName: "example.pptx" }).then(() => console.log("wrote example.pptx"));
@@ -0,0 +1,283 @@
1
+ /* build_infinite.js — Infinite Labor rebuilt through wand-kit.
2
+ Mapping plan (source slide -> layout):
3
+ S01 cover -> L1 cover-D
4
+ S02 divider -> L2 divider-D
5
+ S03 content, 3-step -> L5 threeUpArrows-D
6
+ S04 hero + 3 stats -> L17 featureStats-L
7
+ S05 content, 4 icon -> L6 fourUpIcon-D
8
+ S06 comparison, list-shaped -> L10 parity-L
9
+ S07 3 layers + bullets -> L11 colCards-D
10
+ S08 stack/ownership -> L9 rows-D (S10 is a duplicate; dropped per §10)
11
+ S09 content, 6 icon -> L7 sixUpIcon-L
12
+ S11 product architecture -> productMap-L (bespoke, measured from source)
13
+ S12 ranked magnitudes -> L18 barRank-L
14
+ S13 equation + 4 stats -> L20 band-L
15
+ S14 hero + 4 tiles -> heroQuad-D (bespoke, measured from source)
16
+ S15 margin bridge -> L19 bridge-L
17
+ S16 content, 6 icon -> L7 sixUpIcon-D
18
+ S17 closing -> L3 closing-D
19
+ */
20
+ const pptxgen = require("pptxgenjs");
21
+ const W = require("./wand_kit");
22
+
23
+ const DECK = "THE AGENTIC WORKFORCE";
24
+ const TOTAL = 16;
25
+ const pres = W.newDeck(pptxgen);
26
+ let n = 0;
27
+ const p = () => ++n;
28
+
29
+ /* S01 ---------------------------------------------------------------- L1 */
30
+ W.cover(pres, {
31
+ tag: "THE SHIFT",
32
+ eyebrow: "THE AGENTIC WORKFORCE ADVANTAGE",
33
+ titleLines: ["A New Class", "Of Labor Is Here"],
34
+ body: "The next decade of enterprise performance won't be won with better tools. It will be won by the companies that build a workforce of humans and AI agents — governed as one.",
35
+ kickerPlain: "Others build AI tools.",
36
+ kickerBold: "We build workforces.",
37
+ });
38
+ p();
39
+
40
+ /* S02 ---------------------------------------------------------------- L2 */
41
+ W.divider(pres, {
42
+ tag: "THE SHIFT",
43
+ eyebrow: "WAND · THE AGENTIC WORKFORCE",
44
+ titleText: ["Infinite ", "labor", "."],
45
+ body: "The first workforce in history with human drives — curiosity, initiative, learning, growth — working beside people, at the scale of civilization's ambitions.",
46
+ });
47
+ p();
48
+
49
+ /* S03 ---------------------------------------------------------------- L5 */
50
+ W.threeUp(pres, {
51
+ tag: "THE SHIFT", deck: DECK, n: p(), total: TOTAL, dark: true, arrows: true,
52
+ titleText: "A new class of labor.",
53
+ subtitleText: "AI agents are no longer tools. They are a new form of labor — faster, more affordable, improving every quarter at a pace no organization can hire against.",
54
+ items: [
55
+ { eyebrow: "TODAY · EVERY COMPANY", title: "Human-Centric", pill: "100% human",
56
+ body: "Humans think, decide, and execute. AI shows up in pockets, as tools. Sophisticated — but slow, costly, capped." },
57
+ { eyebrow: "THE TARGET MODEL", title: "Hybrid / Dual", pill: "humans + AI agents", emph: true,
58
+ body: "One workforce, two kinds of colleagues — shared roles, shared objectives, shared accountability. Fast, affordable, alive." },
59
+ { eyebrow: "THE HORIZON", title: "Autonomous", pill: "10:1 – 500:1 agents",
60
+ body: "Agents are the primary workforce. Humans set direction. The emerging frontier." },
61
+ ],
62
+ });
63
+
64
+ /* S04 --------------------------------------------------------------- L17 */
65
+ W.featureStats(pres, {
66
+ tag: "THE VISION", deck: DECK, n: p(), total: TOTAL, dark: false,
67
+ titleText: ["Everything humanity ever built\nwas ", "rationed by labor", "."],
68
+ subtitleText: "Every cure not researched. Every student not tutored. Every idea that died in a backlog — lost not to a lack of imagination, but to a lack of hands. For all of history, labor has been the scarcest resource on Earth.",
69
+ lead: { icon: "icon-9.png", runs: [
70
+ { text: "Wand makes labor " },
71
+ { text: "infinite", accent: true },
72
+ { text: " — a workforce of agents and humans that grows itself." },
73
+ ] },
74
+ stats: [
75
+ { value: "∞", caption: "execution capacity,\nalways on" },
76
+ { value: "10–100×", caption: "speed improvement\nvs. human baseline" },
77
+ { value: "3–5 yrs", caption: "to category lock-in\n— this transition" },
78
+ ],
79
+ });
80
+
81
+ /* S05 ---------------------------------------------------------------- L6 */
82
+ W.fourUpIcon(pres, {
83
+ tag: "THE BREAKTHROUGH", deck: DECK, n: p(), total: TOTAL, dark: true,
84
+ titleText: ["We didn't build tools for humans.\nWe built ", "workers that want", "."],
85
+ subtitleText: "Every Wand agent runs on intrinsic drives, not prompts — the same inner engine that makes your best people your best people.",
86
+ items: [
87
+ { icon: "icon-11.png", title: "Curiosity", body: "Explores what it doesn't understand — probing, questioning, mapping its world without being asked." },
88
+ { icon: "icon-12.png", title: "Initiative", body: "Generates and prioritizes its own work from a continuous loop of internal goals. No prompt required." },
89
+ { icon: "icon-13.png", title: "Learning", body: "Ends every task in structured reflection. Every lesson propagates into new patterns and strategies." },
90
+ { icon: "icon-14.png", title: "Growth", body: "Evolves measurably, quarter after quarter — compounding like your best hire, without the ceiling." },
91
+ ],
92
+ kickerText: "The difference between software you operate and a colleague you trust.",
93
+ });
94
+
95
+ /* S06 --------------------------------------------------------------- L10 */
96
+ W.parity(pres, {
97
+ tag: "HUMAN PARITY", deck: DECK, n: p(), total: TOTAL, dark: false,
98
+ titleText: ["Two kinds of colleagues. ", "One set of drives", "."],
99
+ subtitleText: "For the first time, people and machines share more than tasks — they share temperament.",
100
+ left: { label: "A GREAT HUMAN HIRE", icon: "icon-31.png", items: [
101
+ "Curious about the problem", "Committed to the goal", "Learns from every outcome",
102
+ "Owns a role, answers for results", "Grows year over year" ] },
103
+ right: { label: "A WAND AGENT", icon: "icon-9.png", items: [
104
+ "Curious by architecture", "Committed to the KPIs it owns", "Reflects and learns after every task",
105
+ "Holds a seat in the org chart", "Evolves quarter over quarter" ] },
106
+ badge: "=",
107
+ kickerText: "Not automation replacing people — humanity gaining a second workforce built in its own image.",
108
+ });
109
+
110
+ /* S07 --------------------------------------------------------------- L11 */
111
+ W.colCards(pres, {
112
+ tag: "HOW WAND WAS BUILT", deck: DECK, n: p(), total: TOTAL, dark: true,
113
+ titleText: "Three layers that turn AI tools into a workforce.",
114
+ items: [
115
+ { art: "orb-cover.png", eyebrow: "Agents", title: "Real Agents",
116
+ body: "Identity, multi-layered memory, objectives, escalation logic, action history, and self-initiation. They don't wait for prompts, they pursue goals, take action, and improve on their own, within defined policy boundaries.",
117
+ bullets: ["Persistent identity & role", "Contextual + episodic + strategic memory", "Self-initiating drive engine", "Full traceability"] },
118
+ { art: "orb-cover.png", eyebrow: "The Workforce", title: "Agentic Workforce",
119
+ body: "Agents are hired, managed, and scaled like people, embedded in the org chart with managers, peers, KPIs, and lifecycle. Includes a unified Workforce Registry covering humans and agents.",
120
+ bullets: ["Agent Network (humans + agents)", "Agent University (training & evolution)", "Agent Management (policy & oversight)", "Agent Economy (tools & marketplace)"] },
121
+ { art: "orb-cover.png", eyebrow: "The OS", title: "Wand OS",
122
+ body: "The unifying control plane that manages, governs, and orchestrates agents from any vendor, Gemini, Copilot, custom, or Wand-native, as a single capacity layer alongside humans.",
123
+ bullets: ["Control Panel (orchestration & oversight)", "Collab (human-agent workspace)", "Process Automation", "Division Automation"] },
124
+ ],
125
+ });
126
+
127
+ /* S08 (S10 is its duplicate — dropped per §10) ------------------------ L9 */
128
+ W.rows(pres, {
129
+ tag: "THE FULL STACK", deck: DECK, n: p(), total: TOTAL, dark: true,
130
+ titleText: ["A workforce needs more than workers —\nit needs ", "institutions", "."],
131
+ subtitleText: "Wand builds the civic layer of AI labor — and sits on whatever models and compute you already run.",
132
+ items: [
133
+ { icon: "icon-24.png", label: "Hybrid Human–AI OS", badge: "WAND",
134
+ description: "The operating system of the intelligent organization — humans and agents governed as one, continuously optimized." },
135
+ { icon: "icon-25.png", label: "AI Labor", badge: "WAND",
136
+ description: "The governed agentic workforce — a Network to collaborate, a University to learn, Governance and an Economy." },
137
+ { icon: "icon-27.png", label: "Autonomous Agents", badge: "WAND",
138
+ description: "Self-initiating, self-evolving agents with persistent memory — each owning KPIs and a seat inside the org chart." },
139
+ { icon: "icon-28.png", label: "LLMs", badge: "BRING YOUR OWN", ours: false,
140
+ description: "The reasoning layer. Anthropic · OpenAI · Google · Meta · Mistral · open source." },
141
+ { icon: "icon-30.png", label: "Compute · Cloud · GPU", badge: "BRING YOUR OWN", ours: false,
142
+ description: "The physical capacity layer. AWS · Azure · GCP · Oracle · CoreWeave · Nebius." },
143
+ ],
144
+ });
145
+
146
+ /* S09 ---------------------------------------------------------------- L7 */
147
+ W.sixUpIcon(pres, {
148
+ tag: "THE WAND AGENT TECHNOLOGY", deck: DECK, n: p(), total: TOTAL, dark: false,
149
+ titleText: ["What makes a ", "Wand agent", " different."],
150
+ subtitleText: "Wand's foundational technology — the deepest agentic core in the category, built around drives.",
151
+ items: [
152
+ { icon: "icon-15.png", title: "Intrinsic motivation, not prompts", body: "A continuous loop of internal drives — goal-pursuit, curiosity, frugality, reflection — generating and prioritizing its own work." },
153
+ { icon: "icon-16.png", title: "Self-improving by design", body: "Every task ends in structured reflection; lessons propagate into new patterns, strategies, probes, and schedules." },
154
+ { icon: "icon-17.png", title: "Safety on commit", body: "A validation gate sandboxes every risky action: verdict plus falsifiable prediction before anything happens." },
155
+ { icon: "icon-18.png", title: "Persistent strategy", body: "Operating theses are first-class objects — versioned, lineage-tracked, capital-allocated, composable." },
156
+ { icon: "icon-20.png", title: "Real organizations", body: "Manager/worker hierarchy, shared goals, measurement integrity, deliberation channels, an internal economy." },
157
+ { icon: "icon-23.png", title: "One system, any domain", body: "The same primitives run alpha-trading or customer support — only missions and validators differ." },
158
+ ],
159
+ });
160
+
161
+ /* S11 -------------------------------------------------------- productMap */
162
+ W.productMap(pres, {
163
+ tag: "WAND OPERATING SYSTEM", deck: DECK, n: p(), total: TOTAL, dark: false,
164
+ titleText: ["Multiple products. ", "One unified workforce", "."],
165
+ subtitleText: "One operating system — from a single message to an entire delegated function.",
166
+ bandRow: { rail: "MANAGE", icon: "icon-24.png", title: "Control Panel",
167
+ body: "Hub for intelligent actions, governance, visibility, and control across the entire workforce." },
168
+ cards: [
169
+ { icon: "icon-33.png", title: "Collab", body: "Unified workspace for real-time coordination between agent and human teams.",
170
+ bullets: ["Shared task layer", "In-line agent escalation", "Mixed-team conversations"] },
171
+ { icon: "icon-34.png", title: "Process Designer", body: "Self-improving workflows with escalations triggered by confidence or compliance.",
172
+ bullets: ["Natural-language workflows", "Self-improving processes", "Compliance gates"] },
173
+ { icon: "icon-35.png", title: "Division Designer", body: "Delegate entire functions — agent teams plan, coordinate, and deliver from goals.",
174
+ bullets: ["Goal-driven autonomy", "Multi-agent teams", "Outcome accountability"] },
175
+ ],
176
+ split: { rail: "WORKFORCE", left: "Agentic Workforce", right: "Human Workforce" },
177
+ base: "THE ORGANIZATION'S TOOLS, DATA, COMPUTE & INFRASTRUCTURE CONNECTIVITY",
178
+ });
179
+
180
+ /* S12 --------------------------------------------------------------- L18 */
181
+ W.barRank(pres, {
182
+ tag: "THE MARKET", deck: DECK, n: p(), total: TOTAL, dark: false,
183
+ titleText: ["A $60T market — and the work\nitself is the ", "substrate", "."],
184
+ subtitleText: "Software sold tools that help workers. Wand sells the worker — and this worker learns.",
185
+ bars: [
186
+ { label: "Total global labor", value: "$60T+", frac: 1.00 },
187
+ { label: "Knowledge work TAM", value: "$20T+", frac: 0.64 },
188
+ { label: "Agent-addressable today", value: "$4–6T", frac: 0.44 },
189
+ { label: "Wand SOM · 2029", value: "$50–100B", frac: 0.24 },
190
+ ],
191
+ cards: [
192
+ { icon: "icon-36.png", value: "70–95%", caption: "cost reduction vs. human-only operations" },
193
+ { icon: "icon-12.png", value: "100×", caption: "speed increase vs. traditional workflows" },
194
+ { icon: "icon-37.png", value: "60×", caption: "customer ROI on a typical Wand commitment" },
195
+ ],
196
+ footnote: "TAM expands as agentic transformation creates entirely new categories of addressable work.",
197
+ });
198
+
199
+ /* S13 --------------------------------------------------------------- L20 */
200
+ W.band(pres, {
201
+ tag: "THE SOVEREIGN LOGIC", deck: DECK, n: p(), total: TOTAL, dark: false,
202
+ titleText: ["Nations are running out of ", "workers", "."],
203
+ subtitleText: "Every conventional remedy — retirement ages, birth rates, immigration — is politically impossible or mathematically insufficient. Governed AI labor is the only lever that scales.",
204
+ icon: "icon-39.png",
205
+ runs: [
206
+ { text: "National wealth = (humans × productivity) + " },
207
+ { text: "(AI agents × agent productivity)", accent: true },
208
+ ],
209
+ stats: [
210
+ { value: "33 → 52", caption: "people 65+ per 100 workers\nOECD · today → 2060" },
211
+ { value: "−13%", caption: "working-age population,\nOECD, next 40 years" },
212
+ { value: "11M", caption: "Japan's projected worker\nshortfall by 2040" },
213
+ { value: "$0", caption: "pensions, healthcare, or\nvisas — per agent, ever" },
214
+ ],
215
+ quote: "\u201cYou're not describing a technology. You're describing a new factor of production.\u201d — a sitting finance minister",
216
+ });
217
+
218
+ /* S14 ---------------------------------------------------------- heroQuad */
219
+ W.heroQuad(pres, {
220
+ tag: "THE CATALYST", deck: DECK, n: p(), total: TOTAL, dark: true,
221
+ titleText: ["Sovereign deals in ", "advanced stages", "."],
222
+ subtitleText: "Nations are hiring the new workforce — a combined commitment that anchors the priced round and validates Wand as sovereign-grade infrastructure.",
223
+ hero: {
224
+ pill: "ADVANCED · UAE · SINGAPORE",
225
+ bigValue: "$1B+", bigCaption: "Sovereign investment at $8B pre-money valuation",
226
+ subValue: "+$1B", subCaption: "Compute & revenue add-ons committed alongside the round",
227
+ },
228
+ tiles: [
229
+ { icon: "icon-40.png", title: "Each engagement", body: "$500M–$1B initial commitment per country" },
230
+ { icon: "icon-41.png", title: "Term", body: "3–5 year contracts with annual escalators" },
231
+ { icon: "icon-43.png", title: "Deployment", body: "On-premises sovereign cloud · full data residency" },
232
+ { icon: "icon-44.png", title: "Pipeline", body: "8+ countries in active sovereign engagement" },
233
+ ],
234
+ kickerText: "Total government revenue commitment by 2029: $5.5B–$9.0B across 6+ countries.",
235
+ });
236
+
237
+ /* S15 --------------------------------------------------------------- L19 */
238
+ W.bridge(pres, {
239
+ tag: "UNIT ECONOMICS", deck: DECK, n: p(), total: TOTAL, dark: false,
240
+ titleText: ["Software economics, ", "not AI economics", "."],
241
+ subtitleText: "Most AI companies burn 40–60% of revenue on compute. Wand doesn't carry that cost — clients run their own compute, structurally.",
242
+ eyebrow: "MARGIN BRIDGE",
243
+ rows: [
244
+ { label: "Revenue", value: "100%", frac: 1.00 },
245
+ { label: "Compute (client-hosted)", value: "0%", frac: 0.03 },
246
+ { label: "Platform ops & support", value: "−5%", frac: 0.05 },
247
+ { label: "Infrastructure & hosting",value: "−7%", frac: 0.07 },
248
+ { label: "Gross margin", value: "85–88%", frac: 0.87 },
249
+ ],
250
+ stats: [
251
+ { value: "150%+", label: "Net revenue retention", caption: "Land-and-expand drives account growth" },
252
+ { value: "<3%", label: "Annual gross churn", caption: "Mission-critical deployments lock in" },
253
+ { value: "<12 mo", label: "CAC payback", caption: "Capital-efficient acquisition" },
254
+ { value: "$5M → $50M+", label: "ACV expansion · 3yr", caption: "Average contract 10× in 3 years" },
255
+ ],
256
+ });
257
+
258
+ /* S16 ---------------------------------------------------------------- L7 */
259
+ W.sixUpIcon(pres, {
260
+ tag: "THE MOAT", deck: DECK, n: p(), total: TOTAL, dark: true,
261
+ titleText: ["Six ", "compounding", " layers of advantage."],
262
+ subtitleText: "Technical, data, and organizational — each one widens the gap with every quarter of deployment.",
263
+ items: [
264
+ { icon: "icon-45.png", title: "40+ patents pending", body: "Core agentic mechanics, orchestration protocols, and self-evolving agent architecture." },
265
+ { icon: "icon-16.png", title: "Self-evolving agents", body: "Agents improve autonomously every quarter — competitors can't replicate without years of deployment data." },
266
+ { icon: "icon-46.png", title: "Data network effects", body: "Every deployment generates proprietary workflow data that makes agents smarter — a compounding flywheel." },
267
+ { icon: "icon-31.png", title: "World-class team", body: "80+ AI experts — researchers from leading AI labs, the intelligence community, and top tech operators." },
268
+ { icon: "icon-48.png", title: "Enterprise lock-in", body: "Mission-critical deployments make switching costs enormous once Wand OS runs the workforce." },
269
+ { icon: "icon-39.png", title: "Sovereign-grade moat", body: "Multi-year contracts and on-premises deployments create regulatory and contractual barriers." },
270
+ ],
271
+ });
272
+
273
+ /* S17 ---------------------------------------------------------------- L3 */
274
+ W.closing(pres, {
275
+ eyebrow: "THE MISSION",
276
+ line1: "The biggest transition in human history.",
277
+ line2: "Humanity's next level of evolution.",
278
+ body: "Infinite labor, human direction. People and agents — curious, committed, evolving — building together what neither could build alone.",
279
+ url: "wand.ai",
280
+ });
281
+
282
+ pres.writeFile({ fileName: "infinite-rebuilt.pptx" })
283
+ .then(() => console.log(`wrote infinite-rebuilt.pptx (${TOTAL} slides)`));
@@ -0,0 +1,86 @@
1
+ # Layout catalog
2
+
3
+ Twenty-six callable layouts. `lib/schema.js` holds the same catalog as data —
4
+ `node wand.js layouts <name>` prints any layout's fields, marks the required
5
+ ones, and gives the item cap. Where this file and the schema disagree, the
6
+ schema is what `validate` enforces, so fix the schema and this file together.
7
+
8
+ Geometry is measured from the reference decks, not
9
+ transcribed from the spec — where §5 and a reference deck disagreed, the deck won
10
+ and the difference is noted.
11
+
12
+ Every layout takes `tag`, `dark`, `titleText`, `subtitleText`, and (except the
13
+ full-bleed three) `deck` / `n` / `total` for the footer.
14
+
15
+ ## Structural
16
+
17
+ | Layout | Params | Use for |
18
+ |---|---|---|
19
+ | `cover` | `eyebrow, titleLines[], body, kickerPlain, kickerBold` | Slide 1. Dark, full bleed, no footer |
20
+ | `divider` | `eyebrow, titleText, body` | Section breaks and the agenda. Keeps the tag, drops the footer |
21
+ | `closing` | `eyebrow, line1, line2, body, url` | Last slide. Centred, full bleed |
22
+
23
+ ## Content
24
+
25
+ | Layout | Params | Use for |
26
+ |---|---|---|
27
+ | `threeUp` | `items[{eyebrow,title,pill,body,emph}], arrows` | 3 comparable things. `arrows: true` for a progression |
28
+ | `fourUpIcon` | `items[{icon,title,body}], kickerText` | 4 attributes or capabilities |
29
+ | `sixUpIcon` | `items[{icon,title,body}]` | 6 features. Don't use it three slides running |
30
+ | `rows` | `items[{icon,label,description,badge,ours}]` | Stack / ownership tables. `ours: false` gets the dashed "bring your own" treatment |
31
+ | `parity` | `left, right, badge, kickerText` | Two-sided comparison, list-shaped. The contrast between the two cards is the point |
32
+ | `colCards` | `items[{art,eyebrow,title,body,bullets[]}]` | 2–3 layers, each with prose *and* a bullet list |
33
+ | `numberedCards` | `items[{eyebrow,number,title,badge,body,emph}]` | "Three strategic priorities" — where the ordinal is the organising device |
34
+ | `phaseCards` | `phases[{period,title,bullets[]}]` | 4-step roadmaps. Card 1 is the emphasis card |
35
+ | `archStack` | `top, middle{modules[]}, sources{cards[]}, outcome` | Layered architecture: actors on top, your governed layer in the middle, vendors below, outcome band at the base |
36
+
37
+ ## Data
38
+
39
+ | Layout | Params | Use for |
40
+ |---|---|---|
41
+ | `statQuad` | `items[{value,caption}], kickerText` | 4 standalone figures |
42
+ | `statGrid` | `items[{value,label,caption,emph}], footnote` | 6 figures. Card 1 can be the emphasis card |
43
+ | `featureStats` | `lead{icon,runs[]}, stats[{value,caption}]` | One assertion card plus 3 supporting figures |
44
+ | `barRank` | `bars[{label,value,frac}], cards[], footnote` | Ranked magnitudes — TAM ladders, market sizing. **Not `addChart()`** |
45
+ | `bridge` | `eyebrow, rows[{label,value,frac}], stats[]` | Margin bridges and waterfalls |
46
+ | `band` | `icon, runs[{text,accent}], stats[], quote` | An equation or single assertion, usually over a stat row |
47
+ | `matrixGrid` | `groups[{category,items[{title,body}]}], kickerText` | Categorised inventories — use-case maps, capability grids. 3–4 columns × 3 rows |
48
+ | `logoBands` | `stats[], bands[{label,names,note}]` | Proof points: figures over customer/investor name rows |
49
+ | `heroQuad` | `hero{pill,bigValue,bigCaption,subValue,subCaption}, tiles[], kickerText` | One headline figure plus a 2×2 detail grid |
50
+ | `productMap` | `bandRow, cards[], split, base` | Rail-labelled product architecture (MANAGE / EXECUTE / WORKFORCE) |
51
+
52
+ ## Choosing
53
+
54
+ Follow §6 Phase 3 — stop at the first match. Structural first, then quotes,
55
+ timelines, data, comparisons, stacks, assertions, numbered asks, and only then
56
+ fall back on item count.
57
+
58
+ Vary them. Three consecutive `sixUpIcon` slides is a failure even if each one is
59
+ correct. Across 15 slides aim for at least 8 distinct layouts and alternate dark
60
+ and light.
61
+
62
+ ## Not yet built
63
+
64
+ `fiveUpStack` (L8), `timeline` (L13), `quotes` (L21).
65
+ Add on demand — building the whole catalog before shipping a deck is what
66
+ stalled two earlier revisions.
67
+
68
+ ## Layouts that flow from measurement
69
+
70
+ `archStack`, `matrixGrid`, `phaseCards` and `numberedCards` compute their
71
+ content top with `contentTop()` and fill down to the y5.05 limit. A two-line
72
+ title on those layouts pushes the content down instead of colliding with it.
73
+ The older layouts still use fixed content-band coordinates; migrating them is
74
+ worth doing when one of them next misbehaves.
75
+
76
+ ## Added for client decks (v0.4.0)
77
+
78
+ | Layout | Params | Use for |
79
+ |---|---|---|
80
+ | `problemGrid` | `strip{label,chips[]}, problems{label,items[]}` | The challenge slide: a strip of today's reality, then the problems it creates |
81
+ | `splitPanel` | `left{eyebrow,heading,body,note}, right{eyebrow,heading,items[]}` | One half argument, one half evidence |
82
+ | `compareTable` | `reasons[], table{leftHead,rightHead,rows[]}` | Reason cards over a status-quo vs ours comparison |
83
+ | `numberedList` | `items[{title,body}], closing{line1,line2}, signoff, columns` | Agendas, asks, "what we'll cover" |
84
+
85
+ `archStack` also accepts an empty `middle.modules` — the middle band then renders
86
+ as a single centred connector line instead of a module row.