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.
- package/CHANGELOG.md +46 -0
- package/README.md +63 -16
- package/VERSION +1 -1
- package/dist/_raw/content/deployment/preflight.md +134 -0
- package/dist/_raw/content/deployment/recipes/aws-s3.md +128 -0
- package/dist/_raw/content/deployment/recipes/cloudflare-pages.md +73 -0
- package/dist/_raw/content/deployment/recipes/cloudflare-r2.md +156 -0
- package/dist/_raw/content/deployment/recipes/fly-io.md +57 -0
- package/dist/_raw/content/deployment/recipes/github-pages.md +112 -0
- package/dist/_raw/content/deployment/recipes/netlify.md +99 -0
- package/dist/_raw/content/deployment/recipes/vercel.md +88 -0
- package/dist/_raw/content/deployment/secrets-and-env-vars.md +75 -0
- package/dist/_raw/content/deployment.md +128 -0
- package/dist/_raw/content/guide/approaches.md +182 -0
- package/dist/_raw/content/guide/features.md +121 -0
- package/dist/_raw/content/guide/getting-started.md +112 -0
- package/dist/_raw/content/guide/kitfly-overview.md +209 -0
- package/dist/_raw/content/reference/configuration.md +259 -0
- package/dist/_raw/content/reference/design-catalog.md +167 -0
- package/dist/_raw/content/reference/environment-variables.md +66 -0
- package/dist/_raw/content/reference/glossary.md +92 -0
- package/dist/_raw/content/reference/key-concepts.md +118 -0
- package/dist/_raw/content/reference/plugins.md +220 -0
- package/dist/_raw/content/reference/slides-authoring-guidelines.md +129 -0
- package/dist/_raw/content/reference/structure.md +166 -0
- package/dist/_raw/content/reference.md +20 -0
- package/dist/_raw/content/templates/crucible.md +192 -0
- package/dist/_raw/content/templates/handbook.md +83 -0
- package/dist/_raw/content/templates/minimal.md +138 -0
- package/dist/_raw/content/templates/overview.md +187 -0
- package/dist/_raw/content/templates/pipeline.md +151 -0
- package/dist/_raw/content/templates/productbook.md +187 -0
- package/dist/_raw/content/templates/runbook.md +193 -0
- package/dist/_raw/content/templates/servicebook.md +163 -0
- package/dist/_raw/docs/decisions/ADR-0001-minimalist-site-code.md +118 -0
- package/dist/_raw/docs/decisions/ADR-0002-ai-accessibility.md +153 -0
- package/dist/_raw/docs/decisions/ADR-0003-single-file-bundle.md +93 -0
- package/dist/_raw/docs/decisions/ADR-0004-bun-runtime.md +98 -0
- package/dist/_raw/docs/decisions/ADR-0005-plugin-contract-and-distribution.md +110 -0
- package/dist/_raw/docs/decisions/DDR-0001-viewport-locked-layout.md +111 -0
- package/dist/_raw/docs/decisions/DDR-0002-theme-system.md +131 -0
- package/dist/_raw/docs/decisions/DDR-0003-bounded-logo-slot.md +106 -0
- package/dist/_raw/docs/decisions/DDR-0004-slides-rendering-model.md +113 -0
- package/dist/_raw/docs/decisions/DDR-0005-deterministic-layout-boundary.md +107 -0
- package/dist/_raw/docs/userguide/cli/build.md +85 -0
- package/dist/_raw/docs/userguide/cli/bundle.md +81 -0
- package/dist/_raw/docs/userguide/cli/dev.md +92 -0
- package/dist/_raw/docs/userguide/cli/init.md +116 -0
- package/dist/_raw/docs/userguide/cli/servers.md +69 -0
- package/dist/_raw/docs/userguide/cli/stop.md +76 -0
- package/dist/_raw/docs/userguide/cli/update.md +78 -0
- package/dist/_raw/docs/userguide/cli/version.md +65 -0
- package/dist/_raw/docs/userguide/cli.md +34 -0
- package/dist/_raw/docs/userguide/sharing.md +94 -0
- package/dist/_raw/schemas/plugin-schemas-notes.md +71 -0
- package/dist/_raw/schemas.md +42 -0
- package/dist/assets/brand/kitfly-favicon-32.png +0 -0
- package/dist/assets/brand/kitfly-icon-64.png +0 -0
- package/dist/assets/brand/kitfly-logo-128.png +0 -0
- package/dist/assets/brand/kitfly-logo-512.png +0 -0
- package/dist/assets/brand/kitfly-logo.svg +12132 -0
- package/dist/assets/brand/kitfly-neon-128.png +0 -0
- package/dist/assets/brand/kitfly-neon-192.png +0 -0
- package/dist/assets/brand/kitfly-neon-256.png +0 -0
- package/dist/assets/brand/kitfly-neon.png +0 -0
- package/dist/assets/brand/palette.md +75 -0
- package/dist/content/deployment/index.html +11 -0
- package/dist/content/deployment/preflight.html +418 -0
- package/dist/content/deployment/recipes/aws-s3.html +421 -0
- package/dist/content/deployment/recipes/cloudflare-pages.html +372 -0
- package/dist/content/deployment/recipes/cloudflare-r2.html +443 -0
- package/dist/content/deployment/recipes/fly-io.html +356 -0
- package/dist/content/deployment/recipes/github-pages.html +414 -0
- package/dist/content/deployment/recipes/index.html +11 -0
- package/dist/content/deployment/recipes/netlify.html +394 -0
- package/dist/content/deployment/recipes/vercel.html +382 -0
- package/dist/content/deployment/secrets-and-env-vars.html +380 -0
- package/dist/content/deployment.html +426 -0
- package/dist/content/guide/approaches.html +501 -0
- package/dist/content/guide/features.html +436 -0
- package/dist/content/guide/getting-started.html +403 -0
- package/dist/content/guide/index.html +11 -0
- package/dist/content/guide/kitfly-overview.html +544 -0
- package/dist/content/index.html +11 -0
- package/dist/content/reference/configuration.html +580 -0
- package/dist/content/reference/design-catalog.html +449 -0
- package/dist/content/reference/environment-variables.html +367 -0
- package/dist/content/reference/glossary.html +368 -0
- package/dist/content/reference/index.html +11 -0
- package/dist/content/reference/key-concepts.html +399 -0
- package/dist/content/reference/plugins.html +491 -0
- package/dist/content/reference/slides-authoring-guidelines.html +418 -0
- package/dist/content/reference/structure.html +463 -0
- package/dist/content/reference.html +335 -0
- package/dist/content/templates/crucible.html +546 -0
- package/dist/content/templates/handbook.html +405 -0
- package/dist/content/templates/index.html +11 -0
- package/dist/content/templates/minimal.html +447 -0
- package/dist/content/templates/overview.html +558 -0
- package/dist/content/templates/pipeline.html +494 -0
- package/dist/content/templates/productbook.html +540 -0
- package/dist/content/templates/runbook.html +543 -0
- package/dist/content/templates/servicebook.html +523 -0
- package/dist/content-index.json +549 -0
- package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +491 -0
- package/dist/docs/decisions/ADR-0002-ai-accessibility.html +434 -0
- package/dist/docs/decisions/ADR-0003-single-file-bundle.html +412 -0
- package/dist/docs/decisions/ADR-0004-bun-runtime.html +409 -0
- package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +402 -0
- package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +459 -0
- package/dist/docs/decisions/DDR-0002-theme-system.html +452 -0
- package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +423 -0
- package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +399 -0
- package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +422 -0
- package/dist/docs/decisions/index.html +11 -0
- package/dist/docs/userguide/cli/build.html +408 -0
- package/dist/docs/userguide/cli/bundle.html +419 -0
- package/dist/docs/userguide/cli/dev.html +428 -0
- package/dist/docs/userguide/cli/index.html +11 -0
- package/dist/docs/userguide/cli/init.html +436 -0
- package/dist/docs/userguide/cli/servers.html +393 -0
- package/dist/docs/userguide/cli/stop.html +408 -0
- package/dist/docs/userguide/cli/update.html +406 -0
- package/dist/docs/userguide/cli/version.html +406 -0
- package/dist/docs/userguide/cli.html +386 -0
- package/dist/docs/userguide/index.html +11 -0
- package/dist/docs/userguide/sharing.html +465 -0
- package/dist/index.html +387 -0
- package/dist/llms.txt +18 -0
- package/dist/provenance.json +7 -0
- package/dist/schemas/index.html +11 -0
- package/dist/schemas/plugin-registry.schema.html +327 -0
- package/dist/schemas/plugin-schemas-notes.html +364 -0
- package/dist/schemas/plugin.schema.html +327 -0
- package/dist/schemas/plugins.schema.html +327 -0
- package/dist/schemas/v0/common.schema.html +386 -0
- package/dist/schemas/v0/index.html +11 -0
- package/dist/schemas/v0/plugin-registry.schema.html +547 -0
- package/dist/schemas/v0/plugin.schema.html +497 -0
- package/dist/schemas/v0/plugins.schema.html +406 -0
- package/dist/schemas/v0/site.schema.html +541 -0
- package/dist/schemas/v0/theme.schema.html +615 -0
- package/dist/schemas.html +351 -0
- package/dist/styles.css +1262 -0
- package/package.json +4 -2
- package/plugins-dist/callouts.css +32 -0
- package/plugins-dist/callouts.js +46 -0
- package/plugins-dist/slides-visuals.css +390 -0
- package/plugins-dist/slides-visuals.js +689 -0
- package/registry/plugins.yaml +35 -0
- package/schemas/README.md +10 -0
- package/schemas/plugin-registry.schema.json +5 -0
- package/schemas/plugin-schemas-notes.md +71 -0
- package/schemas/plugin.schema.json +5 -0
- package/schemas/plugins.schema.json +5 -0
- package/schemas/v0/common.schema.json +64 -0
- package/schemas/v0/plugin-registry.schema.json +225 -0
- package/schemas/v0/plugin.schema.json +175 -0
- package/schemas/v0/plugins.schema.json +84 -0
- package/schemas/v0/site.schema.json +56 -9
- package/schemas/v0/theme.schema.json +105 -22
- package/scripts/build.ts +158 -3
- package/scripts/bundle.ts +261 -95
- package/scripts/dev.ts +301 -11
- package/src/__tests__/build.test.ts +220 -1
- package/src/__tests__/bundle.test.ts +31 -0
- package/src/__tests__/cli.test.ts +14 -3
- package/src/__tests__/dev-plugin-errors.test.ts +20 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/bad-list-indent.md +5 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/blank-line.md +5 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/compare-object-items.md +9 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-branching-no-source.md +5 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-converging-no-target.md +6 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/indented-fence.md +4 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/staircase-empty-steps.md +3 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/stat-grid-missing-fields.md +5 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/timeline-horizontal-no-events.md +2 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/unknown-type.md +3 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/compare.md +10 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/comparison-table.md +14 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching-no-split.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging-no-merge.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/funnel.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/kpi.md +5 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/layer-cake.md +6 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/pyramid.md +6 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/quadrant-grid.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/scorecard.md +13 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase-down.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/stat-grid.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-horizontal.md +9 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-vertical.md +10 -0
- package/src/__tests__/init.test.ts +35 -0
- package/src/__tests__/plugin-loader.test.ts +221 -0
- package/src/__tests__/shared.test.ts +451 -0
- package/src/__tests__/slides-visuals-fence-contract.test.ts +28 -0
- package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +147 -0
- package/src/__tests__/styles.test.ts +35 -0
- package/src/cli.ts +9 -4
- package/src/plugin-loader.ts +245 -0
- package/src/shared.ts +650 -7
- package/src/site/styles.css +331 -0
- package/src/site/template.html +66 -5
- package/src/templates/deck.ts +186 -0
- package/src/templates/driver.ts +11 -1
- package/src/templates/minimal.ts +1 -0
|
@@ -0,0 +1,419 @@
|
|
|
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>bundle - 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 open><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" class="active">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">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><a href="../../../docs/userguide/cli/build.html">Cli</a><span class="separator">›</span><span>bundle</span></nav>
|
|
139
|
+
|
|
140
|
+
<h1 id="kitfly-bundle">kitfly bundle</h1>
|
|
141
|
+
<p>Build single-file HTML bundle.</p>
|
|
142
|
+
<h2 id="usage">Usage</h2>
|
|
143
|
+
<pre><code class="language-bash">kitfly bundle [folder] [options]
|
|
144
|
+
</code></pre>
|
|
145
|
+
<h2 id="description">Description</h2>
|
|
146
|
+
<p>Creates a single, self-contained HTML file with all content, styles, and navigation embedded. Perfect for sharing via email, Slack, or file sharing services.</p>
|
|
147
|
+
<h2 id="arguments">Arguments</h2>
|
|
148
|
+
<table>
|
|
149
|
+
<thead>
|
|
150
|
+
<tr>
|
|
151
|
+
<th>Argument</th>
|
|
152
|
+
<th>Description</th>
|
|
153
|
+
</tr>
|
|
154
|
+
</thead>
|
|
155
|
+
<tbody><tr>
|
|
156
|
+
<td><code>folder</code></td>
|
|
157
|
+
<td>Content folder to bundle (default: current directory or <code>docroot</code> from site.yaml)</td>
|
|
158
|
+
</tr>
|
|
159
|
+
</tbody></table>
|
|
160
|
+
<h2 id="options">Options</h2>
|
|
161
|
+
<table>
|
|
162
|
+
<thead>
|
|
163
|
+
<tr>
|
|
164
|
+
<th>Option</th>
|
|
165
|
+
<th>Environment Variable</th>
|
|
166
|
+
<th>Default</th>
|
|
167
|
+
<th>Description</th>
|
|
168
|
+
</tr>
|
|
169
|
+
</thead>
|
|
170
|
+
<tbody><tr>
|
|
171
|
+
<td><code>--out <dir></code></td>
|
|
172
|
+
<td><code>KITFLY_BUILD_OUT</code></td>
|
|
173
|
+
<td>dist</td>
|
|
174
|
+
<td>Output directory</td>
|
|
175
|
+
</tr>
|
|
176
|
+
<tr>
|
|
177
|
+
<td><code>--name <file></code></td>
|
|
178
|
+
<td>-</td>
|
|
179
|
+
<td>bundle.html</td>
|
|
180
|
+
<td>Output filename</td>
|
|
181
|
+
</tr>
|
|
182
|
+
<tr>
|
|
183
|
+
<td><code>--raw</code></td>
|
|
184
|
+
<td><code>KITFLY_BUILD_RAW</code></td>
|
|
185
|
+
<td>true</td>
|
|
186
|
+
<td>Include raw markdown in bundle</td>
|
|
187
|
+
</tr>
|
|
188
|
+
<tr>
|
|
189
|
+
<td><code>--no-raw</code></td>
|
|
190
|
+
<td>-</td>
|
|
191
|
+
<td>-</td>
|
|
192
|
+
<td>Don't include raw markdown</td>
|
|
193
|
+
</tr>
|
|
194
|
+
</tbody></table>
|
|
195
|
+
<h2 id="examples">Examples</h2>
|
|
196
|
+
<h3 id="basic-usage">Basic usage</h3>
|
|
197
|
+
<pre><code class="language-bash"># Create bundle.html in dist/
|
|
198
|
+
kitfly bundle
|
|
199
|
+
|
|
200
|
+
# Custom filename
|
|
201
|
+
kitfly bundle --name my-docs.html
|
|
202
|
+
|
|
203
|
+
# Custom output location
|
|
204
|
+
kitfly bundle --out ./release --name handbook.html
|
|
205
|
+
</code></pre>
|
|
206
|
+
<h2 id="output">Output</h2>
|
|
207
|
+
<p>A single HTML file containing:</p>
|
|
208
|
+
<ul>
|
|
209
|
+
<li>All page content with images inlined as base64 data URIs</li>
|
|
210
|
+
<li>Embedded CSS styles</li>
|
|
211
|
+
<li>Syntax highlighting (Prism.js, inlined)</li>
|
|
212
|
+
<li>Diagram rendering (Mermaid, inlined)</li>
|
|
213
|
+
<li>Navigation and table of contents</li>
|
|
214
|
+
<li>Dark mode support</li>
|
|
215
|
+
<li>Brand logo and favicon (inlined)</li>
|
|
216
|
+
<li>No external dependencies (works fully offline)</li>
|
|
217
|
+
</ul>
|
|
218
|
+
<h2 id="use-cases">Use Cases</h2>
|
|
219
|
+
<ul>
|
|
220
|
+
<li><strong>Email attachment</strong>: Share documentation without hosting</li>
|
|
221
|
+
<li><strong>Offline reading</strong>: Works without internet connection</li>
|
|
222
|
+
<li><strong>Review cycles</strong>: Send to stakeholders for feedback</li>
|
|
223
|
+
<li><strong>Archival</strong>: Single-file snapshot of documentation</li>
|
|
224
|
+
<li><strong>Client handoff</strong>: Portable single-file deliverable with all images embedded</li>
|
|
225
|
+
</ul>
|
|
226
|
+
<h2 id="file-size">File Size</h2>
|
|
227
|
+
<p>Bundle size depends on content volume and images. Typical documentation sites produce bundles of 100KB-1MB. Sites with many images will be larger due to base64 encoding (~33% overhead per image).</p>
|
|
228
|
+
<h2 id="plugin-validation-errors-triple-colon-fences">Plugin validation errors (triple-colon fences)</h2>
|
|
229
|
+
<p>Some plugins add special block syntax (for example, <code>slides-visuals</code> uses <code>:::</code> fences).</p>
|
|
230
|
+
<p>When a plugin is enabled, kitfly may validate your content before bundling. If validation fails, <code>kitfly bundle</code> will exit with a clear error message so you can fix the content and re-run the bundle.</p>
|
|
231
|
+
<p>See the exact contract (with examples): <code>../../../content/reference/plugins.html#triple-colon-fence-contract-slides-visuals</code>.</p>
|
|
232
|
+
<h2 id="see-also">See Also</h2>
|
|
233
|
+
<ul>
|
|
234
|
+
<li><a href="build.md">kitfly build</a> - Multi-file static build</li>
|
|
235
|
+
<li><a href="dev.md">kitfly dev</a> - Development server</li>
|
|
236
|
+
</ul>
|
|
237
|
+
|
|
238
|
+
</article>
|
|
239
|
+
<aside class="toc"><span class="toc-title">On this page</span><ul><li><a href="#usage">Usage</a></li><li><a href="#description">Description</a></li><li><a href="#arguments">Arguments</a></li><li><a href="#options">Options</a></li><li><a href="#examples">Examples</a></li><li class="toc-h3"><a href="#basic-usage">Basic usage</a></li><li><a href="#output">Output</a></li><li><a href="#use-cases">Use Cases</a></li><li><a href="#file-size">File Size</a></li><li><a href="#plugin-validation-errors-triple-colon-fences">Plugin validation errors (triple-colon fences)</a></li><li><a href="#see-also">See Also</a></li></ul></aside>
|
|
240
|
+
</main>
|
|
241
|
+
</div>
|
|
242
|
+
|
|
243
|
+
<footer class="site-footer">
|
|
244
|
+
<div class="footer-content">
|
|
245
|
+
<div class="footer-left">
|
|
246
|
+
<span class="footer-version">v0.2.1</span>
|
|
247
|
+
<span class="footer-separator">·</span>
|
|
248
|
+
<span class="footer-commit" title="Commit: 30dfc01">Published 2026-02-15</span>
|
|
249
|
+
</div>
|
|
250
|
+
<div class="footer-center">
|
|
251
|
+
<span class="footer-copyright"><a href="https://3leaps.net" class="footer-link">© 2026 3 Leaps, LLC</a></span>
|
|
252
|
+
<span class="footer-separator">·</span><a href="/" class="footer-link">Kitfly</a>
|
|
253
|
+
</div>
|
|
254
|
+
<div class="footer-right">
|
|
255
|
+
<a href="https://kitfly.dev" class="footer-link">Built with Kitfly</a>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
</footer>
|
|
259
|
+
<!-- Syntax highlighting - Prism.js -->
|
|
260
|
+
<script src="https://cdn.jsdelivr.net/npm/prismjs@1/components/prism-core.min.js"></script>
|
|
261
|
+
<script src="https://cdn.jsdelivr.net/npm/prismjs@1/plugins/autoloader/prism-autoloader.min.js"></script>
|
|
262
|
+
<!-- Mermaid diagram support -->
|
|
263
|
+
<script type="module">
|
|
264
|
+
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
|
265
|
+
|
|
266
|
+
function getMermaidTheme() {
|
|
267
|
+
const theme = document.documentElement.getAttribute('data-theme');
|
|
268
|
+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
269
|
+
const isDark = theme === 'dark' || (!theme && prefersDark);
|
|
270
|
+
return isDark ? 'dark' : 'neutral';
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
mermaid.initialize({
|
|
274
|
+
startOnLoad: true,
|
|
275
|
+
theme: getMermaidTheme()
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
// Re-render mermaid diagrams when theme changes
|
|
279
|
+
window.reinitMermaid = async function() {
|
|
280
|
+
mermaid.initialize({ startOnLoad: false, theme: getMermaidTheme() });
|
|
281
|
+
const diagrams = document.querySelectorAll('.mermaid');
|
|
282
|
+
for (const el of diagrams) {
|
|
283
|
+
const code = el.getAttribute('data-mermaid-source');
|
|
284
|
+
if (code) {
|
|
285
|
+
el.innerHTML = code;
|
|
286
|
+
el.removeAttribute('data-processed');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
await mermaid.run({ nodes: diagrams });
|
|
290
|
+
};
|
|
291
|
+
</script>
|
|
292
|
+
|
|
293
|
+
<script>
|
|
294
|
+
function toggleTheme() {
|
|
295
|
+
const html = document.documentElement;
|
|
296
|
+
const current = html.getAttribute('data-theme');
|
|
297
|
+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
298
|
+
|
|
299
|
+
let next;
|
|
300
|
+
if (current === 'dark') {
|
|
301
|
+
next = 'light';
|
|
302
|
+
} else if (current === 'light') {
|
|
303
|
+
next = 'dark';
|
|
304
|
+
} else {
|
|
305
|
+
// No explicit theme set, toggle from system preference
|
|
306
|
+
next = prefersDark ? 'light' : 'dark';
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
html.setAttribute('data-theme', next);
|
|
310
|
+
localStorage.setItem('theme', next);
|
|
311
|
+
|
|
312
|
+
// Switch Prism theme
|
|
313
|
+
const prismLight = document.getElementById('prism-light');
|
|
314
|
+
const prismDark = document.getElementById('prism-dark');
|
|
315
|
+
if (next === 'dark') {
|
|
316
|
+
prismLight?.setAttribute('disabled', '');
|
|
317
|
+
prismDark?.removeAttribute('disabled');
|
|
318
|
+
} else {
|
|
319
|
+
prismLight?.removeAttribute('disabled');
|
|
320
|
+
prismDark?.setAttribute('disabled', '');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Re-render mermaid diagrams with new theme
|
|
324
|
+
if (window.reinitMermaid) {
|
|
325
|
+
window.reinitMermaid();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Slides mode hash routing
|
|
330
|
+
(function initSlidesMode() {
|
|
331
|
+
const shell = document.querySelector('.slides-shell');
|
|
332
|
+
if (!shell) return;
|
|
333
|
+
|
|
334
|
+
const slides = Array.from(document.querySelectorAll('.slide'));
|
|
335
|
+
if (!slides.length) return;
|
|
336
|
+
|
|
337
|
+
const prevBtn = document.querySelector('.slide-prev');
|
|
338
|
+
const nextBtn = document.querySelector('.slide-next');
|
|
339
|
+
const counter = document.querySelector('.slide-counter');
|
|
340
|
+
const progressBar = document.querySelector('.slide-progress-bar');
|
|
341
|
+
const navLinks = Array.from(document.querySelectorAll('.sidebar-nav a[href^="#slide-"]'));
|
|
342
|
+
let current = 0;
|
|
343
|
+
|
|
344
|
+
function setActive(n) {
|
|
345
|
+
current = Math.max(0, Math.min(n, slides.length - 1));
|
|
346
|
+
slides.forEach((slide, idx) => slide.classList.toggle('active', idx === current));
|
|
347
|
+
navLinks.forEach((link) => {
|
|
348
|
+
const active = link.getAttribute('href') === '#' + slides[current].id;
|
|
349
|
+
link.classList.toggle('active', active);
|
|
350
|
+
});
|
|
351
|
+
if (counter) counter.textContent = (current + 1) + ' / ' + slides.length;
|
|
352
|
+
if (progressBar) progressBar.style.width = (((current + 1) / slides.length) * 100) + '%';
|
|
353
|
+
if (prevBtn) prevBtn.disabled = current === 0;
|
|
354
|
+
if (nextBtn) nextBtn.disabled = current === slides.length - 1;
|
|
355
|
+
history.replaceState(null, '', '#' + slides[current].id);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function setFromHash() {
|
|
359
|
+
const hash = window.location.hash || '';
|
|
360
|
+
const idx = slides.findIndex((s) => '#' + s.id === hash);
|
|
361
|
+
if (idx >= 0) setActive(idx);
|
|
362
|
+
else setActive(0);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
prevBtn?.addEventListener('click', () => setActive(current - 1));
|
|
366
|
+
nextBtn?.addEventListener('click', () => setActive(current + 1));
|
|
367
|
+
|
|
368
|
+
document.addEventListener('keydown', (e) => {
|
|
369
|
+
if (e.key === 'ArrowRight' || e.key === ' ') {
|
|
370
|
+
e.preventDefault();
|
|
371
|
+
setActive(current + 1);
|
|
372
|
+
} else if (e.key === 'ArrowLeft') {
|
|
373
|
+
e.preventDefault();
|
|
374
|
+
setActive(current - 1);
|
|
375
|
+
} else if (e.key === 'Home') {
|
|
376
|
+
e.preventDefault();
|
|
377
|
+
setActive(0);
|
|
378
|
+
} else if (e.key === 'End') {
|
|
379
|
+
e.preventDefault();
|
|
380
|
+
setActive(slides.length - 1);
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
window.addEventListener('hashchange', setFromHash);
|
|
385
|
+
setFromHash();
|
|
386
|
+
})();
|
|
387
|
+
|
|
388
|
+
// Copy code button
|
|
389
|
+
document.querySelectorAll('.prose pre code').forEach(block => {
|
|
390
|
+
const button = document.createElement('button');
|
|
391
|
+
button.className = 'copy-button';
|
|
392
|
+
button.textContent = 'Copy';
|
|
393
|
+
button.onclick = async () => {
|
|
394
|
+
await navigator.clipboard.writeText(block.textContent);
|
|
395
|
+
button.textContent = 'Copied!';
|
|
396
|
+
setTimeout(() => button.textContent = 'Copy', 2000);
|
|
397
|
+
};
|
|
398
|
+
block.parentElement.appendChild(button);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// Mobile nav toggle
|
|
402
|
+
function toggleNav() {
|
|
403
|
+
document.querySelector('.sidebar').classList.toggle('open');
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
// Close nav when clicking outside on mobile
|
|
407
|
+
document.addEventListener('click', (e) => {
|
|
408
|
+
const sidebar = document.querySelector('.sidebar');
|
|
409
|
+
const toggle = document.querySelector('.nav-toggle');
|
|
410
|
+
if (sidebar.classList.contains('open') &&
|
|
411
|
+
!sidebar.contains(e.target) &&
|
|
412
|
+
!toggle.contains(e.target)) {
|
|
413
|
+
sidebar.classList.remove('open');
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
</script>
|
|
417
|
+
|
|
418
|
+
</body>
|
|
419
|
+
</html>
|