jekyll-theme-zer0 1.29.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 (148) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +715 -2
  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 +169 -18
  7. data/_data/consumers.yml +48 -5
  8. data/_data/features.yml +146 -20
  9. data/_data/feedback_types.yml +17 -12
  10. data/_data/landing.yml +5 -2
  11. data/_data/navigation/quickstart.yml +4 -0
  12. data/_data/site_builder.yml +874 -0
  13. data/_data/theme-manifest.yml +122 -114
  14. data/_data/ui-text.yml +18 -0
  15. data/_includes/README.md +11 -1
  16. data/_includes/analytics/posthog.html +2 -2
  17. data/_includes/components/admin-links.html +2 -2
  18. data/_includes/components/admin-tabs.html +2 -2
  19. data/_includes/components/ai-chat.html +14 -11
  20. data/_includes/components/analytics-dashboard.html +8 -8
  21. data/_includes/components/author-bio.html +1 -1
  22. data/_includes/components/author-card.html +10 -2
  23. data/_includes/components/author-eeat.html +4 -4
  24. data/_includes/components/background-customizer.html +8 -8
  25. data/_includes/components/background-image.html +114 -0
  26. data/_includes/components/background-settings.html +28 -15
  27. data/_includes/components/collection-manager.html +5 -5
  28. data/_includes/components/component-showcase.html +13 -13
  29. data/_includes/components/config-editor.html +12 -12
  30. data/_includes/components/config-viewer.html +8 -8
  31. data/_includes/components/cookie-consent.html +11 -11
  32. data/_includes/components/cta-button.html +7 -2
  33. data/_includes/components/dev-shortcuts.html +7 -7
  34. data/_includes/components/env-dashboard.html +8 -8
  35. data/_includes/components/env-switcher.html +9 -9
  36. data/_includes/components/feature-card.html +2 -2
  37. data/_includes/components/halfmoon.html +2 -2
  38. data/_includes/components/info-section.html +36 -36
  39. data/_includes/components/js-cdn.html +15 -15
  40. data/_includes/components/language-toggle.html +4 -4
  41. data/_includes/components/mermaid.html +72 -435
  42. data/_includes/components/nanobar.html +5 -5
  43. data/_includes/components/nav-editor.html +2 -2
  44. data/_includes/components/nav-export.html +2 -2
  45. data/_includes/components/nav-overview.html +2 -2
  46. data/_includes/components/page-feedback.html +45 -30
  47. data/_includes/components/page-views-init.html +1 -1
  48. data/_includes/components/post-card.html +22 -22
  49. data/_includes/components/post-type-badge.html +2 -2
  50. data/_includes/components/powered-by.html +2 -2
  51. data/_includes/components/preview-image.html +6 -0
  52. data/_includes/components/quick-index.html +2 -2
  53. data/_includes/components/search-modal.html +27 -2
  54. data/_includes/components/searchbar.html +2 -2
  55. data/_includes/components/svg-background.html +2 -2
  56. data/_includes/components/theme-customizer.html +2 -2
  57. data/_includes/components/theme-info.html +6 -6
  58. data/_includes/components/theme-preview-gallery.html +22 -22
  59. data/_includes/content/giscus.html +2 -2
  60. data/_includes/content/intro.html +8 -8
  61. data/_includes/content/jsonld-faq.html +2 -2
  62. data/_includes/content/jsonld-software.html +2 -2
  63. data/_includes/content/seo.html +4 -4
  64. data/_includes/content/sitemap.html +27 -27
  65. data/_includes/content/toc.html +183 -183
  66. data/_includes/core/branding.html +6 -6
  67. data/_includes/core/console-capture.html +32 -74
  68. data/_includes/core/favicon.html +49 -7
  69. data/_includes/core/footer-fabs.html +17 -3
  70. data/_includes/core/footer.html +31 -18
  71. data/_includes/core/head.html +102 -90
  72. data/_includes/core/header.html +71 -52
  73. data/_includes/docs/bootstrap-docs.html +8 -8
  74. data/_includes/landing/landing-install-cards.html +2 -2
  75. data/_includes/landing/landing-quick-links.html +1 -1
  76. data/_includes/navigation/admin-nav.html +2 -2
  77. data/_includes/navigation/nav-tree.html +8 -8
  78. data/_includes/navigation/navbar.html +12 -12
  79. data/_includes/navigation/section-sidebar.html +16 -16
  80. data/_includes/navigation/sidebar-config.html +36 -2
  81. data/_includes/navigation/sidebar-left.html +15 -15
  82. data/_includes/navigation/sidebar-right.html +6 -6
  83. data/_includes/obsidian/full-graph.html +2 -2
  84. data/_includes/setup/claude-session.html +72 -0
  85. data/_includes/setup/prereq-checklist.html +90 -0
  86. data/_includes/setup/wizard.html +906 -291
  87. data/_includes/stats/stats-categories.html +8 -8
  88. data/_includes/stats/stats-header.html +14 -14
  89. data/_includes/stats/stats-metrics.html +12 -12
  90. data/_includes/stats/stats-no-data.html +12 -12
  91. data/_includes/stats/stats-overview.html +6 -6
  92. data/_includes/stats/stats-tags.html +8 -8
  93. data/_layouts/404.html +38 -24
  94. data/_layouts/admin.html +22 -22
  95. data/_layouts/article.html +39 -34
  96. data/_layouts/author.html +20 -20
  97. data/_layouts/authors.html +2 -2
  98. data/_layouts/book-abc.html +12 -12
  99. data/_layouts/book-story.html +15 -15
  100. data/_layouts/book.html +12 -12
  101. data/_layouts/collection.html +33 -33
  102. data/_layouts/cookbook.html +12 -12
  103. data/_layouts/default.html +27 -24
  104. data/_layouts/home.html +23 -23
  105. data/_layouts/index.html +10 -10
  106. data/_layouts/landing.html +17 -17
  107. data/_layouts/news.html +44 -44
  108. data/_layouts/note.html +38 -38
  109. data/_layouts/notebook.html +34 -34
  110. data/_layouts/recipe.html +24 -24
  111. data/_layouts/root.html +73 -55
  112. data/_layouts/section.html +23 -23
  113. data/_layouts/setup.html +3 -3
  114. data/_layouts/sitemap-collection.html +49 -49
  115. data/_layouts/stats.html +40 -40
  116. data/_layouts/tag.html +12 -12
  117. data/_layouts/welcome.html +21 -21
  118. data/_sass/components/_mermaid.scss +375 -0
  119. data/_sass/components/_setup-wizard.scss +569 -40
  120. data/_sass/core/_navbar.scss +11 -31
  121. data/_sass/layouts/_navbar-extras.scss +14 -4
  122. data/assets/css/main.scss +1 -0
  123. data/assets/js/ai-chat.js +47 -5
  124. data/assets/js/fleet-feedback-capture.js +124 -0
  125. data/assets/js/fleet-feedback.js +853 -0
  126. data/assets/js/mermaid-diagrams.js +1267 -0
  127. data/assets/js/modules/navigation/config.js +9 -6
  128. data/assets/js/modules/navigation/scroll-spy.js +315 -80
  129. data/assets/js/modules/theme/appearance.js +8 -2
  130. data/assets/js/obsidian-wiki-links.js +8 -3
  131. data/assets/js/page-feedback.js +125 -192
  132. data/assets/js/search-modal.js +26 -0
  133. data/assets/js/setup-wizard.js +2112 -361
  134. data/assets/js/site-builder.js +1834 -0
  135. data/assets/js/ui-enhancements.js +11 -3
  136. data/scripts/README.md +15 -0
  137. data/scripts/ai/README.md +38 -0
  138. data/scripts/ai/api_call.rb +124 -0
  139. data/scripts/ai/usage.rb +314 -0
  140. data/scripts/ai/usage_report.rb +225 -0
  141. data/scripts/ci/test_visual_evidence_autogen.py +341 -0
  142. data/scripts/ci/visual_evidence_autogen.py +1060 -0
  143. data/scripts/content-review.rb +20 -1
  144. data/scripts/test/integration/mermaid +22 -8
  145. data/scripts/test/lib/run_tests.sh +1 -0
  146. data/scripts/test/lib/test_visual_evidence_autogen.sh +24 -0
  147. data/scripts/translate.rb +23 -1
  148. metadata +19 -2
@@ -1,10 +1,13 @@
1
1
  // =============================================================================
2
- // Setup wizard (_includes/setup/wizard.html + assets/js/setup-wizard.js)
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)
3
5
  // =============================================================================
4
- // Feature: ZER0-067 · Redesign: T-040 / #408
6
+ // Feature: ZER0-067, ZER0-085 · Redesign: T-040 / #408 · Site Builder: ZER0-085
5
7
  //
6
- // Three columns at lg+ (stepper / steps / live preview), stacked below. The
7
- // two rules that matter most:
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:
8
11
  //
9
12
  // 1. `.wizard-panes` is a GRID with every pane in the same cell, so the
10
13
  // container is always exactly as tall as the tallest step; `.wizard-nav`
@@ -12,8 +15,8 @@
12
15
  // Neither alone is enough: the grid stops the CONTAINER resizing, and the
13
16
  // auto margin stops the BUTTONS floating up inside a short step.
14
17
  // Together, Back/Next sit at the same y offset on every step.
15
- // 2. The preview panel is sticky and always present, so it needs its own
16
- // scroll region rather than growing the page.
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.
17
20
  // =============================================================================
18
21
 
19
22
  // -----------------------------------------------------------------------------
@@ -95,15 +98,13 @@
95
98
 
96
99
  .wizard-step-label {
97
100
  display: block;
98
- overflow: hidden;
99
- text-overflow: ellipsis;
100
- white-space: nowrap;
101
+ overflow-wrap: anywhere; // "Integrations" must survive a ~100px stepper column
102
+ line-height: 1.2;
101
103
  }
102
104
 
103
105
  // "Draft saved" acknowledgement. Kept in the layout (no display toggling) so
104
- // its appearance never shifts the stepper.
106
+ // its appearance never shifts the header.
105
107
  .wizard-draft-chip {
106
- margin: 0.75rem 0 0;
107
108
  padding: 0.25rem 0.5rem;
108
109
  font-size: 0.75rem;
109
110
  color: var(--bs-success, #198754);
@@ -115,6 +116,10 @@
115
116
  }
116
117
  }
117
118
 
119
+ .wizard-progress .progress-bar {
120
+ transition: width 0.3s ease;
121
+ }
122
+
118
123
  // -----------------------------------------------------------------------------
119
124
  // Step panes — the stable-height half
120
125
  // -----------------------------------------------------------------------------
@@ -122,28 +127,27 @@
122
127
  .wizard-panes {
123
128
  // Every pane is stacked in ONE grid cell, so the row's height is
124
129
  // max(pane heights) — computed by the browser, continuously, exactly.
125
- //
126
- // This used to be a flex column whose min-height JS measured and wrote
127
- // inline. Measuring a box you have to un-hide, lay out, read and restore is
128
- // a guess: it came back ~16px short of the tallest pane, and the shortest
129
- // step's Back/Next sat 16px higher than everywhere else. Grid asks the
130
- // layout engine the same question and gets the answer right, on every
131
- // reflow, with no resize listener.
132
130
  display: grid;
133
131
  min-height: 26rem; // floor for the degenerate case of no panes
134
132
 
135
133
  // The selector carries `.tab-content` purely for specificity: Bootstrap's
136
134
  // `.tab-content > .tab-pane { display: none }` would otherwise take the
137
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
+
138
142
  &.tab-content > .tab-pane {
139
143
  display: flex;
140
144
  flex-direction: column;
141
145
  grid-area: 1 / 1; // one cell, all panes
146
+ min-width: 0;
142
147
 
143
148
  // Inactive panes stay in layout — that is the whole point — but must not
144
149
  // be seen, focused, clicked, or read out. `visibility: hidden` does all
145
- // four (it removes the subtree from the a11y tree and from the tab
146
- // order), which `opacity: 0` alone would not.
150
+ // four (it removes the subtree from the a11y tree and from the tab order).
147
151
  visibility: hidden;
148
152
  pointer-events: none;
149
153
 
@@ -166,17 +170,10 @@
166
170
  }
167
171
 
168
172
  // Pinned to the bottom of the card, so a short step does not float its
169
- // Back/Next up the page relative to a tall one.
170
- //
171
- // Pinning the row's BOTTOM is only half the job: the test measures the Next
172
- // button's TOP, so anything that changes the row's height moves it. Two things
173
- // did, and both are fixed here rather than in the assertion.
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).
174
176
  .wizard-nav {
175
- // 1. Never a block box. Step 1's nav is `text-end` with no `d-flex`, so its
176
- // button was an inline-block on a line box and sat on the baseline — the
177
- // descender space below it left that button ~2px above every other step's.
178
- // `flex-end` is the base; the later steps' `justify-content-between`
179
- // utility (Bootstrap emits `!important`) still wins where it is applied.
180
177
  display: flex;
181
178
  align-items: center;
182
179
  justify-content: flex-end;
@@ -184,29 +181,472 @@
184
181
  margin-top: auto;
185
182
  padding-top: 1rem;
186
183
 
187
- // 2. Never let a label wrap. In the real three-column layout the middle
188
- // column is ~270px, and "Review & Download" wrapped to a second line —
189
- // making that one button a line-height taller. With the row pinned to the
190
- // bottom, the extra line pushes the button's TOP up instead of its bottom
191
- // down, which is the 16px the offset test caught on step 4.
192
184
  .btn {
193
185
  white-space: nowrap;
194
186
  }
195
187
  }
196
188
 
197
189
  // -----------------------------------------------------------------------------
198
- // Persistent live preview
190
+ // Form furniture shared by several steps
199
191
  // -----------------------------------------------------------------------------
200
192
 
201
- .wizard-preview {
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 {
202
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
+ }
203
643
  }
204
644
 
205
645
  .wizard-preview-code {
206
- max-height: 60vh;
646
+ max-height: 38vh;
207
647
  margin-bottom: 0;
208
648
  overflow: auto;
209
- font-size: 0.78rem;
649
+ font-size: 0.74rem;
210
650
  line-height: 1.45;
211
651
  }
212
652
 
@@ -216,13 +656,22 @@
216
656
  letter-spacing: 0.04em;
217
657
  }
218
658
 
219
- // Below lg the three columns stack; the preview is no longer sticky and a
659
+ // Below lg the three columns stack; the side column is no longer sticky and a
220
660
  // shorter scroll region reads better under the form.
221
661
  @media (max-width: 991.98px) {
662
+ .wizard-side {
663
+ max-height: none;
664
+ overflow: visible;
665
+ }
666
+
222
667
  .wizard-preview-code {
223
668
  max-height: 20rem;
224
669
  }
225
670
 
671
+ .sb-messages {
672
+ max-height: 16rem;
673
+ }
674
+
226
675
  .wizard-stepper {
227
676
  flex-direction: row !important;
228
677
  flex-wrap: wrap;
@@ -232,4 +681,84 @@
232
681
  width: auto;
233
682
  flex: 1 1 auto;
234
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);
235
764
  }