jekyll-theme-zer0 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1143 -13
  3. data/_data/README.md +2 -0
  4. data/_data/ai.yml +5 -3
  5. data/_data/ai_pricing.yml +36 -0
  6. data/_data/backlog.yml +507 -2
  7. data/_data/consumers.yml +157 -9
  8. data/_data/features.yml +303 -20
  9. data/_data/feedback_types.yml +17 -12
  10. data/_data/i18n/fr.yml +12 -7
  11. data/_data/i18n/manifest.yml +39 -12
  12. data/_data/ingredient_densities.yml +122 -0
  13. data/_data/landing.yml +5 -2
  14. data/_data/navigation/main.yml +16 -0
  15. data/_data/navigation/quickstart.yml +4 -0
  16. data/_data/recipe_courses.yml +64 -0
  17. data/_data/site_builder.yml +874 -0
  18. data/_data/theme-manifest.yml +160 -124
  19. data/_data/ui-text.yml +26 -0
  20. data/_includes/README.md +26 -2
  21. data/_includes/analytics/posthog.html +2 -2
  22. data/_includes/components/admin-links.html +2 -2
  23. data/_includes/components/admin-tabs.html +2 -2
  24. data/_includes/components/ai-chat.html +14 -11
  25. data/_includes/components/analytics-dashboard.html +8 -8
  26. data/_includes/components/author-bio.html +1 -1
  27. data/_includes/components/author-card.html +10 -2
  28. data/_includes/components/author-eeat.html +4 -4
  29. data/_includes/components/background-customizer.html +10 -10
  30. data/_includes/components/background-image.html +114 -0
  31. data/_includes/components/background-settings.html +28 -15
  32. data/_includes/components/collection-manager.html +5 -5
  33. data/_includes/components/component-showcase.html +13 -13
  34. data/_includes/components/config-editor.html +12 -12
  35. data/_includes/components/config-viewer.html +8 -8
  36. data/_includes/components/cookie-consent.html +15 -15
  37. data/_includes/components/cta-button.html +7 -2
  38. data/_includes/components/dev-shortcuts.html +7 -7
  39. data/_includes/components/env-dashboard.html +8 -8
  40. data/_includes/components/env-switcher.html +9 -9
  41. data/_includes/components/feature-card.html +2 -2
  42. data/_includes/components/halfmoon.html +2 -2
  43. data/_includes/components/info-section.html +42 -37
  44. data/_includes/components/js-cdn.html +15 -15
  45. data/_includes/components/language-toggle.html +168 -21
  46. data/_includes/components/mermaid.html +72 -435
  47. data/_includes/components/nanobar.html +5 -5
  48. data/_includes/components/nav-editor.html +2 -2
  49. data/_includes/components/nav-export.html +2 -2
  50. data/_includes/components/nav-overview.html +2 -2
  51. data/_includes/components/page-feedback.html +45 -30
  52. data/_includes/components/page-views-init.html +55 -0
  53. data/_includes/components/page-views.html +33 -0
  54. data/_includes/components/post-card.html +22 -22
  55. data/_includes/components/post-type-badge.html +2 -2
  56. data/_includes/components/powered-by.html +2 -2
  57. data/_includes/components/preview-image.html +6 -0
  58. data/_includes/components/quick-index.html +2 -2
  59. data/_includes/components/recipe-card.html +67 -0
  60. data/_includes/components/recipe-duration.html +50 -0
  61. data/_includes/components/recipe-grams.html +58 -0
  62. data/_includes/components/recipe-index.html +96 -0
  63. data/_includes/components/recipe-ingredients.html +90 -0
  64. data/_includes/components/recipe-meta.html +96 -0
  65. data/_includes/components/recipe-nutrition.html +57 -0
  66. data/_includes/components/recipe-qty.html +73 -0
  67. data/_includes/components/recipe-ratio.html +151 -0
  68. data/_includes/components/recipe-scaler.html +73 -0
  69. data/_includes/components/recipe-steps.html +86 -0
  70. data/_includes/components/recipe-temp.html +45 -0
  71. data/_includes/components/search-modal.html +29 -4
  72. data/_includes/components/searchbar.html +2 -2
  73. data/_includes/components/shortcuts-modal.html +3 -0
  74. data/_includes/components/svg-background.html +2 -2
  75. data/_includes/components/theme-customizer.html +2 -2
  76. data/_includes/components/theme-info.html +14 -7
  77. data/_includes/components/theme-preview-gallery.html +22 -22
  78. data/_includes/content/giscus.html +2 -2
  79. data/_includes/content/intro.html +8 -8
  80. data/_includes/content/jsonld-faq.html +2 -2
  81. data/_includes/content/jsonld-software.html +24 -5
  82. data/_includes/content/seo.html +4 -4
  83. data/_includes/content/sitemap.html +27 -27
  84. data/_includes/content/toc.html +183 -183
  85. data/_includes/core/branding.html +6 -6
  86. data/_includes/core/console-capture.html +32 -74
  87. data/_includes/core/favicon.html +49 -7
  88. data/_includes/core/footer-fabs.html +17 -3
  89. data/_includes/core/footer.html +49 -34
  90. data/_includes/core/head.html +110 -86
  91. data/_includes/core/header.html +76 -54
  92. data/_includes/docs/bootstrap-docs.html +8 -8
  93. data/_includes/landing/landing-install-cards.html +2 -2
  94. data/_includes/landing/landing-quick-links.html +1 -1
  95. data/_includes/navigation/admin-nav.html +2 -2
  96. data/_includes/navigation/nav-tree.html +8 -8
  97. data/_includes/navigation/navbar.html +12 -12
  98. data/_includes/navigation/section-sidebar.html +109 -27
  99. data/_includes/navigation/sidebar-config.html +36 -2
  100. data/_includes/navigation/sidebar-left.html +17 -16
  101. data/_includes/navigation/sidebar-right.html +8 -7
  102. data/_includes/obsidian/full-graph.html +2 -2
  103. data/_includes/setup/claude-session.html +72 -0
  104. data/_includes/setup/prereq-checklist.html +90 -0
  105. data/_includes/setup/wizard.html +924 -222
  106. data/_includes/stats/stats-categories.html +8 -8
  107. data/_includes/stats/stats-header.html +14 -14
  108. data/_includes/stats/stats-metrics.html +14 -14
  109. data/_includes/stats/stats-no-data.html +12 -12
  110. data/_includes/stats/stats-overview.html +6 -6
  111. data/_includes/stats/stats-tags.html +8 -8
  112. data/_layouts/404.html +38 -24
  113. data/_layouts/README.md +2 -0
  114. data/_layouts/admin.html +24 -24
  115. data/_layouts/article.html +43 -33
  116. data/_layouts/author.html +20 -20
  117. data/_layouts/authors.html +2 -2
  118. data/_layouts/book-abc.html +12 -12
  119. data/_layouts/book-story.html +15 -15
  120. data/_layouts/book.html +12 -12
  121. data/_layouts/collection.html +33 -33
  122. data/_layouts/cookbook.html +88 -0
  123. data/_layouts/default.html +31 -28
  124. data/_layouts/home.html +23 -23
  125. data/_layouts/index.html +10 -10
  126. data/_layouts/landing.html +17 -17
  127. data/_layouts/news.html +44 -44
  128. data/_layouts/note.html +38 -38
  129. data/_layouts/notebook.html +34 -34
  130. data/_layouts/recipe.html +274 -0
  131. data/_layouts/root.html +92 -55
  132. data/_layouts/section.html +62 -33
  133. data/_layouts/setup.html +3 -3
  134. data/_layouts/sitemap-collection.html +49 -49
  135. data/_layouts/stats.html +40 -40
  136. data/_layouts/tag.html +12 -12
  137. data/_layouts/welcome.html +21 -21
  138. data/_sass/components/_callout.scss +1 -1
  139. data/_sass/components/_footer.scss +37 -1
  140. data/_sass/components/_mermaid.scss +375 -0
  141. data/_sass/components/_page-views.scss +36 -0
  142. data/_sass/components/_recipe.scss +506 -0
  143. data/_sass/components/_setup-wizard.scss +764 -0
  144. data/_sass/components/_ui-enhancements.scss +6 -6
  145. data/_sass/core/_navbar.scss +261 -46
  146. data/_sass/layouts/_landing.scss +2 -2
  147. data/_sass/layouts/_navbar-extras.scss +14 -4
  148. data/_sass/tokens/_color.scss +6 -0
  149. data/_sass/tokens/_index.scss +2 -0
  150. data/_sass/tokens/_radius.scss +21 -0
  151. data/_sass/tokens/_typography.scss +4 -0
  152. data/_sass/utilities/_focus.scss +14 -0
  153. data/assets/css/main.scss +4 -0
  154. data/assets/js/ai-chat.js +47 -5
  155. data/assets/js/fleet-feedback-capture.js +124 -0
  156. data/assets/js/fleet-feedback.js +853 -0
  157. data/assets/js/mermaid-diagrams.js +1267 -0
  158. data/assets/js/modules/navigation/config.js +9 -6
  159. data/assets/js/modules/navigation/navbar.js +55 -0
  160. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  161. data/assets/js/modules/theme/appearance.js +8 -2
  162. data/assets/js/obsidian-wiki-links.js +8 -3
  163. data/assets/js/page-feedback.js +125 -192
  164. data/assets/js/page-views.js +372 -0
  165. data/assets/js/recipe-scaler.js +501 -0
  166. data/assets/js/search-modal.js +36 -0
  167. data/assets/js/setup-wizard.js +2279 -226
  168. data/assets/js/site-builder.js +1834 -0
  169. data/assets/js/ui-enhancements.js +11 -3
  170. data/scripts/README.md +44 -0
  171. data/scripts/ai/README.md +38 -0
  172. data/scripts/ai/api_call.rb +124 -0
  173. data/scripts/ai/usage.rb +314 -0
  174. data/scripts/ai/usage_report.rb +225 -0
  175. data/scripts/bin/audit-consumer +39 -7
  176. data/scripts/bin/giscus-discussions +213 -14
  177. data/scripts/bin/manifest +35 -12
  178. data/scripts/ci/agent_review_result.py +164 -0
  179. data/scripts/ci/test_agent_review_result.py +172 -0
  180. data/scripts/ci/test_visual_evidence_autogen.py +341 -0
  181. data/scripts/ci/visual_evidence_autogen.py +1060 -0
  182. data/scripts/content-review.rb +20 -1
  183. data/scripts/design-system-check.rb +170 -0
  184. data/scripts/lib/audit.sh +42 -2
  185. data/scripts/lint-liquid-raw.rb +137 -0
  186. data/scripts/test/integration/mermaid +22 -8
  187. data/scripts/test/lib/run_tests.sh +3 -1
  188. data/scripts/test/lib/test_agent_review_result.sh +27 -0
  189. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  190. data/scripts/translate.rb +94 -16
  191. metadata +48 -2
@@ -0,0 +1,764 @@
1
+ // =============================================================================
2
+ // Site Builder / setup wizard
3
+ // (_includes/setup/wizard.html + setup/prereq-checklist.html +
4
+ // setup/claude-session.html · assets/js/setup-wizard.js + site-builder.js)
5
+ // =============================================================================
6
+ // Feature: ZER0-067, ZER0-085 · Redesign: T-040 / #408 · Site Builder: ZER0-085
7
+ //
8
+ // Three columns at lg+ (stepper / steps / side column), stacked below. The
9
+ // side column holds the Claude session on top and the live file preview under
10
+ // it, so both stay in view on every step. The two rules that matter most:
11
+ //
12
+ // 1. `.wizard-panes` is a GRID with every pane in the same cell, so the
13
+ // container is always exactly as tall as the tallest step; `.wizard-nav`
14
+ // is then pushed to the bottom of the card with `margin-top: auto`.
15
+ // Neither alone is enough: the grid stops the CONTAINER resizing, and the
16
+ // auto margin stops the BUTTONS floating up inside a short step.
17
+ // Together, Back/Next sit at the same y offset on every step.
18
+ // 2. The side column is sticky and scrolls on its own, so a long transcript
19
+ // or a long generated file never grows the page.
20
+ // =============================================================================
21
+
22
+ // -----------------------------------------------------------------------------
23
+ // Vertical stepper
24
+ // -----------------------------------------------------------------------------
25
+
26
+ .wizard-stepper-wrap {
27
+ top: 1.5rem; // paired with .sticky-lg-top in the markup
28
+ }
29
+
30
+ .wizard-stepper {
31
+ gap: 0.25rem;
32
+ }
33
+
34
+ .wizard-step {
35
+ display: flex;
36
+ align-items: center;
37
+ gap: 0.75rem;
38
+ width: 100%;
39
+ padding: 0.625rem 0.75rem;
40
+ min-height: 44px; // WCAG touch target
41
+ text-align: left;
42
+ color: var(--zer0-color-ink-muted);
43
+ background: none;
44
+ border: 0;
45
+ border-radius: var(--zer0-radius-sm, 0.375rem);
46
+ transition: background-color 0.15s ease, color 0.15s ease;
47
+
48
+ &:hover:not(:disabled) {
49
+ color: var(--zer0-color-ink, inherit);
50
+ background: var(--zer0-color-bg-muted);
51
+ }
52
+
53
+ &:focus-visible {
54
+ outline: 2px solid var(--bs-primary);
55
+ outline-offset: 2px;
56
+ }
57
+
58
+ // Upcoming, and not reachable until every earlier step validates.
59
+ &.is-locked,
60
+ &:disabled {
61
+ opacity: 0.45;
62
+ cursor: not-allowed;
63
+ }
64
+
65
+ &.is-active {
66
+ font-weight: 600;
67
+ color: var(--zer0-color-ink, inherit);
68
+ background: var(--zer0-color-bg-muted);
69
+
70
+ .wizard-step-marker {
71
+ color: #fff;
72
+ background: var(--bs-primary);
73
+ border-color: var(--bs-primary);
74
+ }
75
+ }
76
+
77
+ &.is-done .wizard-step-marker {
78
+ color: var(--bs-success, #198754);
79
+ border-color: var(--bs-success, #198754);
80
+ }
81
+ }
82
+
83
+ .wizard-step-marker {
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
87
+ flex-shrink: 0;
88
+ width: 2rem;
89
+ height: 2rem;
90
+ font-size: 0.9rem;
91
+ border: 1px solid var(--bs-border-color);
92
+ border-radius: 50%;
93
+ }
94
+
95
+ .wizard-step-text {
96
+ min-width: 0;
97
+ }
98
+
99
+ .wizard-step-label {
100
+ display: block;
101
+ overflow-wrap: anywhere; // "Integrations" must survive a ~100px stepper column
102
+ line-height: 1.2;
103
+ }
104
+
105
+ // "Draft saved" acknowledgement. Kept in the layout (no display toggling) so
106
+ // its appearance never shifts the header.
107
+ .wizard-draft-chip {
108
+ padding: 0.25rem 0.5rem;
109
+ font-size: 0.75rem;
110
+ color: var(--bs-success, #198754);
111
+ opacity: 0;
112
+ transition: opacity 0.2s ease;
113
+
114
+ &.is-visible {
115
+ opacity: 1;
116
+ }
117
+ }
118
+
119
+ .wizard-progress .progress-bar {
120
+ transition: width 0.3s ease;
121
+ }
122
+
123
+ // -----------------------------------------------------------------------------
124
+ // Step panes — the stable-height half
125
+ // -----------------------------------------------------------------------------
126
+
127
+ .wizard-panes {
128
+ // Every pane is stacked in ONE grid cell, so the row's height is
129
+ // max(pane heights) — computed by the browser, continuously, exactly.
130
+ display: grid;
131
+ min-height: 26rem; // floor for the degenerate case of no panes
132
+
133
+ // The selector carries `.tab-content` purely for specificity: Bootstrap's
134
+ // `.tab-content > .tab-pane { display: none }` would otherwise take the
135
+ // cell's only occupant out of the grid on a tie.
136
+ // A grid item's default `min-width: auto` lets one unbreakable line (a
137
+ // command in .wizard-cmd) widen the whole column past its track and under
138
+ // the side column, where it intercepted clicks. Zero it so long content
139
+ // scrolls inside its own box instead.
140
+ min-width: 0;
141
+
142
+ &.tab-content > .tab-pane {
143
+ display: flex;
144
+ flex-direction: column;
145
+ grid-area: 1 / 1; // one cell, all panes
146
+ min-width: 0;
147
+
148
+ // Inactive panes stay in layout — that is the whole point — but must not
149
+ // be seen, focused, clicked, or read out. `visibility: hidden` does all
150
+ // four (it removes the subtree from the a11y tree and from the tab order).
151
+ visibility: hidden;
152
+ pointer-events: none;
153
+
154
+ &.active {
155
+ visibility: visible;
156
+ pointer-events: auto;
157
+ }
158
+ }
159
+
160
+ > .tab-pane > .card {
161
+ display: flex;
162
+ flex: 1 1 auto;
163
+ }
164
+
165
+ > .tab-pane > .card > .card-body {
166
+ display: flex;
167
+ flex: 1 1 auto;
168
+ flex-direction: column;
169
+ }
170
+ }
171
+
172
+ // Pinned to the bottom of the card, so a short step does not float its
173
+ // Back/Next up the page relative to a tall one. Always a flex row (a block
174
+ // box puts a lone button on a baseline, ~2px high) and labels never wrap
175
+ // (a wrapped label makes the row taller and lifts the button's top).
176
+ .wizard-nav {
177
+ display: flex;
178
+ align-items: center;
179
+ justify-content: flex-end;
180
+ gap: 0.5rem;
181
+ margin-top: auto;
182
+ padding-top: 1rem;
183
+
184
+ .btn {
185
+ white-space: nowrap;
186
+ }
187
+ }
188
+
189
+ // -----------------------------------------------------------------------------
190
+ // Form furniture shared by several steps
191
+ // -----------------------------------------------------------------------------
192
+
193
+ .wizard-choice {
194
+ min-height: 3.5rem;
195
+ white-space: normal;
196
+ }
197
+
198
+ .wizard-check .form-check-label {
199
+ cursor: pointer;
200
+ }
201
+
202
+ // Inline command with a copy button on the right.
203
+ .wizard-cmd {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 0.25rem;
207
+ max-width: 100%;
208
+ margin-top: 0.25rem;
209
+ padding: 0.25rem 0.25rem 0.25rem 0.6rem;
210
+ font-size: 0.8rem;
211
+ background: var(--zer0-color-bg-muted, var(--bs-tertiary-bg));
212
+ border: 1px solid var(--bs-border-color);
213
+ border-radius: var(--zer0-radius-sm, 0.375rem);
214
+
215
+ code {
216
+ flex: 1 1 auto;
217
+ min-width: 0;
218
+ overflow-x: auto;
219
+ white-space: nowrap;
220
+ color: inherit;
221
+ background: none;
222
+ }
223
+
224
+ .btn {
225
+ flex-shrink: 0;
226
+ padding: 0 0.35rem;
227
+ line-height: 1;
228
+ color: var(--zer0-color-ink-muted);
229
+ }
230
+
231
+ &.d-inline-flex {
232
+ display: inline-flex;
233
+ vertical-align: middle;
234
+ max-width: 100%;
235
+ margin: 0 0.15rem;
236
+ }
237
+ }
238
+
239
+ // Every step card is a flex column inside the grid cell; the same min-width
240
+ // rule applies down the chain so a long line can never widen the card.
241
+ .wizard-panes .card,
242
+ .wizard-panes .card-body,
243
+ .sb-manual-steps li,
244
+ .prereq-item .min-w-0 {
245
+ min-width: 0;
246
+ }
247
+
248
+ // The prerequisites list is the tallest step by far. Cap it so the shared grid
249
+ // row (sized to the tallest pane) stays close to the other steps instead of
250
+ // leaving them with a screen of blank space above their Back/Next row.
251
+ .prereq-list {
252
+ max-height: 30rem;
253
+ overflow-y: auto;
254
+ }
255
+
256
+ // Numbered connect steps. The text column must be allowed to shrink
257
+ // (min-width: 0) or a nowrap command line inside .wizard-cmd widens the
258
+ // list past the card and — because inactive panes stay in layout — the
259
+ // whole page, on every step, at phone widths.
260
+ .sb-steps li {
261
+ display: flex;
262
+ gap: 0.75rem;
263
+ margin-bottom: 0.9rem;
264
+
265
+ > div {
266
+ flex: 1 1 auto;
267
+ min-width: 0;
268
+ }
269
+ }
270
+
271
+ .sb-step-num {
272
+ display: inline-flex;
273
+ align-items: center;
274
+ justify-content: center;
275
+ flex-shrink: 0;
276
+ width: 1.6rem;
277
+ height: 1.6rem;
278
+ font-size: 0.8rem;
279
+ font-weight: 600;
280
+ color: #fff;
281
+ background: var(--bs-primary);
282
+ border-radius: 50%;
283
+ }
284
+
285
+ .sb-connect-status {
286
+ .btn {
287
+ flex-shrink: 0;
288
+ white-space: nowrap;
289
+ }
290
+
291
+ .sb-status-detail {
292
+ overflow-wrap: anywhere; // long scaffold paths
293
+ }
294
+
295
+ .sb-status-dot {
296
+ display: inline-block;
297
+ flex-shrink: 0;
298
+ width: 0.65rem;
299
+ height: 0.65rem;
300
+ border-radius: 50%;
301
+ background: var(--bs-secondary);
302
+ }
303
+
304
+ &[data-state="online"] .sb-status-dot {
305
+ background: var(--bs-success);
306
+ box-shadow: 0 0 0 4px rgba(25, 135, 84, 0.2);
307
+ }
308
+
309
+ &[data-state="offline"] .sb-status-dot {
310
+ background: var(--bs-warning);
311
+ }
312
+
313
+ &[data-state="checking"] .sb-status-dot {
314
+ animation: sbPulse 1.2s ease-in-out infinite;
315
+ }
316
+ }
317
+
318
+ @keyframes sbPulse {
319
+ 0%, 100% { opacity: 0.35; }
320
+ 50% { opacity: 1; }
321
+ }
322
+
323
+ // Navigation editor rows
324
+ .nav-editor .nav-row {
325
+ .nav-title { flex: 1 1 32%; }
326
+ .nav-url { flex: 1 1 40%; }
327
+ .nav-icon { flex: 0 1 24%; }
328
+ }
329
+
330
+ // Skin picker
331
+ .skin-card {
332
+ display: flex;
333
+ flex-direction: column;
334
+ gap: 0.35rem;
335
+ width: 100%;
336
+ padding: 0.6rem;
337
+ cursor: pointer;
338
+ border: 2px solid var(--bs-border-color);
339
+ border-radius: var(--zer0-radius-md, 0.5rem);
340
+ transition: border-color 0.15s ease, transform 0.15s ease;
341
+
342
+ &:hover {
343
+ transform: translateY(-1px);
344
+ }
345
+
346
+ .skin-swatch {
347
+ display: block;
348
+ height: 2.5rem;
349
+ border-radius: var(--zer0-radius-sm, 0.375rem);
350
+ background: linear-gradient(135deg, var(--sw-a) 0%, var(--sw-a) 45%, var(--sw-b) 55%, var(--sw-b) 100%);
351
+ border: 1px solid rgba(0, 0, 0, 0.08);
352
+ }
353
+
354
+ .skin-name {
355
+ font-weight: 600;
356
+ font-size: 0.9rem;
357
+ }
358
+
359
+ .skin-mood {
360
+ font-size: 0.72rem;
361
+ color: var(--zer0-color-ink-muted);
362
+ }
363
+ }
364
+
365
+ .btn-check:checked + .skin-card {
366
+ border-color: var(--bs-primary);
367
+ box-shadow: 0 0 0 3px rgba(var(--bs-primary-rgb), 0.2);
368
+ }
369
+
370
+ .btn-check:focus-visible + .skin-card {
371
+ outline: 2px solid var(--bs-primary);
372
+ outline-offset: 2px;
373
+ }
374
+
375
+ // Palette picker (layers over the skin)
376
+ .palette-card {
377
+ display: flex;
378
+ flex-direction: column;
379
+ align-items: center;
380
+ gap: 0.3rem;
381
+ width: 5.25rem;
382
+ padding: 0.4rem;
383
+ cursor: pointer;
384
+ border: 2px solid var(--bs-border-color);
385
+ border-radius: var(--zer0-radius-md, 0.5rem);
386
+ font-size: 0.72rem;
387
+ text-align: center;
388
+
389
+ .palette-swatches {
390
+ display: flex;
391
+ width: 100%;
392
+ height: 1.4rem;
393
+ overflow: hidden;
394
+ border-radius: var(--zer0-radius-sm, 0.375rem);
395
+ border: 1px solid rgba(0, 0, 0, 0.08);
396
+
397
+ > span { flex: 1 1 0; }
398
+
399
+ .palette-swatch-skin {
400
+ background: linear-gradient(90deg, var(--bs-primary) 0 34%, var(--bs-secondary) 34% 67%, var(--zer0-color-accent, var(--bs-info)) 67%);
401
+ }
402
+
403
+ &--custom {
404
+ align-items: center;
405
+ justify-content: center;
406
+ background: var(--zer0-color-bg-muted, var(--bs-tertiary-bg));
407
+ }
408
+ }
409
+ }
410
+
411
+ .btn-check:checked + .palette-card {
412
+ border-color: var(--bs-primary);
413
+ box-shadow: 0 0 0 3px rgba(var(--bs-primary-rgb), 0.2);
414
+ }
415
+
416
+ .btn-check:focus-visible + .palette-card {
417
+ outline: 2px solid var(--bs-primary);
418
+ outline-offset: 2px;
419
+ }
420
+
421
+ .font-preview {
422
+ font-size: 1rem;
423
+ line-height: 1.3;
424
+ transition: font-family 0.15s ease;
425
+ }
426
+
427
+ // Example-page planner rows
428
+ .pages-planner .page-row {
429
+ .page-collection { flex: 0 0 32%; }
430
+ .page-title { flex: 1 1 45%; }
431
+ }
432
+
433
+ .pages-planner .page-row + .page-row {
434
+ margin-top: 0.4rem;
435
+ }
436
+
437
+ // Integration list
438
+ .wizard-integrations .form-switch .form-check-input {
439
+ width: 2.5em;
440
+ }
441
+
442
+ // Build terminal
443
+ .wizard-terminal {
444
+ max-height: 18rem;
445
+ margin: 0;
446
+ padding: 0.75rem;
447
+ overflow: auto;
448
+ font-size: 0.75rem;
449
+ line-height: 1.4;
450
+ color: #d8dee9;
451
+ background: #1b1f24;
452
+ border-radius: var(--zer0-radius-sm, 0.375rem);
453
+ white-space: pre-wrap;
454
+ word-break: break-word;
455
+ }
456
+
457
+ // -----------------------------------------------------------------------------
458
+ // Prerequisites checklist
459
+ // -----------------------------------------------------------------------------
460
+
461
+ .prereq-item {
462
+ .prereq-state-icon {
463
+ display: inline-flex;
464
+ align-items: center;
465
+ justify-content: center;
466
+ flex-shrink: 0;
467
+ width: 2rem;
468
+ height: 2rem;
469
+ font-size: 1rem;
470
+ border: 1px solid var(--bs-border-color);
471
+ border-radius: 50%;
472
+ color: var(--zer0-color-ink-muted);
473
+ transition: color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease;
474
+ }
475
+
476
+ &[data-state="ok"] .prereq-state-icon,
477
+ &[data-state="manual"] .prereq-state-icon {
478
+ color: #fff;
479
+ background: var(--bs-success);
480
+ border-color: var(--bs-success);
481
+ }
482
+
483
+ &[data-state="fail"] .prereq-state-icon {
484
+ color: #fff;
485
+ background: var(--bs-danger);
486
+ border-color: var(--bs-danger);
487
+ }
488
+
489
+ .prereq-output {
490
+ overflow: hidden;
491
+ text-overflow: ellipsis;
492
+ white-space: nowrap;
493
+ }
494
+
495
+ .prereq-details summary {
496
+ cursor: pointer;
497
+ color: var(--bs-link-color);
498
+ }
499
+ }
500
+
501
+ // -----------------------------------------------------------------------------
502
+ // Side column — Claude session + generated files
503
+ // -----------------------------------------------------------------------------
504
+
505
+ .wizard-side {
506
+ top: 1.5rem; // paired with .sticky-lg-top
507
+ max-height: calc(100vh - 3rem);
508
+ overflow-y: auto;
509
+ scrollbar-width: thin;
510
+ }
511
+
512
+ .sb-panel {
513
+ .card-header {
514
+ background: var(--zer0-color-bg-muted, var(--bs-tertiary-bg));
515
+ }
516
+
517
+ &[data-state="online"] .card-header {
518
+ border-bottom: 2px solid var(--bs-success);
519
+ }
520
+ }
521
+
522
+ .sb-messages {
523
+ min-height: 9rem;
524
+ max-height: 22rem;
525
+ overflow-y: auto;
526
+ scroll-behavior: smooth;
527
+ }
528
+
529
+ .sb-message--user {
530
+ display: flex;
531
+ justify-content: flex-end;
532
+
533
+ .sb-bubble {
534
+ max-width: 88%;
535
+ color: #fff;
536
+ background: var(--bs-primary);
537
+ word-wrap: break-word;
538
+ }
539
+ }
540
+
541
+ .sb-message--assistant .sb-bubble {
542
+ max-width: 92%;
543
+ color: var(--bs-body-color);
544
+ background: var(--bs-tertiary-bg);
545
+ word-wrap: break-word;
546
+
547
+ .sb-li {
548
+ display: block;
549
+ padding-left: 0.25rem;
550
+ }
551
+
552
+ .sb-code {
553
+ margin: 0.35rem 0;
554
+ padding: 0.5rem;
555
+ font-size: 0.72rem;
556
+ color: #d8dee9;
557
+ background: #1b1f24;
558
+ border-radius: var(--zer0-radius-sm, 0.375rem);
559
+ overflow-x: auto;
560
+ white-space: pre;
561
+ }
562
+ }
563
+
564
+ .sb-card {
565
+ color: var(--bs-body-color);
566
+ background: var(--bs-tertiary-bg);
567
+ border: 1px solid var(--bs-border-color);
568
+ border-left: 3px solid var(--bs-primary);
569
+
570
+ .sb-card-meta {
571
+ overflow-wrap: anywhere;
572
+ }
573
+
574
+ .sb-card-list {
575
+ max-height: 9rem;
576
+ padding-left: 1.1rem;
577
+ overflow-y: auto;
578
+ font-family: var(--bs-font-monospace);
579
+ font-size: 0.72rem;
580
+ }
581
+
582
+ &--resolved {
583
+ opacity: 0.75;
584
+ }
585
+
586
+ &--accepted {
587
+ border-left-color: var(--bs-success);
588
+ }
589
+
590
+ &--declined {
591
+ border-left-color: var(--bs-secondary);
592
+ }
593
+
594
+ &--result {
595
+ border-left-color: var(--bs-info);
596
+ }
597
+ }
598
+
599
+ .sb-chips .sb-chip {
600
+ font-size: 0.72rem;
601
+ text-align: left;
602
+ white-space: normal;
603
+ }
604
+
605
+ .sb-composer textarea {
606
+ resize: none;
607
+ min-height: 2.4rem;
608
+ }
609
+
610
+ .sb-typing span {
611
+ display: inline-block;
612
+ font-weight: bold;
613
+ font-size: 1.2em;
614
+ animation: sbTyping 1.4s infinite;
615
+
616
+ &:nth-child(2) { animation-delay: 0.2s; }
617
+ &:nth-child(3) { animation-delay: 0.4s; }
618
+ }
619
+
620
+ @keyframes sbTyping {
621
+ 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
622
+ 30% { opacity: 1; transform: translateY(-4px); }
623
+ }
624
+
625
+ // File preview
626
+ .wizard-file-tabs {
627
+ gap: 0.25rem;
628
+ scrollbar-width: thin;
629
+
630
+ .wizard-file-tab {
631
+ flex-shrink: 0;
632
+ padding: 0.2rem 0.6rem;
633
+ font-size: 0.72rem;
634
+ font-family: var(--bs-font-monospace);
635
+ white-space: nowrap;
636
+
637
+ &.is-overridden::after {
638
+ content: "•";
639
+ margin-left: 0.25rem;
640
+ color: var(--bs-warning);
641
+ }
642
+ }
643
+ }
644
+
645
+ .wizard-preview-code {
646
+ max-height: 38vh;
647
+ margin-bottom: 0;
648
+ overflow: auto;
649
+ font-size: 0.74rem;
650
+ line-height: 1.45;
651
+ }
652
+
653
+ .wizard-preview-live {
654
+ font-size: 0.65rem;
655
+ text-transform: uppercase;
656
+ letter-spacing: 0.04em;
657
+ }
658
+
659
+ // Below lg the three columns stack; the side column is no longer sticky and a
660
+ // shorter scroll region reads better under the form.
661
+ @media (max-width: 991.98px) {
662
+ .wizard-side {
663
+ max-height: none;
664
+ overflow: visible;
665
+ }
666
+
667
+ .wizard-preview-code {
668
+ max-height: 20rem;
669
+ }
670
+
671
+ .sb-messages {
672
+ max-height: 16rem;
673
+ }
674
+
675
+ .wizard-stepper {
676
+ flex-direction: row !important;
677
+ flex-wrap: wrap;
678
+ }
679
+
680
+ .wizard-step {
681
+ width: auto;
682
+ flex: 1 1 auto;
683
+ }
684
+
685
+ .wizard-progress {
686
+ display: none;
687
+ }
688
+ }
689
+
690
+ @media (prefers-reduced-motion: reduce) {
691
+ .sb-typing span,
692
+ .sb-connect-status .sb-status-dot,
693
+ .skin-card,
694
+ .wizard-progress .progress-bar {
695
+ animation: none !important;
696
+ transition: none !important;
697
+ }
698
+ }
699
+
700
+ // -----------------------------------------------------------------------------
701
+ // Connect step — providers, bring-your-own token, session mode (ZER0-087)
702
+ // -----------------------------------------------------------------------------
703
+
704
+ .sb-provider-card {
705
+ &.is-pinned-out {
706
+ opacity: 0.45;
707
+ }
708
+
709
+ .sb-provider-state {
710
+ flex-shrink: 0;
711
+ font-size: 0.65rem;
712
+ }
713
+ }
714
+
715
+ .sb-credential {
716
+ input[type="password"] {
717
+ font-family: var(--bs-font-monospace);
718
+ letter-spacing: 0.06em;
719
+ }
720
+
721
+ .input-group .btn {
722
+ white-space: nowrap;
723
+ }
724
+ }
725
+
726
+ // Proxy reachable, provider still without a key.
727
+ .sb-connect-status[data-state="partial"] .sb-status-dot {
728
+ background: var(--bs-info);
729
+ box-shadow: 0 0 0 4px rgba(13, 202, 240, 0.2);
730
+ }
731
+
732
+ .sb-mode-badge {
733
+ font-size: 0.65rem;
734
+ text-transform: uppercase;
735
+ letter-spacing: 0.04em;
736
+ }
737
+
738
+ #sb-stop {
739
+ white-space: nowrap;
740
+ }
741
+
742
+ // Before/after snippet on edit cards and the start of a file on write cards.
743
+ .sb-card .sb-diff {
744
+ max-height: 8rem;
745
+ margin: 0;
746
+ padding: 0.4rem 0.5rem;
747
+ overflow: auto;
748
+ font-size: 0.68rem;
749
+ line-height: 1.4;
750
+ color: #d8dee9;
751
+ background: #1b1f24;
752
+ border-radius: var(--zer0-radius-sm, 0.375rem);
753
+ white-space: pre-wrap;
754
+ word-break: break-word;
755
+ }
756
+
757
+ // Thumbnail of a generated image, served by the dev proxy's /asset route.
758
+ .sb-card .sb-image-thumb {
759
+ display: block;
760
+ max-width: 100%;
761
+ max-height: 12rem;
762
+ border: 1px solid var(--bs-border-color);
763
+ border-radius: var(--zer0-radius-sm, 0.375rem);
764
+ }