@taloswork/ose-shared 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/skills/document/SKILL.md +143 -215
- package/skills/document/art-directions/base.css +27 -2
- package/skills/document/art-directions/cinematic-depth.css +3 -1
- package/skills/document/art-directions/collage-paper.css +5 -1
- package/skills/document/art-directions/editorial-cut.css +5 -1
- package/skills/document/art-directions/geometric-pop.css +6 -0
- package/skills/document/art-directions/gradient-mesh.css +5 -1
- package/skills/document/art-directions/illustrated-doodle.css +5 -0
- package/skills/document/art-directions/luxury-ornament.css +4 -1
- package/skills/document/art-directions/maximalist-blocks.css +6 -0
- package/skills/document/art-directions/technical-grid.css +4 -0
- package/skills/document/assets/fonts/fonts.json +2 -2
- package/skills/document/assets/pdf-fonts/NotoSansSC-PDF-Bold.ttf +0 -0
- package/skills/document/assets/pdf-fonts/NotoSansSC-PDF-Regular.ttf +0 -0
- package/skills/document/assets/pdf-fonts/OFL.txt +93 -0
- package/skills/document/assets/pdf-fonts/README.md +35 -0
- package/skills/document/assets/tessdata/LICENSE-Apache-2.0.txt +202 -0
- package/skills/document/assets/tessdata/README.md +21 -0
- package/skills/document/assets/tessdata/chi_sim.traineddata.gz +0 -0
- package/skills/document/assets/tessdata/eng.traineddata.gz +0 -0
- package/skills/document/bin/deck-build.cjs +2311 -41
- package/skills/document/bin/deck-chart.cjs +762 -0
- package/skills/document/bin/deck-plan.cjs +802 -0
- package/skills/document/bin/deck-qa.cjs +984 -249
- package/skills/document/bin/deck-scenario.cjs +1346 -0
- package/skills/document/bin/doc-convert.cjs +130 -39
- package/skills/document/bin/doc-fill.cjs +73121 -170
- package/skills/document/bin/doc-gen.cjs +625 -68
- package/skills/document/bin/doc-run.cjs +162 -24
- package/skills/document/bin/doc-scan.cjs +13 -0
- package/skills/document/bin/doc-text.cjs +13 -0
- package/skills/document/bin/doc-validate.cjs +718 -23
- package/skills/document/bin/doc-xml.cjs +9 -5
- package/skills/document/bin/docx-annotate.cjs +95 -19
- package/skills/document/bin/fontkit.cjs +1 -0
- package/skills/document/bin/html2pptx.cjs +1372 -121
- package/skills/document/bin/ocr-worker.cjs +1 -0
- package/skills/document/bin/ocr.cjs +131 -40
- package/skills/document/bin/pdf-form.cjs +674 -177
- package/skills/document/bin/pdf-images.cjs +13 -0
- package/skills/document/bin/pdf-ops.cjs +634 -199
- package/skills/document/bin/pdf-render.cjs +19 -3
- package/skills/document/bin/pdf-tables.cjs +13 -0
- package/skills/document/bin/pptx-clone.cjs +3 -3
- package/skills/document/bin/pptx-slide.cjs +3 -3
- package/skills/document/bin/xlsx-query.cjs +192 -61
- package/skills/document/bin-reference.md +56 -33
- package/skills/document/content-pipeline.md +129 -242
- package/skills/document/deck-design.md +355 -638
- package/skills/document/layouts/README.md +46 -33
- package/skills/document/layouts/capacity.json +1 -0
- package/skills/document/layouts/slots.json +1 -1
- package/skills/document/layouts/toc-panel.tpl +1 -1
- package/skills/document/motion/README.md +3 -2
- package/skills/document/office.md +3 -3
- package/skills/document/packs/board-brief/backdrop.html +2 -0
- package/skills/document/packs/board-brief/pack.css +2 -1
- package/skills/document/packs/mckinsey-photo/backdrop.html +2 -0
- package/skills/document/packs/mckinsey-photo/pack.css +2 -1
- package/skills/document/packs/press-room/backdrop.html +2 -0
- package/skills/document/packs/press-room/pack.css +2 -1
- package/skills/document/packs/prismatic-3d/backdrop.html +2 -0
- package/skills/document/packs/prismatic-3d/pack.css +4 -1
- package/skills/document/pdf.md +53 -49
- package/skills/document/rewrite.md +241 -308
- package/skills/document/scenarios.json +1290 -0
- package/skills/document/scenarios.schema.json +103 -0
- package/skills/document/styles/README.md +15 -25
- package/skills/document/styles/_contract-defaults.css +25 -1
- package/skills/document/styles/anthropic/skin.css +6 -3
- package/skills/document/styles/apple/skin.css +4 -3
- package/skills/document/styles/bistro-warm/backdrop.html +2 -0
- package/skills/document/styles/bistro-warm/skin.css +4 -1
- package/skills/document/styles/black-gold/skin.css +6 -5
- package/skills/document/styles/bold-clash/backdrop.html +2 -0
- package/skills/document/styles/bold-clash/skin.css +2 -1
- package/skills/document/styles/branding/skin.css +4 -4
- package/skills/document/styles/campus-teal/backdrop.html +2 -0
- package/skills/document/styles/campus-teal/skin.css +2 -1
- package/skills/document/styles/cinereel/skin.css +7 -3
- package/skills/document/styles/clinic-care/backdrop.html +2 -0
- package/skills/document/styles/clinic-care/skin.css +2 -1
- package/skills/document/styles/cool/skin.css +6 -5
- package/skills/document/styles/dark-glass/backdrop.html +2 -0
- package/skills/document/styles/dark-glass/skin.css +2 -1
- package/skills/document/styles/gov-brief/backdrop.html +2 -0
- package/skills/document/styles/gov-brief/skin.css +2 -1
- package/skills/document/styles/grid-tech/backdrop.html +2 -0
- package/skills/document/styles/grid-tech/skin.css +2 -1
- package/skills/document/styles/hand-drawn/skin.css +3 -3
- package/skills/document/styles/ivory-gold/skin.css +7 -6
- package/skills/document/styles/legal-slate/backdrop.html +2 -0
- package/skills/document/styles/legal-slate/skin.css +2 -1
- package/skills/document/styles/magazine-ink/skin.css +4 -3
- package/skills/document/styles/mckinsey/skin.css +2 -1
- package/skills/document/styles/memphis/backdrop.html +2 -0
- package/skills/document/styles/memphis/skin.css +2 -1
- package/skills/document/styles/mono/skin.css +6 -2
- package/skills/document/styles/neon-cyber/backdrop.html +2 -0
- package/skills/document/styles/neon-cyber/skin.css +2 -1
- package/skills/document/styles/olive-gold/skin.css +7 -6
- package/skills/document/styles/organic-earth/backdrop.html +2 -0
- package/skills/document/styles/organic-earth/skin.css +2 -1
- package/skills/document/styles/pastel-saas/backdrop.html +2 -0
- package/skills/document/styles/pastel-saas/skin.css +2 -1
- package/skills/document/styles/portfolio-noir/backdrop.html +2 -0
- package/skills/document/styles/portfolio-noir/skin.css +2 -1
- package/skills/document/styles/retro-press/backdrop.html +2 -0
- package/skills/document/styles/retro-press/skin.css +2 -1
- package/skills/document/styles/sport-arena/backdrop.html +2 -0
- package/skills/document/styles/sport-arena/skin.css +4 -1
- package/skills/document/styles/swiss-grid/skin.css +10 -5
- package/skills/document/styles/wedding-blush/backdrop.html +2 -0
- package/skills/document/styles/wedding-blush/skin.css +4 -1
- package/skills/document/theme-system.md +85 -77
- package/skills/document/themes/README.md +7 -5
- package/skills/document/vision.md +8 -5
- package/skills/document/xlsx.md +15 -25
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taloswork/ose-shared",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.12",
|
|
4
4
|
"description": "Talos cross-OSE shared library — skills + MCP servers auto-loaded into every OSE (P93 2026-07-27).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -10,6 +10,6 @@
|
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|
|
12
12
|
},
|
|
13
|
-
"_talosPublishHash": "sha256-
|
|
14
|
-
"_talosPublishedAt": "2026-
|
|
13
|
+
"_talosPublishHash": "sha256-H6oTRkzTtWhz5kbtdMN6IhbuX_uh4d6W8nxcax6lK94",
|
|
14
|
+
"_talosPublishedAt": "2026-10-07T12:24:23.248Z"
|
|
15
15
|
}
|
package/skills/document/SKILL.md
CHANGED
|
@@ -6,226 +6,154 @@ license: Proprietary. LICENSE.txt has complete terms
|
|
|
6
6
|
|
|
7
7
|
# Document Handling
|
|
8
8
|
|
|
9
|
-
Local-first, progressive
|
|
10
|
-
|
|
11
|
-
to page rendering only when the content is genuinely visual, and to native
|
|
12
|
-
document delivery only when the user explicitly opts in (PDF only).
|
|
9
|
+
Local-first, progressive disclosure: read the extracted text first, render pages only
|
|
10
|
+
when the content is genuinely visual, and write files only through this skill's scripts.
|
|
13
11
|
|
|
14
12
|
## Route (read only what you need)
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
exact
|
|
27
|
-
- **
|
|
28
|
-
→
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`--editable` / `--rasterize` / `--notes-doc`, which are .pptx-only):
|
|
32
|
-
`bin/html2pptx.cjs deck.html out.pdf --style <id> [--theme-v2 …] [--backdrop …]`.
|
|
33
|
-
One 16:9 page per slide, vector text (selectable, searchable), links clickable.
|
|
34
|
-
Do not route it through `doc-convert` (that re-lays out the .pptx) and never
|
|
35
|
-
assemble slide PNGs into a PDF (image pages: no text, no links). If the result
|
|
36
|
-
reports `pages` ≠ `slides`, a slide overflows its canvas — fix it and print again.
|
|
37
|
-
- **Convert** a .docx/.pptx/.xlsx to PDF(转成/转换/导出 PDF / convert to PDF)→
|
|
38
|
-
`bin/doc-convert.cjs <in.docx|pptx|xlsx> <out.pdf>`. This is FAITHFUL conversion —
|
|
39
|
-
the source's content, structure and images with neutral print styling; do not
|
|
40
|
-
re-theme, re-typeset or "优化排版" unless the user asks. **Never** hand-roll a
|
|
41
|
-
textutil / LibreOffice / python / headless-browser pipeline for this. xlsx/xls/
|
|
42
|
-
ods render ONLY through a real LibreOffice (local `soffice` or the
|
|
43
|
-
`TALOS_OFFICE_URL` sidecar) — there is no HTML/text-only fallback for
|
|
44
|
-
spreadsheets, so if neither is available the command errors instead of
|
|
45
|
-
degrading.
|
|
46
|
-
- **Create or edit** a .docx/.pptx/.xlsx/.pdf (generate from scratch or fill a
|
|
47
|
-
template) → read **rewrite.md**, use `doc-gen` / `doc-fill`. **Always** produce
|
|
48
|
-
document files via these scripts — never hand-write a python / ReportLab /
|
|
14
|
+
**Attachments arrive as file pointers** — a `<document … delivery="file">` block gives
|
|
15
|
+
the on-disk path (PDF/Office point at a pre-extracted `<file>.txt` sidecar). **Read that
|
|
16
|
+
file FIRST** (ordinary read tool, no script) before answering anything about the
|
|
17
|
+
document's content; never guess from the filename. Then:
|
|
18
|
+
|
|
19
|
+
- **Read a docx/pptx** → the sidecar is the content; don't re-extract (**office.md**).
|
|
20
|
+
- **Read a PDF** whose text is garbled/missing where the answer should be, or that needs
|
|
21
|
+
formulas, tables, figures or a scan read → **pdf.md** (scan → text or render; looking
|
|
22
|
+
at a page and the OCR fallback → **vision.md**).
|
|
23
|
+
- **Spreadsheet** computation ("sum/average/how many/总数/统计") → **xlsx.md**,
|
|
24
|
+
`bin/xlsx-query`. **Compute, do not dump** — it is exact; don't do the arithmetic yourself.
|
|
25
|
+
- **Create, fill or edit** a .docx/.xlsx/.pdf (or edit an existing .pptx: template fill,
|
|
26
|
+
slide surgery, comments/tracked changes) → **rewrite.md** — its index names the one
|
|
27
|
+
section your task needs. PDF forms, merge/split, stamp, encrypt → **pdf.md**. **Always**
|
|
28
|
+
produce document files via the scripts — never hand-write a python / ReportLab /
|
|
49
29
|
LibreOffice script for document output.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
not
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
30
|
+
- **Convert** a .docx/.pptx/.xlsx to PDF(转成/导出 PDF)→ `bin/doc-convert.cjs <in> <out.pdf>`.
|
|
31
|
+
FAITHFUL conversion — the source's content, structure and images with neutral print
|
|
32
|
+
styling; do not re-theme or "优化排版" unless asked, and never hand-roll a textutil /
|
|
33
|
+
LibreOffice / headless-browser pipeline. Spreadsheets render ONLY through a real
|
|
34
|
+
LibreOffice (local `soffice` or `TALOS_OFFICE_URL`); without one the command errors.
|
|
35
|
+
- **A deck you built here, as PDF**(PPT 要 PDF)→ print its `deck.html` with the same
|
|
36
|
+
style flags as the .pptx, minus the .pptx-only `--editable` / `--rasterize` / `--notes-doc`:
|
|
37
|
+
`bin/html2pptx.cjs deck.html out.pdf --style <id> [--theme-v2 …] [--backdrop …]` — one
|
|
38
|
+
vector 16:9 page per slide, text selectable, links live. Not `doc-convert` (it re-lays
|
|
39
|
+
out the .pptx), never slide PNGs assembled into a PDF. `pages` ≠ `slides` in the result
|
|
40
|
+
means a slide overflows its canvas — fix it and print again.
|
|
41
|
+
- **Any deck/presentation(路演/汇报/评审/宣讲/pitch/roadshow/介绍 PPT)** → the deck route below.
|
|
42
|
+
|
|
43
|
+
## Decks
|
|
44
|
+
|
|
45
|
+
**CLARIFY FIRST — HARD GATE (applies to EVERY deck).** Before authoring, collect three
|
|
46
|
+
brief fields: **(1) content source** (提供材料 / 联网调研 / 自由创作); **(2) scenario**
|
|
47
|
+
(pitch / 内审 / 销售 / 讲座 / 发布会 / 培训 / 大会 — sets tone, density, required sections);
|
|
48
|
+
**(3) slide count.** Ask only for fields the user did not already supply, in **ONE
|
|
49
|
+
AskUserQuestion call with at most THREE questions**, and wait for the answers. If all
|
|
50
|
+
three are already known, do not ask them again.
|
|
51
|
+
|
|
52
|
+
**STYLE PICKER — ONE RESULT PER IMAGE, SCENARIO-RANKED.** After the scenario is
|
|
53
|
+
known, read the skill directory's **current `catalog.json` from disk immediately
|
|
54
|
+
before building the picker**. Never reuse a catalog listing from earlier conversation
|
|
55
|
+
context and never infer pack availability by scanning `packs/`. If the current catalog
|
|
66
56
|
cannot be read or parsed, stop and report that exact error instead of presenting stale
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
57
|
+
options.
|
|
58
|
+
|
|
59
|
+
Unless the user already named an entry id/name, supplied a template file, or explicitly
|
|
60
|
+
said **"无需展示模板,直接替我选定风格"**, send one single-question image-card picker:
|
|
61
|
+
|
|
62
|
+
- Rank **entries**, not groups, against the confirmed scenario and the user's requested
|
|
63
|
+
tone. Show at most 8 recommended entries. A scenario-matching `kind === "pack"` ranks
|
|
64
|
+
before matching skins; include at least one matching pack whenever one exists.
|
|
65
|
+
- Every image card maps to exactly one final entry and uses
|
|
66
|
+
`{ label: entry.kind === "pack" ? "PACK · " + entry.name_cn :
|
|
67
|
+
(entry 属于 renderMode === "classic-v1" 的 collection ? "经典 · " + entry.name_cn : entry.name_cn),
|
|
68
|
+
description: entry.oneliner, imagePath: <skill目录下entry.sample的绝对路径> }`.
|
|
69
|
+
Copy `entry.oneliner` verbatim. Never use `group.sample` in this default picker.
|
|
70
|
+
- Append `{ label: "查看全部风格", description: "一次查看全部模板" }`, then
|
|
71
|
+
`{ label: "使用我的模板文件", description: "复用现成 PPT 的版式/风格",
|
|
72
|
+
filePick: "file" }` as the final option.
|
|
73
|
+
|
|
74
|
+
**"按场景推荐/你推荐" means rank the cards and still ask.** It does NOT waive the
|
|
75
|
+
picker. Only the explicit no-picker wording above authorizes automatic selection.
|
|
76
|
+
Do not waive this gate because the deck is small or quick.
|
|
77
|
+
|
|
78
|
+
If the user chooses **查看全部风格**, immediately show **every current
|
|
89
79
|
`catalog.entries` item in one single-question image-card picker** using the same label,
|
|
90
|
-
|
|
91
|
-
|
|
80
|
+
description, and imagePath rule above. Preserve catalog order, keep `PACK ·` visible,
|
|
81
|
+
and append the custom-template file card. Do not ask for a group, paginate, or return to
|
|
92
82
|
any category/second-level picker; the browse-all action must expose final selectable
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
delivering; never re-run `doc-validate` on their output. `doc-gen pdf` prints
|
|
146
|
-
`{valid, pages, textChars, cjkChars, previews}` (a ≈72dpi PNG per page — read
|
|
147
|
-
those, do not re-render or count characters yourself); `doc-gen docx` prints
|
|
148
|
-
`{valid, textChars, cjkChars}`, `xlsx` `{valid}`; `html2pptx` adds `valid` and
|
|
149
|
-
`qa` (deck-qa's findings) to its result. **After any other edit** (doc-fill /
|
|
150
|
-
docx-annotate / pptx-clone / pptx-slide / doc-xml pack / hand-written scripts)
|
|
151
|
-
run `bin/doc-validate.cjs <file>` yourself — exit 1 means fix it. Valid is not
|
|
152
|
-
good-looking: **render-and-look** before delivery (see "Verify generated
|
|
153
|
-
output" below; decks sign off with `deck-qa --final`).
|
|
154
|
-
- **Raw XML edit** (when no targeted tool fits): `doc-xml unpack` → edit →
|
|
155
|
-
`doc-xml pack` → `doc-validate` (see rewrite.md "Raw XML editing").
|
|
156
|
-
- **PDF** whose inlined text is garbled/missing where the answer should be →
|
|
157
|
-
**pdf.md**: `bin/doc-text <file.pdf>` to re-extract, or render + look.
|
|
158
|
-
- Just reading a docx/pptx/text → read the pointed-at file/sidecar directly;
|
|
159
|
-
don't re-extract with scripts (see **office.md**).
|
|
160
|
-
|
|
161
|
-
## Fidelity decision (default text, escalate on evidence)
|
|
162
|
-
|
|
163
|
-
1. `bin/doc-scan <file>` → cheap per-page signals (`textChars`, `imageCoverage`,
|
|
164
|
-
`mathHint`, `tableHint`, `scanned`). Costs nothing to the context beyond the
|
|
165
|
-
small JSON.
|
|
166
|
-
2. Read intent: summarize/translate → text; formulas/tables/figures/layout →
|
|
167
|
-
visual; unsure → start with text.
|
|
168
|
-
3. Per page: `scanned` OR high `imageCoverage` OR (visual intent AND
|
|
169
|
-
math/table hint) → render + look (vision.md); else `doc-text`.
|
|
170
|
-
4. **Self-correct (important):** if the extracted text is garbled or missing
|
|
171
|
-
where the answer should be (symbols shredded for a formula, a table collapsed
|
|
172
|
-
into one line, a page with almost no characters) → render THAT page and look.
|
|
173
|
-
5. **Vision unavailable** (text-only model): text/OCR only, and state the
|
|
174
|
-
limitation plainly — never silently return empty for a scanned/visual page.
|
|
175
|
-
|
|
176
|
-
## Verify generated output (render-and-look — MANDATORY for delivery)
|
|
177
|
-
|
|
178
|
-
Structural validation (`doc-validate`) proves the file is well-formed; it does
|
|
179
|
-
NOT prove it *looks* right. Before delivering ANY document you generated or
|
|
180
|
-
converted (doc-gen / doc-fill / doc-convert / doc-run / raw-XML / template fill),
|
|
181
|
-
do a visual self-check — the same "assume there are problems" ethos as the
|
|
182
|
-
Fidelity-decision self-correct, but pointed at your OWN output:
|
|
183
|
-
|
|
184
|
-
1. **Render the final artifact to images** and LOOK at every page (not "glance"):
|
|
185
|
-
PDF → `bin/pdf-render.cjs <file.pdf> all`; docx/pptx → `bin/doc-convert.cjs
|
|
186
|
-
<file> /tmp/preview.pdf` then `pdf-render` the PDF. Decks follow the fuller
|
|
187
|
-
loop in **deck-design.md** ("Verify before delivering") — do that instead.
|
|
188
|
-
2. **Hunt for render-level bugs** structural checks can't see: text overflowing
|
|
189
|
-
its box / cut off at the page edge; tables broken or collapsed; bad page
|
|
190
|
-
breaks (heading orphaned from its body, a row split mid-cell); **tofu / □ /
|
|
191
|
-
blank CJK** (a missing-font symptom, not a content bug); colliding
|
|
192
|
-
headers/footers; leftover `{{tokens}}` / "lorem" / "undefined".
|
|
193
|
-
3. **Fix → re-render the affected pages.** One fix often creates another; repeat
|
|
194
|
-
until a clean pass. Fix what is broken — clipped, overlapping, unreadable, tofu —
|
|
195
|
-
not how full a page looks: unless the user asked for a page count, never
|
|
83
|
+
templates directly.
|
|
84
|
+
|
|
85
|
+
Samples are pre-rendered WebP files shipped with the skill: pass their absolute paths
|
|
86
|
+
directly and render nothing during the question. The selected `entry.id` is the stable
|
|
87
|
+
`style` id. An entry in a `renderMode:"classic-v1"` collection of `catalog.collections`
|
|
88
|
+
renders V1 (no `themeVersion`, never `--theme-v2`); every other new deck uses Theme V2 —
|
|
89
|
+
read **theme-system.md** before authoring.
|
|
90
|
+
|
|
91
|
+
**Keep both calls LEAN:** bare label strings for the content/scenario/count questions,
|
|
92
|
+
one short sentence per stem, no chat preamble beyond one line. If the user answers with
|
|
93
|
+
a correction or question, handle it and re-ask.
|
|
94
|
+
|
|
95
|
+
**Automatic choice, only when explicitly authorized:** rank by a remembered preference,
|
|
96
|
+
an exact user-named style, scenario match, a matching pack before a matching skin, then
|
|
97
|
+
`entry.mode` when the user asked for clean/formal/light/dark. Never hardcode a family id:
|
|
98
|
+
`catalog.json` is the only roster. Never render unstyled. After the user confirms, save
|
|
99
|
+
the preference to memory.
|
|
100
|
+
|
|
101
|
+
**Custom style** (其他/自定义, 使用我的模板文件, "我之前那个风格"): routes and naming are in
|
|
102
|
+
**deck-design.md "Custom skins"** — prefer deriving a bespoke skin, saved as a user style
|
|
103
|
+
under `$TALOS_DOC_STYLES_DIR/styles/<name>/`; an uploaded deck whose exact layouts must be
|
|
104
|
+
kept → rewrite.md "Reuse an uploaded deck". Never write inside the skill directory.
|
|
105
|
+
|
|
106
|
+
**Then build it.** Read **content-pipeline.md** (brief → research → narrative → one
|
|
107
|
+
outline gate) for a substantive deck, then **deck-design.md** (workflow, slide contract,
|
|
108
|
+
sign-off) and **`layouts/README.md`** (layout selection and fill contract). In short:
|
|
109
|
+
**plan before you fill** — `bin/deck-plan.cjs plan.json spec.json` picks layouts by
|
|
110
|
+
MEASURED capacity and drafts the spec, `deck-build` fills it, charts are drawn from data
|
|
111
|
+
(never hand-write chart SVG), and `bin/html2pptx.cjs deck.html out.pptx --style <id>`
|
|
112
|
+
(+ `--theme-v2` unless the entry is classic-v1) renders it. `doc-gen` and doc-run
|
|
113
|
+
PptxGenJS make no decks; html2pptx needs a browser — without one, say so and stop, never
|
|
114
|
+
fall back to a lesser deck.
|
|
115
|
+
|
|
116
|
+
## After writing a file (MANDATORY before delivery)
|
|
117
|
+
|
|
118
|
+
1. **Valid.** `doc-gen` and `html2pptx` check their own output in the step that wrote
|
|
119
|
+
it — `valid: false` exits 1, fix before delivering;
|
|
120
|
+
never re-run `doc-validate` on their output. `doc-gen pdf` prints `{valid, pages, textChars, cjkChars, previews}`
|
|
121
|
+
(a ≈72dpi PNG per page — read those, do not re-render or count characters yourself);
|
|
122
|
+
`doc-gen docx` prints `{valid, textChars, cjkChars}`, `xlsx` `{valid}`. After any
|
|
123
|
+
other write (doc-fill, docx-annotate, pptx-*, pdf-form / pdf-ops, doc-xml pack, a
|
|
124
|
+
doc-run script) run `bin/doc-validate.cjs <file>` yourself — exit 1 means fix it.
|
|
125
|
+
2. **Looks right — render and LOOK at every page** (valid is not good-looking): a
|
|
126
|
+
doc-gen PDF → its `previews`; another PDF → `bin/pdf-render.cjs <file.pdf> all 1`;
|
|
127
|
+
docx/pptx/xlsx → `bin/doc-convert.cjs <file> preview.pdf` (working folder), then
|
|
128
|
+
`pdf-render` it. Decks follow deck-design.md "Verify before delivering" instead. Hunt
|
|
129
|
+
for text overflowing or cut off at the page edge, collapsed tables, a row split
|
|
130
|
+
mid-cell, **tofu / □ / blank CJK** (a missing font, not a content bug), colliding
|
|
131
|
+
headers/footers, leftover `{{tokens}}` / "lorem" / "undefined".
|
|
132
|
+
3. **Fix → re-render the affected pages** and look at only those — never re-read a
|
|
133
|
+
page you already looked at. Fix what is broken — clipped, overlapping, unreadable,
|
|
134
|
+
tofu — not how full a page looks: unless the user asked for a page count, never
|
|
196
135
|
resize fonts, line height or margins to fill a short last page or squeeze onto
|
|
197
|
-
fewer pages. Page breaks already keep a heading with its text and never strand
|
|
198
|
-
|
|
199
|
-
TWO fix rounds
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
`bin/
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
- Edit: `bin/doc-fill.cjs` fill `{{tokens}}` · `bin/doc-xml.cjs unpack|pack|replace|merge-runs` raw XML ·
|
|
222
|
-
`bin/pptx-slide.cjs add|dup|remove|reorder` · `bin/pptx-clone.cjs` clone a template slide per item ·
|
|
223
|
-
`bin/pptx-tokenize.cjs` uploaded deck → template · `bin/pptx-set-image.cjs` · `bin/pptx-theme.cjs` palette from a deck ·
|
|
224
|
-
`bin/pptx-embed-fonts.cjs` · `bin/docx-annotate.cjs comment|suggest|accept|redline-check` ·
|
|
225
|
-
`bin/xlsx-recalc.cjs` recompute formulas.
|
|
226
|
-
- Validate: `bin/doc-validate.cjs <file.docx|pptx|xlsx|pdf> [--strict]` — for anything a generator did not already check.
|
|
227
|
-
- PDF: `bin/pdf-form.cjs list|fill|overlay` · `bin/pdf-ops.cjs merge|split|rotate|watermark|stamp|encrypt|decrypt`.
|
|
228
|
-
|
|
229
|
-
All scripts are Node and print a machine-readable result plus a human note. On a
|
|
230
|
-
missing dependency or unreadable file they exit non-zero with a clear message —
|
|
231
|
-
report that to the user, do not fabricate content.
|
|
136
|
+
fewer pages. Page breaks already keep a heading with its text and never strand a
|
|
137
|
+
single line, so a heading near a page edge is not something to fix. Layout taste gets at most
|
|
138
|
+
TWO fix rounds; then deliver and name what is still imperfect. A one-page memo = one
|
|
139
|
+
look; a long report = every page.
|
|
140
|
+
4. **Vision unavailable**: say so, rely on `doc-validate` + a `doc-text` re-extract as a
|
|
141
|
+
weaker proxy, and never claim the layout is verified.
|
|
142
|
+
|
|
143
|
+
## Scripts
|
|
144
|
+
|
|
145
|
+
Run them with bash; **read a bin's entry in `bin-reference.md` before its first use** —
|
|
146
|
+
its index at the top points at the one section your task needs (flags, output, exit
|
|
147
|
+
codes). Never read or grep `bin/*.cjs` themselves: they are bundled builds.
|
|
148
|
+
|
|
149
|
+
- Read: `bin/doc-scan.cjs` · `bin/doc-text.cjs` · `bin/pdf-render.cjs` · `bin/pdf-images.cjs` ·
|
|
150
|
+
`bin/pdf-tables.cjs` · `bin/ocr.cjs` · `bin/xlsx-query.cjs`
|
|
151
|
+
- Generate: `bin/doc-gen.cjs` · `bin/doc-run.cjs` · `bin/xlsx-recalc.cjs`
|
|
152
|
+
- Fill / edit: `bin/doc-fill.cjs` · `bin/doc-xml.cjs` · `bin/docx-annotate.cjs` · `bin/pptx-clone.cjs` ·
|
|
153
|
+
`bin/pptx-slide.cjs` · `bin/pptx-tokenize.cjs` · `bin/pptx-set-image.cjs` · `bin/pptx-theme.cjs` ·
|
|
154
|
+
`bin/pptx-embed-fonts.cjs` · `bin/pdf-form.cjs` · `bin/pdf-ops.cjs`
|
|
155
|
+
- Decks: `bin/deck-scenario.cjs` · `bin/deck-plan.cjs` · `bin/deck-build.cjs` · `bin/deck-chart.cjs` · `bin/html2pptx.cjs` · `bin/deck-qa.cjs`
|
|
156
|
+
- Validate / convert: `bin/doc-validate.cjs <file.docx|pptx|xlsx|pdf> [--strict]` · `bin/doc-convert.cjs`
|
|
157
|
+
|
|
158
|
+
Every script prints a machine-readable result. On a missing dependency or unreadable
|
|
159
|
+
file it exits non-zero with a clear message — report that, never fabricate content.
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/* Theme V2 art-direction canvas. The renderer injects this decoration-only layer
|
|
2
|
-
into .slide-backdrop; V1 never receives the markup or these rules.
|
|
3
|
-
.theme-art-layer
|
|
2
|
+
into .slide-backdrop; V1 never receives the markup or these rules.
|
|
3
|
+
Markup: .theme-art-layer > .art-slot.art-slot-{a,b,c,pattern} > .art-{a,b,c,pattern}.
|
|
4
|
+
Each slot is a full-bleed, untransformed box, so a canvas-space mask on it stays
|
|
5
|
+
put while the shape inside it is rotated, scaled or moved. */
|
|
6
|
+
.theme-art-layer,.theme-art-layer *{position:absolute;pointer-events:none}
|
|
4
7
|
.theme-art-layer{inset:0;overflow:hidden}
|
|
8
|
+
.theme-art-layer .art-slot{inset:0;display:block}
|
|
5
9
|
.theme-art-layer .art-shape{display:block}
|
|
6
10
|
|
|
7
11
|
/* Scene controls composition; density controls intensity. These selectors only
|
|
@@ -21,3 +25,24 @@
|
|
|
21
25
|
[data-scene-variant="b"] .theme-art-layer .art-b{opacity:.82}
|
|
22
26
|
[data-scene-variant="c"] .theme-art-layer .art-a{opacity:.18}
|
|
23
27
|
[data-scene-variant="c"] .theme-art-layer .art-c{opacity:.86}
|
|
28
|
+
|
|
29
|
+
/* Content safe zone. Every motif is composed for the open hero/cover canvas; on a
|
|
30
|
+
content layout the type, cards and charts fill x≈94–1196 · y≈128–655, so a corner
|
|
31
|
+
block at hero size lands on them. Each art direction therefore restates its hard
|
|
32
|
+
shapes for content layouts — shrunk back toward the canvas corner/edge they lean on
|
|
33
|
+
(`scale`/`translate` compose with a motif's own `transform`), never clipped.
|
|
34
|
+
The content selector is the same in every art-direction file (and in gen-skin's
|
|
35
|
+
signature rules); tests/unit/deck-decor-overlap.test.ts holds them to it:
|
|
36
|
+
|
|
37
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"])
|
|
38
|
+
|
|
39
|
+
Slides without data-layout (hand-written HTML) keep the hero composition.
|
|
40
|
+
|
|
41
|
+
Safety net: a slot listed by its art direction under the same selector gets
|
|
42
|
+
--decor-safe-mask, which clears the content box (x 94–1196 · y 128–654; matrix axis labels reach x≈1195) with a short feather outside it. Where
|
|
43
|
+
the retreat already keeps a shape out of the box the mask changes no pixel; it only
|
|
44
|
+
bites where a shape still reaches in. */
|
|
45
|
+
.theme-art-layer,.sig-layer{
|
|
46
|
+
--decor-safe-mask:linear-gradient(90deg,black 80px,transparent 94px,transparent calc(100% - 84px),black calc(100% - 74px)),
|
|
47
|
+
linear-gradient(180deg,black 112px,transparent 128px,transparent calc(100% - 66px),black calc(100% - 58px));
|
|
48
|
+
}
|
|
@@ -3,4 +3,6 @@
|
|
|
3
3
|
.theme-art-layer .art-b{left:18%;top:-230px;width:260px;height:1120px;background:linear-gradient(180deg,color-mix(in srgb,var(--c3) 36%,transparent),transparent 78%);transform:rotate(-28deg);filter:blur(18px);opacity:.52}
|
|
4
4
|
.theme-art-layer .art-c{right:84px;top:62px;width:210px;height:210px;border:1px solid var(--c1);border-radius:50%;box-shadow:0 0 0 28px color-mix(in srgb,var(--c1) 8%,transparent),0 0 70px color-mix(in srgb,var(--c2) 30%,transparent);opacity:.62}
|
|
5
5
|
.theme-art-layer .art-pattern{inset:0;background:linear-gradient(180deg,transparent 64%,color-mix(in srgb,var(--title) 7%,transparent));opacity:.8}
|
|
6
|
-
|
|
6
|
+
/* Content layouts — the floating ring shrinks into the top-right corner; the lights and beams stay. */
|
|
7
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:calc(100% + 84px) -62px;scale:.36}
|
|
8
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-c){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -5,4 +5,8 @@
|
|
|
5
5
|
.theme-art-layer .art-pattern{right:54px;bottom:44px;width:170px;height:120px;background:conic-gradient(from 90deg,color-mix(in srgb,var(--c1) 32%,transparent) 25%,transparent 0 50%,color-mix(in srgb,var(--c2) 28%,transparent) 0 75%,transparent 0);background-size:24px 24px;transform:rotate(3deg);opacity:.68}
|
|
6
6
|
.component-grid>.component-card:nth-child(odd),.component-grid>.team-card:nth-child(odd){transform:rotate(-.45deg)}
|
|
7
7
|
.component-grid>.component-card:nth-child(even),.component-grid>.team-card:nth-child(even){transform:rotate(.45deg)}
|
|
8
|
-
|
|
8
|
+
/* Content layouts — the paper scraps and the checker swatch shrink into their corners; the tape strip already sits in the top margin. */
|
|
9
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-a{transform-origin:calc(100% - 40px) 52px;scale:.52}
|
|
10
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:64px calc(100% - 52px);scale:.4}
|
|
11
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-pattern{transform-origin:calc(100% + 54px) calc(100% + 44px);scale:.45}
|
|
12
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-a,.art-slot-b,.art-slot-pattern){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -5,4 +5,8 @@
|
|
|
5
5
|
.theme-art-layer .art-pattern{right:44px;bottom:34px;width:220px;height:164px;border:1px solid var(--c1);background:repeating-linear-gradient(-45deg,transparent 0 11px,color-mix(in srgb,var(--c1) 14%,transparent) 11px 13px);opacity:.58}
|
|
6
6
|
[data-layout="cover"] .theme-art-layer .art-a,[data-layout="section"] .theme-art-layer .art-a{width:40%;background:var(--c1);opacity:.9}
|
|
7
7
|
.component-grid>.component-card:nth-child(even),.component-grid>.proof-card:nth-child(even){background:color-mix(in srgb,var(--c2) 9%,var(--cmp-surface))}
|
|
8
|
-
|
|
8
|
+
/* Content layouts — the colour column narrows to the right margin (its gradient cap follows); the hatched plate shrinks into the bottom-right corner. */
|
|
9
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-a{width:74px}
|
|
10
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{width:74px}
|
|
11
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-pattern{transform-origin:calc(100% + 44px) calc(100% + 34px);scale:.4}
|
|
12
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-a,.art-slot-b,.art-slot-pattern){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -7,3 +7,9 @@
|
|
|
7
7
|
.component-grid>.component-card:nth-child(4n+1),.component-grid>.feature-card:nth-child(4n+1){border-top:7px solid var(--c1)}
|
|
8
8
|
.component-grid>.component-card:nth-child(4n+2),.component-grid>.feature-card:nth-child(4n+2){border-top:7px solid var(--c2)}
|
|
9
9
|
.component-grid>.component-card:nth-child(4n+3),.component-grid>.feature-card:nth-child(4n+3){border-top:7px solid var(--c3)}
|
|
10
|
+
/* Content layouts — the colour fields and the square ring shrink into the corners they are cropped by. */
|
|
11
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-a{transform-origin:calc(100% - 80px) calc(100% - 110px);scale:.28}
|
|
12
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:70px calc(100% - 92px);scale:.45}
|
|
13
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:calc(100% + 260px) calc(100% + 44px);scale:.22}
|
|
14
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-a,.art-slot-b,.art-slot-c){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
15
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"])[data-layout="pitch-problem"] .theme-art-layer .art-a{transform-origin:calc(100% - 80px) 90px}
|
|
@@ -3,4 +3,8 @@
|
|
|
3
3
|
.theme-art-layer .art-b{right:-110px;top:90px;width:380px;height:520px;border-radius:52% 0 0 52%;background:linear-gradient(150deg,color-mix(in srgb,var(--c2) 78%,transparent),color-mix(in srgb,var(--c4) 58%,transparent));opacity:.18;transform:rotate(8deg)}
|
|
4
4
|
.theme-art-layer .art-c{left:58%;top:-160px;width:320px;height:320px;border:1px solid var(--c1);border-radius:50%;box-shadow:0 0 0 38px color-mix(in srgb,var(--c1) 8%,transparent),0 0 0 76px color-mix(in srgb,var(--c2) 6%,transparent);opacity:.45}
|
|
5
5
|
.theme-art-layer .art-pattern{inset:0;background:linear-gradient(115deg,transparent 48%,color-mix(in srgb,var(--c1) 12%,transparent) 49%,transparent 51%);opacity:.6}
|
|
6
|
-
|
|
6
|
+
/* Content layouts — the side blob retreats to the right edge; the rings shrink onto their centre on the top edge
|
|
7
|
+
(outer shadow ring ends at y≈106, above pitch eyebrows/headlines at x 600–1180 · y≥123); the mesh and the light stay. */
|
|
8
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:calc(100% - 110px) 50%;scale:.28}
|
|
9
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:50% 50%;scale:.45}
|
|
10
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-b,.art-slot-c){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -6,3 +6,8 @@
|
|
|
6
6
|
.component-grid>.component-card:nth-child(3n+1),.component-grid>.feature-card:nth-child(3n+1){background:color-mix(in srgb,var(--c1) 9%,var(--cmp-surface))}
|
|
7
7
|
.component-grid>.component-card:nth-child(3n+2),.component-grid>.feature-card:nth-child(3n+2){background:color-mix(in srgb,var(--c2) 9%,var(--cmp-surface))}
|
|
8
8
|
.component-grid>.component-card:nth-child(3n),.component-grid>.feature-card:nth-child(3n){background:color-mix(in srgb,var(--c3) 9%,var(--cmp-surface))}
|
|
9
|
+
/* Content layouts — the blobs and the loop shrink into their corners. */
|
|
10
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-a{transform-origin:calc(100% - 95px) 76px;scale:.55}
|
|
11
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:90px calc(100% - 90px);scale:.44}
|
|
12
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:calc(100% + 210px) calc(100% + 58px);scale:.3}
|
|
13
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-a,.art-slot-b,.art-slot-c){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -3,4 +3,7 @@
|
|
|
3
3
|
.theme-art-layer .art-b{right:-150px;top:-150px;width:420px;height:420px;border:1px solid var(--c2);border-radius:50%;box-shadow:0 0 0 34px color-mix(in srgb,var(--c2) 7%,transparent),0 0 0 68px color-mix(in srgb,var(--c3) 5%,transparent);opacity:.46}
|
|
4
4
|
.theme-art-layer .art-c{left:-120px;bottom:-120px;width:320px;height:320px;background:radial-gradient(circle,var(--c1) 0 2px,transparent 3px),conic-gradient(from 0deg,transparent 0 8deg,color-mix(in srgb,var(--c1) 18%,transparent) 8deg 10deg,transparent 10deg 20deg);border-radius:50%;opacity:.4}
|
|
5
5
|
.theme-art-layer .art-pattern{right:50px;bottom:50px;width:180px;height:1px;background:linear-gradient(90deg,transparent,var(--c1),transparent);box-shadow:0 -8px 0 color-mix(in srgb,var(--c1) 22%,transparent),0 8px 0 color-mix(in srgb,var(--c1) 22%,transparent)}
|
|
6
|
-
|
|
6
|
+
/* Content layouts — the corner rings and the ray ornament shrink into their corners; the frame stays. */
|
|
7
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:calc(100% - 150px) 150px;scale:.55}
|
|
8
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:120px calc(100% - 120px);scale:.55}
|
|
9
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-b,.art-slot-c){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -7,3 +7,9 @@
|
|
|
7
7
|
.component-grid>.component-card:nth-child(4n+2),.component-grid>.price-card:nth-child(4n+2){background:var(--c2)}
|
|
8
8
|
.component-grid>.component-card:nth-child(4n+3),.component-grid>.price-card:nth-child(4n+3){background:var(--c3)}
|
|
9
9
|
.component-grid>.component-card:nth-child(4n+4),.component-grid>.price-card:nth-child(4n+4){background:var(--c4)}
|
|
10
|
+
/* Content layouts — the top slab already lives above the title; the floor slab, the shadowed card and the stripe swatch shrink into their corners.
|
|
11
|
+
The swatch stops above y≈56: pitch layouts put their eyebrow at x 80 · y 64. */
|
|
12
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:80px calc(100% - 78px);scale:.38}
|
|
13
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:calc(100% + 36px) calc(100% + 48px);scale:.34}
|
|
14
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-pattern{transform-origin:0 0;scale:.36}
|
|
15
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-b,.art-slot-c,.art-slot-pattern){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -4,3 +4,7 @@
|
|
|
4
4
|
.theme-art-layer .art-c{right:76px;top:64px;width:122px;height:122px;border:1px solid var(--c1);box-shadow:26px 26px 0 color-mix(in srgb,var(--c2) 16%,transparent);opacity:.58}
|
|
5
5
|
.theme-art-layer .art-pattern{left:36px;bottom:32px;width:300px;height:26px;background:repeating-linear-gradient(90deg,var(--c1) 0 2px,transparent 2px 18px);opacity:.32}
|
|
6
6
|
.component-grid>.component-card,.component-grid>.metric-card{background:color-mix(in srgb,var(--slide-bg) 82%,transparent);backdrop-filter:blur(8px)}
|
|
7
|
+
/* Content layouts — the modular zone and the node square shrink into their corners; grid and tick rail stay. */
|
|
8
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-b{transform-origin:100% 100%;scale:.2}
|
|
9
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer .art-c{transform-origin:calc(100% + 76px) -64px;scale:.5}
|
|
10
|
+
.slide[data-layout]:not([data-layout^="cover"],[data-layout^="section"],[data-layout^="title"],[data-layout^="ending"],[data-layout="hero"],[data-layout="transition"]) .theme-art-layer :is(.art-slot-b,.art-slot-c){-webkit-mask-image:var(--decor-safe-mask);mask-image:var(--decor-safe-mask)}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_comment": "Single source of truth for the skill's bundled font set. Consumed by bin-src/html2pptx.mjs (base64 @font-face injection at render) and by scripts/deck/deck-skin-samples.mjs + scripts/deck/deck-fidelity.mjs (served from disk via page.route). Add a face HERE, drop the .woff2 beside it, and every renderer picks it up — never inline a base64 @font-face into a skin.css. `substitutesInvisibly: true` marks a neutral grotesque: it is NOT on any OS, so the native pptx text layer swaps it for Helvetica/Arial, but the swap differs by a hair and no reader would name it — such a face may lead a skin unbaked. A serif or display face is the opposite call: bake every rule that uses it, or the audience sees a different font (deck-layouts.test.ts enforces both directions, and gen-skin refuses a family that gets it wrong).",
|
|
2
|
+
"_comment": "Single source of truth for the skill's bundled font set. Consumed by bin-src/html2pptx.mjs (base64 @font-face injection at render) and by scripts/deck/deck-skin-samples.mjs + scripts/deck/deck-fidelity.mjs (served from disk via page.route). Add a face HERE, drop the .woff2 beside it, and every renderer picks it up — never inline a base64 @font-face into a skin.css. `substitutesInvisibly: true` marks a neutral grotesque: it is NOT on any OS, so the native pptx text layer swaps it for Helvetica/Arial, but the swap differs by a hair and no reader would name it — such a face may lead a skin unbaked. A serif or display face is the opposite call: bake every rule that uses it, or the audience sees a different font (deck-layouts.test.ts enforces both directions, and gen-skin refuses a family that gets it wrong). Every family here also needs a LibreOffice stand-in with a real bold — WEB_FONT_SUBSTITUTES in packages/core/src/document/soffice.ts (macOS profile) and apps/cloud/fontconfig/64-talos-cjk.conf (cloud image); soffice-mac-cjk.test.ts fails until a new face is in both, because an unmapped bold run comes out of macOS LibreOffice as Arial Black glyphs on Arial Unicode MS.",
|
|
3
3
|
"cjkUnicodeRange": "U+2E80-2EFF,U+3000-303F,U+3040-30FF,U+3200-4DBF,U+4E00-9FFF,U+F900-FAFF,U+FE30-FE4F,U+FF00-FFEF",
|
|
4
4
|
"cjk": [
|
|
5
5
|
{
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"Gochi Hand"
|
|
51
51
|
],
|
|
52
52
|
"license": "Apache License 2.0 (Google Fonts)",
|
|
53
|
-
"note": "Handwriting face, hand-drawn's signature marker-pen heading. Latin-only, so a CJK deck barely shows it; and hand-drawn does NOT bake its titles, so the native text layer still
|
|
53
|
+
"note": "Handwriting face, hand-drawn's signature marker-pen heading. Latin-only, so a CJK deck barely shows it; and hand-drawn does NOT bake its titles, so the native text layer still names `Gochi Hand`, which no OS has (doc-convert's LibreOffice maps it to Noteworthy on macOS, Liberation Sans in the cloud image). Bundling fixes the backdrop/preview render only — see _scope."
|
|
54
54
|
},
|
|
55
55
|
{
|
|
56
56
|
"file": "BigShouldersDisplay-Bold.woff2",
|
|
Binary file
|