@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
@@ -13,11 +13,96 @@
13
13
  margin: 0;
14
14
  }
15
15
 
16
+ /*
17
+ * Corner shape, system-wide.
18
+ *
19
+ * corner-shape has no effect on a square corner, so applying it everywhere
20
+ * costs nothing and means a component gets the shape by having a radius rather
21
+ * than by remembering to opt in. In browsers without corner-shape the token
22
+ * resolves to `round` and nothing changes.
23
+ *
24
+ * The exception is a pill or a circle: a superellipse turns a stadium into a
25
+ * lozenge and a circle into a squircle. Anything using --sigvelo-radius-full or
26
+ * --sigvelo-radius-circle therefore overrides the custom property back to
27
+ * `round` in the block below. audit:css-recipes fails if that list falls out of
28
+ * sync with the stylesheets.
29
+ */
30
+ :where(*) {
31
+ corner-shape: var(--sigvelo-corner-shape);
32
+ }
33
+
34
+ /* sigvelo-pill-shapes:start */
35
+ :where(
36
+ .agent-activity-preview__badge,
37
+ .agent-activity-preview__dismiss,
38
+ .agent-activity-preview__favicons img,
39
+ .agent-activity-preview__unviewed-dot,
40
+ .approval__key,
41
+ .avatar,
42
+ .avatar-group__count,
43
+ .avatar__badge,
44
+ .avatar__fallback,
45
+ .badge,
46
+ .browser-run-panel__tab-glyph,
47
+ .chain-of-thought__search-result,
48
+ .chain-of-thought__step-indicator,
49
+ .codex-model-selector__trigger,
50
+ .codex-model-selector__trigger::before,
51
+ .empty-state__icon,
52
+ .inline-citation__trigger,
53
+ .media-preview-card__play,
54
+ .menu__radio-indicator::before,
55
+ .message-scroller__button,
56
+ .plan__step-indicator,
57
+ .prompt-input__button[data-responsive-label],
58
+ .prompt-input__context-trigger,
59
+ .prompt-input__dictation[data-listening] .prompt-input__dictation-icon::before,
60
+ .prompt-input__permissions-trigger,
61
+ .prompt-input__recording-button,
62
+ .prompt-input__stop,
63
+ .prompt-input__submit,
64
+ .queue__item-indicator,
65
+ .radio,
66
+ .radio__indicator,
67
+ .scroll-area__thumb,
68
+ .slider__indicator,
69
+ .slider__thumb,
70
+ .slider__track,
71
+ .status-pill__dot,
72
+ .stepper__indicator,
73
+ .stepper__separator,
74
+ .stepper__trigger,
75
+ .subagent-run__milestone::before,
76
+ .subagent-run__selector,
77
+ .switch,
78
+ .switch__thumb,
79
+ .task__item::before,
80
+ .test-results__test-status,
81
+ .think-routine-library__routine-status,
82
+ [data-slot="meter-indicator"],
83
+ [data-slot="meter-track"],
84
+ [data-slot="progress-indicator"],
85
+ [data-slot="progress-track"]
86
+ ) {
87
+ --sigvelo-corner-shape: round;
88
+ }
89
+ /* sigvelo-pill-shapes:end */
90
+
91
+ /*
92
+ * Interface text reads at 14px, not at the 16px root.
93
+ *
94
+ * The root stays 16px so 1rem is still 16px and the 4px spacing grid is
95
+ * untouched — the same split the reference bundles use, where the type scale
96
+ * is re-pointed but the spacing base stays at 0.25rem. Components that name a
97
+ * step explicitly are unaffected; this only moves what inherited text lands on,
98
+ * which is where a 16px default reads oversized against 32px rows and 13px
99
+ * control labels.
100
+ */
16
101
  body {
17
102
  position: relative;
18
103
  font-family: var(--sigvelo-font-sans);
19
- font-size: var(--sigvelo-text-base);
20
- line-height: var(--sigvelo-leading-normal);
104
+ font-size: var(--sigvelo-text-sm);
105
+ line-height: var(--sigvelo-text-sm-leading);
21
106
  color: var(--sigvelo-color-text);
22
107
  background-color: var(--sigvelo-color-canvas);
23
108
  -webkit-font-smoothing: antialiased;
@@ -25,7 +110,7 @@ body {
25
110
  }
26
111
 
27
112
  .sigvelo-icon--spinner {
28
- animation: sigvelo-icon-spin var(--sigvelo-duration-slow) linear infinite;
113
+ animation: sigvelo-icon-spin var(--sigvelo-motion-duration-spin) linear infinite;
29
114
  transform-origin: center;
30
115
  }
31
116
 
@@ -56,6 +141,13 @@ body {
56
141
  }
57
142
  }
58
143
 
144
+ /* Headings are short enough for the browser to balance the rag for free;
145
+ balance gives up past a handful of lines, so this costs nothing on the
146
+ occasional long one. */
147
+ :where(h1, h2, h3, h4, h5, h6) {
148
+ text-wrap: balance;
149
+ }
150
+
59
151
  code,
60
152
  kbd,
61
153
  samp,
@@ -2,6 +2,12 @@
2
2
  * Standalone stylesheet for browser-control chrome mounted in a closed shadow
3
3
  * root. It intentionally uses system colors so it remains legible on arbitrary
4
4
  * pages without leaking the full document-level token sheet into the host.
5
+ *
6
+ * Every length here is a literal on purpose. The token layer does not exist
7
+ * inside this shadow root, so a --sigvelo-* reference resolves to nothing and
8
+ * takes its whole declaration with it — silently, and only on a real host page,
9
+ * which is the one place this is hard to notice. Keep the values on the 4px
10
+ * grid by hand; audit:css-recipes checks both halves of that.
5
11
  */
6
12
 
7
13
  :host {
@@ -18,6 +24,10 @@
18
24
  padding: 0;
19
25
  pointer-events: none;
20
26
  position: fixed;
27
+ /* Mirrors --sigvelo-z-host-overlay, deliberately as a literal. This sheet is
28
+ mounted in a closed shadow root on someone else's page, where the token
29
+ layer does not exist; var() would resolve to nothing, z-index would fall
30
+ back to auto, and the overlay would quietly stop being on top. */
21
31
  z-index: 2147483647;
22
32
  }
23
33
 
@@ -69,7 +79,7 @@
69
79
  font:
70
80
  600 12px/1.2 system-ui,
71
81
  sans-serif;
72
- padding: 7px 12px;
82
+ padding: 8px 12px;
73
83
  }
74
84
 
75
85
  :host button:focus-visible {
@@ -85,7 +95,7 @@
85
95
  :host .takeover,
86
96
  :host .owner {
87
97
  background: var(--browser-control-accent);
88
- border: var(--sigvelo-border-style) var(--sigvelo-border-width) var(--browser-control-accent-text);
98
+ border: solid 1px var(--browser-control-accent-text);
89
99
  box-shadow: 0 2px 10px var(--browser-control-shadow);
90
100
  color: var(--browser-control-accent-text);
91
101
  }
@@ -109,7 +119,7 @@
109
119
  left: 10px;
110
120
  max-width: min(360px, 60vw);
111
121
  overflow: hidden;
112
- padding: 7px 12px;
122
+ padding: 8px 12px;
113
123
  pointer-events: none;
114
124
  position: fixed;
115
125
  text-overflow: ellipsis;
@@ -120,8 +130,7 @@
120
130
  :host .banner {
121
131
  align-items: center;
122
132
  background: var(--browser-control-warning);
123
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
124
- var(--browser-control-warning-text);
133
+ border: solid 1px var(--browser-control-warning-text);
125
134
  border-radius: 14px;
126
135
  box-shadow: 0 4px 18px var(--browser-control-shadow);
127
136
  color: var(--browser-control-warning-text);
@@ -132,7 +141,7 @@
132
141
  gap: 10px;
133
142
  left: 50%;
134
143
  max-width: min(720px, calc(100vw - 32px));
135
- padding: 9px 10px 9px 16px;
144
+ padding: 8px 10px 8px 16px;
136
145
  pointer-events: auto;
137
146
  position: fixed;
138
147
  top: 12px;
@@ -148,7 +157,7 @@
148
157
 
149
158
  :host .banner .done,
150
159
  :host .banner .cannot {
151
- border: var(--sigvelo-border-style) var(--sigvelo-border-width) currentcolor;
160
+ border: solid 1px currentcolor;
152
161
  color: inherit;
153
162
  flex-shrink: 0;
154
163
  }
@@ -27,25 +27,17 @@
27
27
  opacity: 1;
28
28
  }
29
29
 
30
- /* The chip itself is the library Badge (sm/destructive) — only the overlay
31
- placement lives here. */
30
+ /* The chip itself is the library StatusPill (sm/destructive/busy) — only the
31
+ overlay placement lives here. */
32
32
  .browser-live-view__badge {
33
33
  position: absolute;
34
34
  inset-block-start: var(--sigvelo-spacing-2);
35
35
  inset-inline-end: var(--sigvelo-spacing-2);
36
36
  z-index: 1;
37
- box-shadow: var(--sigvelo-shadow-sm);
37
+ box-shadow: var(--sigvelo-elevation-raised);
38
38
  pointer-events: none;
39
39
  }
40
40
 
41
- .browser-live-view__badge-dot {
42
- inline-size: var(--sigvelo-spacing-1-5);
43
- block-size: var(--sigvelo-spacing-1-5);
44
- border-radius: var(--sigvelo-radius-circle);
45
- background-color: currentColor;
46
- animation: browser-live-view-pulse 1.4s ease-in-out infinite;
47
- }
48
-
49
41
  /* Ended state: quiet fill, same footprint so the layout never jumps */
50
42
  .browser-live-view__ended {
51
43
  display: flex;
@@ -91,10 +83,6 @@
91
83
  z-index: 1;
92
84
  }
93
85
 
94
- .browser-live-view__state-spinner {
95
- animation: sigvelo-icon-spin 900ms linear infinite;
96
- }
97
-
98
86
  /* Expand affordance, video-player style: quiet until the box is hovered or
99
87
  the button is focused */
100
88
  .browser-live-view__expand {
@@ -102,8 +90,8 @@
102
90
  inset-block-end: var(--sigvelo-spacing-2);
103
91
  inset-inline-end: var(--sigvelo-spacing-2);
104
92
  z-index: 1;
105
- background-color: var(--sigvelo-color-surface);
106
- box-shadow: var(--sigvelo-shadow-sm);
93
+ background-color: var(--sigvelo-color-surface-raised);
94
+ box-shadow: var(--sigvelo-elevation-floating);
107
95
  opacity: 0;
108
96
  transition:
109
97
  opacity var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
@@ -144,27 +132,6 @@
144
132
  object-fit: contain;
145
133
  }
146
134
 
147
- @keyframes browser-live-view-pulse {
148
- 0%,
149
- 100% {
150
- opacity: 1;
151
- }
152
- 50% {
153
- opacity: 0.4;
154
- }
155
- }
156
-
157
- @media (prefers-reduced-motion: reduce) {
158
- .browser-live-view__badge-dot,
159
- .browser-live-view__state-spinner {
160
- animation: none;
161
- }
162
- }
163
-
164
- :root[data-motion="reduce"] :is(.browser-live-view__badge-dot, .browser-live-view__state-spinner) {
165
- animation: none;
166
- }
167
-
168
135
  @media (hover: none) {
169
136
  .browser-live-view__expand {
170
137
  opacity: 1;
@@ -34,15 +34,11 @@
34
34
  pointer-events: none;
35
35
  }
36
36
 
37
+ /* Positioning only: this overlays the replay stage. The typography is
38
+ .empty-state. */
37
39
  .browser-replay__empty {
38
40
  position: absolute;
39
41
  inset: 0;
40
- display: grid;
41
- place-content: center;
42
- padding: var(--sigvelo-spacing-4);
43
- color: var(--sigvelo-color-text-muted);
44
- font-size: var(--sigvelo-text-compact);
45
- text-align: center;
46
42
  }
47
43
 
48
44
  .browser-replay__controls {
@@ -5,7 +5,7 @@
5
5
  }
6
6
 
7
7
  .browser-run-panel .web-preview__nav:has(.browser-run-panel__tabs) {
8
- min-block-size: 3rem;
8
+ min-block-size: var(--sigvelo-spacing-12);
9
9
  gap: 0;
10
10
  padding-block: 0;
11
11
  padding-inline: var(--sigvelo-spacing-1-5);
@@ -49,8 +49,8 @@
49
49
  .browser-run-panel__tab-glyph {
50
50
  display: grid;
51
51
  flex: none;
52
- inline-size: 1.125rem;
53
- block-size: 1.125rem;
52
+ inline-size: var(--sigvelo-control-icon-size-lg);
53
+ block-size: var(--sigvelo-control-icon-size-lg);
54
54
  place-items: center;
55
55
  border-radius: var(--sigvelo-radius-circle);
56
56
  background: var(--sigvelo-color-primary-bg-subtle);
@@ -67,7 +67,7 @@
67
67
  }
68
68
 
69
69
  .browser-run-panel__address-bar {
70
- min-block-size: 3rem;
70
+ min-block-size: var(--sigvelo-spacing-12);
71
71
  background: var(--sigvelo-color-surface);
72
72
  }
73
73
 
@@ -101,20 +101,6 @@
101
101
  color: var(--sigvelo-color-danger-text);
102
102
  }
103
103
 
104
- .browser-run-panel__spinner {
105
- animation: sigvelo-icon-spin 900ms linear infinite;
106
- }
107
-
108
- @media (prefers-reduced-motion: reduce) {
109
- .browser-run-panel__spinner {
110
- animation: none;
111
- }
112
- }
113
-
114
- :root[data-motion="reduce"] .browser-run-panel__spinner {
115
- animation: none;
116
- }
117
-
118
104
  @media (forced-colors: active) {
119
105
  .browser-run-panel__tab[data-active] {
120
106
  outline: var(--sigvelo-focus-ring-forced);
@@ -27,7 +27,9 @@
27
27
  color var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
28
28
  border-color var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
29
29
  box-shadow var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change),
30
- translate var(--sigvelo-motion-duration-interaction) var(--sigvelo-motion-ease-change);
30
+ /* Release settles with a damped spring; the color transitions above stay on
31
+ the standard curve, where a bounce would just read as a slow fade. */
32
+ translate var(--sigvelo-motion-duration-presence) var(--sigvelo-ease-press);
31
33
  }
32
34
 
33
35
  .button svg {
@@ -1,10 +1,10 @@
1
1
  .card {
2
- background-color: var(--sigvelo-color-surface);
2
+ background-color: var(--sigvelo-color-surface-raised);
3
3
  color: var(--sigvelo-color-text);
4
- /* Shadow-led elevation: no perimeter border */
4
+ /* Shadow-led elevation: the hairline ring in the stack is the perimeter. */
5
5
  border-radius: var(--sigvelo-radius-lg);
6
6
  padding: var(--sigvelo-spacing-4);
7
- box-shadow: var(--sigvelo-shadow-sm);
7
+ box-shadow: var(--sigvelo-elevation-raised);
8
8
  transition: box-shadow var(--sigvelo-motion-duration-interaction)
9
9
  var(--sigvelo-motion-ease-change);
10
10
  }
@@ -83,7 +83,7 @@
83
83
  }
84
84
 
85
85
  .card--hover:hover {
86
- box-shadow: var(--sigvelo-shadow-md);
86
+ box-shadow: var(--sigvelo-elevation-floating);
87
87
  }
88
88
 
89
89
  .card--hover:focus-visible {
@@ -44,7 +44,6 @@
44
44
  background-color: var(--sigvelo-color-primary-bg-subtle);
45
45
  border-color: var(--sigvelo-color-primary-border-muted);
46
46
  color: var(--sigvelo-color-primary-text);
47
- animation: sigvelo-icon-spin 1.6s linear infinite;
48
47
  }
49
48
 
50
49
  .chain-of-thought__step-body {
@@ -73,7 +73,7 @@
73
73
  font-size: var(--sigvelo-text-2xl);
74
74
  font-weight: var(--sigvelo-font-weight-bold);
75
75
  letter-spacing: 0;
76
- line-height: 1.1;
76
+ line-height: var(--sigvelo-leading-tight);
77
77
  }
78
78
 
79
79
  .chatgpt-sign-in__brand p {
@@ -93,8 +93,8 @@
93
93
  }
94
94
 
95
95
  .chatgpt-sign-in__brand-mark :where(img, svg) {
96
- inline-size: 1.35rem;
97
- block-size: 1.35rem;
96
+ inline-size: var(--sigvelo-control-icon-size-xl);
97
+ block-size: var(--sigvelo-control-icon-size-xl);
98
98
  filter: drop-shadow(
99
99
  0 0.25rem 0.5rem color-mix(in oklab, var(--sigvelo-color-primary-bg), transparent 72%)
100
100
  );
@@ -109,7 +109,8 @@
109
109
  overflow: hidden;
110
110
  min-inline-size: min(100%, 16.75rem);
111
111
  box-shadow:
112
- inset 0 0 0 1px color-mix(in oklab, var(--sigvelo-color-primary-text-on-bg), transparent 84%),
112
+ inset 0 0 0 var(--sigvelo-border-width)
113
+ color-mix(in oklab, var(--sigvelo-color-primary-text-on-bg), transparent 84%),
113
114
  0 0.75rem 1.5rem color-mix(in oklab, var(--sigvelo-color-primary-bg), transparent 78%);
114
115
  translate: 0;
115
116
  scale: 1;
@@ -153,7 +154,8 @@
153
154
 
154
155
  .chatgpt-sign-in__button:hover:not([data-disabled]) {
155
156
  box-shadow:
156
- inset 0 0 0 1px color-mix(in oklab, var(--sigvelo-color-primary-text-on-bg), transparent 76%),
157
+ inset 0 0 0 var(--sigvelo-border-width)
158
+ color-mix(in oklab, var(--sigvelo-color-primary-text-on-bg), transparent 76%),
157
159
  0 0.9rem 1.9rem color-mix(in oklab, var(--sigvelo-color-primary-bg), transparent 72%);
158
160
  translate: 0 -0.0625rem;
159
161
  }
@@ -15,7 +15,7 @@
15
15
  display: flex;
16
16
  align-items: center;
17
17
  gap: var(--sigvelo-spacing-2);
18
- min-block-size: 2.75rem;
18
+ min-block-size: var(--sigvelo-spacing-11);
19
19
  padding-inline: var(--sigvelo-spacing-3);
20
20
  border-radius: var(--sigvelo-radius-md);
21
21
  color: var(--sigvelo-color-text);
@@ -40,8 +40,8 @@
40
40
  }
41
41
 
42
42
  .checkbox-group__icon svg {
43
- inline-size: 1rem;
44
- block-size: 1rem;
43
+ inline-size: var(--sigvelo-control-icon-size-md);
44
+ block-size: var(--sigvelo-control-icon-size-md);
45
45
  }
46
46
 
47
47
  .checkbox-group__content {
@@ -56,10 +56,10 @@
56
56
  .code-block__content {
57
57
  margin: 0;
58
58
  padding-block: var(--sigvelo-spacing-3);
59
- padding-inline: 0.875rem;
59
+ padding-inline: var(--sigvelo-spacing-3-5);
60
60
  font-family: var(--sigvelo-font-mono);
61
61
  font-size: var(--sigvelo-text-compact);
62
- line-height: 1.55;
62
+ line-height: var(--sigvelo-leading-normal);
63
63
  color: var(--sigvelo-color-text);
64
64
  overflow: visible;
65
65
  }
@@ -71,11 +71,11 @@
71
71
  .code-block__content--highlighted pre.shiki {
72
72
  margin: 0;
73
73
  padding-block: var(--sigvelo-spacing-3);
74
- padding-inline: 0.875rem;
74
+ padding-inline: var(--sigvelo-spacing-3-5);
75
75
  background-color: transparent !important;
76
76
  font-family: var(--sigvelo-font-mono);
77
77
  font-size: var(--sigvelo-text-compact);
78
- line-height: 1.55;
78
+ line-height: var(--sigvelo-leading-normal);
79
79
  overflow: visible;
80
80
  }
81
81
 
@@ -30,7 +30,7 @@
30
30
  .context-menu__radio-item:focus-visible,
31
31
  .context-menu__submenu-trigger:focus-visible {
32
32
  outline: none;
33
- box-shadow: inset 0 0 0 var(--sigvelo-focus-width) var(--sigvelo-color-focus);
33
+ box-shadow: var(--sigvelo-recipe-focus-shadow-inset);
34
34
  }
35
35
 
36
36
  .context-menu__label {
@@ -32,51 +32,16 @@
32
32
  min-block-size: 0;
33
33
  }
34
34
 
35
- .conversation__empty {
36
- display: flex;
37
- flex: 1;
38
- flex-direction: column;
39
- align-items: center;
40
- justify-content: center;
41
- gap: var(--sigvelo-spacing-2);
42
- padding-block: var(--sigvelo-spacing-12);
43
- padding-inline: var(--sigvelo-spacing-6);
44
- text-align: center;
45
- color: var(--sigvelo-color-text-muted);
46
- }
47
-
48
- .conversation__empty-icon {
49
- display: inline-flex;
50
- align-items: center;
51
- justify-content: center;
52
- inline-size: var(--sigvelo-spacing-12);
53
- block-size: var(--sigvelo-spacing-12);
54
- border-radius: var(--sigvelo-radius-full);
55
- background-color: var(--sigvelo-color-neutral-bg-subtle);
56
- color: var(--sigvelo-color-text-muted);
57
- margin-block-end: var(--sigvelo-spacing-1);
58
- }
59
-
60
- .conversation__empty-title {
61
- font-size: var(--sigvelo-text-base);
62
- font-weight: var(--sigvelo-font-weight-semibold);
63
- color: var(--sigvelo-color-text);
64
- }
65
-
66
- .conversation__empty-description {
67
- max-inline-size: 32ch;
68
- font-size: var(--sigvelo-text-sm);
69
- line-height: var(--sigvelo-leading-normal);
70
- color: var(--sigvelo-color-text-muted);
71
- }
72
-
73
35
  .conversation__scroll-button {
74
36
  position: absolute;
75
37
  inset-inline-end: var(--sigvelo-spacing-3);
76
38
  inset-block-end: var(--sigvelo-spacing-3);
77
39
  z-index: 1;
78
- box-shadow: var(--sigvelo-shadow-sm);
79
- background-color: var(--sigvelo-color-surface);
40
+ /* Hovers over the transcript rather than sitting in it, so it takes the
41
+ floating stack: the wide ambient layer is what separates it from whatever
42
+ message happens to scroll underneath. */
43
+ box-shadow: var(--sigvelo-elevation-floating);
44
+ background-color: var(--sigvelo-color-surface-raised);
80
45
  }
81
46
 
82
47
  .conversation__download-button {
@@ -84,8 +49,8 @@
84
49
  inset-inline-end: var(--sigvelo-spacing-3);
85
50
  inset-block-start: var(--sigvelo-spacing-3);
86
51
  z-index: 1;
87
- box-shadow: var(--sigvelo-shadow-xs);
88
- background-color: var(--sigvelo-color-surface);
52
+ box-shadow: var(--sigvelo-elevation-floating);
53
+ background-color: var(--sigvelo-color-surface-raised);
89
54
  }
90
55
 
91
56
  @media (forced-colors: active) {
@@ -44,7 +44,7 @@
44
44
  }
45
45
 
46
46
  .description-list[data-variant="divided"] .description-list__term svg {
47
- inline-size: 1rem;
48
- block-size: 1rem;
47
+ inline-size: var(--sigvelo-control-icon-size-md);
48
+ block-size: var(--sigvelo-control-icon-size-md);
49
49
  flex: 0 0 auto;
50
50
  }
@@ -1,6 +1,21 @@
1
+ /* Blurring the page behind the scrim reads as depth rather than as a dark
2
+ sheet, and keeps the dismissed content recognizable underneath. Browsers
3
+ without backdrop-filter still get the scrim on its own.
4
+
5
+ The blur does run on every frame of the open fade — the scrim covers the
6
+ viewport, so each frame re-filters all of it. What makes that affordable is
7
+ the filter itself: one 8px radius, no second pass. An earlier
8
+ blur(24px) saturate(180%) cost about a third of the Storybook suite in
9
+ timing failures, in stories that had nothing to do with dialogs.
10
+
11
+ Gating this behind :not([data-starting-style]) looks like it skips the fade
12
+ and does not. Base UI drops that attribute on the frame after mount, so the
13
+ blur is live from frame 1 while the opacity climbs for ~13 more. It bought
14
+ one frame and read as though it bought fourteen. */
1
15
  .dialog__backdrop {
2
16
  background-color: var(--sigvelo-color-backdrop);
3
- z-index: 50;
17
+ backdrop-filter: var(--sigvelo-glass-filter);
18
+ z-index: var(--sigvelo-z-overlay);
4
19
  }
5
20
 
6
21
  .dialog__popup {
@@ -10,7 +25,7 @@
10
25
  inset-block-start: 50%;
11
26
  inset-inline-start: 50%;
12
27
  translate: -50% -50%;
13
- z-index: 50;
28
+ z-index: var(--sigvelo-z-overlay);
14
29
  inline-size: calc(100% - var(--sigvelo-control-height-sm));
15
30
  max-inline-size: 32rem;
16
31
  max-block-size: calc(100dvb - var(--sigvelo-spacing-8));
@@ -0,0 +1,48 @@
1
+ /*
2
+ * One anatomy for every "there is nothing here yet". Codex splits these into
3
+ * an inline variant and a page variant, but the difference between them is how
4
+ * much the container gives the block, not what the block is — so the size
5
+ * lives in one variable and the centring lives in the parent.
6
+ */
7
+ .empty-state {
8
+ --sigvelo-recipe-empty-state-padding-block: var(--sigvelo-spacing-4);
9
+
10
+ display: flex;
11
+ flex-direction: column;
12
+ align-items: center;
13
+ justify-content: center;
14
+ gap: var(--sigvelo-spacing-2);
15
+ padding-block: var(--sigvelo-recipe-empty-state-padding-block);
16
+ padding-inline: var(--sigvelo-spacing-3);
17
+ color: var(--sigvelo-color-text-muted);
18
+ font-size: var(--sigvelo-text-compact);
19
+ line-height: var(--sigvelo-text-compact-leading);
20
+ text-align: center;
21
+ }
22
+
23
+ .empty-state__icon {
24
+ display: inline-flex;
25
+ align-items: center;
26
+ justify-content: center;
27
+ inline-size: var(--sigvelo-spacing-12);
28
+ block-size: var(--sigvelo-spacing-12);
29
+ margin-block-end: var(--sigvelo-spacing-1);
30
+ border-radius: var(--sigvelo-radius-full);
31
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
32
+ color: var(--sigvelo-color-text-muted);
33
+ }
34
+
35
+ .empty-state__title {
36
+ color: var(--sigvelo-color-text);
37
+ font-size: var(--sigvelo-text-base);
38
+ font-weight: var(--sigvelo-font-weight-semibold);
39
+ line-height: var(--sigvelo-text-base-leading);
40
+ }
41
+
42
+ /* Prose, so it takes a measure. Without one a wide panel sets a single
43
+ sentence across its whole width and the reader loses the line. */
44
+ .empty-state__description {
45
+ max-inline-size: 32ch;
46
+ font-size: var(--sigvelo-text-sm);
47
+ line-height: var(--sigvelo-text-sm-leading);
48
+ }
@@ -4,7 +4,7 @@
4
4
  justify-content: space-between;
5
5
  gap: var(--sigvelo-spacing-3);
6
6
  padding-block: var(--sigvelo-spacing-2-5);
7
- padding-inline: 0.875rem;
7
+ padding-inline: var(--sigvelo-spacing-3-5);
8
8
  border-block-end: var(--sigvelo-border-style) var(--sigvelo-border-width)
9
9
  var(--sigvelo-color-neutral-border-subtle);
10
10
  }
@@ -42,7 +42,7 @@
42
42
 
43
43
  .environment-variables__group-label {
44
44
  padding-block: var(--sigvelo-spacing-1-5);
45
- padding-inline: 0.875rem;
45
+ padding-inline: var(--sigvelo-spacing-3-5);
46
46
  font-size: var(--sigvelo-text-2xs);
47
47
  font-weight: var(--sigvelo-font-weight-bold);
48
48
  text-transform: uppercase;
@@ -58,7 +58,7 @@
58
58
  align-items: center;
59
59
  gap: var(--sigvelo-spacing-2-5);
60
60
  padding-block: var(--sigvelo-spacing-2);
61
- padding-inline: 0.875rem;
61
+ padding-inline: var(--sigvelo-spacing-3-5);
62
62
  border-block-end: var(--sigvelo-border-style) var(--sigvelo-border-width)
63
63
  var(--sigvelo-color-neutral-border-subtle);
64
64
  }
@@ -79,7 +79,7 @@
79
79
  .environment-variables__value {
80
80
  flex: 1;
81
81
  min-width: 0;
82
- padding-block: 0.3125rem;
82
+ padding-block: var(--sigvelo-spacing-1-5);
83
83
  padding-inline: var(--sigvelo-spacing-2);
84
84
  font-family: var(--sigvelo-font-mono);
85
85
  font-size: var(--sigvelo-text-xs);