kitfly 0.1.2 → 0.2.1

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 (209) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +63 -16
  3. package/VERSION +1 -1
  4. package/dist/_raw/content/deployment/preflight.md +134 -0
  5. package/dist/_raw/content/deployment/recipes/aws-s3.md +128 -0
  6. package/dist/_raw/content/deployment/recipes/cloudflare-pages.md +73 -0
  7. package/dist/_raw/content/deployment/recipes/cloudflare-r2.md +156 -0
  8. package/dist/_raw/content/deployment/recipes/fly-io.md +57 -0
  9. package/dist/_raw/content/deployment/recipes/github-pages.md +112 -0
  10. package/dist/_raw/content/deployment/recipes/netlify.md +99 -0
  11. package/dist/_raw/content/deployment/recipes/vercel.md +88 -0
  12. package/dist/_raw/content/deployment/secrets-and-env-vars.md +75 -0
  13. package/dist/_raw/content/deployment.md +128 -0
  14. package/dist/_raw/content/guide/approaches.md +182 -0
  15. package/dist/_raw/content/guide/features.md +121 -0
  16. package/dist/_raw/content/guide/getting-started.md +112 -0
  17. package/dist/_raw/content/guide/kitfly-overview.md +209 -0
  18. package/dist/_raw/content/reference/configuration.md +259 -0
  19. package/dist/_raw/content/reference/design-catalog.md +167 -0
  20. package/dist/_raw/content/reference/environment-variables.md +66 -0
  21. package/dist/_raw/content/reference/glossary.md +92 -0
  22. package/dist/_raw/content/reference/key-concepts.md +118 -0
  23. package/dist/_raw/content/reference/plugins.md +220 -0
  24. package/dist/_raw/content/reference/slides-authoring-guidelines.md +129 -0
  25. package/dist/_raw/content/reference/structure.md +166 -0
  26. package/dist/_raw/content/reference.md +20 -0
  27. package/dist/_raw/content/templates/crucible.md +192 -0
  28. package/dist/_raw/content/templates/handbook.md +83 -0
  29. package/dist/_raw/content/templates/minimal.md +138 -0
  30. package/dist/_raw/content/templates/overview.md +187 -0
  31. package/dist/_raw/content/templates/pipeline.md +151 -0
  32. package/dist/_raw/content/templates/productbook.md +187 -0
  33. package/dist/_raw/content/templates/runbook.md +193 -0
  34. package/dist/_raw/content/templates/servicebook.md +163 -0
  35. package/dist/_raw/docs/decisions/ADR-0001-minimalist-site-code.md +118 -0
  36. package/dist/_raw/docs/decisions/ADR-0002-ai-accessibility.md +153 -0
  37. package/dist/_raw/docs/decisions/ADR-0003-single-file-bundle.md +93 -0
  38. package/dist/_raw/docs/decisions/ADR-0004-bun-runtime.md +98 -0
  39. package/dist/_raw/docs/decisions/ADR-0005-plugin-contract-and-distribution.md +110 -0
  40. package/dist/_raw/docs/decisions/DDR-0001-viewport-locked-layout.md +111 -0
  41. package/dist/_raw/docs/decisions/DDR-0002-theme-system.md +131 -0
  42. package/dist/_raw/docs/decisions/DDR-0003-bounded-logo-slot.md +106 -0
  43. package/dist/_raw/docs/decisions/DDR-0004-slides-rendering-model.md +113 -0
  44. package/dist/_raw/docs/decisions/DDR-0005-deterministic-layout-boundary.md +107 -0
  45. package/dist/_raw/docs/userguide/cli/build.md +85 -0
  46. package/dist/_raw/docs/userguide/cli/bundle.md +81 -0
  47. package/dist/_raw/docs/userguide/cli/dev.md +92 -0
  48. package/dist/_raw/docs/userguide/cli/init.md +116 -0
  49. package/dist/_raw/docs/userguide/cli/servers.md +69 -0
  50. package/dist/_raw/docs/userguide/cli/stop.md +76 -0
  51. package/dist/_raw/docs/userguide/cli/update.md +78 -0
  52. package/dist/_raw/docs/userguide/cli/version.md +65 -0
  53. package/dist/_raw/docs/userguide/cli.md +34 -0
  54. package/dist/_raw/docs/userguide/sharing.md +94 -0
  55. package/dist/_raw/schemas/plugin-schemas-notes.md +71 -0
  56. package/dist/_raw/schemas.md +42 -0
  57. package/dist/assets/brand/kitfly-favicon-32.png +0 -0
  58. package/dist/assets/brand/kitfly-icon-64.png +0 -0
  59. package/dist/assets/brand/kitfly-logo-128.png +0 -0
  60. package/dist/assets/brand/kitfly-logo-512.png +0 -0
  61. package/dist/assets/brand/kitfly-logo.svg +12132 -0
  62. package/dist/assets/brand/kitfly-neon-128.png +0 -0
  63. package/dist/assets/brand/kitfly-neon-192.png +0 -0
  64. package/dist/assets/brand/kitfly-neon-256.png +0 -0
  65. package/dist/assets/brand/kitfly-neon.png +0 -0
  66. package/dist/assets/brand/palette.md +75 -0
  67. package/dist/content/deployment/index.html +11 -0
  68. package/dist/content/deployment/preflight.html +418 -0
  69. package/dist/content/deployment/recipes/aws-s3.html +421 -0
  70. package/dist/content/deployment/recipes/cloudflare-pages.html +372 -0
  71. package/dist/content/deployment/recipes/cloudflare-r2.html +443 -0
  72. package/dist/content/deployment/recipes/fly-io.html +356 -0
  73. package/dist/content/deployment/recipes/github-pages.html +414 -0
  74. package/dist/content/deployment/recipes/index.html +11 -0
  75. package/dist/content/deployment/recipes/netlify.html +394 -0
  76. package/dist/content/deployment/recipes/vercel.html +382 -0
  77. package/dist/content/deployment/secrets-and-env-vars.html +380 -0
  78. package/dist/content/deployment.html +426 -0
  79. package/dist/content/guide/approaches.html +501 -0
  80. package/dist/content/guide/features.html +436 -0
  81. package/dist/content/guide/getting-started.html +403 -0
  82. package/dist/content/guide/index.html +11 -0
  83. package/dist/content/guide/kitfly-overview.html +544 -0
  84. package/dist/content/index.html +11 -0
  85. package/dist/content/reference/configuration.html +580 -0
  86. package/dist/content/reference/design-catalog.html +449 -0
  87. package/dist/content/reference/environment-variables.html +367 -0
  88. package/dist/content/reference/glossary.html +368 -0
  89. package/dist/content/reference/index.html +11 -0
  90. package/dist/content/reference/key-concepts.html +399 -0
  91. package/dist/content/reference/plugins.html +491 -0
  92. package/dist/content/reference/slides-authoring-guidelines.html +418 -0
  93. package/dist/content/reference/structure.html +463 -0
  94. package/dist/content/reference.html +335 -0
  95. package/dist/content/templates/crucible.html +546 -0
  96. package/dist/content/templates/handbook.html +405 -0
  97. package/dist/content/templates/index.html +11 -0
  98. package/dist/content/templates/minimal.html +447 -0
  99. package/dist/content/templates/overview.html +558 -0
  100. package/dist/content/templates/pipeline.html +494 -0
  101. package/dist/content/templates/productbook.html +540 -0
  102. package/dist/content/templates/runbook.html +543 -0
  103. package/dist/content/templates/servicebook.html +523 -0
  104. package/dist/content-index.json +549 -0
  105. package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +491 -0
  106. package/dist/docs/decisions/ADR-0002-ai-accessibility.html +434 -0
  107. package/dist/docs/decisions/ADR-0003-single-file-bundle.html +412 -0
  108. package/dist/docs/decisions/ADR-0004-bun-runtime.html +409 -0
  109. package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +402 -0
  110. package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +459 -0
  111. package/dist/docs/decisions/DDR-0002-theme-system.html +452 -0
  112. package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +423 -0
  113. package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +399 -0
  114. package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +422 -0
  115. package/dist/docs/decisions/index.html +11 -0
  116. package/dist/docs/userguide/cli/build.html +408 -0
  117. package/dist/docs/userguide/cli/bundle.html +419 -0
  118. package/dist/docs/userguide/cli/dev.html +428 -0
  119. package/dist/docs/userguide/cli/index.html +11 -0
  120. package/dist/docs/userguide/cli/init.html +436 -0
  121. package/dist/docs/userguide/cli/servers.html +393 -0
  122. package/dist/docs/userguide/cli/stop.html +408 -0
  123. package/dist/docs/userguide/cli/update.html +406 -0
  124. package/dist/docs/userguide/cli/version.html +406 -0
  125. package/dist/docs/userguide/cli.html +386 -0
  126. package/dist/docs/userguide/index.html +11 -0
  127. package/dist/docs/userguide/sharing.html +465 -0
  128. package/dist/index.html +387 -0
  129. package/dist/llms.txt +18 -0
  130. package/dist/provenance.json +7 -0
  131. package/dist/schemas/index.html +11 -0
  132. package/dist/schemas/plugin-registry.schema.html +327 -0
  133. package/dist/schemas/plugin-schemas-notes.html +364 -0
  134. package/dist/schemas/plugin.schema.html +327 -0
  135. package/dist/schemas/plugins.schema.html +327 -0
  136. package/dist/schemas/v0/common.schema.html +386 -0
  137. package/dist/schemas/v0/index.html +11 -0
  138. package/dist/schemas/v0/plugin-registry.schema.html +547 -0
  139. package/dist/schemas/v0/plugin.schema.html +497 -0
  140. package/dist/schemas/v0/plugins.schema.html +406 -0
  141. package/dist/schemas/v0/site.schema.html +541 -0
  142. package/dist/schemas/v0/theme.schema.html +615 -0
  143. package/dist/schemas.html +351 -0
  144. package/dist/styles.css +1262 -0
  145. package/package.json +4 -2
  146. package/plugins-dist/callouts.css +32 -0
  147. package/plugins-dist/callouts.js +46 -0
  148. package/plugins-dist/slides-visuals.css +390 -0
  149. package/plugins-dist/slides-visuals.js +689 -0
  150. package/registry/plugins.yaml +35 -0
  151. package/schemas/README.md +10 -0
  152. package/schemas/plugin-registry.schema.json +5 -0
  153. package/schemas/plugin-schemas-notes.md +71 -0
  154. package/schemas/plugin.schema.json +5 -0
  155. package/schemas/plugins.schema.json +5 -0
  156. package/schemas/v0/common.schema.json +64 -0
  157. package/schemas/v0/plugin-registry.schema.json +225 -0
  158. package/schemas/v0/plugin.schema.json +175 -0
  159. package/schemas/v0/plugins.schema.json +84 -0
  160. package/schemas/v0/site.schema.json +56 -9
  161. package/schemas/v0/theme.schema.json +105 -22
  162. package/scripts/build.ts +158 -3
  163. package/scripts/bundle.ts +261 -95
  164. package/scripts/dev.ts +301 -11
  165. package/src/__tests__/build.test.ts +220 -1
  166. package/src/__tests__/bundle.test.ts +31 -0
  167. package/src/__tests__/cli.test.ts +14 -3
  168. package/src/__tests__/dev-plugin-errors.test.ts +20 -0
  169. package/src/__tests__/fixtures/fences/slides-visuals/invalid/bad-list-indent.md +5 -0
  170. package/src/__tests__/fixtures/fences/slides-visuals/invalid/blank-line.md +5 -0
  171. package/src/__tests__/fixtures/fences/slides-visuals/invalid/compare-object-items.md +9 -0
  172. package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-branching-no-source.md +5 -0
  173. package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-converging-no-target.md +6 -0
  174. package/src/__tests__/fixtures/fences/slides-visuals/invalid/indented-fence.md +4 -0
  175. package/src/__tests__/fixtures/fences/slides-visuals/invalid/staircase-empty-steps.md +3 -0
  176. package/src/__tests__/fixtures/fences/slides-visuals/invalid/stat-grid-missing-fields.md +5 -0
  177. package/src/__tests__/fixtures/fences/slides-visuals/invalid/timeline-horizontal-no-events.md +2 -0
  178. package/src/__tests__/fixtures/fences/slides-visuals/invalid/unknown-type.md +3 -0
  179. package/src/__tests__/fixtures/fences/slides-visuals/valid/compare.md +10 -0
  180. package/src/__tests__/fixtures/fences/slides-visuals/valid/comparison-table.md +14 -0
  181. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching-no-split.md +7 -0
  182. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching.md +8 -0
  183. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging-no-merge.md +7 -0
  184. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging.md +8 -0
  185. package/src/__tests__/fixtures/fences/slides-visuals/valid/funnel.md +7 -0
  186. package/src/__tests__/fixtures/fences/slides-visuals/valid/kpi.md +5 -0
  187. package/src/__tests__/fixtures/fences/slides-visuals/valid/layer-cake.md +6 -0
  188. package/src/__tests__/fixtures/fences/slides-visuals/valid/pyramid.md +6 -0
  189. package/src/__tests__/fixtures/fences/slides-visuals/valid/quadrant-grid.md +8 -0
  190. package/src/__tests__/fixtures/fences/slides-visuals/valid/scorecard.md +13 -0
  191. package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase-down.md +7 -0
  192. package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase.md +8 -0
  193. package/src/__tests__/fixtures/fences/slides-visuals/valid/stat-grid.md +8 -0
  194. package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-horizontal.md +9 -0
  195. package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-vertical.md +10 -0
  196. package/src/__tests__/init.test.ts +35 -0
  197. package/src/__tests__/plugin-loader.test.ts +221 -0
  198. package/src/__tests__/shared.test.ts +451 -0
  199. package/src/__tests__/slides-visuals-fence-contract.test.ts +28 -0
  200. package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +147 -0
  201. package/src/__tests__/styles.test.ts +35 -0
  202. package/src/cli.ts +9 -4
  203. package/src/plugin-loader.ts +245 -0
  204. package/src/shared.ts +650 -7
  205. package/src/site/styles.css +331 -0
  206. package/src/site/template.html +66 -5
  207. package/src/templates/deck.ts +186 -0
  208. package/src/templates/driver.ts +11 -1
  209. package/src/templates/minimal.ts +1 -0
@@ -0,0 +1,465 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Sharing Your Docs - Kitfly Docs</title>
7
+ <link rel="icon" type="image/png" sizes="32x32" href="../../assets/brand/kitfly-favicon-32.png">
8
+ <link rel="icon" type="image/png" sizes="64x64" href="../../assets/brand/kitfly-neon-256.png">
9
+ <link rel="stylesheet" href="../../styles.css">
10
+ <style id="kitfly-theme">
11
+ :root { --color-bg: #ffffff;
12
+ --color-bg-sidebar: #f5f7f8;
13
+ --color-text: #374151;
14
+ --color-text-muted: #6b7280;
15
+ --color-border: #e5e7eb;
16
+ --color-link: #007182;
17
+ --color-link-hover: #0a6172;
18
+ --color-accent: #152F46;
19
+ --color-code-bg: #f5f7f8;
20
+ --color-logo: #152F46;
21
+ --sidebar-width: 280px;
22
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
23
+ --font-headings: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
24
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; }
25
+ html { font-size: 16px; }
26
+ @media (prefers-color-scheme: dark) {
27
+ :root:not([data-theme="light"]) { --color-bg: #0d1117;
28
+ --color-bg-sidebar: #152F46;
29
+ --color-text: #e5e7eb;
30
+ --color-text-muted: #9ca3af;
31
+ --color-border: #374151;
32
+ --color-link: #709EA6;
33
+ --color-link-hover: #8fb5bc;
34
+ --color-accent: #f9fafb;
35
+ --color-code-bg: #152F46;
36
+ --color-logo: #f9fafb; }
37
+ }
38
+ [data-theme="dark"] { --color-bg: #0d1117;
39
+ --color-bg-sidebar: #152F46;
40
+ --color-text: #e5e7eb;
41
+ --color-text-muted: #9ca3af;
42
+ --color-border: #374151;
43
+ --color-link: #709EA6;
44
+ --color-link-hover: #8fb5bc;
45
+ --color-accent: #f9fafb;
46
+ --color-code-bg: #152F46;
47
+ --color-logo: #f9fafb; }
48
+ [data-theme="light"] { --color-bg: #ffffff;
49
+ --color-bg-sidebar: #f5f7f8;
50
+ --color-text: #374151;
51
+ --color-text-muted: #6b7280;
52
+ --color-border: #e5e7eb;
53
+ --color-link: #007182;
54
+ --color-link-hover: #0a6172;
55
+ --color-accent: #152F46;
56
+ --color-code-bg: #f5f7f8;
57
+ --color-logo: #152F46;
58
+ --sidebar-width: 280px;
59
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
60
+ --font-headings: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
61
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; }
62
+ </style>
63
+ <!-- Syntax highlighting - Prism.js -->
64
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism.min.css" id="prism-light">
65
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism-okaidia.min.css" id="prism-dark" disabled>
66
+
67
+ <script>
68
+ // Apply saved theme immediately to prevent flash
69
+ (function() {
70
+ const saved = localStorage.getItem('theme');
71
+ if (saved) {
72
+ document.documentElement.setAttribute('data-theme', saved);
73
+ }
74
+ // Set Prism theme based on saved or system preference
75
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
76
+ const isDark = saved === 'dark' || (!saved && prefersDark);
77
+ if (isDark) {
78
+ document.getElementById('prism-light')?.setAttribute('disabled', '');
79
+ document.getElementById('prism-dark')?.removeAttribute('disabled');
80
+ }
81
+ })();
82
+ </script>
83
+ </head>
84
+ <body class="mode-docs">
85
+ <div class="mobile-header">
86
+ <button class="nav-toggle" onclick="toggleNav()" aria-label="Toggle navigation">
87
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
88
+ <path d="M3 12h18M3 6h18M3 18h18"/>
89
+ </svg>
90
+ </button>
91
+ <a href="../../" class="mobile-logo" title="Home" data-initial="K">
92
+ <img src="../../assets/brand/kitfly-neon-256.png" alt="Kitfly" class="logo-img logo-icon" onerror="this.onerror=null;this.style.display='none';this.parentElement.classList.add('logo-fallback')"/>
93
+ </a>
94
+ <button class="mobile-theme-toggle" onclick="toggleTheme()" title="Toggle theme" aria-label="Toggle theme">
95
+ <svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
96
+ <circle cx="12" cy="12" r="5"/>
97
+ <path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/>
98
+ </svg>
99
+ <svg class="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
100
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
101
+ </svg>
102
+ </button>
103
+ </div>
104
+ <div class="layout">
105
+ <nav class="sidebar">
106
+ <div class="sidebar-header">
107
+ <div class="logo logo-icon">
108
+ <a href="/" class="logo-icon" data-initial="K">
109
+ <img src="../../assets/brand/kitfly-neon-256.png" alt="Kitfly" class="logo-img" onerror="this.onerror=null;this.style.display='none';this.parentElement.classList.add('logo-fallback')"/>
110
+ </a>
111
+ <span class="logo-text">
112
+ <a href="/" class="brand">Kitfly</a>
113
+ <a href="../../" class="product">Kitfly Docs</a>
114
+ </span>
115
+ </div>
116
+ <div class="header-tools">
117
+ <button class="theme-toggle" onclick="toggleTheme()" title="Toggle theme" aria-label="Toggle theme">
118
+ <svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
119
+ <circle cx="12" cy="12" r="5"/>
120
+ <path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/>
121
+ </svg>
122
+ <svg class="icon-moon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
123
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
124
+ </svg>
125
+ </button>
126
+ <div class="sidebar-meta">
127
+ <span class="meta-version">v0.2.1</span>
128
+ <span class="meta-branch">HEAD</span>
129
+ </div>
130
+ </div>
131
+ </div>
132
+ <div class="sidebar-nav">
133
+ <ul><li><a href="../../index.html" class="nav-home">Home</a></li><li><span class="nav-section">Guide</span><ul><li><a href="../../content/guide/approaches.html">approaches</a></li><li><a href="../../content/guide/features.html">features</a></li><li><a href="../../content/guide/getting-started.html">getting-started</a></li><li><a href="../../content/guide/kitfly-overview.html">kitfly-overview</a></li></ul></li><li><span class="nav-section">Templates</span><ul><li><a href="../../content/templates/crucible.html">crucible</a></li><li><a href="../../content/templates/handbook.html">handbook</a></li><li><a href="../../content/templates/minimal.html">minimal</a></li><li><a href="../../content/templates/overview.html">overview</a></li><li><a href="../../content/templates/pipeline.html">pipeline</a></li><li><a href="../../content/templates/productbook.html">productbook</a></li><li><a href="../../content/templates/runbook.html">runbook</a></li><li><a href="../../content/templates/servicebook.html">servicebook</a></li></ul></li><li><a href="../../content/reference.html" class="nav-section">Reference</a><ul><li><a href="../../content/reference/configuration.html">configuration</a></li><li><a href="../../content/reference/design-catalog.html">design-catalog</a></li><li><a href="../../content/reference/environment-variables.html">environment-variables</a></li><li><a href="../../content/reference/glossary.html">glossary</a></li><li><a href="../../content/reference/key-concepts.html">key-concepts</a></li><li><a href="../../content/reference/plugins.html">plugins</a></li><li><a href="../../content/reference/slides-authoring-guidelines.html">slides-authoring-guidelines</a></li><li><a href="../../content/reference/structure.html">structure</a></li></ul></li><li><a href="../../content/deployment.html" class="nav-section">Deployment</a><ul><li><a href="../../content/deployment/preflight.html">preflight</a></li><li><details><summary class="nav-group">recipes</summary><ul><li><a href="../../content/deployment/recipes/aws-s3.html">aws-s3</a></li><li><a href="../../content/deployment/recipes/cloudflare-pages.html">cloudflare-pages</a></li><li><a href="../../content/deployment/recipes/cloudflare-r2.html">cloudflare-r2</a></li><li><a href="../../content/deployment/recipes/fly-io.html">fly-io</a></li><li><a href="../../content/deployment/recipes/github-pages.html">github-pages</a></li><li><a href="../../content/deployment/recipes/netlify.html">netlify</a></li><li><a href="../../content/deployment/recipes/vercel.html">vercel</a></li></ul></details></li><li><a href="../../content/deployment/secrets-and-env-vars.html">secrets-and-env-vars</a></li></ul></li><li><span class="nav-section">User Guide</span><ul><li><details><summary class="nav-group"><a href="../../docs/userguide/cli.html">cli</a></summary><ul><li><a href="../../docs/userguide/cli/build.html">build</a></li><li><a href="../../docs/userguide/cli/bundle.html">bundle</a></li><li><a href="../../docs/userguide/cli/dev.html">dev</a></li><li><a href="../../docs/userguide/cli/init.html">init</a></li><li><a href="../../docs/userguide/cli/servers.html">servers</a></li><li><a href="../../docs/userguide/cli/stop.html">stop</a></li><li><a href="../../docs/userguide/cli/update.html">update</a></li><li><a href="../../docs/userguide/cli/version.html">version</a></li></ul></details></li><li><a href="../../docs/userguide/sharing.html" class="active">sharing</a></li></ul></li><li><span class="nav-section">Decisions</span><ul><li><a href="../../docs/decisions/ADR-0001-minimalist-site-code.html">ADR-0001-minimalist-site-code</a></li><li><a href="../../docs/decisions/ADR-0002-ai-accessibility.html">ADR-0002-ai-accessibility</a></li><li><a href="../../docs/decisions/ADR-0003-single-file-bundle.html">ADR-0003-single-file-bundle</a></li><li><a href="../../docs/decisions/ADR-0004-bun-runtime.html">ADR-0004-bun-runtime</a></li><li><a href="../../docs/decisions/ADR-0005-plugin-contract-and-distribution.html">ADR-0005-plugin-contract-and-distribution</a></li><li><a href="../../docs/decisions/DDR-0001-viewport-locked-layout.html">DDR-0001-viewport-locked-layout</a></li><li><a href="../../docs/decisions/DDR-0002-theme-system.html">DDR-0002-theme-system</a></li><li><a href="../../docs/decisions/DDR-0003-bounded-logo-slot.html">DDR-0003-bounded-logo-slot</a></li><li><a href="../../docs/decisions/DDR-0004-slides-rendering-model.html">DDR-0004-slides-rendering-model</a></li><li><a href="../../docs/decisions/DDR-0005-deterministic-layout-boundary.html">DDR-0005-deterministic-layout-boundary</a></li></ul></li><li><a href="../../schemas.html" class="nav-section">Schemas</a><ul><li><a href="../../schemas/plugin-registry.schema.html">plugin-registry.schema</a></li><li><a href="../../schemas/plugin-schemas-notes.html">plugin-schemas-notes</a></li><li><a href="../../schemas/plugin.schema.html">plugin.schema</a></li><li><a href="../../schemas/plugins.schema.html">plugins.schema</a></li><li><details><summary class="nav-group">v0</summary><ul><li><a href="../../schemas/v0/common.schema.html">common.schema</a></li><li><a href="../../schemas/v0/plugin-registry.schema.html">plugin-registry.schema</a></li><li><a href="../../schemas/v0/plugin.schema.html">plugin.schema</a></li><li><a href="../../schemas/v0/plugins.schema.html">plugins.schema</a></li><li><a href="../../schemas/v0/site.schema.html">site.schema</a></li><li><a href="../../schemas/v0/theme.schema.html">theme.schema</a></li></ul></details></li></ul></li></ul>
134
+ </div>
135
+ </nav>
136
+ <main class="content">
137
+ <article class="prose">
138
+ <nav class="breadcrumbs"><a href="../../docs/userguide/cli/build.html">Docs</a><span class="separator">›</span><a href="../../docs/userguide/cli/build.html">Userguide</a><span class="separator">›</span><span>sharing</span></nav>
139
+ <div class="page-meta">Last updated: 2026-02-09</div>
140
+ <h1 id="sharing-your-docs">Sharing Your Docs</h1>
141
+ <p>Kitfly has two export modes that serve different sharing needs.</p>
142
+ <h2 id="send-it-single-html-file">Send It — Single HTML File</h2>
143
+ <p>Use <code>kitfly bundle</code> when you need to share docs without hosting.</p>
144
+ <pre><code class="language-bash">kitfly bundle --name my-docs.html
145
+ </code></pre>
146
+ <p>This produces one self-contained HTML file with everything inlined: content, styles, images (as base64), syntax highlighting, and diagrams. No server needed — just open the file.</p>
147
+ <h3 id="when-to-use-bundle">When to use bundle</h3>
148
+ <table>
149
+ <thead>
150
+ <tr>
151
+ <th>Scenario</th>
152
+ <th>Example</th>
153
+ </tr>
154
+ </thead>
155
+ <tbody><tr>
156
+ <td>Email attachment</td>
157
+ <td>Send docs to a client or reviewer</td>
158
+ </tr>
159
+ <tr>
160
+ <td>Slack/Teams upload</td>
161
+ <td>Drop into a channel for quick reference</td>
162
+ </tr>
163
+ <tr>
164
+ <td>Shared drive</td>
165
+ <td>Put on Google Drive, Dropbox, OneDrive</td>
166
+ </tr>
167
+ <tr>
168
+ <td>USB/offline handoff</td>
169
+ <td>Works without internet</td>
170
+ </tr>
171
+ <tr>
172
+ <td>Review cycle</td>
173
+ <td>Stakeholders open in any browser</td>
174
+ </tr>
175
+ <tr>
176
+ <td>Archival</td>
177
+ <td>Point-in-time snapshot of your docs</td>
178
+ </tr>
179
+ </tbody></table>
180
+ <h3 id="bundle-tips">Bundle tips</h3>
181
+ <ul>
182
+ <li><strong>File size</strong>: Typical docs produce 100KB–1MB bundles. Image-heavy sites will be larger (base64 adds ~33% overhead per image).</li>
183
+ <li><strong>Custom name</strong>: Use <code>--name</code> to give the file a meaningful name for recipients (<code>--name q1-review.html</code>).</li>
184
+ <li><strong>Strip raw markdown</strong>: Use <code>--no-raw</code> if you don&#39;t want source <code>.md</code> accessible inside the bundle.</li>
185
+ </ul>
186
+ <h2 id="host-it-static-site">Host It — Static Site</h2>
187
+ <p>Use <code>kitfly build</code> when you want to deploy to a web server.</p>
188
+ <pre><code class="language-bash">kitfly build --out ./dist
189
+ </code></pre>
190
+ <p>This produces a <code>dist/</code> directory with standard HTML, CSS, and assets. Deploy it anywhere that serves static files.</p>
191
+ <h3 id="deployment-targets">Deployment targets</h3>
192
+ <table>
193
+ <thead>
194
+ <tr>
195
+ <th>Platform</th>
196
+ <th>How</th>
197
+ </tr>
198
+ </thead>
199
+ <tbody><tr>
200
+ <td><strong>GitHub Pages</strong></td>
201
+ <td>Push <code>dist/</code> to <code>gh-pages</code> branch or configure Pages to serve from a folder</td>
202
+ </tr>
203
+ <tr>
204
+ <td><strong>Netlify</strong></td>
205
+ <td>Set build command to <code>kitfly build</code>, publish directory to <code>dist</code></td>
206
+ </tr>
207
+ <tr>
208
+ <td><strong>Vercel</strong></td>
209
+ <td>Same pattern — build command + output directory</td>
210
+ </tr>
211
+ <tr>
212
+ <td><strong>AWS S3</strong></td>
213
+ <td>Sync <code>dist/</code> to an S3 bucket with static hosting enabled</td>
214
+ </tr>
215
+ <tr>
216
+ <td><strong>Any web server</strong></td>
217
+ <td>Copy <code>dist/</code> contents to your server&#39;s document root</td>
218
+ </tr>
219
+ <tr>
220
+ <td><strong>Local preview</strong></td>
221
+ <td><code>open dist/index.html</code> in your browser</td>
222
+ </tr>
223
+ </tbody></table>
224
+ <h3 id="build-tips">Build tips</h3>
225
+ <ul>
226
+ <li><strong>Custom output</strong>: <code>--out ./public</code> if your host expects a different directory name.</li>
227
+ <li><strong>Raw markdown included</strong>: By default, <code>.md</code> source files are copied alongside HTML for transparency. Use <code>--no-raw</code> to exclude them.</li>
228
+ <li><strong>AI accessibility</strong>: Build output includes <code>content-index.json</code>, <code>llms.txt</code>, and a <code>_raw/</code> directory so AI agents can read your docs. Use <code>--no-raw</code> to opt out.</li>
229
+ </ul>
230
+ <h2 id="choosing-between-bundle-and-build">Choosing Between Bundle and Build</h2>
231
+ <table>
232
+ <thead>
233
+ <tr>
234
+ <th>Need</th>
235
+ <th>Use</th>
236
+ </tr>
237
+ </thead>
238
+ <tbody><tr>
239
+ <td>Share with one person</td>
240
+ <td><code>bundle</code></td>
241
+ </tr>
242
+ <tr>
243
+ <td>Share with a team (no server)</td>
244
+ <td><code>bundle</code></td>
245
+ </tr>
246
+ <tr>
247
+ <td>Publish to the web</td>
248
+ <td><code>build</code></td>
249
+ </tr>
250
+ <tr>
251
+ <td>Need search engine indexing</td>
252
+ <td><code>build</code></td>
253
+ </tr>
254
+ <tr>
255
+ <td>Must work offline (no setup)</td>
256
+ <td><code>bundle</code></td>
257
+ </tr>
258
+ <tr>
259
+ <td>CI/CD pipeline</td>
260
+ <td><code>build</code></td>
261
+ </tr>
262
+ <tr>
263
+ <td>Email attachment</td>
264
+ <td><code>bundle</code></td>
265
+ </tr>
266
+ <tr>
267
+ <td>GitHub Pages / Netlify</td>
268
+ <td><code>build</code></td>
269
+ </tr>
270
+ </tbody></table>
271
+ <p>You can use both — <code>bundle</code> for quick reviews, <code>build</code> for the published site.</p>
272
+ <h2 id="development-preview">Development Preview</h2>
273
+ <p>During writing, use the dev server instead of building:</p>
274
+ <pre><code class="language-bash">kitfly dev
275
+ </code></pre>
276
+ <p>This starts a local server at <code>http://localhost:3333</code> with hot reload. Edit any <code>.md</code> file and see changes instantly. When you&#39;re ready to share, switch to <code>bundle</code> or <code>build</code>.</p>
277
+ <h2 id="see-also">See Also</h2>
278
+ <ul>
279
+ <li><a href="cli/build.md">kitfly build</a> — Build command reference</li>
280
+ <li><a href="cli/bundle.md">kitfly bundle</a> — Bundle command reference</li>
281
+ <li><a href="cli/dev.md">kitfly dev</a> — Development server</li>
282
+ </ul>
283
+
284
+ </article>
285
+ <aside class="toc"><span class="toc-title">On this page</span><ul><li><a href="#send-it-single-html-file">Send It — Single HTML File</a></li><li class="toc-h3"><a href="#when-to-use-bundle">When to use bundle</a></li><li class="toc-h3"><a href="#bundle-tips">Bundle tips</a></li><li><a href="#host-it-static-site">Host It — Static Site</a></li><li class="toc-h3"><a href="#deployment-targets">Deployment targets</a></li><li class="toc-h3"><a href="#build-tips">Build tips</a></li><li><a href="#choosing-between-bundle-and-build">Choosing Between Bundle and Build</a></li><li><a href="#development-preview">Development Preview</a></li><li><a href="#see-also">See Also</a></li></ul></aside>
286
+ </main>
287
+ </div>
288
+
289
+ <footer class="site-footer">
290
+ <div class="footer-content">
291
+ <div class="footer-left">
292
+ <span class="footer-version">v0.2.1</span>
293
+ <span class="footer-separator">·</span>
294
+ <span class="footer-commit" title="Commit: 30dfc01">Published 2026-02-15</span>
295
+ </div>
296
+ <div class="footer-center">
297
+ <span class="footer-copyright"><a href="https://3leaps.net" class="footer-link">© 2026 3 Leaps, LLC</a></span>
298
+ <span class="footer-separator">·</span><a href="/" class="footer-link">Kitfly</a>
299
+ </div>
300
+ <div class="footer-right">
301
+ <a href="https://kitfly.dev" class="footer-link">Built with Kitfly</a>
302
+ </div>
303
+ </div>
304
+ </footer>
305
+ <!-- Syntax highlighting - Prism.js -->
306
+ <script src="https://cdn.jsdelivr.net/npm/prismjs@1/components/prism-core.min.js"></script>
307
+ <script src="https://cdn.jsdelivr.net/npm/prismjs@1/plugins/autoloader/prism-autoloader.min.js"></script>
308
+ <!-- Mermaid diagram support -->
309
+ <script type="module">
310
+ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
311
+
312
+ function getMermaidTheme() {
313
+ const theme = document.documentElement.getAttribute('data-theme');
314
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
315
+ const isDark = theme === 'dark' || (!theme && prefersDark);
316
+ return isDark ? 'dark' : 'neutral';
317
+ }
318
+
319
+ mermaid.initialize({
320
+ startOnLoad: true,
321
+ theme: getMermaidTheme()
322
+ });
323
+
324
+ // Re-render mermaid diagrams when theme changes
325
+ window.reinitMermaid = async function() {
326
+ mermaid.initialize({ startOnLoad: false, theme: getMermaidTheme() });
327
+ const diagrams = document.querySelectorAll('.mermaid');
328
+ for (const el of diagrams) {
329
+ const code = el.getAttribute('data-mermaid-source');
330
+ if (code) {
331
+ el.innerHTML = code;
332
+ el.removeAttribute('data-processed');
333
+ }
334
+ }
335
+ await mermaid.run({ nodes: diagrams });
336
+ };
337
+ </script>
338
+
339
+ <script>
340
+ function toggleTheme() {
341
+ const html = document.documentElement;
342
+ const current = html.getAttribute('data-theme');
343
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
344
+
345
+ let next;
346
+ if (current === 'dark') {
347
+ next = 'light';
348
+ } else if (current === 'light') {
349
+ next = 'dark';
350
+ } else {
351
+ // No explicit theme set, toggle from system preference
352
+ next = prefersDark ? 'light' : 'dark';
353
+ }
354
+
355
+ html.setAttribute('data-theme', next);
356
+ localStorage.setItem('theme', next);
357
+
358
+ // Switch Prism theme
359
+ const prismLight = document.getElementById('prism-light');
360
+ const prismDark = document.getElementById('prism-dark');
361
+ if (next === 'dark') {
362
+ prismLight?.setAttribute('disabled', '');
363
+ prismDark?.removeAttribute('disabled');
364
+ } else {
365
+ prismLight?.removeAttribute('disabled');
366
+ prismDark?.setAttribute('disabled', '');
367
+ }
368
+
369
+ // Re-render mermaid diagrams with new theme
370
+ if (window.reinitMermaid) {
371
+ window.reinitMermaid();
372
+ }
373
+ }
374
+
375
+ // Slides mode hash routing
376
+ (function initSlidesMode() {
377
+ const shell = document.querySelector('.slides-shell');
378
+ if (!shell) return;
379
+
380
+ const slides = Array.from(document.querySelectorAll('.slide'));
381
+ if (!slides.length) return;
382
+
383
+ const prevBtn = document.querySelector('.slide-prev');
384
+ const nextBtn = document.querySelector('.slide-next');
385
+ const counter = document.querySelector('.slide-counter');
386
+ const progressBar = document.querySelector('.slide-progress-bar');
387
+ const navLinks = Array.from(document.querySelectorAll('.sidebar-nav a[href^="#slide-"]'));
388
+ let current = 0;
389
+
390
+ function setActive(n) {
391
+ current = Math.max(0, Math.min(n, slides.length - 1));
392
+ slides.forEach((slide, idx) => slide.classList.toggle('active', idx === current));
393
+ navLinks.forEach((link) => {
394
+ const active = link.getAttribute('href') === '#' + slides[current].id;
395
+ link.classList.toggle('active', active);
396
+ });
397
+ if (counter) counter.textContent = (current + 1) + ' / ' + slides.length;
398
+ if (progressBar) progressBar.style.width = (((current + 1) / slides.length) * 100) + '%';
399
+ if (prevBtn) prevBtn.disabled = current === 0;
400
+ if (nextBtn) nextBtn.disabled = current === slides.length - 1;
401
+ history.replaceState(null, '', '#' + slides[current].id);
402
+ }
403
+
404
+ function setFromHash() {
405
+ const hash = window.location.hash || '';
406
+ const idx = slides.findIndex((s) => '#' + s.id === hash);
407
+ if (idx >= 0) setActive(idx);
408
+ else setActive(0);
409
+ }
410
+
411
+ prevBtn?.addEventListener('click', () => setActive(current - 1));
412
+ nextBtn?.addEventListener('click', () => setActive(current + 1));
413
+
414
+ document.addEventListener('keydown', (e) => {
415
+ if (e.key === 'ArrowRight' || e.key === ' ') {
416
+ e.preventDefault();
417
+ setActive(current + 1);
418
+ } else if (e.key === 'ArrowLeft') {
419
+ e.preventDefault();
420
+ setActive(current - 1);
421
+ } else if (e.key === 'Home') {
422
+ e.preventDefault();
423
+ setActive(0);
424
+ } else if (e.key === 'End') {
425
+ e.preventDefault();
426
+ setActive(slides.length - 1);
427
+ }
428
+ });
429
+
430
+ window.addEventListener('hashchange', setFromHash);
431
+ setFromHash();
432
+ })();
433
+
434
+ // Copy code button
435
+ document.querySelectorAll('.prose pre code').forEach(block => {
436
+ const button = document.createElement('button');
437
+ button.className = 'copy-button';
438
+ button.textContent = 'Copy';
439
+ button.onclick = async () => {
440
+ await navigator.clipboard.writeText(block.textContent);
441
+ button.textContent = 'Copied!';
442
+ setTimeout(() => button.textContent = 'Copy', 2000);
443
+ };
444
+ block.parentElement.appendChild(button);
445
+ });
446
+
447
+ // Mobile nav toggle
448
+ function toggleNav() {
449
+ document.querySelector('.sidebar').classList.toggle('open');
450
+ }
451
+
452
+ // Close nav when clicking outside on mobile
453
+ document.addEventListener('click', (e) => {
454
+ const sidebar = document.querySelector('.sidebar');
455
+ const toggle = document.querySelector('.nav-toggle');
456
+ if (sidebar.classList.contains('open') &&
457
+ !sidebar.contains(e.target) &&
458
+ !toggle.contains(e.target)) {
459
+ sidebar.classList.remove('open');
460
+ }
461
+ });
462
+ </script>
463
+
464
+ </body>
465
+ </html>