@mcp-b/react-components 0.1.5 → 0.2.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 (101) hide show
  1. package/dist/{CodeBlock-CttHhWcb.js → CodeBlock-BrCoypnc.js} +2 -2
  2. package/dist/Combobox-D9anamNr.d.ts +177 -0
  3. package/dist/Menu-B5vDqZe_.d.ts +395 -0
  4. package/dist/Tabs-D9EAq09D.d.ts +84 -0
  5. package/dist/components/Activity.d.ts +148 -0
  6. package/dist/components/Activity.js +177 -0
  7. package/dist/components/AgentChat.d.ts +61 -0
  8. package/dist/components/AgentChat.js +91 -0
  9. package/dist/components/AgentConnection.js +2 -2
  10. package/dist/components/Artifact.js +1 -1
  11. package/dist/components/ChainOfThought.d.ts +1 -11
  12. package/dist/components/ChainOfThought.js +2 -2
  13. package/dist/components/CodeBlock.js +1 -1
  14. package/dist/components/Combobox.d.ts +1 -176
  15. package/dist/components/Commit.d.ts +1 -1
  16. package/dist/components/Commit.js +3 -3
  17. package/dist/components/ContextMenu.js +1 -1
  18. package/dist/components/Conversation.js +11 -8
  19. package/dist/components/Dialog.js +1 -1
  20. package/dist/components/EnvironmentVariables.js +1 -1
  21. package/dist/components/FileTree.js +1 -1
  22. package/dist/components/Menu.d.ts +1 -394
  23. package/dist/components/Menubar.js +1 -1
  24. package/dist/components/Message.js +1 -1
  25. package/dist/components/ModelSelector.js +1 -1
  26. package/dist/components/NavigationMenu.js +1 -1
  27. package/dist/components/PricingPage.js +1 -1
  28. package/dist/components/PromptInput.d.ts +4 -4
  29. package/dist/components/PromptInput.js +2 -2
  30. package/dist/components/Queue.d.ts +1 -1
  31. package/dist/components/Queue.js +2 -2
  32. package/dist/components/Reasoning.js +2 -2
  33. package/dist/components/Select.js +1 -1
  34. package/dist/components/Sources.js +2 -2
  35. package/dist/components/Stepper.js +1 -1
  36. package/dist/components/Tabs.d.ts +1 -83
  37. package/dist/components/Task.js +2 -2
  38. package/dist/components/Terminal.js +2 -2
  39. package/dist/components/TestResults.js +2 -2
  40. package/dist/components/Tool.js +8 -4
  41. package/dist/components/WebPreview.js +1 -1
  42. package/dist/components/icons.d.ts +2 -0
  43. package/dist/components/icons.js +2 -0
  44. package/dist/components/useStickToBottom.js +10 -1
  45. package/dist/{copy-button-BNgclDrO.js → copy-button-DAPlB8Z0.js} +1 -1
  46. package/dist/{icons-BsWc8g4E.js → icons-Bf7JMKk-.js} +41 -1
  47. package/dist/icons-BklFyZbx.d.ts +48 -0
  48. package/dist/styles/accordion.css +34 -17
  49. package/dist/styles/activity.css +386 -0
  50. package/dist/styles/agent-chat.css +21 -0
  51. package/dist/styles/agent-connection.css +20 -3
  52. package/dist/styles/alert-dialog.css +37 -15
  53. package/dist/styles/artifact.css +24 -6
  54. package/dist/styles/autocomplete.css +25 -6
  55. package/dist/styles/badge.css +8 -6
  56. package/dist/styles/browser-live-view.css +164 -0
  57. package/dist/styles/browser-replay.css +189 -0
  58. package/dist/styles/button.css +14 -6
  59. package/dist/styles/card.css +4 -8
  60. package/dist/styles/chain-of-thought.css +5 -12
  61. package/dist/styles/checkbox.css +3 -3
  62. package/dist/styles/code-block.css +4 -8
  63. package/dist/styles/collapsible.css +7 -10
  64. package/dist/styles/combobox.css +6 -6
  65. package/dist/styles/commit.css +2 -9
  66. package/dist/styles/context-menu.css +2 -2
  67. package/dist/styles/conversation.css +12 -5
  68. package/dist/styles/dialog.css +1 -1
  69. package/dist/styles/field.css +2 -2
  70. package/dist/styles/file-tree.css +2 -2
  71. package/dist/styles/index.css +5 -0
  72. package/dist/styles/input.css +8 -3
  73. package/dist/styles/menu.css +4 -4
  74. package/dist/styles/menubar.css +5 -5
  75. package/dist/styles/message.css +3 -4
  76. package/dist/styles/navigation-menu.css +6 -6
  77. package/dist/styles/number-field.css +4 -4
  78. package/dist/styles/popover.css +7 -7
  79. package/dist/styles/preview-card.css +2 -2
  80. package/dist/styles/pricing-page.css +2 -2
  81. package/dist/styles/prompt-input.css +11 -9
  82. package/dist/styles/queue.css +6 -15
  83. package/dist/styles/radio.css +5 -5
  84. package/dist/styles/reasoning.css +6 -10
  85. package/dist/styles/scroll-area.css +2 -2
  86. package/dist/styles/select.css +3 -3
  87. package/dist/styles/slider.css +2 -2
  88. package/dist/styles/sources.css +5 -12
  89. package/dist/styles/stepper.css +13 -9
  90. package/dist/styles/switch.css +4 -4
  91. package/dist/styles/tabs.css +3 -3
  92. package/dist/styles/task.css +13 -18
  93. package/dist/styles/terminal.css +1 -3
  94. package/dist/styles/test-results.css +2 -9
  95. package/dist/styles/toast.css +3 -3
  96. package/dist/styles/toggle-group.css +3 -3
  97. package/dist/styles/toggle.css +3 -3
  98. package/dist/styles/tool.css +22 -21
  99. package/dist/styles/toolbar.css +4 -4
  100. package/dist/styles/workspace-explorer.css +108 -0
  101. package/package.json +9 -2
@@ -0,0 +1,386 @@
1
+ /* Claude/Codex-style: no box — the collapsed state is a plain muted text
2
+ line whose label shimmers while streaming; expanding reveals rows beneath. */
3
+ .activity {
4
+ display: flex;
5
+ flex-direction: column;
6
+ width: 100%;
7
+ /* Hard cap, Codex-style, on the WHOLE unit — collapsed line and expanded
8
+ log alike — so toggling never reflows the conversation width. */
9
+ max-width: min(100%, 36rem);
10
+ /* Whitespace separates the work log from message prose around it */
11
+ margin-block: 0.5rem;
12
+ font-family: var(--sigvelo-font-sans);
13
+ color: var(--sigvelo-color-text);
14
+ }
15
+
16
+ .activity__trigger {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: 0.375rem;
20
+ padding-block: 0.375rem;
21
+ /* The fill bleeds past the text edge via the negative margin, so the label
22
+ stays flush with the rows below instead of indenting on hover */
23
+ padding-inline: 0.5rem;
24
+ margin-inline: -0.5rem;
25
+ background-color: transparent;
26
+ border: none;
27
+ border-radius: var(--sigvelo-radius-sm);
28
+ /* A step dimmer than message prose (Codex-style) so the line reads as
29
+ status, not content */
30
+ color: color-mix(in oklab, var(--sigvelo-color-text-muted), transparent 20%);
31
+ font-family: inherit;
32
+ font-size: 0.8125rem;
33
+ font-weight: var(--sigvelo-font-weight-semibold);
34
+ text-align: start;
35
+ cursor: pointer;
36
+ transition:
37
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
38
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
39
+ }
40
+
41
+ .activity__trigger:hover:not([data-disabled]) {
42
+ color: var(--sigvelo-color-text);
43
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
44
+ }
45
+
46
+ .activity__trigger:focus-visible {
47
+ outline: none;
48
+ box-shadow:
49
+ 0 0 0 2px var(--sigvelo-color-canvas),
50
+ 0 0 0 4px var(--sigvelo-color-focus);
51
+ }
52
+
53
+ /* Basis 0 keeps the long nowrap label from inflating the message width
54
+ (it truncates instead); max-content caps growth so the chevron hugs the
55
+ text, Codex-style. */
56
+ .activity__trigger-label {
57
+ flex: 1 1 0;
58
+ min-width: 0;
59
+ max-width: max-content;
60
+ color: var(--sigvelo-color-text);
61
+ overflow: hidden;
62
+ text-overflow: ellipsis;
63
+ white-space: nowrap;
64
+ }
65
+
66
+ /* Streaming shimmer: a highlight sweeps the label left-to-right, then rests
67
+ muted for the back half of the loop (the gradient tiles seamlessly). */
68
+ .activity[data-streaming] .activity__trigger-label {
69
+ /* Resting shade matches the trigger's dimmed color; the sweep brightens */
70
+ --activity-shimmer-base: color-mix(in oklab, var(--sigvelo-color-text-muted), transparent 20%);
71
+ background: linear-gradient(
72
+ 90deg,
73
+ var(--activity-shimmer-base) 0%,
74
+ var(--activity-shimmer-base) 40%,
75
+ var(--sigvelo-color-text) 50%,
76
+ var(--activity-shimmer-base) 60%,
77
+ var(--activity-shimmer-base) 100%
78
+ );
79
+ background-size: 200% 100%;
80
+ -webkit-background-clip: text;
81
+ background-clip: text;
82
+ color: transparent;
83
+ animation: activity-shimmer 2.4s linear infinite;
84
+ }
85
+
86
+ .activity__trigger-icon {
87
+ display: inline-flex;
88
+ color: var(--sigvelo-color-text-muted);
89
+ transition: transform var(--sigvelo-duration-medium) var(--sigvelo-ease-emphasized);
90
+ }
91
+
92
+ .activity__trigger[data-panel-open] .activity__trigger-icon {
93
+ transform: rotate(90deg);
94
+ }
95
+
96
+ /* The measured height lives on the base class, NOT gated behind [data-open]:
97
+ during close the open rule stops matching before the ending style lands,
98
+ height computes to `auto`, and `auto → 0` can't transition — the panel
99
+ snaps shut instead of folding. (Base UI's documented panel pattern.) */
100
+ .activity__content {
101
+ height: var(--collapsible-panel-height);
102
+ overflow: hidden;
103
+ /* The panel clips (overflow: hidden), so it must own the gutter the row
104
+ hover fills bleed into — the list padding puts the text back in line */
105
+ margin-inline: -0.5rem;
106
+ /* Standard easing, not emphasized: the expo-out curve front-loads ~60% of
107
+ the motion into the first frames, which makes collapsing read as content
108
+ snapping upward instead of folding. */
109
+ transition:
110
+ height var(--sigvelo-duration-medium) var(--sigvelo-ease-standard),
111
+ opacity var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
112
+ }
113
+
114
+ .activity__content[data-starting-style],
115
+ .activity__content[data-ending-style] {
116
+ height: 0;
117
+ opacity: 0;
118
+ }
119
+
120
+ .activity__list {
121
+ display: flex;
122
+ flex-direction: column;
123
+ gap: 0.375rem;
124
+ /* Bounded so expanding never blows out the conversation scroll position */
125
+ max-height: 20rem;
126
+ overflow-y: auto;
127
+ padding-block: 0.125rem 0.5rem;
128
+ padding-inline: 0.5rem;
129
+ }
130
+
131
+ .activity__item {
132
+ display: flex;
133
+ align-items: baseline;
134
+ gap: 0.375rem;
135
+ font-size: 0.8125rem;
136
+ color: var(--sigvelo-color-text);
137
+ line-height: 1.6;
138
+ }
139
+
140
+ /* Second collapse level: the trigger reads as a plain item row; the panel is
141
+ chrome-free — no inner box inside the outlined Activity box. */
142
+ .activity__group {
143
+ display: flex;
144
+ flex-direction: column;
145
+ }
146
+
147
+ .activity__group-trigger {
148
+ display: flex;
149
+ align-items: baseline;
150
+ gap: 0.375rem;
151
+ /* Negative margins cancel the padding, so the hover fill gets breathing
152
+ room while the row text stays aligned with its plain siblings */
153
+ padding-block: 0.125rem;
154
+ padding-inline: 0.5rem;
155
+ margin-block: -0.125rem;
156
+ margin-inline: -0.5rem;
157
+ background: none;
158
+ border: none;
159
+ border-radius: var(--sigvelo-radius-sm);
160
+ font-family: inherit;
161
+ font-size: 0.8125rem;
162
+ font-weight: inherit;
163
+ color: var(--sigvelo-color-text);
164
+ line-height: 1.6;
165
+ text-align: start;
166
+ cursor: pointer;
167
+ transition: background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
168
+ }
169
+
170
+ .activity__group-trigger:hover:not([data-disabled]) {
171
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
172
+ }
173
+
174
+ /* The chevron is an affordance, not furniture — appears on hover/focus/open */
175
+ .activity__group-icon {
176
+ display: inline-flex;
177
+ align-self: center;
178
+ color: var(--sigvelo-color-text-muted);
179
+ opacity: 0;
180
+ transition:
181
+ opacity var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
182
+ transform var(--sigvelo-duration-medium) var(--sigvelo-ease-emphasized);
183
+ }
184
+
185
+ .activity__group-trigger:hover .activity__group-icon,
186
+ .activity__group-trigger:focus-visible .activity__group-icon,
187
+ .activity__group-trigger[data-panel-open] .activity__group-icon {
188
+ opacity: 1;
189
+ }
190
+
191
+ .activity__group-trigger[data-panel-open] .activity__group-icon {
192
+ transform: rotate(90deg);
193
+ }
194
+
195
+ .activity__group-trigger:focus-visible {
196
+ outline: none;
197
+ box-shadow:
198
+ 0 0 0 2px var(--sigvelo-color-canvas),
199
+ 0 0 0 4px var(--sigvelo-color-focus);
200
+ border-radius: var(--sigvelo-radius-sm);
201
+ }
202
+
203
+ .activity__group-panel {
204
+ height: var(--collapsible-panel-height);
205
+ overflow: hidden;
206
+ transition:
207
+ height var(--sigvelo-duration-medium) var(--sigvelo-ease-standard),
208
+ opacity var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
209
+ }
210
+
211
+ .activity__group-panel[data-starting-style],
212
+ .activity__group-panel[data-ending-style] {
213
+ height: 0;
214
+ opacity: 0;
215
+ }
216
+
217
+ .activity__group-panel-inner {
218
+ padding-block: 0.375rem 0.5rem;
219
+ }
220
+
221
+ /* Prose panels (thought traces): quiet text, bounded like everything else */
222
+ .activity__group-text {
223
+ margin: 0;
224
+ font-size: 0.8125rem;
225
+ line-height: 1.6;
226
+ color: var(--sigvelo-color-text-muted);
227
+ white-space: pre-wrap;
228
+ overflow-wrap: anywhere;
229
+ max-height: 12rem;
230
+ overflow-y: auto;
231
+ }
232
+
233
+ .activity__group-text:focus-visible,
234
+ .activity__shell-output:focus-visible {
235
+ outline: none;
236
+ box-shadow:
237
+ 0 0 0 2px var(--sigvelo-color-canvas),
238
+ 0 0 0 4px var(--sigvelo-color-focus);
239
+ border-radius: var(--sigvelo-radius-sm);
240
+ scroll-margin-block: 1rem;
241
+ }
242
+
243
+ /* Codex-style shell panel: a quiet fill, not a terminal component — no
244
+ header bar, no chips, no chrome inside the outlined Activity box. */
245
+ .activity__shell {
246
+ display: flex;
247
+ flex-direction: column;
248
+ gap: 0.25rem;
249
+ padding-block: 0.5rem;
250
+ padding-inline: 0.75rem;
251
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
252
+ border-radius: var(--sigvelo-radius-md);
253
+ }
254
+
255
+ .activity__shell-label {
256
+ font-size: 0.6875rem;
257
+ font-weight: var(--sigvelo-font-weight-semibold);
258
+ color: var(--sigvelo-color-text-muted);
259
+ }
260
+
261
+ .activity__shell-output {
262
+ margin: 0;
263
+ font-family: var(--sigvelo-font-mono);
264
+ font-size: 0.75rem;
265
+ line-height: 1.6;
266
+ color: var(--sigvelo-color-text);
267
+ white-space: pre-wrap;
268
+ overflow-wrap: anywhere;
269
+ /* Bounded so one long log can't swallow the activity list */
270
+ max-height: 12rem;
271
+ overflow-y: auto;
272
+ }
273
+
274
+ .activity__shell-status {
275
+ align-self: flex-end;
276
+ font-size: 0.6875rem;
277
+ color: var(--sigvelo-color-success-text-on-subtle);
278
+ }
279
+
280
+ .activity__shell-status[data-error] {
281
+ color: var(--sigvelo-color-danger-text-on-subtle);
282
+ }
283
+
284
+ /* Browser panels: screenshots and live views sit inside the quiet fill */
285
+ .activity__shell .browser-live-view {
286
+ width: 100%;
287
+ }
288
+
289
+ /* browser_execute splits into small tabs: the web view and the code that
290
+ drove it. Compact underline tabs — chrome stays quiet inside the shell. */
291
+ .activity__browser-tabs .tabs__tab {
292
+ padding-block: 0.25rem;
293
+ padding-inline: 0.125rem;
294
+ font-size: 0.75rem;
295
+ }
296
+
297
+ .activity__browser-tabs .tabs__panel {
298
+ padding-block: 0.5rem 0;
299
+ }
300
+
301
+ /* Blend nested code into the quiet shell fill — no panel-in-panel */
302
+ .activity__shell .code-block {
303
+ background-color: transparent;
304
+ }
305
+
306
+ /* Bounded and wrapping, like every other panel body */
307
+ .activity__code-block {
308
+ max-height: 12rem;
309
+ overflow-y: auto;
310
+ }
311
+
312
+ .activity__code-block .code-block__content,
313
+ .activity__code-block .code-block__content--highlighted pre.shiki,
314
+ .activity__code-block .code-block__content--highlighted pre.shiki code {
315
+ white-space: pre-wrap;
316
+ word-break: break-word;
317
+ overflow-wrap: anywhere;
318
+ }
319
+
320
+ .activity__browser-screenshot {
321
+ display: block;
322
+ width: 100%;
323
+ max-height: 16rem;
324
+ object-fit: contain;
325
+ border-radius: var(--sigvelo-radius-md);
326
+ background-color: var(--sigvelo-color-surface);
327
+ }
328
+
329
+ /* Mini diff inside an edit panel */
330
+ .activity__diff-del {
331
+ color: var(--sigvelo-color-danger-text-on-subtle);
332
+ }
333
+
334
+ .activity__diff-add {
335
+ color: var(--sigvelo-color-success-text-on-subtle);
336
+ }
337
+
338
+ .activity__item-icon {
339
+ display: inline-flex;
340
+ align-self: center;
341
+ color: var(--sigvelo-color-text-muted);
342
+ }
343
+
344
+ .activity__item-text {
345
+ min-width: 0;
346
+ overflow-wrap: anywhere;
347
+ }
348
+
349
+ /* Row labels always clamp to one line, Codex-style — the expanded panel
350
+ carries the full `$ command`, the row stays a trimmed summary. */
351
+ .activity__group-trigger .activity__item-text {
352
+ white-space: nowrap;
353
+ overflow: hidden;
354
+ text-overflow: ellipsis;
355
+ }
356
+
357
+ @keyframes activity-shimmer {
358
+ from {
359
+ background-position: 100% 0;
360
+ }
361
+ to {
362
+ background-position: -100% 0;
363
+ }
364
+ }
365
+
366
+ @media (prefers-reduced-motion: reduce) {
367
+ .activity[data-streaming] .activity__trigger-label {
368
+ animation: none;
369
+ background: none;
370
+ color: inherit;
371
+ }
372
+ }
373
+
374
+ @media (forced-colors: active) {
375
+ /* background-clip: text has no forced-colors story — plain text instead */
376
+ .activity[data-streaming] .activity__trigger-label {
377
+ animation: none;
378
+ background: none;
379
+ color: inherit;
380
+ }
381
+
382
+ .activity__trigger:focus-visible {
383
+ outline: 2px solid Highlight;
384
+ outline-offset: 2px;
385
+ }
386
+ }
@@ -0,0 +1,21 @@
1
+ .agent-chat {
2
+ display: grid;
3
+ grid-template-rows: minmax(0, 1fr) auto;
4
+ width: 100%;
5
+ height: 100%;
6
+ min-height: 0;
7
+ background-color: var(--sigvelo-color-surface);
8
+ color: var(--sigvelo-color-text);
9
+ font-family: var(--sigvelo-font-sans);
10
+ }
11
+
12
+ .agent-chat__conversation {
13
+ min-height: 0;
14
+ }
15
+
16
+ .agent-chat__composer {
17
+ border-block-start: var(--sigvelo-border-style) var(--sigvelo-border-width)
18
+ var(--sigvelo-color-neutral-border-subtle);
19
+ padding: 0.75rem;
20
+ background-color: var(--sigvelo-color-surface);
21
+ }
@@ -41,10 +41,12 @@
41
41
  }
42
42
 
43
43
  .agent-connect__title-group p {
44
+ max-inline-size: 62ch;
44
45
  margin: 0;
45
46
  color: var(--sigvelo-color-text-muted);
46
47
  font-size: 0.78rem;
47
48
  line-height: 1.35;
49
+ text-wrap: pretty;
48
50
  }
49
51
 
50
52
  .agent-connect__targets {
@@ -88,9 +90,19 @@
88
90
  font-size: 0.72rem;
89
91
  font-weight: var(--sigvelo-font-weight-semibold);
90
92
  line-height: 1.15;
93
+ overflow-wrap: anywhere;
91
94
  text-align: center;
92
95
  }
93
96
 
97
+ .agent-connect .agent-connect__target {
98
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width) transparent;
99
+ transition:
100
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
101
+ border-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
102
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
103
+ box-shadow var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
104
+ }
105
+
94
106
  @media (pointer: coarse) {
95
107
  .agent-connect__target {
96
108
  min-block-size: 2.5rem;
@@ -104,14 +116,19 @@
104
116
  }
105
117
 
106
118
  .agent-connect__target:focus-visible {
107
- outline: var(--sigvelo-focus-ring);
108
- outline-offset: var(--sigvelo-focus-offset);
119
+ outline: none;
120
+ box-shadow:
121
+ 0 0 0 2px var(--sigvelo-color-canvas),
122
+ 0 0 0 4px var(--sigvelo-color-focus);
109
123
  }
110
124
 
111
125
  .agent-connect__target[data-selected="true"] {
126
+ border-color: var(--sigvelo-color-primary-border-muted);
112
127
  background: var(--sigvelo-color-surface);
113
128
  color: var(--sigvelo-color-text);
114
- box-shadow: var(--sigvelo-shadow-xs);
129
+ box-shadow:
130
+ var(--sigvelo-shadow-xs),
131
+ inset 0 0 0 1px var(--sigvelo-color-primary-border-subtle);
115
132
  }
116
133
 
117
134
  .agent-connect .code-block {
@@ -11,11 +11,20 @@
11
11
  color: inherit;
12
12
  }
13
13
 
14
+ .alert-dialog__trigger:focus-visible {
15
+ outline: none;
16
+ box-shadow:
17
+ 0 0 0 2px var(--sigvelo-color-canvas),
18
+ 0 0 0 4px var(--sigvelo-color-focus);
19
+ }
20
+
14
21
  .alert-dialog__backdrop {
15
22
  position: fixed;
16
23
  inset: 0;
17
- background-color: rgb(0 0 0 / 0.5);
24
+ background-color: var(--sigvelo-color-backdrop);
25
+ opacity: 1;
18
26
  z-index: 50;
27
+ transition: opacity var(--sigvelo-duration-medium) var(--sigvelo-ease-standard);
19
28
  }
20
29
 
21
30
  .alert-dialog__backdrop[data-starting-style],
@@ -25,12 +34,14 @@
25
34
 
26
35
  .alert-dialog__popup {
27
36
  position: fixed;
28
- top: 50%;
29
- left: 50%;
37
+ inset-block-start: 50%;
38
+ inset-inline-start: 50%;
30
39
  transform: translate(-50%, -50%);
31
40
  z-index: 50;
32
- width: calc(100% - 2rem);
33
- max-width: 28rem;
41
+ inline-size: calc(100% - 2rem);
42
+ max-inline-size: 28rem;
43
+ max-block-size: calc(100dvb - 2rem);
44
+ overflow: auto;
34
45
  background-color: var(--sigvelo-color-canvas);
35
46
  border: var(--sigvelo-border-style) var(--sigvelo-border-width)
36
47
  var(--sigvelo-color-neutral-border-muted);
@@ -39,6 +50,9 @@
39
50
  box-shadow:
40
51
  0 10px 15px -3px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%),
41
52
  0 4px 6px -4px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%);
53
+ transition:
54
+ opacity var(--sigvelo-duration-medium) var(--sigvelo-ease-standard),
55
+ transform var(--sigvelo-duration-medium) var(--sigvelo-ease-emphasized);
42
56
  }
43
57
 
44
58
  .alert-dialog__popup[data-starting-style],
@@ -48,11 +62,11 @@
48
62
  }
49
63
 
50
64
  .alert-dialog__popup--sm {
51
- max-width: 20rem;
65
+ max-inline-size: 20rem;
52
66
  }
53
67
 
54
68
  .alert-dialog__popup--lg {
55
- max-width: 36rem;
69
+ max-inline-size: 36rem;
56
70
  }
57
71
 
58
72
  .alert-dialog__title {
@@ -62,6 +76,7 @@
62
76
  line-height: 1.25;
63
77
  color: var(--sigvelo-color-text);
64
78
  margin: 0 0 0.5rem;
79
+ text-wrap: balance;
65
80
  }
66
81
 
67
82
  .alert-dialog__description {
@@ -70,6 +85,7 @@
70
85
  line-height: 1.5;
71
86
  color: var(--sigvelo-color-text-muted);
72
87
  margin: 0 0 1.5rem;
88
+ text-wrap: pretty;
73
89
  }
74
90
 
75
91
  .alert-dialog__header {
@@ -93,7 +109,7 @@
93
109
  display: inline-flex;
94
110
  align-items: center;
95
111
  justify-content: center;
96
- height: 2.5rem;
112
+ min-block-size: 2.5rem;
97
113
  padding: 0 1rem;
98
114
  font-family: var(--sigvelo-font-sans);
99
115
  font-size: 0.875rem;
@@ -102,8 +118,9 @@
102
118
  border-radius: var(--sigvelo-radius-md);
103
119
  cursor: pointer;
104
120
  transition:
105
- background-color 150ms ease,
106
- color 150ms ease;
121
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
122
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
123
+ opacity var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
107
124
  }
108
125
 
109
126
  .alert-dialog__action:focus-visible {
@@ -113,12 +130,17 @@
113
130
  0 0 0 4px var(--sigvelo-color-focus);
114
131
  }
115
132
 
133
+ .alert-dialog__action:disabled {
134
+ cursor: not-allowed;
135
+ opacity: 0.5;
136
+ }
137
+
116
138
  .alert-dialog__action--primary {
117
139
  background-color: var(--sigvelo-color-primary-bg);
118
140
  color: var(--sigvelo-color-primary-text-on-bg);
119
141
  }
120
142
 
121
- .alert-dialog__action--primary:hover {
143
+ .alert-dialog__action--primary:hover:not(:disabled) {
122
144
  background-color: color-mix(in oklab, var(--sigvelo-color-primary-bg), transparent 10%);
123
145
  }
124
146
 
@@ -127,7 +149,7 @@
127
149
  color: var(--sigvelo-color-neutral-text-on-subtle);
128
150
  }
129
151
 
130
- .alert-dialog__action--secondary:hover {
152
+ .alert-dialog__action--secondary:hover:not(:disabled) {
131
153
  background-color: color-mix(in oklab, var(--sigvelo-color-neutral-bg-subtle), transparent 20%);
132
154
  }
133
155
 
@@ -136,7 +158,7 @@
136
158
  color: var(--sigvelo-color-danger-text-on-bg);
137
159
  }
138
160
 
139
- .alert-dialog__action--destructive:hover {
161
+ .alert-dialog__action--destructive:hover:not(:disabled) {
140
162
  background-color: color-mix(in oklab, var(--sigvelo-color-danger-bg), transparent 10%);
141
163
  }
142
164
 
@@ -147,7 +169,7 @@
147
169
  var(--sigvelo-color-neutral-border-muted);
148
170
  }
149
171
 
150
- .alert-dialog__action--outline:hover {
172
+ .alert-dialog__action--outline:hover:not(:disabled) {
151
173
  background-color: var(--sigvelo-color-neutral-bg-subtle);
152
174
  color: var(--sigvelo-color-neutral-text-on-subtle);
153
175
  }
@@ -157,7 +179,7 @@
157
179
  color: var(--sigvelo-color-text);
158
180
  }
159
181
 
160
- .alert-dialog__action--ghost:hover {
182
+ .alert-dialog__action--ghost:hover:not(:disabled) {
161
183
  background-color: var(--sigvelo-color-neutral-bg-subtle);
162
184
  color: var(--sigvelo-color-neutral-text-on-subtle);
163
185
  }
@@ -1,14 +1,13 @@
1
1
  .artifact {
2
2
  display: flex;
3
3
  flex-direction: column;
4
- width: 100%;
4
+ inline-size: 100%;
5
5
  font-family: var(--sigvelo-font-sans);
6
6
  color: var(--sigvelo-color-text);
7
+ /* Shadow-led elevation: no perimeter border */
7
8
  background-color: var(--sigvelo-color-surface);
8
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
9
- var(--sigvelo-color-neutral-border-subtle);
10
9
  border-radius: var(--sigvelo-radius-lg, var(--sigvelo-radius-md));
11
- box-shadow: var(--sigvelo-shadow-xs);
10
+ box-shadow: var(--sigvelo-shadow-sm);
12
11
  overflow: hidden;
13
12
  }
14
13
 
@@ -19,11 +18,13 @@
19
18
  gap: 0.75rem;
20
19
  padding-block: 0.75rem;
21
20
  padding-inline: 1rem;
22
- border-block-end: var(--sigvelo-border-style) var(--sigvelo-border-width)
23
- var(--sigvelo-color-neutral-border-subtle);
24
21
  background-color: var(--sigvelo-color-surface);
25
22
  }
26
23
 
24
+ .artifact__header > :not(.artifact__actions) {
25
+ min-inline-size: 0;
26
+ }
27
+
27
28
  .artifact__title {
28
29
  margin: 0;
29
30
  font-family: inherit;
@@ -31,6 +32,8 @@
31
32
  font-weight: var(--sigvelo-font-weight-bold);
32
33
  color: var(--sigvelo-color-text);
33
34
  line-height: 1.3;
35
+ overflow-wrap: anywhere;
36
+ text-wrap: balance;
34
37
  }
35
38
 
36
39
  .artifact__description {
@@ -39,6 +42,8 @@
39
42
  font-size: 0.8125rem;
40
43
  color: var(--sigvelo-color-text-muted);
41
44
  line-height: 1.4;
45
+ overflow-wrap: anywhere;
46
+ text-wrap: pretty;
42
47
  }
43
48
 
44
49
  .artifact__actions {
@@ -53,11 +58,24 @@
53
58
  /* Inherits from Button variant=ghost size=icon; overrides only when needed */
54
59
  }
55
60
 
61
+ .artifact__action .sr-only {
62
+ position: absolute;
63
+ inline-size: 1px;
64
+ block-size: 1px;
65
+ padding: 0;
66
+ margin: -1px;
67
+ overflow: hidden;
68
+ white-space: nowrap;
69
+ border: 0;
70
+ clip: rect(0 0 0 0);
71
+ }
72
+
56
73
  .artifact__content {
57
74
  padding-block: 1rem;
58
75
  padding-inline: 1rem;
59
76
  font-size: 0.875rem;
60
77
  line-height: 1.5;
78
+ overflow-wrap: anywhere;
61
79
  }
62
80
 
63
81
  @media (forced-colors: active) {