@mcp-b/react-components 0.20.5 → 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 (116) 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/ModelSelector.d.ts +10 -4
  29. package/dist/components/ModelSelector.js +2 -2
  30. package/dist/components/PricingBillingToggle.js +1 -0
  31. package/dist/components/PromptInput.js +3 -2
  32. package/dist/components/Reasoning.js +1 -1
  33. package/dist/components/StatusPill.d.ts +43 -0
  34. package/dist/components/StatusPill.js +35 -0
  35. package/dist/components/ThinkChat.d.ts +9 -3
  36. package/dist/components/ThinkChatActivity.d.ts +2 -2
  37. package/dist/components/ThinkChatActivity.js +27 -15
  38. package/dist/components/ThinkChatActivitySummary.d.ts +2 -2
  39. package/dist/components/ThinkChatActivitySummary.js +67 -64
  40. package/dist/components/ThinkExecutionDetail.js +4 -4
  41. package/dist/components/ThinkExecutionWorkbench.js +5 -4
  42. package/dist/components/ThinkFullAppViewSwitch.d.ts +1 -1
  43. package/dist/components/ThinkRoutineBrowser.js +1 -0
  44. package/dist/components/ThinkRoutineRuns.js +3 -2
  45. package/dist/components/ThinkThreadPicker.js +3 -2
  46. package/dist/components/ToggleGroup.d.ts +1 -1
  47. package/dist/components/ToggleGroup.js +54 -7
  48. package/dist/components/ToolInvocation.js +1 -1
  49. package/dist/styles/activity-header.css +41 -10
  50. package/dist/styles/activity.css +26 -4
  51. package/dist/styles/agent-activity-preview-overlay.css +39 -12
  52. package/dist/styles/agent-activity-preview.css +31 -30
  53. package/dist/styles/agent-attention.css +2 -2
  54. package/dist/styles/agent-chat.css +199 -0
  55. package/dist/styles/agent-connection.css +8 -8
  56. package/dist/styles/alert-dialog.css +5 -2
  57. package/dist/styles/app-top-bar.css +4 -4
  58. package/dist/styles/approval.css +1 -7
  59. package/dist/styles/artifact.css +4 -4
  60. package/dist/styles/base-ui-motion.css +1 -1
  61. package/dist/styles/base.css +95 -3
  62. package/dist/styles/browser-control-overlay.css +16 -7
  63. package/dist/styles/browser-live-view.css +5 -38
  64. package/dist/styles/browser-replay.css +2 -6
  65. package/dist/styles/browser-run-panel.css +4 -18
  66. package/dist/styles/button.css +3 -1
  67. package/dist/styles/card.css +4 -4
  68. package/dist/styles/chain-of-thought.css +0 -1
  69. package/dist/styles/chatgpt-sign-in-screen.css +7 -5
  70. package/dist/styles/checkbox-group.css +3 -3
  71. package/dist/styles/code-block.css +4 -4
  72. package/dist/styles/context-menu.css +1 -1
  73. package/dist/styles/conversation.css +7 -42
  74. package/dist/styles/description-list.css +2 -2
  75. package/dist/styles/dialog.css +17 -2
  76. package/dist/styles/empty-state.css +48 -0
  77. package/dist/styles/environment-variables.css +4 -4
  78. package/dist/styles/field.css +2 -2
  79. package/dist/styles/index.css +3 -0
  80. package/dist/styles/inline-citation.css +1 -1
  81. package/dist/styles/kbd.css +40 -0
  82. package/dist/styles/media-preview-card.css +5 -3
  83. package/dist/styles/message-scroller.css +4 -4
  84. package/dist/styles/message.css +4 -6
  85. package/dist/styles/model-selector.css +5 -8
  86. package/dist/styles/popover.css +1 -1
  87. package/dist/styles/preview-card.css +1 -1
  88. package/dist/styles/prompt-input.css +18 -40
  89. package/dist/styles/queue.css +2 -2
  90. package/dist/styles/recipes.css +68 -9
  91. package/dist/styles/resizable-side-panel.css +1 -1
  92. package/dist/styles/responsive-sidebar-shell.css +5 -6
  93. package/dist/styles/scrollbars.css +32 -3
  94. package/dist/styles/sources.css +1 -1
  95. package/dist/styles/status-pill.css +39 -0
  96. package/dist/styles/stepper.css +2 -2
  97. package/dist/styles/streamdown.css +13 -12
  98. package/dist/styles/subagent-run.css +3 -3
  99. package/dist/styles/switch.css +1 -3
  100. package/dist/styles/tabs.css +1 -1
  101. package/dist/styles/task.css +1 -1
  102. package/dist/styles/terminal.css +2 -2
  103. package/dist/styles/test-results.css +1 -2
  104. package/dist/styles/textarea.css +1 -1
  105. package/dist/styles/theme-mode-control.css +1 -1
  106. package/dist/styles/think-execution-status.css +4 -23
  107. package/dist/styles/think-execution-workbench.css +2 -3
  108. package/dist/styles/think-full-app.css +2 -2
  109. package/dist/styles/think-routine-library.css +14 -16
  110. package/dist/styles/think-thread-picker.css +8 -25
  111. package/dist/styles/toast.css +2 -2
  112. package/dist/styles/toggle-group.css +76 -3
  113. package/dist/styles/tooltip.css +1 -2
  114. package/dist/styles/utilities.css +73 -0
  115. package/dist/styles/workspace-explorer.css +4 -6
  116. package/package.json +2 -2
@@ -119,7 +119,7 @@
119
119
  }
120
120
 
121
121
  .stepper__indicator[data-loading] .stepper__indicator-content {
122
- animation: sigvelo-icon-spin 800ms linear infinite;
122
+ animation: sigvelo-icon-spin var(--sigvelo-motion-duration-spin) linear infinite;
123
123
  }
124
124
 
125
125
  .stepper__separator {
@@ -170,7 +170,7 @@
170
170
  margin-block-start: calc(var(--sigvelo-spacing-1) - var(--sigvelo-border-width));
171
171
  color: var(--sigvelo-color-text-muted);
172
172
  font-size: var(--sigvelo-text-compact);
173
- line-height: 1.35;
173
+ line-height: var(--sigvelo-leading-snug);
174
174
  }
175
175
 
176
176
  .stepper__panel {
@@ -39,7 +39,7 @@ button[data-streamdown="link"] {
39
39
  }
40
40
 
41
41
  [data-streamdown="inline-code"] {
42
- padding-block: 0.0625rem;
42
+ padding-block: 1px;
43
43
  padding-inline: var(--sigvelo-spacing-1);
44
44
  border-radius: var(--sigvelo-radius-xs);
45
45
  background-color: var(--sigvelo-color-neutral-bg-subtle);
@@ -62,14 +62,15 @@ button[data-streamdown="link"] {
62
62
  [data-streamdown="heading-5"],
63
63
  [data-streamdown="heading-6"] {
64
64
  margin-block: var(--sigvelo-spacing-3) var(--sigvelo-spacing-1-5);
65
- font-size: 1.125em;
65
+ font-size: var(--sigvelo-text-base);
66
66
  font-weight: var(--sigvelo-font-weight-semibold);
67
- line-height: var(--sigvelo-leading-compact);
67
+ line-height: var(--sigvelo-text-base-leading);
68
68
  }
69
69
 
70
70
  [data-streamdown="heading-1"],
71
71
  [data-streamdown="heading-2"] {
72
- font-size: 1.25em;
72
+ font-size: var(--sigvelo-text-lg);
73
+ line-height: var(--sigvelo-text-lg-leading);
73
74
  }
74
75
 
75
76
  [data-streamdown="blockquote"] {
@@ -222,7 +223,7 @@ button[data-streamdown="link"] {
222
223
  background-color: transparent;
223
224
  font-family: var(--sigvelo-font-mono);
224
225
  font-size: var(--sigvelo-text-compact);
225
- line-height: 1.55;
226
+ line-height: var(--sigvelo-leading-normal);
226
227
  overflow: visible;
227
228
  }
228
229
 
@@ -288,7 +289,7 @@ button[data-streamdown="link"] {
288
289
  [data-streamdown="table-fullscreen"] {
289
290
  position: fixed;
290
291
  inset: 0;
291
- z-index: 50;
292
+ z-index: var(--sigvelo-z-overlay);
292
293
  background-color: var(--sigvelo-color-surface);
293
294
  }
294
295
 
@@ -343,17 +344,17 @@ button[data-streamdown="link"] {
343
344
  position: absolute;
344
345
  top: 100%;
345
346
  right: 0;
346
- z-index: 20;
347
+ z-index: var(--sigvelo-z-chrome);
347
348
  display: flex;
348
349
  flex-direction: column;
349
350
  min-width: 7.5rem;
350
351
  margin-block-start: var(--sigvelo-spacing-1);
351
352
  overflow: hidden;
352
- border-radius: var(--sigvelo-radius-md);
353
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
354
- var(--sigvelo-color-neutral-border-subtle);
355
- background-color: var(--sigvelo-color-surface);
356
- box-shadow: var(--sigvelo-shadow-md);
353
+ /* Draws its edge from the overlay ring at the same radius as every other
354
+ popup in the system, rather than from a 1px border of its own. */
355
+ border-radius: var(--sigvelo-radius-lg);
356
+ background-color: var(--sigvelo-color-surface-raised);
357
+ box-shadow: var(--sigvelo-elevation-overlay);
357
358
  }
358
359
 
359
360
  :is(
@@ -38,7 +38,7 @@
38
38
  .subagent-run__tray-label {
39
39
  color: var(--sigvelo-color-text-muted);
40
40
  font-size: var(--sigvelo-text-xs);
41
- line-height: 1.4;
41
+ line-height: var(--sigvelo-leading-snug);
42
42
  }
43
43
 
44
44
  .subagent-run__title {
@@ -57,8 +57,8 @@
57
57
  flex: 0 0 auto;
58
58
  align-items: center;
59
59
  justify-content: center;
60
- inline-size: 1rem;
61
- block-size: 1rem;
60
+ inline-size: var(--sigvelo-control-icon-size-md);
61
+ block-size: var(--sigvelo-control-icon-size-md);
62
62
  color: var(--sigvelo-color-text-muted);
63
63
  }
64
64
 
@@ -80,9 +80,7 @@
80
80
  block-size: var(--sigvelo-recipe-switch-thumb-size);
81
81
  background-color: var(--sigvelo-color-canvas);
82
82
  border-radius: var(--sigvelo-radius-full);
83
- box-shadow:
84
- 0 1px 3px 0 color-mix(in oklab, var(--sigvelo-color-text), transparent 90%),
85
- 0 1px 2px -1px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%);
83
+ box-shadow: var(--sigvelo-elevation-raised);
86
84
  translate: 0;
87
85
  transition: translate var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change);
88
86
  }
@@ -186,7 +186,7 @@
186
186
 
187
187
  .tabs__panel:focus-visible {
188
188
  outline: none;
189
- box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--sigvelo-color-focus), transparent 80%);
189
+ box-shadow: var(--sigvelo-recipe-focus-shadow-inset);
190
190
  border-radius: var(--sigvelo-radius-md);
191
191
  }
192
192
 
@@ -72,7 +72,7 @@
72
72
  position: relative;
73
73
  font-size: var(--sigvelo-text-compact);
74
74
  color: var(--sigvelo-color-text);
75
- line-height: var(--sigvelo-leading-body);
75
+ line-height: var(--sigvelo-leading-relaxed);
76
76
  }
77
77
 
78
78
  .task__item::before {
@@ -51,7 +51,7 @@
51
51
  width: 100%;
52
52
  height: 100%;
53
53
  padding-block: var(--sigvelo-spacing-2-5);
54
- padding-inline: 0.875rem;
54
+ padding-inline: var(--sigvelo-spacing-3-5);
55
55
  overflow: auto;
56
56
  }
57
57
 
@@ -59,7 +59,7 @@
59
59
  margin: 0;
60
60
  font-family: var(--sigvelo-font-mono);
61
61
  font-size: var(--sigvelo-text-xs);
62
- line-height: var(--sigvelo-leading-body);
62
+ line-height: var(--sigvelo-leading-relaxed);
63
63
  color: var(--sigvelo-color-neutral-100);
64
64
  white-space: pre-wrap;
65
65
  word-break: break-word;
@@ -188,7 +188,6 @@
188
188
 
189
189
  .test-results__test-status--running {
190
190
  color: var(--sigvelo-color-primary-text);
191
- animation: sigvelo-icon-spin 1.4s linear infinite;
192
191
  }
193
192
 
194
193
  .test-results__test-name {
@@ -226,7 +225,7 @@
226
225
  padding-inline: var(--sigvelo-spacing-3);
227
226
  font-family: var(--sigvelo-font-mono);
228
227
  font-size: var(--sigvelo-text-2xs);
229
- line-height: 1.55;
228
+ line-height: var(--sigvelo-leading-normal);
230
229
  color: var(--sigvelo-color-danger-text);
231
230
  background-color: var(--sigvelo-color-danger-bg-subtle);
232
231
  border: var(--sigvelo-border-style) var(--sigvelo-border-width)
@@ -1,7 +1,7 @@
1
1
  .textarea {
2
2
  inline-size: 100%;
3
3
  block-size: auto;
4
- min-block-size: 5rem;
4
+ min-block-size: var(--sigvelo-spacing-20);
5
5
  padding-block: var(--sigvelo-spacing-2);
6
6
  line-height: var(--sigvelo-leading-relaxed);
7
7
  }
@@ -12,7 +12,7 @@
12
12
  .theme-mode-control__item.radio {
13
13
  display: inline-flex;
14
14
  inline-size: auto;
15
- min-inline-size: 2.75rem;
15
+ min-inline-size: var(--sigvelo-spacing-11);
16
16
  block-size: 2.75rem;
17
17
  align-items: center;
18
18
  justify-content: center;
@@ -18,26 +18,7 @@
18
18
  color: var(--sigvelo-color-primary-text);
19
19
  }
20
20
 
21
- .think-execution-status:is(
22
- [data-status="running"],
23
- [data-status="pending"],
24
- [data-status="queued"],
25
- [data-status="waitingForPause"],
26
- [data-status="rollingBack"]
27
- )
28
- svg {
29
- animation: sigvelo-icon-spin 0.8s linear infinite;
30
- }
31
-
32
- @media (prefers-reduced-motion: reduce) {
33
- .think-execution-status:is(
34
- [data-status="running"],
35
- [data-status="pending"],
36
- [data-status="queued"],
37
- [data-status="waitingForPause"],
38
- [data-status="rollingBack"]
39
- )
40
- svg {
41
- animation: none;
42
- }
43
- }
21
+ /* Nothing spins the icon here. Exactly the statuses this file used to list are
22
+ the ones that resolve to the primary tone, and the primary tone renders
23
+ SpinnerIcon, which already spins itself and already stops under reduced
24
+ motion. The list was a copy of that mapping that could drift away from it. */
@@ -80,10 +80,9 @@
80
80
  }
81
81
 
82
82
  .think-execution-workbench__empty {
83
+ --sigvelo-recipe-empty-state-padding-block: var(--sigvelo-spacing-2-5);
84
+
83
85
  margin: var(--sigvelo-spacing-3);
84
- padding: var(--sigvelo-spacing-2-5) 0;
85
- color: var(--sigvelo-color-text-muted);
86
- font-size: var(--sigvelo-text-compact);
87
86
  }
88
87
 
89
88
  .think-execution-workbench__list {
@@ -61,7 +61,7 @@
61
61
  .think-full-app > .think-full-app__app-bar {
62
62
  grid-column: 1 / -1;
63
63
  grid-row: 1;
64
- z-index: 20;
64
+ z-index: var(--sigvelo-z-chrome);
65
65
  }
66
66
 
67
67
  .think-full-app__chat-surface {
@@ -267,7 +267,7 @@ body.is-resizing-side-panel .think-full-app__view-scope {
267
267
  }
268
268
 
269
269
  .think-full-app .message__content {
270
- line-height: 1.45;
270
+ line-height: var(--sigvelo-leading-normal);
271
271
  }
272
272
 
273
273
  .think-full-app .message[data-from="user"] .message__content {
@@ -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;
@@ -243,7 +243,7 @@
243
243
  .think-routine-library__detail-header h1,
244
244
  .think-routine-library__create-header h1 {
245
245
  font-size: clamp(var(--sigvelo-text-lg), 2.5vw, var(--sigvelo-text-2xl));
246
- line-height: 1.12;
246
+ line-height: var(--sigvelo-leading-tight);
247
247
  }
248
248
 
249
249
  .think-routine-library__detail-heading > p:last-child,
@@ -262,7 +262,7 @@
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
 
@@ -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
  }
@@ -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
  }
@@ -112,7 +108,7 @@
112
108
 
113
109
  .think-thread-picker__list {
114
110
  display: grid;
115
- gap: 0.0625rem;
111
+ gap: 1px;
116
112
  margin: 0;
117
113
  padding: 0;
118
114
  list-style: none;
@@ -252,8 +248,8 @@
252
248
  display: inline-flex;
253
249
  align-items: center;
254
250
  justify-content: center;
255
- inline-size: 1rem;
256
- block-size: 1rem;
251
+ inline-size: var(--sigvelo-control-icon-size-md);
252
+ block-size: var(--sigvelo-control-icon-size-md);
257
253
  color: var(--sigvelo-color-text-muted);
258
254
  }
259
255
 
@@ -271,20 +267,10 @@
271
267
  color: var(--sigvelo-color-primary-text);
272
268
  }
273
269
 
274
- .think-thread-picker__thread[data-thread-status="pending"] .think-thread-picker__thread-status svg,
275
- .think-thread-picker__thread[data-thread-status="running"] .think-thread-picker__thread-status svg,
276
- .think-thread-picker__thread[data-thread-status="starting"] .think-thread-picker__thread-status svg,
277
- .think-thread-picker__thread[data-thread-status="streaming"]
278
- .think-thread-picker__thread-status
279
- svg,
280
- .think-thread-picker__thread[data-thread-status="submitted"]
281
- .think-thread-picker__thread-status
282
- svg,
283
- .think-thread-picker__thread[data-thread-status="recovering"]
284
- .think-thread-picker__thread-status
285
- svg {
286
- animation: sigvelo-icon-spin 900ms linear infinite;
287
- }
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. */
288
274
 
289
275
  .think-thread-picker__thread[data-thread-status="error"] .think-thread-picker__thread-status {
290
276
  color: var(--sigvelo-color-danger-text);
@@ -298,9 +284,6 @@
298
284
 
299
285
  .think-thread-picker__empty {
300
286
  margin: var(--sigvelo-spacing-2);
301
- color: var(--sigvelo-color-text-muted);
302
- font-size: var(--sigvelo-text-compact);
303
- line-height: var(--sigvelo-leading-snug);
304
287
  }
305
288
 
306
289
  .think-thread-picker__footer {
@@ -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
+ }
@@ -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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-b/react-components",
3
- "version": "0.20.5",
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.5"
60
+ "@mcp-b/design-tokens": "0.21.0"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@ai-sdk/react": "^3.0.222",