kitfly 0.2.0 → 0.2.3
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 +68 -0
- package/README.md +25 -10
- package/VERSION +1 -1
- package/dist/_raw/content/guide/branding.md +146 -0
- package/dist/_raw/content/guide/data-driven-content.md +204 -0
- package/dist/_raw/content/reference/configuration.md +145 -7
- package/dist/_raw/content/reference/environment-variables.md +26 -1
- package/dist/_raw/content/reference/glossary.md +25 -1
- package/dist/_raw/content/reference/key-concepts.md +30 -2
- package/dist/_raw/content/reference/plugins.md +14 -0
- package/dist/_raw/content/reference/slides-authoring-guidelines.md +129 -0
- package/dist/_raw/content/reference.md +1 -0
- package/dist/_raw/docs/decisions/ADR-0006-data-driven-content.md +350 -0
- package/dist/content/deployment/preflight.html +10 -6
- package/dist/content/deployment/recipes/aws-s3.html +10 -6
- package/dist/content/deployment/recipes/cloudflare-pages.html +10 -6
- package/dist/content/deployment/recipes/cloudflare-r2.html +10 -6
- package/dist/content/deployment/recipes/fly-io.html +10 -6
- package/dist/content/deployment/recipes/github-pages.html +10 -6
- package/dist/content/deployment/recipes/netlify.html +10 -6
- package/dist/content/deployment/recipes/vercel.html +10 -6
- package/dist/content/deployment/secrets-and-env-vars.html +10 -6
- package/dist/content/deployment.html +10 -6
- package/dist/content/guide/approaches.html +10 -6
- package/dist/content/guide/branding.html +510 -0
- package/dist/content/guide/data-driven-content.html +543 -0
- package/dist/content/guide/features.html +10 -6
- package/dist/content/guide/getting-started.html +10 -6
- package/dist/content/guide/kitfly-overview.html +10 -6
- package/dist/content/reference/configuration.html +135 -9
- package/dist/content/reference/design-catalog.html +10 -6
- package/dist/content/reference/environment-variables.html +50 -8
- package/dist/content/reference/glossary.html +24 -8
- package/dist/content/reference/key-concepts.html +33 -9
- package/dist/content/reference/plugins.html +22 -7
- package/dist/content/reference/slides-authoring-guidelines.html +422 -0
- package/dist/content/reference/structure.html +10 -6
- package/dist/content/reference.html +11 -6
- package/dist/content/templates/crucible.html +10 -6
- package/dist/content/templates/handbook.html +10 -6
- package/dist/content/templates/minimal.html +10 -6
- package/dist/content/templates/overview.html +10 -6
- package/dist/content/templates/pipeline.html +10 -6
- package/dist/content/templates/productbook.html +10 -6
- package/dist/content/templates/runbook.html +10 -6
- package/dist/content/templates/servicebook.html +10 -6
- package/dist/content-index.json +38 -2
- package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +10 -6
- package/dist/docs/decisions/ADR-0002-ai-accessibility.html +10 -6
- package/dist/docs/decisions/ADR-0003-single-file-bundle.html +10 -6
- package/dist/docs/decisions/ADR-0004-bun-runtime.html +10 -6
- package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +10 -6
- package/dist/docs/decisions/ADR-0006-data-driven-content.html +752 -0
- package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +10 -6
- package/dist/docs/decisions/DDR-0002-theme-system.html +10 -6
- package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +10 -6
- package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +10 -6
- package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +10 -6
- package/dist/docs/userguide/cli/build.html +10 -6
- package/dist/docs/userguide/cli/bundle.html +10 -6
- package/dist/docs/userguide/cli/dev.html +10 -6
- package/dist/docs/userguide/cli/init.html +10 -6
- package/dist/docs/userguide/cli/servers.html +10 -6
- package/dist/docs/userguide/cli/stop.html +10 -6
- package/dist/docs/userguide/cli/update.html +10 -6
- package/dist/docs/userguide/cli/version.html +10 -6
- package/dist/docs/userguide/cli.html +10 -6
- package/dist/docs/userguide/sharing.html +10 -6
- package/dist/index.html +10 -6
- package/dist/llms.txt +3 -3
- package/dist/provenance.json +4 -4
- package/dist/schemas/plugin-registry.schema.html +10 -6
- package/dist/schemas/plugin-schemas-notes.html +10 -6
- package/dist/schemas/plugin.schema.html +10 -6
- package/dist/schemas/plugins.schema.html +10 -6
- package/dist/schemas/v0/common.schema.html +14 -10
- package/dist/schemas/v0/plugin-registry.schema.html +13 -9
- package/dist/schemas/v0/plugin.schema.html +13 -9
- package/dist/schemas/v0/plugins.schema.html +13 -9
- package/dist/schemas/v0/site.schema.html +67 -7
- package/dist/schemas/v0/theme.schema.html +21 -17
- package/dist/schemas.html +10 -6
- package/dist/styles.css +39 -4
- package/package.json +1 -1
- package/plugins-dist/latex-runtime.js +140 -0
- package/plugins-dist/latex.js +178 -0
- package/plugins-dist/slides-charts-lite-runtime.js +179 -0
- package/plugins-dist/slides-charts-lite.js +198 -0
- package/plugins-dist/slides-visuals.css +166 -0
- package/plugins-dist/slides-visuals.js +124 -33
- package/registry/plugins.yaml +30 -5
- package/schemas/v0/site.schema.json +56 -0
- package/scripts/build.ts +195 -70
- package/scripts/bundle.ts +122 -11
- package/scripts/dev.ts +345 -178
- package/src/__tests__/brief.test.ts +151 -0
- package/src/__tests__/build.test.ts +234 -4
- package/src/__tests__/bundle.test.ts +134 -0
- package/src/__tests__/dev-plugin-errors.test.ts +20 -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/staircase-empty-steps.md +3 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/timeline-horizontal-no-events.md +2 -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/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/timeline-horizontal.md +9 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-vertical.md +10 -0
- package/src/__tests__/init.test.ts +51 -2
- package/src/__tests__/latex-runtime.bun.test.ts +35 -0
- package/src/__tests__/shared.test.ts +621 -1
- package/src/__tests__/slides-charts-lite-runtime.bun.test.ts +45 -0
- package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +33 -0
- package/src/cli.ts +11 -4
- package/src/commands/init.ts +1 -1
- package/src/shared.ts +761 -18
- package/src/site/styles.css +39 -4
- package/src/site/template.html +5 -2
- package/src/templates/brief.ts +486 -0
- package/src/templates/deck.ts +59 -0
- package/src/templates/driver.ts +46 -13
- package/src/templates/handbook.ts +32 -0
- package/src/templates/runbook.ts +32 -0
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
</svg>
|
|
90
90
|
</button>
|
|
91
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"
|
|
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
93
|
</a>
|
|
94
94
|
<button class="mobile-theme-toggle" onclick="toggleTheme()" title="Toggle theme" aria-label="Toggle theme">
|
|
95
95
|
<svg class="icon-sun" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
<div class="sidebar-header">
|
|
107
107
|
<div class="logo logo-icon">
|
|
108
108
|
<a href="/" class="logo-icon" data-initial="K">
|
|
109
|
-
<img src="../../assets/brand/kitfly-neon-256.png" alt="Kitfly" class="logo-img"
|
|
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
110
|
</a>
|
|
111
111
|
<span class="logo-text">
|
|
112
112
|
<a href="/" class="brand">Kitfly</a>
|
|
@@ -124,13 +124,13 @@
|
|
|
124
124
|
</svg>
|
|
125
125
|
</button>
|
|
126
126
|
<div class="sidebar-meta">
|
|
127
|
-
<span class="meta-version">v0.2.
|
|
127
|
+
<span class="meta-version">v0.2.3</span>
|
|
128
128
|
<span class="meta-branch">HEAD</span>
|
|
129
129
|
</div>
|
|
130
130
|
</div>
|
|
131
131
|
</div>
|
|
132
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" class="active">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><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">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>
|
|
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/branding.html">branding</a></li><li><a href="../../content/guide/data-driven-content.html">data-driven-content</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" class="active">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">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/ADR-0006-data-driven-content.html">ADR-0006-data-driven-content</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
134
|
</div>
|
|
135
135
|
</nav>
|
|
136
136
|
<main class="content">
|
|
@@ -152,6 +152,17 @@ plugins:
|
|
|
152
152
|
- callouts@0.2.0
|
|
153
153
|
</code></pre>
|
|
154
154
|
<p>Canonical plugins are referenced as pinned strings: <code>name@x.y.z</code>.</p>
|
|
155
|
+
<h3 id="canonical-plugins-v022">Canonical plugins (v0.2.2)</h3>
|
|
156
|
+
<ul>
|
|
157
|
+
<li><code>callouts@0.2.0</code> - styled NOTE/TIP/INFO/WARNING/DANGER blockquotes</li>
|
|
158
|
+
<li><code>slides-visuals@0.2.1</code> - slide widgets + figures via <code>:::</code> blocks (<code>slides</code> mode only)</li>
|
|
159
|
+
<li><code>latex@0.2.2</code> - KaTeX math rendering for <code>$...$</code>, <code>$$...$$</code>, and fenced <code>math</code> blocks</li>
|
|
160
|
+
<li><code>slides-charts-lite@0.2.2</code> - bar/line/pie charts from fenced <code>chart</code> blocks (<code>slides</code> mode only)</li>
|
|
161
|
+
</ul>
|
|
162
|
+
<p>Example:</p>
|
|
163
|
+
<pre><code class="language-yaml">plugins:
|
|
164
|
+
- latex@0.2.2
|
|
165
|
+
</code></pre>
|
|
155
166
|
<h2 id="registry-assets">Registry + assets</h2>
|
|
156
167
|
<p>Canonical plugins come from a registry file:</p>
|
|
157
168
|
<ul>
|
|
@@ -308,16 +319,17 @@ value: 1,234
|
|
|
308
319
|
</code></pre>
|
|
309
320
|
|
|
310
321
|
</article>
|
|
311
|
-
<aside class="toc"><span class="toc-title">On this page</span><ul><li><a href="#enable-a-plugin">Enable a plugin</a></li><li><a href="#registry-assets">Registry + assets</a></li><li><a href="#integrity-checks">Integrity checks</a></li><li class="toc-h3"><a href="#valid-block-shape">Valid block shape</a></li><li class="toc-h3"><a href="#supported-types">Supported types</a></li><li class="toc-h3"><a href="#example-valid">Example (valid)</a></li><li class="toc-h3"><a href="#how-to-know-its-correct">How to know it’s correct</a></li><li class="toc-h3"><a href="#common-mistakes-and-how-to-fix-them">Common mistakes (and how to fix them)</a></li><li class="toc-h3"><a href="#examples-invalid-fixed">Examples (invalid → fixed)</a></li></ul></aside>
|
|
322
|
+
<aside class="toc"><span class="toc-title">On this page</span><ul><li><a href="#enable-a-plugin">Enable a plugin</a></li><li class="toc-h3"><a href="#canonical-plugins-v022">Canonical plugins (v0.2.2)</a></li><li><a href="#registry-assets">Registry + assets</a></li><li><a href="#integrity-checks">Integrity checks</a></li><li class="toc-h3"><a href="#valid-block-shape">Valid block shape</a></li><li class="toc-h3"><a href="#supported-types">Supported types</a></li><li class="toc-h3"><a href="#example-valid">Example (valid)</a></li><li class="toc-h3"><a href="#how-to-know-its-correct">How to know it’s correct</a></li><li class="toc-h3"><a href="#common-mistakes-and-how-to-fix-them">Common mistakes (and how to fix them)</a></li><li class="toc-h3"><a href="#examples-invalid-fixed">Examples (invalid → fixed)</a></li></ul></aside>
|
|
312
323
|
</main>
|
|
313
324
|
</div>
|
|
314
325
|
|
|
315
326
|
<footer class="site-footer">
|
|
316
327
|
<div class="footer-content">
|
|
317
328
|
<div class="footer-left">
|
|
318
|
-
|
|
329
|
+
|
|
330
|
+
<span class="footer-version">v0.2.3</span>
|
|
319
331
|
<span class="footer-separator">·</span>
|
|
320
|
-
<span class="footer-commit" title="Commit:
|
|
332
|
+
<span class="footer-commit" title="Commit: 664328f">Published 2026-02-18</span>
|
|
321
333
|
</div>
|
|
322
334
|
<div class="footer-center">
|
|
323
335
|
<span class="footer-copyright"><a href="https://3leaps.net" class="footer-link">© 2026 3 Leaps, LLC</a></span>
|
|
@@ -396,6 +408,9 @@ value: 1,234
|
|
|
396
408
|
if (window.reinitMermaid) {
|
|
397
409
|
window.reinitMermaid();
|
|
398
410
|
}
|
|
411
|
+
if (window.reinitCharts) {
|
|
412
|
+
window.reinitCharts();
|
|
413
|
+
}
|
|
399
414
|
}
|
|
400
415
|
|
|
401
416
|
// Slides mode hash routing
|
|
@@ -0,0 +1,422 @@
|
|
|
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>Slides Authoring Guidelines - 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.3</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/branding.html">branding</a></li><li><a href="../../content/guide/data-driven-content.html">data-driven-content</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" class="active">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">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/ADR-0006-data-driven-content.html">ADR-0006-data-driven-content</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/reference/configuration.html">Reference</a><span class="separator">›</span><span>slides-authoring-guidelines</span></nav>
|
|
139
|
+
<div class="page-meta">Last updated: 2026-02-15</div>
|
|
140
|
+
<h1 id="slides-authoring-guidelines">Slides Authoring Guidelines</h1>
|
|
141
|
+
<p>This page is for slide authors and AI agents generating slide content.</p>
|
|
142
|
+
<p>Goal: avoid common layouts that look broken but are actually content-density issues.</p>
|
|
143
|
+
<h2 id="quick-rules">Quick rules</h2>
|
|
144
|
+
<ul>
|
|
145
|
+
<li>Keep vertical visuals short. If a slide is tall and busy, trim items before adding more styling.</li>
|
|
146
|
+
<li>Treat highlighted (<code>.accent</code>) blocks as emphasis, not interaction.</li>
|
|
147
|
+
<li>Scroll in slides mode is allowed for dense content. Prefer no scroll for presentation slides.</li>
|
|
148
|
+
</ul>
|
|
149
|
+
<h2 id="df-006-single-accent-in-block-grid-looks-like-a-tab">DF-006: Single <code>.accent</code> in <code>.block-grid</code> looks like a tab</h2>
|
|
150
|
+
<h3 id="problem">Problem</h3>
|
|
151
|
+
<p>When one block in a row is accented and others are not, users read it as a selected tab and expect click behavior.</p>
|
|
152
|
+
<h3 id="do-this">Do this</h3>
|
|
153
|
+
<ul>
|
|
154
|
+
<li>In one grid row, accent all blocks or accent none.</li>
|
|
155
|
+
<li>If you need real tabs, treat that as a future widget (<code>slides-widgets</code>), not static blocks.</li>
|
|
156
|
+
</ul>
|
|
157
|
+
<h3 id="avoid-this">Avoid this</h3>
|
|
158
|
+
<pre><code class="language-html"><div class="block-grid cols-3">
|
|
159
|
+
<div class="block">Backend</div>
|
|
160
|
+
<div class="block accent">Platform</div>
|
|
161
|
+
<div class="block">SRE</div>
|
|
162
|
+
</div>
|
|
163
|
+
</code></pre>
|
|
164
|
+
<h3 id="prefer-this">Prefer this</h3>
|
|
165
|
+
<pre><code class="language-html"><div class="block-grid cols-3">
|
|
166
|
+
<div class="block accent">Backend</div>
|
|
167
|
+
<div class="block accent">Platform</div>
|
|
168
|
+
<div class="block accent">SRE</div>
|
|
169
|
+
</div>
|
|
170
|
+
</code></pre>
|
|
171
|
+
<p>or</p>
|
|
172
|
+
<pre><code class="language-html"><div class="block-grid cols-3">
|
|
173
|
+
<div class="block">Backend</div>
|
|
174
|
+
<div class="block">Platform</div>
|
|
175
|
+
<div class="block">SRE</div>
|
|
176
|
+
</div>
|
|
177
|
+
</code></pre>
|
|
178
|
+
<h2 id="df-007-block-flowvertical-can-overflow-at-43">DF-007: <code>block-flow.vertical</code> can overflow at 4/3</h2>
|
|
179
|
+
<h3 id="problem">Problem</h3>
|
|
180
|
+
<p><code>.block-flow.vertical</code> (HTML: <code>class="block-flow vertical"</code>) with 4 steps can exceed the visible frame at <code>4/3</code>.</p>
|
|
181
|
+
<h3 id="do-this">Do this</h3>
|
|
182
|
+
<ul>
|
|
183
|
+
<li>At <code>4/3</code>: limit vertical flows to 3 blocks.</li>
|
|
184
|
+
<li>At <code>16/9</code>: 4 blocks is usually fine.</li>
|
|
185
|
+
<li>If the slide also has extra text/callouts, reduce steps further.</li>
|
|
186
|
+
</ul>
|
|
187
|
+
<h3 id="guidance">Guidance</h3>
|
|
188
|
+
<ul>
|
|
189
|
+
<li>If you must keep all steps, scroll is acceptable.</li>
|
|
190
|
+
<li>For presentation-first slides, split into two slides instead.</li>
|
|
191
|
+
</ul>
|
|
192
|
+
<h3 id="example-target">Example target</h3>
|
|
193
|
+
<pre><code class="language-html"><div class="block-flow vertical">
|
|
194
|
+
<div class="block">1. Intake</div>
|
|
195
|
+
<div class="block">2. Validate</div>
|
|
196
|
+
<div class="block">3. Ship</div>
|
|
197
|
+
</div>
|
|
198
|
+
</code></pre>
|
|
199
|
+
<h2 id="df-014-timeline-vertical-callout-can-clip-at-169">DF-014: <code>timeline-vertical</code> + callout can clip at 16/9</h2>
|
|
200
|
+
<h3 id="problem">Problem</h3>
|
|
201
|
+
<p>A 5-event vertical timeline plus a callout often exceeds the frame at <code>16/9</code>.</p>
|
|
202
|
+
<h3 id="do-this">Do this</h3>
|
|
203
|
+
<ul>
|
|
204
|
+
<li>At <code>16/9</code>: keep <code>timeline-vertical</code> to 4 events when the slide also has a callout.</li>
|
|
205
|
+
<li>At <code>4/3</code>: keep to 3 events with a callout.</li>
|
|
206
|
+
<li>If you need all events, remove the callout or move it to a follow-up slide.</li>
|
|
207
|
+
</ul>
|
|
208
|
+
<h3 id="example-safe-with-callout">Example (safe with callout)</h3>
|
|
209
|
+
<pre><code class="language-text">:::timeline-vertical
|
|
210
|
+
events:
|
|
211
|
+
- label: "Detect"
|
|
212
|
+
date: "09:15"
|
|
213
|
+
- label: "Triage"
|
|
214
|
+
date: "09:24"
|
|
215
|
+
- label: "Mitigate"
|
|
216
|
+
date: "09:42"
|
|
217
|
+
- label: "Recover"
|
|
218
|
+
date: "10:08"
|
|
219
|
+
:::
|
|
220
|
+
|
|
221
|
+
> WARNING: External API fallback remained active for 12 minutes.
|
|
222
|
+
</code></pre>
|
|
223
|
+
<h2 id="aspect-ratio-checklist">Aspect ratio checklist</h2>
|
|
224
|
+
<ul>
|
|
225
|
+
<li><code>16/9</code>: medium density, but still cap long vertical stacks.</li>
|
|
226
|
+
<li><code>4/3</code>: tighter vertical budget. Reduce stacked items first.</li>
|
|
227
|
+
<li><code>16/10</code>: between <code>16/9</code> and <code>4/3</code>; apply the same conservative limits when callouts are present.</li>
|
|
228
|
+
</ul>
|
|
229
|
+
<h2 id="summary">Summary</h2>
|
|
230
|
+
<p>These are authoring constraints, not renderer bugs. When a slide clips:</p>
|
|
231
|
+
<ol>
|
|
232
|
+
<li>Reduce vertical item count.</li>
|
|
233
|
+
<li>Remove or move callouts.</li>
|
|
234
|
+
<li>Split dense content across two slides.</li>
|
|
235
|
+
</ol>
|
|
236
|
+
|
|
237
|
+
</article>
|
|
238
|
+
<aside class="toc"><span class="toc-title">On this page</span><ul><li><a href="#quick-rules">Quick rules</a></li><li class="toc-h3"><a href="#problem">Problem</a></li><li class="toc-h3"><a href="#do-this">Do this</a></li><li class="toc-h3"><a href="#avoid-this">Avoid this</a></li><li class="toc-h3"><a href="#prefer-this">Prefer this</a></li><li class="toc-h3"><a href="#problem">Problem</a></li><li class="toc-h3"><a href="#do-this">Do this</a></li><li class="toc-h3"><a href="#guidance">Guidance</a></li><li class="toc-h3"><a href="#example-target">Example target</a></li><li class="toc-h3"><a href="#problem">Problem</a></li><li class="toc-h3"><a href="#do-this">Do this</a></li><li class="toc-h3"><a href="#example-safe-with-callout">Example (safe with callout)</a></li><li><a href="#aspect-ratio-checklist">Aspect ratio checklist</a></li><li><a href="#summary">Summary</a></li></ul></aside>
|
|
239
|
+
</main>
|
|
240
|
+
</div>
|
|
241
|
+
|
|
242
|
+
<footer class="site-footer">
|
|
243
|
+
<div class="footer-content">
|
|
244
|
+
<div class="footer-left">
|
|
245
|
+
|
|
246
|
+
<span class="footer-version">v0.2.3</span>
|
|
247
|
+
<span class="footer-separator">·</span>
|
|
248
|
+
<span class="footer-commit" title="Commit: 664328f">Published 2026-02-18</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
|
+
if (window.reinitCharts) {
|
|
328
|
+
window.reinitCharts();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Slides mode hash routing
|
|
333
|
+
(function initSlidesMode() {
|
|
334
|
+
const shell = document.querySelector('.slides-shell');
|
|
335
|
+
if (!shell) return;
|
|
336
|
+
|
|
337
|
+
const slides = Array.from(document.querySelectorAll('.slide'));
|
|
338
|
+
if (!slides.length) return;
|
|
339
|
+
|
|
340
|
+
const prevBtn = document.querySelector('.slide-prev');
|
|
341
|
+
const nextBtn = document.querySelector('.slide-next');
|
|
342
|
+
const counter = document.querySelector('.slide-counter');
|
|
343
|
+
const progressBar = document.querySelector('.slide-progress-bar');
|
|
344
|
+
const navLinks = Array.from(document.querySelectorAll('.sidebar-nav a[href^="#slide-"]'));
|
|
345
|
+
let current = 0;
|
|
346
|
+
|
|
347
|
+
function setActive(n) {
|
|
348
|
+
current = Math.max(0, Math.min(n, slides.length - 1));
|
|
349
|
+
slides.forEach((slide, idx) => slide.classList.toggle('active', idx === current));
|
|
350
|
+
navLinks.forEach((link) => {
|
|
351
|
+
const active = link.getAttribute('href') === '#' + slides[current].id;
|
|
352
|
+
link.classList.toggle('active', active);
|
|
353
|
+
});
|
|
354
|
+
if (counter) counter.textContent = (current + 1) + ' / ' + slides.length;
|
|
355
|
+
if (progressBar) progressBar.style.width = (((current + 1) / slides.length) * 100) + '%';
|
|
356
|
+
if (prevBtn) prevBtn.disabled = current === 0;
|
|
357
|
+
if (nextBtn) nextBtn.disabled = current === slides.length - 1;
|
|
358
|
+
history.replaceState(null, '', '#' + slides[current].id);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function setFromHash() {
|
|
362
|
+
const hash = window.location.hash || '';
|
|
363
|
+
const idx = slides.findIndex((s) => '#' + s.id === hash);
|
|
364
|
+
if (idx >= 0) setActive(idx);
|
|
365
|
+
else setActive(0);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
prevBtn?.addEventListener('click', () => setActive(current - 1));
|
|
369
|
+
nextBtn?.addEventListener('click', () => setActive(current + 1));
|
|
370
|
+
|
|
371
|
+
document.addEventListener('keydown', (e) => {
|
|
372
|
+
if (e.key === 'ArrowRight' || e.key === ' ') {
|
|
373
|
+
e.preventDefault();
|
|
374
|
+
setActive(current + 1);
|
|
375
|
+
} else if (e.key === 'ArrowLeft') {
|
|
376
|
+
e.preventDefault();
|
|
377
|
+
setActive(current - 1);
|
|
378
|
+
} else if (e.key === 'Home') {
|
|
379
|
+
e.preventDefault();
|
|
380
|
+
setActive(0);
|
|
381
|
+
} else if (e.key === 'End') {
|
|
382
|
+
e.preventDefault();
|
|
383
|
+
setActive(slides.length - 1);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
window.addEventListener('hashchange', setFromHash);
|
|
388
|
+
setFromHash();
|
|
389
|
+
})();
|
|
390
|
+
|
|
391
|
+
// Copy code button
|
|
392
|
+
document.querySelectorAll('.prose pre code').forEach(block => {
|
|
393
|
+
const button = document.createElement('button');
|
|
394
|
+
button.className = 'copy-button';
|
|
395
|
+
button.textContent = 'Copy';
|
|
396
|
+
button.onclick = async () => {
|
|
397
|
+
await navigator.clipboard.writeText(block.textContent);
|
|
398
|
+
button.textContent = 'Copied!';
|
|
399
|
+
setTimeout(() => button.textContent = 'Copy', 2000);
|
|
400
|
+
};
|
|
401
|
+
block.parentElement.appendChild(button);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
// Mobile nav toggle
|
|
405
|
+
function toggleNav() {
|
|
406
|
+
document.querySelector('.sidebar').classList.toggle('open');
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Close nav when clicking outside on mobile
|
|
410
|
+
document.addEventListener('click', (e) => {
|
|
411
|
+
const sidebar = document.querySelector('.sidebar');
|
|
412
|
+
const toggle = document.querySelector('.nav-toggle');
|
|
413
|
+
if (sidebar.classList.contains('open') &&
|
|
414
|
+
!sidebar.contains(e.target) &&
|
|
415
|
+
!toggle.contains(e.target)) {
|
|
416
|
+
sidebar.classList.remove('open');
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
</script>
|
|
420
|
+
|
|
421
|
+
</body>
|
|
422
|
+
</html>
|