@litfamily/litclaude 1.0.19 → 1.0.21

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 (101) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +14 -8
  3. package/README_ko-KR.md +13 -8
  4. package/docs/assets/readme/badge-version.svg +1 -1
  5. package/docs/hooks.md +3 -2
  6. package/package.json +1 -1
  7. package/plugins/litclaude/.claude-plugin/plugin.json +1 -1
  8. package/plugins/litclaude/bin/litclaude-hook.js +4 -4
  9. package/plugins/litclaude/bin/litclaude-mcp.js +1 -1
  10. package/plugins/litclaude/lib/canonical-skill-resources.mjs +91 -31
  11. package/plugins/litclaude/skills/frontend-ui-ux/ATTRIBUTION.md +3 -6
  12. package/plugins/litclaude/skills/lit-docx/SKILL.md +50 -19
  13. package/plugins/litclaude/skills/lit-docx/references/components.md +207 -0
  14. package/plugins/litclaude/skills/lit-docx/references/direction-step.md +277 -0
  15. package/plugins/litclaude/skills/lit-docx/references/examples/01-report-ko.md +166 -0
  16. package/plugins/litclaude/skills/lit-docx/references/examples/02-brief-ko.md +105 -0
  17. package/plugins/litclaude/skills/lit-docx/references/examples/03-manual-ko.md +164 -0
  18. package/plugins/litclaude/skills/lit-docx/references/examples/04-proposal-ko.md +138 -0
  19. package/plugins/litclaude/skills/lit-docx/references/examples/05-memo-en.md +55 -0
  20. package/plugins/litclaude/skills/lit-docx/references/examples/06-journal-en.md +130 -0
  21. package/plugins/litclaude/skills/lit-docx/references/examples/07-report-en.md +123 -0
  22. package/plugins/litclaude/skills/lit-docx/references/examples/08-proposal-en.md +123 -0
  23. package/plugins/litclaude/skills/lit-docx/references/examples/09-memo-ko.md +45 -0
  24. package/plugins/litclaude/skills/lit-docx/references/page-composition.md +221 -0
  25. package/plugins/litclaude/skills/lit-docx/references/tonalities/brief.md +143 -0
  26. package/plugins/litclaude/skills/lit-docx/references/tonalities/journal.md +142 -0
  27. package/plugins/litclaude/skills/lit-docx/references/tonalities/manual.md +148 -0
  28. package/plugins/litclaude/skills/lit-docx/references/tonalities/memo.md +137 -0
  29. package/plugins/litclaude/skills/lit-docx/references/tonalities/proposal.md +140 -0
  30. package/plugins/litclaude/skills/lit-docx/references/tonalities/report.md +156 -0
  31. package/plugins/litclaude/skills/lit-docx/scripts/convert_md_to_docx.py +274 -73
  32. package/plugins/litclaude/skills/lit-docx/scripts/docx_design.py +2449 -0
  33. package/plugins/litclaude/skills/lit-docx/scripts/docx_layout.py +959 -0
  34. package/plugins/litclaude/skills/lit-docx/scripts/qa_docx.py +66 -9
  35. package/plugins/litclaude/skills/lit-docx/scripts/slop_lint.py +18 -6
  36. package/plugins/litclaude/skills/lit-docx/templates/tonalities/brief.yaml +28 -0
  37. package/plugins/litclaude/skills/lit-docx/templates/tonalities/journal.yaml +25 -0
  38. package/plugins/litclaude/skills/lit-docx/templates/tonalities/manual.yaml +26 -0
  39. package/plugins/litclaude/skills/lit-docx/templates/tonalities/memo.yaml +26 -0
  40. package/plugins/litclaude/skills/lit-docx/templates/tonalities/proposal.yaml +26 -0
  41. package/plugins/litclaude/skills/lit-docx/templates/tonalities/report.yaml +26 -0
  42. package/plugins/litclaude/skills/lit-pptx/SKILL.md +105 -48
  43. package/plugins/litclaude/skills/lit-pptx/references/agents/analyst.md +1 -1
  44. package/plugins/litclaude/skills/lit-pptx/references/agents/thesis.md +1 -1
  45. package/plugins/litclaude/skills/lit-pptx/references/anti-slop-checklist.md +59 -30
  46. package/plugins/litclaude/skills/lit-pptx/references/authoring-guide.md +119 -42
  47. package/plugins/litclaude/skills/lit-pptx/references/consensus-protocol.md +1 -1
  48. package/plugins/litclaude/skills/lit-pptx/references/data-display-cookbook.md +13 -6
  49. package/plugins/litclaude/skills/lit-pptx/references/density-and-fill.md +164 -0
  50. package/plugins/litclaude/skills/lit-pptx/references/design-system-azure.md +7 -4
  51. package/plugins/litclaude/skills/lit-pptx/references/direction-step.md +186 -0
  52. package/plugins/litclaude/skills/lit-pptx/references/examples/01-pitch-signal-ko.md +210 -0
  53. package/plugins/litclaude/skills/lit-pptx/references/examples/02-pitch-studio-ko.md +147 -0
  54. package/plugins/litclaude/skills/lit-pptx/references/examples/03-business-review-ledger-ko.md +199 -0
  55. package/plugins/litclaude/skills/lit-pptx/references/examples/04-business-review-night-en.md +203 -0
  56. package/plugins/litclaude/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +179 -0
  57. package/plugins/litclaude/skills/lit-pptx/references/examples/06-lecture-chalk-ko.md +199 -0
  58. package/plugins/litclaude/skills/lit-pptx/references/examples/07-data-review-night-en.md +194 -0
  59. package/plugins/litclaude/skills/lit-pptx/references/examples/08-image-led-atlas-ko.md +175 -0
  60. package/plugins/litclaude/skills/lit-pptx/references/examples/09-briefing-gazette-ko.md +204 -0
  61. package/plugins/litclaude/skills/lit-pptx/references/examples/10-status-update-ledger-ko.md +179 -0
  62. package/plugins/litclaude/skills/lit-pptx/references/examples/11-portfolio-studio-en.md +164 -0
  63. package/plugins/litclaude/skills/lit-pptx/references/examples/12-research-tutorial-chalk-en.md +174 -0
  64. package/plugins/litclaude/skills/lit-pptx/references/interview-protocol.md +1 -1
  65. package/plugins/litclaude/skills/lit-pptx/references/layout-families.md +198 -0
  66. package/plugins/litclaude/skills/lit-pptx/references/stages/autopilot.md +1 -1
  67. package/plugins/litclaude/skills/lit-pptx/references/stages/interview.md +2 -2
  68. package/plugins/litclaude/skills/lit-pptx/references/stages/plan.md +1 -1
  69. package/plugins/litclaude/skills/lit-pptx/references/title-treatments.md +109 -0
  70. package/plugins/litclaude/skills/lit-pptx/references/tonalities/atlas.md +139 -0
  71. package/plugins/litclaude/skills/lit-pptx/references/tonalities/chalk.md +148 -0
  72. package/plugins/litclaude/skills/lit-pptx/references/tonalities/gazette.md +149 -0
  73. package/plugins/litclaude/skills/lit-pptx/references/tonalities/ledger.md +149 -0
  74. package/plugins/litclaude/skills/lit-pptx/references/tonalities/night.md +147 -0
  75. package/plugins/litclaude/skills/lit-pptx/references/tonalities/paper.md +151 -0
  76. package/plugins/litclaude/skills/lit-pptx/references/tonalities/signal.md +150 -0
  77. package/plugins/litclaude/skills/lit-pptx/references/tonalities/studio.md +132 -0
  78. package/plugins/litclaude/skills/lit-pptx/scripts/compile-deck.js +64 -16
  79. package/plugins/litclaude/skills/lit-pptx/scripts/craft_extras.py +664 -3
  80. package/plugins/litclaude/skills/lit-pptx/scripts/deck_craft.py +48 -6
  81. package/plugins/litclaude/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
  82. package/plugins/litclaude/skills/lit-pptx/scripts/lib/layout-resolver.js +362 -11
  83. package/plugins/litclaude/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
  84. package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +211 -65
  85. package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-pack.js +3559 -0
  86. package/plugins/litclaude/skills/lit-pptx/scripts/lib/slide-ast.js +10 -6
  87. package/plugins/litclaude/skills/lit-pptx/scripts/lib/template-registry.js +286 -1
  88. package/plugins/litclaude/skills/lit-pptx/scripts/qa_deck.py +39 -10
  89. package/plugins/litclaude/skills/lit-pptx/scripts/validate_pptx.py +22 -7
  90. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
  91. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +4 -1
  92. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -1
  93. package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +4 -1
  94. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +92 -0
  95. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +97 -0
  96. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +93 -0
  97. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +94 -0
  98. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/night/pack.yaml +93 -0
  99. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/paper/pack.yaml +98 -0
  100. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/signal/pack.yaml +94 -0
  101. package/plugins/litclaude/skills/lit-pptx/templates/tonalities/studio/pack.yaml +92 -0
@@ -1,64 +1,102 @@
1
1
  # Authoring Guide (Markdown → PPTX)
2
2
 
3
- How to author a deck in the constrained Markdown dialect that `scripts/compile-deck.js` compiles. Template-agnostic — the enrolled template owns fonts, palette, dimensions, and decorations. The full contract is `specs/markdown-slide-spec-v1.md`; this guide is the working reference.
3
+ How to author a deck in the constrained Markdown dialect that `scripts/compile-deck.js` compiles. The tonality pack (or a named legacy template) owns fonts, palette, dimensions and decoration. The full contract is `specs/markdown-slide-spec-v1.md`; this guide is the working reference.
4
+
5
+ ## 1. Pick a direction
6
+
7
+ A deck compiles under a tonality (a design direction read from a pack) or under a legacy template
8
+ the user named. Choose it with the direction step (`direction-step.md`) before writing slides, and
9
+ put it in the frontmatter so the source carries its own look:
4
10
 
5
- ## 1. Pick a template (and font)
6
11
  ```bash
7
- node "$SKILL_ROOT/scripts/compile-deck.js" --list-templates
8
- node "$SKILL_ROOT/scripts/compile-deck.js" --list-layouts <TEMPLATE> # blocks + regions per layout
12
+ node "$SKILL_ROOT/scripts/compile-deck.js" --list-tonalities # eight tonalities and the legacy templates
13
+ node "$SKILL_ROOT/scripts/compile-deck.js" --list-layouts <tonality> # families, the titles each allows, variants
14
+ node "$SKILL_ROOT/scripts/compile-deck.js" --list-templates # legacy and learned templates
9
15
  ```
10
- Bundled templates:
11
- | Template | Canvas | Font | Use |
12
- |----------|--------|------|-----|
13
- | `AZURE-PRO` (default) | 16:9 (13.333×7.5in) | Pretendard | Blue and white designed decks: geometric cover, tinted numbered cards, KPI badges, navy dividers |
14
- | `AZURE-A2Z` | 16:9 (13.333×7.5in) | 에이투지체 (A2Z) | Same design, A2Z typography |
15
- | `BOILERPLATE-PRETENDARD` | 4:3 (10×7.5in) | Pretendard | Plain professional/technical decks (no `section` layout) |
16
- | `BOILERPLATE-A2Z` | 4:3 (10×7.5in) | 에이투지체 (A2Z) | Same layout, A2Z typography |
17
- | *(learned)* | from source | from source | `scripts/learn_template.py <your.pptx> --name <NAME>` to enroll your own brand |
18
16
 
19
- Font note: **Pretendard** is one weighted family (bold via weight). **에이투지체** and **Brand Sans** ship one family *per weight* (`에이투지체 7 Bold`, `Brand Sans Bold`) — weight is chosen by family name, never a bold flag. The template encodes this; you just write content.
17
+ | Tonality | One line |
18
+ |---|---|
19
+ | `ledger` | numbers first, dense, tabular; business reviews and status updates |
20
+ | `signal` | short, bold slides with one hot accent; pitches and launches |
21
+ | `atlas` | pictures carry the deck, titles on panels or under images |
22
+ | `chalk` | teaching: numbered steps, worked examples, marked terms |
23
+ | `paper` | ink on white, figures and booktabs tables, citations |
24
+ | `gazette` | Korean briefing pages: header band, boxed summary, 개조식 evidence |
25
+ | `studio` | editorial grid, asymmetric splits, side titles, large real numerals |
26
+ | `night` | dark ground for data and technical keynotes |
27
+
28
+ Legacy templates (`AZURE-PRO`, `AZURE-A2Z`, `BOILERPLATE-PRETENDARD`, `BOILERPLATE-A2Z`, or one
29
+ learned from the user's deck) keep their single look and are used only when the user names one.
30
+ Each tonality sheet in `tonalities/` lists its tokens, title treatments, families and two worked
31
+ slides; `examples/` holds complete decks.
32
+
33
+ Font note: every tonality sets the deck in **Pretendard** Regular and Bold by default; hierarchy
34
+ comes from size, weight, colour and placement. The **에이투지체** (A2Z) faces are used only when the
35
+ user or the source asks for them: `faces: a2z` in the frontmatter (or `--faces a2z`) applies the
36
+ pack's `faces-a2z` map. A2Z ships one family *per weight* (`에이투지체 7 Bold`), so weight is chosen
37
+ by family name, never a bold flag. The pack encodes this; you write content.
20
38
 
21
39
  ## 2. Deck skeleton
22
40
  ```markdown
23
41
  ---
24
- template: AZURE-PRO
42
+ tonality: ledger
25
43
  title: Deck Title
26
44
  date: 2026-06-29
45
+ notice: 예시 데이터 — 실제 수치로 바꿔 주세요
27
46
  ---
28
47
 
29
48
  ---
30
- layout: cover
49
+ layout: cover-figures
31
50
 
32
51
  # Deck Title
33
52
  ---
34
53
 
35
54
  ---
36
- layout: content
55
+ layout: chart-insight
56
+
57
+ ## The title names the topic as a label
37
58
 
38
- ## Section title
59
+ ::: chart type=column unit="억 원"
60
+ | 분기 | 매출 | 계획 |
61
+ |---|---|---|
62
+ | 1Q | 1,120 | 1,100 |
63
+ | 2Q | 1,184 | 1,140 |
64
+ > 분기별 매출과 계획, 2026년 (예시 데이터)
65
+ :::
39
66
 
40
- - **Bold section header**
41
- (1) sub-item with a concrete detail
42
- (2) another sub-item
43
- - **Second header**
67
+ - The claim the chart supports, as the first takeaway
68
+ - What it compares with, and over which period
69
+ - What it implies or what happens next
44
70
  ---
45
71
 
46
72
  ---
47
- layout: closing
73
+ layout: closing-ask
74
+
75
+ ## The decision you ask for
48
76
 
49
- # 감사합니다
77
+ | 안건 | 금액 | 결정 시점 |
78
+ |---|---|---|
79
+ | … | … | … |
80
+
81
+ - 다음 단계: who does what, by when
50
82
  ---
51
83
  ```
52
84
  **Separator rule (critical):** a `---` line, then a blank line, then `---` + the next `layout:`. This is how slides are split — see the spec.
53
85
 
54
- ## 3. Layouts (the 5 approved)
55
- - `cover` — title + metadata + date
56
- - `content` — title + body (bullets/numbered/sections), optional table + image + captions
57
- - `main` — content + an optional bordered `main-box` callout
58
- - `summary` — two grouped blocks (top/bottom) + optional image/table
59
- - `closing` — single centered title
86
+ Frontmatter keys for the direction: `tonality:`, and `density:` / `variance:` only when the card
87
+ moves a dial. Slide keys after `layout:`: `title: <treatment>` pins one slide's title treatment
88
+ (`title-treatments.md`); `variant:` belongs to legacy templates.
89
+
90
+ ## 3. Layout families
60
91
 
61
- Each layout supports a fixed set of blocks per template — check `--list-layouts`. Tables use standard Markdown pipes; images use `![alt](path)`; captions follow the spec.
92
+ Under a tonality, `layout:` names a family (the slide's job) or a cover, section or closing variant.
93
+ `layout-families.md` lists all of them with the source each one reads; `--list-layouts <tonality>`
94
+ shows which the chosen pack carries. Write the source so the slide fills (`density-and-fill.md`):
95
+ a takeaway under every table, evidence under a big number, the next step under an ask.
96
+
97
+ Under a legacy template the five original layouts remain: `cover`, `content`, `main` (content plus a
98
+ `::: main-box` callout), `summary` (two grouped blocks) and `closing`; `section` exists on the Azure
99
+ templates. Check `--list-layouts <TEMPLATE>` for the blocks each accepts.
62
100
 
63
101
  ### Executive/research compositions
64
102
 
@@ -82,14 +120,14 @@ Do not write authoring trace or unresolved placeholders. Treat overclaim, jargon
82
120
 
83
121
  ## 4. Compile
84
122
  ```bash
85
- node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template <TEMPLATE> --html out.html # preview
86
- node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template <TEMPLATE> --pptx out.pptx --embed-fonts
123
+ node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --pptx out.pptx --embed-fonts # tonality: from the frontmatter
124
+ node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template <TEMPLATE> --pptx out.pptx --embed-fonts # a named legacy template
87
125
  ```
88
126
  `--embed-fonts` makes the deck self-contained (renders on machines without the font). `--ast out.json` dumps the intermediate AST.
89
127
 
90
128
  ## 5. Verify (always)
91
129
  ```bash
92
- python3 "$SKILL_ROOT/scripts/qa_deck.py" out.pptx # overflow/overlap + WCAG contrast + anti-slop; non-zero = FAIL
130
+ python3 "$SKILL_ROOT/scripts/qa_deck.py" out.pptx # overflow, contrast, anti-slop, craft floor and the deck output checks; non-zero = FAIL
93
131
  python3 "$LITCLAUDE_LIB/render_pages.py" out.pptx --out-dir renders --pages 5 # then open renders/page-*.png
94
132
  ```
95
133
  A clean gate is defect-absence, not quality — read the rendered pages. See `references/anti-slop-checklist.md`.
@@ -97,8 +135,11 @@ A clean gate is defect-absence, not quality — read the rendered pages. See `re
97
135
  ## 6. Anti-patterns (fix before shipping)
98
136
  - Generic titles ("개요"/"Overview") → make them specific.
99
137
  - Padding bullets that restate the heading → cut or add real information.
100
- - Manually adding logos/lines/colors/fonts → the template applies decorations; don't.
138
+ - Manually adding logos/lines/colors/fonts → the pack or template applies decoration; don't.
139
+ - Positioning a title with a free box → every treatment has one frame; pin a different treatment with `title:` instead.
140
+ - A table, a big number or an ask with nothing under it → add the takeaway, the evidence or the next step (`density-and-fill.md`).
101
141
  - Overloaded slides (> ~8 bullets, > ~8 table rows, > 4 items per summary group) → split.
142
+ - A data slide without its basis, comparison, period or source → add them; end with `출처:` (`Source:`).
102
143
  - Placeholder/AI-slop wording → gated by `scripts/forbidden-terms.json`.
103
144
  - Evidence image with only a filename-like alt → write a numbered caption plus `Source:`/`출처:` so the visible caption stays bound to the figure.
104
145
  - Appendix DOI/canonical/raw URL field without a hyperlink → add an actual PowerPoint hyperlink. QA detects the field directly and verifies its external OOXML relationship; no special “link available” phrase is required.
@@ -110,6 +151,15 @@ node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template MY-BRAND --pptx ou
110
151
  ```
111
152
  The learned template only references fonts/colors/assets present in your source (off-brand-by-construction).
112
153
 
154
+ ## Run-in labels
155
+
156
+ A point may open with a bold label: `- **요약:** 앱에서 맡기면 …`, `- **Basis:** 1.0 L/min feed`. Write
157
+ the colon; the engine adds one when the label ends without a separator (`**요약** 앱에서 …` is set as
158
+ "**요약:** 앱에서 …"), because a bold word running into its sentence reads as part of it. A bold line
159
+ with nothing after it is a group heading and takes no colon. The gate fails a run-in label without a
160
+ separator (OF-118). An agenda numbers its own rows, so its title stands without a numeral beside it
161
+ (OF-119).
162
+
113
163
  ## Placement (spec v2)
114
164
 
115
165
  Reach for the least freedom that says the thing. Each tier gives up a guardrail, and
@@ -153,21 +203,48 @@ pie and doughnut use the first series. The chart takes the table's place on any
153
203
  layout that accepts a table and fills the slide down to its caption, which the
154
204
  engine numbers "도 N.".
155
205
 
156
- Headline numbers become KPI cards on the Azure templates when the table is small:
157
- one data row with two to four short values, or two columns of value/label with up to
158
- four rows.
206
+ One series carries the accent, and it is the same kind of series on every chart of the deck: the
207
+ latest period when every series names one ("2026" over "2025", "Q3" over "Q2"), else the measured
208
+ series beside a plan, target, budget or prior period ("실적" over "계획"), else the last column. Put
209
+ the proposed or current series last when the names say neither. Data labels keep the decimals the
210
+ table writes, so a chart beside a table that says 18.0 says 18.0 too.
211
+
212
+ A figure exported as a picture (a plot or a diagram drawn on white) stands as a white card on a dark
213
+ tonality. Give it a dark variant beside it, named like the file with `.dark` before the extension
214
+ (`assets/flow.png` and `assets/flow.dark.png`): a dark tonality draws the variant, a light one the
215
+ original. Better still, give a plot its numbers as a `::: chart` block, which every tonality draws in
216
+ its own colours. The gate fails a mostly-white picture on a dark ground (OF-117).
217
+
218
+ Headline numbers become KPI cards on the Azure templates (two to four short values), and the
219
+ `kpi-row` family under a tonality: one data row of up to six short values, a second row with each
220
+ figure's basis or comparison, a caption with period and source, the takeaways, and the source line.
221
+ Under a side title, or when the cards would stop high on the page, the values run down the body as
222
+ rows (value, label, basis) with the takeaways beside them.
159
223
 
160
224
  ```markdown
161
- | 매출 | 영업이익 | 영업이익률 |
162
- |---|---|---|
163
- | 1,184억 원 | 110억 원 | 9.3% |
225
+ | 매출 | 영업이익 | 영업이익률 | 영업현금흐름 | 수주 잔고 |
226
+ |---|---|---|---|---|
227
+ | 1,184억 원 | 110억 원 | 9.3% | 96억 원 | 2,310억 원 |
228
+ | 계획 대비 +3.9% | 계획 대비 +10.0% | 계획 대비 +0.5%p | 전년 동기 81억 원 | 전분기 대비 +4% |
229
+
230
+ > 2026년 3분기(7-9월), 내부 결산 자료 (예시)
231
+
232
+ - 매출과 영업이익이 모두 계획을 넘었다
233
+ - 영업현금흐름은 영업이익의 87% 수준이다
234
+ - 수주 잔고는 매출 약 2분기분이다
235
+ - 출처: 예시 기업 내부 결산 자료(2026년 3분기), 2026년 연간 사업 계획
164
236
  ```
165
237
 
166
- `notice:` in the frontmatter prints one line at the bottom right of every slide —
238
+ A slide is dense when every block on it says something the reader needs: the figure, what it is
239
+ compared with, the period, where it comes from, and what follows. Write that, and the compact step
240
+ (density 10, every pack's default) sets it at 13 pt in 24 pt margins with the source strip at the
241
+ foot. Never repeat a line to fill a slide; merge thin slides instead.
242
+
243
+ `notice:` in the frontmatter prints one tag at the bottom left of every slide —
167
244
  use it whenever values are examples: `notice: 예시 데이터 — 실제 수치로 바꿔 주세요`.
168
245
 
169
246
  Measured scientific data (instrument output, fitted curves, uncertainty) is still
170
247
  drawn by `/litclaude:lit-scientific-visualization`: hand it the deck's visual system
171
- with `compile-deck.js --template <T> --export-viz-context ctx.json` and place the
248
+ with `compile-deck.js deck.md --export-viz-context ctx.json` (the tonality comes from the frontmatter) and place the
172
249
  result as a captioned figure. Register the font *file* from `ctx.json` rather than the
173
250
  family name — a Korean family resolved by name alone renders as boxes.
@@ -119,7 +119,7 @@ Write to `.pptx-pipeline/plan-{slug}.md`:
119
119
  - Render path: compile-deck.js
120
120
 
121
121
  ## QA Plan
122
- - Compile: `node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template <TEMPLATE> --pptx output.pptx --embed-fonts` (default `<TEMPLATE>` = AZURE-PRO)
122
+ - Compile: `node "$SKILL_ROOT/scripts/compile-deck.js" deck.md --template <TEMPLATE> --pptx output.pptx --embed-fonts` (or without `--template` when the frontmatter names the tonality; there is no default look)
123
123
  - Verify: `python3 "$SKILL_ROOT/scripts/layout_inventory.py" output.pptx --issues-only`
124
124
  - No scripts/forbidden-terms.json check: `python validate_pptx.py output.pptx`
125
125
  ```
@@ -1,6 +1,6 @@
1
1
  # Data Display Cookbook
2
2
 
3
- Standardizes numbers, tables, and KPI tiles. Colors below refer to the chosen template's palette roles, not fixed brand hex.
3
+ Standardizes numbers, tables, and KPI tiles. Colors below refer to the palette roles of the chosen tonality (or the named legacy template), not fixed brand hex. The pack also fixes the table style (booktabs, ledger, light grid, header fill or open), its rules and banding, and the chart style (gridlines, direct labels or legend, how the highlight is drawn); write the data and let the pack draw it. Each tonality sheet in `tonalities/` names its table and chart style.
4
4
 
5
5
  ## Number display
6
6
  | Data type | Preferred | Avoid |
@@ -14,13 +14,13 @@ Standardizes numbers, tables, and KPI tiles. Colors below refer to the chosen te
14
14
  ## Table patterns
15
15
 
16
16
  ### 1. Compact operational table (4–6 columns of operational data)
17
- - Body and bold header in the template's table sizes; tight row padding; light bottom rules only. Use right-aligned numbers in quantitative columns.
17
+ - Units in the header, numbers right-aligned, a total row last when the data has one (the engine sets it apart by the pack's rules). Follow it with two or three takeaway lines (`table-insight` beside, `ledger-table` under).
18
18
 
19
19
  ### 2. Comparison matrix (alternatives / vendors / scenarios)
20
- - Alternating row bands; strong header row; one emphasis column only; right-align all quantitative columns.
20
+ - One row per option, one emphasis only: the pack tints the row whose first cell the slide title names. Right-align all quantitative columns. Two options with three to four points each read better as a `comparison`; two axes with four options read better as a `matrix-2x2`.
21
21
 
22
- ### 3. KPI strip (3–4 headline numbers before a narrative/chart)
23
- - Value on top, label below; primary value in the template's metric color; positive/negative only for deltas (with ▲/▼ glyph); center within each tile.
22
+ ### 3. KPI strip (2–4 headline numbers before a narrative/chart)
23
+ - A one-row table of short values with the labels in the header; the first value takes the accent. Positive/negative colours only for deltas, always with a ▲/▼ glyph and a sign. Add one to three evidence bullets; under a side title the values become rows down the body.
24
24
 
25
25
  ## Source-note pattern
26
26
  Place source text under the table/chart, smaller than body text:
@@ -31,7 +31,7 @@ Place source text under the table/chart, smaller than body text:
31
31
  ## Rules of thumb
32
32
  - Units in headers, never per cell. Numeric columns right-aligned (the real fix on export).
33
33
  - ≤ 6 columns; split a wide table rather than shrinking text below the template's minimum body size.
34
- - One emphasis per table; no styled spans inside cells; no rainbow semantics.
34
+ - One emphasis per table; no styled spans inside cells; no rainbow semantics. One series is one hue; several series take the pack's series colours in order.
35
35
  - Keep one primary visual emphasis. Do not highlight a row, a column, and several cells at the same time.
36
36
  - Avoid chart-type mixing unless a clear analytical reason requires it; state that reason in the interpretation.
37
37
  - Keep labels readable at presentation scale and move or abbreviate collision-prone labels. Axis labels, data labels, annotations, and legends must not overlap.
@@ -43,3 +43,10 @@ Place source text under the table/chart, smaller than body text:
43
43
  - **table plus decision takeaway:** one bounded table, caption/source, and one decision sentence. Do not duplicate the table in prose.
44
44
  - **source capture:** crop to the relevant region while retaining enough interface/document context to verify the locator.
45
45
  - **two-record appendix evidence:** at most two records per slide. Each record includes summary, source/locator, and DOI/canonical link when available.
46
+
47
+ ## Filling the slide with the data, not around it
48
+
49
+ - A table of three rows or fewer at the top of a slide leaves the page empty; make it a `kpi-row`, a `comparison`, or give it its takeaway.
50
+ - A chart takes the body to the floor (`anchor-visual`), with its caption bound under it; two or three takeaways sit beside it (`chart-insight`) or the title explains it from below (`bottom-anchor`).
51
+ - One real figure that carries the slide is a `big-number` with two or three lines of evidence; a decorative number is a defect.
52
+ - See `density-and-fill.md` for the fill policies and the gate checks that measure the empty band.
@@ -0,0 +1,164 @@
1
+ # Density and fill
2
+
3
+ Two dials set how a deck uses its pages. Density decides how much each page holds and how tightly;
4
+ variance decides how many title treatments and layout families one deck mixes. Each tonality has
5
+ defaults, and the direction card records the values used. The skill may move a dial by up to 2 on
6
+ its own and says so on the card; a larger move waits for the user.
7
+
8
+ Fill is what density is for. The old engine left the lower half of most slides empty: a short table
9
+ at the top, cards as tall as their two lines, a closing that said only "thank you". The engine now
10
+ measures how much of each slide's body stays empty under its last block and tries to close the gap,
11
+ and the gate fails a deck whose typical slide still leaves more than a fifth of its body unused. The
12
+ engine can only grow what the source gives it, though, so most of the work is in how the source is
13
+ written.
14
+
15
+ ## Density
16
+
17
+ | Density | Grid (16:9 side margin) | Ramp | Body size | Item / group / block gap | Padding | Table row (min) | Empty band a slide may leave |
18
+ |---|---|---|---|---|---|---|---|
19
+ | 1-2 | airy (60 pt) | presented | 24 for four items or fewer, else 18 | 18 / 36 / 48 | 24 | 36 | 28 % |
20
+ | 3-4 | standard (48 pt) | presented | 18, may step to 24 | 12 / 24 / 36 | 24 | 32 | 24 % |
21
+ | 5-6 | standard (48 pt) | reading | 14, may step to 18 | 6 / 18 / 24 | 18 | 24 | 18 % |
22
+ | 7-8 | dense (36 pt) | reading | 14, may step to 18 | 6 / 12 / 24 | 12 | 22 | 14 % |
23
+ | 9 | dense (36 pt) | reading | 14 | 6 / 12 / 24 | 12 | 20 | 12 % |
24
+ | 10 | compact (24 pt) | compact: body 13, label 11, source 9 | 13 | 6 / 12 / 18 | 12 | 18 | 12 % |
25
+
26
+ The grid's side margins, the gaps, the padding and the body size move with density. From density 5
27
+ a deck reads on the reading ramp (body 14 pt, title 26 pt); density 10 is the compact step, and every
28
+ pack now starts there. On it a top title sits close over its rule (the body starts about 30 pt
29
+ higher), nothing is stepped up to fill, and the readable floor holds: body text 12 pt or more, table
30
+ cells and captions 11 pt, sources 9 pt. Lower the density (by at most 2 without asking, to 8: body
31
+ 14 pt, 36 pt margins) only for a deck presented to a large room.
32
+
33
+ ## Variance
34
+
35
+ | Variance | Title treatments per deck | Same family in a row |
36
+ |---|---|---|
37
+ | 1-3 (only when the user asks for a uniform deck) | 1-2; the gate records "variety lowered by the user" | — |
38
+ | 4 | 3 | at most 3 |
39
+ | 5-6 | 3-4 | at most 3 |
40
+ | 7-8 | 4-5 | at most 2 |
41
+ | 9-10 | 5 | at most 2, and at most 2 of one family in the deck |
42
+
43
+ The upper end is also capped by how many treatments the pack has.
44
+
45
+ ## What the engine does to fill a slide
46
+
47
+ When a content slide's empty band exceeds the cap for its density, the engine tries the pack's
48
+ `fill-order`, one policy at a time, and keeps a step only when it does not overflow:
49
+
50
+ - **step-up** sets the body one ramp step larger (presented 18 → 24, reading 14 → 18), table data
51
+ from label to body size, and KPI values a step up. One step only; titles never shrink to make room.
52
+ - **distribute** opens the item, group and block gaps one step each, keeping the body's top edge
53
+ fixed. Rows of peers keep equal heights; a body is never centred vertically.
54
+ - **anchor-visual** lets a chart, figure or image take the rest of the body, and grows table rows up
55
+ to a quarter above the density minimum.
56
+ - **change-family** is the author's step: the engine cannot invent a better shape, so the compile
57
+ log says "choose a fuller family" and the source changes.
58
+
59
+ Every filled slide gets a line in the compile output, which goes into the build log:
60
+
61
+ ```text
62
+ fill: slide 5 band 0.41 -> 0.12 (step-up, distribute)
63
+ fill: slide 9 band 0.39 -> 0.39 (none: nothing on the slide can grow; choose a fuller family)
64
+ ```
65
+
66
+ A column can stand empty beside a full one even when the body's last block reaches the floor: two
67
+ short takeaways beside a chart, a source line at the column's foot and nothing between. The engine
68
+ reads each text or picture column against the column beside it (its largest empty band, from the
69
+ top of the pair down to where the longer column ends) and fills a column that leaves more than 40 %
70
+ of the body empty, in this order, by layout only:
71
+
72
+ - the visual takes columns: a narrower takeaway column wraps onto more lines and a wider chart or
73
+ picture grows (down to three columns of takeaways; a picture keeps taking columns while either
74
+ side leaves a fifth of the body empty);
75
+ - the takeaways step up to lead size when they fit and keep twelve glyphs a line;
76
+ - the room left is shared between the points, at most a sixth of the body a gap;
77
+ - two short points beside a chart that still leave the column empty run under the chart, side by
78
+ side, and the chart with its values takes the body's width;
79
+ - a short sidebar note beside a long main column stands across the top at lead size and the main
80
+ points run in two columns under it;
81
+ - a title under which a column still stays empty is unfit for the slide when another title fits.
82
+
83
+ The source strip closing a column counts as a block but never hides the band above it, and the
84
+ chart's values table under the takeaways is part of their column. The gate measures the same way
85
+ (OF-115).
86
+
87
+ The engine chooses the title treatment for a slide by fill as well: among the treatments the role
88
+ and the family allow, a slide whose body stays short under the role default may move to a side rail
89
+ or a bottom title, where a chart or table takes the full height. It never adds decoration to cover
90
+ space and never pads cards.
91
+
92
+ ## Writing source that fills
93
+
94
+ These are the rules the examples follow. Each one gives the engine something real to place in the
95
+ lower part of the body.
96
+
97
+ - **Every content slide carries its supporting facts.** Beside the main point, give what a careful
98
+ reader asks for: the basis (where the figure comes from), a comparison (previous period, plan,
99
+ peer), the period, the source, and the implication or next step. Tables run five to eight rows and
100
+ four to six columns where the source has them, charts five to eight categories, comparisons three
101
+ or four labelled criteria a side. Example values are labelled as examples.
102
+ - **Close every data slide with its source.** A last line `출처: …` (`Source: …`) names where the
103
+ figures come from and when; a `주: …` (`Note: …`) line may follow with a definition or a caveat.
104
+ The engine sets them as a strip at the foot of the body, at source size, so they cost the takeaways
105
+ no room.
106
+ - **Figures come in rows of four to six.** A `kpi-row` table holds up to six figures, its second row
107
+ each figure's basis or comparison ("계획 대비 +3.9%", "전년 동기 81억 원"). On the compact step a short
108
+ card row runs as figure rows with the takeaways beside them.
109
+ - **Label comparison points by criterion.** Start each point with the same label on both sides
110
+ ("비용: …", "일정: …"); the engine draws the labels as a criteria column and the two sides as rows.
111
+ - **Pair a chart with its numbers.** On the compact step the values of a chart (up to eight rows and
112
+ four columns) stand as a small table under its takeaways when they fit; write the chart's table
113
+ with the exact figures, units in the headers.
114
+ - **The title names the topic; the claim opens the body.** "분기별 매출 추이", not "매출은 다섯 분기 연속
115
+ 늘었다"; the sentence becomes the first takeaway. A claim with its reasons is a `summary-box-list`
116
+ (the claim boxed over the reasons), a `kpi-row`, or a table with the claim as its first takeaway;
117
+ a stand-alone `statement` slide is for a pull quote or a deck the user asks to be display-led.
118
+ - **Numbers are never the whole slide.** A `big-number` is a data panel of two to four related
119
+ figures: a KPI table with labels, values and a second row giving each figure's basis or comparison
120
+ ("전년 대비 +12%", "목표 50%"), a caption with period and source, then two or three lines of
121
+ evidence. Figures are set at title size at most.
122
+ - **Every table gets a takeaway.** Two or three bullets after the table: the row that matters, the
123
+ comparison, the decision it supports. `table-insight` sets them beside the table, `ledger-table`
124
+ under it. A short table (three rows or fewer) is usually a `kpi-row` or a `comparison` instead.
125
+ - **Every chart gets a caption and two or three takeaways.** The caption says what is plotted and
126
+ marks example data; the bullets say what to notice.
127
+ - **A closing carries the ask and the next step.** The title names the request ("운영 자금 30억 원 요청
128
+ 내역"); the body
129
+ lists what is to be approved (a small table of item, amount, date, owner works well) and the next
130
+ step with its owner and date. "감사합니다" or "Questions?" alone is never a closing.
131
+ - **A comparison has the same number of points on both sides,** each a full clause, so the rows
132
+ read across and reach the floor together.
133
+ - **A process or timeline names what happens at each step,** not only the step's name; a timeline
134
+ fed by a table takes its takeaway bullets under the axis. Give a timeline two or three takeaways:
135
+ one alone can leave the band under the axis empty, which OF-109 fails.
136
+ - **References and appendices list every source with its date,** one per row; when there are only
137
+ two or three, add the definitions the deck relies on.
138
+ - **Merge before you pad.** When a slide still has little to say, merge it with its neighbour or
139
+ give it a family that suits short content. Never add filler bullets that restate the title.
140
+
141
+ ## How the gate measures it
142
+
143
+ `qa_deck.py` measures the empty band from the compiled file: the share of the body (from the title's
144
+ bottom, or the top margin when the title sits low, down to 486 pt) below the lowest content block.
145
+ Decoration, the footer and the example notice are not content. Cover, section, statement, quote
146
+ and statement-closing slides are exempt.
147
+
148
+ - **OF-112** reports each slide over its density cap as an advisory with a fix hint, and fails the
149
+ deck when the median band over all measured slides is above 0.20. On a legacy template the median
150
+ is an advisory too, because the legacy renderer has no fill policies.
151
+ - **OF-109** (older and stricter per slide) still fails any single slide or card that leaves more
152
+ than 35 % of its area as one empty band.
153
+ - **OF-115** fails a slide with an empty region: among them a text or picture column whose largest
154
+ empty band beside a longer column passes 40 % of the body (a source strip at its foot and the
155
+ chart's values table under the takeaways included). Beside the figure rows of a kpi-row or
156
+ big-number slide the takeaway column is measured to the body floor, since the rows stop where
157
+ their spacing ends; the engine sets the takeaways across under the rows, or lets them share the
158
+ room beside the rows when the across form would leave a band between the two.
159
+ - **OF-111** fails a deck whose content slides share one composition (title zone × body partition ×
160
+ dominant content) on more than 40 % of them, or show too few distinct compositions.
161
+
162
+ A slide that cannot be filled honestly (a one-line agenda, a short appendix) may stay over its cap;
163
+ the deck median still has to hold. Shrinking text, inflating cards or adding decorative shapes to
164
+ pass the gate is a defect, and the critique counts it as one.
@@ -1,7 +1,10 @@
1
- # Azure Professional — SOTA Blue & White Design System (2026)
1
+ # Azure Professional — the legacy blue and white template
2
2
 
3
- A pro-designer blue-and-white system for `BOILERPLATE-AZURE` (flagship). 16:9 widescreen.
4
- Goal aesthetic: modern, geometric, confident — like a paid premium template, not a stock deck.
3
+ The design system behind the legacy `AZURE-PRO` and `AZURE-A2Z` templates, 16:9 widescreen. It is
4
+ one fixed look: geometric covers, tinted numbered cards, KPI badges, navy dividers. It is used only
5
+ when the user names one of these templates or an existing deck source already does; a new deck takes
6
+ a tonality from the direction step (`direction-step.md`). Under a legacy template the gate reports
7
+ the variety checks and the median empty band as advisories, because the user asked for this look.
5
8
 
6
9
  ## Color tokens (locked)
7
10
 
@@ -55,4 +58,4 @@ Contrast (verified intent): ink/white very high; ink-muted/white ≈5.6:1; prima
55
58
  - 4pt spacing scale. Generous margins (16:9): outer ≈0.6in.
56
59
 
57
60
  ## Canvas
58
- - 16:9 widescreen: **13.333 × 7.5 in** (1280×720px @96). (Modern default; upgrade from 4:3.)
61
+ - 16:9 widescreen: **13.333 × 7.5 in** (1280×720px @96).