kitfly 0.1.2 → 0.2.0
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 +34 -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/structure.md +166 -0
- package/dist/_raw/content/reference.md +19 -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/structure.html +463 -0
- package/dist/content/reference.html +334 -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 +540 -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 +224 -0
- package/plugins-dist/slides-visuals.js +598 -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 +155 -3
- package/scripts/bundle.ts +258 -95
- package/scripts/dev.ts +203 -1
- package/src/__tests__/build.test.ts +158 -1
- package/src/__tests__/bundle.test.ts +31 -0
- package/src/__tests__/cli.test.ts +14 -3
- 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/indented-fence.md +4 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/stat-grid-missing-fields.md +5 -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/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/stat-grid.md +8 -0
- package/src/__tests__/init.test.ts +35 -0
- package/src/__tests__/plugin-loader.test.ts +221 -0
- package/src/__tests__/shared.test.ts +428 -0
- package/src/__tests__/slides-visuals-fence-contract.test.ts +28 -0
- package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +114 -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 +614 -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,394 @@
|
|
|
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>Recipe: Netlify - 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.0</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/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 open><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" class="active">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">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="../../../content/guide/approaches.html">Content</a><span class="separator">›</span><a href="../../../content/deployment/preflight.html">Deployment</a><span class="separator">›</span><a href="../../../content/deployment/recipes/aws-s3.html">Recipes</a><span class="separator">›</span><span>netlify</span></nav>
|
|
139
|
+
<div class="page-meta">Last updated: 2026-02-12</div>
|
|
140
|
+
<h1 id="recipe-netlify">Recipe: Netlify</h1>
|
|
141
|
+
<p>Netlify is a great default for a static Kitfly site because deployment can be as simple as uploading <code>dist/</code>.</p>
|
|
142
|
+
<p>If you want the "fewest moving parts" setup:</p>
|
|
143
|
+
<ul>
|
|
144
|
+
<li>start with a subdomain like <code>docs.example.com</code></li>
|
|
145
|
+
<li>deploy the built <code>dist/</code> output</li>
|
|
146
|
+
<li>don't add redirects or fancy build settings until you need them</li>
|
|
147
|
+
</ul>
|
|
148
|
+
<h2 id="prerequisites">Prerequisites</h2>
|
|
149
|
+
<ul>
|
|
150
|
+
<li>A Netlify account</li>
|
|
151
|
+
</ul>
|
|
152
|
+
<h2 id="build">Build</h2>
|
|
153
|
+
<pre><code class="language-bash">make build
|
|
154
|
+
</code></pre>
|
|
155
|
+
<h2 id="deploy-simplest-drag-and-drop">Deploy (simplest: drag-and-drop)</h2>
|
|
156
|
+
<ol>
|
|
157
|
+
<li>Go to Netlify</li>
|
|
158
|
+
<li>Create a new site</li>
|
|
159
|
+
<li>Drag-and-drop your <code>dist/</code> folder</li>
|
|
160
|
+
</ol>
|
|
161
|
+
<p>This is perfect for small internal docs, quick demos, and "send a link" situations.</p>
|
|
162
|
+
<h2 id="deploy-repeatable-connect-to-git">Deploy (repeatable: connect to Git)</h2>
|
|
163
|
+
<p>If your docs live in a repo and you want a predictable "push to deploy" workflow:</p>
|
|
164
|
+
<ol>
|
|
165
|
+
<li>Connect your GitHub/GitLab repo in Netlify</li>
|
|
166
|
+
<li>Set build command: <code>make build</code></li>
|
|
167
|
+
<li>Set publish directory: <code>dist</code></li>
|
|
168
|
+
</ol>
|
|
169
|
+
<p>Netlify will run your build and publish the <code>dist/</code> output.</p>
|
|
170
|
+
<p>Tip: this is often easier than asking everyone on the team to build locally.</p>
|
|
171
|
+
<h2 id="configuration-file-optional">Configuration file (optional)</h2>
|
|
172
|
+
<p>For config-as-code, add <code>netlify.toml</code> to your project root:</p>
|
|
173
|
+
<pre><code class="language-toml">[build]
|
|
174
|
+
command = "make build"
|
|
175
|
+
publish = "dist"
|
|
176
|
+
|
|
177
|
+
[build.environment]
|
|
178
|
+
# Netlify needs Bun installed for the build
|
|
179
|
+
BUN_VERSION = "1"
|
|
180
|
+
|
|
181
|
+
[[headers]]
|
|
182
|
+
for = "/*"
|
|
183
|
+
[headers.values]
|
|
184
|
+
X-Frame-Options = "DENY"
|
|
185
|
+
X-Content-Type-Options = "nosniff"
|
|
186
|
+
</code></pre>
|
|
187
|
+
<p>Note: Netlify doesn't ship Bun by default. You may need to add a build plugin or install step. Check Netlify's docs for current Bun support. Alternatively, build locally and use drag-and-drop or the Netlify CLI:</p>
|
|
188
|
+
<pre><code class="language-bash">make build
|
|
189
|
+
npx netlify-cli deploy --dir=dist --prod
|
|
190
|
+
</code></pre>
|
|
191
|
+
<h2 id="custom-domain-dns-basics">Custom domain (DNS basics)</h2>
|
|
192
|
+
<p>Typical pattern:</p>
|
|
193
|
+
<ul>
|
|
194
|
+
<li><code>docs.example.com</code> → <strong>CNAME</strong> to the Netlify target it gives you</li>
|
|
195
|
+
</ul>
|
|
196
|
+
<p>If you need an apex/root domain, follow Netlify's UI guidance for apex handling (it varies by DNS provider).</p>
|
|
197
|
+
<p>HTTPS is provisioned automatically via Let's Encrypt once DNS is configured.</p>
|
|
198
|
+
<h2 id="caching-why-you-might-not-see-changes">Caching (why you might not see changes)</h2>
|
|
199
|
+
<p>If you deploy and your browser still shows old content:</p>
|
|
200
|
+
<ul>
|
|
201
|
+
<li>hard refresh (Shift+Reload)</li>
|
|
202
|
+
<li>try an incognito window</li>
|
|
203
|
+
<li>wait a minute (some caches take time)</li>
|
|
204
|
+
</ul>
|
|
205
|
+
<p>Netlify invalidates its CDN cache on every deploy — if you still see stale content, it's likely browser cache.</p>
|
|
206
|
+
<h2 id="verify-rollback">Verify + Rollback</h2>
|
|
207
|
+
<ul>
|
|
208
|
+
<li>Verify: load the site, click a few pages, hard refresh, confirm HTTPS lock icon</li>
|
|
209
|
+
<li>Rollback: re-publish the previous deploy from Netlify's deploy history</li>
|
|
210
|
+
</ul>
|
|
211
|
+
<p>See: <a href="../preflight.html">Preflight and Rollback</a></p>
|
|
212
|
+
|
|
213
|
+
</article>
|
|
214
|
+
<aside class="toc"><span class="toc-title">On this page</span><ul><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#build">Build</a></li><li><a href="#deploy-simplest-drag-and-drop">Deploy (simplest: drag-and-drop)</a></li><li><a href="#deploy-repeatable-connect-to-git">Deploy (repeatable: connect to Git)</a></li><li><a href="#configuration-file-optional">Configuration file (optional)</a></li><li><a href="#custom-domain-dns-basics">Custom domain (DNS basics)</a></li><li><a href="#caching-why-you-might-not-see-changes">Caching (why you might not see changes)</a></li><li><a href="#verify-rollback">Verify + Rollback</a></li></ul></aside>
|
|
215
|
+
</main>
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<footer class="site-footer">
|
|
219
|
+
<div class="footer-content">
|
|
220
|
+
<div class="footer-left">
|
|
221
|
+
<span class="footer-version">v0.2.0</span>
|
|
222
|
+
<span class="footer-separator">·</span>
|
|
223
|
+
<span class="footer-commit" title="Commit: 33ccd68">Published 2026-02-15</span>
|
|
224
|
+
</div>
|
|
225
|
+
<div class="footer-center">
|
|
226
|
+
<span class="footer-copyright"><a href="https://3leaps.net" class="footer-link">© 2026 3 Leaps, LLC</a></span>
|
|
227
|
+
<span class="footer-separator">·</span><a href="/" class="footer-link">Kitfly</a>
|
|
228
|
+
</div>
|
|
229
|
+
<div class="footer-right">
|
|
230
|
+
<a href="https://kitfly.dev" class="footer-link">Built with Kitfly</a>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
</footer>
|
|
234
|
+
<!-- Syntax highlighting - Prism.js -->
|
|
235
|
+
<script src="https://cdn.jsdelivr.net/npm/prismjs@1/components/prism-core.min.js"></script>
|
|
236
|
+
<script src="https://cdn.jsdelivr.net/npm/prismjs@1/plugins/autoloader/prism-autoloader.min.js"></script>
|
|
237
|
+
<!-- Mermaid diagram support -->
|
|
238
|
+
<script type="module">
|
|
239
|
+
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
|
|
240
|
+
|
|
241
|
+
function getMermaidTheme() {
|
|
242
|
+
const theme = document.documentElement.getAttribute('data-theme');
|
|
243
|
+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
244
|
+
const isDark = theme === 'dark' || (!theme && prefersDark);
|
|
245
|
+
return isDark ? 'dark' : 'neutral';
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
mermaid.initialize({
|
|
249
|
+
startOnLoad: true,
|
|
250
|
+
theme: getMermaidTheme()
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Re-render mermaid diagrams when theme changes
|
|
254
|
+
window.reinitMermaid = async function() {
|
|
255
|
+
mermaid.initialize({ startOnLoad: false, theme: getMermaidTheme() });
|
|
256
|
+
const diagrams = document.querySelectorAll('.mermaid');
|
|
257
|
+
for (const el of diagrams) {
|
|
258
|
+
const code = el.getAttribute('data-mermaid-source');
|
|
259
|
+
if (code) {
|
|
260
|
+
el.innerHTML = code;
|
|
261
|
+
el.removeAttribute('data-processed');
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
await mermaid.run({ nodes: diagrams });
|
|
265
|
+
};
|
|
266
|
+
</script>
|
|
267
|
+
|
|
268
|
+
<script>
|
|
269
|
+
function toggleTheme() {
|
|
270
|
+
const html = document.documentElement;
|
|
271
|
+
const current = html.getAttribute('data-theme');
|
|
272
|
+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
273
|
+
|
|
274
|
+
let next;
|
|
275
|
+
if (current === 'dark') {
|
|
276
|
+
next = 'light';
|
|
277
|
+
} else if (current === 'light') {
|
|
278
|
+
next = 'dark';
|
|
279
|
+
} else {
|
|
280
|
+
// No explicit theme set, toggle from system preference
|
|
281
|
+
next = prefersDark ? 'light' : 'dark';
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
html.setAttribute('data-theme', next);
|
|
285
|
+
localStorage.setItem('theme', next);
|
|
286
|
+
|
|
287
|
+
// Switch Prism theme
|
|
288
|
+
const prismLight = document.getElementById('prism-light');
|
|
289
|
+
const prismDark = document.getElementById('prism-dark');
|
|
290
|
+
if (next === 'dark') {
|
|
291
|
+
prismLight?.setAttribute('disabled', '');
|
|
292
|
+
prismDark?.removeAttribute('disabled');
|
|
293
|
+
} else {
|
|
294
|
+
prismLight?.removeAttribute('disabled');
|
|
295
|
+
prismDark?.setAttribute('disabled', '');
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Re-render mermaid diagrams with new theme
|
|
299
|
+
if (window.reinitMermaid) {
|
|
300
|
+
window.reinitMermaid();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Slides mode hash routing
|
|
305
|
+
(function initSlidesMode() {
|
|
306
|
+
const shell = document.querySelector('.slides-shell');
|
|
307
|
+
if (!shell) return;
|
|
308
|
+
|
|
309
|
+
const slides = Array.from(document.querySelectorAll('.slide'));
|
|
310
|
+
if (!slides.length) return;
|
|
311
|
+
|
|
312
|
+
const prevBtn = document.querySelector('.slide-prev');
|
|
313
|
+
const nextBtn = document.querySelector('.slide-next');
|
|
314
|
+
const counter = document.querySelector('.slide-counter');
|
|
315
|
+
const progressBar = document.querySelector('.slide-progress-bar');
|
|
316
|
+
const navLinks = Array.from(document.querySelectorAll('.sidebar-nav a[href^="#slide-"]'));
|
|
317
|
+
let current = 0;
|
|
318
|
+
|
|
319
|
+
function setActive(n) {
|
|
320
|
+
current = Math.max(0, Math.min(n, slides.length - 1));
|
|
321
|
+
slides.forEach((slide, idx) => slide.classList.toggle('active', idx === current));
|
|
322
|
+
navLinks.forEach((link) => {
|
|
323
|
+
const active = link.getAttribute('href') === '#' + slides[current].id;
|
|
324
|
+
link.classList.toggle('active', active);
|
|
325
|
+
});
|
|
326
|
+
if (counter) counter.textContent = (current + 1) + ' / ' + slides.length;
|
|
327
|
+
if (progressBar) progressBar.style.width = (((current + 1) / slides.length) * 100) + '%';
|
|
328
|
+
if (prevBtn) prevBtn.disabled = current === 0;
|
|
329
|
+
if (nextBtn) nextBtn.disabled = current === slides.length - 1;
|
|
330
|
+
history.replaceState(null, '', '#' + slides[current].id);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function setFromHash() {
|
|
334
|
+
const hash = window.location.hash || '';
|
|
335
|
+
const idx = slides.findIndex((s) => '#' + s.id === hash);
|
|
336
|
+
if (idx >= 0) setActive(idx);
|
|
337
|
+
else setActive(0);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
prevBtn?.addEventListener('click', () => setActive(current - 1));
|
|
341
|
+
nextBtn?.addEventListener('click', () => setActive(current + 1));
|
|
342
|
+
|
|
343
|
+
document.addEventListener('keydown', (e) => {
|
|
344
|
+
if (e.key === 'ArrowRight' || e.key === ' ') {
|
|
345
|
+
e.preventDefault();
|
|
346
|
+
setActive(current + 1);
|
|
347
|
+
} else if (e.key === 'ArrowLeft') {
|
|
348
|
+
e.preventDefault();
|
|
349
|
+
setActive(current - 1);
|
|
350
|
+
} else if (e.key === 'Home') {
|
|
351
|
+
e.preventDefault();
|
|
352
|
+
setActive(0);
|
|
353
|
+
} else if (e.key === 'End') {
|
|
354
|
+
e.preventDefault();
|
|
355
|
+
setActive(slides.length - 1);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
window.addEventListener('hashchange', setFromHash);
|
|
360
|
+
setFromHash();
|
|
361
|
+
})();
|
|
362
|
+
|
|
363
|
+
// Copy code button
|
|
364
|
+
document.querySelectorAll('.prose pre code').forEach(block => {
|
|
365
|
+
const button = document.createElement('button');
|
|
366
|
+
button.className = 'copy-button';
|
|
367
|
+
button.textContent = 'Copy';
|
|
368
|
+
button.onclick = async () => {
|
|
369
|
+
await navigator.clipboard.writeText(block.textContent);
|
|
370
|
+
button.textContent = 'Copied!';
|
|
371
|
+
setTimeout(() => button.textContent = 'Copy', 2000);
|
|
372
|
+
};
|
|
373
|
+
block.parentElement.appendChild(button);
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
// Mobile nav toggle
|
|
377
|
+
function toggleNav() {
|
|
378
|
+
document.querySelector('.sidebar').classList.toggle('open');
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Close nav when clicking outside on mobile
|
|
382
|
+
document.addEventListener('click', (e) => {
|
|
383
|
+
const sidebar = document.querySelector('.sidebar');
|
|
384
|
+
const toggle = document.querySelector('.nav-toggle');
|
|
385
|
+
if (sidebar.classList.contains('open') &&
|
|
386
|
+
!sidebar.contains(e.target) &&
|
|
387
|
+
!toggle.contains(e.target)) {
|
|
388
|
+
sidebar.classList.remove('open');
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
</script>
|
|
392
|
+
|
|
393
|
+
</body>
|
|
394
|
+
</html>
|