@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
@@ -94,7 +94,7 @@
94
94
  .field__description {
95
95
  font-family: inherit;
96
96
  font-size: var(--sigvelo-text-xs);
97
- line-height: 1.4;
97
+ line-height: var(--sigvelo-leading-snug);
98
98
  color: var(--sigvelo-color-text-muted);
99
99
  margin: 0;
100
100
  }
@@ -102,7 +102,7 @@
102
102
  .field__error {
103
103
  font-family: inherit;
104
104
  font-size: var(--sigvelo-text-xs);
105
- line-height: 1.4;
105
+ line-height: var(--sigvelo-leading-snug);
106
106
  color: var(--sigvelo-color-danger-bg);
107
107
  margin: 0;
108
108
  opacity: 1;
@@ -34,11 +34,13 @@
34
34
  @import "./combobox.css" layer(components);
35
35
  @import "./context-menu.css" layer(components);
36
36
  @import "./dialog.css" layer(components);
37
+ @import "./empty-state.css" layer(components);
37
38
  @import "./field.css" layer(components);
38
39
  @import "./fieldset.css" layer(components);
39
40
  @import "./form.css" layer(components);
40
41
  @import "./github-motion-mark.css" layer(components);
41
42
  @import "./input.css" layer(components);
43
+ @import "./kbd.css" layer(components);
42
44
  @import "./label.css" layer(components);
43
45
  @import "./marker.css" layer(components);
44
46
  @import "./media-preview-card.css" layer(components);
@@ -61,6 +63,7 @@
61
63
  @import "./select.css" layer(components);
62
64
  @import "./separator.css" layer(components);
63
65
  @import "./slider.css" layer(components);
66
+ @import "./status-pill.css" layer(components);
64
67
  @import "./stepper.css" layer(components);
65
68
  @import "./switch.css" layer(components);
66
69
  @import "./tabs.css" layer(components);
@@ -81,7 +81,7 @@
81
81
  overflow-wrap: anywhere;
82
82
  color: var(--sigvelo-color-text-muted);
83
83
  font-size: var(--sigvelo-text-xs);
84
- line-height: 1.4;
84
+ line-height: var(--sigvelo-leading-snug);
85
85
  }
86
86
 
87
87
  .inline-citation__metadata {
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Everything here resolves from currentColor, which is what lets one chip work
3
+ * on a page surface and on the inverted surface of a tooltip. A fixed
4
+ * neutral background is legible on exactly one of those.
5
+ *
6
+ * Codex renders its keys at tertiary text and strips the shadow its base sheet
7
+ * applies, so the resting state here is quiet by default rather than quieted
8
+ * at each call site.
9
+ */
10
+ .kbd {
11
+ display: inline-flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ min-inline-size: var(--sigvelo-spacing-5);
15
+ padding-block: var(--sigvelo-spacing-0-5);
16
+ padding-inline: var(--sigvelo-spacing-1);
17
+ font-family: var(--sigvelo-font-mono);
18
+ /* em, not a type step: a key sits inside a label and should track whatever
19
+ size that label is set at. */
20
+ font-size: 0.75em;
21
+ line-height: var(--sigvelo-text-xs-leading);
22
+ /* currentcolor in the color property is the *inherited* color, so this dims
23
+ whatever the surface already set. In every declaration below it, though,
24
+ currentcolor is this new value — which is why nothing here names a
25
+ specific text token. Naming one would pin the chip to a light surface and
26
+ lose the tooltip. */
27
+ color: color-mix(in oklab, currentcolor, transparent 25%);
28
+ background-color: color-mix(in oklab, currentcolor, transparent 90%);
29
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width)
30
+ color-mix(in oklab, currentcolor, transparent 82%);
31
+ border-radius: var(--sigvelo-radius-sm);
32
+ white-space: nowrap;
33
+ }
34
+
35
+ @media (forced-colors: active) {
36
+ .kbd {
37
+ color: ButtonText;
38
+ border-color: ButtonText;
39
+ }
40
+ }
@@ -15,7 +15,7 @@
15
15
  }
16
16
 
17
17
  .media-preview-card:is(:hover, :focus-within) {
18
- box-shadow: var(--sigvelo-shadow-md);
18
+ box-shadow: var(--sigvelo-elevation-floating);
19
19
  }
20
20
 
21
21
  .media-preview-card:has(> :is(a, button):focus-visible) {
@@ -73,8 +73,10 @@
73
73
  var(--sigvelo-color-neutral-border);
74
74
  border-radius: var(--sigvelo-radius-full);
75
75
  color: var(--sigvelo-color-text);
76
- background: color-mix(in oklab, var(--sigvelo-color-surface), transparent 12%);
77
- box-shadow: var(--sigvelo-shadow-sm);
76
+ /* Sits over arbitrary artwork, so it keeps the hard border and takes the
77
+ translucent surface the glass token already defines. */
78
+ background: var(--sigvelo-color-surface-glass);
79
+ box-shadow: var(--sigvelo-elevation-floating);
78
80
  translate: -50% -50%;
79
81
  scale: 1;
80
82
  transition:
@@ -42,11 +42,11 @@
42
42
  .message-scroller__button {
43
43
  position: absolute;
44
44
  inset-inline-start: 50%;
45
- inset-block-end: var(--message-scroller-button-inset-block-end, 1rem);
45
+ inset-block-end: var(--message-scroller-button-inset-block-end, var(--sigvelo-spacing-4));
46
46
  z-index: 1;
47
47
  translate: -50% 0;
48
- border-radius: 999rem;
49
- box-shadow: var(--sigvelo-shadow-sm);
48
+ border-radius: var(--sigvelo-radius-full);
49
+ box-shadow: var(--sigvelo-elevation-floating);
50
50
  transition:
51
51
  opacity var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
52
52
  scale var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
@@ -54,7 +54,7 @@
54
54
  }
55
55
 
56
56
  .message-scroller__button[data-direction="start"] {
57
- inset-block-start: 1rem;
57
+ inset-block-start: var(--sigvelo-spacing-4);
58
58
  inset-block-end: auto;
59
59
  }
60
60
 
@@ -26,7 +26,7 @@
26
26
  padding-inline: var(--sigvelo-spacing-3);
27
27
  border-radius: var(--sigvelo-radius-lg);
28
28
  font-size: var(--sigvelo-text-sm);
29
- line-height: 1.55;
29
+ line-height: var(--sigvelo-leading-normal);
30
30
  background-color: var(--sigvelo-color-neutral-bg-subtle);
31
31
  color: var(--sigvelo-color-text);
32
32
  overflow-wrap: anywhere;
@@ -139,15 +139,13 @@
139
139
  inline-size: min(42rem, 85%);
140
140
  padding: var(--sigvelo-spacing-3);
141
141
  color: var(--sigvelo-color-text);
142
- background-color: var(--sigvelo-color-surface);
143
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
144
- var(--sigvelo-color-neutral-border-muted);
142
+ background-color: var(--sigvelo-color-surface-raised);
145
143
  border-radius: var(--sigvelo-radius-lg);
146
- box-shadow: var(--sigvelo-shadow-sm);
144
+ box-shadow: var(--sigvelo-elevation-raised);
147
145
  }
148
146
 
149
147
  .message__edit-textarea {
150
- min-block-size: 6rem;
148
+ min-block-size: var(--sigvelo-spacing-24);
151
149
  max-block-size: 18rem;
152
150
  }
153
151
 
@@ -112,7 +112,7 @@
112
112
 
113
113
  .model-selector__item:focus-visible {
114
114
  outline: none;
115
- box-shadow: inset 0 0 0 var(--sigvelo-focus-width) var(--sigvelo-color-focus);
115
+ box-shadow: var(--sigvelo-recipe-focus-shadow-inset);
116
116
  }
117
117
 
118
118
  .model-selector__item[data-selected] {
@@ -126,11 +126,7 @@
126
126
  }
127
127
 
128
128
  .model-selector__empty {
129
- padding-block: var(--sigvelo-spacing-4);
130
- padding-inline: var(--sigvelo-spacing-3);
131
- text-align: center;
132
- font-size: var(--sigvelo-text-compact);
133
- color: var(--sigvelo-color-text-muted);
129
+ --sigvelo-recipe-empty-state-padding-block: var(--sigvelo-spacing-4);
134
130
  }
135
131
 
136
132
  @media (any-pointer: coarse) {
@@ -166,10 +162,11 @@
166
162
  gap: var(--sigvelo-spacing-1);
167
163
  }
168
164
 
169
- .model-selector__shortcut {
165
+ /* Prose, not a key. The mono face was a leftover from when this was a <kbd>,
166
+ and "Workers AI" reads worse in it. */
167
+ .model-selector__source {
170
168
  padding-block: var(--sigvelo-spacing-0-5);
171
169
  padding-inline: var(--sigvelo-spacing-1-5);
172
- font-family: var(--sigvelo-font-mono);
173
170
  font-size: var(--sigvelo-text-2xs);
174
171
  color: var(--sigvelo-color-text-muted);
175
172
  background-color: var(--sigvelo-color-neutral-bg-subtle);
@@ -1,5 +1,5 @@
1
1
  .popover__backdrop {
2
- z-index: 50;
2
+ z-index: var(--sigvelo-z-overlay);
3
3
  background-color: color-mix(in oklab, var(--sigvelo-color-text), transparent 50%);
4
4
  }
5
5
 
@@ -17,7 +17,7 @@
17
17
  }
18
18
 
19
19
  .preview-card__backdrop {
20
- z-index: 50;
20
+ z-index: var(--sigvelo-z-overlay);
21
21
  }
22
22
 
23
23
  .preview-card__popup {
@@ -8,17 +8,17 @@
8
8
  gap: var(--sigvelo-density-compact-control-gap);
9
9
  padding-block: var(--sigvelo-spacing-2);
10
10
  padding-inline: var(--sigvelo-density-compact-control-padding-inline);
11
- background-color: var(--sigvelo-color-surface);
12
- /* Fields keep their border; hairline + soft shadow for the floating-composer look */
13
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
14
- var(--sigvelo-color-neutral-border-subtle);
11
+ background-color: var(--sigvelo-color-surface-raised);
12
+ /* The composer's edge is the hairline ring inside --sigvelo-elevation-floating,
13
+ not a border: a 0.5px ring stays crisp at any zoom and does not add a pixel
14
+ of layout. Forced colors restores a real border at the end of this file. */
15
+ border: 0;
15
16
  border-radius: calc(var(--sigvelo-radius-xl) + var(--sigvelo-spacing-2));
16
- box-shadow: var(--sigvelo-shadow-sm);
17
+ box-shadow: var(--sigvelo-elevation-floating);
17
18
  font-family: inherit;
18
19
  color: var(--sigvelo-color-text);
19
- transition:
20
- border-color var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
21
- box-shadow var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change);
20
+ transition: box-shadow var(--sigvelo-motion-duration-interaction)
21
+ var(--sigvelo-motion-ease-change);
22
22
  }
23
23
 
24
24
  .prompt-input__recording {
@@ -82,8 +82,7 @@
82
82
 
83
83
  /* Keep keyboard focus visible around the complete composer surface. */
84
84
  .prompt-input:focus-within {
85
- border-color: var(--sigvelo-color-focus);
86
- box-shadow: var(--sigvelo-recipe-focus-shadow-subtle);
85
+ box-shadow: var(--sigvelo-recipe-focus-shadow-subtle), var(--sigvelo-elevation-floating);
87
86
  }
88
87
 
89
88
  .prompt-input__header {
@@ -165,9 +164,13 @@
165
164
  background-color: color-mix(in oklab, transparent, var(--sigvelo-color-text) 8%);
166
165
  }
167
166
 
167
+ /* Absorbs any height the composer is given beyond its content, so a tall
168
+ composer grows its typing area and keeps the footer controls on the floor
169
+ instead of stranding them mid-box. */
168
170
  .prompt-input__body {
169
171
  display: flex;
170
172
  align-items: stretch;
173
+ flex: 1 1 auto;
171
174
  flex-wrap: wrap;
172
175
  gap: var(--sigvelo-spacing-1);
173
176
  inline-size: 100%;
@@ -276,10 +279,6 @@
276
279
  content: "";
277
280
  }
278
281
 
279
- .prompt-input__dictation[data-starting] .prompt-input__dictation-icon {
280
- animation: sigvelo-icon-spin 900ms linear infinite;
281
- }
282
-
283
282
  @media (prefers-reduced-motion: reduce) {
284
283
  .prompt-input__dictation[data-listening] .prompt-input__dictation-icon::before {
285
284
  transition: none;
@@ -295,19 +294,10 @@
295
294
  display: inline-block;
296
295
  }
297
296
 
297
+ /* Spacing only. The chip itself is .kbd, which derives from currentColor and
298
+ so already reads correctly against the tooltip's inverted surface. */
298
299
  .prompt-input__tooltip-shortcut {
299
- display: inline-flex;
300
- align-items: center;
301
- justify-content: center;
302
300
  margin-inline-start: var(--sigvelo-spacing-2);
303
- padding-block: 0.0625rem;
304
- padding-inline: var(--sigvelo-spacing-1);
305
- border: var(--sigvelo-border-width) solid color-mix(in oklab, currentColor, transparent 75%);
306
- border-radius: var(--sigvelo-radius-sm);
307
- font-family: var(--sigvelo-font-mono);
308
- font-size: 0.75em;
309
- font-weight: var(--sigvelo-font-weight-semibold);
310
- opacity: 0.85;
311
301
  }
312
302
 
313
303
  .prompt-input__submit {
@@ -321,10 +311,6 @@
321
311
  color: var(--sigvelo-color-text);
322
312
  }
323
313
 
324
- .prompt-input__submit-spinner {
325
- animation: sigvelo-icon-spin 900ms linear infinite;
326
- }
327
-
328
314
  .prompt-input__action-menu {
329
315
  min-inline-size: 12rem;
330
316
  }
@@ -475,17 +461,15 @@
475
461
 
476
462
  .prompt-input__hover-card-content {
477
463
  position: absolute;
478
- z-index: 20;
464
+ z-index: var(--sigvelo-z-chrome);
479
465
  inset-block-start: calc(100% + var(--sigvelo-spacing-1-5));
480
466
  inset-inline-start: 0;
481
467
  min-inline-size: 14rem;
482
468
  padding: var(--sigvelo-spacing-3);
483
469
  color: var(--sigvelo-color-text);
484
- background-color: var(--sigvelo-color-surface);
485
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
486
- var(--sigvelo-color-neutral-border-subtle);
470
+ background-color: var(--sigvelo-color-surface-raised);
487
471
  border-radius: var(--sigvelo-radius-md);
488
- box-shadow: var(--sigvelo-shadow-md);
472
+ box-shadow: var(--sigvelo-elevation-overlay);
489
473
  }
490
474
 
491
475
  .prompt-input__tab-label {
@@ -651,12 +635,6 @@
651
635
  margin-inline-start: auto;
652
636
  }
653
637
 
654
- @media (prefers-reduced-motion: reduce) {
655
- .prompt-input__submit-spinner {
656
- animation: none;
657
- }
658
- }
659
-
660
638
  @media (forced-colors: active) {
661
639
  .prompt-input {
662
640
  border: var(--sigvelo-border-style) var(--sigvelo-border-width) CanvasText;
@@ -142,7 +142,7 @@
142
142
  gap: var(--sigvelo-spacing-1);
143
143
  font-size: var(--sigvelo-text-sm);
144
144
  color: var(--sigvelo-color-text);
145
- line-height: 1.4;
145
+ line-height: var(--sigvelo-leading-snug);
146
146
  transition:
147
147
  color var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
148
148
  text-decoration-color var(--sigvelo-motion-duration-interaction)
@@ -153,7 +153,7 @@
153
153
  margin: 0;
154
154
  font-size: var(--sigvelo-text-xs);
155
155
  color: var(--sigvelo-color-text-muted);
156
- line-height: 1.4;
156
+ line-height: var(--sigvelo-leading-snug);
157
157
  transition:
158
158
  color var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
159
159
  text-decoration-color var(--sigvelo-motion-duration-interaction)
@@ -8,6 +8,7 @@
8
8
  --sigvelo-recipe-control-padding-inline: var(--sigvelo-density-compact-control-padding-inline);
9
9
  --sigvelo-recipe-control-gap: var(--sigvelo-density-compact-control-gap);
10
10
  --sigvelo-recipe-control-font-size: var(--sigvelo-density-compact-control-font-size);
11
+ --sigvelo-recipe-control-line-height: var(--sigvelo-density-compact-control-line-height);
11
12
  --sigvelo-recipe-control-icon-size: var(--sigvelo-density-compact-control-icon-size);
12
13
  --sigvelo-recipe-control-radius: var(--sigvelo-radius-md);
13
14
  --sigvelo-recipe-field-background: var(--sigvelo-color-canvas);
@@ -20,11 +21,17 @@
20
21
  --sigvelo-recipe-invalid-focus-shadow:
21
22
  0 0 0 2px var(--sigvelo-color-canvas),
22
23
  0 0 0 4px color-mix(in oklab, var(--sigvelo-color-danger-bg), transparent 80%);
24
+ /* The same ring drawn inward, for elements that fill their container and
25
+ have no room outside to grow one: menu items, tab panels, listbox rows. */
26
+ --sigvelo-recipe-focus-shadow-inset: inset 0 0 0 var(--sigvelo-focus-width)
27
+ var(--sigvelo-color-focus);
23
28
  --sigvelo-recipe-disabled-opacity: 0.5;
24
- --sigvelo-recipe-surface-background: var(--sigvelo-color-surface);
25
- --sigvelo-recipe-surface-border: var(--sigvelo-color-neutral-border-muted);
26
- --sigvelo-recipe-surface-radius: var(--sigvelo-radius-md);
27
- --sigvelo-recipe-surface-shadow: var(--sigvelo-shadow-lg);
29
+ --sigvelo-recipe-surface-background: var(--sigvelo-color-surface-raised);
30
+ /* The overlay elevation carries its own hairline ring, so the border is a
31
+ forced-colors affordance rather than the visible edge. */
32
+ --sigvelo-recipe-surface-border: transparent;
33
+ --sigvelo-recipe-surface-radius: var(--sigvelo-radius-lg);
34
+ --sigvelo-recipe-surface-shadow: var(--sigvelo-elevation-overlay);
28
35
  --sigvelo-recipe-surface-padding: var(--sigvelo-spacing-1);
29
36
  --sigvelo-recipe-popup-min-inline-size: 10rem;
30
37
  --sigvelo-recipe-popup-arrow-size: var(--sigvelo-spacing-3);
@@ -33,7 +40,8 @@
33
40
  --sigvelo-recipe-row-padding-inline: var(--sigvelo-density-compact-control-padding-inline);
34
41
  --sigvelo-recipe-row-gap: var(--sigvelo-density-compact-control-gap);
35
42
  --sigvelo-recipe-row-font-size: var(--sigvelo-density-compact-control-font-size);
36
- --sigvelo-recipe-row-radius: var(--sigvelo-radius-sm);
43
+ --sigvelo-recipe-row-line-height: var(--sigvelo-density-compact-control-line-height);
44
+ --sigvelo-recipe-row-radius: var(--sigvelo-radius-md);
37
45
  --sigvelo-recipe-group-label-padding-block: var(--sigvelo-spacing-1-5);
38
46
  --sigvelo-recipe-group-label-padding-inline: var(--sigvelo-recipe-row-padding-inline);
39
47
  --sigvelo-recipe-group-label-color: var(--sigvelo-color-text-muted);
@@ -46,6 +54,7 @@
46
54
  --sigvelo-recipe-control-height: var(--sigvelo-control-height-sm);
47
55
  --sigvelo-recipe-control-padding-inline: var(--sigvelo-control-padding-inline-sm);
48
56
  --sigvelo-recipe-control-font-size: var(--sigvelo-control-text-sm);
57
+ --sigvelo-recipe-control-line-height: var(--sigvelo-control-line-height-sm);
49
58
  --sigvelo-recipe-control-icon-size: var(--sigvelo-control-icon-size-sm);
50
59
  }
51
60
 
@@ -53,6 +62,7 @@
53
62
  --sigvelo-recipe-control-height: var(--sigvelo-control-height-md);
54
63
  --sigvelo-recipe-control-padding-inline: var(--sigvelo-control-padding-inline-md);
55
64
  --sigvelo-recipe-control-font-size: var(--sigvelo-control-text-md);
65
+ --sigvelo-recipe-control-line-height: var(--sigvelo-control-line-height-md);
56
66
  --sigvelo-recipe-control-icon-size: var(--sigvelo-control-icon-size-md);
57
67
  }
58
68
 
@@ -60,6 +70,7 @@
60
70
  --sigvelo-recipe-control-height: var(--sigvelo-control-height-lg);
61
71
  --sigvelo-recipe-control-padding-inline: var(--sigvelo-control-padding-inline-lg);
62
72
  --sigvelo-recipe-control-font-size: var(--sigvelo-control-text-lg);
73
+ --sigvelo-recipe-control-line-height: var(--sigvelo-control-line-height-lg);
63
74
  --sigvelo-recipe-control-icon-size: var(--sigvelo-control-icon-size-lg);
64
75
  }
65
76
 
@@ -97,13 +108,14 @@
97
108
  */
98
109
  :where([data-recipe~="composer-command-surface"]) {
99
110
  --sigvelo-recipe-surface-radius: var(--sigvelo-radius-xl);
100
- --sigvelo-recipe-surface-shadow: var(--sigvelo-shadow-xl);
111
+ --sigvelo-recipe-surface-shadow: var(--sigvelo-elevation-overlay);
101
112
  --sigvelo-recipe-surface-padding: var(--sigvelo-spacing-1);
102
113
  --sigvelo-recipe-row-min-height: var(--sigvelo-density-compact-control-height);
103
114
  --sigvelo-recipe-row-padding-block: var(--sigvelo-spacing-1);
104
115
  --sigvelo-recipe-row-padding-inline: var(--sigvelo-density-compact-control-padding-inline);
105
116
  --sigvelo-recipe-row-gap: var(--sigvelo-density-compact-control-gap);
106
117
  --sigvelo-recipe-row-font-size: var(--sigvelo-density-compact-control-font-size);
118
+ --sigvelo-recipe-row-line-height: var(--sigvelo-density-compact-control-line-height);
107
119
  --sigvelo-recipe-row-radius: var(--sigvelo-radius-md);
108
120
  --sigvelo-recipe-group-label-padding-block: var(--sigvelo-spacing-2);
109
121
  --sigvelo-recipe-group-label-padding-inline: var(
@@ -170,6 +182,47 @@
170
182
  mask-repeat: no-repeat;
171
183
  }
172
184
 
185
+ /* The inline-axis partner, for toolbars, tab strips, and chip rows that scroll
186
+ sideways. Gradients take physical directions only, so start/end are swapped
187
+ under [dir="rtl"] rather than expressed logically. */
188
+ :where([data-recipe~="scroll-fade-x"]) {
189
+ --sigvelo-scroll-fade-start: 0px;
190
+ --sigvelo-scroll-fade-end: 0px;
191
+ -webkit-mask-image: linear-gradient(
192
+ to right,
193
+ transparent 0,
194
+ #000 var(--sigvelo-scroll-fade-start),
195
+ #000 calc(100% - var(--sigvelo-scroll-fade-end)),
196
+ transparent 100%
197
+ );
198
+ mask-image: linear-gradient(
199
+ to right,
200
+ transparent 0,
201
+ #000 var(--sigvelo-scroll-fade-start),
202
+ #000 calc(100% - var(--sigvelo-scroll-fade-end)),
203
+ transparent 100%
204
+ );
205
+ -webkit-mask-repeat: no-repeat;
206
+ mask-repeat: no-repeat;
207
+ }
208
+
209
+ :where([dir="rtl"] [data-recipe~="scroll-fade-x"], [data-recipe~="scroll-fade-x"][dir="rtl"]) {
210
+ -webkit-mask-image: linear-gradient(
211
+ to left,
212
+ transparent 0,
213
+ #000 var(--sigvelo-scroll-fade-start),
214
+ #000 calc(100% - var(--sigvelo-scroll-fade-end)),
215
+ transparent 100%
216
+ );
217
+ mask-image: linear-gradient(
218
+ to left,
219
+ transparent 0,
220
+ #000 var(--sigvelo-scroll-fade-start),
221
+ #000 calc(100% - var(--sigvelo-scroll-fade-end)),
222
+ transparent 100%
223
+ );
224
+ }
225
+
173
226
  @media (any-pointer: coarse) {
174
227
  :where(:root, [data-theme="light"], [data-theme="dark"]) {
175
228
  --sigvelo-recipe-row-min-height: var(--sigvelo-control-height-xl);
@@ -208,7 +261,7 @@
208
261
  padding-inline: var(--sigvelo-recipe-control-padding-inline);
209
262
  font-family: inherit;
210
263
  font-size: var(--sigvelo-recipe-control-font-size);
211
- line-height: var(--sigvelo-leading-compact);
264
+ line-height: var(--sigvelo-recipe-control-line-height);
212
265
  color: var(--sigvelo-color-text);
213
266
  background-color: var(--sigvelo-recipe-field-background);
214
267
  border: var(--sigvelo-border-style) var(--sigvelo-border-width) var(--sigvelo-recipe-field-border);
@@ -355,7 +408,7 @@
355
408
  padding-inline: var(--sigvelo-recipe-row-padding-inline);
356
409
  font-family: inherit;
357
410
  font-size: var(--sigvelo-recipe-row-font-size);
358
- line-height: var(--sigvelo-leading-compact);
411
+ line-height: var(--sigvelo-recipe-row-line-height);
359
412
  color: var(--sigvelo-color-text);
360
413
  text-decoration: none;
361
414
  border-radius: var(--sigvelo-recipe-row-radius);
@@ -520,7 +573,7 @@
520
573
  font-family: inherit;
521
574
  font-size: var(--sigvelo-recipe-control-font-size);
522
575
  font-weight: var(--sigvelo-font-weight-semibold);
523
- line-height: var(--sigvelo-leading-compact);
576
+ line-height: var(--sigvelo-recipe-control-line-height);
524
577
  color: var(--sigvelo-color-text);
525
578
  background-color: var(--sigvelo-color-canvas);
526
579
  border: var(--sigvelo-border-style) var(--sigvelo-border-width)
@@ -755,6 +808,12 @@
755
808
  }
756
809
 
757
810
  @media (forced-colors: active) {
811
+ /* Forced colors drops box-shadow, taking the hairline ring that normally
812
+ draws an overlay's edge with it. Give the border back its color. */
813
+ :where(:root, [data-theme="light"], [data-theme="dark"]) {
814
+ --sigvelo-recipe-surface-border: CanvasText;
815
+ }
816
+
758
817
  :where(
759
818
  [data-slot="input"],
760
819
  [data-slot="select-trigger"],
@@ -7,7 +7,7 @@
7
7
  .resizable-side-panel__handle {
8
8
  position: absolute;
9
9
  inset-block: 0;
10
- z-index: 25;
10
+ z-index: var(--sigvelo-z-panel);
11
11
  inline-size: var(--sigvelo-spacing-6);
12
12
  padding: 0;
13
13
  border: 0;
@@ -57,7 +57,7 @@
57
57
  }
58
58
 
59
59
  .responsive-sidebar-shell__resizer {
60
- z-index: 25;
60
+ z-index: var(--sigvelo-z-panel);
61
61
  }
62
62
 
63
63
  .responsive-sidebar-shell[data-sidebar-open="false"] > .responsive-sidebar-shell__frame {
@@ -94,7 +94,7 @@
94
94
 
95
95
  .responsive-sidebar-shell__sidebar {
96
96
  position: relative;
97
- z-index: 23;
97
+ z-index: calc(var(--sigvelo-z-chrome) + 3);
98
98
  inset-inline-start: 50%;
99
99
  inline-size: min(calc(100cqi - var(--sigvelo-spacing-3)), 34rem);
100
100
  max-inline-size: none;
@@ -103,10 +103,9 @@
103
103
  align-self: start;
104
104
  margin-block-start: var(--sigvelo-spacing-1);
105
105
  overflow: hidden;
106
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
107
- var(--sigvelo-color-neutral-border-subtle);
108
106
  border-radius: var(--sigvelo-radius-lg);
109
- box-shadow: var(--sigvelo-shadow-md);
107
+ background-color: var(--sigvelo-color-surface-raised);
108
+ box-shadow: var(--sigvelo-elevation-overlay);
110
109
  visibility: visible;
111
110
  opacity: 1;
112
111
  translate: -50% 0;
@@ -149,7 +148,7 @@
149
148
  position: absolute;
150
149
  inset-block: 0;
151
150
  inset-inline: 0;
152
- z-index: 22;
151
+ z-index: calc(var(--sigvelo-z-chrome) + 2);
153
152
  display: block;
154
153
  min-inline-size: 100%;
155
154
  padding: 0;
@@ -1,12 +1,41 @@
1
- :where(.message__content pre, .observability-table-wrap) {
1
+ /*
2
+ * Thin scrollbars on every scroll container the system owns.
3
+ *
4
+ * A default platform scrollbar inside a 15px-radius popup is the single
5
+ * loudest thing on the screen, so menus, lists, panels, and code blocks all
6
+ * take the same quiet treatment: thin, colored from the neutral ramp, and
7
+ * gutter-stable where a scrollbar appearing would otherwise shift text.
8
+ *
9
+ * Only containers that actually scroll are listed. Adding one means adding it
10
+ * here, not restating scrollbar-color in the component file.
11
+ */
12
+ :where(
13
+ .message__content pre,
14
+ .observability-table-wrap,
15
+ [data-recipe~="wide-scroll-picker"],
16
+ [data-slot="autocomplete-list"],
17
+ [data-slot="combobox-list"],
18
+ [data-slot="context-menu-content"],
19
+ [data-slot="dialog-content"],
20
+ [data-slot="dropdown-menu-content"],
21
+ [data-slot="menubar-content"],
22
+ [data-slot="popover-content"],
23
+ [data-slot="select-content"]
24
+ ) {
2
25
  --scrollbar-thumb: var(--app-scrollbar-thumb, var(--sigvelo-color-neutral-border-muted));
3
- --scrollbar-track: var(--app-scrollbar-track, var(--sigvelo-color-neutral-bg-subtle));
26
+ --scrollbar-track: var(--app-scrollbar-track, transparent);
4
27
 
5
28
  scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
6
- scrollbar-gutter: stable;
7
29
  scrollbar-width: thin;
8
30
  }
9
31
 
32
+ /* Reserving the gutter only matters where text would otherwise reflow. */
33
+ :where(.message__content pre, .observability-table-wrap) {
34
+ --scrollbar-track: var(--app-scrollbar-track, var(--sigvelo-color-neutral-bg-subtle));
35
+
36
+ scrollbar-gutter: stable;
37
+ }
38
+
10
39
  :where(.message__content pre) {
11
40
  overflow-x: auto;
12
41
  overflow-y: clip;
@@ -67,7 +67,7 @@
67
67
  .sources__link-description {
68
68
  font-size: var(--sigvelo-text-xs);
69
69
  color: var(--sigvelo-color-text-muted);
70
- line-height: 1.4;
70
+ line-height: var(--sigvelo-leading-snug);
71
71
  overflow: hidden;
72
72
  text-overflow: ellipsis;
73
73
  display: -webkit-box;
@@ -0,0 +1,39 @@
1
+ /*
2
+ * The chip itself is `.badge`. Only the indicator lives here.
3
+ */
4
+ .status-pill__dot {
5
+ inline-size: var(--sigvelo-spacing-1-5);
6
+ block-size: var(--sigvelo-spacing-1-5);
7
+ flex-shrink: 0;
8
+ border-radius: var(--sigvelo-radius-circle);
9
+ /* currentColor, so the dot follows whichever badge color it was given rather
10
+ than needing a matching set of its own. */
11
+ background-color: currentColor;
12
+ }
13
+
14
+ .status-pill[data-busy] .status-pill__dot {
15
+ animation: sigvelo-status-pulse var(--sigvelo-motion-duration-pulse) ease-in-out infinite;
16
+ }
17
+
18
+ @keyframes sigvelo-status-pulse {
19
+ 0%,
20
+ 100% {
21
+ opacity: 1;
22
+ }
23
+
24
+ 50% {
25
+ opacity: 0.4;
26
+ }
27
+ }
28
+
29
+ /* The dot stays; only its breathing stops. A still dot still reads as a state
30
+ indicator, which is the part carrying meaning. */
31
+ @media (prefers-reduced-motion: reduce) {
32
+ .status-pill[data-busy] .status-pill__dot {
33
+ animation: none;
34
+ }
35
+ }
36
+
37
+ :root[data-motion="reduce"] .status-pill[data-busy] .status-pill__dot {
38
+ animation: none;
39
+ }