kitfly 0.2.1 → 0.2.4

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 (132) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +38 -21
  3. package/VERSION +1 -1
  4. package/dist/_raw/content/guide/branding.md +146 -0
  5. package/dist/_raw/content/guide/data-driven-content.md +204 -0
  6. package/dist/_raw/content/reference/configuration.md +145 -7
  7. package/dist/_raw/content/reference/environment-variables.md +26 -1
  8. package/dist/_raw/content/reference/gantt-widget.md +468 -0
  9. package/dist/_raw/content/reference/glossary.md +25 -1
  10. package/dist/_raw/content/reference/key-concepts.md +30 -2
  11. package/dist/_raw/content/reference/plugins.md +170 -1
  12. package/dist/_raw/docs/decisions/ADR-0006-data-driven-content.md +350 -0
  13. package/dist/content/deployment/preflight.html +11 -8
  14. package/dist/content/deployment/recipes/aws-s3.html +11 -8
  15. package/dist/content/deployment/recipes/cloudflare-pages.html +11 -8
  16. package/dist/content/deployment/recipes/cloudflare-r2.html +11 -8
  17. package/dist/content/deployment/recipes/fly-io.html +11 -8
  18. package/dist/content/deployment/recipes/github-pages.html +11 -8
  19. package/dist/content/deployment/recipes/netlify.html +11 -8
  20. package/dist/content/deployment/recipes/vercel.html +11 -8
  21. package/dist/content/deployment/secrets-and-env-vars.html +11 -8
  22. package/dist/content/deployment.html +11 -8
  23. package/dist/content/guide/approaches.html +11 -8
  24. package/dist/content/guide/branding.html +509 -0
  25. package/dist/content/guide/data-driven-content.html +542 -0
  26. package/dist/content/guide/features.html +11 -8
  27. package/dist/content/guide/getting-started.html +11 -8
  28. package/dist/content/guide/kitfly-overview.html +11 -8
  29. package/dist/content/reference/configuration.html +136 -11
  30. package/dist/content/reference/design-catalog.html +11 -8
  31. package/dist/content/reference/environment-variables.html +51 -10
  32. package/dist/content/reference/gantt-widget.html +899 -0
  33. package/dist/content/reference/glossary.html +25 -10
  34. package/dist/content/reference/key-concepts.html +34 -11
  35. package/dist/content/reference/plugins.html +261 -10
  36. package/dist/content/reference/slides-authoring-guidelines.html +11 -8
  37. package/dist/content/reference/structure.html +11 -8
  38. package/dist/content/reference.html +11 -8
  39. package/dist/content/templates/crucible.html +11 -8
  40. package/dist/content/templates/handbook.html +11 -8
  41. package/dist/content/templates/minimal.html +11 -8
  42. package/dist/content/templates/overview.html +11 -8
  43. package/dist/content/templates/pipeline.html +11 -8
  44. package/dist/content/templates/productbook.html +11 -8
  45. package/dist/content/templates/runbook.html +11 -8
  46. package/dist/content/templates/servicebook.html +11 -8
  47. package/dist/content-index.json +37 -2
  48. package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +11 -8
  49. package/dist/docs/decisions/ADR-0002-ai-accessibility.html +11 -8
  50. package/dist/docs/decisions/ADR-0003-single-file-bundle.html +11 -8
  51. package/dist/docs/decisions/ADR-0004-bun-runtime.html +11 -8
  52. package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +11 -8
  53. package/dist/docs/decisions/ADR-0006-data-driven-content.html +751 -0
  54. package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +11 -8
  55. package/dist/docs/decisions/DDR-0002-theme-system.html +11 -8
  56. package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +11 -8
  57. package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +11 -8
  58. package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +11 -8
  59. package/dist/docs/userguide/cli/build.html +11 -8
  60. package/dist/docs/userguide/cli/bundle.html +11 -8
  61. package/dist/docs/userguide/cli/dev.html +11 -8
  62. package/dist/docs/userguide/cli/init.html +11 -8
  63. package/dist/docs/userguide/cli/servers.html +11 -8
  64. package/dist/docs/userguide/cli/stop.html +11 -8
  65. package/dist/docs/userguide/cli/update.html +11 -8
  66. package/dist/docs/userguide/cli/version.html +11 -8
  67. package/dist/docs/userguide/cli.html +11 -8
  68. package/dist/docs/userguide/sharing.html +11 -8
  69. package/dist/index.html +11 -8
  70. package/dist/llms.txt +3 -3
  71. package/dist/provenance.json +4 -5
  72. package/dist/reports/license-inventory.csv +199 -0
  73. package/dist/schemas/plugin-registry.schema.html +11 -8
  74. package/dist/schemas/plugin-schemas-notes.html +11 -8
  75. package/dist/schemas/plugin.schema.html +11 -8
  76. package/dist/schemas/plugins.schema.html +11 -8
  77. package/dist/schemas/v0/common.schema.html +15 -12
  78. package/dist/schemas/v0/plugin-registry.schema.html +14 -11
  79. package/dist/schemas/v0/plugin.schema.html +14 -11
  80. package/dist/schemas/v0/plugins.schema.html +14 -11
  81. package/dist/schemas/v0/site.schema.html +68 -9
  82. package/dist/schemas/v0/theme.schema.html +22 -19
  83. package/dist/schemas.html +11 -8
  84. package/dist/styles.css +39 -4
  85. package/package.json +1 -1
  86. package/plugins-dist/latex-runtime.js +140 -0
  87. package/plugins-dist/latex.js +178 -0
  88. package/plugins-dist/planning-visuals.css +261 -0
  89. package/plugins-dist/planning-visuals.js +669 -0
  90. package/plugins-dist/slides-charts-lite-runtime.js +179 -0
  91. package/plugins-dist/slides-charts-lite.js +198 -0
  92. package/registry/plugins.yaml +40 -1
  93. package/schemas/v0/site.schema.json +56 -0
  94. package/scripts/build-all.ts +5 -0
  95. package/scripts/build.ts +264 -80
  96. package/scripts/bundle.ts +188 -17
  97. package/scripts/dev.ts +294 -171
  98. package/scripts/embed-docs.ts +119 -0
  99. package/src/__tests__/brief.test.ts +151 -0
  100. package/src/__tests__/build.test.ts +293 -1
  101. package/src/__tests__/bundle.test.ts +195 -0
  102. package/src/__tests__/docs.test.ts +117 -0
  103. package/src/__tests__/fixtures/fences/planning-visuals/invalid/bad-month-format.md +10 -0
  104. package/src/__tests__/fixtures/fences/planning-visuals/invalid/marker-format-mismatch.md +13 -0
  105. package/src/__tests__/fixtures/fences/planning-visuals/invalid/milestone-format-mismatch.md +13 -0
  106. package/src/__tests__/fixtures/fences/planning-visuals/invalid/missing-tracks.md +5 -0
  107. package/src/__tests__/fixtures/fences/planning-visuals/invalid/track-reversed.md +10 -0
  108. package/src/__tests__/fixtures/fences/planning-visuals/valid/markers-basic.md +15 -0
  109. package/src/__tests__/fixtures/fences/planning-visuals/valid/markers-no-milestones.md +13 -0
  110. package/src/__tests__/fixtures/fences/planning-visuals/valid/month-basic.md +16 -0
  111. package/src/__tests__/fixtures/fences/planning-visuals/valid/no-milestones.md +10 -0
  112. package/src/__tests__/fixtures/fences/planning-visuals/valid/week-basic.md +20 -0
  113. package/src/__tests__/init.test.ts +51 -2
  114. package/src/__tests__/latex-runtime.bun.test.ts +35 -0
  115. package/src/__tests__/planning-visuals-fence-contract.test.ts +28 -0
  116. package/src/__tests__/planning-visuals-runtime-regressions.bun.test.ts +68 -0
  117. package/src/__tests__/planning-visuals-runtime.bun.test.ts +192 -0
  118. package/src/__tests__/shared.test.ts +719 -1
  119. package/src/__tests__/slides-charts-lite-runtime.bun.test.ts +45 -0
  120. package/src/cli.ts +124 -22
  121. package/src/commands/docs.ts +71 -0
  122. package/src/commands/init.ts +1 -1
  123. package/src/generated/embedded-docs.ts +2384 -0
  124. package/src/server-registry.ts +50 -10
  125. package/src/shared.ts +1174 -43
  126. package/src/site/styles.css +39 -4
  127. package/src/site/template.html +5 -2
  128. package/src/templates/brief.ts +486 -0
  129. package/src/templates/deck.ts +59 -0
  130. package/src/templates/driver.ts +46 -13
  131. package/src/templates/handbook.ts +32 -0
  132. package/src/templates/runbook.ts +32 -0
@@ -0,0 +1,468 @@
1
+ ---
2
+ title: "Gantt Widget Examples"
3
+ description: "Usage patterns for the :::gantt planning widget"
4
+ last_updated: "2026-03-06"
5
+ ---
6
+
7
+ # Gantt Widget Examples
8
+
9
+ The `:::gantt` widget renders a horizontal bar chart on a shared time axis. It ships in the `planning-visuals` plugin and works in both docs and slides mode.
10
+
11
+ Enable the plugin in `kitfly.plugins.yaml`:
12
+
13
+ ```yaml
14
+ plugins:
15
+ - planning-visuals@0.2.4
16
+ ```
17
+
18
+ ## Minimal example (week)
19
+
20
+ The smallest valid gantt — three required fields plus at least one track:
21
+
22
+ ```markdown
23
+ :::gantt
24
+ time-unit: week
25
+ time-start: "2026-W20"
26
+ time-end: "2026-W28"
27
+ tracks:
28
+
29
+ - label: "Sprint 1"
30
+ depth: 1
31
+ start: "2026-W20"
32
+ end: "2026-W23"
33
+ - label: "Sprint 2"
34
+ depth: 1
35
+ start: "2026-W24"
36
+ end: "2026-W28"
37
+ :::
38
+ ```
39
+
40
+ No label, no milestones, no today marker — all optional. Tracks default to `status: planned` (muted/gray bars).
41
+
42
+ ## Minimal example (month)
43
+
44
+ Same structure, different time unit. Dates use `YYYY-MM` format:
45
+
46
+ ```markdown
47
+ :::gantt
48
+ time-unit: month
49
+ time-start: "2026-06"
50
+ time-end: "2026-12"
51
+ tracks:
52
+
53
+ - label: "Discovery"
54
+ depth: 1
55
+ start: "2026-06"
56
+ end: "2026-08"
57
+ - label: "Build"
58
+ depth: 1
59
+ start: "2026-09"
60
+ end: "2026-12"
61
+ :::
62
+ ```
63
+
64
+ Month mode is natural for business audiences — no ISO week numbers to decode.
65
+
66
+ ## Status colors
67
+
68
+ Four statuses control bar color. Use them to show progress at a glance:
69
+
70
+ ```markdown
71
+ :::gantt
72
+ label: "Status Reference"
73
+ time-unit: week
74
+ time-start: "2026-W14"
75
+ time-end: "2026-W26"
76
+ tracks:
77
+
78
+ - label: "Completed work"
79
+ depth: 1
80
+ start: "2026-W14"
81
+ end: "2026-W17"
82
+ status: complete
83
+ - label: "In progress"
84
+ depth: 1
85
+ start: "2026-W18"
86
+ end: "2026-W21"
87
+ status: active
88
+ - label: "Waiting on vendor"
89
+ depth: 1
90
+ start: "2026-W19"
91
+ end: "2026-W23"
92
+ status: blocked
93
+ - label: "Not started"
94
+ depth: 1
95
+ start: "2026-W22"
96
+ end: "2026-W26"
97
+ status: planned
98
+ :::
99
+ ```
100
+
101
+ | Status | Color | Use for |
102
+ | ---------- | ------------ | --------------------- |
103
+ | `complete` | Green | Done, signed off |
104
+ | `active` | Accent/blue | Currently in progress |
105
+ | `blocked` | Amber/orange | Waiting, at risk |
106
+ | `planned` | Muted/gray | Not started (default) |
107
+
108
+ All colors adapt to dark mode automatically.
109
+
110
+ ## Hierarchy and depth filtering
111
+
112
+ The key feature: `depth` + `max-depth` lets one data set produce multiple views.
113
+
114
+ ### Full detail (`max-depth: 2`)
115
+
116
+ ```markdown
117
+ :::gantt
118
+ label: "Client Rollout — Detail View"
119
+ time-unit: week
120
+ time-start: "2026-W18"
121
+ time-end: "2026-W40"
122
+ max-depth: 2
123
+ today: "2026-W28"
124
+ tracks:
125
+
126
+ - label: "Wave 1 — Pilot"
127
+ depth: 1
128
+ start: "2026-W20"
129
+ end: "2026-W30"
130
+ status: active
131
+ - label: "Apex Advisory (45 sites)"
132
+ depth: 2
133
+ start: "2026-W20"
134
+ end: "2026-W26"
135
+ status: complete
136
+ - label: "Beacon Logistics (80 sites)"
137
+ depth: 2
138
+ start: "2026-W24"
139
+ end: "2026-W30"
140
+ status: active
141
+ milestones:
142
+ - label: "Pilot Review"
143
+ date: "2026-W31"
144
+ tracks:
145
+ - label: "Wave 2 — Scale"
146
+ depth: 1
147
+ start: "2026-W33"
148
+ end: "2026-W40"
149
+ status: planned
150
+ - label: "Crestview Energy (120 sites)"
151
+ depth: 2
152
+ start: "2026-W33"
153
+ end: "2026-W37"
154
+ status: planned
155
+ - label: "Dunmore Foods (90 sites)"
156
+ depth: 2
157
+ start: "2026-W36"
158
+ end: "2026-W40"
159
+ status: planned
160
+ :::
161
+ ```
162
+
163
+ ### Summary view (`max-depth: 1`)
164
+
165
+ Use the same data with `max-depth: 1` to show only wave-level bars — ideal for executive slides:
166
+
167
+ ```markdown
168
+ :::gantt
169
+ label: "Client Rollout — Summary View"
170
+ time-unit: week
171
+ time-start: "2026-W18"
172
+ time-end: "2026-W40"
173
+ max-depth: 1
174
+ today: "2026-W28"
175
+ tracks:
176
+
177
+ - label: "Wave 1 — Pilot"
178
+ depth: 1
179
+ start: "2026-W20"
180
+ end: "2026-W30"
181
+ status: active
182
+ - label: "Apex Advisory (45 sites)"
183
+ depth: 2
184
+ start: "2026-W20"
185
+ end: "2026-W26"
186
+ status: complete
187
+ - label: "Beacon Logistics (80 sites)"
188
+ depth: 2
189
+ start: "2026-W24"
190
+ end: "2026-W30"
191
+ status: active
192
+ milestones:
193
+ - label: "Pilot Review"
194
+ date: "2026-W31"
195
+ tracks:
196
+ - label: "Wave 2 — Scale"
197
+ depth: 1
198
+ start: "2026-W33"
199
+ end: "2026-W40"
200
+ status: planned
201
+ - label: "Crestview Energy (120 sites)"
202
+ depth: 2
203
+ start: "2026-W33"
204
+ end: "2026-W37"
205
+ status: planned
206
+ - label: "Dunmore Foods (90 sites)"
207
+ depth: 2
208
+ start: "2026-W36"
209
+ end: "2026-W40"
210
+ status: planned
211
+ :::
212
+ ```
213
+
214
+ Depth-2 tracks and milestones are hidden. The data is identical — only `max-depth` changes.
215
+
216
+ ## Milestones
217
+
218
+ Milestones are point-in-time markers (diamonds). They have a `date` instead of `start`/`end`, and they're listed separately from tracks. Interleave freely — source order controls layout:
219
+
220
+ ```markdown
221
+ :::gantt
222
+ time-unit: month
223
+ time-start: "2026-03"
224
+ time-end: "2026-12"
225
+ milestones:
226
+
227
+ - label: "Kick-off"
228
+ date: "2026-03"
229
+ tracks:
230
+ - label: "Design Phase"
231
+ depth: 1
232
+ start: "2026-04"
233
+ end: "2026-06"
234
+ status: complete
235
+ milestones:
236
+ - label: "Design Sign-off"
237
+ date: "2026-07"
238
+ tracks:
239
+ - label: "Build Phase"
240
+ depth: 1
241
+ start: "2026-07"
242
+ end: "2026-10"
243
+ status: active
244
+ milestones:
245
+ - label: "Launch"
246
+ date: "2026-11"
247
+ :::
248
+ ```
249
+
250
+ Milestones respect `max-depth` filtering. A milestone with `depth: 2` is hidden when `max-depth: 1`.
251
+
252
+ ## Chart-level markers
253
+
254
+ Markers are vertical annotation lines that span the full chart height — use them for gates, deadlines, and phase boundaries. Unlike row-level milestones (diamonds), markers are chart-level annotations with a label at the top:
255
+
256
+ ```markdown
257
+ :::gantt
258
+ label: "Platform Migration"
259
+ time-unit: week
260
+ time-start: "2026-W14"
261
+ time-end: "2026-W30"
262
+ markers:
263
+
264
+ - label: "Go/No-Go"
265
+ date: "2026-W18"
266
+ color: "#f59e0b"
267
+ - label: "Phase 1 Sign-Off"
268
+ date: "2026-W26"
269
+ color: "var(--color-link)"
270
+ tracks:
271
+ - label: "Phase 1 — Foundation"
272
+ depth: 1
273
+ start: "2026-W14"
274
+ end: "2026-W24"
275
+ status: active
276
+ - label: "Phase 2 — Integration"
277
+ depth: 1
278
+ start: "2026-W25"
279
+ end: "2026-W30"
280
+ status: planned
281
+ :::
282
+ ```
283
+
284
+ Markers are **not** subject to `max-depth` or `max-tracks` — they always render if their date is within the axis range. A marker whose date falls outside the axis produces a build-time warning and is silently omitted.
285
+
286
+ Labels default to the right of the line. Near the right edge of the chart (~85%+), labels automatically flip to the left. Keep labels short (~20 chars) — longer text is truncated with ellipsis.
287
+
288
+ `color` is optional on each marker. If provided, it tints the marker line and label. Supported values are any valid CSS color (`#hex`, `rgb(...)`, `hsl(...)`, named color, or CSS variable like `var(--color-link)`).
289
+
290
+ ## Truncation with `max-tracks`
291
+
292
+ For slides, cap the visible rows to avoid overflow:
293
+
294
+ ```markdown
295
+ :::gantt
296
+ label: "Regional Deployment"
297
+ time-unit: month
298
+ time-start: "2026-01"
299
+ time-end: "2026-12"
300
+ max-tracks: 4
301
+ tracks:
302
+
303
+ - label: "North America"
304
+ depth: 1
305
+ start: "2026-01"
306
+ end: "2026-04"
307
+ status: complete
308
+ - label: "Europe"
309
+ depth: 1
310
+ start: "2026-03"
311
+ end: "2026-06"
312
+ status: active
313
+ - label: "Asia Pacific"
314
+ depth: 1
315
+ start: "2026-05"
316
+ end: "2026-09"
317
+ status: planned
318
+ - label: "Latin America"
319
+ depth: 1
320
+ start: "2026-07"
321
+ end: "2026-10"
322
+ status: planned
323
+ - label: "Middle East"
324
+ depth: 1
325
+ start: "2026-09"
326
+ end: "2026-12"
327
+ status: planned
328
+ :::
329
+ ```
330
+
331
+ Rows 5+ are hidden and replaced with a "+1 more" indicator. `max-tracks` applies after `max-depth` filtering.
332
+
333
+ ## Cross-year ranges
334
+
335
+ Both week and month mode handle year boundaries. The axis shows the year at transitions:
336
+
337
+ ```markdown
338
+ :::gantt
339
+ label: "Multi-Year Program"
340
+ time-unit: month
341
+ time-start: "2026-10"
342
+ time-end: "2027-06"
343
+ tracks:
344
+
345
+ - label: "Phase 3 — Consolidation"
346
+ depth: 1
347
+ start: "2026-10"
348
+ end: "2027-01"
349
+ status: active
350
+ - label: "Phase 4 — Expansion"
351
+ depth: 1
352
+ start: "2027-02"
353
+ end: "2027-06"
354
+ status: planned
355
+ :::
356
+ ```
357
+
358
+ ## Today marker
359
+
360
+ The `today` parameter draws a vertical dashed line. Useful when set by a generator to the build date:
361
+
362
+ ```markdown
363
+ :::gantt
364
+ time-unit: week
365
+ time-start: "2026-W20"
366
+ time-end: "2026-W32"
367
+ today: "2026-W26"
368
+ tracks:
369
+
370
+ - label: "Current Sprint"
371
+ depth: 1
372
+ start: "2026-W24"
373
+ end: "2026-W28"
374
+ status: active
375
+ :::
376
+ ```
377
+
378
+ ## Data-driven usage
379
+
380
+ Generators can emit `:::gantt` blocks as snippets. The template author places them without understanding the data model:
381
+
382
+ ```yaml
383
+ # In a data file (e.g., data/rollout.yaml)
384
+ snippets:
385
+ - slot: "rollout-summary"
386
+ content: ":::gantt\ntime-unit: week\ntime-start: \"2026-W18\"\ntime-end: \"2026-W40\"\nmax-depth: 1\ntracks:\n - label: \"Wave 1\"\n depth: 1\n start: \"2026-W20\"\n end: \"2026-W30\"\n status: active\n:::"
387
+ ```
388
+
389
+ ```markdown
390
+ <!-- In a markdown file -->
391
+
392
+ ## Rollout Timeline
393
+
394
+ {{ snippet:rollout-summary }}
395
+ ```
396
+
397
+ ## Milestones vs markers
398
+
399
+ Both are point-in-time features — here's when to use which:
400
+
401
+ | | Milestones (`milestones:`) | Markers (`markers:`) |
402
+ | ---------------------------- | ----------------------------------------------- | ------------------------------------------------ |
403
+ | **What it draws** | Diamond icon in a single row | Vertical line spanning the full chart |
404
+ | **Where the label goes** | Left column (same as tracks) | Above the axis, next to the line |
405
+ | **Has depth?** | Yes — subject to `max-depth` | No — always visible |
406
+ | **Counted by `max-tracks`?** | Yes | No |
407
+ | **Use for** | Per-track events: "Acme go-live", "QA sign-off" | Chart-wide gates: "Go/No-Go", "Funding deadline" |
408
+
409
+ Rule of thumb: if it belongs to a specific track or wave, use a milestone. If it's a date the whole chart cares about, use a marker.
410
+
411
+ ## Edge cases and errors
412
+
413
+ Kitfly validates `:::gantt` blocks at build time. If something is wrong, `bun run build` (or `bun run dev`) fails fast with an error pointing to the file and line.
414
+
415
+ **Build errors** (block will not render):
416
+
417
+ | What you wrote | Error | Fix |
418
+ | ---------------------------------------------------------- | ------------------------- | ------------------------------------------ |
419
+ | Missing `time-unit`, `time-start`, `time-end`, or `tracks` | Required field missing | Add the field |
420
+ | `time-unit: weeks` (plural) | Invalid time-unit | Use `week` or `month` |
421
+ | `2026-14` with `time-unit: week` | Invalid time-start format | Use `2026-W14` (capital W, two-digit week) |
422
+ | `2026-4` with `time-unit: month` | Invalid time-start format | Use `2026-04` (two-digit month) |
423
+ | Week date with `time-unit: month` (or vice versa) | Format mismatch | All dates must match the `time-unit` |
424
+ | `time-start` after `time-end` | Range error | Swap them |
425
+ | Track with `start` after `end` | Range error | Swap them |
426
+ | Track missing `label`, `depth`, `start`, or `end` | Required field missing | Add the field |
427
+ | Milestone missing `label` or `date` | Required field missing | Add the field |
428
+ | Marker missing `label` or `date` | Required field missing | Add the field |
429
+
430
+ **Build warnings** (block renders, but something may look wrong):
431
+
432
+ | What you wrote | Warning | What happens |
433
+ | ------------------------------------- | ------------------------------------------------- | ----------------------------- |
434
+ | Track extends outside the axis range | "Track range is outside axis and will be clipped" | Bar clips to the visible axis |
435
+ | Milestone date outside the axis range | "Milestone date is outside axis" | Diamond not rendered |
436
+ | Marker date outside the axis range | "Marker date is outside axis" | Line and label not rendered |
437
+
438
+ **Silent defaults** (no error, no warning):
439
+
440
+ | What you wrote | What happens |
441
+ | ------------------------------------------------- | ---------------------------- |
442
+ | Omit `status` on a track | Defaults to `planned` (gray) |
443
+ | Omit `depth` on a milestone | Defaults to 1 |
444
+ | Omit `max-depth` | All depths rendered |
445
+ | Omit `max-tracks` | All rows rendered |
446
+ | Omit `milestones`, `markers`, `today`, or `label` | Feature simply absent |
447
+ | Unknown `status` value (e.g., `status: done`) | Treated as `planned` |
448
+
449
+ For the full fence contract (indentation rules, block shape, supported types), see [Plugins — planning-visuals](plugins.md#triple-colon-fence-contract-planning-visuals).
450
+
451
+ ## Quick reference
452
+
453
+ | What you want | How |
454
+ | ---------------------- | ------------------------------------------- |
455
+ | Week axis | `time-unit: week`, dates as `YYYY-Www` |
456
+ | Month axis | `time-unit: month`, dates as `YYYY-MM` |
457
+ | Title above chart | `label: "My Title"` |
458
+ | Executive summary | `max-depth: 1` |
459
+ | Detail view | `max-depth: 2` (or omit for all) |
460
+ | Cap rows for slides | `max-tracks: 6` |
461
+ | Progress marker | `today: "2026-W26"` |
462
+ | Done bar (green) | `status: complete` |
463
+ | In-progress bar (blue) | `status: active` |
464
+ | At-risk bar (amber) | `status: blocked` |
465
+ | Not started (gray) | `status: planned` (or omit) |
466
+ | Point-in-time marker | Use `milestones:` list with `date:` |
467
+ | Chart-level gate line | Use `markers:` list with `label:` + `date:` |
468
+ | Marker-specific color | Add optional `color:` per marker |
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Glossary"
3
3
  description: "Quick definitions for common Kitfly terms"
4
- last_updated: "2026-02-12"
4
+ last_updated: "2026-02-17"
5
5
  ---
6
6
 
7
7
  # Glossary
@@ -90,3 +90,27 @@ A named value provided to commands and apps by your shell or host platform (ofte
90
90
  ## Secret
91
91
 
92
92
  A sensitive value (token/key/password) that should not be committed to git and should be stored in a secret manager or environment variable.
93
+
94
+ ## Profile
95
+
96
+ A named content filter activated via `--profile` or `KITFLY_PROFILE`. Files tagged with `profile:` in frontmatter are only included when their profile is active. Enables single-source multi-audience workflows.
97
+
98
+ ## Kitsite
99
+
100
+ The workspace Kitfly renders: typically contains `site.yaml`, content files, and optional `data/` + `scripts/`.
101
+
102
+ ## Generator
103
+
104
+ A script that transforms external data into Kitfly’s file contract (usually writes `data/*.yaml` or `data/*.json`).
105
+
106
+ ## Data binding
107
+
108
+ Build-time substitution from a bound data file into markdown (`{{ key }}` and `{{ snippet:name }}`).
109
+
110
+ ## Formatter
111
+
112
+ A deterministic value transform in bindings (for example `dollar`, `number`, `percent`, `round(n)`, `upper`, `lower`).
113
+
114
+ ## Snippet
115
+
116
+ A named markdown block in a data file that can be injected with `{{ snippet:name }}`.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  title: "Key Concepts"
3
3
  description: "Mental models for how Kitfly works"
4
- last_updated: "2026-02-12"
4
+ last_updated: "2026-02-17"
5
5
  ---
6
6
 
7
7
  # Key Concepts
@@ -86,7 +86,7 @@ If you do: `theme.yaml` is your main “make it mine” knob.
86
86
  Kitfly can render the same Markdown content in two layouts:
87
87
 
88
88
  - **docs** (default): scrolling pages optimized for reading
89
- - **slides**: fixed-aspect one page at a time slides with keyboard navigation
89
+ - **slides**: fixed-aspect "one page at a time" slides with keyboard navigation
90
90
 
91
91
  Slides mode is configured in `site.yaml`:
92
92
 
@@ -95,12 +95,40 @@ mode: slides
95
95
  aspect: "16/9"
96
96
  ```
97
97
 
98
+ In both modes, organizing content into subfolders produces hierarchical sidebar navigation with collapsible groups. In slides mode, the nav links remain `#slide-N` hash anchors — the tree structure is visual grouping only.
99
+
98
100
  ## Assets
99
101
 
100
102
  Kitfly will serve and bundle common “content-adjacent” assets referenced from Markdown, like images and PDFs.
101
103
 
102
104
  Rule of thumb: if it lives next to your docs, Kitfly tries to do the right thing.
103
105
 
106
+ ## Content profiles (v0.2.3+)
107
+
108
+ Profiles let you produce multiple audience-specific outputs from a single kitsite. Tag files with `profile:` in frontmatter and activate a profile via `--profile` flag or `KITFLY_PROFILE` env var.
109
+
110
+ - Files without `profile:` are always included (the common case).
111
+ - Tagged files only appear when their profile is active.
112
+ - No active profile = only untagged content.
113
+
114
+ This is a startup parameter, not a runtime toggle — changing profiles requires restarting the dev server.
115
+
116
+ ## Data bindings (v0.2.3+)
117
+
118
+ A page can opt into build-time bindings by setting `data:` in frontmatter.
119
+
120
+ - `{{ key }}` resolves scalar values from a data file.
121
+ - `{{ snippet:name }}` injects a named markdown block.
122
+ - Formatters like `dollar`, `number`, `percent`, `round(n)`, `upper`, `lower` apply with pipe syntax.
123
+
124
+ No loops/conditionals are supported in bindings. If you need logic, use a generator script and write data files before render.
125
+
126
+ ## Pre-build hooks (v0.2.3+)
127
+
128
+ `prebuild:` commands in `site.yaml` run before `dev`, `build`, and `bundle`.
129
+
130
+ Use hooks for generators (CSV/API/etc. to `data/*.yaml` or `data/*.json`). In dev mode, hook `watch:` patterns can re-run hooks when source files change.
131
+
104
132
  ## Provenance
105
133
 
106
134
  Kitfly can emit provenance information (version/build date/git info) so you can answer “what did we ship?”.