@sunboard/react 0.9.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -1,904 +1,1196 @@
1
1
  /*
2
- * Sunboard owns its own variable namespace. Defaults are plain color literals
3
- * so they render correctly under any host theme system (Tailwind, shadcn v3
4
- * HSL, shadcn v4 OKLCH, vanilla CSS, etc.). To theme Sunboard to match your
5
- * app, override the `--sunboard-*` variables below in your own stylesheet —
6
- * map them to your design tokens (e.g. `var(--card)`, `var(--primary)`) or
7
- * set explicit colors. Make sure your stylesheet imports AFTER
8
- * `@sunboard/react/styles.css` so your overrides win the cascade.
2
+ * @sunboard/react styles. Isolation: everything is scoped under .sb-root
3
+ * (which carries the --sb-* theme variables inline) with explicit resets;
4
+ * nothing global, no shadow DOM (guide surfaces must inherit host layout).
9
5
  */
10
- :root {
11
- --sunboard-font:
12
- Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
13
- sans-serif;
14
- --sunboard-radius: 12px;
15
-
16
- --sunboard-checklist-background: #ffffff;
17
- --sunboard-checklist-foreground: #111827;
18
- --sunboard-checklist-border: #e5e7eb;
19
- --sunboard-checklist-shadow: 0 4px 12px rgb(0 0 0 / 10%);
20
- --sunboard-checklist-muted: #f3f4f6;
21
- --sunboard-checklist-muted-foreground: #6b7280;
22
- --sunboard-checklist-primary: #2563eb;
23
- --sunboard-checklist-primary-foreground: #ffffff;
24
- --sunboard-checklist-success: #16a34a;
25
-
26
- --sunboard-launcher-background: var(--sunboard-checklist-primary);
27
- --sunboard-launcher-foreground: var(--sunboard-checklist-primary-foreground);
28
- --sunboard-launcher-shadow: var(--sunboard-checklist-shadow);
29
- --sunboard-launcher-badge-background: #ef4444;
30
- --sunboard-launcher-badge-foreground: #ffffff;
31
-
32
- --sunboard-tour-background: var(--sunboard-checklist-background);
33
- --sunboard-tour-foreground: var(--sunboard-checklist-foreground);
34
- --sunboard-tour-border: var(--sunboard-checklist-border);
35
- --sunboard-tour-shadow: var(--sunboard-checklist-shadow);
36
- --sunboard-tour-muted-foreground: var(
37
- --sunboard-checklist-muted-foreground
38
- );
39
- --sunboard-tour-primary: var(--sunboard-checklist-primary);
40
- --sunboard-tour-primary-foreground: var(
41
- --sunboard-checklist-primary-foreground
42
- );
43
- --sunboard-tour-secondary-background: var(--sunboard-tour-background);
44
- --sunboard-tour-secondary-foreground: var(--sunboard-tour-foreground);
45
- --sunboard-tour-secondary-border: var(--sunboard-tour-border);
46
-
47
- --sunboard-overlay-color: rgb(15 23 42 / 18%);
48
- /* Stronger scrim behind the centered onboarding survey (a gating step). */
49
- --sunboard-survey-overlay-color: rgb(15 23 42 / 45%);
50
-
51
- --sunboard-hotspot-background: var(--sunboard-checklist-primary);
52
- --sunboard-hotspot-border: var(--sunboard-checklist-primary-foreground);
53
- --sunboard-hotspot-dot: var(--sunboard-checklist-primary-foreground);
54
- --sunboard-hotspot-shadow: var(--sunboard-checklist-shadow);
55
- --sunboard-hotspot-pulse-ring: rgb(37 99 235 / 28%);
56
-
57
- --sunboard-debug-background: var(--sunboard-checklist-background);
58
- --sunboard-debug-foreground: var(--sunboard-checklist-foreground);
59
- --sunboard-debug-border: var(--sunboard-checklist-border);
60
- --sunboard-debug-shadow: var(--sunboard-checklist-shadow);
61
- }
62
-
63
- .sunboard-root {
64
- position: fixed;
65
- right: max(16px, env(safe-area-inset-right));
66
- bottom: max(16px, env(safe-area-inset-bottom));
67
- z-index: 2147483000;
68
- width: min(360px, calc(100vw - 32px));
69
- max-height: min(680px, calc(100vh - 32px));
70
- overflow: auto;
6
+
7
+ .sb-root,
8
+ .sb-root *,
9
+ .sb-root *::before,
10
+ .sb-root *::after {
71
11
  box-sizing: border-box;
72
- border: 1px solid var(--sunboard-checklist-border);
73
- border-radius: var(--sunboard-radius);
74
- background: var(--sunboard-checklist-background);
75
- box-shadow: var(--sunboard-checklist-shadow);
76
- color: var(--sunboard-checklist-foreground);
77
- font-family: var(--sunboard-font);
78
- padding: 16px;
12
+ margin: 0;
13
+ }
14
+
15
+ .sb-root {
16
+ --sb-r2: max(calc(var(--sb-card-radius) - 4px), 2px);
17
+ --sb-r3: max(calc(var(--sb-card-radius) - 6px), 2px);
18
+ --sb-ring: color-mix(in srgb, var(--sb-accent) 20%, transparent);
19
+ --sb-tint: color-mix(in srgb, var(--sb-accent) 10%, transparent);
20
+
21
+ color: var(--sb-text);
22
+ font-family: var(--sb-font);
23
+ font-size: var(--sb-size-base);
24
+ font-weight: var(--sb-weight-regular);
25
+ line-height: var(--sb-lh-normal);
26
+ }
27
+ .sb-root[data-sb-mode="dark"] {
28
+ --sb-tint: color-mix(in srgb, var(--sb-accent) 20%, transparent);
79
29
  }
80
30
 
81
- .sunboard-launcher {
31
+ .sb-root button {
32
+ font-family: var(--sb-font);
33
+ }
34
+
35
+ /* One focus idiom for every interactive element in the SDK (v1 parity: the
36
+ keyboard path is first-class on all surfaces, not just form controls). */
37
+ .sb-root button:focus-visible,
38
+ .sb-root a:focus-visible,
39
+ .sb-root input:focus-visible {
40
+ outline: none;
41
+ box-shadow: var(--sb-focus-ring);
42
+ }
43
+
44
+ /* The card takes focus when a step shows; the spotlight and the card itself
45
+ already say where the user is, so it draws no ring of its own. */
46
+ .sb-root .popover-card:focus {
47
+ outline: none;
48
+ }
49
+
50
+ /* ---------- overlay: card primary action ---------- */
51
+ .sb-root .start {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ gap: 4px;
55
+ padding: 0;
56
+ background: none;
57
+ border: none;
58
+ color: var(--sb-accent);
59
+ font-family: var(--sb-font);
60
+ font-size: var(--sb-size-sm);
61
+ font-weight: var(--sb-weight-medium);
62
+ cursor: pointer;
63
+ }
64
+ .sb-root .start:hover {
65
+ color: color-mix(in srgb, var(--sb-accent) 80%, var(--sb-text));
66
+ }
67
+ .sb-root .start svg {
68
+ width: 12px;
69
+ height: 12px;
70
+ }
71
+ .sb-root .start.filled {
72
+ justify-content: center;
73
+ height: var(--sb-input-height);
74
+ padding: 0 var(--sb-input-padding);
75
+ border-radius: var(--sb-input-radius);
76
+ background: var(--sb-accent);
77
+ color: var(--sb-accent-text);
78
+ }
79
+ .sb-root .start.filled:hover {
80
+ background: color-mix(in srgb, var(--sb-accent) 85%, var(--sb-text));
81
+ color: var(--sb-accent-text);
82
+ }
83
+
84
+ /* ---------- launcher ---------- */
85
+ .sb-root .sb-launcher {
82
86
  position: fixed;
83
87
  right: max(16px, env(safe-area-inset-right));
84
88
  bottom: max(16px, env(safe-area-inset-bottom));
85
- z-index: 2147483000;
86
- display: grid;
87
- width: 56px;
88
- height: 56px;
89
- place-items: center;
90
- border: 0;
89
+ z-index: 2147482996;
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 8px;
93
+ height: 44px;
94
+ max-width: calc(100vw - 32px);
95
+ padding: 0 16px 0 12px;
96
+ border: none;
91
97
  border-radius: 999px;
92
- background: var(--sunboard-launcher-background);
93
- box-shadow: var(--sunboard-launcher-shadow);
94
- color: var(--sunboard-launcher-foreground);
98
+ background: var(--sb-accent);
99
+ color: var(--sb-accent-text);
100
+ box-shadow: 0 6px 20px -6px rgba(16, 17, 20, 0.4);
95
101
  cursor: pointer;
96
- font-family: var(--sunboard-font);
97
- padding: 0;
98
- transition: transform 160ms ease;
102
+ font-family: var(--sb-font);
103
+ font-size: var(--sb-size-base);
104
+ font-weight: var(--sb-weight-medium);
105
+ line-height: normal;
99
106
  }
100
-
101
- .sunboard-launcher:hover {
102
- transform: scale(1.05);
107
+ .sb-root .sb-launcher svg {
108
+ width: 18px;
109
+ height: 18px;
103
110
  }
104
111
 
105
- .sunboard-launcher svg {
106
- width: 24px;
107
- height: 24px;
112
+ /* ---------- tour pill ---------- */
113
+ .sb-root .sb-tour-pill {
114
+ position: fixed;
115
+ right: max(16px, env(safe-area-inset-right));
116
+ bottom: max(16px, env(safe-area-inset-bottom));
117
+ z-index: 2147482996;
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 12px;
121
+ height: 48px;
122
+ max-width: calc(100vw - 32px);
123
+ padding: 0 6px 0 14px;
124
+ border: 1px solid var(--sb-border);
125
+ border-radius: 999px;
126
+ background: var(--sb-surface);
127
+ color: var(--sb-text);
128
+ box-shadow: var(--sb-card-shadow);
129
+ line-height: normal;
108
130
  }
109
-
110
- .sunboard-launcher-badge {
111
- position: absolute;
112
- top: -4px;
113
- right: -4px;
131
+ .sb-root .sb-tour-pill-mark {
114
132
  display: grid;
115
- min-width: 22px;
116
- height: 22px;
117
133
  place-items: center;
134
+ flex-shrink: 0;
135
+ width: 22px;
136
+ height: 22px;
118
137
  border-radius: 999px;
119
- background: var(--sunboard-launcher-badge-background);
120
- box-shadow: 0 2px 4px rgb(0 0 0 / 20%);
121
- color: var(--sunboard-launcher-badge-foreground);
122
- font-size: 12px;
123
- font-weight: 700;
124
- line-height: 1;
125
- padding: 0 6px;
138
+ background: var(--sb-tint);
139
+ color: var(--sb-accent);
140
+ }
141
+ .sb-root .sb-tour-pill-mark svg {
142
+ width: 12px;
143
+ height: 12px;
144
+ }
145
+ .sb-root .sb-tour-pill-name {
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ white-space: nowrap;
149
+ font-size: var(--sb-size-base);
150
+ font-weight: var(--sb-weight-medium);
151
+ }
152
+ .sb-root .sb-tour-pill-count {
153
+ flex-shrink: 0;
154
+ font-size: var(--sb-size-sm);
155
+ color: var(--sb-text-muted);
156
+ }
157
+ .sb-root .sb-tour-pill-stop {
158
+ flex-shrink: 0;
159
+ height: 36px;
160
+ padding: 0 14px;
161
+ border: 0;
162
+ border-radius: 999px;
163
+ background: var(--sb-surface-hover);
164
+ color: var(--sb-text);
165
+ cursor: pointer;
166
+ font-family: var(--sb-font);
167
+ font-size: var(--sb-size-sm);
168
+ font-weight: var(--sb-weight-medium);
169
+ }
170
+ .sb-root .sb-tour-pill-stop:hover {
171
+ background: var(--sb-border);
126
172
  }
127
173
 
128
- .sunboard-launcher:focus-visible,
129
- .sunboard-close:focus-visible {
130
- outline: 2px solid var(--sunboard-checklist-primary);
131
- outline-offset: 3px;
174
+ /* ---------- the assistant panel ---------- */
175
+ .sb-root .sb-sr {
176
+ position: absolute;
177
+ width: 1px;
178
+ height: 1px;
179
+ margin: -1px;
180
+ padding: 0;
181
+ overflow: hidden;
182
+ clip-path: inset(50%);
183
+ white-space: nowrap;
184
+ border: 0;
132
185
  }
133
186
 
134
- .sunboard-root *,
135
- .sunboard-root *::before,
136
- .sunboard-root *::after {
137
- box-sizing: border-box;
187
+ .sb-root .sb-panel-scrim {
188
+ display: none;
138
189
  }
139
190
 
140
- .sunboard-header {
191
+ .sb-root .sb-panel {
192
+ position: fixed;
193
+ right: max(16px, env(safe-area-inset-right));
194
+ bottom: max(16px, env(safe-area-inset-bottom));
195
+ z-index: 2147482996;
141
196
  display: flex;
142
- align-items: flex-start;
143
- justify-content: space-between;
144
- gap: 16px;
197
+ flex-direction: column;
198
+ width: var(--sb-launcher-w);
199
+ max-width: calc(100vw - 32px);
200
+ height: min(600px, calc(100vh - 120px));
201
+ /* Dropped, leaving the line above, when the theme holds no max height. */
202
+ height: min(600px, var(--sb-launcher-maxh), calc(100vh - 120px));
203
+ overflow: hidden;
204
+ background: var(--sb-surface);
205
+ color: var(--sb-text);
206
+ border: 1px solid var(--sb-border);
207
+ border-radius: calc(var(--sb-card-radius) + 4px);
208
+ box-shadow:
209
+ 0 1px 2px rgba(16, 17, 20, 0.06),
210
+ 0 16px 40px -12px rgba(16, 17, 20, 0.22);
211
+ line-height: normal;
212
+ animation: sb-slide-in 0.3s ease-out;
213
+ }
214
+ .sb-root .sb-panel:focus {
215
+ outline: none;
216
+ }
217
+ .sb-root .sb-panel.sb-inline {
218
+ position: static;
219
+ animation: none;
145
220
  }
146
221
 
147
- .sunboard-header-actions {
222
+ .sb-root .sb-head {
223
+ position: relative;
224
+ z-index: 2;
225
+ flex-shrink: 0;
226
+ height: 56px;
148
227
  display: flex;
149
- flex: 0 0 auto;
150
228
  align-items: center;
151
- gap: 8px;
229
+ gap: 2px;
230
+ padding: 0 6px 0 18px;
231
+ border-bottom: 1px solid transparent;
152
232
  }
153
-
154
- .sunboard-eyebrow,
155
- .sunboard-title,
156
- .sunboard-progress-count,
157
- .sunboard-step-title,
158
- .sunboard-step-description {
159
- margin: 0;
233
+ .sb-root .sb-head-line {
234
+ border-bottom-color: var(--sb-border);
160
235
  }
161
-
162
- .sunboard-eyebrow {
163
- color: var(--sunboard-checklist-muted-foreground);
164
- font-size: 12px;
165
- font-weight: 650;
166
- line-height: 1.2;
236
+ .sb-root .sb-title {
237
+ flex: 1;
238
+ min-width: 0;
239
+ overflow: hidden;
240
+ text-overflow: ellipsis;
241
+ white-space: nowrap;
242
+ font-size: calc(var(--sb-size-base) + 1px);
243
+ font-weight: var(--sb-weight-semibold);
167
244
  }
168
-
169
- .sunboard-title {
170
- margin-top: 3px;
171
- font-size: 16px;
172
- font-weight: 700;
173
- line-height: 1.3;
245
+ /* Drawn 36 tall as the design has it; the hit area reaches 44. */
246
+ .sb-root .sb-ghost {
247
+ position: relative;
248
+ flex-shrink: 0;
249
+ height: 36px;
250
+ display: flex;
251
+ align-items: center;
252
+ gap: 6px;
253
+ padding: 0 10px;
254
+ border: 0;
255
+ border-radius: var(--sb-r3);
256
+ background: transparent;
257
+ color: var(--sb-text-muted);
258
+ cursor: pointer;
259
+ font-size: calc(var(--sb-size-base) - 1px);
260
+ font-weight: var(--sb-weight-medium);
174
261
  }
175
-
176
- .sunboard-progress-count {
177
- flex: 0 0 auto;
178
- border-radius: 999px;
179
- background: var(--sunboard-checklist-muted);
180
- color: var(--sunboard-checklist-muted-foreground);
181
- font-size: 12px;
182
- font-weight: 650;
183
- line-height: 1;
184
- padding: 7px 9px;
262
+ .sb-root .sb-ghost::after {
263
+ content: "";
264
+ position: absolute;
265
+ inset: -4px 0;
185
266
  }
186
-
187
- .sunboard-close {
267
+ .sb-root .sb-ghost:hover,
268
+ .sb-root .sb-ghost[aria-expanded="true"] {
269
+ background: var(--sb-surface-hover);
270
+ color: var(--sb-text);
271
+ }
272
+ .sb-root .sb-ghost svg {
273
+ width: 15px;
274
+ height: 15px;
275
+ }
276
+ .sb-root .sb-panel-close {
188
277
  display: grid;
189
- width: 26px;
190
- height: 26px;
191
278
  place-items: center;
279
+ flex-shrink: 0;
280
+ width: 44px;
281
+ height: 44px;
282
+ padding: 0;
192
283
  border: 0;
193
- border-radius: 999px;
284
+ border-radius: var(--sb-r2);
194
285
  background: transparent;
195
- color: var(--sunboard-checklist-muted-foreground);
286
+ color: var(--sb-text-muted);
196
287
  cursor: pointer;
197
- padding: 0;
198
288
  }
199
-
200
- .sunboard-close:hover {
201
- background: var(--sunboard-checklist-muted);
289
+ .sb-root .sb-panel-close:hover {
290
+ background: var(--sb-surface-hover);
291
+ color: var(--sb-text);
202
292
  }
203
-
204
- .sunboard-close svg {
205
- width: 14px;
206
- height: 14px;
293
+ .sb-root .sb-panel-close svg {
294
+ width: 18px;
295
+ height: 18px;
207
296
  }
208
297
 
209
- .sunboard-progress {
210
- height: 8px;
211
- overflow: hidden;
212
- border-radius: 999px;
213
- background: var(--sunboard-checklist-muted);
214
- margin-top: 14px;
298
+ .sb-root .sb-confirm {
299
+ position: absolute;
300
+ top: calc(100% - 4px);
301
+ right: 12px;
302
+ z-index: 5;
303
+ width: 264px;
304
+ max-width: calc(100% - 24px);
305
+ padding: 14px;
306
+ display: flex;
307
+ flex-direction: column;
308
+ gap: 12px;
309
+ background: var(--sb-surface);
310
+ border: 1px solid var(--sb-border);
311
+ border-radius: var(--sb-card-radius);
312
+ box-shadow: 0 12px 32px -10px rgba(10, 11, 14, 0.3);
313
+ }
314
+ .sb-root .sb-confirm-text {
315
+ display: flex;
316
+ flex-direction: column;
317
+ gap: 2px;
318
+ }
319
+ .sb-root .sb-confirm-title {
320
+ font-size: calc(var(--sb-size-base) + 0.5px);
321
+ font-weight: var(--sb-weight-medium);
322
+ }
323
+ .sb-root .sb-confirm-body {
324
+ font-size: calc(var(--sb-size-base) - 0.5px);
325
+ line-height: 1.45;
326
+ color: var(--sb-text-muted);
327
+ }
328
+ .sb-root .sb-confirm-actions {
329
+ display: flex;
330
+ justify-content: flex-end;
331
+ gap: 8px;
332
+ }
333
+ .sb-root .sb-confirm-cancel,
334
+ .sb-root .sb-confirm-go {
335
+ height: 44px;
336
+ padding: 0 14px;
337
+ border: 1px solid var(--sb-border);
338
+ border-radius: var(--sb-r3);
339
+ background: var(--sb-surface);
340
+ color: var(--sb-text);
341
+ cursor: pointer;
342
+ font-size: calc(var(--sb-size-base) - 0.5px);
343
+ font-weight: var(--sb-weight-medium);
344
+ }
345
+ .sb-root .sb-confirm-cancel:hover {
346
+ background: var(--sb-surface-hover);
347
+ }
348
+ .sb-root .sb-confirm-go {
349
+ border-color: var(--sb-text);
350
+ background: var(--sb-text);
351
+ color: var(--sb-surface);
215
352
  }
216
353
 
217
- .sunboard-progress-fill {
354
+ .sb-root .sb-thread {
355
+ position: relative;
356
+ flex: 1;
357
+ min-height: 0;
358
+ }
359
+ .sb-root .sb-thread-scroll {
218
360
  height: 100%;
219
- border-radius: inherit;
220
- background: var(--sunboard-checklist-primary);
221
- transition: width 160ms ease;
361
+ display: flex;
362
+ flex-direction: column;
363
+ overflow-y: auto;
364
+ overflow-anchor: none;
365
+ overscroll-behavior: contain;
222
366
  }
223
-
224
- .sunboard-step-list {
225
- display: grid;
226
- gap: 4px;
227
- list-style: none;
228
- margin: 8px 0 0;
229
- padding: 0;
367
+ /* Starts at the top, and once it overflows, sticks to the newest message. */
368
+ .sb-root .sb-thread-scroll.sb-anchored {
369
+ flex-direction: column-reverse;
230
370
  }
231
-
232
- .sunboard-step-row {
233
- display: grid;
234
- width: 100%;
235
- grid-template-columns: 20px minmax(0, 1fr);
236
- gap: 12px;
237
- align-items: start;
238
- padding: 10px 8px;
239
- margin: 0 -8px;
240
- border-radius: 8px;
371
+ .sb-root .sb-thread-list {
372
+ display: flex;
373
+ flex-direction: column;
374
+ gap: 28px;
375
+ padding: 20px 18px 16px;
241
376
  }
242
-
243
- /* Hovering anywhere on a row with something to click (an action, a checkable
244
- checkbox, or both) highlights the whole row, like the old row-button did. */
245
- .sunboard-step-row[data-interactive="true"]:hover {
246
- background: var(--sunboard-checklist-muted);
377
+ .sb-root .sb-anchored > .sb-thread-list {
378
+ margin-bottom: auto;
247
379
  }
248
380
 
249
- .sunboard-step-main {
250
- display: grid;
381
+ .sb-root .sb-start {
382
+ display: flex;
383
+ flex-direction: column;
384
+ gap: 20px;
385
+ }
386
+ .sb-root .sb-start-title {
387
+ padding-top: 4px;
388
+ font-size: calc(var(--sb-size-base) + 6px);
389
+ font-weight: var(--sb-weight-semibold);
390
+ letter-spacing: -0.01em;
391
+ }
392
+ .sb-root .sb-group {
393
+ display: flex;
394
+ flex-direction: column;
395
+ gap: 2px;
396
+ margin: 0 -10px;
397
+ }
398
+ .sb-root .sb-group h4 {
399
+ padding: 0 10px 6px;
400
+ font-size: calc(var(--sb-size-base) - 1.5px);
401
+ font-weight: var(--sb-weight-medium);
402
+ color: var(--sb-text-muted);
403
+ }
404
+ .sb-root .sb-row {
251
405
  width: 100%;
252
- grid-template-columns: minmax(0, 1fr) 16px;
406
+ min-height: 48px;
407
+ display: flex;
408
+ align-items: center;
253
409
  gap: 12px;
254
- align-items: start;
410
+ padding: 6px 10px;
255
411
  border: 0;
412
+ border-radius: var(--sb-r2);
256
413
  background: transparent;
257
- color: inherit;
258
- cursor: pointer;
259
- font: inherit;
414
+ color: var(--sb-text);
260
415
  text-align: left;
261
- padding: 0;
262
- margin: 0;
263
- border-radius: 4px;
416
+ cursor: pointer;
417
+ font-size: calc(var(--sb-size-base) + 0.5px);
264
418
  }
265
-
266
- .sunboard-step-main:focus-visible {
267
- outline: 2px solid var(--sunboard-checklist-primary);
268
- outline-offset: 2px;
419
+ .sb-root .sb-row:hover,
420
+ .sb-root .sb-row:focus-visible {
421
+ background: var(--sb-surface-hover);
269
422
  }
270
-
271
- .sunboard-step-status {
423
+ .sb-root .sb-row-mark {
272
424
  display: grid;
273
- width: 20px;
274
- height: 20px;
275
425
  place-items: center;
276
- border: 2px solid var(--sunboard-checklist-border);
277
- border-radius: 6px;
278
- background: transparent;
279
- padding: 0;
280
- color: var(--sunboard-checklist-primary-foreground);
426
+ flex-shrink: 0;
427
+ width: 28px;
428
+ height: 28px;
429
+ border-radius: var(--sb-r3);
430
+ background: var(--sb-tint);
431
+ color: var(--sb-accent);
432
+ }
433
+ .sb-root .sb-row-mark svg {
434
+ width: 15px;
435
+ height: 15px;
436
+ }
437
+ .sb-root .sb-row-title {
438
+ flex: 1;
439
+ min-width: 0;
440
+ }
441
+ .sb-root .sb-row > svg {
442
+ width: 16px;
443
+ height: 16px;
444
+ flex-shrink: 0;
445
+ color: var(--sb-text-muted);
281
446
  }
282
447
 
283
- .sunboard-step-status svg {
284
- width: 12px;
285
- height: 12px;
286
- stroke-width: 3;
448
+ .sb-root .sb-exchange {
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: 16px;
452
+ }
453
+ .sb-root .sb-asked {
454
+ display: flex;
455
+ justify-content: flex-end;
456
+ }
457
+ .sb-root .sb-asked p {
458
+ max-width: 82%;
459
+ padding: 10px 14px;
460
+ border-radius: var(--sb-card-radius) var(--sb-card-radius) var(--sb-r3) var(--sb-card-radius);
461
+ background: var(--sb-surface-hover);
462
+ color: var(--sb-text);
463
+ font-size: calc(var(--sb-size-base) + 0.5px);
464
+ line-height: 1.45;
465
+ white-space: pre-wrap;
466
+ overflow-wrap: anywhere;
287
467
  }
288
468
 
289
- /* Checkable: the status is a button; preview the check on hover/focus. */
290
- button.sunboard-step-status {
469
+ .sb-root .sb-reply {
470
+ display: flex;
471
+ flex-direction: column;
472
+ gap: 12px;
473
+ }
474
+ .sb-root .sb-arrive {
475
+ animation: sb-fade-in 150ms ease-out both;
476
+ }
477
+ .sb-root .sb-reply-text {
478
+ display: flex;
479
+ flex-direction: column;
480
+ gap: 8px;
481
+ font-size: calc(var(--sb-size-base) + 1px);
482
+ line-height: 1.55;
483
+ text-wrap: pretty;
484
+ overflow-wrap: anywhere;
485
+ }
486
+ .sb-root .sb-answer {
487
+ display: flex;
488
+ flex-direction: column;
489
+ gap: 8px;
490
+ }
491
+ .sb-root .sb-answer ol,
492
+ .sb-root .sb-answer ul {
493
+ list-style: decimal;
494
+ display: flex;
495
+ flex-direction: column;
496
+ gap: 6px;
497
+ padding-left: 1.4em;
498
+ }
499
+ .sb-root .sb-answer ul {
500
+ list-style: disc;
501
+ }
502
+ .sb-root .sb-answer li {
503
+ padding-left: 2px;
504
+ }
505
+ .sb-root .sb-answer li::marker {
506
+ color: var(--sb-text-muted);
507
+ }
508
+ .sb-root .sb-answer strong {
509
+ font-weight: var(--sb-weight-semibold);
510
+ }
511
+ .sb-root .sb-reply-action {
512
+ display: flex;
513
+ }
514
+ .sb-root .sb-primary {
515
+ height: 44px;
516
+ display: flex;
517
+ align-items: center;
518
+ gap: 8px;
519
+ padding: 0 18px 0 16px;
520
+ border: 0;
521
+ border-radius: var(--sb-r2);
522
+ background: var(--sb-accent);
523
+ color: var(--sb-accent-text);
291
524
  cursor: pointer;
525
+ font-size: calc(var(--sb-size-base) + 0.5px);
526
+ font-weight: var(--sb-weight-medium);
292
527
  }
293
-
294
- button.sunboard-step-status svg {
295
- opacity: 0;
296
- color: var(--sunboard-checklist-muted-foreground);
297
- transition: opacity 120ms ease;
528
+ .sb-root .sb-primary svg {
529
+ width: 14px;
530
+ height: 14px;
298
531
  }
299
-
300
- button.sunboard-step-status:hover,
301
- button.sunboard-step-status:focus-visible {
302
- border-color: var(--sunboard-checklist-success);
532
+ .sb-root .sb-secondary {
533
+ height: 44px;
534
+ display: flex;
535
+ align-items: center;
536
+ gap: 8px;
537
+ padding: 0 16px;
538
+ border: 1px solid var(--sb-border);
539
+ border-radius: var(--sb-r2);
540
+ background: var(--sb-surface);
541
+ color: var(--sb-text);
542
+ cursor: pointer;
543
+ font-size: var(--sb-size-base);
544
+ font-weight: var(--sb-weight-medium);
303
545
  }
304
-
305
- button.sunboard-step-status:hover svg,
306
- button.sunboard-step-status:focus-visible svg {
307
- opacity: 1;
546
+ .sb-root .sb-secondary:hover {
547
+ border-color: var(--sb-border-hover);
548
+ background: var(--sb-surface-hover);
308
549
  }
309
-
310
- button.sunboard-step-status:focus-visible {
311
- outline: 2px solid var(--sunboard-checklist-primary);
312
- outline-offset: 2px;
550
+ .sb-root .sb-secondary svg {
551
+ width: 15px;
552
+ height: 15px;
313
553
  }
314
-
315
- /* manual: false and not yet complete: the checkbox is inert and says so. */
316
- .sunboard-step-status[data-locked="true"] {
317
- border-style: dashed;
318
- opacity: 0.55;
554
+ .sb-root .sb-secondary.sb-show-again {
555
+ padding: 0 16px 0 14px;
319
556
  }
320
-
321
- .sunboard-step[data-completed="true"] .sunboard-step-status {
322
- border-color: var(--sunboard-checklist-success);
323
- background: var(--sunboard-checklist-success);
557
+ .sb-root .sb-show-again svg {
558
+ width: 12px;
559
+ height: 12px;
560
+ color: var(--sb-accent);
324
561
  }
325
562
 
326
- .sunboard-step[data-completed="true"] .sunboard-step-title {
327
- color: var(--sunboard-checklist-muted-foreground);
328
- text-decoration: line-through;
563
+ .sb-root .sb-support {
564
+ display: flex;
565
+ align-items: center;
566
+ gap: 12px;
567
+ padding: 12px 12px 12px 14px;
568
+ border-radius: var(--sb-r2);
569
+ background: var(--sb-surface-hover);
570
+ }
571
+ .sb-root .sb-support > span {
572
+ flex: 1;
573
+ font-size: calc(var(--sb-size-base) - 0.5px);
574
+ line-height: 1.4;
575
+ color: var(--sb-text-muted);
576
+ }
577
+ .sb-root .sb-support-link {
578
+ flex-shrink: 0;
579
+ height: 44px;
580
+ display: flex;
581
+ align-items: center;
582
+ gap: 6px;
583
+ padding: 0 14px;
584
+ border: 1px solid var(--sb-border);
585
+ border-radius: var(--sb-r3);
586
+ background: var(--sb-surface);
587
+ color: var(--sb-text);
588
+ font-size: var(--sb-size-base);
589
+ font-weight: var(--sb-weight-medium);
590
+ text-decoration: none;
591
+ }
592
+ .sb-root .sb-support-link:hover {
593
+ border-color: var(--sb-border-hover);
594
+ }
595
+ .sb-root .sb-support-link svg {
596
+ width: 14px;
597
+ height: 14px;
598
+ color: var(--sb-text-muted);
329
599
  }
330
600
 
331
- .sunboard-step-arrow {
601
+ .sb-root .sb-note {
602
+ display: flex;
603
+ align-items: flex-start;
604
+ gap: 12px;
605
+ }
606
+ .sb-root .sb-note-mark {
332
607
  display: grid;
333
- width: 16px;
334
- height: 20px;
335
608
  place-items: center;
336
- color: var(--sunboard-checklist-muted-foreground);
609
+ flex-shrink: 0;
610
+ width: 32px;
611
+ height: 32px;
612
+ border-radius: 999px;
613
+ background: var(--sb-surface-hover);
614
+ color: var(--sb-text-muted);
337
615
  }
338
-
339
- .sunboard-step-arrow svg {
616
+ .sb-root .sb-note-mark svg {
340
617
  width: 16px;
341
618
  height: 16px;
342
619
  }
343
-
344
- .sunboard-step-content {
345
- min-width: 0;
620
+ .sb-root .sb-note-text {
621
+ display: flex;
622
+ flex-direction: column;
623
+ gap: 10px;
624
+ padding-top: 5px;
346
625
  }
347
-
348
- .sunboard-step-heading {
626
+ .sb-root .sb-note-words {
349
627
  display: flex;
350
- align-items: flex-start;
351
- justify-content: space-between;
352
- gap: 8px;
628
+ flex-direction: column;
629
+ gap: 2px;
353
630
  }
354
-
355
- .sunboard-step-title {
356
- min-width: 0;
357
- overflow-wrap: anywhere;
358
- font-size: 14px;
359
- font-weight: 650;
360
- line-height: 1.35;
631
+ .sb-root .sb-note-title {
632
+ font-size: calc(var(--sb-size-base) + 1px);
633
+ font-weight: var(--sb-weight-medium);
634
+ line-height: 1.4;
361
635
  }
362
-
363
- .sunboard-step-badge {
364
- flex: 0 0 auto;
365
- color: var(--sunboard-checklist-muted-foreground);
366
- font-size: 11px;
367
- font-weight: 650;
636
+ .sb-root .sb-note-body {
637
+ font-size: var(--sb-size-base);
368
638
  line-height: 1.5;
369
- white-space: nowrap;
639
+ color: var(--sb-text-muted);
370
640
  }
371
641
 
372
- .sunboard-step-description {
373
- color: var(--sunboard-checklist-muted-foreground);
374
- font-size: 13px;
375
- line-height: 1.4;
376
- margin-top: 3px;
642
+ .sb-root .sb-line {
643
+ display: flex;
644
+ align-items: center;
645
+ gap: 10px;
646
+ font-size: calc(var(--sb-size-base) - 1.5px);
647
+ color: var(--sb-text-muted);
377
648
  }
378
-
379
- .sunboard-hotspot {
380
- z-index: 2147483001;
381
- display: grid;
382
- width: 18px;
383
- height: 18px;
384
- place-items: center;
385
- border: 2px solid var(--sunboard-hotspot-border);
386
- border-radius: 999px;
387
- background: var(--sunboard-hotspot-background);
388
- box-shadow: var(--sunboard-hotspot-shadow);
389
- color: var(--sunboard-hotspot-dot);
390
- cursor: pointer;
391
- font-family: var(--sunboard-font);
649
+ .sb-root .sb-line-rule {
650
+ flex: 1;
651
+ height: 1px;
652
+ background: var(--sb-border);
653
+ }
654
+ .sb-root .sb-line-text {
655
+ display: flex;
656
+ align-items: center;
657
+ gap: 6px;
658
+ }
659
+ .sb-root .sb-line-text svg {
660
+ width: 14px;
661
+ height: 14px;
662
+ }
663
+ .sb-root .sb-rate {
664
+ display: flex;
665
+ flex-direction: column;
666
+ gap: 4px;
667
+ }
668
+ .sb-root .sb-stars {
669
+ display: flex;
670
+ justify-content: center;
671
+ }
672
+ .sb-root .sb-star {
673
+ width: 44px;
674
+ height: 44px;
675
+ display: flex;
676
+ align-items: center;
677
+ justify-content: center;
392
678
  padding: 0;
679
+ border: 0;
680
+ border-radius: var(--sb-r2);
681
+ background: none;
682
+ color: var(--sb-text-muted);
683
+ cursor: pointer;
393
684
  }
394
-
395
- .sunboard-hotspot-dot {
396
- width: 6px;
397
- height: 6px;
398
- border-radius: 999px;
399
- background: currentColor;
685
+ .sb-root .sb-star svg {
686
+ width: 24px;
687
+ height: 24px;
400
688
  }
401
-
402
- .sunboard-hotspot[data-pulse="true"] {
403
- animation: sunboard-hotspot-pulse 1.8s ease-out infinite;
404
- box-shadow:
405
- var(--sunboard-hotspot-shadow),
406
- 0 0 0 8px var(--sunboard-hotspot-pulse-ring);
689
+ .sb-root .sb-star-lit {
690
+ color: var(--sb-accent);
407
691
  }
408
-
409
- .sunboard-hotspot:focus-visible {
410
- outline: 2px solid var(--sunboard-hotspot-background);
411
- outline-offset: 3px;
692
+ .sb-root .sb-star-lit svg {
693
+ fill: currentColor;
412
694
  }
413
695
 
414
- @keyframes sunboard-hotspot-pulse {
415
- 0% {
416
- box-shadow:
417
- var(--sunboard-hotspot-shadow),
418
- 0 0 0 0 var(--sunboard-hotspot-pulse-ring);
419
- }
420
-
421
- 70% {
422
- box-shadow:
423
- var(--sunboard-hotspot-shadow),
424
- 0 0 0 10px transparent;
425
- }
426
-
427
- 100% {
428
- box-shadow:
429
- var(--sunboard-hotspot-shadow),
430
- 0 0 0 0 transparent;
431
- }
696
+ .sb-root .sb-waiting {
697
+ display: flex;
698
+ flex-direction: column;
699
+ gap: 14px;
432
700
  }
433
-
434
- .sunboard-tour-scrim {
435
- position: fixed;
701
+ .sb-root .sb-waiting-head {
702
+ display: flex;
703
+ align-items: center;
704
+ gap: 10px;
705
+ font-size: var(--sb-size-base);
706
+ color: var(--sb-text-muted);
707
+ }
708
+ .sb-root .sb-bars {
709
+ display: flex;
710
+ flex-shrink: 0;
711
+ gap: 3px;
712
+ }
713
+ .sb-root .sb-bar {
714
+ position: relative;
715
+ width: 18px;
716
+ height: 4px;
717
+ border-radius: 2px;
718
+ background: var(--sb-border);
719
+ overflow: hidden;
720
+ }
721
+ .sb-root .sb-bar > span {
722
+ position: absolute;
436
723
  inset: 0;
437
- z-index: 2147483001;
438
- background: var(--sunboard-overlay-color);
439
- pointer-events: none;
724
+ border-radius: 2px;
725
+ background: var(--sb-accent);
726
+ transform: scaleX(0);
727
+ transform-origin: left;
440
728
  }
441
-
442
- .sunboard-tour-spotlight {
443
- width: 100vw;
444
- height: 100vh;
445
- background: transparent;
729
+ .sb-root .sb-bar[data-fill="full"] > span,
730
+ .sb-root .sb-bar[data-fill="slow"] > span {
731
+ transform: none;
446
732
  }
447
-
448
- .sunboard-tour {
449
- z-index: 2147483002;
450
- width: min(320px, calc(100vw - 32px));
451
- box-sizing: border-box;
452
- border: 1px solid var(--sunboard-tour-border);
453
- border-radius: var(--sunboard-radius);
454
- background: var(--sunboard-tour-background);
455
- box-shadow: var(--sunboard-tour-shadow);
456
- color: var(--sunboard-tour-foreground);
457
- font-family: var(--sunboard-font);
458
- padding: 14px;
733
+ .sb-root .sb-bar[data-fill="filling"] > span {
734
+ animation: sb-fill 1.2s linear forwards;
459
735
  }
460
-
461
- .sunboard-tour-arrow {
462
- color: var(--sunboard-tour-background);
736
+ .sb-root .sb-bar[data-fill="slow"] > span {
737
+ animation: sb-pulse 1.6s ease-in-out infinite;
463
738
  }
464
-
465
- .sunboard-tour-meta {
466
- color: var(--sunboard-tour-muted-foreground);
467
- font-size: 12px;
468
- font-weight: 700;
469
- line-height: 1;
739
+ .sb-root .sb-stage {
740
+ display: grid;
741
+ min-width: 0;
470
742
  }
471
-
472
- .sunboard-tour-title {
473
- margin: 6px 0 0;
474
- font-size: 15px;
475
- font-weight: 750;
476
- line-height: 1.35;
743
+ .sb-root .sb-stage > span {
744
+ grid-area: 1 / 1;
745
+ overflow: hidden;
746
+ text-overflow: ellipsis;
747
+ white-space: nowrap;
748
+ opacity: 0;
749
+ transform: translateY(3px);
750
+ transition:
751
+ opacity 0.2s ease-out,
752
+ transform 0.2s ease-out;
477
753
  }
478
-
479
- .sunboard-tour-body {
480
- color: var(--sunboard-tour-muted-foreground);
481
- font-size: 13px;
482
- line-height: 1.45;
483
- margin: 6px 0 0;
754
+ .sb-root .sb-stage > .sb-stage-on {
755
+ opacity: 1;
756
+ transform: none;
484
757
  }
485
-
486
- .sunboard-tour-actions {
758
+ .sb-root .sb-skeleton {
487
759
  display: flex;
488
- justify-content: flex-end;
489
- gap: 8px;
490
- margin-top: 13px;
491
- }
492
-
493
- .sunboard-tour-primary,
494
- .sunboard-tour-secondary,
495
- .sunboard-debug button {
496
- display: inline-flex;
497
- align-items: center;
498
- justify-content: center;
499
- min-height: 30px;
500
- border-radius: 8px;
501
- cursor: pointer;
502
- font: inherit;
503
- font-size: 12px;
504
- font-weight: 700;
505
- line-height: 1;
506
- padding: 8px 11px;
760
+ flex-direction: column;
761
+ gap: 9px;
507
762
  }
508
-
509
- .sunboard-tour-primary {
510
- border: 0;
511
- background: var(--sunboard-tour-primary);
512
- color: var(--sunboard-tour-primary-foreground);
763
+ .sb-root .sb-skeleton span {
764
+ display: block;
765
+ height: 10px;
766
+ border-radius: 5px;
767
+ background: var(--sb-surface-hover);
768
+ animation: sb-pulse 1.6s ease-in-out infinite;
513
769
  }
514
-
515
- .sunboard-tour-secondary,
516
- .sunboard-debug button {
517
- border: 1px solid var(--sunboard-tour-secondary-border);
518
- background: var(--sunboard-tour-secondary-background);
519
- color: var(--sunboard-tour-secondary-foreground);
770
+ .sb-root .sb-skeleton span:nth-child(1) {
771
+ width: 94%;
520
772
  }
521
-
522
- /* Tooltip: the tour popover minus the ceremony — no scrim, no step counter.
523
- Shares the tour palette so themed hosts restyle both at once. Sits below
524
- the tour z-index; an active tour hides tooltips at the provider level. */
525
- .sunboard-tooltip {
526
- position: relative;
527
- z-index: 2147483001;
528
- width: min(300px, calc(100vw - 32px));
529
- box-sizing: border-box;
530
- border: 1px solid var(--sunboard-tour-border);
531
- border-radius: var(--sunboard-radius);
532
- background: var(--sunboard-tour-background);
533
- box-shadow: var(--sunboard-tour-shadow);
534
- color: var(--sunboard-tour-foreground);
535
- font-family: var(--sunboard-font);
536
- padding: 14px;
773
+ .sb-root .sb-skeleton span:nth-child(2) {
774
+ width: 86%;
775
+ animation-delay: 0.2s;
537
776
  }
538
-
539
- .sunboard-tooltip-arrow {
540
- color: var(--sunboard-tour-background);
777
+ .sb-root .sb-skeleton span:nth-child(3) {
778
+ width: 58%;
779
+ animation-delay: 0.4s;
541
780
  }
542
781
 
543
- .sunboard-tooltip-close {
782
+ .sb-root .sb-latest-wrap {
544
783
  position: absolute;
545
- top: 6px;
546
- right: 6px;
547
- display: inline-flex;
548
- align-items: center;
784
+ z-index: 4;
785
+ left: 0;
786
+ right: 0;
787
+ bottom: 8px;
788
+ display: flex;
549
789
  justify-content: center;
550
- width: 22px;
551
- height: 22px;
552
- border: 0;
553
- border-radius: 6px;
554
- background: transparent;
555
- color: var(--sunboard-tour-muted-foreground);
556
- cursor: pointer;
557
- font: inherit;
558
- font-size: 12px;
559
- font-weight: 700;
560
- line-height: 1;
561
- padding: 0;
790
+ pointer-events: none;
562
791
  }
563
-
564
- .sunboard-tooltip-close:focus-visible {
565
- outline: 2px solid var(--sunboard-tour-primary);
566
- outline-offset: 1px;
792
+ .sb-root .sb-latest {
793
+ pointer-events: auto;
794
+ height: 44px;
795
+ display: flex;
796
+ align-items: center;
797
+ gap: 6px;
798
+ padding: 0 14px 0 12px;
799
+ border: 1px solid var(--sb-border);
800
+ border-radius: 999px;
801
+ background: var(--sb-surface);
802
+ color: var(--sb-text);
803
+ box-shadow: 0 6px 16px -6px rgba(10, 11, 14, 0.25);
804
+ cursor: pointer;
805
+ font-size: calc(var(--sb-size-base) - 1px);
806
+ font-weight: var(--sb-weight-medium);
567
807
  }
568
-
569
- .sunboard-tooltip-title {
570
- margin: 0;
571
- font-size: 15px;
572
- font-weight: 750;
573
- line-height: 1.35;
574
- padding-right: 20px;
808
+ .sb-root .sb-latest svg {
809
+ width: 14px;
810
+ height: 14px;
575
811
  }
576
812
 
577
- .sunboard-tooltip-body {
578
- color: var(--sunboard-tour-muted-foreground);
579
- font-size: 13px;
580
- line-height: 1.45;
581
- margin: 6px 0 0;
813
+ .sb-root .sb-composer {
814
+ flex-shrink: 0;
815
+ display: flex;
816
+ flex-direction: column;
817
+ gap: 8px;
818
+ padding: 8px 12px 10px;
819
+ background: var(--sb-surface);
582
820
  }
583
-
584
- .sunboard-tooltip-actions {
821
+ .sb-root .sb-field {
585
822
  display: flex;
586
- justify-content: flex-end;
587
- margin-top: 13px;
823
+ align-items: flex-end;
824
+ gap: 6px;
825
+ padding: 4px 4px 4px 14px;
826
+ border: 1px solid var(--sb-border);
827
+ border-radius: var(--sb-card-radius);
828
+ background: var(--sb-surface);
829
+ cursor: text;
830
+ }
831
+ .sb-root .sb-field:focus-within,
832
+ .sb-root .sb-inline .sb-field {
833
+ border-color: var(--sb-accent);
834
+ box-shadow: 0 0 0 3px var(--sb-ring);
835
+ }
836
+ .sb-root .sb-field-shut {
837
+ border-style: dashed;
838
+ background: transparent;
588
839
  }
589
-
590
- .sunboard-tooltip-action {
591
- display: inline-flex;
592
- align-items: center;
593
- justify-content: center;
594
- min-height: 30px;
840
+ .sb-root .sb-box {
841
+ flex: 1;
842
+ min-width: 0;
843
+ height: 44px;
844
+ min-height: 44px;
845
+ max-height: calc(4 * 1.4em + 22px);
846
+ padding: 11px 0;
595
847
  border: 0;
596
- border-radius: 8px;
597
- background: var(--sunboard-tour-primary);
598
- color: var(--sunboard-tour-primary-foreground);
599
- cursor: pointer;
600
- font: inherit;
601
- font-size: 12px;
602
- font-weight: 700;
603
- line-height: 1;
604
- padding: 8px 11px;
605
- }
606
-
607
- .sunboard-debug {
608
- position: fixed;
609
- right: max(16px, env(safe-area-inset-right));
610
- top: max(16px, env(safe-area-inset-top));
611
- z-index: 2147483003;
612
- display: grid;
613
- width: min(380px, calc(100vw - 32px));
614
- gap: 6px;
615
- box-sizing: border-box;
616
- border: 1px solid var(--sunboard-debug-border);
617
- border-radius: var(--sunboard-radius);
618
- background: var(--sunboard-debug-background);
619
- box-shadow: var(--sunboard-debug-shadow);
620
- color: var(--sunboard-debug-foreground);
621
- font-family: var(--sunboard-font);
622
- font-size: 12px;
848
+ outline: 0;
849
+ resize: none;
850
+ overflow-y: hidden;
851
+ background: transparent;
852
+ color: var(--sb-text);
853
+ font-family: var(--sb-font);
854
+ font-size: calc(var(--sb-size-base) + 1px);
623
855
  line-height: 1.4;
624
- padding: 12px;
625
856
  }
626
-
627
- .sunboard-survey-overlay {
628
- position: fixed;
629
- inset: 0;
630
- z-index: 2147483000;
857
+ .sb-root .sb-box::placeholder {
858
+ color: var(--sb-text-muted);
859
+ opacity: 1;
860
+ }
861
+ .sb-root .sb-box:disabled {
862
+ cursor: not-allowed;
863
+ }
864
+ .sb-root .sb-send {
631
865
  display: grid;
632
866
  place-items: center;
633
- box-sizing: border-box;
634
- background: var(--sunboard-survey-overlay-color);
635
- font-family: var(--sunboard-font);
636
- padding: max(16px, env(safe-area-inset-bottom));
637
- /* The scrim only fades — the scale/pop belongs to the card, not the backdrop. */
638
- animation: sunboard-fade-in 160ms ease-out both;
867
+ flex-shrink: 0;
868
+ width: 44px;
869
+ height: 44px;
870
+ padding: 0;
871
+ border: 0;
872
+ border-radius: var(--sb-r2);
873
+ background: var(--sb-accent);
874
+ color: var(--sb-accent-text);
875
+ cursor: pointer;
639
876
  }
640
-
641
- .sunboard-survey-card {
642
- width: min(480px, 100%);
643
- max-height: calc(100vh - 32px);
644
- overflow: auto;
645
- box-sizing: border-box;
646
- border: 1px solid var(--sunboard-checklist-border);
647
- border-radius: var(--sunboard-radius);
648
- background: var(--sunboard-checklist-background);
649
- box-shadow: var(--sunboard-checklist-shadow);
650
- color: var(--sunboard-checklist-foreground);
651
- padding: 24px;
652
- animation: sunboard-completion-in 200ms ease-out both;
877
+ .sb-root .sb-send:disabled {
878
+ background: var(--sb-surface-hover);
879
+ color: var(--sb-text-muted);
880
+ cursor: default;
881
+ }
882
+ .sb-root .sb-send svg {
883
+ width: 18px;
884
+ height: 18px;
885
+ }
886
+ .sb-root .sb-brand {
887
+ align-self: center;
888
+ display: inline-flex;
889
+ align-items: center;
890
+ gap: 4px;
891
+ color: var(--sb-text-muted);
892
+ font-size: calc(var(--sb-size-base) - 2.5px);
893
+ text-decoration: none;
894
+ }
895
+ .sb-root .sb-brand svg {
896
+ display: block;
897
+ }
898
+ .sb-root .sb-brand:hover {
899
+ color: var(--sb-text);
653
900
  }
654
901
 
655
- @keyframes sunboard-fade-in {
902
+ @keyframes sb-slide-in {
656
903
  from {
657
904
  opacity: 0;
905
+ transform: translateX(20px);
658
906
  }
659
907
  to {
660
908
  opacity: 1;
909
+ transform: translateX(0);
661
910
  }
662
911
  }
663
-
664
- .sunboard-survey-card *,
665
- .sunboard-survey-card *::before,
666
- .sunboard-survey-card *::after {
667
- box-sizing: border-box;
912
+ @keyframes sb-rise {
913
+ from {
914
+ transform: translateY(100%);
915
+ }
916
+ to {
917
+ transform: translateY(0);
918
+ }
668
919
  }
669
-
670
- .sunboard-survey-head {
671
- margin-bottom: 4px;
920
+ @keyframes sb-fill {
921
+ from {
922
+ transform: scaleX(0);
923
+ }
924
+ to {
925
+ transform: scaleX(1);
926
+ }
672
927
  }
673
-
674
- .sunboard-survey-progress-row {
675
- margin-top: 14px;
928
+ @keyframes sb-pulse {
929
+ 0%,
930
+ 100% {
931
+ opacity: 0.45;
932
+ }
933
+ 50% {
934
+ opacity: 1;
935
+ }
676
936
  }
677
937
 
678
- .sunboard-survey-stepcount {
679
- margin: 0 0 6px;
680
- color: var(--sunboard-checklist-muted-foreground);
681
- font-size: 12px;
682
- font-weight: 650;
683
- line-height: 1;
938
+ @media (max-width: 640px) {
939
+ .sb-root .sb-launcher,
940
+ .sb-root .sb-tour-pill {
941
+ right: 16px;
942
+ bottom: 16px;
943
+ }
944
+ .sb-root .sb-panel-scrim {
945
+ display: block;
946
+ position: fixed;
947
+ inset: 0;
948
+ z-index: 2147482995;
949
+ background: rgba(10, 11, 14, 0.42);
950
+ animation: sb-fade-in 160ms ease-out both;
951
+ }
952
+ .sb-root .sb-panel:not(.sb-inline) {
953
+ top: max(56px, env(safe-area-inset-top));
954
+ left: 0;
955
+ right: 0;
956
+ bottom: 0;
957
+ width: auto;
958
+ max-width: none;
959
+ height: auto;
960
+ border-width: 1px 0 0;
961
+ border-radius: calc(var(--sb-card-radius) + 6px) calc(var(--sb-card-radius) + 6px) 0 0;
962
+ box-shadow: 0 -12px 40px -12px rgba(10, 11, 14, 0.35);
963
+ animation: sb-rise 0.3s ease-out;
964
+ }
965
+ .sb-root .sb-panel:not(.sb-inline)::before {
966
+ content: "";
967
+ display: block;
968
+ flex-shrink: 0;
969
+ width: 36px;
970
+ height: 4px;
971
+ margin: 8px auto 0;
972
+ border-radius: 2px;
973
+ background: var(--sb-border);
974
+ }
975
+ .sb-root .sb-panel:not(.sb-inline) .sb-composer {
976
+ padding-bottom: max(34px, env(safe-area-inset-bottom));
977
+ }
978
+ /* 16px so iOS does not zoom the page when the box takes focus. */
979
+ .sb-root .sb-panel:not(.sb-inline) .sb-box {
980
+ font-size: 16px;
981
+ }
684
982
  }
685
983
 
686
- .sunboard-survey-progress-row .sunboard-progress {
687
- margin-top: 0;
984
+ /* ---------- overlay: cards ---------- */
985
+ .sb-root .popover-card {
986
+ background: var(--sb-surface);
987
+ border: 1px solid var(--sb-border);
988
+ border-radius: var(--sb-card-radius);
989
+ box-shadow: var(--sb-card-shadow);
990
+ padding: var(--sb-card-padding);
688
991
  }
689
-
690
- .sunboard-survey-step-title {
691
- margin: 0;
692
- font-size: 14px;
693
- font-weight: 700;
694
- line-height: 1.3;
992
+ .sb-root .popover-card.tour {
993
+ width: var(--sb-tour-w);
695
994
  }
696
-
697
- .sunboard-survey-form {
698
- display: grid;
699
- gap: 18px;
700
- margin-top: 16px;
995
+ .sb-root .popover-card.tip {
996
+ width: var(--sb-tooltip-w);
701
997
  }
702
-
703
- .sunboard-survey-nav {
704
- display: flex;
705
- align-items: center;
706
- justify-content: space-between;
707
- gap: 8px;
998
+ .sb-root .popover-card.announce {
999
+ width: var(--sb-announcement-w);
1000
+ max-height: var(--sb-announcement-maxh);
1001
+ overflow: auto;
708
1002
  }
709
-
710
- .sunboard-survey-back {
711
- display: inline-flex;
712
- align-items: center;
713
- justify-content: center;
714
- min-height: 40px;
715
- border: 1px solid var(--sunboard-checklist-border);
716
- border-radius: 8px;
717
- background: var(--sunboard-checklist-background);
718
- color: var(--sunboard-checklist-foreground);
719
- cursor: pointer;
720
- font: inherit;
721
- font-size: 14px;
722
- font-weight: 650;
723
- line-height: 1;
724
- padding: 10px 14px;
1003
+ .sb-root .popover-card.tour,
1004
+ .sb-root .popover-card.tip,
1005
+ .sb-root .popover-card.announce {
1006
+ max-width: calc(100vw - 32px);
725
1007
  }
726
1008
 
727
- .sunboard-survey-back:hover {
728
- background: var(--sunboard-checklist-muted);
1009
+ /* Anchored cards scroll on an inner wrapper, never on the card itself: the
1010
+ arrow is a card child positioned outside the border, and overflow on the
1011
+ card would clip it. Padding moves inward with the scrolling. */
1012
+ .sb-root .popover-card.tour,
1013
+ .sb-root .popover-card.tip {
1014
+ padding: 0;
729
1015
  }
730
-
731
- .sunboard-survey-back:focus-visible {
732
- outline: 2px solid var(--sunboard-checklist-primary);
733
- outline-offset: 2px;
1016
+ .sb-root .pop-scroll {
1017
+ padding: var(--sb-card-padding);
1018
+ border-radius: calc(var(--sb-card-radius) - 1px);
1019
+ overflow: auto;
734
1020
  }
735
-
736
- .sunboard-survey-questions {
737
- display: grid;
738
- gap: 18px;
739
- list-style: none;
740
- margin: 0;
741
- padding: 0;
1021
+ .sb-root .popover-card.tour > .pop-scroll {
1022
+ max-height: var(--sb-tour-maxh);
742
1023
  }
743
-
744
- .sunboard-survey-prompt {
745
- margin: 0 0 8px;
746
- font-size: 14px;
747
- font-weight: 650;
748
- line-height: 1.35;
1024
+ .sb-root .popover-card.tip > .pop-scroll {
1025
+ max-height: var(--sb-tooltip-maxh);
749
1026
  }
750
-
751
- .sunboard-survey-required {
752
- color: var(--sunboard-checklist-primary);
1027
+ .sb-root .popover-card h4 {
1028
+ font-size: var(--sb-size-lg);
1029
+ font-weight: var(--sb-weight-semibold);
1030
+ line-height: var(--sb-lh-snug);
1031
+ margin-bottom: 6px;
753
1032
  }
754
-
755
- .sunboard-survey-options {
1033
+ .sb-root .popover-card p {
1034
+ font-size: var(--sb-size-base);
1035
+ color: var(--sb-text-muted);
1036
+ line-height: var(--sb-lh-normal);
1037
+ }
1038
+ .sb-root .pop-kicker {
1039
+ font-size: var(--sb-size-sm);
1040
+ text-transform: uppercase;
1041
+ letter-spacing: 0.05em;
1042
+ color: var(--sb-text-muted);
1043
+ }
1044
+ .sb-root .pop-top {
756
1045
  display: flex;
757
- flex-wrap: wrap;
758
- gap: 8px;
1046
+ align-items: flex-start;
1047
+ justify-content: space-between;
1048
+ gap: 10px;
1049
+ margin-bottom: 6px;
759
1050
  }
760
-
761
- .sunboard-survey-option {
762
- display: inline-flex;
763
- align-items: center;
764
- min-height: 36px;
765
- border: 1px solid var(--sunboard-checklist-border);
1051
+ .sb-root .sb-close {
1052
+ display: grid;
1053
+ place-items: center;
1054
+ width: 24px;
1055
+ height: 24px;
1056
+ margin: -4px -6px 0 auto;
1057
+ border: 0;
766
1058
  border-radius: 999px;
767
- background: var(--sunboard-checklist-background);
768
- color: var(--sunboard-checklist-foreground);
1059
+ background: transparent;
1060
+ color: var(--sb-text-muted);
769
1061
  cursor: pointer;
770
- font: inherit;
771
- font-size: 13px;
772
- font-weight: 600;
773
- line-height: 1;
774
- padding: 9px 14px;
1062
+ padding: 0;
775
1063
  }
776
-
777
- .sunboard-survey-option:hover {
778
- background: var(--sunboard-checklist-muted);
1064
+ .sb-root .sb-close:hover {
1065
+ background: var(--sb-surface-hover);
779
1066
  }
780
-
781
- .sunboard-survey-option[data-selected="true"] {
782
- border-color: var(--sunboard-checklist-primary);
783
- background: var(--sunboard-checklist-primary);
784
- color: var(--sunboard-checklist-primary-foreground);
1067
+ .sb-root .sb-close svg {
1068
+ width: 14px;
1069
+ height: 14px;
785
1070
  }
786
-
787
- .sunboard-survey-option:focus-visible,
788
- .sunboard-survey-input:focus-visible,
789
- .sunboard-survey-submit:focus-visible {
790
- outline: 2px solid var(--sunboard-checklist-primary);
791
- outline-offset: 2px;
1071
+ .sb-root .pop-actions {
1072
+ display: flex;
1073
+ justify-content: flex-end;
1074
+ gap: var(--sb-input-gap);
1075
+ margin-top: 12px;
1076
+ }
1077
+ .sb-root .pop-actions .ghost {
1078
+ background: none;
1079
+ border: 1px solid var(--sb-border);
1080
+ border-radius: var(--sb-input-radius);
1081
+ color: var(--sb-text);
1082
+ height: var(--sb-input-height);
1083
+ padding: 0 var(--sb-input-padding);
1084
+ font-family: var(--sb-font);
1085
+ font-size: var(--sb-size-sm);
1086
+ cursor: pointer;
1087
+ }
1088
+ .sb-root .pop-actions .ghost:hover {
1089
+ border-color: var(--sb-border-hover);
1090
+ background: var(--sb-surface-hover);
792
1091
  }
793
1092
 
794
- .sunboard-survey-input {
1093
+ /* media flush to the card's top edge */
1094
+ .sb-root .pop-media {
1095
+ margin: calc(-1 * var(--sb-card-padding)) calc(-1 * var(--sb-card-padding))
1096
+ 12px;
1097
+ border-radius: calc(var(--sb-card-radius) - 1px)
1098
+ calc(var(--sb-card-radius) - 1px) 0 0;
1099
+ overflow: hidden;
1100
+ border-bottom: 1px solid var(--sb-border);
1101
+ }
1102
+ .sb-root .pop-media img,
1103
+ .sb-root .pop-media video {
1104
+ display: block;
795
1105
  width: 100%;
796
- min-height: 38px;
797
- border: 1px solid var(--sunboard-checklist-border);
798
- border-radius: 8px;
799
- background: var(--sunboard-checklist-background);
800
- color: var(--sunboard-checklist-foreground);
801
- font: inherit;
802
- font-size: 14px;
803
- line-height: 1.4;
804
- padding: 9px 11px;
1106
+ height: auto;
805
1107
  }
806
-
807
- .sunboard-survey-error {
808
- margin: 0;
809
- color: #dc2626;
810
- font-size: 13px;
811
- line-height: 1.4;
1108
+ .sb-root .pop-media iframe {
1109
+ display: block;
1110
+ width: 100%;
1111
+ aspect-ratio: 16 / 9;
1112
+ border: 0;
812
1113
  }
813
1114
 
814
- .sunboard-survey-submit {
815
- display: inline-flex;
816
- align-items: center;
817
- justify-content: center;
818
- min-height: 40px;
819
- border: 0;
820
- border-radius: 8px;
821
- background: var(--sunboard-checklist-primary);
822
- color: var(--sunboard-checklist-primary-foreground);
1115
+ /* ---------- tooltip pins ---------- */
1116
+ .sb-root .sb-pin {
1117
+ position: fixed;
1118
+ z-index: 2147482995;
1119
+ width: 12px;
1120
+ height: 12px;
1121
+ padding: 0;
1122
+ border: none;
1123
+ border-radius: 999px;
1124
+ background: var(--sb-accent);
823
1125
  cursor: pointer;
824
- font: inherit;
825
- font-size: 14px;
826
- font-weight: 700;
827
- line-height: 1;
828
- padding: 10px 14px;
1126
+ animation: sb-pin-pulse 1.8s ease-out infinite;
829
1127
  }
830
-
831
- .sunboard-survey-submit:disabled {
832
- opacity: 0.55;
833
- cursor: not-allowed;
1128
+ .sb-root .sb-pin[aria-expanded="true"] {
1129
+ animation: none;
834
1130
  }
835
-
836
- .sunboard-root-completion {
837
- text-align: center;
838
- animation: sunboard-completion-in 260ms ease-out both;
1131
+ @keyframes sb-pin-pulse {
1132
+ 0% {
1133
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--sb-accent) 40%, transparent);
1134
+ }
1135
+ 70% {
1136
+ box-shadow: 0 0 0 12px transparent;
1137
+ }
1138
+ 100% {
1139
+ box-shadow: 0 0 0 0 transparent;
1140
+ }
839
1141
  }
840
1142
 
841
- .sunboard-completion-close {
842
- position: absolute;
843
- top: 12px;
844
- right: 12px;
1143
+ /* ---------- overlay: scrim, spotlight, positioning ---------- */
1144
+ /* Purely visual: the page (and the tour target) stays clickable under it. */
1145
+ .sb-root .sb-scrim {
1146
+ position: fixed;
1147
+ inset: 0;
1148
+ z-index: 2147482997;
1149
+ background: var(--sb-overlay);
1150
+ width: 100%;
1151
+ height: 100%;
1152
+ pointer-events: none;
1153
+ animation: sb-fade-in 160ms ease-out both;
845
1154
  }
846
-
847
- .sunboard-completion {
848
- display: flex;
849
- flex-direction: column;
850
- align-items: center;
851
- gap: 8px;
852
- padding: 8px 8px 4px;
1155
+ .sb-root .sb-spotlight {
1156
+ background: none;
853
1157
  }
854
-
855
- .sunboard-completion-check {
1158
+ /* pointer-events: a host dialog library that switches pointer events off on
1159
+ <body> would otherwise switch off the tour card with it. */
1160
+ .sb-root .sb-floating {
1161
+ position: absolute;
1162
+ z-index: 2147483000;
1163
+ pointer-events: auto;
1164
+ }
1165
+ .sb-root .sb-modal-wrap {
1166
+ position: fixed;
1167
+ inset: 0;
1168
+ z-index: 2147483000;
856
1169
  display: grid;
857
1170
  place-items: center;
858
- width: 56px;
859
- height: 56px;
860
- margin-bottom: 4px;
861
- border-radius: 999px;
862
- background: color-mix(
863
- in srgb,
864
- var(--sunboard-checklist-success) 14%,
865
- transparent
866
- );
867
- color: var(--sunboard-checklist-success);
868
- animation: sunboard-completion-check-in 380ms cubic-bezier(0.34, 1.56, 0.64, 1)
869
- both;
1171
+ padding: 20px;
1172
+ pointer-events: auto;
870
1173
  }
871
1174
 
872
- .sunboard-completion-check svg {
873
- width: 30px;
874
- height: 30px;
875
- }
876
-
877
- .sunboard-completion-subtitle {
878
- margin: 0;
879
- color: var(--sunboard-checklist-muted-foreground);
880
- font-size: 12px;
881
- font-weight: 650;
882
- line-height: 1.2;
883
- text-transform: uppercase;
884
- letter-spacing: 0.04em;
1175
+ /* Entrances: the scrim only fades; the pop/scale belongs to the card. The
1176
+ floating card fades WITHOUT scale: its position lives in an inline
1177
+ transform (floating-ui), which a transform animation would override. */
1178
+ .sb-root .sb-floating {
1179
+ animation: sb-fade-in 160ms ease-out both;
885
1180
  }
886
-
887
- .sunboard-completion-title {
888
- margin: 0;
889
- font-size: 18px;
890
- font-weight: 700;
891
- line-height: 1.3;
1181
+ .sb-root .sb-modal-wrap .popover-card {
1182
+ animation: sb-card-in 200ms ease-out both;
892
1183
  }
893
1184
 
894
- .sunboard-completion-message {
895
- margin: 0;
896
- color: var(--sunboard-checklist-muted-foreground);
897
- font-size: 14px;
898
- line-height: 1.5;
1185
+ @keyframes sb-fade-in {
1186
+ from {
1187
+ opacity: 0;
1188
+ }
1189
+ to {
1190
+ opacity: 1;
1191
+ }
899
1192
  }
900
-
901
- @keyframes sunboard-completion-in {
1193
+ @keyframes sb-card-in {
902
1194
  from {
903
1195
  opacity: 0;
904
1196
  transform: scale(0.96);
@@ -909,7 +1201,50 @@ button.sunboard-step-status:focus-visible {
909
1201
  }
910
1202
  }
911
1203
 
912
- @keyframes sunboard-completion-check-in {
1204
+ /* ---------- overlay: banner ---------- */
1205
+ .sb-root .banner-bar {
1206
+ display: flex;
1207
+ align-items: center;
1208
+ gap: 14px;
1209
+ background: var(--sb-surface);
1210
+ border: 1px solid var(--sb-border);
1211
+ border-radius: var(--sb-input-radius);
1212
+ box-shadow: var(--sb-card-shadow);
1213
+ padding: 10px 16px;
1214
+ }
1215
+ .sb-root .banner-bar > span {
1216
+ flex: 1;
1217
+ }
1218
+ .sb-root .banner-bar .dismiss {
1219
+ display: grid;
1220
+ place-items: center;
1221
+ width: 24px;
1222
+ height: 24px;
1223
+ flex-shrink: 0;
1224
+ background: none;
1225
+ border: none;
1226
+ border-radius: 999px;
1227
+ color: var(--sb-text-muted);
1228
+ cursor: pointer;
1229
+ padding: 0;
1230
+ }
1231
+ .sb-root .banner-bar .dismiss:hover {
1232
+ background: var(--sb-surface-hover);
1233
+ }
1234
+ .sb-root .banner-bar .dismiss svg {
1235
+ width: 14px;
1236
+ height: 14px;
1237
+ }
1238
+ .sb-root .sb-banner {
1239
+ position: fixed;
1240
+ top: max(12px, env(safe-area-inset-top));
1241
+ left: 50%;
1242
+ transform: translateX(-50%);
1243
+ z-index: 2147482996;
1244
+ width: min(720px, calc(100vw - 32px));
1245
+ }
1246
+
1247
+ @keyframes sb-check-in {
913
1248
  0% {
914
1249
  opacity: 0;
915
1250
  transform: scale(0.4);
@@ -925,10 +1260,24 @@ button.sunboard-step-status:focus-visible {
925
1260
  }
926
1261
 
927
1262
  @media (prefers-reduced-motion: reduce) {
928
- .sunboard-root-completion,
929
- .sunboard-completion-check,
930
- .sunboard-survey-overlay,
931
- .sunboard-survey-card {
1263
+ .sb-root .sb-scrim,
1264
+ .sb-root .sb-floating,
1265
+ .sb-root .sb-modal-wrap .popover-card,
1266
+ .sb-root .sb-pin,
1267
+ .sb-root .sb-launcher,
1268
+ .sb-root .sb-panel,
1269
+ .sb-root .sb-panel-scrim,
1270
+ .sb-root .sb-arrive,
1271
+ .sb-root .sb-bar > span,
1272
+ .sb-root .sb-skeleton span {
932
1273
  animation: none;
1274
+ transition: none;
1275
+ }
1276
+ .sb-root .sb-bar[data-fill="filling"] > span {
1277
+ transform: none;
1278
+ }
1279
+ .sb-root .sb-stage > span {
1280
+ transform: none;
1281
+ transition: none;
933
1282
  }
934
1283
  }