@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.
- package/CHANGELOG.md +12 -0
- package/README.md +14 -8
- package/README_ko-KR.md +13 -8
- package/docs/assets/readme/badge-version.svg +1 -1
- package/docs/hooks.md +3 -2
- package/package.json +1 -1
- package/plugins/litclaude/.claude-plugin/plugin.json +1 -1
- package/plugins/litclaude/bin/litclaude-hook.js +4 -4
- package/plugins/litclaude/bin/litclaude-mcp.js +1 -1
- package/plugins/litclaude/lib/canonical-skill-resources.mjs +91 -31
- package/plugins/litclaude/skills/frontend-ui-ux/ATTRIBUTION.md +3 -6
- package/plugins/litclaude/skills/lit-docx/SKILL.md +50 -19
- package/plugins/litclaude/skills/lit-docx/references/components.md +207 -0
- package/plugins/litclaude/skills/lit-docx/references/direction-step.md +277 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/01-report-ko.md +166 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/02-brief-ko.md +105 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/03-manual-ko.md +164 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/04-proposal-ko.md +138 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/05-memo-en.md +55 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/06-journal-en.md +130 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/07-report-en.md +123 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/08-proposal-en.md +123 -0
- package/plugins/litclaude/skills/lit-docx/references/examples/09-memo-ko.md +45 -0
- package/plugins/litclaude/skills/lit-docx/references/page-composition.md +221 -0
- package/plugins/litclaude/skills/lit-docx/references/tonalities/brief.md +143 -0
- package/plugins/litclaude/skills/lit-docx/references/tonalities/journal.md +142 -0
- package/plugins/litclaude/skills/lit-docx/references/tonalities/manual.md +148 -0
- package/plugins/litclaude/skills/lit-docx/references/tonalities/memo.md +137 -0
- package/plugins/litclaude/skills/lit-docx/references/tonalities/proposal.md +140 -0
- package/plugins/litclaude/skills/lit-docx/references/tonalities/report.md +156 -0
- package/plugins/litclaude/skills/lit-docx/scripts/convert_md_to_docx.py +274 -73
- package/plugins/litclaude/skills/lit-docx/scripts/docx_design.py +2449 -0
- package/plugins/litclaude/skills/lit-docx/scripts/docx_layout.py +959 -0
- package/plugins/litclaude/skills/lit-docx/scripts/qa_docx.py +66 -9
- package/plugins/litclaude/skills/lit-docx/scripts/slop_lint.py +18 -6
- package/plugins/litclaude/skills/lit-docx/templates/tonalities/brief.yaml +28 -0
- package/plugins/litclaude/skills/lit-docx/templates/tonalities/journal.yaml +25 -0
- package/plugins/litclaude/skills/lit-docx/templates/tonalities/manual.yaml +26 -0
- package/plugins/litclaude/skills/lit-docx/templates/tonalities/memo.yaml +26 -0
- package/plugins/litclaude/skills/lit-docx/templates/tonalities/proposal.yaml +26 -0
- package/plugins/litclaude/skills/lit-docx/templates/tonalities/report.yaml +26 -0
- package/plugins/litclaude/skills/lit-pptx/SKILL.md +105 -48
- package/plugins/litclaude/skills/lit-pptx/references/agents/analyst.md +1 -1
- package/plugins/litclaude/skills/lit-pptx/references/agents/thesis.md +1 -1
- package/plugins/litclaude/skills/lit-pptx/references/anti-slop-checklist.md +59 -30
- package/plugins/litclaude/skills/lit-pptx/references/authoring-guide.md +119 -42
- package/plugins/litclaude/skills/lit-pptx/references/consensus-protocol.md +1 -1
- package/plugins/litclaude/skills/lit-pptx/references/data-display-cookbook.md +13 -6
- package/plugins/litclaude/skills/lit-pptx/references/density-and-fill.md +164 -0
- package/plugins/litclaude/skills/lit-pptx/references/design-system-azure.md +7 -4
- package/plugins/litclaude/skills/lit-pptx/references/direction-step.md +186 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/01-pitch-signal-ko.md +210 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/02-pitch-studio-ko.md +147 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/03-business-review-ledger-ko.md +199 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/04-business-review-night-en.md +203 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/05-research-talk-paper-en.md +179 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/06-lecture-chalk-ko.md +199 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/07-data-review-night-en.md +194 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/08-image-led-atlas-ko.md +175 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/09-briefing-gazette-ko.md +204 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/10-status-update-ledger-ko.md +179 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/11-portfolio-studio-en.md +164 -0
- package/plugins/litclaude/skills/lit-pptx/references/examples/12-research-tutorial-chalk-en.md +174 -0
- package/plugins/litclaude/skills/lit-pptx/references/interview-protocol.md +1 -1
- package/plugins/litclaude/skills/lit-pptx/references/layout-families.md +198 -0
- package/plugins/litclaude/skills/lit-pptx/references/stages/autopilot.md +1 -1
- package/plugins/litclaude/skills/lit-pptx/references/stages/interview.md +2 -2
- package/plugins/litclaude/skills/lit-pptx/references/stages/plan.md +1 -1
- package/plugins/litclaude/skills/lit-pptx/references/title-treatments.md +109 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/atlas.md +139 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/chalk.md +148 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/gazette.md +149 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/ledger.md +149 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/night.md +147 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/paper.md +151 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/signal.md +150 -0
- package/plugins/litclaude/skills/lit-pptx/references/tonalities/studio.md +132 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/compile-deck.js +64 -16
- package/plugins/litclaude/skills/lit-pptx/scripts/craft_extras.py +664 -3
- package/plugins/litclaude/skills/lit-pptx/scripts/deck_craft.py +48 -6
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/layout-resolver.js +362 -11
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +211 -65
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/render-pack.js +3559 -0
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/slide-ast.js +10 -6
- package/plugins/litclaude/skills/lit-pptx/scripts/lib/template-registry.js +286 -1
- package/plugins/litclaude/skills/lit-pptx/scripts/qa_deck.py +39 -10
- package/plugins/litclaude/skills/lit-pptx/scripts/validate_pptx.py +22 -7
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +4 -1
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -1
- package/plugins/litclaude/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +4 -1
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +92 -0
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +97 -0
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +93 -0
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +94 -0
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/night/pack.yaml +93 -0
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/paper/pack.yaml +98 -0
- package/plugins/litclaude/skills/lit-pptx/templates/tonalities/signal/pack.yaml +94 -0
- 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.
|
|
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 <
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
55
|
+
layout: chart-insight
|
|
56
|
+
|
|
57
|
+
## The title names the topic as a label
|
|
37
58
|
|
|
38
|
-
|
|
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
|
-
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
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 --
|
|
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
|
|
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
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
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
|
|
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` (
|
|
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
|
|
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
|
-
-
|
|
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
|
-
-
|
|
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 (
|
|
23
|
-
-
|
|
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 —
|
|
1
|
+
# Azure Professional — the legacy blue and white template
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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).
|
|
61
|
+
- 16:9 widescreen: **13.333 × 7.5 in** (1280×720px @96).
|