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,179 @@
1
+ (() => {
2
+ const KIND_SET = new Set(["bar", "line", "pie"]);
3
+
4
+ function parseValue(raw) {
5
+ const v = String(raw ?? "").trim();
6
+ if (!v) return "";
7
+ if ((v.startsWith("[") && v.endsWith("]")) || (v.startsWith("{") && v.endsWith("}"))) {
8
+ try {
9
+ return JSON.parse(v);
10
+ } catch {
11
+ return v;
12
+ }
13
+ }
14
+ if (/^-?\d+(?:\.\d+)?$/.test(v)) return Number(v);
15
+ const m = v.match(/^"(.*)"$/) || v.match(/^'(.*)'$/);
16
+ return m ? m[1] : v;
17
+ }
18
+
19
+ function parseSpec(text) {
20
+ const out = {};
21
+ const lines = String(text ?? "").split(/\r?\n/);
22
+ for (const raw of lines) {
23
+ const line = raw.trim();
24
+ if (!line || line.startsWith("#")) continue;
25
+ const kv = line.match(/^([a-z0-9_-]+)\s*:\s*(.*)$/i);
26
+ if (!kv) continue;
27
+ out[kv[1]] = parseValue(kv[2]);
28
+ }
29
+
30
+ const kind = String(out.kind || "").toLowerCase();
31
+ const labels = Array.isArray(out.labels) ? out.labels.map((x) => String(x ?? "")) : [];
32
+ const data = Array.isArray(out.data)
33
+ ? out.data
34
+ .map((x) => Number(x))
35
+ .filter((n) => Number.isFinite(n))
36
+ : [];
37
+
38
+ if (!KIND_SET.has(kind)) return null;
39
+ if (!labels.length || !data.length || labels.length !== data.length) return null;
40
+
41
+ const height = typeof out.height === "number" && Number.isFinite(out.height) ? out.height : 300;
42
+ const color = typeof out.color === "string" ? out.color.trim().toLowerCase() : "primary";
43
+ const title = typeof out.title === "string" ? out.title : "";
44
+
45
+ return {
46
+ kind,
47
+ labels,
48
+ data,
49
+ title,
50
+ color,
51
+ height: Math.max(160, Math.min(640, Math.round(height))),
52
+ };
53
+ }
54
+
55
+ function pickThemeColor(hint) {
56
+ const style = getComputedStyle(document.documentElement);
57
+ const map = {
58
+ primary: style.getPropertyValue("--color-primary").trim() || "#2563eb",
59
+ accent: style.getPropertyValue("--color-accent").trim() || "#f59e0b",
60
+ muted: style.getPropertyValue("--color-text-muted")?.trim() || "#6b7280",
61
+ text: style.getPropertyValue("--color-text")?.trim() || "#111827",
62
+ border: style.getPropertyValue("--color-border")?.trim() || "#d1d5db",
63
+ surface: style.getPropertyValue("--color-surface")?.trim() || "#f9fafb",
64
+ };
65
+ return map[hint] || map.primary;
66
+ }
67
+
68
+ function configFromSpec(spec) {
69
+ const base = pickThemeColor(spec.color);
70
+ const isPie = spec.kind === "pie";
71
+ const bg = isPie
72
+ ? spec.labels.map((_, i) => `color-mix(in srgb, ${base} ${Math.max(20, 90 - i * 12)}%, white)`)
73
+ : base;
74
+
75
+ return {
76
+ type: spec.kind,
77
+ data: {
78
+ labels: spec.labels,
79
+ datasets: [
80
+ {
81
+ label: spec.title || "Series",
82
+ data: spec.data,
83
+ backgroundColor: bg,
84
+ borderColor: base,
85
+ borderWidth: 2,
86
+ tension: spec.kind === "line" ? 0.25 : 0,
87
+ fill: spec.kind === "line" ? false : true,
88
+ },
89
+ ],
90
+ },
91
+ options: {
92
+ responsive: true,
93
+ maintainAspectRatio: false,
94
+ plugins: {
95
+ legend: { display: spec.kind === "pie", labels: { color: pickThemeColor("text") } },
96
+ title: { display: Boolean(spec.title), text: spec.title, color: pickThemeColor("text") },
97
+ },
98
+ scales:
99
+ spec.kind === "pie"
100
+ ? undefined
101
+ : {
102
+ x: { ticks: { color: pickThemeColor("text") }, grid: { color: pickThemeColor("border") } },
103
+ y: { ticks: { color: pickThemeColor("text") }, grid: { color: pickThemeColor("border") } },
104
+ },
105
+ },
106
+ };
107
+ }
108
+
109
+ function renderWrapper(wrapper, spec) {
110
+ let canvas = wrapper.querySelector("canvas");
111
+ if (!canvas) {
112
+ canvas = document.createElement("canvas");
113
+ wrapper.appendChild(canvas);
114
+ }
115
+ wrapper.style.height = `${spec.height}px`;
116
+ if (wrapper.__kitflyChart && typeof wrapper.__kitflyChart.destroy === "function") {
117
+ wrapper.__kitflyChart.destroy();
118
+ }
119
+ wrapper.__kitflyChart = new window.Chart(canvas, configFromSpec(spec));
120
+ }
121
+
122
+ function transformCodeBlock(code) {
123
+ const pre = code.parentElement;
124
+ if (!pre || pre.tagName !== "PRE") return;
125
+ const spec = parseSpec(code.textContent || "");
126
+ if (!spec) {
127
+ console.warn("[kitfly:slides-charts-lite] Invalid chart block, leaving as code");
128
+ return;
129
+ }
130
+
131
+ const wrapper = document.createElement("div");
132
+ wrapper.className = "kitfly-chart-wrapper";
133
+ wrapper.setAttribute("data-kitfly-chart-spec", JSON.stringify(spec));
134
+ pre.replaceWith(wrapper);
135
+ renderWrapper(wrapper, spec);
136
+ }
137
+
138
+ function renderAll() {
139
+ if (!window.Chart) {
140
+ console.warn("[kitfly:slides-charts-lite] Chart.js unavailable");
141
+ return;
142
+ }
143
+
144
+ const styleId = "kitfly-charts-lite-style";
145
+ if (!document.getElementById(styleId)) {
146
+ const style = document.createElement("style");
147
+ style.id = styleId;
148
+ style.textContent = ".kitfly-chart-wrapper{position:relative;width:100%;max-width:100%;margin:1rem 0}";
149
+ document.head.appendChild(style);
150
+ }
151
+
152
+ document.querySelectorAll("pre > code.language-chart").forEach(transformCodeBlock);
153
+ }
154
+
155
+ function reinitCharts() {
156
+ document.querySelectorAll(".kitfly-chart-wrapper[data-kitfly-chart-spec]").forEach((wrapper) => {
157
+ const raw = wrapper.getAttribute("data-kitfly-chart-spec") || "";
158
+ try {
159
+ const spec = JSON.parse(raw);
160
+ renderWrapper(wrapper, spec);
161
+ } catch {
162
+ // ignore broken metadata
163
+ }
164
+ });
165
+ }
166
+
167
+ if (typeof document === "undefined") {
168
+ globalThis.__kitflyChartsLiteTest = { parseSpec };
169
+ return;
170
+ }
171
+
172
+ window.reinitCharts = reinitCharts;
173
+
174
+ if (document.readyState === "loading") {
175
+ document.addEventListener("DOMContentLoaded", renderAll);
176
+ } else {
177
+ renderAll();
178
+ }
179
+ })();