@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
@@ -11,13 +11,44 @@
11
11
  text-align: start;
12
12
  }
13
13
 
14
- /* Basis 0 keeps a long label from inflating its owner; the trailing
15
- affordance stays adjacent until the available width is exhausted. */
16
- .activity__header-label {
17
- flex: 1 1 0;
14
+ /*
15
+ * The action holds its content width and the detail absorbs whatever is left,
16
+ * so the two shrink in the right order: a long path loses its tail while
17
+ * "Reading" stays legible. Basis 0 on the detail is what makes it the flexible
18
+ * one; the trailing affordance stays adjacent until the width is exhausted.
19
+ *
20
+ * With no detail present the action is the only flexible item, so a settled
21
+ * summary sentence still truncates rather than inflating its owner.
22
+ */
23
+ .activity__header-action {
24
+ flex: 0 1 auto;
18
25
  min-width: 0;
19
26
  max-width: max-content;
27
+ overflow: hidden;
20
28
  color: var(--sigvelo-color-text);
29
+ text-overflow: ellipsis;
30
+ white-space: nowrap;
31
+ }
32
+
33
+ /*
34
+ * The target of the action — a path, a command, a query. Muted, because in a
35
+ * column of activity lines the verb is what the reader scans for.
36
+ *
37
+ * Faded rather than ellipsed: this is data, and a trailing "…" reads as part of
38
+ * the value it is truncating.
39
+ *
40
+ * The fade is unconditional because it does not need a condition. Growing to
41
+ * fill the free space means the box is wider than short text, so the gradient
42
+ * lands on empty space and only bites once the text actually reaches the edge.
43
+ */
44
+ .activity__header-detail {
45
+ flex: 1 1 0;
46
+ min-width: 0;
47
+ overflow: hidden;
48
+ color: var(--sigvelo-color-text-muted);
49
+ font-weight: var(--sigvelo-font-weight-normal);
50
+ white-space: nowrap;
51
+ mask-image: linear-gradient(to right, #000 calc(100% - 1rem), transparent 100%);
21
52
  }
22
53
 
23
54
  .activity__item-icon {
@@ -26,36 +57,25 @@
26
57
  color: var(--sigvelo-color-text-muted);
27
58
  }
28
59
 
29
- .activity[data-streaming] .activity__header-label,
30
- .activity__header[data-streaming] .activity__header-label {
31
- --activity-shimmer-base: color-mix(in oklab, var(--sigvelo-color-text-muted), transparent 20%);
60
+ .activity[data-streaming] .activity__header-action,
61
+ .activity__header[data-streaming] .activity__header-action {
62
+ --sigvelo-shimmer-base: color-mix(in oklab, var(--sigvelo-color-text-muted), transparent 20%);
32
63
  background: linear-gradient(
33
64
  90deg,
34
- var(--activity-shimmer-base) 0%,
35
- var(--activity-shimmer-base) 40%,
65
+ var(--sigvelo-shimmer-base) 0% 40%,
36
66
  var(--sigvelo-color-text) 50%,
37
- var(--activity-shimmer-base) 60%,
38
- var(--activity-shimmer-base) 100%
67
+ var(--sigvelo-shimmer-base) 60% 100%
39
68
  );
40
69
  background-size: 200% 100%;
41
70
  -webkit-background-clip: text;
42
71
  background-clip: text;
43
72
  color: transparent;
44
- animation: activity-shimmer 2.4s linear infinite;
45
- }
46
-
47
- @keyframes activity-shimmer {
48
- from {
49
- background-position: 100% 0;
50
- }
51
- to {
52
- background-position: -100% 0;
53
- }
73
+ animation: sigvelo-text-shimmer var(--sigvelo-motion-duration-shimmer) linear infinite;
54
74
  }
55
75
 
56
76
  @media (prefers-reduced-motion: reduce) {
57
- .activity[data-streaming] .activity__header-label,
58
- .activity__header[data-streaming] .activity__header-label {
77
+ .activity[data-streaming] .activity__header-action,
78
+ .activity__header[data-streaming] .activity__header-action {
59
79
  animation: none;
60
80
  background: none;
61
81
  color: inherit;
@@ -63,8 +83,8 @@
63
83
  }
64
84
 
65
85
  @media (forced-colors: active) {
66
- .activity[data-streaming] .activity__header-label,
67
- .activity__header[data-streaming] .activity__header-label {
86
+ .activity[data-streaming] .activity__header-action,
87
+ .activity__header[data-streaming] .activity__header-action {
68
88
  animation: none;
69
89
  background: none;
70
90
  color: inherit;
@@ -91,7 +91,7 @@
91
91
  gap: var(--sigvelo-spacing-1-5);
92
92
  font-size: var(--sigvelo-text-compact);
93
93
  color: var(--sigvelo-color-text);
94
- line-height: var(--sigvelo-leading-body);
94
+ line-height: var(--sigvelo-leading-relaxed);
95
95
  }
96
96
 
97
97
  /* Second collapse level: the trigger reads as a plain item row; the panel is
@@ -118,7 +118,7 @@
118
118
  font-size: var(--sigvelo-text-compact);
119
119
  font-weight: inherit;
120
120
  color: var(--sigvelo-color-text);
121
- line-height: var(--sigvelo-leading-body);
121
+ line-height: var(--sigvelo-leading-relaxed);
122
122
  text-align: start;
123
123
  cursor: pointer;
124
124
  transition: background-color var(--sigvelo-motion-duration-interaction)
@@ -164,7 +164,7 @@
164
164
  .activity__group-text {
165
165
  margin: 0;
166
166
  font-size: var(--sigvelo-text-compact);
167
- line-height: var(--sigvelo-leading-body);
167
+ line-height: var(--sigvelo-leading-relaxed);
168
168
  color: var(--sigvelo-color-text-muted);
169
169
  white-space: pre-wrap;
170
170
  overflow-wrap: anywhere;
@@ -200,7 +200,7 @@
200
200
  margin: 0;
201
201
  font-family: var(--sigvelo-font-mono);
202
202
  font-size: var(--sigvelo-text-xs);
203
- line-height: var(--sigvelo-leading-body);
203
+ line-height: var(--sigvelo-leading-relaxed);
204
204
  color: var(--sigvelo-color-text);
205
205
  white-space: pre-wrap;
206
206
  overflow-wrap: anywhere;
@@ -323,6 +323,28 @@
323
323
  overflow-wrap: anywhere;
324
324
  }
325
325
 
326
+ /*
327
+ * The target of a row's action. Muted and shrink-first, so a column of rows
328
+ * reads down its verbs — "Read / Edited / Ran" — with the paths and commands
329
+ * present but out of the way.
330
+ */
331
+ .activity__item-detail {
332
+ flex: 1 1 0;
333
+ min-inline-size: 0;
334
+ overflow: hidden;
335
+ color: var(--sigvelo-color-text-muted);
336
+ white-space: nowrap;
337
+ mask-image: linear-gradient(to right, #000 calc(100% - 1rem), transparent 100%);
338
+ }
339
+
340
+ /* The action keeps its content width once a detail is beside it to shrink. */
341
+ .activity__item:has(.activity__item-detail) .activity__item-text,
342
+ .activity__group-trigger:has(.activity__item-detail) .activity__item-text {
343
+ flex: 0 1 auto;
344
+ overflow-wrap: normal;
345
+ white-space: nowrap;
346
+ }
347
+
326
348
  @media (hover: none) {
327
349
  .activity__group-icon {
328
350
  opacity: 1;
@@ -12,26 +12,53 @@
12
12
  color: CanvasText;
13
13
  font-family: system-ui, sans-serif;
14
14
 
15
- --sigvelo-spacing-0-5: 0.125rem;
16
- --sigvelo-spacing-1: 0.25rem;
17
- --sigvelo-spacing-1-5: 0.375rem;
18
- --sigvelo-spacing-2: 0.5rem;
19
- --sigvelo-spacing-3: 0.75rem;
20
- --sigvelo-radius-md: 0.5rem;
21
- --sigvelo-radius-lg: 0.75rem;
22
- --sigvelo-radius-xs: 0.1875rem;
23
- --sigvelo-text-compact: 0.8125rem;
15
+ /*
16
+ * `all: initial` plus a closed shadow root means nothing inherits, so every
17
+ * token the imported stylesheets read has to be restated here. A token that
18
+ * is missing does not fall back to the page value — it resolves to nothing
19
+ * and the declaration is dropped, which is silent. Keep this list in step
20
+ * with what agent-activity-preview.css and activity-header.css actually use.
21
+ *
22
+ * These are px, not rem, and that is the point. This bundle renders in an
23
+ * active-tab content script, and `rem` resolves against the host page's root
24
+ * element — a page setting `html { font-size: 10px }` would shrink the whole
25
+ * preview by a third. `all: initial` does not isolate that; nothing does.
26
+ * A surface drawn on a page we do not control has to carry its own units.
27
+ */
28
+ --sigvelo-spacing-0-5: 2px;
29
+ --sigvelo-spacing-1: 4px;
30
+ --sigvelo-spacing-1-5: 6px;
31
+ --sigvelo-spacing-2: 8px;
32
+ --sigvelo-spacing-3: 12px;
33
+ --sigvelo-spacing-8: 32px;
34
+ --sigvelo-radius-md: 8px;
35
+ --sigvelo-radius-lg: 12px;
36
+ --sigvelo-radius-xs: 3px;
37
+ --sigvelo-radius-full: 9999px;
38
+ --sigvelo-border-style: solid;
39
+ --sigvelo-border-width: 1px;
40
+ --sigvelo-text-compact: 13px;
41
+ --sigvelo-font-weight-normal: 400;
24
42
  --sigvelo-font-weight-semibold: 500;
43
+ --sigvelo-control-height-sm: 32px;
44
+ --sigvelo-control-height-xl: 44px;
45
+ --sigvelo-control-icon-size-sm: 14px;
46
+ --sigvelo-control-icon-size-md: 16px;
47
+ --sigvelo-control-icon-size-lg: 18px;
25
48
  --sigvelo-duration-fast: 150ms;
26
- --sigvelo-duration-slow: 360ms;
49
+ --sigvelo-motion-duration-shimmer: 2400ms;
50
+ --sigvelo-motion-duration-spin: 900ms;
27
51
  --sigvelo-ease-standard: cubic-bezier(0.2, 0, 0, 1);
28
52
  --sigvelo-color-surface: Canvas;
53
+ --sigvelo-color-surface-raised: Canvas;
29
54
  --sigvelo-color-text: CanvasText;
30
55
  --sigvelo-color-text-muted: GrayText;
31
56
  --sigvelo-color-primary-text: LinkText;
32
57
  --sigvelo-color-warning-text: #8a4b00;
33
58
  --sigvelo-color-neutral-bg-subtle: color-mix(in oklab, CanvasText 7%, Canvas);
34
- --sigvelo-shadow-sm: 0 0.125rem 0.1875rem color-mix(in oklab, CanvasText 8%, transparent);
59
+ --sigvelo-elevation-raised:
60
+ 0 0 0 0.5px color-mix(in oklab, CanvasText 8%, transparent),
61
+ 0 1px 2px -1px color-mix(in oklab, CanvasText 8%, transparent);
35
62
  --sigvelo-recipe-focus-shadow: 0 0 0 2px Canvas, 0 0 0 4px Highlight;
36
63
  }
37
64
 
@@ -51,7 +78,7 @@
51
78
  }
52
79
 
53
80
  .sigvelo-icon--spinner {
54
- animation: agent-activity-preview-spin var(--sigvelo-duration-slow) linear infinite;
81
+ animation: agent-activity-preview-spin var(--sigvelo-motion-duration-spin) linear infinite;
55
82
  transform-origin: center;
56
83
  }
57
84
 
@@ -61,6 +88,18 @@
61
88
  }
62
89
  }
63
90
 
91
+ /* Shadow-local copy of base.css's sigvelo-text-shimmer — keyframes do not cross
92
+ shadow roots, so the imported activity header shimmer needs it defined here.
93
+ --sigvelo-motion-duration-shimmer inherits across the boundary. */
94
+ @keyframes sigvelo-text-shimmer {
95
+ from {
96
+ background-position: 100% 0;
97
+ }
98
+ to {
99
+ background-position: -100% 0;
100
+ }
101
+ }
102
+
64
103
  @media (prefers-color-scheme: dark) {
65
104
  :host {
66
105
  --sigvelo-color-warning-text: #f0aa45;
@@ -5,8 +5,8 @@
5
5
  padding: var(--sigvelo-spacing-2);
6
6
  border-radius: var(--sigvelo-radius-lg);
7
7
  color: var(--sigvelo-color-text);
8
- background: color-mix(in oklab, var(--sigvelo-color-surface), transparent 3%);
9
- box-shadow: var(--sigvelo-shadow-xs);
8
+ background: var(--sigvelo-color-surface-raised);
9
+ box-shadow: var(--sigvelo-elevation-raised);
10
10
  }
11
11
 
12
12
  .agent-activity-preview__badge {
@@ -15,17 +15,17 @@
15
15
  inset-inline-end: var(--sigvelo-spacing-1);
16
16
  display: grid;
17
17
  place-items: center;
18
- width: 2rem;
19
- height: 2rem;
20
- border-radius: 999px;
18
+ width: var(--sigvelo-control-height-sm);
19
+ height: var(--sigvelo-control-height-sm);
20
+ border-radius: var(--sigvelo-radius-full);
21
21
  color: var(--sigvelo-color-primary-text);
22
- background: var(--sigvelo-color-surface);
23
- box-shadow: var(--sigvelo-shadow-sm);
22
+ background: var(--sigvelo-color-surface-raised);
23
+ box-shadow: var(--sigvelo-elevation-raised);
24
24
  }
25
25
 
26
26
  .agent-activity-preview__badge > svg {
27
- width: 1rem;
28
- height: 1rem;
27
+ width: var(--sigvelo-control-icon-size-md);
28
+ height: var(--sigvelo-control-icon-size-md);
29
29
  }
30
30
 
31
31
  .agent-activity-preview__dismiss {
@@ -35,14 +35,14 @@
35
35
  inset-inline-end: var(--sigvelo-spacing-1);
36
36
  display: grid;
37
37
  place-items: center;
38
- width: 2rem;
39
- height: 2rem;
38
+ width: var(--sigvelo-control-height-sm);
39
+ height: var(--sigvelo-control-height-sm);
40
40
  padding: 0;
41
41
  border: 0;
42
- border-radius: 999px;
42
+ border-radius: var(--sigvelo-radius-full);
43
43
  color: var(--sigvelo-color-text-muted);
44
- background: var(--sigvelo-color-surface);
45
- box-shadow: var(--sigvelo-shadow-sm);
44
+ background: var(--sigvelo-color-surface-raised);
45
+ box-shadow: var(--sigvelo-elevation-raised);
46
46
  cursor: pointer;
47
47
  opacity: 0;
48
48
  scale: 0.92;
@@ -71,8 +71,8 @@
71
71
  }
72
72
 
73
73
  .agent-activity-preview__dismiss > svg {
74
- width: 0.875rem;
75
- height: 0.875rem;
74
+ width: var(--sigvelo-control-icon-size-sm);
75
+ height: var(--sigvelo-control-icon-size-sm);
76
76
  }
77
77
 
78
78
  .agent-activity-preview__list {
@@ -94,7 +94,7 @@
94
94
  }
95
95
 
96
96
  .agent-activity-preview__item:first-child {
97
- padding-inline-end: calc(2rem + var(--sigvelo-spacing-0-5));
97
+ padding-inline-end: calc(var(--sigvelo-spacing-8) + var(--sigvelo-spacing-0-5));
98
98
  }
99
99
 
100
100
  .agent-activity-preview__row {
@@ -143,15 +143,15 @@
143
143
  }
144
144
 
145
145
  .agent-activity-preview__file-action > svg {
146
- width: 1rem;
147
- height: 1rem;
146
+ width: var(--sigvelo-control-icon-size-md);
147
+ height: var(--sigvelo-control-icon-size-md);
148
148
  }
149
149
 
150
150
  .agent-activity-preview__row .activity__header {
151
151
  gap: var(--sigvelo-spacing-2);
152
152
  }
153
153
 
154
- .agent-activity-preview__row .activity__header-label {
154
+ .agent-activity-preview__row .activity__header-action {
155
155
  max-width: none;
156
156
  }
157
157
 
@@ -166,23 +166,24 @@
166
166
  .agent-activity-preview__favicons {
167
167
  display: flex;
168
168
  align-items: center;
169
- padding-inline-start: 0.25rem;
169
+ padding-inline-start: var(--sigvelo-spacing-1);
170
170
  }
171
171
 
172
172
  .agent-activity-preview__favicons img {
173
173
  display: block;
174
- width: 1.125rem;
175
- height: 1.125rem;
176
- margin-inline-start: -0.25rem;
177
- border: 2px solid var(--sigvelo-color-surface);
178
- border-radius: 999px;
179
- background: var(--sigvelo-color-surface);
174
+ width: var(--sigvelo-control-icon-size-lg);
175
+ height: var(--sigvelo-control-icon-size-lg);
176
+ /* Overlap the run of favicons by a quarter of a step. */
177
+ margin-inline-start: calc(-1 * var(--sigvelo-spacing-1));
178
+ border: 2px solid var(--sigvelo-color-surface-raised);
179
+ border-radius: var(--sigvelo-radius-full);
180
+ background: var(--sigvelo-color-surface-raised);
180
181
  object-fit: contain;
181
182
  }
182
183
 
183
184
  .agent-activity-preview__trailing > svg {
184
- width: 1rem;
185
- height: 1rem;
185
+ width: var(--sigvelo-control-icon-size-md);
186
+ height: var(--sigvelo-control-icon-size-md);
186
187
  }
187
188
 
188
189
  .agent-activity-preview__row[data-status="running"] .agent-activity-preview__trailing > svg,
@@ -195,9 +196,9 @@
195
196
  }
196
197
 
197
198
  .agent-activity-preview__unviewed-dot {
198
- width: 0.5rem;
199
- height: 0.5rem;
200
- border-radius: 999px;
199
+ width: var(--sigvelo-spacing-2);
200
+ height: var(--sigvelo-spacing-2);
201
+ border-radius: var(--sigvelo-radius-full);
201
202
  background: currentColor;
202
203
  }
203
204
 
@@ -234,6 +235,6 @@
234
235
  .agent-activity-preview__dismiss,
235
236
  .agent-activity-preview__file-action,
236
237
  .agent-activity-preview__favicons img {
237
- border: 1px solid CanvasText;
238
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width) CanvasText;
238
239
  }
239
240
  }
@@ -4,11 +4,12 @@
4
4
  min-width: 0;
5
5
  gap: var(--sigvelo-spacing-1-5);
6
6
  padding: var(--sigvelo-spacing-1-5);
7
- border: 1px solid var(--sigvelo-color-neutral-border-muted);
7
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width)
8
+ var(--sigvelo-color-neutral-border-muted);
8
9
  border-radius: var(--sigvelo-radius-md);
9
10
  color: var(--sigvelo-color-text);
10
11
  background: var(--sigvelo-color-surface);
11
- box-shadow: var(--sigvelo-shadow-xs);
12
+ box-shadow: var(--sigvelo-elevation-raised);
12
13
  }
13
14
 
14
15
  .agent-attention[data-tone="warning"] {
@@ -57,7 +58,7 @@
57
58
  .agent-attention__text {
58
59
  display: grid;
59
60
  min-width: 0;
60
- line-height: 1.35;
61
+ line-height: var(--sigvelo-leading-snug);
61
62
  }
62
63
 
63
64
  .agent-attention__title {
@@ -90,26 +91,18 @@
90
91
  }
91
92
 
92
93
  .agent-attention[data-busy] .agent-attention__title {
93
- --agent-attention-shimmer: color-mix(in oklab, var(--sigvelo-color-text-muted), transparent 20%);
94
+ --sigvelo-shimmer-base: color-mix(in oklab, var(--sigvelo-color-text-muted), transparent 20%);
94
95
  background: linear-gradient(
95
96
  90deg,
96
- var(--agent-attention-shimmer) 0% 40%,
97
+ var(--sigvelo-shimmer-base) 0% 40%,
97
98
  var(--sigvelo-color-text) 50%,
98
- var(--agent-attention-shimmer) 60% 100%
99
+ var(--sigvelo-shimmer-base) 60% 100%
99
100
  );
100
101
  background-size: 200% 100%;
102
+ -webkit-background-clip: text;
101
103
  background-clip: text;
102
104
  color: transparent;
103
- animation: agent-attention-shimmer 2.4s linear infinite;
104
- }
105
-
106
- @keyframes agent-attention-shimmer {
107
- from {
108
- background-position: 100% 0;
109
- }
110
- to {
111
- background-position: -100% 0;
112
- }
105
+ animation: sigvelo-text-shimmer var(--sigvelo-motion-duration-shimmer) linear infinite;
113
106
  }
114
107
 
115
108
  @media (prefers-reduced-motion: reduce), (forced-colors: active) {
@@ -1,6 +1,7 @@
1
1
  .agent-chat {
2
2
  --agent-chat-content-max-inline-size: 64rem;
3
3
 
4
+ container: agent-chat / inline-size;
4
5
  position: relative;
5
6
  inline-size: 100%;
6
7
  block-size: 100%;
@@ -44,6 +45,165 @@
44
45
  --message-scroller-button-inset-block-end: var(--sigvelo-spacing-2);
45
46
  }
46
47
 
48
+ .agent-chat-start-screen {
49
+ block-size: 100%;
50
+ min-block-size: 0;
51
+ overflow: auto;
52
+ scrollbar-gutter: stable;
53
+ }
54
+
55
+ .agent-chat-start-screen__content {
56
+ display: grid;
57
+ align-content: center;
58
+ gap: var(--sigvelo-spacing-6);
59
+ inline-size: min(100%, var(--agent-chat-content-max-inline-size));
60
+ min-block-size: 100%;
61
+ margin-inline: auto;
62
+ padding: clamp(var(--sigvelo-spacing-5), 8vb, var(--sigvelo-spacing-12)) var(--sigvelo-spacing-4);
63
+ }
64
+
65
+ .agent-chat-start-screen__heading {
66
+ margin: 0;
67
+ color: var(--sigvelo-color-text);
68
+ font-size: clamp(var(--sigvelo-text-2xl), 4vw, var(--sigvelo-text-3xl));
69
+ font-weight: var(--sigvelo-font-weight-semibold);
70
+ letter-spacing: var(--sigvelo-tracking-tight);
71
+ line-height: var(--sigvelo-leading-tight);
72
+ text-align: center;
73
+ text-wrap: balance;
74
+ }
75
+
76
+ .agent-chat-start-screen__content > .agent-chat__composer {
77
+ position: static;
78
+ padding: 0;
79
+ background: none;
80
+ }
81
+
82
+ /* The one moment the composer is the subject of the screen rather than
83
+ chrome pinned under a transcript: rounder, and lifted further off the page. */
84
+ .agent-chat-start-screen__content > .agent-chat__composer > .prompt-input {
85
+ inline-size: 100%;
86
+ border-radius: var(--sigvelo-radius-3xl);
87
+ }
88
+
89
+ .agent-chat-start-screen__starters {
90
+ min-inline-size: 0;
91
+ }
92
+
93
+ .agent-chat-starter-list {
94
+ display: grid;
95
+ gap: var(--sigvelo-spacing-0-5);
96
+ margin: 0;
97
+ padding: 0;
98
+ list-style: none;
99
+ }
100
+
101
+ .agent-chat-starter {
102
+ display: grid;
103
+ grid-template-columns: minmax(0, 1fr) auto;
104
+ align-items: center;
105
+ border-radius: var(--sigvelo-radius-xl);
106
+ transition: background-color var(--sigvelo-motion-duration-interaction)
107
+ var(--sigvelo-motion-ease-change);
108
+ }
109
+
110
+ /* A suggestion is not a card. It fills on approach and stays flat — the only
111
+ raised surface on this screen is the composer. */
112
+ .agent-chat-starter:hover,
113
+ .agent-chat-starter:focus-within {
114
+ background-color: var(--sigvelo-color-surface-sunken);
115
+ }
116
+
117
+ .agent-chat-starter .agent-chat-starter__action {
118
+ justify-content: flex-start;
119
+ inline-size: 100%;
120
+ min-block-size: var(--sigvelo-control-height-xl);
121
+ min-inline-size: 0;
122
+ gap: var(--sigvelo-spacing-3);
123
+ padding-block: var(--sigvelo-spacing-2);
124
+ padding-inline: var(--sigvelo-spacing-3);
125
+ background: transparent;
126
+ color: var(--sigvelo-color-text-muted);
127
+ font-size: var(--sigvelo-text-base);
128
+ font-weight: var(--sigvelo-font-weight-normal);
129
+ text-align: start;
130
+ white-space: normal;
131
+ transition: color var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change);
132
+ }
133
+
134
+ .agent-chat-starter .agent-chat-starter__action:hover:not([data-disabled]) {
135
+ background: transparent;
136
+ }
137
+
138
+ /* Resting text is quiet so the heading and composer lead; the row a pointer
139
+ or keyboard is actually on resolves to full-strength text. */
140
+ .agent-chat-starter:hover .agent-chat-starter__action,
141
+ .agent-chat-starter:focus-within .agent-chat-starter__action {
142
+ color: var(--sigvelo-color-text);
143
+ }
144
+
145
+ .agent-chat-starter__action[data-muted] {
146
+ color: var(--sigvelo-color-text-subtle);
147
+ }
148
+
149
+ .agent-chat-starter__icon {
150
+ display: inline-flex;
151
+ flex: none;
152
+ color: var(--sigvelo-color-primary-text);
153
+ }
154
+
155
+ .agent-chat-starter__label {
156
+ flex: 1;
157
+ min-inline-size: 0;
158
+ overflow-wrap: anywhere;
159
+ }
160
+
161
+ .agent-chat-starter__dismiss {
162
+ margin-inline-end: var(--sigvelo-spacing-1);
163
+ color: var(--sigvelo-color-text-faint);
164
+ opacity: 0;
165
+ }
166
+
167
+ .agent-chat-starter:hover .agent-chat-starter__dismiss,
168
+ .agent-chat-starter:focus-within .agent-chat-starter__dismiss {
169
+ opacity: 1;
170
+ }
171
+
172
+ /* First paint only. The start screen is replaced by the transcript after the
173
+ first message, so this never re-runs mid-conversation. */
174
+ @media (prefers-reduced-motion: no-preference) {
175
+ .agent-chat-start-screen__content > *,
176
+ .agent-chat-starter {
177
+ animation: agent-chat-start-screen-enter var(--sigvelo-motion-duration-disclosure)
178
+ var(--sigvelo-ease-snappy) backwards;
179
+ }
180
+
181
+ .agent-chat-start-screen__content > *:nth-child(2),
182
+ .agent-chat-starter:nth-child(2) {
183
+ animation-delay: calc(var(--sigvelo-motion-stagger-step) * 1);
184
+ }
185
+
186
+ .agent-chat-start-screen__content > *:nth-child(3),
187
+ .agent-chat-starter:nth-child(3) {
188
+ animation-delay: calc(var(--sigvelo-motion-stagger-step) * 2);
189
+ }
190
+
191
+ .agent-chat-starter:nth-child(4) {
192
+ animation-delay: calc(var(--sigvelo-motion-stagger-step) * 3);
193
+ }
194
+
195
+ .agent-chat-starter:nth-child(n + 5) {
196
+ animation-delay: calc(var(--sigvelo-motion-stagger-step) * 4);
197
+ }
198
+ }
199
+
200
+ @keyframes agent-chat-start-screen-enter {
201
+ from {
202
+ opacity: 0;
203
+ translate: 0 var(--sigvelo-motion-distance-md);
204
+ }
205
+ }
206
+
47
207
  /* Floating over the transcript: solid behind the controls, fading out
48
208
  through the top padding so content slides under instead of hitting a bar. */
49
209
  .agent-chat__composer {
@@ -164,6 +324,10 @@
164
324
  }
165
325
 
166
326
  @media (any-pointer: coarse) {
327
+ .agent-chat-starter__dismiss {
328
+ opacity: 1;
329
+ }
330
+
167
331
  .agent-chat__queued-message,
168
332
  .agent-chat__queued-action {
169
333
  min-block-size: var(--sigvelo-control-height-xl);
@@ -211,7 +375,42 @@
211
375
  }
212
376
 
213
377
  @media (forced-colors: active) {
378
+ .agent-chat-starter:hover,
379
+ .agent-chat-starter:focus-within {
380
+ outline: var(--sigvelo-border-width) solid CanvasText;
381
+ }
382
+
383
+ .agent-chat-starter__dismiss {
384
+ opacity: 1;
385
+ }
386
+
214
387
  .agent-chat__turn-error {
215
388
  border: var(--sigvelo-focus-width) solid CanvasText;
216
389
  }
217
390
  }
391
+
392
+ /* Sized against the chat's own box, not the viewport: this component is as
393
+ likely to be a 320px browser side panel as a full window, and the viewport
394
+ says nothing about which. Height still comes from the viewport — a container
395
+ cannot query its own block size without inline-size collapsing with it. */
396
+ @container agent-chat (width <= 36rem) {
397
+ .agent-chat-start-screen__content {
398
+ align-content: start;
399
+ padding-block: var(--sigvelo-spacing-5);
400
+ }
401
+
402
+ .agent-chat-start-screen__heading {
403
+ font-size: var(--sigvelo-text-2xl);
404
+ }
405
+
406
+ .agent-chat-starter__action {
407
+ font-size: var(--sigvelo-text-sm);
408
+ }
409
+ }
410
+
411
+ @media (max-height: 40rem) {
412
+ .agent-chat-start-screen__content {
413
+ align-content: start;
414
+ padding-block: var(--sigvelo-spacing-5);
415
+ }
416
+ }