kitfly 0.1.2 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/README.md +63 -16
  3. package/VERSION +1 -1
  4. package/dist/_raw/content/deployment/preflight.md +134 -0
  5. package/dist/_raw/content/deployment/recipes/aws-s3.md +128 -0
  6. package/dist/_raw/content/deployment/recipes/cloudflare-pages.md +73 -0
  7. package/dist/_raw/content/deployment/recipes/cloudflare-r2.md +156 -0
  8. package/dist/_raw/content/deployment/recipes/fly-io.md +57 -0
  9. package/dist/_raw/content/deployment/recipes/github-pages.md +112 -0
  10. package/dist/_raw/content/deployment/recipes/netlify.md +99 -0
  11. package/dist/_raw/content/deployment/recipes/vercel.md +88 -0
  12. package/dist/_raw/content/deployment/secrets-and-env-vars.md +75 -0
  13. package/dist/_raw/content/deployment.md +128 -0
  14. package/dist/_raw/content/guide/approaches.md +182 -0
  15. package/dist/_raw/content/guide/features.md +121 -0
  16. package/dist/_raw/content/guide/getting-started.md +112 -0
  17. package/dist/_raw/content/guide/kitfly-overview.md +209 -0
  18. package/dist/_raw/content/reference/configuration.md +259 -0
  19. package/dist/_raw/content/reference/design-catalog.md +167 -0
  20. package/dist/_raw/content/reference/environment-variables.md +66 -0
  21. package/dist/_raw/content/reference/glossary.md +92 -0
  22. package/dist/_raw/content/reference/key-concepts.md +118 -0
  23. package/dist/_raw/content/reference/plugins.md +220 -0
  24. package/dist/_raw/content/reference/slides-authoring-guidelines.md +129 -0
  25. package/dist/_raw/content/reference/structure.md +166 -0
  26. package/dist/_raw/content/reference.md +20 -0
  27. package/dist/_raw/content/templates/crucible.md +192 -0
  28. package/dist/_raw/content/templates/handbook.md +83 -0
  29. package/dist/_raw/content/templates/minimal.md +138 -0
  30. package/dist/_raw/content/templates/overview.md +187 -0
  31. package/dist/_raw/content/templates/pipeline.md +151 -0
  32. package/dist/_raw/content/templates/productbook.md +187 -0
  33. package/dist/_raw/content/templates/runbook.md +193 -0
  34. package/dist/_raw/content/templates/servicebook.md +163 -0
  35. package/dist/_raw/docs/decisions/ADR-0001-minimalist-site-code.md +118 -0
  36. package/dist/_raw/docs/decisions/ADR-0002-ai-accessibility.md +153 -0
  37. package/dist/_raw/docs/decisions/ADR-0003-single-file-bundle.md +93 -0
  38. package/dist/_raw/docs/decisions/ADR-0004-bun-runtime.md +98 -0
  39. package/dist/_raw/docs/decisions/ADR-0005-plugin-contract-and-distribution.md +110 -0
  40. package/dist/_raw/docs/decisions/DDR-0001-viewport-locked-layout.md +111 -0
  41. package/dist/_raw/docs/decisions/DDR-0002-theme-system.md +131 -0
  42. package/dist/_raw/docs/decisions/DDR-0003-bounded-logo-slot.md +106 -0
  43. package/dist/_raw/docs/decisions/DDR-0004-slides-rendering-model.md +113 -0
  44. package/dist/_raw/docs/decisions/DDR-0005-deterministic-layout-boundary.md +107 -0
  45. package/dist/_raw/docs/userguide/cli/build.md +85 -0
  46. package/dist/_raw/docs/userguide/cli/bundle.md +81 -0
  47. package/dist/_raw/docs/userguide/cli/dev.md +92 -0
  48. package/dist/_raw/docs/userguide/cli/init.md +116 -0
  49. package/dist/_raw/docs/userguide/cli/servers.md +69 -0
  50. package/dist/_raw/docs/userguide/cli/stop.md +76 -0
  51. package/dist/_raw/docs/userguide/cli/update.md +78 -0
  52. package/dist/_raw/docs/userguide/cli/version.md +65 -0
  53. package/dist/_raw/docs/userguide/cli.md +34 -0
  54. package/dist/_raw/docs/userguide/sharing.md +94 -0
  55. package/dist/_raw/schemas/plugin-schemas-notes.md +71 -0
  56. package/dist/_raw/schemas.md +42 -0
  57. package/dist/assets/brand/kitfly-favicon-32.png +0 -0
  58. package/dist/assets/brand/kitfly-icon-64.png +0 -0
  59. package/dist/assets/brand/kitfly-logo-128.png +0 -0
  60. package/dist/assets/brand/kitfly-logo-512.png +0 -0
  61. package/dist/assets/brand/kitfly-logo.svg +12132 -0
  62. package/dist/assets/brand/kitfly-neon-128.png +0 -0
  63. package/dist/assets/brand/kitfly-neon-192.png +0 -0
  64. package/dist/assets/brand/kitfly-neon-256.png +0 -0
  65. package/dist/assets/brand/kitfly-neon.png +0 -0
  66. package/dist/assets/brand/palette.md +75 -0
  67. package/dist/content/deployment/index.html +11 -0
  68. package/dist/content/deployment/preflight.html +418 -0
  69. package/dist/content/deployment/recipes/aws-s3.html +421 -0
  70. package/dist/content/deployment/recipes/cloudflare-pages.html +372 -0
  71. package/dist/content/deployment/recipes/cloudflare-r2.html +443 -0
  72. package/dist/content/deployment/recipes/fly-io.html +356 -0
  73. package/dist/content/deployment/recipes/github-pages.html +414 -0
  74. package/dist/content/deployment/recipes/index.html +11 -0
  75. package/dist/content/deployment/recipes/netlify.html +394 -0
  76. package/dist/content/deployment/recipes/vercel.html +382 -0
  77. package/dist/content/deployment/secrets-and-env-vars.html +380 -0
  78. package/dist/content/deployment.html +426 -0
  79. package/dist/content/guide/approaches.html +501 -0
  80. package/dist/content/guide/features.html +436 -0
  81. package/dist/content/guide/getting-started.html +403 -0
  82. package/dist/content/guide/index.html +11 -0
  83. package/dist/content/guide/kitfly-overview.html +544 -0
  84. package/dist/content/index.html +11 -0
  85. package/dist/content/reference/configuration.html +580 -0
  86. package/dist/content/reference/design-catalog.html +449 -0
  87. package/dist/content/reference/environment-variables.html +367 -0
  88. package/dist/content/reference/glossary.html +368 -0
  89. package/dist/content/reference/index.html +11 -0
  90. package/dist/content/reference/key-concepts.html +399 -0
  91. package/dist/content/reference/plugins.html +491 -0
  92. package/dist/content/reference/slides-authoring-guidelines.html +418 -0
  93. package/dist/content/reference/structure.html +463 -0
  94. package/dist/content/reference.html +335 -0
  95. package/dist/content/templates/crucible.html +546 -0
  96. package/dist/content/templates/handbook.html +405 -0
  97. package/dist/content/templates/index.html +11 -0
  98. package/dist/content/templates/minimal.html +447 -0
  99. package/dist/content/templates/overview.html +558 -0
  100. package/dist/content/templates/pipeline.html +494 -0
  101. package/dist/content/templates/productbook.html +540 -0
  102. package/dist/content/templates/runbook.html +543 -0
  103. package/dist/content/templates/servicebook.html +523 -0
  104. package/dist/content-index.json +549 -0
  105. package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +491 -0
  106. package/dist/docs/decisions/ADR-0002-ai-accessibility.html +434 -0
  107. package/dist/docs/decisions/ADR-0003-single-file-bundle.html +412 -0
  108. package/dist/docs/decisions/ADR-0004-bun-runtime.html +409 -0
  109. package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +402 -0
  110. package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +459 -0
  111. package/dist/docs/decisions/DDR-0002-theme-system.html +452 -0
  112. package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +423 -0
  113. package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +399 -0
  114. package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +422 -0
  115. package/dist/docs/decisions/index.html +11 -0
  116. package/dist/docs/userguide/cli/build.html +408 -0
  117. package/dist/docs/userguide/cli/bundle.html +419 -0
  118. package/dist/docs/userguide/cli/dev.html +428 -0
  119. package/dist/docs/userguide/cli/index.html +11 -0
  120. package/dist/docs/userguide/cli/init.html +436 -0
  121. package/dist/docs/userguide/cli/servers.html +393 -0
  122. package/dist/docs/userguide/cli/stop.html +408 -0
  123. package/dist/docs/userguide/cli/update.html +406 -0
  124. package/dist/docs/userguide/cli/version.html +406 -0
  125. package/dist/docs/userguide/cli.html +386 -0
  126. package/dist/docs/userguide/index.html +11 -0
  127. package/dist/docs/userguide/sharing.html +465 -0
  128. package/dist/index.html +387 -0
  129. package/dist/llms.txt +18 -0
  130. package/dist/provenance.json +7 -0
  131. package/dist/schemas/index.html +11 -0
  132. package/dist/schemas/plugin-registry.schema.html +327 -0
  133. package/dist/schemas/plugin-schemas-notes.html +364 -0
  134. package/dist/schemas/plugin.schema.html +327 -0
  135. package/dist/schemas/plugins.schema.html +327 -0
  136. package/dist/schemas/v0/common.schema.html +386 -0
  137. package/dist/schemas/v0/index.html +11 -0
  138. package/dist/schemas/v0/plugin-registry.schema.html +547 -0
  139. package/dist/schemas/v0/plugin.schema.html +497 -0
  140. package/dist/schemas/v0/plugins.schema.html +406 -0
  141. package/dist/schemas/v0/site.schema.html +541 -0
  142. package/dist/schemas/v0/theme.schema.html +615 -0
  143. package/dist/schemas.html +351 -0
  144. package/dist/styles.css +1262 -0
  145. package/package.json +4 -2
  146. package/plugins-dist/callouts.css +32 -0
  147. package/plugins-dist/callouts.js +46 -0
  148. package/plugins-dist/slides-visuals.css +390 -0
  149. package/plugins-dist/slides-visuals.js +689 -0
  150. package/registry/plugins.yaml +35 -0
  151. package/schemas/README.md +10 -0
  152. package/schemas/plugin-registry.schema.json +5 -0
  153. package/schemas/plugin-schemas-notes.md +71 -0
  154. package/schemas/plugin.schema.json +5 -0
  155. package/schemas/plugins.schema.json +5 -0
  156. package/schemas/v0/common.schema.json +64 -0
  157. package/schemas/v0/plugin-registry.schema.json +225 -0
  158. package/schemas/v0/plugin.schema.json +175 -0
  159. package/schemas/v0/plugins.schema.json +84 -0
  160. package/schemas/v0/site.schema.json +56 -9
  161. package/schemas/v0/theme.schema.json +105 -22
  162. package/scripts/build.ts +158 -3
  163. package/scripts/bundle.ts +261 -95
  164. package/scripts/dev.ts +301 -11
  165. package/src/__tests__/build.test.ts +220 -1
  166. package/src/__tests__/bundle.test.ts +31 -0
  167. package/src/__tests__/cli.test.ts +14 -3
  168. package/src/__tests__/dev-plugin-errors.test.ts +20 -0
  169. package/src/__tests__/fixtures/fences/slides-visuals/invalid/bad-list-indent.md +5 -0
  170. package/src/__tests__/fixtures/fences/slides-visuals/invalid/blank-line.md +5 -0
  171. package/src/__tests__/fixtures/fences/slides-visuals/invalid/compare-object-items.md +9 -0
  172. package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-branching-no-source.md +5 -0
  173. package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-converging-no-target.md +6 -0
  174. package/src/__tests__/fixtures/fences/slides-visuals/invalid/indented-fence.md +4 -0
  175. package/src/__tests__/fixtures/fences/slides-visuals/invalid/staircase-empty-steps.md +3 -0
  176. package/src/__tests__/fixtures/fences/slides-visuals/invalid/stat-grid-missing-fields.md +5 -0
  177. package/src/__tests__/fixtures/fences/slides-visuals/invalid/timeline-horizontal-no-events.md +2 -0
  178. package/src/__tests__/fixtures/fences/slides-visuals/invalid/unknown-type.md +3 -0
  179. package/src/__tests__/fixtures/fences/slides-visuals/valid/compare.md +10 -0
  180. package/src/__tests__/fixtures/fences/slides-visuals/valid/comparison-table.md +14 -0
  181. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching-no-split.md +7 -0
  182. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching.md +8 -0
  183. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging-no-merge.md +7 -0
  184. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging.md +8 -0
  185. package/src/__tests__/fixtures/fences/slides-visuals/valid/funnel.md +7 -0
  186. package/src/__tests__/fixtures/fences/slides-visuals/valid/kpi.md +5 -0
  187. package/src/__tests__/fixtures/fences/slides-visuals/valid/layer-cake.md +6 -0
  188. package/src/__tests__/fixtures/fences/slides-visuals/valid/pyramid.md +6 -0
  189. package/src/__tests__/fixtures/fences/slides-visuals/valid/quadrant-grid.md +8 -0
  190. package/src/__tests__/fixtures/fences/slides-visuals/valid/scorecard.md +13 -0
  191. package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase-down.md +7 -0
  192. package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase.md +8 -0
  193. package/src/__tests__/fixtures/fences/slides-visuals/valid/stat-grid.md +8 -0
  194. package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-horizontal.md +9 -0
  195. package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-vertical.md +10 -0
  196. package/src/__tests__/init.test.ts +35 -0
  197. package/src/__tests__/plugin-loader.test.ts +221 -0
  198. package/src/__tests__/shared.test.ts +451 -0
  199. package/src/__tests__/slides-visuals-fence-contract.test.ts +28 -0
  200. package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +147 -0
  201. package/src/__tests__/styles.test.ts +35 -0
  202. package/src/cli.ts +9 -4
  203. package/src/plugin-loader.ts +245 -0
  204. package/src/shared.ts +650 -7
  205. package/src/site/styles.css +331 -0
  206. package/src/site/template.html +66 -5
  207. package/src/templates/deck.ts +186 -0
  208. package/src/templates/driver.ts +11 -1
  209. package/src/templates/minimal.ts +1 -0
@@ -0,0 +1,1262 @@
1
+ /* Kitfly - Minimal, professional styling */
2
+
3
+ :root {
4
+ /* Light theme (default) */
5
+ --color-bg: #ffffff;
6
+ --color-bg-sidebar: #f8f9fa;
7
+ --color-text: #1a1a1a;
8
+ --color-text-muted: #6b7280;
9
+ --color-border: #e5e7eb;
10
+ --color-link: #2563eb;
11
+ --color-link-hover: #1d4ed8;
12
+ --color-accent: #0f172a;
13
+ --color-code-bg: #f3f4f6;
14
+ --color-logo: #0f172a;
15
+ /* Logo colors - light mode */
16
+ --logo-doc: #152F46;
17
+ --logo-fold: #0A6172;
18
+ --logo-feather: #007182;
19
+ --logo-accent: #D17059;
20
+
21
+ /* Typography */
22
+ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
23
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
24
+
25
+ /* Layout */
26
+ --sidebar-width: 280px;
27
+ --footer-height: 2.25rem;
28
+ }
29
+
30
+ /* Dark theme - automatic based on OS preference */
31
+ @media (prefers-color-scheme: dark) {
32
+ :root:not([data-theme="light"]) {
33
+ --color-bg: #0f172a;
34
+ --color-bg-sidebar: #1e293b;
35
+ --color-text: #e2e8f0;
36
+ --color-text-muted: #94a3b8;
37
+ --color-border: #334155;
38
+ --color-link: #60a5fa;
39
+ --color-link-hover: #93c5fd;
40
+ --color-accent: #f8fafc;
41
+ --color-code-bg: #1e293b;
42
+ --color-logo: #f8fafc;
43
+ /* Logo colors - dark mode (brighter for contrast) */
44
+ --logo-doc: #60A5FA;
45
+ --logo-fold: #22D3EE;
46
+ --logo-feather: #06B6D4;
47
+ --logo-accent: #FB923C;
48
+ }
49
+ }
50
+
51
+ /* Dark theme - manual override */
52
+ [data-theme="dark"] {
53
+ --color-bg: #0f172a;
54
+ --color-bg-sidebar: #1e293b;
55
+ --color-text: #e2e8f0;
56
+ --color-text-muted: #94a3b8;
57
+ --color-border: #334155;
58
+ --color-link: #60a5fa;
59
+ --color-link-hover: #93c5fd;
60
+ --color-accent: #f8fafc;
61
+ --color-code-bg: #1e293b;
62
+ --color-logo: #f8fafc;
63
+ /* Logo colors - dark mode (brighter for contrast) */
64
+ --logo-doc: #60A5FA;
65
+ --logo-fold: #22D3EE;
66
+ --logo-feather: #06B6D4;
67
+ --logo-accent: #FB923C;
68
+ }
69
+
70
+ /* Light theme - manual override */
71
+ [data-theme="light"] {
72
+ --color-bg: #ffffff;
73
+ --color-bg-sidebar: #f8f9fa;
74
+ --color-text: #1a1a1a;
75
+ --color-text-muted: #6b7280;
76
+ --color-border: #e5e7eb;
77
+ --color-link: #2563eb;
78
+ --color-link-hover: #1d4ed8;
79
+ --color-accent: #0f172a;
80
+ --color-code-bg: #f3f4f6;
81
+ --color-logo: #0f172a;
82
+ /* Logo colors - light mode */
83
+ --logo-doc: #152F46;
84
+ --logo-fold: #0A6172;
85
+ --logo-feather: #007182;
86
+ --logo-accent: #D17059;
87
+ }
88
+
89
+ * {
90
+ margin: 0;
91
+ padding: 0;
92
+ box-sizing: border-box;
93
+ }
94
+
95
+ html {
96
+ font-size: 16px;
97
+ }
98
+
99
+ body {
100
+ font-family: var(--font-sans);
101
+ color: var(--color-text);
102
+ background: var(--color-bg);
103
+ line-height: 1.6;
104
+ transition: background-color 0.2s ease, color 0.2s ease;
105
+ }
106
+
107
+ /* Layout */
108
+ .layout {
109
+ display: flex;
110
+ min-height: calc(100vh - var(--footer-height));
111
+ }
112
+
113
+ /* Sidebar */
114
+ .sidebar {
115
+ width: var(--sidebar-width);
116
+ background: var(--color-bg-sidebar);
117
+ border-right: 1px solid var(--color-border);
118
+ position: fixed;
119
+ top: 0;
120
+ left: 0;
121
+ bottom: var(--footer-height);
122
+ overflow-y: auto;
123
+ padding: 1.5rem;
124
+ transition: background-color 0.2s ease, border-color 0.2s ease;
125
+ }
126
+
127
+ .sidebar-header {
128
+ margin-bottom: 1rem;
129
+ display: flex;
130
+ align-items: flex-start;
131
+ justify-content: space-between;
132
+ gap: 0.75rem;
133
+ }
134
+
135
+ .logo {
136
+ display: flex;
137
+ align-items: flex-start;
138
+ gap: 0.75rem;
139
+ flex: 1;
140
+ min-width: 0;
141
+ }
142
+
143
+ .logo-icon {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ height: 64px;
147
+ width: auto;
148
+ max-width: 180px;
149
+ flex-shrink: 0;
150
+ }
151
+
152
+ .logo-icon svg,
153
+ .logo-icon img,
154
+ .logo-img {
155
+ display: block;
156
+ width: auto;
157
+ height: 100%;
158
+ max-width: 100%;
159
+ object-fit: contain;
160
+ object-position: left center;
161
+ }
162
+
163
+ /* Logo dark mode - brighten for visibility */
164
+ [data-theme="dark"] .logo-img,
165
+ [data-theme="dark"] .logo-icon img {
166
+ filter: brightness(1.3) saturate(1.2);
167
+ }
168
+
169
+ @media (prefers-color-scheme: dark) {
170
+ :root:not([data-theme="light"]) .logo-img,
171
+ :root:not([data-theme="light"]) .logo-icon img {
172
+ filter: brightness(1.3) saturate(1.2);
173
+ }
174
+ }
175
+
176
+ .logo-icon.logo-fallback,
177
+ .mobile-logo.logo-fallback {
178
+ width: 2rem;
179
+ height: 2rem;
180
+ max-width: none;
181
+ border-radius: 999px;
182
+ align-items: center;
183
+ justify-content: center;
184
+ background: var(--color-accent);
185
+ }
186
+
187
+ .logo-icon.logo-fallback::before,
188
+ .mobile-logo.logo-fallback::before {
189
+ content: attr(data-initial);
190
+ color: var(--color-bg);
191
+ font-size: 1rem;
192
+ font-weight: 700;
193
+ line-height: 1;
194
+ }
195
+
196
+ .logo-text {
197
+ display: flex;
198
+ flex-direction: column;
199
+ flex: 1 1 8rem;
200
+ line-height: 1.2;
201
+ min-width: 6rem;
202
+ max-width: 100%;
203
+ }
204
+
205
+ .logo-text .brand {
206
+ display: block;
207
+ font-size: 0.9375rem;
208
+ font-weight: 700;
209
+ color: var(--color-accent);
210
+ text-decoration: none;
211
+ white-space: nowrap;
212
+ overflow: hidden;
213
+ text-overflow: ellipsis;
214
+ }
215
+
216
+ .logo-text .brand:hover {
217
+ text-decoration: underline;
218
+ }
219
+
220
+ .logo-text .product {
221
+ display: block;
222
+ font-size: 0.6875rem;
223
+ font-weight: 500;
224
+ color: var(--color-text-muted);
225
+ text-decoration: none;
226
+ white-space: nowrap;
227
+ overflow: hidden;
228
+ text-overflow: ellipsis;
229
+ }
230
+
231
+ .logo-text .product:hover {
232
+ color: var(--color-text);
233
+ }
234
+
235
+ /* Wide/wordmark logo support */
236
+ .logo.logo-wordmark {
237
+ flex-direction: column;
238
+ align-items: flex-start;
239
+ }
240
+
241
+ .logo.logo-wordmark .logo-icon {
242
+ width: auto;
243
+ height: 64px;
244
+ max-width: 180px;
245
+ max-height: 64px;
246
+ }
247
+
248
+ .logo.logo-wordmark .logo-img {
249
+ max-width: 180px;
250
+ max-height: 64px;
251
+ width: auto;
252
+ height: 100%;
253
+ }
254
+
255
+ .mobile-logo .logo-img.logo-wordmark {
256
+ max-width: 120px;
257
+ max-height: 32px;
258
+ width: auto;
259
+ height: auto;
260
+ }
261
+
262
+ /* Theme toggle */
263
+ .header-tools {
264
+ display: flex;
265
+ flex-direction: column;
266
+ align-items: flex-end;
267
+ gap: 0.5rem;
268
+ flex-shrink: 0;
269
+ }
270
+
271
+ .theme-toggle {
272
+ background: none;
273
+ border: 1px solid var(--color-border);
274
+ border-radius: 0.375rem;
275
+ padding: 0.375rem;
276
+ cursor: pointer;
277
+ color: var(--color-text-muted);
278
+ display: flex;
279
+ align-items: center;
280
+ justify-content: center;
281
+ transition: color 0.2s ease, border-color 0.2s ease;
282
+ }
283
+
284
+ .theme-toggle:hover {
285
+ color: var(--color-text);
286
+ border-color: var(--color-text-muted);
287
+ }
288
+
289
+ .theme-toggle svg {
290
+ width: 16px;
291
+ height: 16px;
292
+ }
293
+
294
+ .theme-toggle .icon-sun { display: none; }
295
+ .theme-toggle .icon-moon { display: block; }
296
+
297
+ [data-theme="dark"] .theme-toggle .icon-sun { display: block; }
298
+ [data-theme="dark"] .theme-toggle .icon-moon { display: none; }
299
+
300
+ @media (prefers-color-scheme: dark) {
301
+ :root:not([data-theme="light"]) .theme-toggle .icon-sun { display: block; }
302
+ :root:not([data-theme="light"]) .theme-toggle .icon-moon { display: none; }
303
+ }
304
+
305
+ /* Sidebar meta (version/branch) */
306
+ .sidebar-meta {
307
+ display: flex;
308
+ flex-direction: column;
309
+ align-items: flex-end;
310
+ gap: 0.25rem;
311
+ font-size: 0.6875rem;
312
+ font-family: var(--font-mono);
313
+ color: var(--color-text-muted);
314
+ margin-top: 0;
315
+ }
316
+
317
+ .meta-version {
318
+ background: var(--color-code-bg);
319
+ padding: 0.125rem 0.375rem;
320
+ border-radius: 3px;
321
+ }
322
+
323
+ .meta-branch {
324
+ opacity: 0.7;
325
+ max-width: 7rem;
326
+ overflow: hidden;
327
+ text-overflow: ellipsis;
328
+ white-space: nowrap;
329
+ }
330
+
331
+ .sidebar-nav {
332
+ margin-top: 1rem;
333
+ }
334
+
335
+ .sidebar-nav ul {
336
+ list-style: none;
337
+ }
338
+
339
+ .sidebar-nav > ul > li {
340
+ margin-bottom: 1.5rem;
341
+ }
342
+
343
+ .sidebar-nav .nav-section {
344
+ font-weight: 600;
345
+ font-size: 0.75rem;
346
+ text-transform: uppercase;
347
+ letter-spacing: 0.05em;
348
+ color: var(--color-text-muted);
349
+ margin-bottom: 0.5rem;
350
+ }
351
+
352
+ .sidebar-nav .nav-home {
353
+ font-weight: 600;
354
+ font-size: 0.75rem;
355
+ text-transform: uppercase;
356
+ letter-spacing: 0.05em;
357
+ color: var(--color-text-muted);
358
+ text-decoration: none;
359
+ display: block;
360
+ margin-bottom: 1rem;
361
+ }
362
+
363
+ .sidebar-nav .nav-home:hover {
364
+ color: var(--color-primary);
365
+ }
366
+
367
+ .sidebar-nav a {
368
+ color: var(--color-text);
369
+ text-decoration: none;
370
+ font-size: 0.875rem;
371
+ display: block;
372
+ padding: 0.25rem 0;
373
+ transition: color 0.15s ease;
374
+ }
375
+
376
+ .sidebar-nav a:hover {
377
+ color: var(--color-link);
378
+ }
379
+
380
+ .sidebar-nav a.active {
381
+ color: var(--color-link);
382
+ font-weight: 500;
383
+ }
384
+
385
+ .sidebar-nav ul ul {
386
+ margin-left: 1rem;
387
+ margin-top: 0.25rem;
388
+ }
389
+
390
+ /* Collapsible nav groups (details/summary) */
391
+ .sidebar-nav details {
392
+ margin: 0;
393
+ }
394
+
395
+ .sidebar-nav summary {
396
+ cursor: pointer;
397
+ font-size: 0.875rem;
398
+ padding: 0.2rem 0;
399
+ list-style: none;
400
+ }
401
+
402
+ .sidebar-nav summary::-webkit-details-marker {
403
+ display: none;
404
+ }
405
+
406
+ .sidebar-nav .nav-group::before {
407
+ content: "›";
408
+ display: inline-block;
409
+ width: 1em;
410
+ margin-right: 0.15em;
411
+ text-align: center;
412
+ font-size: 0.85em;
413
+ transform-origin: center;
414
+ transition: transform 150ms ease;
415
+ }
416
+
417
+ .sidebar-nav details[open] > .nav-group::before {
418
+ transform: rotate(90deg);
419
+ }
420
+
421
+ .sidebar-nav .nav-group a {
422
+ display: inline;
423
+ }
424
+
425
+ /* Content */
426
+ .content {
427
+ margin-left: var(--sidebar-width);
428
+ flex: 1;
429
+ padding: 3rem 4rem;
430
+ padding-right: 240px; /* Space for TOC */
431
+ padding-bottom: calc(var(--footer-height) + 1rem);
432
+ max-width: 1100px;
433
+ }
434
+
435
+ /* Slides mode */
436
+ .mode-slides .content {
437
+ max-width: none;
438
+ padding: 1.5rem 2rem;
439
+ padding-right: 2rem;
440
+ padding-bottom: calc(var(--footer-height) + 1rem);
441
+ }
442
+
443
+ .mode-slides .toc,
444
+ .mode-slides .breadcrumbs,
445
+ .mode-slides .page-meta {
446
+ display: none !important;
447
+ }
448
+
449
+ .slides-shell {
450
+ display: flex;
451
+ flex-direction: column;
452
+ gap: 0.75rem;
453
+ }
454
+
455
+ .slide-viewport {
456
+ display: flex;
457
+ align-items: center;
458
+ justify-content: center;
459
+ min-height: calc(100vh - var(--footer-height) - 11rem);
460
+ }
461
+
462
+ .slide-frame {
463
+ aspect-ratio: var(--slide-aspect, 16/9);
464
+ width: min(100%, 1100px);
465
+ max-height: calc(100vh - var(--footer-height) - 12rem);
466
+ overflow: auto;
467
+ border: 1px solid var(--color-border);
468
+ border-radius: 0.5rem;
469
+ background: var(--color-bg);
470
+ padding: 2rem 2.5rem;
471
+ }
472
+
473
+ .slide {
474
+ display: none;
475
+ }
476
+
477
+ .slide.active {
478
+ display: block;
479
+ }
480
+
481
+ .slide-nav {
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: center;
485
+ gap: 0.75rem;
486
+ color: var(--color-text-muted);
487
+ font-size: 0.8125rem;
488
+ }
489
+
490
+ .slide-prev,
491
+ .slide-next {
492
+ border: 1px solid var(--color-border);
493
+ background: var(--color-bg);
494
+ color: var(--color-text);
495
+ border-radius: 0.375rem;
496
+ padding: 0.25rem 0.625rem;
497
+ cursor: pointer;
498
+ }
499
+
500
+ .slide-prev:disabled,
501
+ .slide-next:disabled {
502
+ opacity: 0.5;
503
+ cursor: not-allowed;
504
+ }
505
+
506
+ .slide-progress {
507
+ width: 10rem;
508
+ height: 0.35rem;
509
+ border-radius: 999px;
510
+ background: var(--color-code-bg);
511
+ overflow: hidden;
512
+ }
513
+
514
+ .slide-progress-bar {
515
+ display: block;
516
+ height: 100%;
517
+ background: var(--color-link);
518
+ transition: width 150ms ease;
519
+ }
520
+
521
+ .slide.centered {
522
+ min-height: 100%;
523
+ flex-direction: column;
524
+ justify-content: center;
525
+ }
526
+
527
+ .slide.two-column {
528
+ column-count: 2;
529
+ column-gap: 1.5rem;
530
+ }
531
+
532
+ .slide.active.centered {
533
+ display: flex;
534
+ }
535
+
536
+ .slide.active.two-column {
537
+ display: block;
538
+ }
539
+
540
+ .slide.active.two-column > h1,
541
+ .slide.active.two-column > h2,
542
+ .slide.active.two-column > h3 {
543
+ column-span: all;
544
+ }
545
+
546
+ .slide.active.two-column > * {
547
+ break-inside: avoid;
548
+ }
549
+
550
+ .slide.active.title-slide {
551
+ display: flex;
552
+ min-height: 100%;
553
+ flex-direction: column;
554
+ align-items: center;
555
+ justify-content: center;
556
+ text-align: center;
557
+ background: color-mix(in srgb, var(--color-link) 12%, var(--color-bg));
558
+ border: 1px solid color-mix(in srgb, var(--color-link) 40%, var(--color-border));
559
+ border-radius: 0.5rem;
560
+ padding: 2rem;
561
+ }
562
+
563
+ .slide.active.section-header {
564
+ display: flex;
565
+ min-height: 100%;
566
+ flex-direction: column;
567
+ align-items: center;
568
+ justify-content: center;
569
+ text-align: center;
570
+ background: color-mix(in srgb, var(--color-link) 6%, var(--color-bg));
571
+ border: 1px solid var(--color-border);
572
+ border-radius: 0.5rem;
573
+ padding: 2rem;
574
+ }
575
+
576
+ .slide.title-slide h1,
577
+ .slide.section-header h1 {
578
+ font-size: 2.25rem;
579
+ }
580
+
581
+ .slide.diagram .mermaid {
582
+ margin: 0.75rem 0;
583
+ }
584
+
585
+ /* Slide layout primitives (core structural patterns) */
586
+ .block {
587
+ border: 1px solid var(--color-border);
588
+ background: var(--color-bg-sidebar);
589
+ color: var(--color-text);
590
+ border-radius: 0.5rem;
591
+ padding: 0.75rem 1rem;
592
+ text-align: center;
593
+ transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
594
+ }
595
+
596
+ @media (prefers-reduced-motion: reduce) {
597
+ .block {
598
+ transition: none;
599
+ }
600
+ }
601
+
602
+ .block.accent {
603
+ background: color-mix(in srgb, var(--color-link) 12%, var(--color-bg));
604
+ border-color: color-mix(in srgb, var(--color-link) 50%, var(--color-border));
605
+ }
606
+
607
+ .block.muted {
608
+ opacity: 0.8;
609
+ }
610
+
611
+ .block.outline {
612
+ background: transparent;
613
+ }
614
+
615
+ .block.circle {
616
+ border-radius: 50%;
617
+ aspect-ratio: 1 / 1;
618
+ inline-size: min(7rem, 100%);
619
+ margin-inline: auto;
620
+ display: flex;
621
+ align-items: center;
622
+ justify-content: center;
623
+ padding: 0.75rem;
624
+ }
625
+
626
+ .block.pill {
627
+ border-radius: 9999px;
628
+ }
629
+
630
+ .block.diamond {
631
+ clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);
632
+ }
633
+
634
+ .block.chevron {
635
+ clip-path: polygon(0 0, 75% 0, 100% 50%, 75% 100%, 0 100%, 25% 50%);
636
+ }
637
+
638
+ .block.hexagon {
639
+ clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
640
+ }
641
+
642
+ .block.triangle {
643
+ clip-path: polygon(50% 0, 100% 100%, 0 100%);
644
+ }
645
+
646
+ .block.block-arrow {
647
+ clip-path: polygon(0 25%, 65% 25%, 65% 0, 100% 50%, 65% 100%, 65% 75%, 0 75%);
648
+ }
649
+
650
+ .block-label {
651
+ display: block;
652
+ font-size: 0.6875rem;
653
+ text-transform: uppercase;
654
+ letter-spacing: 0.03em;
655
+ color: var(--color-text-muted);
656
+ margin-bottom: 0.25rem;
657
+ }
658
+
659
+ .block-flow {
660
+ display: flex;
661
+ flex-wrap: wrap;
662
+ justify-content: center;
663
+ gap: 0.75rem 1.5rem;
664
+ align-items: stretch;
665
+ }
666
+
667
+ .block-flow .block {
668
+ position: relative;
669
+ min-width: 8rem;
670
+ }
671
+
672
+ .block-flow:not(.vertical) .block:not(:last-child)::after {
673
+ content: "→";
674
+ position: absolute;
675
+ right: -1.05rem;
676
+ top: 50%;
677
+ transform: translateY(-50%);
678
+ color: var(--color-text-muted);
679
+ }
680
+
681
+ .block-flow.vertical {
682
+ flex-direction: column;
683
+ align-items: stretch;
684
+ max-width: 30rem;
685
+ margin-inline: auto;
686
+ }
687
+
688
+ .block-flow.vertical .block:not(:last-child)::after {
689
+ content: "↓";
690
+ position: static;
691
+ display: block;
692
+ margin-top: 0.5rem;
693
+ color: var(--color-text-muted);
694
+ }
695
+
696
+ .block-grid {
697
+ display: grid;
698
+ grid-template-columns: repeat(2, minmax(0, 1fr));
699
+ gap: 0.75rem;
700
+ }
701
+
702
+ .block-grid.cols-3 {
703
+ grid-template-columns: repeat(3, minmax(0, 1fr));
704
+ }
705
+
706
+ .block-grid.cols-4 {
707
+ grid-template-columns: repeat(4, minmax(0, 1fr));
708
+ }
709
+
710
+ .block-stack {
711
+ display: flex;
712
+ flex-direction: column;
713
+ gap: 0.5rem;
714
+ }
715
+
716
+ /* Breadcrumbs */
717
+ .breadcrumbs {
718
+ font-size: 0.875rem;
719
+ color: var(--color-text-muted);
720
+ margin-bottom: 0.5rem;
721
+ }
722
+
723
+ .breadcrumbs a {
724
+ color: var(--color-text-muted);
725
+ text-decoration: none;
726
+ }
727
+
728
+ .breadcrumbs a:hover {
729
+ color: var(--color-link);
730
+ }
731
+
732
+ .breadcrumbs .separator {
733
+ margin: 0 0.375rem;
734
+ opacity: 0.5;
735
+ }
736
+
737
+ /* Page meta (last updated) */
738
+ .page-meta {
739
+ font-size: 0.8125rem;
740
+ color: var(--color-text-muted);
741
+ margin-bottom: 1.5rem;
742
+ }
743
+
744
+ /* Prose styles */
745
+ .prose h1 {
746
+ font-size: 2rem;
747
+ font-weight: 700;
748
+ margin-bottom: 1.5rem;
749
+ line-height: 1.2;
750
+ }
751
+
752
+ .prose h2 {
753
+ font-size: 1.5rem;
754
+ font-weight: 600;
755
+ margin-top: 2.5rem;
756
+ margin-bottom: 1rem;
757
+ padding-bottom: 0.5rem;
758
+ border-bottom: 1px solid var(--color-border);
759
+ }
760
+
761
+ .prose h3 {
762
+ font-size: 1.25rem;
763
+ font-weight: 600;
764
+ margin-top: 2rem;
765
+ margin-bottom: 0.75rem;
766
+ }
767
+
768
+ .prose h4 {
769
+ font-size: 1rem;
770
+ font-weight: 600;
771
+ margin-top: 1.5rem;
772
+ margin-bottom: 0.5rem;
773
+ }
774
+
775
+ .prose p {
776
+ margin-bottom: 1rem;
777
+ }
778
+
779
+ .prose a {
780
+ color: var(--color-link);
781
+ text-decoration: none;
782
+ }
783
+
784
+ .prose a:hover {
785
+ text-decoration: underline;
786
+ }
787
+
788
+ .prose strong {
789
+ font-weight: 600;
790
+ }
791
+
792
+ .prose ul, .prose ol {
793
+ margin-bottom: 1rem;
794
+ padding-left: 1.5rem;
795
+ }
796
+
797
+ .prose li {
798
+ margin-bottom: 0.25rem;
799
+ }
800
+
801
+ .prose blockquote {
802
+ border-left: 4px solid var(--color-accent);
803
+ padding-left: 1rem;
804
+ margin: 1.5rem 0;
805
+ color: var(--color-text-muted);
806
+ font-style: italic;
807
+ }
808
+
809
+ .prose code {
810
+ font-family: var(--font-mono);
811
+ font-size: 0.875em;
812
+ background: var(--color-code-bg);
813
+ padding: 0.125rem 0.375rem;
814
+ border-radius: 0.25rem;
815
+ }
816
+
817
+ .prose pre {
818
+ background: var(--color-code-bg);
819
+ padding: 1rem;
820
+ border-radius: 0.5rem;
821
+ overflow-x: auto;
822
+ margin: 1.5rem 0;
823
+ }
824
+
825
+ .prose pre code {
826
+ background: none;
827
+ padding: 0;
828
+ font-size: 0.8125rem;
829
+ line-height: 1.7;
830
+ }
831
+
832
+ .prose table {
833
+ width: 100%;
834
+ border-collapse: collapse;
835
+ margin: 1.5rem 0;
836
+ font-size: 0.875rem;
837
+ }
838
+
839
+ .prose th, .prose td {
840
+ padding: 0.75rem 1rem;
841
+ text-align: left;
842
+ border-bottom: 1px solid var(--color-border);
843
+ }
844
+
845
+ .prose th {
846
+ font-weight: 600;
847
+ background: var(--color-bg-sidebar);
848
+ }
849
+
850
+ .prose hr {
851
+ border: none;
852
+ border-top: 1px solid var(--color-border);
853
+ margin: 2rem 0;
854
+ }
855
+
856
+ .prose img {
857
+ max-width: 100%;
858
+ height: auto;
859
+ }
860
+
861
+ /* Status badges */
862
+ .status-inviolable {
863
+ display: inline-block;
864
+ background: #dc2626;
865
+ color: white;
866
+ font-size: 0.75rem;
867
+ font-weight: 600;
868
+ padding: 0.25rem 0.5rem;
869
+ border-radius: 0.25rem;
870
+ text-transform: uppercase;
871
+ }
872
+
873
+ .status-approved {
874
+ display: inline-block;
875
+ background: #16a34a;
876
+ color: white;
877
+ font-size: 0.75rem;
878
+ font-weight: 600;
879
+ padding: 0.25rem 0.5rem;
880
+ border-radius: 0.25rem;
881
+ text-transform: uppercase;
882
+ }
883
+
884
+ /* Footer - full-width ribbon pinned to bottom */
885
+ .site-footer {
886
+ position: fixed;
887
+ bottom: 0;
888
+ left: 0;
889
+ right: 0;
890
+ min-height: var(--footer-height);
891
+ z-index: 300;
892
+ display: flex;
893
+ align-items: center;
894
+ padding: 0 1.5rem;
895
+ background: var(--color-bg);
896
+ border-top: 1px solid var(--color-border);
897
+ }
898
+
899
+ .footer-content {
900
+ display: flex;
901
+ align-items: center;
902
+ justify-content: space-between;
903
+ gap: 0.75rem;
904
+ flex-wrap: wrap;
905
+ width: 100%;
906
+ font-size: 0.75rem;
907
+ color: var(--color-text-muted);
908
+ }
909
+
910
+ .footer-left,
911
+ .footer-center,
912
+ .footer-right {
913
+ display: flex;
914
+ align-items: center;
915
+ gap: 0.5rem;
916
+ }
917
+
918
+ .footer-center {
919
+ flex: 1;
920
+ justify-content: center;
921
+ }
922
+
923
+ .footer-right {
924
+ justify-content: flex-end;
925
+ }
926
+
927
+ .footer-separator {
928
+ opacity: 0.5;
929
+ }
930
+
931
+ .footer-version {
932
+ font-family: var(--font-mono);
933
+ }
934
+
935
+ .footer-commit {
936
+ cursor: help;
937
+ }
938
+
939
+ .footer-link {
940
+ color: var(--color-text-muted);
941
+ text-decoration: none;
942
+ }
943
+
944
+ .footer-link:hover {
945
+ color: var(--color-link);
946
+ }
947
+
948
+ /* Mermaid diagrams */
949
+ .mermaid {
950
+ background: transparent;
951
+ overflow-x: auto;
952
+ margin: 1.5rem 0;
953
+ text-align: center;
954
+ }
955
+
956
+ .mermaid svg {
957
+ max-width: 100%;
958
+ height: auto;
959
+ }
960
+
961
+ /* External link indicator */
962
+ .prose a[href^="http"]:not([href*="3leaps.net"])::after {
963
+ content: " ↗";
964
+ font-size: 0.75em;
965
+ opacity: 0.6;
966
+ }
967
+
968
+ /* Copy code button */
969
+ .prose pre {
970
+ position: relative;
971
+ }
972
+
973
+ .copy-button {
974
+ position: absolute;
975
+ top: 0.5rem;
976
+ right: 0.5rem;
977
+ padding: 0.25rem 0.5rem;
978
+ font-size: 0.6875rem;
979
+ font-family: var(--font-sans);
980
+ background: var(--color-bg);
981
+ color: var(--color-text-muted);
982
+ border: 1px solid var(--color-border);
983
+ border-radius: 0.25rem;
984
+ cursor: pointer;
985
+ opacity: 0;
986
+ transition: opacity 0.15s ease;
987
+ }
988
+
989
+ .prose pre:hover .copy-button {
990
+ opacity: 1;
991
+ }
992
+
993
+ .copy-button:hover {
994
+ color: var(--color-text);
995
+ border-color: var(--color-text-muted);
996
+ }
997
+
998
+ /* Footer copyright - now inline in footer-right */
999
+ .footer-copyright {
1000
+ font-size: 0.6875rem;
1001
+ }
1002
+
1003
+ /* Mobile header */
1004
+ .mobile-header {
1005
+ display: none;
1006
+ position: fixed;
1007
+ top: 0;
1008
+ left: 0;
1009
+ right: 0;
1010
+ height: 3.5rem;
1011
+ z-index: 200;
1012
+ background: var(--color-bg);
1013
+ border-bottom: 1px solid var(--color-border);
1014
+ align-items: center;
1015
+ justify-content: space-between;
1016
+ padding: 0 1rem;
1017
+ }
1018
+
1019
+ .nav-toggle,
1020
+ .mobile-theme-toggle {
1021
+ background: none;
1022
+ border: 1px solid var(--color-border);
1023
+ border-radius: 0.375rem;
1024
+ padding: 0.5rem;
1025
+ cursor: pointer;
1026
+ color: var(--color-text);
1027
+ }
1028
+
1029
+ .mobile-theme-toggle {
1030
+ color: var(--color-text-muted);
1031
+ }
1032
+
1033
+ .nav-toggle svg,
1034
+ .mobile-theme-toggle svg {
1035
+ width: 20px;
1036
+ height: 20px;
1037
+ display: block;
1038
+ }
1039
+
1040
+ .mobile-logo {
1041
+ display: flex;
1042
+ align-items: center;
1043
+ }
1044
+
1045
+ .mobile-logo svg,
1046
+ .mobile-logo img {
1047
+ width: 24px;
1048
+ height: 24px;
1049
+ }
1050
+
1051
+ .mobile-theme-toggle .icon-sun { display: none; }
1052
+ .mobile-theme-toggle .icon-moon { display: block; }
1053
+
1054
+ [data-theme="dark"] .mobile-theme-toggle .icon-sun { display: block; }
1055
+ [data-theme="dark"] .mobile-theme-toggle .icon-moon { display: none; }
1056
+
1057
+ @media (prefers-color-scheme: dark) {
1058
+ :root:not([data-theme="light"]) .mobile-theme-toggle .icon-sun { display: block; }
1059
+ :root:not([data-theme="light"]) .mobile-theme-toggle .icon-moon { display: none; }
1060
+ }
1061
+
1062
+ /* On-page TOC */
1063
+ .toc {
1064
+ position: fixed;
1065
+ top: 6rem;
1066
+ right: 2rem;
1067
+ width: 200px;
1068
+ max-height: calc(100vh - 8rem);
1069
+ overflow-y: auto;
1070
+ font-size: 0.8125rem;
1071
+ }
1072
+
1073
+ .toc-title {
1074
+ display: block;
1075
+ font-weight: 600;
1076
+ font-size: 0.6875rem;
1077
+ text-transform: uppercase;
1078
+ letter-spacing: 0.05em;
1079
+ color: var(--color-text-muted);
1080
+ margin-bottom: 0.75rem;
1081
+ }
1082
+
1083
+ .toc ul {
1084
+ list-style: none;
1085
+ padding: 0;
1086
+ margin: 0;
1087
+ }
1088
+
1089
+ .toc li {
1090
+ margin-bottom: 0.375rem;
1091
+ }
1092
+
1093
+ .toc a {
1094
+ color: var(--color-text-muted);
1095
+ text-decoration: none;
1096
+ display: block;
1097
+ padding: 0.125rem 0;
1098
+ transition: color 0.15s ease;
1099
+ }
1100
+
1101
+ .toc a:hover {
1102
+ color: var(--color-link);
1103
+ }
1104
+
1105
+ .toc .toc-h3 {
1106
+ padding-left: 0.75rem;
1107
+ font-size: 0.75rem;
1108
+ }
1109
+
1110
+ /* Responsive */
1111
+ @media (max-width: 1200px) {
1112
+ .toc {
1113
+ display: none;
1114
+ }
1115
+
1116
+ .content {
1117
+ padding-right: 4rem;
1118
+ max-width: 900px;
1119
+ }
1120
+
1121
+ .mode-slides .content {
1122
+ max-width: none;
1123
+ padding-right: 2rem;
1124
+ }
1125
+ }
1126
+
1127
+ @media (max-width: 1024px) {
1128
+ .sidebar {
1129
+ width: 240px;
1130
+ }
1131
+
1132
+ .logo-icon {
1133
+ height: 56px;
1134
+ max-width: 150px;
1135
+ }
1136
+
1137
+ .logo.logo-wordmark .logo-icon,
1138
+ .logo.logo-wordmark .logo-img {
1139
+ max-width: 150px;
1140
+ max-height: 56px;
1141
+ }
1142
+
1143
+ .content {
1144
+ margin-left: 240px;
1145
+ padding: 2rem;
1146
+ }
1147
+
1148
+ .mode-slides .content {
1149
+ margin-left: 240px;
1150
+ padding: 1.25rem;
1151
+ }
1152
+ }
1153
+
1154
+ @media (max-width: 768px) {
1155
+ .mobile-header {
1156
+ display: flex;
1157
+ }
1158
+
1159
+ .sidebar {
1160
+ position: fixed;
1161
+ top: 0;
1162
+ left: -280px;
1163
+ width: 280px;
1164
+ height: 100vh;
1165
+ z-index: 100;
1166
+ transition: left 0.3s ease;
1167
+ border-right: 1px solid var(--color-border);
1168
+ }
1169
+
1170
+ .sidebar.open {
1171
+ left: 0;
1172
+ }
1173
+
1174
+ .logo-icon {
1175
+ height: 48px;
1176
+ max-width: 130px;
1177
+ }
1178
+
1179
+ .logo.logo-wordmark .logo-icon,
1180
+ .logo.logo-wordmark .logo-img {
1181
+ max-width: 130px;
1182
+ max-height: 48px;
1183
+ }
1184
+
1185
+ .content {
1186
+ margin-left: 0;
1187
+ padding: 1.5rem;
1188
+ padding-top: 4rem;
1189
+ padding-bottom: calc(var(--footer-height) + 1rem);
1190
+ }
1191
+
1192
+ .mode-slides .content {
1193
+ margin-left: 0;
1194
+ padding: 1rem;
1195
+ padding-top: 4rem;
1196
+ }
1197
+
1198
+ .slide-frame {
1199
+ width: 100%;
1200
+ padding: 1.25rem;
1201
+ max-height: calc(100vh - var(--footer-height) - 9rem);
1202
+ }
1203
+
1204
+ .slide.two-column {
1205
+ column-count: 1;
1206
+ }
1207
+
1208
+ .slide-progress {
1209
+ width: 7rem;
1210
+ }
1211
+ }
1212
+
1213
+ /* Print styles */
1214
+ @media print {
1215
+ .sidebar,
1216
+ .mobile-header,
1217
+ .toc,
1218
+ .theme-toggle,
1219
+ .copy-button,
1220
+ .site-footer {
1221
+ display: none !important;
1222
+ }
1223
+
1224
+ .layout {
1225
+ display: block;
1226
+ }
1227
+
1228
+ .content {
1229
+ margin: 0;
1230
+ padding: 0;
1231
+ max-width: 100%;
1232
+ }
1233
+
1234
+ .prose {
1235
+ font-size: 11pt;
1236
+ line-height: 1.5;
1237
+ }
1238
+
1239
+ .prose a {
1240
+ color: inherit;
1241
+ text-decoration: underline;
1242
+ }
1243
+
1244
+ .prose a[href^="http"]::after {
1245
+ content: " (" attr(href) ")";
1246
+ font-size: 0.8em;
1247
+ word-break: break-all;
1248
+ }
1249
+
1250
+ .prose pre {
1251
+ white-space: pre-wrap;
1252
+ border: 1px solid #ccc;
1253
+ }
1254
+
1255
+ h1, h2, h3 {
1256
+ page-break-after: avoid;
1257
+ }
1258
+
1259
+ pre, table, .mermaid {
1260
+ page-break-inside: avoid;
1261
+ }
1262
+ }