@litfamily/litgrok 1.0.13 → 1.0.15

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 (114) hide show
  1. package/.grok/hooks/auto-handoff-gate.mjs +15 -2
  2. package/.grok/rules/00-litgrok.md +1 -1
  3. package/.grok/skills/frontend-ui-ux/THIRD-PARTY-NOTICE.txt +0 -5
  4. package/.grok/skills/frontend-ui-ux/references/slop-register.md +4 -4
  5. package/.grok/skills/frontend-ui-ux/scripts/import-design-intelligence.mjs +1 -1
  6. package/.grok/skills/lit-docx/SKILL.md +59 -11
  7. package/.grok/skills/lit-docx/examples/01-report-ko.md +137 -0
  8. package/.grok/skills/lit-docx/examples/02-brief-ko.md +82 -0
  9. package/.grok/skills/lit-docx/examples/03-manual-ko.md +118 -0
  10. package/.grok/skills/lit-docx/examples/04-proposal-ko.md +92 -0
  11. package/.grok/skills/lit-docx/examples/05-memo-en.md +42 -0
  12. package/.grok/skills/lit-docx/examples/06-journal-en.md +90 -0
  13. package/.grok/skills/lit-docx/examples/07-report-en.md +103 -0
  14. package/.grok/skills/lit-docx/examples/08-proposal-en.md +90 -0
  15. package/.grok/skills/lit-docx/examples/09-memo-ko.md +41 -0
  16. package/.grok/skills/lit-docx/references/components.md +151 -0
  17. package/.grok/skills/lit-docx/references/direction-step.md +129 -0
  18. package/.grok/skills/lit-docx/references/page-composition.md +129 -0
  19. package/.grok/skills/lit-docx/references/tonalities/brief.md +98 -0
  20. package/.grok/skills/lit-docx/references/tonalities/journal.md +100 -0
  21. package/.grok/skills/lit-docx/references/tonalities/manual.md +107 -0
  22. package/.grok/skills/lit-docx/references/tonalities/memo.md +95 -0
  23. package/.grok/skills/lit-docx/references/tonalities/proposal.md +105 -0
  24. package/.grok/skills/lit-docx/references/tonalities/report.md +114 -0
  25. package/.grok/skills/lit-docx/scripts/convert_md_to_docx.py +394 -51
  26. package/.grok/skills/lit-docx/scripts/docx_design.py +2446 -0
  27. package/.grok/skills/lit-docx/scripts/docx_gate.py +203 -0
  28. package/.grok/skills/lit-docx/scripts/docx_layout.py +959 -0
  29. package/.grok/skills/lit-docx/scripts/run.mjs +3 -2
  30. package/.grok/skills/lit-docx/scripts/slop_lint.py +63 -17
  31. package/.grok/skills/lit-docx/templates/tonalities/brief.yaml +29 -0
  32. package/.grok/skills/lit-docx/templates/tonalities/journal.yaml +26 -0
  33. package/.grok/skills/lit-docx/templates/tonalities/manual.yaml +27 -0
  34. package/.grok/skills/lit-docx/templates/tonalities/memo.yaml +27 -0
  35. package/.grok/skills/lit-docx/templates/tonalities/proposal.yaml +27 -0
  36. package/.grok/skills/lit-docx/templates/tonalities/report.yaml +27 -0
  37. package/.grok/skills/lit-pptx/NOTICE.md +1 -1
  38. package/.grok/skills/lit-pptx/SKILL.md +70 -14
  39. package/.grok/skills/lit-pptx/agents/analyst.md +1 -1
  40. package/.grok/skills/lit-pptx/agents/thesis.md +2 -2
  41. package/.grok/skills/lit-pptx/examples/01-pitch-signal-ko.md +175 -0
  42. package/.grok/skills/lit-pptx/examples/02-business-review-ledger-ko.md +199 -0
  43. package/.grok/skills/lit-pptx/examples/03-research-talk-paper-en.md +177 -0
  44. package/.grok/skills/lit-pptx/examples/04-lecture-chalk-ko.md +176 -0
  45. package/.grok/skills/lit-pptx/examples/05-data-review-night-en.md +221 -0
  46. package/.grok/skills/lit-pptx/examples/06-image-led-atlas-en.md +143 -0
  47. package/.grok/skills/lit-pptx/examples/07-briefing-gazette-ko.md +192 -0
  48. package/.grok/skills/lit-pptx/examples/08-status-update-ledger-en.md +168 -0
  49. package/.grok/skills/lit-pptx/examples/09-pitch-studio-en.md +157 -0
  50. package/.grok/skills/lit-pptx/examples/10-image-led-studio-ko.md +175 -0
  51. package/.grok/skills/lit-pptx/examples/11-business-review-night-en.md +181 -0
  52. package/.grok/skills/lit-pptx/examples/12-status-update-gazette-ko.md +199 -0
  53. package/.grok/skills/lit-pptx/pretendard-font/public/static/Pretendard-Bold.otf +0 -0
  54. package/.grok/skills/lit-pptx/pretendard-font/public/static/Pretendard-Regular.otf +0 -0
  55. package/.grok/skills/lit-pptx/references/density-and-fill.md +155 -0
  56. package/.grok/skills/lit-pptx/references/direction-step.md +211 -0
  57. package/.grok/skills/lit-pptx/references/layout-families.md +193 -0
  58. package/.grok/skills/lit-pptx/references/title-treatments.md +134 -0
  59. package/.grok/skills/lit-pptx/references/tonalities/atlas.md +124 -0
  60. package/.grok/skills/lit-pptx/references/tonalities/chalk.md +135 -0
  61. package/.grok/skills/lit-pptx/references/tonalities/gazette.md +127 -0
  62. package/.grok/skills/lit-pptx/references/tonalities/ledger.md +134 -0
  63. package/.grok/skills/lit-pptx/references/tonalities/night.md +132 -0
  64. package/.grok/skills/lit-pptx/references/tonalities/paper.md +127 -0
  65. package/.grok/skills/lit-pptx/references/tonalities/signal.md +118 -0
  66. package/.grok/skills/lit-pptx/references/tonalities/studio.md +123 -0
  67. package/.grok/skills/lit-pptx/scripts/compile-deck.js +65 -17
  68. package/.grok/skills/lit-pptx/scripts/craft_extras.py +82 -18
  69. package/.grok/skills/lit-pptx/scripts/deck_output.py +598 -0
  70. package/.grok/skills/lit-pptx/scripts/embed_fonts.py +1 -1
  71. package/.grok/skills/lit-pptx/scripts/inventory.py +6 -2
  72. package/.grok/skills/lit-pptx/scripts/lib/directive-parser.js +2 -2
  73. package/.grok/skills/lit-pptx/scripts/lib/grid-resolver.js +521 -0
  74. package/.grok/skills/lit-pptx/scripts/lib/layout-resolver.js +401 -16
  75. package/.grok/skills/lit-pptx/scripts/lib/markdown-loader.js +6 -4
  76. package/.grok/skills/lit-pptx/scripts/lib/render-adapter-html.js +2 -2
  77. package/.grok/skills/lit-pptx/scripts/lib/render-adapter-pptx.js +500 -126
  78. package/.grok/skills/lit-pptx/scripts/lib/render-pack.js +3558 -0
  79. package/.grok/skills/lit-pptx/scripts/lib/slide-ast.js +54 -6
  80. package/.grok/skills/lit-pptx/scripts/lib/template-registry.js +335 -11
  81. package/.grok/skills/lit-pptx/scripts/qa_deck.py +43 -10
  82. package/.grok/skills/lit-pptx/scripts/run.mjs +3 -2
  83. package/.grok/skills/lit-pptx/scripts/validate_pptx.py +17 -5
  84. package/.grok/skills/lit-pptx/templates/boilerplate_professional.css +6 -6
  85. package/.grok/skills/lit-pptx/templates/enrolled/AZURE-A2Z/layout-mapping.yaml +1 -1
  86. package/.grok/skills/lit-pptx/templates/enrolled/AZURE-A2Z/template.yaml +4 -1
  87. package/.grok/skills/lit-pptx/templates/enrolled/AZURE-PRO/layout-mapping.yaml +1 -1
  88. package/.grok/skills/lit-pptx/templates/enrolled/AZURE-PRO/template.yaml +4 -1
  89. package/.grok/skills/lit-pptx/templates/tonalities/atlas/pack.yaml +99 -0
  90. package/.grok/skills/lit-pptx/templates/tonalities/chalk/pack.yaml +104 -0
  91. package/.grok/skills/lit-pptx/templates/tonalities/gazette/pack.yaml +99 -0
  92. package/.grok/skills/lit-pptx/templates/tonalities/ledger/pack.yaml +100 -0
  93. package/.grok/skills/lit-pptx/templates/tonalities/night/pack.yaml +100 -0
  94. package/.grok/skills/lit-pptx/templates/tonalities/paper/pack.yaml +105 -0
  95. package/.grok/skills/lit-pptx/templates/tonalities/signal/pack.yaml +101 -0
  96. package/.grok/skills/lit-pptx/templates/tonalities/studio/pack.yaml +99 -0
  97. package/.grok/skills/lit-typographic-motion/THIRD_PARTY_NOTICES +1 -1
  98. package/.grok/skills/lit-typographic-motion/fonts/pins.json +6 -6
  99. package/.grok/skills/lit-typographic-motion/references/runtime.md +1 -1
  100. package/.grok/skills/lit-typographic-motion/references/style-bible.md +2 -2
  101. package/.grok/skills/lit-typographic-motion/references/type-craft.md +2 -2
  102. package/.grok/skills/lit-typographic-motion/scripts/lib/gate.mjs +1 -1
  103. package/.grok/skills/litgrok/SKILL.md +1 -1
  104. package/.grok-plugin/plugin.json +1 -1
  105. package/CHANGELOG.md +11 -0
  106. package/README.md +9 -9
  107. package/README_ko-KR.md +9 -9
  108. package/docs/assets/readme/badge-version.svg +1 -1
  109. package/docs/reference.md +1 -1
  110. package/docs/reference_ko-KR.md +1 -1
  111. package/package.json +1 -1
  112. package/plugin.json +1 -1
  113. package/.grok/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Bold.otf +0 -0
  114. package/.grok/skills/lit-pptx/pretendard-font/public/static/PretendardGOV-Regular.otf +0 -0
@@ -0,0 +1,211 @@
1
+ # Direction step
2
+
3
+ A deck's look is decided once, before the first slide is written, and it is decided as data: one of
4
+ the eight tonality packs in `templates/tonalities/<id>/pack.yaml`. The pack fixes the palette roles,
5
+ the type ramp, the title treatments each slide role may take, the layout families the engine will
6
+ draw, the cover, section and closing variants, and the density and variance dials. Skipping this
7
+ step leaves the engine without a design and the deck without a reason for looking the way it does.
8
+
9
+ The step produces three things: a direction card in the build log, a `tonality:` line in the deck
10
+ frontmatter, and two or three sentences in the reply that name the choice and two alternatives. A
11
+ bare request (`lit 발표자료 만들어줘`, "make me a deck on X") asks the user nothing. The skill
12
+ infers what it needs, writes the inference on the card, and lets the user correct it afterwards.
13
+
14
+ ## What to settle first
15
+
16
+ Write down four facts. Take them from the brief when it says them and infer them from the request
17
+ and the sources when it does not.
18
+
19
+ | Fact | Question it answers | Typical inference |
20
+ |---|---|---|
21
+ | Deck type | What job does the deck do? | "투자 유치" → pitch; "분기 실적" → business review; "주간 보고" → status update |
22
+ | Setting | Who looks at it, where, for how long? | a board at a desk, a hall with a stage screen, a class reviewing the file later |
23
+ | Delivery | Presented live, read alone, or both? | "미리 배포", "보고서형", "circulate" → read; "keynote", "demo day" → presented |
24
+ | Language | Korean, English or mixed? | the language of the request, unless the sources or the user say otherwise |
25
+
26
+ Pretendard Regular and Bold are the only faces this skill ships. Every pack draws with them, so the
27
+ direction never depends on a font the machine might lack. Hierarchy comes from size, weight, colour
28
+ and placement.
29
+
30
+ ## Candidates by deck type
31
+
32
+ Start from the row for the deck type. The first name is the default when no signal below moves it.
33
+
34
+ | Deck type | First choice | Second | Third, and when |
35
+ |---|---|---|---|
36
+ | Pitch (투자·제안) | signal | studio | atlas, when the product is a physical thing to show |
37
+ | Business review (실적 보고) | ledger | gazette, when circulated in Korean before the meeting | night, when shown on a stage screen |
38
+ | Research talk (연구 발표) | paper | night, for a keynote hall | chalk, for a tutorial |
39
+ | Lecture (강의·교육) | chalk | paper | studio, for a public lecture |
40
+ | Data-heavy review (데이터 리뷰) | night | ledger | paper, for a written analysis |
41
+ | Image-led (제품·현장·포트폴리오) | atlas | studio | signal, for a launch |
42
+ | Korean briefing (보고서형 덱) | gazette | ledger | — |
43
+ | Status update (주간·월간 보고) | ledger | gazette | night |
44
+
45
+ ## Count the outline, then reorder
46
+
47
+ Draft the outline before choosing: one line per slide with its message and the visual it needs (a
48
+ table, a chart, a picture, a list, a sequence). Then count. Apply the rows below from top to bottom;
49
+ when two packs tie, the deck-type order breaks the tie, so the same outline always yields the same
50
+ choice.
51
+
52
+ | Signal | Fires when | Effect |
53
+ |---|---|---|
54
+ | User's choice | the brief or an earlier turn names a tonality | use it, still write the card |
55
+ | Named template | the brief names an enrolled template such as AZURE-PRO | use that template, offer two tonalities as alternatives |
56
+ | Read, not presented | the brief says the file is sent ahead or filed | gazette (Korean) or ledger (any language) moves to first |
57
+ | Tables | 30 % or more of content slides hold a table | ledger and gazette up one place |
58
+ | Charts | 30 % or more hold a chart | ledger, night and paper up one place |
59
+ | Pictures | 30 % or more hold a photo or screenshot | atlas and studio up one place; gazette down one |
60
+ | Long bodies | over about 150 Korean glyphs or 300 Latin characters per content slide | gazette and ledger up; signal down |
61
+ | Short bodies | under about 40 Korean glyphs or 80 Latin characters per content slide | signal and studio up; density stays 10 |
62
+ | Citations | numbered references, DOIs or a references slide | paper up one place |
63
+ | Teaching structure | definitions, a formula, or a sequence of three or more steps taught in order | chalk up one place, paper up one |
64
+ | Dark room | keynote, stage, demo day | night up one place |
65
+ | Coverage gap | a pack has no family for a slide the outline needs | drop that pack |
66
+
67
+ The coverage row decides more often than it seems. Read `--list-layouts <id>` against the outline:
68
+
69
+ | Pack | Has no family for |
70
+ |---|---|
71
+ | ledger | pictures (no image family) |
72
+ | signal | agenda, timeline, running text |
73
+ | atlas | tables, charts |
74
+ | chalk | charts, KPI rows, timelines |
75
+ | paper | agenda, KPI rows, timelines, process steps |
76
+ | gazette | charts, pictures |
77
+ | studio | tables |
78
+ | night | tables (KPI rows and charts only), pictures, running text |
79
+
80
+ A ten-slide deck with four charts cannot be a chalk or gazette deck, however well the rest fits. A
81
+ deck with a 2×2 option matrix needs ledger or gazette.
82
+
83
+ **Worked case.** A Korean monthly status update built from a project tracker, eleven slides. The
84
+ type gives ledger, gazette, night. Three of nine content slides hold a table (33 %), so ledger and
85
+ gazette each move up one: no change in order. Bodies average 170 glyphs, so the long-body row fires
86
+ for both again. The brief says "월간 보고서로 배포", so the read row puts gazette first. The outline
87
+ has no chart, which costs gazette nothing. Result: gazette; alternatives ledger and night. Example
88
+ `12-status-update-gazette-ko.md` is a deck of this kind.
89
+
90
+ ## The direction card
91
+
92
+ The card records the decision and why. Fill every field; a build that cannot name its tonality and
93
+ its reason stops and asks instead of guessing a look.
94
+
95
+ ```text
96
+ Direction card
97
+ Deck type status update (월간 보고), read before the monthly steering meeting
98
+ Setting eight executives, on laptops and printed, about ten minutes each
99
+ Language Korean
100
+ Tonality gazette alternatives: ledger, night
101
+ Reason read rather than presented; 33 % table slides; bodies near 170 glyphs
102
+ Signals read-not-presented, tables, long bodies
103
+ Dials density 10, variance 4 (pack defaults)
104
+ Titles by role content band · data top-rule · data-takeaway side-rail · sequence kicker-numeral
105
+ Families cover-index, agenda, summary-box-list, ledger-table, table-insight, section-rule,
106
+ text-column, matrix-2x2, timeline, closing-ask
107
+ Wrong if the deck is presented to a room; ledger's top titles and KPI rows suit that better
108
+ ```
109
+
110
+ The "wrong if" line names the fact that would overturn the choice. A reviewer checks it first. If it
111
+ turns out true, rebuild under the alternative it names and update the card.
112
+
113
+ **Dials.** Density (1-10) and variance (1-10) start at the pack defaults: density 10 in every pack,
114
+ variance between 4 (gazette) and 8 (studio). The skill may move either dial by up to 2 on its own and
115
+ records the move on the card. A larger move needs the user's word. Lower density to 8 for a deck shown
116
+ to a large room; raise variance when the deck is long and its slide jobs repeat. Variance under 4 is
117
+ for a user who asks for a uniform deck. Set the dials in the frontmatter (`density: 8`,
118
+ `variance: 6`) so the source carries the decision. `density-and-fill.md` says what each step changes.
119
+
120
+ **Titles and families.** The role-to-title map comes straight from the pack's sheet in
121
+ `references/tonalities/`; each outline line gets one family from the pack's own list. The engine may draw a slide under another allowed title when the body fills
122
+ better there, and the compile log says so.
123
+
124
+ ## Say it in the reply
125
+
126
+ Name the tonality, the reason, and the two alternatives in plain words, in the user's language:
127
+
128
+ > gazette로 만들었습니다. 회의 전에 읽는 월간 보고이고 표가 슬라이드의 3분의 1을 넘어서입니다.
129
+ > 발표 화면에 띄운다면 ledger, 어두운 회의실이라면 night도 맞습니다.
130
+
131
+ > Built in ledger: the deck is a weekly status read on screen, and a third of its slides are tables.
132
+ > Gazette fits if it circulates in Korean; night fits a stage screen.
133
+
134
+ Keep the sentences short. The card stays in the build log; the reply carries only the decision.
135
+
136
+ ## Build log
137
+
138
+ Write the log beside the source. It is working evidence, delivered only when the user asks for the
139
+ audit trail.
140
+
141
+ ```text
142
+ deck.md source, with tonality: in the frontmatter
143
+ deck.build.md direction card, compile output (note:, variety:, fill:, Treatments: lines), gate JSON summary
144
+ deck.pptx compiled deck
145
+ ```
146
+
147
+ Compile and gate from the project root:
148
+
149
+ ```bash
150
+ node .grok/skills/lit-pptx/scripts/compile-deck.js deck.md --pptx deck.pptx
151
+ node .grok/skills/lit-pptx/scripts/run.mjs qa_deck.py deck.pptx
152
+ ```
153
+
154
+ The first line of the compile output repeats the direction (`Tonality gazette · density 10 ·
155
+ variance 4 · 16:9 compact grid`); paste it into the log under the card.
156
+
157
+ ## Comparing looks
158
+
159
+ When the user asks to see options, or says the look is open ("어떤 느낌이 좋을지 모르겠어요",
160
+ "show me a few styles"), build the cover and the first two content slides under the chosen pack and
161
+ the two alternatives. Keep content and order identical; change only the `tonality:` line.
162
+
163
+ ```bash
164
+ for t in gazette ledger night; do
165
+ sed "s/^tonality: .*/tonality: $t/" strip.md > "strip-$t.md"
166
+ node .grok/skills/lit-pptx/scripts/compile-deck.js "strip-$t.md" --pptx "strip-$t.pptx"
167
+ done
168
+ ```
169
+
170
+ If `soffice` is available, convert each strip to PDF and show the three rows of three pages. If it
171
+ is not, say the comparison is unrendered and describe each strip from its pack sheet. The user's
172
+ pick becomes the card's reason ("chosen from the comparison"); then build the full deck.
173
+
174
+ ## Enrolled templates
175
+
176
+ The templates in `templates/enrolled/` keep their single fixed look. `--list-tonalities` lists them
177
+ as legacy templates after the eight packs. Use one only when the user names it or an existing source
178
+ already says `template:`. The card names the template, the reply still offers two tonalities, and
179
+ the gate reports its variety and band checks as advisories, because a named template asks for one
180
+ look on purpose.
181
+
182
+ ## Mistakes this step prevents
183
+
184
+ - Choosing by topic ("a startup, so signal") without counting the outline.
185
+ - A reply that names one look, or none.
186
+ - A reason that restates the deck type instead of naming the signals.
187
+ - A pack that cannot draw a slide the outline needs; the compile prints `note: slide N: <family> is
188
+ not a <pack> layout family`, and the fix is another family or another pack.
189
+ - Moving a dial by three or more without asking.
190
+ - Swapping the tonality after the build without updating the card and the reply.
191
+
192
+ ## Example decks
193
+
194
+ Twelve complete decks live in `examples/`, each verified to compile and pass the gate under its
195
+ pack. Open the one whose deck type and language match the job before drafting. The picture slides name `assets/example-a.png`, `assets/example-b.png` and
196
+ `assets/example-c.png`; put real images at those paths, or change the paths, before compiling.
197
+
198
+ | File | Deck type | Tonality | Alternatives |
199
+ |---|---|---|---|
200
+ | `01-pitch-signal-ko.md` | pitch | signal | studio, atlas |
201
+ | `02-business-review-ledger-ko.md` | business review | ledger | gazette, night |
202
+ | `03-research-talk-paper-en.md` | research talk | paper | night, chalk |
203
+ | `04-lecture-chalk-ko.md` | lecture | chalk | paper, studio |
204
+ | `05-data-review-night-en.md` | data-heavy review | night | ledger, paper |
205
+ | `06-image-led-atlas-en.md` | image-led field report | atlas | studio, signal |
206
+ | `07-briefing-gazette-ko.md` | Korean briefing | gazette | ledger |
207
+ | `08-status-update-ledger-en.md` | status update | ledger | gazette, night |
208
+ | `09-pitch-studio-en.md` | pitch for a physical product | studio | signal, atlas |
209
+ | `10-image-led-studio-ko.md` | image-led portfolio | studio | atlas, signal |
210
+ | `11-business-review-night-en.md` | business review on a stage screen | night | ledger, gazette |
211
+ | `12-status-update-gazette-ko.md` | status update, circulated in Korean | gazette | ledger, night |
@@ -0,0 +1,193 @@
1
+ # Layout families
2
+
3
+ Each slide does one job, and each job has a shape the engine knows how to draw: that shape is a
4
+ layout family. You write its name after `layout:`; the pack then supplies the titles it may take and
5
+ the look of its tables, charts and rules. There are 28 content families and 20 cover, section and closing variants. No pack
6
+ carries all of them. Each pack lists the ones that suit its character, and a slide that asks for a
7
+ family outside that list is drawn with the family's own geometry and a `note:` line, which is a
8
+ signal to change the family or the pack.
9
+
10
+ Choose the family from what the slide must do, never from what the previous slide used. Variety in
11
+ a deck comes from slides doing different jobs; the gate's OF-111 check reads the compiled file and
12
+ fails a deck whose content slides share one composition too often.
13
+
14
+ List what a pack offers before writing:
15
+
16
+ ```bash
17
+ node .grok/skills/lit-pptx/scripts/compile-deck.js --list-tonalities
18
+ node .grok/skills/lit-pptx/scripts/compile-deck.js --list-layouts gazette
19
+ ```
20
+
21
+ The second command prints each family with the titles it may take under that pack, then the cover,
22
+ section and closing variants.
23
+
24
+ ## Content families
25
+
26
+ | Family | Job | What the source gives it | Packs |
27
+ |---|---|---|---|
28
+ | `text-column` | itemised text that keeps a reading measure | `- **head** text` lines with `(1)` `(2)` sub-points | atlas, chalk, gazette, paper |
29
+ | `text-two-column` | a longer itemised body split in two | four to six bold-headed groups; the engine splits at a group boundary | gazette, ledger, studio |
30
+ | `summary-box-list` | a boxed conclusion over its evidence | `::: key-message` (one or two lines), then bold-headed groups | gazette |
31
+ | `sidebar-note` | a point with a fenced note beside it; a note too short for its column stands across the top at lead size with the points in two columns under it, and under a side title it stands in the rail | bold-headed groups, then `::: main-box` holding the definition or the usual mistake | chalk |
32
+ | `agenda` | the deck's parts, numbered | `- **Part** what it covers`, three to six lines | chalk, gazette, ledger |
33
+ | `statement` | a quotation or a display-led page the user asked for | the `##` line is the sentence; one body line becomes the support line | atlas, chalk, night, paper, signal, studio |
34
+ | `quote` | a quotation with its source | a line opening with `“`, then a line opening with `—` | chalk, paper, signal |
35
+ | `kpi-row` | four to six headline figures | a two-row table: values, then each figure's basis; then takeaways and a source line | atlas, ledger, night, signal, studio |
36
+ | `kpi-over-chart` | figures above the trend that explains them | the KPI table, then a `::: chart` block, then one takeaway and a source line | ledger, night |
37
+ | `dashboard-grid` | two or three small charts read together | two or three `::: chart` blocks, then one takeaway and a source line | ledger, night |
38
+ | `table-insight` | a table with its reading beside it | a pipe table, a `>` caption, two or three takeaways, a source line | chalk, gazette, ledger, paper, signal |
39
+ | `ledger-table` | a full-width table that is the evidence | a table of five to eight rows and up to six columns, caption, takeaways under it | gazette, ledger |
40
+ | `matrix-2x2` | options on two axes | a 3 × 3 table: corner `효과 \ 난이도`, two column heads, two row heads; cells `item · detail · owner` | gazette, ledger |
41
+ | `comparison` | two sides read across shared criteria | `:::: columns 1fr 1fr`, each `::: col` with `- **side**` and `(1) 기준: …` items | all eight |
42
+ | `chart-insight` | a chart with its reading | a `::: chart` block with a `>` caption, two to four takeaways, a source line | ledger, night, paper, signal, studio |
43
+ | `full-chart` | one chart across the page | a `::: chart` block and a source line | ledger, night, paper, signal |
44
+ | `big-number` | two to four related figures as a data panel | a KPI table (labels, values, basis row), then evidence bullets | ledger, night, signal, studio |
45
+ | `process` | three to five steps in order | `- **1. 단계** what happens`; plain bullets after the steps are takeaways | chalk, signal |
46
+ | `step-diagram` | steps taught one at a time | as `process` | chalk |
47
+ | `timeline` | dated events on one axis | a `시점 \| 할 일 \| 담당` table (or Date, Milestone, Owner), caption, takeaways | atlas, gazette, ledger, night, studio |
48
+ | `method` | a formula or figure with its terms | a formula line or an image, then `- **term** meaning` lines | chalk, night, paper |
49
+ | `image-full` | one photograph as the page | one image whose alt text is the caption | atlas, studio |
50
+ | `image-split` | a picture beside its explanation | an image, then bold-headed bullets | atlas, chalk, signal, studio |
51
+ | `photo-grid` | a row of two or three pictures | the images on consecutive lines, then a single sentence | atlas, studio |
52
+ | `figure-pair` | two states of one subject (before/after, A/B) | two images, then one or two measured lines | atlas, paper |
53
+ | `figure-academic` | a journal figure and how to read it | an image captioned `Figure N.`, then bullets headed observation, limitation, implication | paper |
54
+ | `asymmetric-feature` | one large picture and a narrow text column | an image, then four or five short bullets | atlas, signal, studio |
55
+ | `references-appendix` | sources and definitions, one a line | `- [1] …` lines, eight to ten entries | gazette, ledger, paper |
56
+
57
+ Old layout names still compile under a tonality: `content` and `main` become `text-column`,
58
+ `summary` becomes `comparison`, `closing` becomes `closing-statement`, and `cover` or `section` take
59
+ the pack's first variant.
60
+
61
+ ## Source details that decide the result
62
+
63
+ - **Charts.** `::: chart type=column unit="억 원"` around a pipe table: categories in the first
64
+ column, one column per series, a `>` caption inside the block. Types: bar, column, line, area, pie,
65
+ doughnut, stacked. The chart is native and editable; on the compact step its values also appear as
66
+ a small table beside the takeaways when they fit (up to eight rows and four columns).
67
+ - **Captions.** A `>` line after a table or inside a chart block is its caption; say what is shown,
68
+ the unit, the period, and "(예시 데이터)" or "(sample data)" for sample values.
69
+ - **Source strip.** A body line that opens with `출처:`, `자료:`, `주:`, `Source:` or `Note:` is set as a
70
+ strip at source size, so it costs the takeaways no room. Under a side title it closes the rail;
71
+ beside a chart, table or picture it closes the takeaway column on the floor, so the column runs as
72
+ long as the visual; elsewhere it runs across the foot of the body. A takeaway column that still
73
+ stops halfway down the visual beside it fails the gate (OF-115): add the source or a note line, or
74
+ the takeaway the slide lacks. The gate reads the largest empty band inside the column, so a strip
75
+ at the foot under two short points still fails; see density-and-fill.md for how the engine fills it.
76
+ - **Run-in labels.** A point may open with a bold label: `- **요약:** 앱에서 맡기면 …`, `- **Basis:**
77
+ 1.0 L/min feed`. Write the colon; the engine adds one when the label ends without a separator,
78
+ because a bold word running into its sentence reads as part of it. A bold line with nothing after
79
+ it is a group heading and takes none. The gate fails a hand-set label without a separator (OF-118).
80
+ - **Pictures.** `![caption | 출처: …](assets/name.png)`. The text before `|` is the caption, the rest
81
+ its source. Write the caption without a number: the engine prefixes `도 N.` on a Korean deck and
82
+ `Figure N.` otherwise, and drops a `도/그림/Figure/Table N.` you typed. The gate wants every figure's
83
+ caption and source beside it: under the picture, or on the panel laid over a full-bleed photograph
84
+ and the picture a cover borrows (examples 06, 09 and 10).
85
+ - **Covers take no blocks.** A cover slide holds only its `#` title (and notes). `cover-split-image`
86
+ and `cover-full-image` borrow the deck's first picture; `cover-figures` borrows its first KPI row;
87
+ `cover-index` borrows the agenda.
88
+ - **Bullets beside a picture are narrow.** Under a bottom title the takeaways run in columns 10-12;
89
+ keep each under about 60 Latin characters or 30 Korean glyphs, and captions under about 70.
90
+
91
+ ## Covers, sections and closings
92
+
93
+ Name a variant on the `layout:` line (`layout: cover-band`). The engine draws it when the pack lists
94
+ it and the deck holds what it needs; otherwise it takes the pack's first variant it can draw and
95
+ prints `note: slide 1: drawn as …`.
96
+
97
+ | Variant | What it shows | Needs | Packs |
98
+ |---|---|---|---|
99
+ | `cover-typographic` | the title drawn with the pack's cover device | nothing | atlas, chalk, gazette, ledger, night, paper, signal |
100
+ | `cover-figures` | the title over the deck's headline figures | a KPI row in the deck | ledger, night |
101
+ | `cover-index` | the title beside the deck's parts | an agenda, or two or more sections | gazette, ledger, paper |
102
+ | `cover-numeral` | a year or real figure at title size above the title | a year or figure in the title or date | chalk, night, signal, studio |
103
+ | `cover-split-field` | half the page in the accent field | nothing | signal |
104
+ | `cover-split-image` | the title beside the first picture | a picture in the deck | atlas, paper, studio |
105
+ | `cover-full-image` | the first picture full-bleed, title on a panel | a picture | atlas |
106
+ | `cover-band` | the title under a strong head band, the parts across the page | nothing | gazette |
107
+ | `cover-rail` | the title in a left rail | nothing | chalk, studio |
108
+ | `section-field` | the part title on a colour field | nothing | atlas, night, paper, signal |
109
+ | `section-numeral` | the part number beside the part title | nothing | chalk, ledger, night, signal, studio |
110
+ | `section-rule` | with an agenda, an index page with this part marked | nothing | gazette, ledger, paper |
111
+ | `section-rail` | the part title in the rail | nothing | chalk, studio |
112
+ | `section-band` | the part index in the band, the part title under it | nothing | gazette |
113
+ | `section-image` | the part title on the section's own picture | a picture on that slide | atlas |
114
+ | `closing-ask` | the ask as title, its table as action rows, the next step on the floor | a table or bullets | atlas, chalk, gazette, ledger, paper, signal |
115
+ | `closing-decision-box` | a boxed decision line over the items to approve | one decision bullet, then a table if there are items | gazette, ledger, night |
116
+ | `closing-statement` | one closing sentence | no table or picture | night, signal |
117
+ | `closing-summary-list` | the takeaways numbered down the page | bullets | chalk, paper, studio |
118
+ | `closing-contact-split` | action rows beside a field holding each row's amount or date | a table or bullets, plus a next-step line | atlas, studio |
119
+
120
+ A closing title names the ask ("시드 투자 15억 원 사용 계획", "Decisions for the November peak"). The
121
+ body carries what is to be decided, the amount or deadline, the owner, and the next step with its
122
+ date. "감사합니다" or "Questions?" alone is not a closing.
123
+
124
+ ## Display devices
125
+
126
+ A cover or a section page holds a handful of words, so a pack's `display:` key names the device that
127
+ gives such a page its weight. A device frames what the source already says; it never
128
+ adds words or figures.
129
+
130
+ | Device | Draws | Packs |
131
+ |---|---|---|
132
+ | cover `drench` | the field over the whole page, title anchored low | signal |
133
+ | cover `plate` | a field plate over a little under half the page, title on it | atlas |
134
+ | cover `rail` / `band` | the pack's `cover-rail` / `cover-band` | chalk / gazette |
135
+ | cover `figures` | `cover-figures` when a KPI row exists, else the plain cover | ledger |
136
+ | cover `numeral` | `cover-numeral` with the year | night |
137
+ | cover `rules` | a journal title page: heavy rule, title, hairline, presenter, place and date | paper |
138
+ | statement `open` / `drench` / `rules` / `offset` | the sentence alone; on the field over the whole page; between hairlines; beside a short rail | signal, night / chalk, atlas / paper, studio / no pack (the rail beside a quote stood empty) |
139
+ | number `field` / `tint` / `outline` | the panel behind a big number | signal / atlas, chalk, ledger, night, studio / gazette, paper |
140
+ | closing `band` / `box` / `rules` | the next step on the floor as a field band, a tinted or outlined box, or under a rule | atlas, night, signal, studio / chalk, gazette, ledger / paper |
141
+ | `index: true` | sections show the deck's parts with this one marked | gazette, ledger, paper |
142
+
143
+ ## What the engine does with the source
144
+
145
+ - A title that needs two lines is split so both lines are about as wide, never leaving one word
146
+ alone below; figures are glued to their counter ("15억 원", "4 분기", "다섯 곳").
147
+ - Line breaks in body text and table cells are placed by the engine at spaces, so "51점" or "(10월" is
148
+ never split between digit and unit by the renderer, and a short parenthetical such as "(▲ +3.9%)" (up to
149
+ 16 characters) is never split inside.
150
+ - Section numerals come from the agenda: write the section title exactly as its agenda head and the
151
+ page shows "02 / 04". With no agenda the sections are counted; a lone section gets no numeral at
152
+ all, and its title is set large over the titles of the next slides.
153
+ - A closing's table becomes action rows keyed by the amount column (each row gets a bar for its share
154
+ of the total), else by the date column. A `합계` or `Total` row is never an action row.
155
+ - A big number is a panel of two to four figures, one row each (value, label, basis), never larger
156
+ than title size, seven of twelve columns wide, with the evidence beside it.
157
+ - Dark devices that do not fill the page (plates, rails, panels) stay under half its area, so the
158
+ pack's ground still reads as the page colour.
159
+ - In tables of signal and night, the row whose first cell appears in the slide title is tinted as
160
+ the row the slide is about.
161
+
162
+ ## Families under different titles
163
+
164
+ The same family changes shape with its title, which is where a lot of a deck's variety comes from:
165
+
166
+ - With a `side-rail` title, figures from a KPI table stack as rows, process steps run downward, and a
167
+ chart fills columns 5-12 from top to floor. The rail under the title carries the slide's supporting
168
+ content: a comparison's criteria labels, a visual's takeaways (a step up, at lead size, when body
169
+ size leaves the rail more than 40 % empty), a values table and the source strip. A table gives up
170
+ its takeaways only when its rows, opened, still fill the body. A slide whose rail would stay more
171
+ than 40 % empty takes another title unless `title: side-rail` pins it, and the gate fails that
172
+ rail (OF-115).
173
+ - With a `bottom-anchor` title, the chart, figure or panel owns the zone from y 36 to 24 pt above the
174
+ title, and the title's last line stands on the body floor.
175
+ - Beside a visual, takeaways that leave their column more than 40 % empty are set a step up (lead)
176
+ when they still fit; compact process rows that leave a quarter of the body's width empty do the same.
177
+ - Under `band`, the body starts at y 120 and runs to the floor at reading size.
178
+ - A `quote` under `statement` sets the quotation as the page's sentence and the source as support.
179
+
180
+ ## Reading the compile log
181
+
182
+ ```text
183
+ note: slide 4: timeline is not a chalk layout family (step-diagram, process, …); drawn with its own geometry
184
+ note: slide 1: cover-figures cannot be drawn (the deck has no row of headline numbers)
185
+ note: slide 1: drawn as cover-typographic
186
+ variety: slide 3 drawn under top-rule so the deck carries 6 layouts
187
+ fill: slide 6 band 0.19 -> 0.19 (none: nothing on the slide can grow; choose a fuller family)
188
+ ```
189
+
190
+ Treat every `note:` as a request the pack could not honour. Change the source: pick a family from the
191
+ pack's list, shorten the title, or go back to `direction-step.md` and choose another pack.
192
+ A `variety:` line is the engine keeping the deck varied and needs no action. A `fill:` line that
193
+ ends in "choose a fuller family" is covered in `density-and-fill.md`.
@@ -0,0 +1,134 @@
1
+ # Title treatments
2
+
3
+ A title treatment is where a slide's title sits and what is drawn with it. The engine has eight,
4
+ each with one fixed frame, so every slide under a treatment puts its title in the same spot. A deck
5
+ reads as designed when it uses three to five of them and each one always marks the same kind of
6
+ slide: a reader learns "the side rail means a chart with its reading" in two slides.
7
+
8
+ ## Two rules for every title
9
+
10
+ **A title is a topic label.** Think of it as the heading of a table of contents: what is shown, in
11
+ what measure, for which period when that matters:
12
+ "권역별 대여소 이용 현황", "On-time delivery by region, Q3 2026". The claim goes in the body, as the
13
+ first takeaway, the first point, the boxed summary or the caption. The gate's OF-114 check fails a
14
+ title or cover subtitle that reads as a sentence:
15
+
16
+ - Korean: the last word ends in -다, -니다, -요 forms or -죠, or in a nominalised claim (-음 after a
17
+ past or future stem, 있음, 없음, or -함/-됨 on a word other than 포함). "보고 순서" passes;
18
+ "매출 증가함" and "목표를 달성했다" fail.
19
+ - English: a final period, an auxiliary (is, are, was, has, will …), or a finite verb after the
20
+ first word: past forms (grew, rose, fell, improved, exceeded …) and a few third-person forms that
21
+ seldom act as nouns (beats, exceeds, improves, grows …). Plural nouns such as "leads", "works" or
22
+ "cuts" and hyphenated compounds such as "cut-over" stay labels: "Milestones to cut-over" passes,
23
+ "Revenue rose 12%" fails.
24
+ - A question, a title that opens with a quotation mark, and a trailing parenthesis are not read as
25
+ claims.
26
+
27
+ **No eyebrow, no decorative numeral.** Nothing small sits above a title. A numeral next to a title is
28
+ a real part, step or recommendation number, drawn by `kicker-numeral` or a section variant; it is
29
+ never added for texture.
30
+
31
+ ## The eight
32
+
33
+ Geometry is for 16:9 on the compact grid (density 10: 24 pt margins, 54 pt columns, 24 pt gutters,
34
+ title 26 pt, display 36 pt). Budgets are Korean glyphs per line; Latin text takes about 1.7 times as
35
+ many characters.
36
+
37
+ | Treatment | Title frame | Drawn with it | Body zone | Budget |
38
+ |---|---|---|---|---|
39
+ | `top-rule` | columns 1-12 at y 36, title size | an accent rule one column wide, or a full-width hairline in packs without `accent-rule`, 6 pt under the title | 18 pt under the rule (y ≈ 92 for one line) to the floor at 486 | 2 lines of about 35 |
40
+ | `top-plain-large` | columns 1-10 at y 36, display size | nothing | 18 pt under the title (y ≈ 108 for one line) | 2 lines of about 20 |
41
+ | `side-rail` | columns 1-4 from y 36, title size | a filled rail (surface, or the field with white type in chalk) where the pack has `rail-fill`, else a hairline after column 4 | columns 5-12, from y 36; the rail under the title carries the criteria labels, the takeaways and the source | 4 lines of about 10 |
42
+ | `band` | inside a full-width band 108 pt tall, columns 1-11 | the band in the field colour, title in `on-field` | y 120 to the floor | 2 lines of about 32 |
43
+ | `statement` | columns 1-10, centred near y 303, display size | an optional support line under it | none | 3 lines of about 20 |
44
+ | `overlay` | lower left on a dark panel (columns 1-7) over a full-bleed picture; the panel is as tall as the title and its caption and stands on the page foot | the panel and the picture's caption | none: the picture is the content | 2 lines of about 19 |
45
+ | `kicker-numeral` | columns 3-12 at y 48, with a cover-size numeral in columns 1-2 | the numeral in the accent | y 120 to the floor | 1 line of about 27 |
46
+ | `bottom-anchor` | columns 1-9, its last line on the body floor at 486 (a one-line title leaves no band under it) | a hairline 12 pt above the title where the pack has `hairline-rule` | y 36 to 24 pt above the title for the visual; columns 10-12 beside the title stay clear | 2 lines of about 24 |
47
+
48
+ `kicker-numeral` needs a real number: a step, a ledger part, the part a section opened. An agenda is
49
+ not one: its rows carry the numbers, and a count beside its title read as a stray section number, so
50
+ the agenda takes another title (the gate fails a numeral there, OF-119). Without a number the engine
51
+ cannot draw it and picks another title.
52
+
53
+ ## How a slide gets its title
54
+
55
+ The family sets the slide role: text families are `content`; tables, KPI rows, comparisons and
56
+ matrices are `data`; charts and big numbers are `data-takeaway`; processes, steps and timelines are
57
+ `sequence`; picture families are `image`; statements and quotes are `statement`; `method` is
58
+ `definition`; references are `reference`. The pack's `role-defaults` map gives each role a default
59
+ treatment. A pack may also give one family its own title under `structure`: Paper draws a comparison
60
+ under `top-rule` as a ruled table, Chalk sets the comparison's criteria on its board rail under
61
+ `side-rail`. That title comes before the role default and holds even when the deck already leans on
62
+ it, so two tonalities of one source differ in structure, not only in colour. When the role default
63
+ is a bottom title the slide may not take (a table), the pack's next treatment stands in.
64
+
65
+ For each slide the engine tries every treatment that both the family and the pack accept and that
66
+ the title fits. The role default is the pack's structure, so it stays unless another treatment fills
67
+ the body better by a tenth of the zone (by 0.15 when neither fills it) or the default cannot be drawn
68
+ without overflow; a side rail that would stay more than 40 % empty also gives way. Two deck-level passes follow: no title zone may
69
+ hold more than 40 % of the content slides, and the deck must carry enough distinct layouts for the
70
+ composition check. Each move is printed:
71
+
72
+ ```text
73
+ variety: slide 5 drawn under side-rail so no title zone covers more than 40 % of the content slides
74
+ Treatments: 2:band 3:top-rule 4:band 5:top-rule 7:side-rail 8:top-rule 9:band 10:top-rule 11:band
75
+ ```
76
+
77
+ The variance dial caps how many treatments one deck mixes: 2 at variance 3 or lower, 3 at 4, 4 at
78
+ 5-6, 5 at 7 and above, never more than the pack has.
79
+
80
+ Closings with a table or a decision take only top titles (`top-rule`, `band`, `top-plain-large`).
81
+ Covers and sections draw their own variant's title and refuse a `title:` key.
82
+
83
+ ## Pinning a title
84
+
85
+ Put `title: <treatment>` on the line after `layout:` when a slide must take a particular treatment.
86
+ The compile stops with a message naming the allowed list if the treatment is unknown, not in the pack,
87
+ not allowed by the family, or cannot hold the title:
88
+
89
+ ```markdown
90
+ ---
91
+ layout: comparison
92
+ title: side-rail
93
+
94
+ ## 재배치 대안 비교
95
+ ```
96
+
97
+ Pin sparingly. The usual reasons are a low-variance pack that needs a different partition to pass
98
+ the composition check (example 07 pins its agenda to `top-rule` and its comparison to `side-rail`),
99
+ or a comparison whose rows leave a column hollow under the role default (example 04).
100
+
101
+ ## Choosing well
102
+
103
+ - **A chart or table with a reading** wants `side-rail` or `bottom-anchor`: the visual takes the full
104
+ height and the title labels it from beside or below.
105
+ - **A page that is read** (briefing, status) wants `band` or `top-rule`, the most predictable heads.
106
+ - **A real sequence** wants `kicker-numeral`; a list with no order never gets a numeral.
107
+ - **A full-bleed photograph** takes `overlay`, and only on `image-full`. A large picture with a short
108
+ label beneath takes `bottom-anchor`.
109
+ - **`statement`** is for a quotation (the `quote` family) or a display-led deck the user asked for. A
110
+ single claim on an empty page is not a slide; it becomes the boxed summary or the first takeaway of
111
+ a content slide.
112
+
113
+ Never move a title with a placed `box`. The frame is the treatment; a nudged title is a ninth,
114
+ broken treatment, and OF-113 fails it.
115
+
116
+ ## What the gate checks
117
+
118
+ The gate classifies each title from the compiled file by geometry and companions and compares that
119
+ with the `title@<treatment>` name the engine writes on the shape; the name alone is never accepted.
120
+
121
+ - **OF-110**: a deck of eight or more slides shows at least three treatments (covers and sections
122
+ not counted) and no more than the variance dial allows; every title is drawn as it is named.
123
+ - **OF-113**: slides under one treatment keep one frame (within 1 pt; a statement compares x and
124
+ width only, a bottom title x, width and its bottom edge, because it stands on the floor).
125
+ - **OF-115**: a bottom title that ends more than 12 pt above the body floor fails, and so does a side
126
+ rail more than 40 % empty under its title. What stands in the rail under the title belongs to the
127
+ rail: it neither changes the side-rail reading nor counts as a body column. A text or picture column
128
+ whose largest empty band, read beside a longer column, passes 40 % of the body fails as well; a
129
+ source strip at the column's foot counts as a block but does not hide the band above it.
130
+ - **OF-119**: an agenda title stands without a numeral beside it.
131
+ - **OF-114**: titles and the cover subtitle are labels, as above.
132
+
133
+ On an enrolled template these findings are advisory, because the user asked for one fixed title
134
+ position.