@tulipfarm/sprout 0.1.0 → 0.3.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 (98) hide show
  1. package/README.md +111 -0
  2. package/dist/components/agent-fanout.d.ts +46 -0
  3. package/dist/components/agent-fanout.js +228 -0
  4. package/dist/components/attachment.js +2 -2
  5. package/dist/components/brand-icon.js +4 -0
  6. package/dist/components/canvas.js +2 -2
  7. package/dist/components/chat-input.d.ts +94 -0
  8. package/dist/components/chat-input.js +279 -0
  9. package/dist/components/chat-sources.js +11 -2
  10. package/dist/components/code-block.js +2 -33
  11. package/dist/components/file-explorer.d.ts +27 -0
  12. package/dist/components/file-explorer.js +300 -0
  13. package/dist/components/file-viewer.d.ts +18 -1
  14. package/dist/components/file-viewer.js +35 -8
  15. package/dist/components/presence-cursor.d.ts +19 -0
  16. package/dist/components/presence-cursor.js +14 -0
  17. package/dist/components/questionnaire.js +2 -1
  18. package/dist/components/schema-diagram.js +5 -78
  19. package/dist/components/search-dialog.js +5 -4
  20. package/dist/components/sql-viewer.d.ts +76 -0
  21. package/dist/components/sql-viewer.js +409 -0
  22. package/dist/components/state-panel.js +2 -2
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.js +5 -0
  25. package/dist/internal/brand-glyphs.d.ts +28 -0
  26. package/dist/internal/brand-glyphs.js +24 -0
  27. package/dist/internal/code-tokens.d.ts +4 -0
  28. package/dist/internal/code-tokens.js +34 -0
  29. package/dist/internal/flow.d.ts +22 -0
  30. package/dist/internal/flow.js +82 -0
  31. package/dist/styles/accordion.css +2 -2
  32. package/dist/styles/agent-fanout.css +529 -0
  33. package/dist/styles/alert-dialog.css +2 -2
  34. package/dist/styles/alert.css +2 -2
  35. package/dist/styles/attachment.css +4 -24
  36. package/dist/styles/badge.css +2 -2
  37. package/dist/styles/brand-icon.css +2 -2
  38. package/dist/styles/breadcrumb.css +2 -2
  39. package/dist/styles/button.css +2 -2
  40. package/dist/styles/calendar.css +3 -3
  41. package/dist/styles/canvas.css +4 -18
  42. package/dist/styles/carousel.css +2 -2
  43. package/dist/styles/chart.css +2 -2
  44. package/dist/styles/chat-confirmation.css +2 -2
  45. package/dist/styles/chat-input.css +240 -0
  46. package/dist/styles/chat-sources.css +2 -2
  47. package/dist/styles/checkbox.css +2 -3
  48. package/dist/styles/choice-list.css +2 -2
  49. package/dist/styles/code-block.css +2 -2
  50. package/dist/styles/collapsible.css +2 -2
  51. package/dist/styles/combobox.css +6 -6
  52. package/dist/styles/command.css +2 -2
  53. package/dist/styles/context-menu.css +3 -3
  54. package/dist/styles/dialog.css +2 -2
  55. package/dist/styles/dropdown-menu.css +1 -1
  56. package/dist/styles/field.css +2 -3
  57. package/dist/styles/file-explorer.css +517 -0
  58. package/dist/styles/file-viewer.css +113 -16
  59. package/dist/styles/hover-card.css +2 -2
  60. package/dist/styles/index.css +9 -0
  61. package/dist/styles/input-group.css +6 -11
  62. package/dist/styles/input-otp.css +2 -2
  63. package/dist/styles/input.css +3 -4
  64. package/dist/styles/mention-list.css +1 -1
  65. package/dist/styles/menubar.css +3 -3
  66. package/dist/styles/message-response.css +4 -4
  67. package/dist/styles/message-scroller.css +2 -2
  68. package/dist/styles/message.css +5 -5
  69. package/dist/styles/navigation-menu.css +2 -2
  70. package/dist/styles/page-header.css +4 -4
  71. package/dist/styles/plan-outline.css +6 -6
  72. package/dist/styles/presence-cursor.css +68 -0
  73. package/dist/styles/prompt-list.css +2 -2
  74. package/dist/styles/questionnaire.css +2 -17
  75. package/dist/styles/radio-group.css +2 -3
  76. package/dist/styles/reasoning-effort.css +2 -2
  77. package/dist/styles/review-card.css +2 -2
  78. package/dist/styles/rich-text-editor.css +2 -2
  79. package/dist/styles/schema-diagram.css +4 -4
  80. package/dist/styles/scroll-area.css +2 -2
  81. package/dist/styles/search-dialog.css +0 -83
  82. package/dist/styles/select.css +3 -3
  83. package/dist/styles/separator.css +2 -2
  84. package/dist/styles/sheet.css +2 -2
  85. package/dist/styles/sidebar.css +2 -2
  86. package/dist/styles/slider.css +1 -1
  87. package/dist/styles/sql-viewer.css +406 -0
  88. package/dist/styles/state-panel.css +1 -10
  89. package/dist/styles/switch.css +2 -2
  90. package/dist/styles/table.css +10 -10
  91. package/dist/styles/tabs.css +4 -4
  92. package/dist/styles/textarea.css +3 -4
  93. package/dist/styles/themes/tulipfarm.css +89 -99
  94. package/dist/styles/toast.css +2 -2
  95. package/dist/styles/toggle-group.css +2 -2
  96. package/dist/styles/toggle.css +2 -2
  97. package/dist/styles/tool-activity.css +5 -5
  98. package/package.json +27 -6
@@ -0,0 +1,529 @@
1
+ @layer base {
2
+ /* React Flow puts .light or .dark on its root. Base outranks components, so
3
+ this lives here to keep the page's tokens inside the graph. */
4
+ .sprout-agent-fanout-flow.light,
5
+ .sprout-agent-fanout-flow.dark {
6
+ --sprout-surface: inherit;
7
+ --sprout-hover: inherit;
8
+ --sprout-text: inherit;
9
+ --sprout-muted: inherit;
10
+ --sprout-line: inherit;
11
+ --sprout-border: inherit;
12
+ --sprout-primary: inherit;
13
+ --sprout-on-primary: inherit;
14
+ --sprout-danger: inherit;
15
+ --sprout-danger-subtle: inherit;
16
+ --sprout-chart-1: inherit;
17
+ --sprout-chart-2: inherit;
18
+ --sprout-chart-3: inherit;
19
+ --sprout-chart-4: inherit;
20
+ --sprout-chart-5: inherit;
21
+ }
22
+ }
23
+
24
+ @layer components {
25
+ .sprout-agent-fanout {
26
+ --sprout-agent-fanout-trip: 720ms;
27
+ --sprout-agent-fanout-trip-ease: cubic-bezier(0.5, 0, 0.2, 1);
28
+ container-type: inline-size;
29
+ box-sizing: border-box;
30
+ width: 100%;
31
+ min-width: 0;
32
+ overflow: hidden;
33
+ border: 1px solid var(--sprout-line);
34
+ border-radius: var(--sprout-radius-panel);
35
+ background: var(--sprout-surface);
36
+ color: var(--sprout-text);
37
+ font-family: var(--sprout-font);
38
+ }
39
+
40
+ .sprout-agent-fanout-task {
41
+ display: flex;
42
+ min-width: 0;
43
+ padding: 12px 16px;
44
+ border-bottom: 1px solid var(--sprout-line);
45
+ }
46
+ .sprout-agent-fanout-task-text {
47
+ min-width: 0;
48
+ font-size: var(--sprout-text-sm);
49
+ font-weight: 500;
50
+ line-height: 1.25rem;
51
+ overflow-wrap: anywhere;
52
+ }
53
+
54
+ .sprout-agent-fanout-graph {
55
+ position: relative;
56
+ }
57
+
58
+ /* The structural rules React Flow needs, scoped to the graph. */
59
+ .sprout-agent-fanout-flow {
60
+ position: relative;
61
+ direction: ltr;
62
+ width: 100%;
63
+ height: 100%;
64
+ overflow: hidden;
65
+ pointer-events: none;
66
+ }
67
+ .sprout-agent-fanout-flow .react-flow__container,
68
+ .sprout-agent-fanout-flow .react-flow__edgelabel-renderer {
69
+ position: absolute;
70
+ top: 0;
71
+ left: 0;
72
+ width: 100%;
73
+ height: 100%;
74
+ }
75
+ .sprout-agent-fanout-flow .react-flow__viewport,
76
+ .sprout-agent-fanout-flow .react-flow__nodes,
77
+ .sprout-agent-fanout-flow .react-flow__node {
78
+ transform-origin: 0 0;
79
+ }
80
+ .sprout-agent-fanout-flow .react-flow__edges svg {
81
+ position: absolute;
82
+ overflow: visible;
83
+ fill: none;
84
+ }
85
+ .sprout-agent-fanout-flow .react-flow__node {
86
+ position: absolute;
87
+ box-sizing: border-box;
88
+ }
89
+ .sprout-agent-fanout-handle.react-flow__handle {
90
+ position: absolute;
91
+ left: 50%;
92
+ width: 1px;
93
+ height: 1px;
94
+ min-width: 0;
95
+ min-height: 0;
96
+ border: 0;
97
+ opacity: 0;
98
+ translate: -50% 0;
99
+ }
100
+ .sprout-agent-fanout-handle.react-flow__handle-top {
101
+ top: 0;
102
+ }
103
+ .sprout-agent-fanout-handle.react-flow__handle-bottom {
104
+ bottom: 0;
105
+ }
106
+
107
+ .sprout-agent-fanout-edge {
108
+ stroke: var(--sprout-line);
109
+ stroke-width: 1;
110
+ }
111
+ .sprout-agent-fanout-trail {
112
+ stroke: var(--sprout-agent-fanout-color);
113
+ stroke-width: 2.5;
114
+ stroke-linecap: round;
115
+ stroke-dasharray: 0.3 2;
116
+ stroke-dashoffset: 0.3;
117
+ opacity: 0;
118
+ }
119
+ .sprout-agent-fanout-comet {
120
+ position: absolute;
121
+ top: 0;
122
+ left: 0;
123
+ width: 8px;
124
+ height: 8px;
125
+ border-radius: 50%;
126
+ background: var(--sprout-agent-fanout-color);
127
+ offset-rotate: 0deg;
128
+ opacity: 0;
129
+ pointer-events: none;
130
+ }
131
+
132
+ .sprout-agent-fanout-root {
133
+ position: relative;
134
+ display: grid;
135
+ place-items: center;
136
+ width: 44px;
137
+ height: 44px;
138
+ border-radius: 50%;
139
+ background: var(--sprout-primary);
140
+ color: var(--sprout-on-primary);
141
+ }
142
+ .sprout-agent-fanout-root[data-state="stopped"] {
143
+ background: var(--sprout-hover);
144
+ color: var(--sprout-muted);
145
+ box-shadow: inset 0 0 0 1px var(--sprout-line);
146
+ }
147
+
148
+ .sprout-agent-fanout-node {
149
+ display: flex;
150
+ flex-direction: column;
151
+ align-items: center;
152
+ gap: 6px;
153
+ width: 100%;
154
+ min-width: 0;
155
+ }
156
+ .sprout-agent-fanout-dot {
157
+ position: relative;
158
+ display: grid;
159
+ place-items: center;
160
+ box-sizing: border-box;
161
+ width: var(--sprout-agent-fanout-dot);
162
+ height: var(--sprout-agent-fanout-dot);
163
+ border: 1px solid var(--sprout-line);
164
+ border-radius: 50%;
165
+ background: var(--sprout-surface);
166
+ color: var(--sprout-muted);
167
+ }
168
+ .sprout-agent-fanout-dot > span {
169
+ display: contents;
170
+ }
171
+ .sprout-agent-fanout-dot::before {
172
+ position: absolute;
173
+ z-index: -1;
174
+ inset: calc(var(--sprout-agent-fanout-dot) * -0.27);
175
+ border-radius: 50%;
176
+ background: color-mix(
177
+ in oklab,
178
+ var(--sprout-agent-fanout-color) 14%,
179
+ transparent
180
+ );
181
+ content: "";
182
+ opacity: 0;
183
+ }
184
+ .sprout-agent-fanout-node {
185
+ isolation: isolate;
186
+ }
187
+ .sprout-agent-fanout-node[data-status="queued"] .sprout-agent-fanout-dot {
188
+ color: color-mix(in oklab, var(--sprout-muted) 70%, var(--sprout-surface));
189
+ }
190
+ .sprout-agent-fanout-node[data-status="working"] .sprout-agent-fanout-dot {
191
+ border-color: var(--sprout-agent-fanout-color);
192
+ background: color-mix(
193
+ in oklab,
194
+ var(--sprout-agent-fanout-color) 6%,
195
+ var(--sprout-surface)
196
+ );
197
+ color: color-mix(
198
+ in oklab,
199
+ var(--sprout-agent-fanout-color) 78%,
200
+ var(--sprout-text)
201
+ );
202
+ }
203
+ .sprout-agent-fanout-node[data-status="working"]
204
+ .sprout-agent-fanout-dot::before {
205
+ opacity: 1;
206
+ }
207
+ .sprout-agent-fanout-node[data-status="done"] .sprout-agent-fanout-dot {
208
+ border-color: var(--sprout-agent-fanout-color);
209
+ background: var(--sprout-agent-fanout-color);
210
+ color: var(--sprout-surface);
211
+ }
212
+ .sprout-agent-fanout-node[data-status="failed"] .sprout-agent-fanout-dot {
213
+ border-color: var(--sprout-danger);
214
+ background: var(--sprout-danger-subtle);
215
+ color: var(--sprout-danger);
216
+ }
217
+ .sprout-agent-fanout-node[data-status="stopped"] .sprout-agent-fanout-dot {
218
+ border-color: var(--sprout-border);
219
+ opacity: 0.6;
220
+ }
221
+ .sprout-agent-fanout-node-name {
222
+ max-width: calc(100% - 8px);
223
+ overflow: hidden;
224
+ color: var(--sprout-muted);
225
+ font-size: var(--sprout-text-xs);
226
+ line-height: 1rem;
227
+ text-overflow: ellipsis;
228
+ white-space: nowrap;
229
+ }
230
+
231
+ .sprout-agent-fanout-details {
232
+ border-top: 1px solid var(--sprout-line);
233
+ }
234
+ .sprout-agent-fanout-trigger {
235
+ display: flex;
236
+ align-items: center;
237
+ gap: 8px;
238
+ box-sizing: border-box;
239
+ width: 100%;
240
+ min-height: 40px;
241
+ padding: 0 16px;
242
+ border: 0;
243
+ background: transparent;
244
+ color: var(--sprout-muted);
245
+ font: inherit;
246
+ font-size: var(--sprout-text-sm);
247
+ text-align: start;
248
+ cursor: pointer;
249
+ }
250
+ .sprout-agent-fanout-trigger:hover {
251
+ background: var(--sprout-hover);
252
+ color: var(--sprout-text);
253
+ }
254
+ .sprout-agent-fanout-trigger:focus-visible {
255
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
256
+ outline-offset: -2px;
257
+ }
258
+ .sprout-agent-fanout-trigger-label {
259
+ font-weight: 500;
260
+ }
261
+ .sprout-agent-fanout-trigger-count {
262
+ flex: 1;
263
+ font-size: var(--sprout-text-xs);
264
+ font-variant-numeric: tabular-nums;
265
+ }
266
+
267
+ .sprout-agent-fanout-rows {
268
+ margin: 0;
269
+ padding: 0;
270
+ list-style: none;
271
+ }
272
+ .sprout-agent-fanout-row {
273
+ display: grid;
274
+ grid-template-columns: minmax(0, 8rem) minmax(0, 1fr) auto;
275
+ align-items: baseline;
276
+ gap: 12px;
277
+ padding: 11px 16px;
278
+ border-top: 1px solid var(--sprout-line);
279
+ font-size: var(--sprout-text-sm);
280
+ line-height: 1.25rem;
281
+ }
282
+ .sprout-agent-fanout-row-name {
283
+ padding-inline-start: calc(var(--sprout-agent-fanout-depth, 0) * 12px);
284
+ overflow: hidden;
285
+ font-weight: 500;
286
+ text-overflow: ellipsis;
287
+ white-space: nowrap;
288
+ }
289
+ .sprout-agent-fanout-row-detail {
290
+ overflow: hidden;
291
+ color: var(--sprout-muted);
292
+ text-overflow: ellipsis;
293
+ white-space: nowrap;
294
+ }
295
+ .sprout-agent-fanout-row-status {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: 6px;
299
+ color: var(--sprout-muted);
300
+ font-size: var(--sprout-text-xs);
301
+ font-variant-numeric: tabular-nums;
302
+ white-space: nowrap;
303
+ }
304
+ .sprout-agent-fanout-row[data-status="working"]
305
+ .sprout-agent-fanout-row-status {
306
+ color: color-mix(
307
+ in oklab,
308
+ var(--sprout-agent-fanout-color) 72%,
309
+ var(--sprout-text)
310
+ );
311
+ }
312
+ .sprout-agent-fanout-row[data-status="done"] .sprout-agent-fanout-row-status {
313
+ color: var(--sprout-text);
314
+ }
315
+ .sprout-agent-fanout-row[data-status="failed"]
316
+ .sprout-agent-fanout-row-status {
317
+ color: var(--sprout-danger);
318
+ }
319
+ .sprout-agent-fanout-pulse {
320
+ width: 6px;
321
+ height: 6px;
322
+ border-radius: 50%;
323
+ background: var(--sprout-agent-fanout-color);
324
+ }
325
+
326
+ .sprout-agent-fanout-footer {
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: space-between;
330
+ gap: 12px;
331
+ padding: 8px 8px 8px 16px;
332
+ border-top: 1px solid var(--sprout-line);
333
+ background: color-mix(in oklab, var(--sprout-hover) 50%, transparent);
334
+ }
335
+ .sprout-agent-fanout-phase {
336
+ display: flex;
337
+ align-items: baseline;
338
+ gap: 8px;
339
+ min-width: 0;
340
+ margin: 0;
341
+ color: var(--sprout-muted);
342
+ font-size: var(--sprout-text-sm);
343
+ line-height: 1.25rem;
344
+ }
345
+ .sprout-agent-fanout-time {
346
+ font-size: var(--sprout-text-xs);
347
+ font-variant-numeric: tabular-nums;
348
+ }
349
+ .sprout-agent-fanout-action {
350
+ flex-shrink: 0;
351
+ }
352
+
353
+ @container (max-width: 420px) {
354
+ .sprout-agent-fanout-row {
355
+ grid-template-columns: minmax(0, 5.5rem) minmax(0, 1fr) auto;
356
+ gap: 8px;
357
+ padding-inline: 12px;
358
+ }
359
+ .sprout-agent-fanout-task,
360
+ .sprout-agent-fanout-trigger {
361
+ padding-inline: 12px;
362
+ }
363
+ }
364
+
365
+ @media (prefers-reduced-motion: no-preference) {
366
+ .sprout-agent-fanout-trail[data-trip="out"] {
367
+ animation: sprout-agent-fanout-out var(--sprout-agent-fanout-trip)
368
+ var(--sprout-agent-fanout-trip-ease) both;
369
+ }
370
+ .sprout-agent-fanout-trail[data-trip="back"] {
371
+ animation: sprout-agent-fanout-back var(--sprout-agent-fanout-trip)
372
+ var(--sprout-agent-fanout-trip-ease) both;
373
+ }
374
+ .sprout-agent-fanout-comet[data-trip="out"] {
375
+ animation: sprout-agent-fanout-comet-out var(--sprout-agent-fanout-trip)
376
+ var(--sprout-agent-fanout-trip-ease) both;
377
+ }
378
+ .sprout-agent-fanout-comet[data-trip="back"] {
379
+ animation: sprout-agent-fanout-comet-back var(--sprout-agent-fanout-trip)
380
+ var(--sprout-agent-fanout-trip-ease) both;
381
+ }
382
+
383
+ .sprout-agent-fanout-dot,
384
+ .sprout-agent-fanout-dot::before {
385
+ transition:
386
+ background-color 240ms var(--sprout-motion-ease),
387
+ border-color 240ms var(--sprout-motion-ease),
388
+ color 240ms var(--sprout-motion-ease),
389
+ opacity 240ms var(--sprout-motion-ease);
390
+ }
391
+ /* The node lights up when the pulse lands, not when it leaves. */
392
+ .sprout-agent-fanout-node[data-status="working"][data-changed]
393
+ .sprout-agent-fanout-dot,
394
+ .sprout-agent-fanout-node[data-status="working"][data-changed]
395
+ .sprout-agent-fanout-dot::before {
396
+ transition-delay: calc(var(--sprout-agent-fanout-trip) * 0.85);
397
+ }
398
+ .sprout-agent-fanout-node[data-status="working"]
399
+ .sprout-agent-fanout-dot::before {
400
+ animation: sprout-agent-fanout-breathe 1.6s ease-in-out infinite alternate;
401
+ animation-delay: calc(var(--sprout-agent-fanout-index) * -0.55s);
402
+ }
403
+ .sprout-agent-fanout-node[data-status="done"][data-changed]
404
+ .sprout-agent-fanout-dot {
405
+ animation: sprout-agent-fanout-pop 420ms var(--sprout-motion-ease);
406
+ }
407
+ .sprout-agent-fanout-root[data-changed] {
408
+ animation: sprout-agent-fanout-ring 900ms var(--sprout-motion-ease);
409
+ }
410
+ .sprout-agent-fanout-root[data-changed] > svg {
411
+ animation: sprout-agent-fanout-pop 420ms var(--sprout-motion-ease);
412
+ }
413
+ .sprout-agent-fanout-pulse {
414
+ animation: sprout-agent-fanout-pulse 1.4s ease-out infinite;
415
+ }
416
+ .sprout-agent-fanout-row-detail[data-changed],
417
+ .sprout-agent-fanout-row-status[data-changed] {
418
+ animation: sprout-agent-fanout-enter 320ms var(--sprout-motion-ease) both;
419
+ }
420
+ }
421
+
422
+ @media (forced-colors: active) {
423
+ .sprout-agent-fanout-edge,
424
+ .sprout-agent-fanout-trail {
425
+ stroke: CanvasText;
426
+ }
427
+ .sprout-agent-fanout-dot,
428
+ .sprout-agent-fanout-root {
429
+ border: 1px solid CanvasText;
430
+ }
431
+ }
432
+ }
433
+
434
+ @keyframes sprout-agent-fanout-out {
435
+ 0% {
436
+ stroke-dashoffset: 0.3;
437
+ opacity: 1;
438
+ }
439
+ 80% {
440
+ opacity: 1;
441
+ }
442
+ 100% {
443
+ stroke-dashoffset: -0.7;
444
+ opacity: 0;
445
+ }
446
+ }
447
+ @keyframes sprout-agent-fanout-back {
448
+ 0% {
449
+ stroke-dashoffset: -1;
450
+ opacity: 1;
451
+ }
452
+ 80% {
453
+ opacity: 1;
454
+ }
455
+ 100% {
456
+ stroke-dashoffset: 0;
457
+ opacity: 0;
458
+ }
459
+ }
460
+ @keyframes sprout-agent-fanout-comet-out {
461
+ 0% {
462
+ offset-distance: 0%;
463
+ opacity: 1;
464
+ }
465
+ 90% {
466
+ opacity: 1;
467
+ }
468
+ 100% {
469
+ offset-distance: 100%;
470
+ opacity: 0;
471
+ }
472
+ }
473
+ @keyframes sprout-agent-fanout-comet-back {
474
+ 0% {
475
+ offset-distance: 100%;
476
+ opacity: 1;
477
+ }
478
+ 90% {
479
+ opacity: 1;
480
+ }
481
+ 100% {
482
+ offset-distance: 0%;
483
+ opacity: 0;
484
+ }
485
+ }
486
+ @keyframes sprout-agent-fanout-breathe {
487
+ from {
488
+ scale: 0.82;
489
+ }
490
+ to {
491
+ scale: 1.08;
492
+ }
493
+ }
494
+ @keyframes sprout-agent-fanout-pop {
495
+ 0% {
496
+ scale: 0.82;
497
+ }
498
+ 60% {
499
+ scale: 1.08;
500
+ }
501
+ 100% {
502
+ scale: 1;
503
+ }
504
+ }
505
+ @keyframes sprout-agent-fanout-ring {
506
+ from {
507
+ box-shadow: 0 0 0 0
508
+ color-mix(in oklab, var(--sprout-primary) 28%, transparent);
509
+ }
510
+ to {
511
+ box-shadow: 0 0 0 14px transparent;
512
+ }
513
+ }
514
+ @keyframes sprout-agent-fanout-pulse {
515
+ 0% {
516
+ box-shadow: 0 0 0 0
517
+ color-mix(in oklab, var(--sprout-agent-fanout-color) 45%, transparent);
518
+ }
519
+ 100% {
520
+ box-shadow: 0 0 0 5px transparent;
521
+ }
522
+ }
523
+ @keyframes sprout-agent-fanout-enter {
524
+ from {
525
+ filter: blur(2px);
526
+ opacity: 0;
527
+ translate: 0 3px;
528
+ }
529
+ }
@@ -98,8 +98,8 @@
98
98
  text-underline-offset: 3px;
99
99
  }
100
100
  .sprout-alert-dialog-description a:not([data-slot]):focus-visible {
101
- outline: 2px solid var(--sprout-focus);
102
- outline-offset: 2px;
101
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
102
+ outline-offset: 0;
103
103
  }
104
104
 
105
105
  .sprout-alert-dialog-footer {
@@ -88,8 +88,8 @@
88
88
  }
89
89
  :is(.sprout-alert-title, .sprout-alert-description)
90
90
  a:not([data-slot]):focus-visible {
91
- outline: 2px solid var(--sprout-focus);
92
- outline-offset: 2px;
91
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
92
+ outline-offset: 0;
93
93
  }
94
94
 
95
95
  .sprout-alert-action {
@@ -52,8 +52,8 @@
52
52
  );
53
53
  }
54
54
  .sprout-attachment:has(> .sprout-attachment-trigger:focus-visible) {
55
- outline: 2px solid var(--sprout-focus);
56
- outline-offset: 2px;
55
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
56
+ outline-offset: 0;
57
57
  }
58
58
  .sprout-attachment[data-state="idle"] {
59
59
  border-style: dashed;
@@ -320,18 +320,6 @@
320
320
  );
321
321
  }
322
322
  .sprout-attachment-carousel-arrow {
323
- display: flex;
324
- align-items: center;
325
- justify-content: center;
326
- width: 24px;
327
- height: 24px;
328
- padding: 0;
329
- border: 1px solid var(--sprout-line);
330
- border-radius: 8px;
331
- background: var(--sprout-surface);
332
- box-shadow: var(--sprout-shadow-control);
333
- color: var(--sprout-muted);
334
- cursor: pointer;
335
323
  opacity: 0;
336
324
  pointer-events: auto;
337
325
  }
@@ -346,14 +334,6 @@
346
334
  opacity: 1;
347
335
  }
348
336
  }
349
- .sprout-attachment-carousel-arrow:hover {
350
- background: var(--sprout-hover);
351
- color: var(--sprout-text);
352
- }
353
- .sprout-attachment-carousel-arrow:focus-visible {
354
- outline: 2px solid var(--sprout-focus);
355
- outline-offset: 1px;
356
- }
357
337
 
358
338
  /* File type icon */
359
339
  .sprout-file-type-icon {
@@ -486,8 +466,8 @@
486
466
  }
487
467
  .sprout-file-attachment-open:focus-visible,
488
468
  .sprout-file-attachment-preview:focus-visible {
489
- outline: 2px solid var(--sprout-focus);
490
- outline-offset: 2px;
469
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
470
+ outline-offset: 0;
491
471
  }
492
472
  .sprout-file-attachment:has(
493
473
  button.sprout-file-attachment-open:not(:disabled)
@@ -36,8 +36,8 @@
36
36
  pointer-events: none;
37
37
  }
38
38
  .sprout-badge:focus-visible {
39
- outline: 2px solid var(--sprout-focus);
40
- outline-offset: 2px;
39
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
40
+ outline-offset: 0;
41
41
  }
42
42
  .sprout-badge[aria-invalid="true"] {
43
43
  border-color: var(--sprout-danger);
@@ -50,8 +50,8 @@
50
50
  background: var(--sprout-hover);
51
51
  }
52
52
  .sprout-brand-tile[data-size]:is(button, a):focus-visible {
53
- outline: 2px solid var(--sprout-focus);
54
- outline-offset: 2px;
53
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
54
+ outline-offset: 0;
55
55
  }
56
56
  .sprout-brand-tile[data-size]:is(button, a):disabled {
57
57
  cursor: not-allowed;
@@ -54,8 +54,8 @@
54
54
  color: var(--sprout-text);
55
55
  }
56
56
  .sprout-breadcrumb-link:focus-visible {
57
- outline: 2px solid var(--sprout-focus);
58
- outline-offset: 2px;
57
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
58
+ outline-offset: 0;
59
59
  }
60
60
 
61
61
  .sprout-breadcrumb-page {
@@ -33,8 +33,8 @@
33
33
  height: var(--sprout-button-icon);
34
34
  }
35
35
  .sprout-button:focus-visible {
36
- outline: 2px solid var(--sprout-focus);
37
- outline-offset: 2px;
36
+ outline: var(--sprout-focus-width) solid var(--sprout-focus-ring);
37
+ outline-offset: 0;
38
38
  }
39
39
  .sprout-button:disabled,
40
40
  .sprout-button[data-disabled],
@@ -221,7 +221,7 @@
221
221
  }
222
222
  .sprout-calendar-day-button.sprout-button:focus-visible {
223
223
  z-index: 2;
224
- outline-offset: 1px;
224
+ outline-offset: 0;
225
225
  }
226
226
  .sprout-calendar-day-button > span {
227
227
  font-size: 0.625rem;
@@ -282,11 +282,11 @@
282
282
  .sprout-calendar-day-button[data-range-start="true"],
283
283
  .sprout-calendar-day-button[data-range-end="true"] {
284
284
  outline: 2px solid Highlight;
285
- outline-offset: -2px;
285
+ outline-offset: -1px;
286
286
  }
287
287
  .sprout-calendar-day-button[data-range-middle="true"] {
288
288
  outline: 1px dashed Highlight;
289
- outline-offset: -2px;
289
+ outline-offset: -1px;
290
290
  }
291
291
  .sprout-calendar-today .sprout-calendar-day-button {
292
292
  text-decoration: underline;