@mcp-b/react-components 0.20.4 → 0.21.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 (134) hide show
  1. package/dist/{AgentActivity-D2SHSGFX.d.ts → AgentActivity-D3OvrC02.d.ts} +14 -1
  2. package/dist/{AgentChat-C-ZyXbJz.d.ts → AgentChat-Dvkn8lce.d.ts} +23 -0
  3. package/dist/AgentChatStartScreen-CvXJBr4y.d.ts +57 -0
  4. package/dist/{ModelSelector-pecWyOFI.js → ModelSelector-CEd8M9eK.js} +14 -7
  5. package/dist/{ThinkChatActivity-CdbL0aoA.d.ts → ThinkChatActivity-FY1VWXgh.d.ts} +8 -7
  6. package/dist/{ThinkChatActivitySummary-D1xOrNrq.d.ts → ThinkChatActivitySummary-kr5fE0wg.d.ts} +14 -5
  7. package/dist/{ToggleGroup-DNd6cDJZ.d.ts → ToggleGroup-BW1jrhAF.d.ts} +10 -0
  8. package/dist/components/Activity.d.ts +33 -17
  9. package/dist/components/Activity.js +39 -27
  10. package/dist/components/AgentActivity.d.ts +1 -1
  11. package/dist/components/AgentActivityPreview.d.ts +1 -1
  12. package/dist/components/AgentActivityPreview.js +2 -2
  13. package/dist/components/AgentChat.d.ts +1 -1
  14. package/dist/components/AgentChat.js +142 -129
  15. package/dist/components/AgentChatStartScreen.d.ts +2 -0
  16. package/dist/components/AgentChatStartScreen.js +82 -0
  17. package/dist/components/Approval.js +2 -4
  18. package/dist/components/BrowserLiveView.js +5 -7
  19. package/dist/components/BrowserReplay.js +5 -4
  20. package/dist/components/BrowserRunPanel.js +1 -1
  21. package/dist/components/ChatGptSignInScreen.js +1 -1
  22. package/dist/components/Conversation.d.ts +1 -22
  23. package/dist/components/Conversation.js +2 -29
  24. package/dist/components/EmptyState.d.ts +46 -0
  25. package/dist/components/EmptyState.js +50 -0
  26. package/dist/components/Kbd.d.ts +32 -0
  27. package/dist/components/Kbd.js +34 -0
  28. package/dist/components/MessageScroller.js +1 -0
  29. package/dist/components/ModelSelector.d.ts +10 -4
  30. package/dist/components/ModelSelector.js +2 -2
  31. package/dist/components/PricingBillingToggle.js +1 -0
  32. package/dist/components/PromptInput.js +3 -2
  33. package/dist/components/Reasoning.js +1 -1
  34. package/dist/components/StatusPill.d.ts +43 -0
  35. package/dist/components/StatusPill.js +35 -0
  36. package/dist/components/Stepper.js +1 -5
  37. package/dist/components/TestResults.js +15 -15
  38. package/dist/components/ThinkChat.d.ts +9 -3
  39. package/dist/components/ThinkChatActivity.d.ts +2 -2
  40. package/dist/components/ThinkChatActivity.js +27 -15
  41. package/dist/components/ThinkChatActivitySummary.d.ts +2 -2
  42. package/dist/components/ThinkChatActivitySummary.js +69 -66
  43. package/dist/components/ThinkExecutionDetail.js +4 -4
  44. package/dist/components/ThinkExecutionRun.js +2 -2
  45. package/dist/components/ThinkExecutionWorkbench.js +5 -4
  46. package/dist/components/ThinkFullAppViewSwitch.d.ts +1 -1
  47. package/dist/components/ThinkRoutine.js +2 -10
  48. package/dist/components/ThinkRoutineBrowser.js +1 -0
  49. package/dist/components/ThinkRoutineRuns.js +3 -2
  50. package/dist/components/ThinkThreadPicker.js +4 -2
  51. package/dist/components/ToggleGroup.d.ts +1 -1
  52. package/dist/components/ToggleGroup.js +54 -7
  53. package/dist/components/ToolInvocation.js +1 -1
  54. package/dist/styles/accordion.css +2 -1
  55. package/dist/styles/activity-header.css +45 -25
  56. package/dist/styles/activity.css +26 -4
  57. package/dist/styles/agent-activity-preview-overlay.css +51 -12
  58. package/dist/styles/agent-activity-preview.css +34 -33
  59. package/dist/styles/agent-attention.css +9 -16
  60. package/dist/styles/agent-chat.css +199 -0
  61. package/dist/styles/agent-connection.css +10 -10
  62. package/dist/styles/alert-dialog.css +5 -2
  63. package/dist/styles/app-top-bar.css +4 -4
  64. package/dist/styles/approval.css +1 -7
  65. package/dist/styles/artifact.css +5 -5
  66. package/dist/styles/attachment-preview.css +1 -1
  67. package/dist/styles/badge.css +1 -1
  68. package/dist/styles/base-ui-motion.css +1 -1
  69. package/dist/styles/base.css +110 -3
  70. package/dist/styles/browser-control-overlay.css +16 -6
  71. package/dist/styles/browser-live-view.css +5 -38
  72. package/dist/styles/browser-replay.css +4 -8
  73. package/dist/styles/browser-run-panel.css +5 -19
  74. package/dist/styles/button.css +4 -2
  75. package/dist/styles/card.css +4 -4
  76. package/dist/styles/chain-of-thought.css +1 -2
  77. package/dist/styles/chatgpt-sign-in-screen.css +9 -7
  78. package/dist/styles/checkbox-group.css +4 -4
  79. package/dist/styles/code-block.css +9 -9
  80. package/dist/styles/commit.css +1 -1
  81. package/dist/styles/context-menu.css +1 -1
  82. package/dist/styles/conversation.css +7 -42
  83. package/dist/styles/description-list.css +2 -2
  84. package/dist/styles/dialog.css +17 -2
  85. package/dist/styles/empty-state.css +48 -0
  86. package/dist/styles/environment-variables.css +8 -8
  87. package/dist/styles/field.css +2 -2
  88. package/dist/styles/fieldset.css +1 -1
  89. package/dist/styles/file-tree.css +1 -1
  90. package/dist/styles/github-motion-mark.css +1 -1
  91. package/dist/styles/index.css +3 -0
  92. package/dist/styles/inline-citation.css +1 -1
  93. package/dist/styles/kbd.css +40 -0
  94. package/dist/styles/label.css +1 -1
  95. package/dist/styles/mcp-server-picker.css +1 -1
  96. package/dist/styles/media-preview-card.css +5 -3
  97. package/dist/styles/menu.css +1 -1
  98. package/dist/styles/message-scroller.css +7 -25
  99. package/dist/styles/message.css +5 -7
  100. package/dist/styles/model-selector.css +5 -8
  101. package/dist/styles/plan.css +1 -1
  102. package/dist/styles/popover.css +1 -1
  103. package/dist/styles/preview-card.css +1 -1
  104. package/dist/styles/pricing-page.css +37 -35
  105. package/dist/styles/prompt-input.css +19 -41
  106. package/dist/styles/queue.css +3 -3
  107. package/dist/styles/recipes.css +92 -9
  108. package/dist/styles/resizable-side-panel.css +1 -1
  109. package/dist/styles/responsive-sidebar-shell.css +5 -6
  110. package/dist/styles/scrollbars.css +32 -3
  111. package/dist/styles/sources.css +2 -2
  112. package/dist/styles/status-pill.css +39 -0
  113. package/dist/styles/stepper.css +2 -2
  114. package/dist/styles/streamdown.css +39 -35
  115. package/dist/styles/subagent-run.css +3 -3
  116. package/dist/styles/switch.css +1 -3
  117. package/dist/styles/tabs.css +1 -1
  118. package/dist/styles/task.css +2 -2
  119. package/dist/styles/terminal.css +6 -6
  120. package/dist/styles/test-results.css +2 -3
  121. package/dist/styles/textarea.css +1 -1
  122. package/dist/styles/theme-mode-control.css +3 -4
  123. package/dist/styles/think-execution-status.css +4 -23
  124. package/dist/styles/think-execution-workbench.css +3 -4
  125. package/dist/styles/think-full-app.css +3 -3
  126. package/dist/styles/think-routine-library.css +22 -24
  127. package/dist/styles/think-thread-picker.css +20 -47
  128. package/dist/styles/toast.css +2 -2
  129. package/dist/styles/toggle-group.css +76 -3
  130. package/dist/styles/tooltip.css +1 -2
  131. package/dist/styles/utilities.css +73 -0
  132. package/dist/styles/web-preview.css +4 -4
  133. package/dist/styles/workspace-explorer.css +6 -8
  134. package/package.json +2 -2
@@ -153,7 +153,7 @@
153
153
 
154
154
  .think-routine-browser__routine {
155
155
  inline-size: 100%;
156
- min-block-size: 3.5rem;
156
+ min-block-size: var(--sigvelo-spacing-14);
157
157
  display: grid;
158
158
  grid-template-columns: auto minmax(0, 1fr);
159
159
  align-items: center;
@@ -217,7 +217,7 @@
217
217
  .think-routine-library__detail {
218
218
  inline-size: min(100%, 64rem);
219
219
  margin-inline: auto;
220
- padding: clamp(1rem, 3vw, 2rem);
220
+ padding: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
221
221
  }
222
222
 
223
223
  .think-routine-library__detail-header,
@@ -229,7 +229,7 @@
229
229
 
230
230
  .think-routine-library__detail-header {
231
231
  justify-content: space-between;
232
- padding-block-end: clamp(1rem, 3vw, 2rem);
232
+ padding-block-end: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
233
233
  }
234
234
 
235
235
  .think-routine-library__detail-heading {
@@ -242,8 +242,8 @@
242
242
 
243
243
  .think-routine-library__detail-header h1,
244
244
  .think-routine-library__create-header h1 {
245
- font-size: clamp(1.125rem, 2.5vw, 1.5rem);
246
- line-height: 1.12;
245
+ font-size: clamp(var(--sigvelo-text-lg), 2.5vw, var(--sigvelo-text-2xl));
246
+ line-height: var(--sigvelo-leading-tight);
247
247
  }
248
248
 
249
249
  .think-routine-library__detail-heading > p:last-child,
@@ -257,12 +257,12 @@
257
257
  .think-routine-library__detail-grid {
258
258
  display: grid;
259
259
  grid-template-columns: minmax(0, 1.35fr) minmax(15rem, 0.65fr);
260
- gap: clamp(1rem, 3vw, 2rem);
261
- padding-block-end: clamp(1rem, 3vw, 2rem);
260
+ gap: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
261
+ padding-block-end: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
262
262
  }
263
263
 
264
264
  .think-routine-library__section-heading {
265
- min-block-size: 2rem;
265
+ min-block-size: var(--sigvelo-spacing-8);
266
266
  display: flex;
267
267
  align-items: flex-start;
268
268
  justify-content: space-between;
@@ -280,7 +280,7 @@
280
280
  margin: 0;
281
281
  color: var(--sigvelo-color-text);
282
282
  font-size: var(--sigvelo-text-sm);
283
- line-height: 1.7;
283
+ line-height: var(--sigvelo-leading-relaxed);
284
284
  white-space: pre-wrap;
285
285
  }
286
286
 
@@ -326,7 +326,7 @@
326
326
  }
327
327
 
328
328
  .think-routine-library__runs {
329
- padding-block-end: clamp(1rem, 3vw, 2rem);
329
+ padding-block-end: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
330
330
  }
331
331
 
332
332
  .think-routine-library__run-list {
@@ -348,15 +348,15 @@
348
348
  }
349
349
 
350
350
  .think-routine-library__run-marker {
351
- inline-size: 1rem;
352
- block-size: 1rem;
351
+ inline-size: var(--sigvelo-control-icon-size-md);
352
+ block-size: var(--sigvelo-control-icon-size-md);
353
353
  flex: 0 0 auto;
354
354
  }
355
355
 
356
356
  .think-routine-library__run-marker svg {
357
357
  display: block;
358
- inline-size: 1rem;
359
- block-size: 1rem;
358
+ inline-size: var(--sigvelo-control-icon-size-md);
359
+ block-size: var(--sigvelo-control-icon-size-md);
360
360
  }
361
361
 
362
362
  .think-routine-library__run > span {
@@ -370,18 +370,14 @@
370
370
  text-overflow: ellipsis;
371
371
  }
372
372
 
373
- .think-routine-library__empty-runs {
374
- color: var(--sigvelo-color-text-muted);
375
- font-size: var(--sigvelo-text-xs);
376
- }
377
-
378
373
  .think-routine-library__run-kind {
379
374
  text-transform: capitalize;
380
375
  }
381
376
 
377
+ /* One rule, not two — this selector was declared twice in this file. */
382
378
  .think-routine-library__empty-runs {
383
- margin: 0;
384
- padding-block: var(--sigvelo-spacing-4);
379
+ --sigvelo-recipe-empty-state-padding-block: var(--sigvelo-spacing-4);
380
+
385
381
  border-block: var(--sigvelo-border-style) var(--sigvelo-border-width)
386
382
  var(--sigvelo-color-neutral-border-subtle);
387
383
  }
@@ -423,7 +419,7 @@
423
419
  .think-routine-library__create {
424
420
  min-block-size: 0;
425
421
  overflow: auto;
426
- padding: clamp(1rem, 3vw, 2rem);
422
+ padding: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
427
423
  }
428
424
 
429
425
  .think-routine-library__create-header,
@@ -433,7 +429,7 @@
433
429
  }
434
430
 
435
431
  .think-routine-library__create-header {
436
- margin-block-end: clamp(1rem, 3vw, 2rem);
432
+ margin-block-end: clamp(var(--sigvelo-spacing-4), 3vw, var(--sigvelo-spacing-8));
437
433
  }
438
434
 
439
435
  .think-routine-library__create-header > div {
@@ -486,8 +482,10 @@
486
482
  @container responsive-sidebar-shell (inline-size <= 56rem) {
487
483
  .think-routine-library__browser {
488
484
  inline-size: 100%;
485
+ /* Narrow enough that the browser stops being a column beside the detail
486
+ and starts covering it, so it takes the overlay stack. */
489
487
  border-inline-end: 0;
490
- box-shadow: var(--sigvelo-shadow-lg);
488
+ box-shadow: var(--sigvelo-elevation-overlay);
491
489
  }
492
490
  }
493
491
 
@@ -56,7 +56,7 @@
56
56
  display: inline-flex;
57
57
  align-items: center;
58
58
  gap: var(--sigvelo-spacing-0-5);
59
- min-inline-size: 1rem;
59
+ min-inline-size: var(--sigvelo-spacing-4);
60
60
  }
61
61
 
62
62
  .think-thread-status-indicators__item svg {
@@ -68,10 +68,6 @@
68
68
  color: var(--sigvelo-color-primary-text);
69
69
  }
70
70
 
71
- .think-thread-status-indicators__item[data-status="running"] svg {
72
- animation: sigvelo-icon-spin 900ms linear infinite;
73
- }
74
-
75
71
  .think-thread-status-indicators__item[data-status="attention"] {
76
72
  color: var(--sigvelo-color-warning-text);
77
73
  }
@@ -96,33 +92,23 @@
96
92
 
97
93
  .think-thread-picker__viewport {
98
94
  --think-thread-picker-fade-size: min(12%, 2.5rem);
95
+ --sigvelo-scroll-fade-start: min(
96
+ var(--think-thread-picker-fade-size),
97
+ var(--scroll-area-overflow-y-start, 0px)
98
+ );
99
+ --sigvelo-scroll-fade-end: min(
100
+ var(--think-thread-picker-fade-size),
101
+ var(--scroll-area-overflow-y-end, 0px)
102
+ );
99
103
 
100
- padding: var(--sigvelo-spacing-1-5) 0.5rem var(--sigvelo-spacing-3);
104
+ padding: var(--sigvelo-spacing-1-5) var(--sigvelo-spacing-2) var(--sigvelo-spacing-3);
101
105
  overscroll-behavior: contain;
102
106
  scrollbar-gutter: stable;
103
- -webkit-mask-image: linear-gradient(
104
- to bottom,
105
- transparent 0,
106
- #000 min(var(--think-thread-picker-fade-size), var(--scroll-area-overflow-y-start, 0px)),
107
- #000
108
- calc(100% - min(var(--think-thread-picker-fade-size), var(--scroll-area-overflow-y-end, 0px))),
109
- transparent 100%
110
- );
111
- mask-image: linear-gradient(
112
- to bottom,
113
- transparent 0,
114
- #000 min(var(--think-thread-picker-fade-size), var(--scroll-area-overflow-y-start, 0px)),
115
- #000
116
- calc(100% - min(var(--think-thread-picker-fade-size), var(--scroll-area-overflow-y-end, 0px))),
117
- transparent 100%
118
- );
119
- -webkit-mask-repeat: no-repeat;
120
- mask-repeat: no-repeat;
121
107
  }
122
108
 
123
109
  .think-thread-picker__list {
124
110
  display: grid;
125
- gap: 0.0625rem;
111
+ gap: 1px;
126
112
  margin: 0;
127
113
  padding: 0;
128
114
  list-style: none;
@@ -249,7 +235,7 @@
249
235
 
250
236
  .think-thread-picker__delete-error svg {
251
237
  flex: 0 0 auto;
252
- margin-block-start: 0.125rem;
238
+ margin-block-start: var(--sigvelo-spacing-0-5);
253
239
  }
254
240
 
255
241
  .think-thread-picker__thread-time {
@@ -262,8 +248,8 @@
262
248
  display: inline-flex;
263
249
  align-items: center;
264
250
  justify-content: center;
265
- inline-size: 1rem;
266
- block-size: 1rem;
251
+ inline-size: var(--sigvelo-control-icon-size-md);
252
+ block-size: var(--sigvelo-control-icon-size-md);
267
253
  color: var(--sigvelo-color-text-muted);
268
254
  }
269
255
 
@@ -281,20 +267,10 @@
281
267
  color: var(--sigvelo-color-primary-text);
282
268
  }
283
269
 
284
- .think-thread-picker__thread[data-thread-status="pending"] .think-thread-picker__thread-status svg,
285
- .think-thread-picker__thread[data-thread-status="running"] .think-thread-picker__thread-status svg,
286
- .think-thread-picker__thread[data-thread-status="starting"] .think-thread-picker__thread-status svg,
287
- .think-thread-picker__thread[data-thread-status="streaming"]
288
- .think-thread-picker__thread-status
289
- svg,
290
- .think-thread-picker__thread[data-thread-status="submitted"]
291
- .think-thread-picker__thread-status
292
- svg,
293
- .think-thread-picker__thread[data-thread-status="recovering"]
294
- .think-thread-picker__thread-status
295
- svg {
296
- animation: sigvelo-icon-spin 900ms linear infinite;
297
- }
270
+ /* The six statuses this rule used to list were `isThreadBusy` written out a
271
+ second time, and those are exactly the ones that render SpinnerIcon, which
272
+ spins itself. A DotIcon never needed the rule and would have started turning
273
+ the moment the two lists disagreed. */
298
274
 
299
275
  .think-thread-picker__thread[data-thread-status="error"] .think-thread-picker__thread-status {
300
276
  color: var(--sigvelo-color-danger-text);
@@ -307,10 +283,7 @@
307
283
  }
308
284
 
309
285
  .think-thread-picker__empty {
310
- margin: 0.5rem;
311
- color: var(--sigvelo-color-text-muted);
312
- font-size: var(--sigvelo-text-compact);
313
- line-height: var(--sigvelo-leading-snug);
286
+ margin: var(--sigvelo-spacing-2);
314
287
  }
315
288
 
316
289
  .think-thread-picker__footer {
@@ -397,7 +370,7 @@
397
370
 
398
371
  @media (forced-colors: active) {
399
372
  .think-thread-picker {
400
- border-inline-end: 1px solid canvastext;
373
+ border-inline-end: var(--sigvelo-border-style) var(--sigvelo-border-width) canvastext;
401
374
  background: canvas;
402
375
  color: canvastext;
403
376
  box-shadow: none;
@@ -2,7 +2,7 @@
2
2
  position: fixed;
3
3
  inset-block-end: var(--sigvelo-spacing-4);
4
4
  inset-inline-end: var(--sigvelo-spacing-4);
5
- z-index: 100;
5
+ z-index: var(--sigvelo-z-toast);
6
6
  inline-size: min(24rem, calc(100dvi - var(--sigvelo-spacing-8)));
7
7
  max-inline-size: 100%;
8
8
  pointer-events: none;
@@ -15,7 +15,7 @@
15
15
  position: absolute;
16
16
  inset-inline: 0;
17
17
  inset-block-end: 0;
18
- z-index: calc(100 - var(--toast-index));
18
+ z-index: calc(var(--sigvelo-z-toast) - var(--toast-index));
19
19
  display: flex;
20
20
  flex-direction: column;
21
21
  inline-size: 100%;
@@ -33,9 +33,7 @@
33
33
  .toggle-group__item[data-pressed] {
34
34
  background-color: var(--sigvelo-color-canvas);
35
35
  color: var(--sigvelo-color-text);
36
- box-shadow:
37
- 0 1px 3px 0 color-mix(in oklab, var(--sigvelo-color-text), transparent 90%),
38
- 0 1px 2px -1px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%);
36
+ box-shadow: var(--sigvelo-elevation-raised);
39
37
  }
40
38
 
41
39
  @media (forced-colors: active) {
@@ -44,3 +42,78 @@
44
42
  outline-offset: -2px;
45
43
  }
46
44
  }
45
+
46
+ /*
47
+ * Segmented: one thumb that travels, rather than each item lighting up its own
48
+ * background. Same anatomy, same track — a segmented control is how this group
49
+ * presents itself when the choice is a mode rather than a set of switches, so
50
+ * it is a modifier here instead of a second component with a second track.
51
+ *
52
+ * The position comes from JavaScript because nothing in CSS can produce it: see
53
+ * `useSegmentedThumb`.
54
+ */
55
+ .toggle-group--segmented {
56
+ position: relative;
57
+ }
58
+
59
+ .toggle-group__thumb {
60
+ position: absolute;
61
+ /* Physical `left`, deliberately: it is fed `offsetLeft`, which is physical.
62
+ `translate` rather than moving `left` itself keeps the travel on the
63
+ compositor. */
64
+ left: 0;
65
+ inset-block: var(--sigvelo-spacing-1);
66
+ inline-size: var(--toggle-group-thumb-size, 0);
67
+ translate: var(--toggle-group-thumb-start, 0) 0;
68
+ border-radius: calc(var(--sigvelo-radius-md) - 2px);
69
+ background-color: var(--sigvelo-color-canvas);
70
+ box-shadow: var(--sigvelo-elevation-raised);
71
+ transition:
72
+ translate var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
73
+ inline-size var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change);
74
+ }
75
+
76
+ .toggle-group--sm .toggle-group__thumb {
77
+ inset-block: var(--sigvelo-spacing-0-5);
78
+ }
79
+
80
+ .toggle-group--lg .toggle-group__thumb {
81
+ inset-block: var(--sigvelo-spacing-1-5);
82
+ }
83
+
84
+ /* Before the first measurement, and whenever the group allows an empty
85
+ selection, there is no segment for the thumb to sit on. */
86
+ .toggle-group--segmented:not(:has(.toggle-group__item[data-pressed])) .toggle-group__thumb {
87
+ opacity: 0;
88
+ }
89
+
90
+ /* The thumb draws the pressed state now; leaving the item's own copy underneath
91
+ would double the elevation and show a second edge as the thumb slides off. */
92
+ .toggle-group--segmented .toggle-group__item[data-pressed] {
93
+ background-color: transparent;
94
+ box-shadow: none;
95
+ }
96
+
97
+ .toggle-group--segmented .toggle-group__item {
98
+ position: relative;
99
+ z-index: 1;
100
+ }
101
+
102
+ @media (prefers-reduced-motion: reduce) {
103
+ .toggle-group__thumb {
104
+ transition: none;
105
+ }
106
+ }
107
+
108
+ :root[data-motion="reduce"] .toggle-group__thumb {
109
+ transition: none;
110
+ }
111
+
112
+ /* Backgrounds are dropped in forced colors, so the travelling thumb would
113
+ vanish and take the selected state with it. */
114
+ @media (forced-colors: active) {
115
+ .toggle-group__thumb {
116
+ outline: var(--sigvelo-focus-ring-forced);
117
+ outline-offset: -2px;
118
+ }
119
+ }
@@ -1,9 +1,8 @@
1
1
  .tooltip__popup {
2
2
  --sigvelo-recipe-popup-arrow-size: var(--sigvelo-spacing-2);
3
3
  --sigvelo-recipe-surface-padding: var(--sigvelo-spacing-1) var(--sigvelo-spacing-2);
4
- --sigvelo-recipe-surface-shadow: var(--sigvelo-shadow-sm);
5
4
 
6
- z-index: 50;
5
+ z-index: var(--sigvelo-z-overlay);
7
6
  max-inline-size: min(20rem, var(--available-width));
8
7
  overflow-block: auto;
9
8
  font-size: var(--sigvelo-text-xs);
@@ -33,3 +33,76 @@
33
33
  min-inline-size: 0;
34
34
  flex: 1;
35
35
  }
36
+
37
+ /*
38
+ * Truncation by fade rather than by ellipsis. An ellipsis is a character the
39
+ * reader has to parse — in a value slot ("gpt-5.1-codex-m…") it reads as part
40
+ * of the value. A mask just stops. Use it where the text is data; keep
41
+ * .sigvelo-truncate where the text is a sentence and the ellipsis is a
42
+ * legitimate signal that words were dropped.
43
+ */
44
+ .sigvelo-truncate-fade {
45
+ --sigvelo-truncate-fade-distance: 1rem;
46
+ overflow: hidden;
47
+ white-space: nowrap;
48
+ mask-image: linear-gradient(
49
+ to right,
50
+ #000 calc(100% - var(--sigvelo-truncate-fade-distance)),
51
+ transparent 100%
52
+ );
53
+ }
54
+
55
+ /* Clamp to N lines. -1 keeps the mechanism while removing the limit, so a
56
+ component can drop the cap from script without swapping classes. */
57
+ .sigvelo-line-clamp {
58
+ --sigvelo-line-clamp: 2;
59
+ display: -webkit-box;
60
+ -webkit-box-orient: vertical;
61
+ -webkit-line-clamp: var(--sigvelo-line-clamp);
62
+ overflow: hidden;
63
+ }
64
+
65
+ /*
66
+ * Scrollbars that appear on hover or keyboard focus and stay out of the way
67
+ * otherwise. scrollbar-gutter reserves the track either way, so revealing the
68
+ * bar never reflows the content beside it. Coarse pointers have no hover to
69
+ * key off and overlay their scrollbars anyway, so they are left alone.
70
+ */
71
+ @media (any-pointer: fine) {
72
+ .sigvelo-scrollbar-on-hover {
73
+ scrollbar-gutter: stable;
74
+ scrollbar-color: transparent transparent;
75
+ transition: scrollbar-color var(--sigvelo-motion-duration-interaction)
76
+ var(--sigvelo-motion-ease-change);
77
+ }
78
+
79
+ .sigvelo-scrollbar-on-hover:hover,
80
+ .sigvelo-scrollbar-on-hover:focus-within {
81
+ scrollbar-color: var(--sigvelo-color-neutral-border) transparent;
82
+ }
83
+ }
84
+
85
+ /*
86
+ * Comfortable reading measure for long-form agent output. Applied to the prose
87
+ * container, not the panel: the panel still fills the pane, the paragraphs stop
88
+ * at a readable line length inside it.
89
+ */
90
+ .sigvelo-measure {
91
+ max-inline-size: var(--sigvelo-measure-prose);
92
+ }
93
+
94
+ /* Code, tables, and diagrams read worse wrapped than wide, so they opt out of
95
+ the prose measure without leaving the same container. */
96
+ .sigvelo-measure-wide {
97
+ max-inline-size: var(--sigvelo-measure-wide-block);
98
+ }
99
+
100
+ /*
101
+ * Reader-controlled text size for prose. Scales the message body only —
102
+ * toolbars, labels, and controls keep resolving through the rem type ramp,
103
+ * because a reader asking for larger message text is not asking for a taller
104
+ * composer. Descendants that should scale with it must size in em.
105
+ */
106
+ .sigvelo-reader-text {
107
+ font-size: calc(1em * var(--sigvelo-chat-font-scale));
108
+ }
@@ -2,7 +2,7 @@
2
2
  display: flex;
3
3
  align-items: center;
4
4
  gap: var(--sigvelo-spacing-1-5);
5
- padding-block: 0.5rem;
5
+ padding-block: var(--sigvelo-spacing-2);
6
6
  padding-inline: var(--sigvelo-spacing-2-5);
7
7
  background-color: var(--sigvelo-color-neutral-bg-subtle);
8
8
  border-block-end: var(--sigvelo-border-style) var(--sigvelo-border-width)
@@ -40,7 +40,7 @@
40
40
  display: flex;
41
41
  align-items: center;
42
42
  justify-content: center;
43
- padding: 2rem;
43
+ padding: var(--sigvelo-spacing-8);
44
44
  color: var(--sigvelo-color-text-muted);
45
45
  font-size: var(--sigvelo-text-compact);
46
46
  text-align: center;
@@ -105,7 +105,7 @@
105
105
  .web-preview__console-item {
106
106
  display: grid;
107
107
  grid-template-columns: auto 1fr auto;
108
- gap: 0.5rem;
108
+ gap: var(--sigvelo-spacing-2);
109
109
  align-items: baseline;
110
110
  padding-block: var(--sigvelo-spacing-1-5);
111
111
  padding-inline: var(--sigvelo-spacing-3);
@@ -140,6 +140,6 @@
140
140
 
141
141
  @media (forced-colors: active) {
142
142
  .web-preview {
143
- border: 1px solid CanvasText;
143
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width) CanvasText;
144
144
  }
145
145
  }
@@ -10,11 +10,9 @@
10
10
  overflow: hidden;
11
11
  font-family: inherit;
12
12
  color: var(--sigvelo-color-text);
13
- background-color: var(--sigvelo-color-surface);
14
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
15
- var(--sigvelo-color-neutral-border-subtle);
13
+ background-color: var(--sigvelo-color-surface-raised);
16
14
  border-radius: var(--sigvelo-radius-xl);
17
- box-shadow: var(--sigvelo-shadow-xs);
15
+ box-shadow: var(--sigvelo-elevation-raised);
18
16
  container-type: inline-size;
19
17
  }
20
18
 
@@ -132,8 +130,8 @@
132
130
  z-index: 2;
133
131
  inset-block-start: calc(var(--sigvelo-density-compact-control-height) + var(--sigvelo-spacing-2));
134
132
  inset-inline-end: var(--sigvelo-spacing-2);
135
- background-color: var(--sigvelo-color-surface);
136
- box-shadow: var(--sigvelo-shadow-xs);
133
+ background-color: var(--sigvelo-color-surface-raised);
134
+ box-shadow: var(--sigvelo-elevation-floating);
137
135
  }
138
136
 
139
137
  .workspace-explorer__filter {
@@ -408,8 +406,8 @@
408
406
  }
409
407
 
410
408
  .workspace-explorer__image-trigger:focus-visible {
411
- outline: var(--sigvelo-focus-ring);
412
- outline-offset: var(--sigvelo-focus-offset);
409
+ outline: none;
410
+ box-shadow: var(--sigvelo-recipe-focus-shadow);
413
411
  }
414
412
 
415
413
  .workspace-explorer__image-trigger[aria-disabled="true"] {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-b/react-components",
3
- "version": "0.20.4",
3
+ "version": "0.21.0",
4
4
  "description": "MCP-B React components built on Base UI and shared design tokens, including Cloudflare Think chat primitives.",
5
5
  "homepage": "https://design-system.sigvelo.com",
6
6
  "bugs": {
@@ -57,7 +57,7 @@
57
57
  "streamdown": "^2.5.0",
58
58
  "unist-util-visit": "^5.1.0",
59
59
  "yet-another-react-lightbox": "^3.32.1",
60
- "@mcp-b/design-tokens": "0.20.4"
60
+ "@mcp-b/design-tokens": "0.21.0"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@ai-sdk/react": "^3.0.222",