@mcp-b/react-components 0.1.5 → 0.2.1

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 +10 -3
@@ -8,6 +8,7 @@
8
8
  color: var(--sigvelo-color-text);
9
9
  background-color: transparent;
10
10
  border: none;
11
+ border-radius: var(--sigvelo-radius-sm);
11
12
  outline: none;
12
13
  }
13
14
 
@@ -15,6 +16,13 @@
15
16
  color: var(--sigvelo-color-text-muted);
16
17
  }
17
18
 
19
+ .autocomplete__input:focus-visible {
20
+ outline: none;
21
+ box-shadow:
22
+ 0 0 0 2px var(--sigvelo-color-canvas),
23
+ 0 0 0 4px var(--sigvelo-color-focus);
24
+ }
25
+
18
26
  .autocomplete__trigger {
19
27
  display: inline-flex;
20
28
  align-items: center;
@@ -23,8 +31,9 @@
23
31
  color: var(--sigvelo-color-text-muted);
24
32
  background-color: transparent;
25
33
  border: none;
34
+ border-radius: var(--sigvelo-radius-sm);
26
35
  cursor: pointer;
27
- transition: color 150ms ease;
36
+ transition: color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
28
37
  }
29
38
 
30
39
  .autocomplete__trigger:hover {
@@ -33,6 +42,9 @@
33
42
 
34
43
  .autocomplete__trigger:focus-visible {
35
44
  outline: none;
45
+ box-shadow:
46
+ 0 0 0 2px var(--sigvelo-color-canvas),
47
+ 0 0 0 4px var(--sigvelo-color-focus);
36
48
  }
37
49
 
38
50
  .autocomplete__clear {
@@ -46,8 +58,8 @@
46
58
  border-radius: var(--sigvelo-radius-sm);
47
59
  cursor: pointer;
48
60
  transition:
49
- color 150ms ease,
50
- background-color 150ms ease;
61
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
62
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
51
63
  }
52
64
 
53
65
  .autocomplete__clear:hover {
@@ -55,6 +67,13 @@
55
67
  background-color: var(--sigvelo-color-neutral-bg-subtle);
56
68
  }
57
69
 
70
+ .autocomplete__clear:focus-visible {
71
+ outline: none;
72
+ box-shadow:
73
+ 0 0 0 2px var(--sigvelo-color-canvas),
74
+ 0 0 0 4px var(--sigvelo-color-focus);
75
+ }
76
+
58
77
  .autocomplete__positioner {
59
78
  z-index: 50;
60
79
  }
@@ -71,7 +90,7 @@
71
90
  box-shadow:
72
91
  0 10px 15px -3px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%),
73
92
  0 4px 6px -4px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%);
74
- animation: autocomplete-popup-enter 150ms ease;
93
+ animation: autocomplete-popup-enter var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
75
94
  }
76
95
 
77
96
  .autocomplete__popup[data-ending-style] {
@@ -117,8 +136,8 @@
117
136
  cursor: pointer;
118
137
  outline: none;
119
138
  transition:
120
- background-color 150ms ease,
121
- color 150ms ease;
139
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
140
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
122
141
  }
123
142
 
124
143
  .autocomplete__item:hover,
@@ -18,10 +18,10 @@
18
18
  border-radius: var(--sigvelo-radius-full);
19
19
  white-space: nowrap;
20
20
  transition:
21
- background-color 150ms ease,
22
- color 150ms ease,
23
- border-color 150ms ease,
24
- box-shadow 150ms ease;
21
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
22
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
23
+ border-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
24
+ box-shadow var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
25
25
  }
26
26
 
27
27
  .badge:where(a, button) {
@@ -29,8 +29,10 @@
29
29
  }
30
30
 
31
31
  .badge:focus-visible {
32
- outline: var(--sigvelo-focus-ring);
33
- outline-offset: var(--sigvelo-focus-offset);
32
+ outline: none;
33
+ box-shadow:
34
+ 0 0 0 2px var(--sigvelo-color-canvas),
35
+ 0 0 0 4px var(--sigvelo-color-focus);
34
36
  }
35
37
 
36
38
  .badge:is([aria-invalid="true"], [data-invalid="true"], [data-invalid=""]) {
@@ -0,0 +1,164 @@
1
+ /* Live view of an agent's Browser Run session — hairline box, no chrome.
2
+ Styles the BrowserLiveView component from @mcp-b/think-chat. The CSS lives
3
+ in this shared stylesheet because think-chat ships no CSS of its own — its
4
+ consumers already load @mcp-b/react-components/styles. */
5
+ .browser-live-view {
6
+ position: relative;
7
+ display: flex;
8
+ width: 100%;
9
+ aspect-ratio: 16 / 10;
10
+ font-family: var(--sigvelo-font-sans);
11
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width)
12
+ var(--sigvelo-color-neutral-border-subtle);
13
+ border-radius: var(--sigvelo-radius-lg);
14
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
15
+ overflow: hidden;
16
+ }
17
+
18
+ .browser-live-view__frame {
19
+ width: 100%;
20
+ height: 100%;
21
+ border: none;
22
+ }
23
+
24
+ /* The chip itself is the library Badge (sm/destructive) — only the overlay
25
+ placement lives here. */
26
+ .browser-live-view__badge {
27
+ position: absolute;
28
+ top: 0.5rem;
29
+ inset-inline-end: 0.5rem;
30
+ z-index: 1;
31
+ box-shadow: var(--sigvelo-shadow-sm);
32
+ pointer-events: none;
33
+ }
34
+
35
+ .browser-live-view__badge-dot {
36
+ width: 0.375rem;
37
+ height: 0.375rem;
38
+ border-radius: 50%;
39
+ background-color: currentColor;
40
+ animation: browser-live-view-pulse 1.4s ease-in-out infinite;
41
+ }
42
+
43
+ /* Ended state: quiet fill, same footprint so the layout never jumps */
44
+ .browser-live-view__ended {
45
+ display: flex;
46
+ flex-direction: column;
47
+ align-items: center;
48
+ justify-content: center;
49
+ gap: 0.25rem;
50
+ width: 100%;
51
+ }
52
+
53
+ .browser-live-view__ended-title {
54
+ font-size: 0.8125rem;
55
+ font-weight: var(--sigvelo-font-weight-semibold);
56
+ color: var(--sigvelo-color-text-muted);
57
+ }
58
+
59
+ .browser-live-view__ended-detail {
60
+ font-size: 0.75rem;
61
+ color: var(--sigvelo-color-text-muted);
62
+ max-width: 80%;
63
+ overflow: hidden;
64
+ text-overflow: ellipsis;
65
+ white-space: nowrap;
66
+ }
67
+
68
+ /* An expired view showing a screenshot fallback keeps the image flush */
69
+ .browser-live-view[data-expired] > img {
70
+ width: 100%;
71
+ height: 100%;
72
+ object-fit: cover;
73
+ }
74
+
75
+ /* Connecting overlay: opaque so the hosted viewer's own loading/error page
76
+ never flashes through; cleared on the iframe's load event. */
77
+ .browser-live-view__state {
78
+ position: absolute;
79
+ inset: 0;
80
+ display: flex;
81
+ flex-direction: column;
82
+ align-items: center;
83
+ justify-content: center;
84
+ gap: 0.5rem;
85
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
86
+ color: var(--sigvelo-color-text-muted);
87
+ font-size: 0.8125rem;
88
+ }
89
+
90
+ .browser-live-view__state-spinner {
91
+ animation: browser-live-view-spin 900ms linear infinite;
92
+ }
93
+
94
+ /* Expand affordance, video-player style: quiet until the box is hovered or
95
+ the button is focused */
96
+ .browser-live-view__expand {
97
+ position: absolute;
98
+ inset-block-end: 0.5rem;
99
+ inset-inline-end: 0.5rem;
100
+ z-index: 1;
101
+ background-color: var(--sigvelo-color-surface);
102
+ box-shadow: var(--sigvelo-shadow-sm);
103
+ opacity: 0;
104
+ transition:
105
+ opacity var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
106
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
107
+ }
108
+
109
+ .browser-live-view:hover .browser-live-view__expand,
110
+ .browser-live-view__expand:focus-visible {
111
+ opacity: 1;
112
+ }
113
+
114
+ /* Fullscreen dialog: the view fills everything under the title row */
115
+ .browser-live-view__dialog {
116
+ display: flex;
117
+ flex-direction: column;
118
+ gap: 0.75rem;
119
+ }
120
+
121
+ .browser-live-view__dialog-body {
122
+ position: relative;
123
+ flex: 1;
124
+ min-height: 0;
125
+ display: flex;
126
+ border-radius: var(--sigvelo-radius-md);
127
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
128
+ overflow: hidden;
129
+ }
130
+
131
+ .browser-live-view__dialog-body > iframe {
132
+ width: 100%;
133
+ height: 100%;
134
+ border: none;
135
+ }
136
+
137
+ .browser-live-view__dialog-body > img {
138
+ width: 100%;
139
+ height: 100%;
140
+ object-fit: contain;
141
+ }
142
+
143
+ @keyframes browser-live-view-pulse {
144
+ 0%,
145
+ 100% {
146
+ opacity: 1;
147
+ }
148
+ 50% {
149
+ opacity: 0.4;
150
+ }
151
+ }
152
+
153
+ @keyframes browser-live-view-spin {
154
+ to {
155
+ transform: rotate(360deg);
156
+ }
157
+ }
158
+
159
+ @media (prefers-reduced-motion: reduce) {
160
+ .browser-live-view__badge-dot,
161
+ .browser-live-view__state-spinner {
162
+ animation: none;
163
+ }
164
+ }
@@ -0,0 +1,189 @@
1
+ /* Styles the BrowserReplay component from @mcp-b/think-chat. The CSS lives in
2
+ this shared stylesheet because think-chat ships no CSS of its own — its
3
+ consumers already load @mcp-b/react-components/styles. */
4
+ .browser-replay {
5
+ display: flex;
6
+ flex-direction: column;
7
+ width: 100%;
8
+ font-family: var(--sigvelo-font-sans);
9
+ color: var(--sigvelo-color-text);
10
+ background-color: var(--sigvelo-color-surface);
11
+ border: var(--sigvelo-border-style) var(--sigvelo-border-width)
12
+ var(--sigvelo-color-neutral-border-subtle);
13
+ border-radius: var(--sigvelo-radius-lg);
14
+ overflow: hidden;
15
+ }
16
+
17
+ .browser-replay__stage-wrap {
18
+ position: relative;
19
+ width: 100%;
20
+ aspect-ratio: 16 / 10;
21
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
22
+ overflow: hidden;
23
+ }
24
+
25
+ .browser-replay__stage {
26
+ position: absolute;
27
+ inset: 0;
28
+ overflow: hidden;
29
+ }
30
+
31
+ .browser-replay__stage iframe {
32
+ border: 0;
33
+ background-color: var(--sigvelo-color-surface);
34
+ pointer-events: none;
35
+ }
36
+
37
+ .browser-replay__empty {
38
+ position: absolute;
39
+ inset: 0;
40
+ display: grid;
41
+ place-content: center;
42
+ padding: 1rem;
43
+ color: var(--sigvelo-color-text-muted);
44
+ font-size: 0.8125rem;
45
+ text-align: center;
46
+ }
47
+
48
+ .browser-replay__controls {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: 0.625rem;
52
+ padding-block: 0.5rem;
53
+ padding-inline: 0.75rem;
54
+ border-block-start: var(--sigvelo-border-style) var(--sigvelo-border-width)
55
+ var(--sigvelo-color-neutral-border-subtle);
56
+ background-color: var(--sigvelo-color-surface);
57
+ }
58
+
59
+ /* Play/pause is the library Button (ghost/icon-sm) and the scrubber is the
60
+ library Slider — only flex sizing lives here. */
61
+ .browser-replay__toggle {
62
+ flex: 0 0 auto;
63
+ }
64
+
65
+ .browser-replay__scrubber {
66
+ flex: 1;
67
+ min-width: 0;
68
+ }
69
+
70
+ .browser-replay__time {
71
+ color: var(--sigvelo-color-text-muted);
72
+ font-family: var(--sigvelo-font-mono);
73
+ font-size: 0.6875rem;
74
+ font-variant-numeric: tabular-nums;
75
+ white-space: nowrap;
76
+ }
77
+
78
+ /* Vendored from @rrweb/replay/dist/style.css so consumers do not need CSS package imports. */
79
+ .browser-replay .replayer-wrapper {
80
+ position: relative;
81
+ }
82
+
83
+ .browser-replay .replayer-mouse {
84
+ position: absolute;
85
+ width: 20px;
86
+ height: 20px;
87
+ transition:
88
+ left 50ms linear,
89
+ top 50ms linear;
90
+ background-image: url("data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9JzMwMHB4JyB3aWR0aD0nMzAwcHgnICBmaWxsPSIjMDAwMDAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGRhdGEtbmFtZT0iTGF5ZXIgMSIgdmlld0JveD0iMCAwIDUwIDUwIiB4PSIwcHgiIHk9IjBweCI+PHRpdGxlPkRlc2lnbl90bnA8L3RpdGxlPjxwYXRoIGQ9Ik00OC43MSw0Mi45MUwzNC4wOCwyOC4yOSw0NC4zMywxOEExLDEsMCwwLDAsNDQsMTYuMzlMMi4zNSwxLjA2QTEsMSwwLDAsMCwxLjA2LDIuMzVMMTYuMzksNDRhMSwxLDAsMCwwLDEuNjUuMzZMMjguMjksMzQuMDgsNDIuOTEsNDguNzFhMSwxLDAsMCwwLDEuNDEsMGw0LjM4LTQuMzhBMSwxLDAsMCwwLDQ4LjcxLDQyLjkxWm0tNS4wOSwzLjY3TDI5LDMyYTEsMSwwLDAsMC0xLjQxLDBsLTkuODUsOS44NUwzLjY5LDMuNjlsMzguMTIsMTRMMzIsMjcuNThBMSwxLDAsMCwwLDMyLDI5TDQ2LjU5LDQzLjYyWiI+PC9wYXRoPjwvc3ZnPg==");
91
+ background-repeat: no-repeat;
92
+ background-position: center;
93
+ background-size: contain;
94
+ border-color: transparent;
95
+ }
96
+
97
+ .browser-replay .replayer-mouse::after {
98
+ content: "";
99
+ display: inline-block;
100
+ width: 20px;
101
+ height: 20px;
102
+ background: var(--sigvelo-color-focus);
103
+ border-radius: 100%;
104
+ transform: translate(-50%, -50%);
105
+ opacity: 0.3;
106
+ }
107
+
108
+ .browser-replay .replayer-mouse.active::after {
109
+ animation: browser-replay-click 200ms ease-in-out 1;
110
+ }
111
+
112
+ .browser-replay .replayer-mouse.touch-device {
113
+ width: 70px;
114
+ height: 70px;
115
+ margin-top: -37px;
116
+ margin-left: -37px;
117
+ background-image: none;
118
+ border-color: transparent;
119
+ border-style: solid;
120
+ border-width: 4px;
121
+ border-radius: 100%;
122
+ transition:
123
+ left 0s linear,
124
+ top 0s linear,
125
+ border-color 200ms ease-in-out;
126
+ }
127
+
128
+ .browser-replay .replayer-mouse.touch-device.touch-active {
129
+ border-color: var(--sigvelo-color-focus);
130
+ transition:
131
+ left 250ms linear,
132
+ top 250ms linear,
133
+ border-color 200ms ease-in-out;
134
+ }
135
+
136
+ .browser-replay .replayer-mouse.touch-device::after {
137
+ opacity: 0;
138
+ }
139
+
140
+ .browser-replay .replayer-mouse.touch-device.active::after {
141
+ animation: browser-replay-touch-click 200ms ease-in-out 1;
142
+ }
143
+
144
+ .browser-replay .replayer-mouse-tail {
145
+ position: absolute;
146
+ pointer-events: none;
147
+ }
148
+
149
+ @keyframes browser-replay-click {
150
+ 0% {
151
+ width: 20px;
152
+ height: 20px;
153
+ opacity: 0.3;
154
+ }
155
+
156
+ 50% {
157
+ width: 10px;
158
+ height: 10px;
159
+ opacity: 0.5;
160
+ }
161
+ }
162
+
163
+ @keyframes browser-replay-touch-click {
164
+ 0% {
165
+ width: 20px;
166
+ height: 20px;
167
+ opacity: 0;
168
+ }
169
+
170
+ 50% {
171
+ width: 10px;
172
+ height: 10px;
173
+ opacity: 0.5;
174
+ }
175
+ }
176
+
177
+ @media (prefers-reduced-motion: reduce) {
178
+ .browser-replay .replayer-mouse,
179
+ .browser-replay .replayer-mouse.active::after {
180
+ animation: none;
181
+ transition: none;
182
+ }
183
+ }
184
+
185
+ @media (forced-colors: active) {
186
+ .browser-replay {
187
+ border: 1px solid CanvasText;
188
+ }
189
+ }
@@ -12,15 +12,23 @@
12
12
  text-decoration: none;
13
13
  border-radius: var(--sigvelo-radius-md);
14
14
  transition:
15
- background-color 150ms ease,
16
- color 150ms ease,
17
- border-color 150ms ease,
18
- box-shadow 150ms ease;
15
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
16
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
17
+ border-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
18
+ box-shadow var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
19
+ }
20
+
21
+ /* ponytail: one brightness rule covers press feedback for every variant;
22
+ upgrade to per-variant color-mix rules if filter side effects ever bite */
23
+ .button:active:not([data-disabled]) {
24
+ filter: brightness(0.94);
19
25
  }
20
26
 
21
27
  .button:focus-visible {
22
- outline: var(--sigvelo-focus-ring);
23
- outline-offset: var(--sigvelo-focus-offset);
28
+ outline: none;
29
+ box-shadow:
30
+ 0 0 0 2px var(--sigvelo-color-canvas),
31
+ 0 0 0 4px var(--sigvelo-color-focus);
24
32
  }
25
33
 
26
34
  .button[data-disabled] {
@@ -1,16 +1,14 @@
1
1
  .card {
2
2
  background-color: var(--sigvelo-color-surface);
3
3
  color: var(--sigvelo-color-text);
4
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
5
- var(--sigvelo-color-neutral-border-muted);
6
- border-radius: var(--sigvelo-radius-md);
4
+ /* Shadow-led elevation: no perimeter border */
5
+ border-radius: var(--sigvelo-radius-lg);
7
6
  padding: 1.5rem;
8
7
  container-type: inline-size;
9
8
  box-shadow: var(--sigvelo-shadow-sm);
10
9
  transition:
11
- box-shadow 150ms ease,
12
- border-color 150ms ease,
13
- transform 150ms ease;
10
+ box-shadow var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
11
+ transform var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
14
12
  }
15
13
 
16
14
  .card__header,
@@ -65,13 +63,11 @@
65
63
 
66
64
  .card--hover:hover {
67
65
  box-shadow: var(--sigvelo-shadow-md);
68
- border-color: var(--sigvelo-color-focus);
69
66
  transform: translateY(-2px);
70
67
  }
71
68
 
72
69
  .card--hover:focus-visible {
73
70
  outline: none;
74
- border-color: var(--sigvelo-color-focus);
75
71
  box-shadow:
76
72
  0 0 0 2px var(--sigvelo-color-canvas),
77
73
  0 0 0 4px var(--sigvelo-color-focus);
@@ -21,8 +21,8 @@
21
21
  font-weight: var(--sigvelo-font-weight-semibold);
22
22
  cursor: pointer;
23
23
  transition:
24
- background-color 150ms ease,
25
- color 150ms ease;
24
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
25
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
26
26
  }
27
27
 
28
28
  .chain-of-thought__header:hover:not([data-disabled]) {
@@ -47,20 +47,13 @@
47
47
  }
48
48
 
49
49
  .chain-of-thought__content {
50
+ height: var(--collapsible-panel-height);
50
51
  overflow: hidden;
51
52
  transition:
52
53
  height 200ms ease,
53
54
  opacity 200ms ease;
54
55
  }
55
56
 
56
- .chain-of-thought__content[data-closed] {
57
- height: 0;
58
- }
59
-
60
- .chain-of-thought__content[data-open] {
61
- height: var(--collapsible-panel-height);
62
- }
63
-
64
57
  .chain-of-thought__content[data-starting-style],
65
58
  .chain-of-thought__content[data-ending-style] {
66
59
  height: 0;
@@ -176,8 +169,8 @@
176
169
  text-overflow: ellipsis;
177
170
  white-space: nowrap;
178
171
  transition:
179
- background-color 150ms ease,
180
- border-color 150ms ease;
172
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
173
+ border-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
181
174
  }
182
175
 
183
176
  .chain-of-thought__search-result:hover {
@@ -12,9 +12,9 @@
12
12
  outline: none;
13
13
  cursor: pointer;
14
14
  transition:
15
- background-color 150ms ease,
16
- border-color 150ms ease,
17
- box-shadow 150ms ease;
15
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
16
+ border-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
17
+ box-shadow var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
18
18
  }
19
19
 
20
20
  .checkbox:hover:not([data-disabled]) {
@@ -3,10 +3,9 @@
3
3
  flex-direction: column;
4
4
  width: 100%;
5
5
  font-family: var(--sigvelo-font-sans);
6
- background-color: var(--sigvelo-color-surface);
7
- border: var(--sigvelo-border-style) var(--sigvelo-border-width)
8
- var(--sigvelo-color-neutral-border-subtle);
9
- border-radius: var(--sigvelo-radius-md);
6
+ /* Fill-based containment: no perimeter border */
7
+ background-color: var(--sigvelo-color-neutral-bg-subtle);
8
+ border-radius: var(--sigvelo-radius-lg);
10
9
  overflow: hidden;
11
10
  }
12
11
 
@@ -16,9 +15,7 @@
16
15
  gap: 0.5rem;
17
16
  padding-block: 0.5rem;
18
17
  padding-inline: 0.75rem;
19
- background-color: var(--sigvelo-color-neutral-bg-subtle);
20
- border-block-end: var(--sigvelo-border-style) var(--sigvelo-border-width)
21
- var(--sigvelo-color-neutral-border-subtle);
18
+ background-color: transparent;
22
19
  }
23
20
 
24
21
  .code-block__title {
@@ -62,7 +59,6 @@
62
59
  font-size: 0.8125rem;
63
60
  line-height: 1.55;
64
61
  color: var(--sigvelo-color-text);
65
- background-color: var(--sigvelo-color-surface);
66
62
  overflow-x: auto;
67
63
  }
68
64
 
@@ -23,8 +23,8 @@
23
23
  border-radius: var(--sigvelo-radius-md);
24
24
  cursor: pointer;
25
25
  transition:
26
- background-color 150ms ease,
27
- border-color 150ms ease;
26
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
27
+ border-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
28
28
  }
29
29
 
30
30
  .collapsible__trigger:hover {
@@ -63,7 +63,12 @@
63
63
  border-block-end-color: transparent;
64
64
  }
65
65
 
66
+ /* The measured height sits on the base class, not behind [data-open]: during
67
+ close the open rule stops matching before the ending style lands, height
68
+ computes to `auto`, and `auto → 0` can't transition — the panel snaps shut
69
+ instead of folding. (Base UI's documented panel pattern.) */
66
70
  .collapsible__panel {
71
+ height: var(--collapsible-panel-height);
67
72
  overflow: hidden;
68
73
  font-family: var(--sigvelo-font-sans);
69
74
  font-size: 0.875rem;
@@ -73,14 +78,6 @@
73
78
  opacity 200ms ease;
74
79
  }
75
80
 
76
- .collapsible__panel[data-closed] {
77
- height: 0;
78
- }
79
-
80
- .collapsible__panel[data-open] {
81
- height: var(--collapsible-panel-height);
82
- }
83
-
84
81
  .collapsible__panel[data-starting-style],
85
82
  .collapsible__panel[data-ending-style] {
86
83
  height: 0;
@@ -24,7 +24,7 @@
24
24
  background-color: transparent;
25
25
  border: none;
26
26
  cursor: pointer;
27
- transition: color 150ms ease;
27
+ transition: color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
28
28
  }
29
29
 
30
30
  .combobox__trigger:hover {
@@ -50,8 +50,8 @@
50
50
  border-radius: var(--sigvelo-radius-sm);
51
51
  cursor: pointer;
52
52
  transition:
53
- color 150ms ease,
54
- background-color 150ms ease;
53
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
54
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
55
55
  }
56
56
 
57
57
  .combobox__clear:hover {
@@ -75,7 +75,7 @@
75
75
  box-shadow:
76
76
  0 10px 15px -3px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%),
77
77
  0 4px 6px -4px color-mix(in oklab, var(--sigvelo-color-text), transparent 90%);
78
- animation: combobox-popup-enter 150ms ease;
78
+ animation: combobox-popup-enter var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
79
79
  }
80
80
 
81
81
  .combobox__popup[data-ending-style] {
@@ -121,8 +121,8 @@
121
121
  cursor: pointer;
122
122
  outline: none;
123
123
  transition:
124
- background-color 150ms ease,
125
- color 150ms ease;
124
+ background-color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard),
125
+ color var(--sigvelo-duration-fast) var(--sigvelo-ease-standard);
126
126
  }
127
127
 
128
128
  .combobox__item:hover,