@taloswork/ose-shared 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.
Files changed (159) hide show
  1. package/package.json +3 -3
  2. package/skills/document/SKILL.md +135 -219
  3. package/skills/document/art-directions/base.css +27 -2
  4. package/skills/document/art-directions/cinematic-depth.css +3 -1
  5. package/skills/document/art-directions/collage-paper.css +5 -1
  6. package/skills/document/art-directions/editorial-cut.css +5 -1
  7. package/skills/document/art-directions/geometric-pop.css +6 -0
  8. package/skills/document/art-directions/gradient-mesh.css +5 -1
  9. package/skills/document/art-directions/illustrated-doodle.css +5 -0
  10. package/skills/document/art-directions/luxury-ornament.css +4 -1
  11. package/skills/document/art-directions/maximalist-blocks.css +6 -0
  12. package/skills/document/art-directions/technical-grid.css +4 -0
  13. package/skills/document/assets/fonts/fonts.json +2 -2
  14. package/skills/document/assets/pdf-fonts/NotoSansSC-PDF-Bold.ttf +0 -0
  15. package/skills/document/assets/pdf-fonts/NotoSansSC-PDF-Regular.ttf +0 -0
  16. package/skills/document/assets/pdf-fonts/OFL.txt +93 -0
  17. package/skills/document/assets/pdf-fonts/README.md +35 -0
  18. package/skills/document/assets/tessdata/LICENSE-Apache-2.0.txt +202 -0
  19. package/skills/document/assets/tessdata/README.md +21 -0
  20. package/skills/document/assets/tessdata/chi_sim.traineddata.gz +0 -0
  21. package/skills/document/assets/tessdata/eng.traineddata.gz +0 -0
  22. package/skills/document/bin/deck-build.cjs +12563 -83
  23. package/skills/document/bin/deck-chart.cjs +771 -0
  24. package/skills/document/bin/deck-plan.cjs +12414 -0
  25. package/skills/document/bin/deck-qa.cjs +1075 -266
  26. package/skills/document/bin/deck-scenario.cjs +1363 -0
  27. package/skills/document/bin/deck-styles.cjs +1604 -0
  28. package/skills/document/bin/doc-convert.cjs +308 -292
  29. package/skills/document/bin/doc-fill.cjs +73264 -192
  30. package/skills/document/bin/doc-gen.cjs +2491 -312
  31. package/skills/document/bin/doc-run.cjs +162 -24
  32. package/skills/document/bin/doc-scan.cjs +13 -0
  33. package/skills/document/bin/doc-text.cjs +13 -0
  34. package/skills/document/bin/doc-validate.cjs +838 -68
  35. package/skills/document/bin/doc-xml.cjs +9 -5
  36. package/skills/document/bin/docx-annotate.cjs +95 -19
  37. package/skills/document/bin/docx-defaults.cjs +9907 -0
  38. package/skills/document/bin/fontkit.cjs +1 -0
  39. package/skills/document/bin/html2pptx.cjs +36622 -31394
  40. package/skills/document/bin/ocr-worker.cjs +1 -0
  41. package/skills/document/bin/ocr.cjs +131 -40
  42. package/skills/document/bin/pdf-form.cjs +682 -177
  43. package/skills/document/bin/pdf-images.cjs +13 -0
  44. package/skills/document/bin/pdf-ops.cjs +642 -199
  45. package/skills/document/bin/pdf-render.cjs +19 -3
  46. package/skills/document/bin/pdf-tables.cjs +13 -0
  47. package/skills/document/bin/pptx-clone.cjs +3 -3
  48. package/skills/document/bin/pptx-notes.cjs +10038 -0
  49. package/skills/document/bin/pptx-slide.cjs +3 -3
  50. package/skills/document/bin/pptx-tokenize.cjs +19 -4
  51. package/skills/document/bin/template-skin.cjs +10910 -0
  52. package/skills/document/bin/xlsx-query.cjs +192 -61
  53. package/skills/document/bin-reference.md +61 -33
  54. package/skills/document/catalog.json +33 -32
  55. package/skills/document/content-pipeline.md +179 -257
  56. package/skills/document/deck-design.md +378 -638
  57. package/skills/document/generated-visuals.md +99 -0
  58. package/skills/document/layouts/MAINTAINERS.md +33 -0
  59. package/skills/document/layouts/README.md +49 -36
  60. package/skills/document/layouts/big-stat.tpl +1 -1
  61. package/skills/document/layouts/capacity.json +1 -0
  62. package/skills/document/layouts/cards-3.tpl +1 -1
  63. package/skills/document/layouts/chart-full.tpl +1 -1
  64. package/skills/document/layouts/chart-kpi.tpl +1 -1
  65. package/skills/document/layouts/comparison.tpl +1 -1
  66. package/skills/document/layouts/data-table.tpl +1 -1
  67. package/skills/document/layouts/funnel.tpl +1 -1
  68. package/skills/document/layouts/gantt.tpl +1 -1
  69. package/skills/document/layouts/hub-flow.tpl +4 -0
  70. package/skills/document/layouts/icon-row.tpl +1 -1
  71. package/skills/document/layouts/image-grid.tpl +1 -1
  72. package/skills/document/layouts/matrix-2x2.tpl +1 -1
  73. package/skills/document/layouts/mock-qa.tpl +4 -0
  74. package/skills/document/layouts/profiles.json +2 -2
  75. package/skills/document/layouts/pyramid.tpl +1 -1
  76. package/skills/document/layouts/radar.tpl +1 -1
  77. package/skills/document/layouts/ring-progress.tpl +1 -1
  78. package/skills/document/layouts/slots.json +1 -1
  79. package/skills/document/layouts/steps-vertical.tpl +1 -1
  80. package/skills/document/layouts/steps.tpl +1 -1
  81. package/skills/document/layouts/three-kpi.tpl +1 -1
  82. package/skills/document/layouts/timeline.tpl +1 -1
  83. package/skills/document/layouts/toc-panel.tpl +2 -2
  84. package/skills/document/layouts/two-kpi.tpl +2 -2
  85. package/skills/document/layouts/versus.tpl +1 -1
  86. package/skills/document/motion/README.md +3 -2
  87. package/skills/document/office.md +3 -3
  88. package/skills/document/packs/README.md +1 -1
  89. package/skills/document/packs/board-brief/backdrop.html +2 -0
  90. package/skills/document/packs/board-brief/pack.css +2 -1
  91. package/skills/document/packs/mckinsey-photo/backdrop.html +2 -0
  92. package/skills/document/packs/mckinsey-photo/pack.css +2 -1
  93. package/skills/document/packs/press-room/backdrop.html +2 -0
  94. package/skills/document/packs/press-room/pack.css +2 -1
  95. package/skills/document/packs/prismatic-3d/backdrop.html +2 -0
  96. package/skills/document/packs/prismatic-3d/pack.css +4 -1
  97. package/skills/document/pdf.md +60 -43
  98. package/skills/document/rewrite.md +257 -309
  99. package/skills/document/scenarios.json +1307 -0
  100. package/skills/document/scenarios.schema.json +104 -0
  101. package/skills/document/styles/README.md +15 -25
  102. package/skills/document/styles/_backdrops/rimlight.html +3 -2
  103. package/skills/document/styles/_contract-defaults.css +31 -2
  104. package/skills/document/styles/_samples/_groups/biz-premium.webp +0 -0
  105. package/skills/document/styles/_samples/mckinsey.webp +0 -0
  106. package/skills/document/styles/anthropic/skin.css +6 -3
  107. package/skills/document/styles/apple/skin.css +4 -3
  108. package/skills/document/styles/bistro-warm/backdrop.html +2 -0
  109. package/skills/document/styles/bistro-warm/skin.css +4 -1
  110. package/skills/document/styles/black-gold/skin.css +6 -5
  111. package/skills/document/styles/bold-clash/backdrop.html +2 -0
  112. package/skills/document/styles/bold-clash/skin.css +2 -1
  113. package/skills/document/styles/branding/skin.css +4 -4
  114. package/skills/document/styles/campus-teal/backdrop.html +2 -0
  115. package/skills/document/styles/campus-teal/skin.css +2 -1
  116. package/skills/document/styles/cinereel/skin.css +7 -3
  117. package/skills/document/styles/clinic-care/backdrop.html +2 -0
  118. package/skills/document/styles/clinic-care/skin.css +2 -1
  119. package/skills/document/styles/cool/skin.css +6 -5
  120. package/skills/document/styles/dark-glass/backdrop.html +2 -0
  121. package/skills/document/styles/dark-glass/skin.css +2 -1
  122. package/skills/document/styles/gov-brief/backdrop.html +2 -0
  123. package/skills/document/styles/gov-brief/skin.css +2 -1
  124. package/skills/document/styles/grid-tech/backdrop.html +2 -0
  125. package/skills/document/styles/grid-tech/skin.css +2 -1
  126. package/skills/document/styles/hand-drawn/skin.css +3 -3
  127. package/skills/document/styles/ivory-gold/skin.css +7 -6
  128. package/skills/document/styles/legal-slate/backdrop.html +2 -0
  129. package/skills/document/styles/legal-slate/skin.css +2 -1
  130. package/skills/document/styles/magazine-ink/skin.css +4 -3
  131. package/skills/document/styles/mckinsey/backdrop.html +7 -5
  132. package/skills/document/styles/mckinsey/skin.css +2 -1
  133. package/skills/document/styles/memphis/backdrop.html +2 -0
  134. package/skills/document/styles/memphis/skin.css +2 -1
  135. package/skills/document/styles/mono/skin.css +6 -2
  136. package/skills/document/styles/neon-cyber/backdrop.html +2 -0
  137. package/skills/document/styles/neon-cyber/skin.css +2 -1
  138. package/skills/document/styles/olive-gold/skin.css +7 -6
  139. package/skills/document/styles/organic-earth/backdrop.html +2 -0
  140. package/skills/document/styles/organic-earth/skin.css +2 -1
  141. package/skills/document/styles/pastel-saas/backdrop.html +2 -0
  142. package/skills/document/styles/pastel-saas/skin.css +2 -1
  143. package/skills/document/styles/portfolio-noir/backdrop.html +2 -0
  144. package/skills/document/styles/portfolio-noir/skin.css +2 -1
  145. package/skills/document/styles/retro-press/backdrop.html +2 -0
  146. package/skills/document/styles/retro-press/skin.css +2 -1
  147. package/skills/document/styles/sport-arena/backdrop.html +2 -0
  148. package/skills/document/styles/sport-arena/skin.css +4 -1
  149. package/skills/document/styles/swiss-grid/skin.css +10 -5
  150. package/skills/document/styles/wedding-blush/backdrop.html +2 -0
  151. package/skills/document/styles/wedding-blush/skin.css +4 -1
  152. package/skills/document/theme-system.md +85 -77
  153. package/skills/document/themes/README.md +7 -5
  154. package/skills/document/vision.md +8 -5
  155. package/skills/document/xlsx.md +15 -25
  156. package/skills/grill-me/SKILL.md +6 -0
  157. package/skills/grill-me/agents/openai.yaml +5 -0
  158. package/skills/grilling/SKILL.md +28 -0
  159. package/skills/grilling/agents/openai.yaml +3 -0
@@ -0,0 +1,99 @@
1
+ # Generated visuals inside a deck
2
+
3
+ Assess whether generated scenes, product concepts or illustrations will help the
4
+ deck explain its message. The user need not explicitly request image generation.
5
+ Choose about 2–3 useful visual pages, not a quota; use fewer or none for a short or
6
+ data-heavy deck, and respect a request to avoid generated images.
7
+
8
+ The agent calls the actual available `gen` tools; `deck-plan` and `deck-build` only
9
+ assemble existing assets, so rebuilding a deck never regenerates images. The gen
10
+ connector is enabled by default. Call its discovered MCP tool directly using the
11
+ exposed schema for model parameters and references; do not invent tool names or
12
+ duplicate provider-specific rules. Respect a manually disabled connector. If no
13
+ generation tool is available, report that limitation rather than enabling a connector
14
+ or promising an image.
15
+
16
+ ## Plan before generating
17
+
18
+ Include selected visual pages in the confirmed slide count. In `plan.json`, give each
19
+ its conclusion, visual purpose, mode, notes and a `file` path. The outline
20
+ can reference a file that does not exist yet; `deck-build` needs it after generation.
21
+ Use the existing outline/style confirmation before generation, with no separate image authorization.
22
+ Supporting visuals that preserve an approved outline's message and slide count need no
23
+ new approval, even when chosen later during production.
24
+
25
+ Default to **generated image + HTML text**: scene, product concept or illustration in
26
+ the image; title, conclusion, accurate figures and sources in the HTML. Native text
27
+ remains editable unless the selected skin bakes that class (`--talos-bake:1`).
28
+ **Whole-page image** is an option for a poster or visual story; its internal text and
29
+ objects cannot be edited separately. Keep evidence-based charts in the chart tools;
30
+ describe a generated concept as a concept, not a photo of a real event or a source.
31
+
32
+ Example slide entry among the ordinary slides in `plan.json`:
33
+
34
+ ```json
35
+ {
36
+ "role": "content",
37
+ "title": "One workspace brings the team together",
38
+ "image": true,
39
+ "file": "visuals/workspace.html",
40
+ "narrative": "Generated visual: a shared workspace concept, image plus HTML text; make the proposed experience concrete.",
41
+ "notes": "Concept illustration. Explain how shared context reduces handoffs."
42
+ }
43
+ ```
44
+
45
+ Keep plan and spec in the same directory: `file` is resolved relative to the spec.
46
+ Planning keeps the slide's position and notes; write its visible text in the HTML,
47
+ since file slides do not fill catalog slots. Do not put `<img>` into ordinary `slots`
48
+ (they escape HTML), and `image: true` alone does not supply an asset.
49
+
50
+ ## Generate for the actual image box
51
+
52
+ Once approved, prepare each prompt for the intended box: message, subject/action,
53
+ selected palette and photographic/illustration style, subject placement, crop
54
+ tolerance and text space. Set size and aspect ratio in the tool fields for the actual
55
+ image box. Keep titles and exact numbers outside the image by default. For related scenes, carry the same product/person references and visual
56
+ direction through the supported `gen` reference mechanism.
57
+
58
+ Keep a small working record of slide number, prompt file, references and returned
59
+ image path. Use the **exact absolute path returned by `gen`** in the HTML; do not
60
+ rename or move the image. The assembled deck may be in a different directory from
61
+ the per-slide file. Escape HTML attribute characters in the path (`&`, `"`, `<`).
62
+ Inspect each generated result before assembling. Reuse it for text/layout revisions;
63
+ regenerate only when the image needs to change.
64
+
65
+ If gen is unavailable, or a login or network failure prevents generation, report the
66
+ actual error and affected pages. Do not claim a placeholder was generated. If a
67
+ non-generated layout is a suitable fallback, disclose the change and revise the plan
68
+ and slide together; never silently substitute an image already committed in the outline.
69
+ Keep required-image checks on every generated image that remains in the deck.
70
+
71
+ ## Assemble through the existing file route
72
+
73
+ Write exactly one `section.slide` per file. Example split page (replace the example
74
+ image path with the real tool result and match the selected skin's type/spacing):
75
+
76
+ ```html
77
+ <section class="slide" style="position:relative;width:1280px;height:720px">
78
+ <h2 class="deck-title" style="position:absolute;left:64px;top:80px;width:1152px;margin:0;color:var(--title);font-size:calc(48px * var(--type-scale,1))">One workspace brings the team together</h2>
79
+ <p style="position:absolute;left:64px;top:250px;width:420px;color:var(--body);font-size:calc(28px * var(--type-scale,1))">Shared context makes the next step visible.</p>
80
+ <img data-required-image src="/absolute/path/returned-by-gen.png" alt="Concept illustration of a shared team workspace" style="position:absolute;left:552px;top:210px;width:656px;height:420px;object-fit:cover">
81
+ </section>
82
+ ```
83
+
84
+ `data-required-image` is a presence marker: even `="false"` means required. Use it on
85
+ every generated content image. Local read, fetch or browser decode failure blocks
86
+ previews and PPTX export. Repair the path or asset; never silently replace
87
+ a required image with a placeholder, drop the page, or remove the marker to deliver.
88
+
89
+ An uploaded template keeps its title bar, logo and footer: use `h2.deck-title` and
90
+ keep content at top ≥210px in its content zone. A whole-page image must also fit that
91
+ zone; only use full bleed when the selected style permits it. Preserve the deck's
92
+ export mode: a few generated images do not require global `--rasterize`.
93
+
94
+ Build with the usual `deck-build` → `html2pptx` commands and the same style flags.
95
+ Follow deck-design.md's preview and final QA once per image: verify page order and
96
+ notes, image presence, subject crop, image text, contrast, template chrome and style
97
+ consistency across the generated pages. Fix and recheck only changed pages.
98
+ Deliver a PDF by converting the final PPTX through `doc-convert`, including its embedded
99
+ images; do not separately print the slide HTML.
@@ -0,0 +1,33 @@
1
+ # Maintaining the layout library
2
+
3
+ Not read while making a deck — this is for whoever edits a `.tpl`, a skin's geometry or
4
+ the catalog.
5
+
6
+ - **Slot index.** Regenerate `layouts/slots.json` with `node scripts/deck/gen-slots.mjs`
7
+ after touching a `.tpl`.
8
+ - **Capacity is measured, not written down.** `layouts/capacity.json` holds, per layout ×
9
+ catalog style, how wide each slot's text may get (CJK = 1, Latin ≈ 0.5), how many rows
10
+ each `{{#rows}}` block holds, and each chart's box — measured in headless Chromium by
11
+ `node scripts/deck/gen-capacity.mjs` (≈5 min). Re-run it after touching a `.tpl`, a
12
+ skin's geometry (sizes, spacing, `--type-scale`) or the catalog;
13
+ `tests/unit/deck-capacity.test.ts` fails until you do (colour-only edits are ignored).
14
+ - **Optional lines** (2026-10-09): `subhead` (one line at `top:246px`, under a one-line
15
+ title) and `takeaway` (one line at `bottom:56px`, above the footer rule) are offered only
16
+ by layouts whose content clears them in every catalog style — measured: content top
17
+ ≥ 282px for `subhead`, content bottom ≤ 620px at the designed 3-row fill for
18
+ `takeaway`. Both render nothing when empty (`.deck-subhead:empty`,
19
+ `.deck-takeaway:empty` in `styles/_contract-defaults.css`).
20
+
21
+ **不要给可变内容写死容器高度**(`.tpl` 与 bespoke 页都适用)。皮肤给 `.card` 设了
22
+ `overflow:hidden` 时,`.card{height:…px}` 会把超出的文字**静默裁掉**(`blocks-2x2` 就这样
23
+ 带病出厂过)。让高度由内容决定:网格用 `grid-auto-rows:min-content`(必须显式写
24
+ `min-content`——`1fr`/`auto` 的自动下限对 `overflow` 非 visible 的网格项一律归零),余量
25
+ 交给外层 `justify-content:space-between`。这样超量内容会顶出页面,被 `deck-qa` 的
26
+ `off-canvas`/`overlap` 抓到。PPTX walker 不保留祖先的裁切,原来在 HTML 中被裁掉的字可能
27
+ 完整画到容器外;版式生产线的 `scripts/deck/deck-qa-sweep.mjs` 用 `clipped` 阻断裁切。
28
+
29
+ `spill` measures in-flow text outside its nearest painted container. It remains
30
+ advisory until the capacity probe uses the same measure; `decor-overlap` remains
31
+ blocking. Explicitly positioned or transformed elements are excluded because a
32
+ badge may intentionally cross its parent edge. Keep both clipped and visible
33
+ overflow fixtures when changing the measurement.
@@ -1,32 +1,33 @@
1
1
  # Layout library (structure) — pick by role + P1/P2/P3
2
2
 
3
3
  **Layouts are structure only** — grid, positions, semantic classes, `data-layout` id,
4
- **zero color** (they pass `lintHardcodedColors`). Theme V2 composes family paint,
5
- component profile, media treatment and art direction; the layout remains independently selected by
6
- content intent. See `../theme-system.md` and machine-readable `profiles.json`.
4
+ **zero color** (they pass `lintHardcodedColors`); the skin paints them. This file is the
5
+ single source for layout selection (P1/P2/P3) and the fill contract. One catalog style
6
+ for the whole deck (never mix); which entries take Theme V2 and which layouts need it:
7
+ `../theme-system.md`.
7
8
 
8
9
  ## How to pick (the deterministic selection)
9
10
 
10
- **Theme — once per deck.** Choose ONE catalog style id. Set `themeVersion:2` for modern
11
- entries and optionally override `mediaStyle`; entries in catalog collection `original-13`
12
- are frozen as `classic-v1`, so omit both fields and avoid `themeV2Layouts`. Never mix base
13
- Themes within one deck.
11
+ `bin/deck-plan.cjs` applies these rules mechanically, plus the measured capacity — run
12
+ it rather than matching by hand. The rules, in priority order (P1 outranks P2 outranks
13
+ P3; never trade fit for variety):
14
14
 
15
- **Scene — automatic from intent.** `deck-build` maps intent to `hero`, `content`,
16
- `data`, `media`, or `closing`, then balances `decorDensity` across adjacent pages.
17
- Normally omit both fields; override them only when the automatic art rhythm is wrong.
18
-
19
- **Layout — per page, by matching this table:**
20
- - **P1 structure / image** (most important): does the page have an image? left/right?
21
- is it a diagram? pure text? → match `structure` + `has-image` below.
22
- - **P2 density**: 1–2 points → `light`; 3–4 → `medium`; 5–6 → `dense`. → match `density`.
15
+ - **P1 structure / image** (most important): image or not, which side, diagram or pure
16
+ text → match `structure` + `has-image` below. Never force text into an image slot or
17
+ an image into a text slot; drop an unused image slot rather than leave a placeholder.
18
+ - **P2 density**: 1–2 points → `light`; 3–4 → `medium`; 5–6 → `dense` → match
19
+ `density`. Match the slot count to the point count — condense content to ≤6 items,
20
+ remove spare slots.
23
21
  - **P3 diversity (ENFORCED)**: never the same content layout **twice in a row**, and
24
- **≤2× total** across the deck. `html2pptx` warns (`repeated-layout`) at render if you
25
- break it. Structural roles (cover/toc/section/ending) are exempt from the ≤2 cap —
26
- a `section` divider is reused per chapter.
22
+ **≤2× total** across the deck — vary the variant even when the family repeats.
23
+ `html2pptx` warns at render when you break it. Structural layouts (cover / toc /
24
+ section / transition / title / ending and their variants) are exempt: reuse ONE
25
+ `section` layout for every chapter break. If P1+P2 can't be met without repeating,
26
+ author a bespoke slide (deck-design.md) instead of a wrong-fit layout.
27
27
 
28
- Per role: **cover** once; **toc** by chapter count; **section** reused per chapter;
29
- **ending** once, by purpose.
28
+ Per role: **cover** once; **toc** by chapter count (3–4 → centred/large title, 5–6 →
29
+ list/grid, 7+ → dense/two-column); **section** reused per chapter; **ending** once, by
30
+ purpose (thanks / Q&A / contact).
30
31
 
31
32
  ## How to fill (the deck-build contract)
32
33
 
@@ -36,8 +37,9 @@ slide fills a layout through three inputs:
36
37
  - **`slots`** — one value per `{{name|default}}` → `{"layout":"cover","slots":{"title":"…"}}`
37
38
  - **`rows`** — a variable-length list per `{{#key}}…{{/key}}` block; each row fills that
38
39
  block's own fields, and `{{_n}}`/`{{_nn}}` number the copies for you.
39
- - **`chart`** — replaces the layout's `data-chart` (a native, editable pptx chart). An
40
- array fills several charts in document order.
40
+ - **`chart`** — replaces the layout's chart data; an array fills several charts in
41
+ document order. Native editable `c:chart` by default; `"chartRender":"svg"` (spec) or
42
+ `"render":"svg"` (one chart) draws it as SVG — choice per deck-design.md "Charts".
41
43
 
42
44
  **Figure layouts take INPUT fields the template never prints** — deck-build derives the
43
45
  geometry from them, so the drawing always matches the numbers:
@@ -50,31 +52,40 @@ geometry from them, so the drawing always matches the numbers:
50
52
  | `radar` | `metrics` | `name`,`score` | **the radar chart itself** |
51
53
 
52
54
  `radar` is marked `"chart": "derived"` in slots.json: its chart is built from `metrics`,
53
- so pass rows and never `chart` for it.
55
+ so pass rows, never chart data; `chart` may only add options (`{"max": 10}` = the outer
56
+ ring, else a clean ceiling over the scores; `unit`, `showValues`, `render`).
57
+ `deck-plan` routes a single-series `{type:"radar"}` chart here as `metrics` (a 660×394
58
+ box vs chart-full's 1120×316 strip, where a radar is height-bound and small).
54
59
 
55
60
  Plain list layouts take rows too: `team-row.members{name,role}` ·
56
61
  `brand-values.values{name,body}` · `color-palette.swatches{name,hex}` ·
57
62
  `steps-vertical.steps{name,body}` · `toc-panel.entries{name,desc}`.
58
63
 
64
+ **Optional lines** — a slide's `subtitle` (口径 / why it matters) and `takeaway` (启示) fill
65
+ `subhead` (under a one-line title) and `takeaway` (above the footer), offered by
66
+ cards-3 · three-kpi · two-kpi · steps · steps-vertical · timeline · icon-row ·
67
+ ring-progress · versus · data-table · image-grid · gantt (both) and funnel · pyramid ·
68
+ matrix-2x2 (subtitle) · comparison (takeaway). Left out, they render nothing; written for
69
+ a layout without the line, `deck-plan` warns `dropped` and ranks a layout that has it.
70
+
59
71
  Anything the spec gets wrong — unknown layout/slot/field, a repeat block with no rows, a
60
72
  figure row missing its numbers — **fails the build** (exit 1, nothing written) rather than
61
- shipping the template's demo content. Regenerate the index with `node scripts/deck/gen-slots.mjs`
62
- after touching a `.tpl`.
63
-
64
- **不要给可变内容写死容器高度。** `.card{height:…px}` 这类写法在皮肤给 `.card` 设了
65
- `overflow:hidden` 时会把超出的文字**静默裁掉**(`blocks-2x2` 就这么带着缺陷出厂过)。
66
- 让高度由内容决定:网格用 `grid-auto-rows:min-content`(下限必须显式写 `min-content` ——
67
- `1fr`/`auto` 的自动下限对 `overflow` 非 visible 的网格项一律归零),余量交给外层
68
- `justify-content:space-between`。这样内容超量时会把后续元素顶出页面,被 `deck-qa` 的
69
- `off-canvas`/`overlap` 抓到,而不是变成一排缺了下半截的字。被祖先 `overflow:hidden`
70
- 裁掉的文字不会出现在 pptx 的几何里,运行时的 `deck-qa` 看不到——它只在版式生产线的
71
- `scripts/deck/deck-qa-sweep.mjs`(`clipped` 硬失败,逐个版式扫整册库)里被拦截;写 bespoke
72
- 页时请直接避免定高容器。
73
+ shipping the template's demo content. **Capacity is measured** (`layouts/capacity.json`,
74
+ per layout × style: slot widths, row ceilings, chart boxes): `deck-plan` picks with it,
75
+ `deck-build` rejects overflow with it. The density column below feeds `deck-plan` too: a
76
+ rows layout is not offered for fewer items than its `(n–m)` names. A bespoke slide never
77
+ fixes a card's height around variable text (`overflow:hidden` clips it silently) — use
78
+ `grid-auto-rows:min-content`. Maintaining layouts: `layouts/MAINTAINERS.md`.
79
+
80
+ QA: `clipped` and `decor-overlap` block; `spill` is advisory. The PPTX walker does
81
+ not reproduce ancestor clipping, so inspect the exported deck too.
73
82
 
74
83
  ## Catalog
75
84
 
76
85
  Each slide carries `data-layout="<id>"` (drives the diversity lint + traceability).
77
86
 
87
+ **Theme V2 only:** `pitch-problem` · `pitch-solution` · `market-rings` · `product-device` · `traction-milestones` · `business-model` · `pricing-tiers` · `funding-ask` · `customer-proof` · `team-founders` (profiles.json `themeV2Layouts`). A style in the `classic-v1` collection (cool, mckinsey, apple …) renders V1 and cannot use them — `deck-plan --layouts --style <id>` lists exactly what a style can use and the content each layout takes.
88
+
78
89
  | layout-id | role | structure (P1) | density (P2) | has-image (P1) | pick when |
79
90
  |---|---|---|---|---|---|
80
91
  | `cover` | cover | hero · left-title | — | text-only (bg) | 封面 / 开场 |
@@ -107,6 +118,8 @@ Each slide carries `data-layout="<id>"` (drives the diversity lint + traceabilit
107
118
  | `image-left` | content | image-left + text-right | medium (3) | **photo/diagram slot** | 图文案例(图在左) |
108
119
  | `image-grid` | content | 3-up image gallery + captions | medium (3) | **photo slots** | 三图并列 / 图库 |
109
120
  | `concept-hub` | content | center concept + satellites | medium (4) | text-only | 核心框架(中心+维度) |
121
+ | `hub-flow` | content | 3 inputs → core → result | medium (3) | text-only | 多源汇聚→核心→产出(产品原理/数据流) |
122
+ | `mock-qa` | content · product | interface sketch: question → cited answer + 2 sources | light (2) | text-only | 产品问答/证据链示意(无截图时) |
110
123
  | `image-full` | content | full-bleed image + overlay caption | light | **full-bleed photo** | 全出血大图 + 压字说明 |
111
124
  | `cover-image` | cover | full-bleed image + overlay title | — | **full-bleed photo** | 图片封面(压字) |
112
125
  | `timeline` | content | horizontal dated timeline | medium (4–5) | text-only | 时间轴 / 发展历程 |
@@ -115,7 +128,7 @@ Each slide carries `data-layout="<id>"` (drives the diversity lint + traceabilit
115
128
  | `section-stat` | section | ghost-number + hero stat | light | text-only | 章节页(带关键数字) |
116
129
  | `transition` | transition | minimal big-number break | light | text-only | 纯过渡页(整册复用一个) |
117
130
  | `funnel` | content · data | narrowing funnel stages | medium (4) | text-only | 转化漏斗 |
118
- | `radar` | content · data | native radar chart + score list (rows) | medium (4–6) | diagram (chart) | 能力雷达 / 多维评估 |
131
+ | `radar` | content · data | radar chart (SVG or native) + score list (rows) | medium (4–6) | diagram (chart) | 能力雷达 / 多维评估 |
119
132
  | `ring-progress` | content · data | ring gauges (rows) | medium (2–4) | diagram | 环形进度 / 完成率 |
120
133
  | `icon-row` | content | icon row (3–4) | medium (4) | text-only | 图标行 · 能力/特性(L16) |
121
134
  | `gantt` | content · data | gantt schedule bars (rows) | dense | text-only | 甘特图 / 项目排期 |
@@ -1,4 +1,4 @@
1
1
  <!-- layouts/big-stat — structure-only (paint via styles/<skin>/skin.css). data-layout drives P1/P2/P3 + dedup. -->
2
2
  <section class="slide" data-layout="big-stat" style="position:relative;width:1280px;height:720px;overflow:hidden"><div class="slide-backdrop"></div><div class="eyebrow-row" style="position:absolute;left:calc(96px * var(--space-scale,1));top:132px;display:flex;align-items:center;gap:14px"><span class="accent-bar" style="width:30px;height:1px;display:inline-block"></span><span class="eyebrow" style="font-size:calc(13px * var(--type-scale,1));letter-spacing:.28em">{{eyebrow|KEY METRIC}}</span></div><h2 class="deck-title" style="position:absolute;left:calc(92px * var(--space-scale,1));top:158px;font-size:calc(48px * var(--type-scale,1));letter-spacing:-.4px">{{title|}}</h2>
3
- <div class="stat-num" style="position:absolute;left:90px;top:250px;font-weight:800;line-height:1;font-size:calc(216px * var(--type-scale,1));letter-spacing:-2px">{{stat|585}}<span class="stat-unit" style="font-size:calc(64px * var(--type-scale,1))">{{unit| 单位}}</span></div><div class="stat-lead" style="position:absolute;left:100px;top:520px;font-size:calc(30px * var(--type-scale,1));font-weight:600">{{lead|一句结论,数字说明了什么}}</div><p class="stat-note" style="position:absolute;left:100px;top:580px;width:900px;font-size:calc(17px * var(--type-scale,1));line-height:1.6">{{note|一句支撑说明,给上下文与来源。}}</p>
3
+ <div class="stat-num" style="position:absolute;left:calc(90px * var(--space-scale,1));top:250px;font-weight:800;line-height:1;font-size:calc(216px * var(--type-scale,1));letter-spacing:-2px">{{stat|585}}<span class="stat-unit" style="font-size:calc(64px * var(--type-scale,1))">{{unit| 单位}}</span></div><div class="stat-lead" style="position:absolute;left:calc(100px * var(--space-scale,1));top:520px;font-size:calc(30px * var(--type-scale,1));font-weight:600">{{lead|一句结论,数字说明了什么}}</div><p class="stat-note" style="position:absolute;left:calc(100px * var(--space-scale,1));top:580px;width:900px;font-size:calc(17px * var(--type-scale,1));line-height:1.6">{{note|一句支撑说明,给上下文与来源。}}</p>
4
4
  <div class="rule rule-foot" style="position:absolute;left:calc(96px * var(--space-scale,1));right:calc(96px * var(--space-scale,1));bottom:40px;height:1px"></div><div class="deck-footer" style="position:absolute;left:calc(96px * var(--space-scale,1));bottom:17px;font-size:calc(12px * var(--type-scale,1));letter-spacing:.1em">{{footer|报告标题 / 章节}}</div><div class="deck-pageno" style="position:absolute;right:calc(96px * var(--space-scale,1));bottom:17px;font-size:calc(12px * var(--type-scale,1))">{{pageno|01}}</div></section>