@ctrl-ui/react 0.8.6 → 0.8.7

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 (152) hide show
  1. package/dist/action-bar.js +1 -1
  2. package/dist/activity.js +1 -1
  3. package/dist/blocks/coding-agent.js +16 -19
  4. package/dist/blocks/design-canvas-data.d.ts +32 -0
  5. package/dist/blocks/design-canvas-data.js +100 -0
  6. package/dist/blocks/design-canvas-inspector.d.ts +8 -0
  7. package/dist/blocks/design-canvas-inspector.js +238 -0
  8. package/dist/blocks/design-canvas.d.ts +17 -0
  9. package/dist/blocks/design-canvas.js +346 -0
  10. package/dist/blocks/file-explorer.js +2 -2
  11. package/dist/blocks/settings.js +2 -2
  12. package/dist/chat-composer-attachment.d.ts +9 -3
  13. package/dist/chat-composer-attachment.js +27 -10
  14. package/dist/chat-composer-editor.js +20 -4
  15. package/dist/chat-composer.d.ts +1 -1
  16. package/dist/chat-composer.js +4 -3
  17. package/dist/chat-layout.js +32 -19
  18. package/dist/context.js +1 -1
  19. package/dist/dynamic-notification.js +1 -1
  20. package/dist/environment-variables.js +1 -1
  21. package/dist/filter-bar/context.d.ts +32 -0
  22. package/dist/filter-bar/context.js +11 -0
  23. package/dist/filter-bar/editor.d.ts +14 -0
  24. package/dist/filter-bar/editor.js +204 -0
  25. package/dist/filter-bar/model.d.ts +9 -0
  26. package/dist/filter-bar/model.js +48 -0
  27. package/dist/filter-bar/motion.d.ts +10 -0
  28. package/dist/filter-bar/motion.js +84 -0
  29. package/dist/filter-bar/parts.d.ts +19 -0
  30. package/dist/filter-bar/parts.js +233 -0
  31. package/dist/filter-bar/types.d.ts +53 -0
  32. package/dist/filter-bar/types.js +0 -0
  33. package/dist/filter-bar.d.ts +27 -0
  34. package/dist/filter-bar.js +304 -0
  35. package/dist/hooks/use-chat-composer.d.ts +3 -1
  36. package/dist/hooks/use-chat-composer.js +2 -2
  37. package/dist/hooks/use-dropzone.d.ts +7 -4
  38. package/dist/hooks/use-dropzone.js +34 -3
  39. package/dist/inline-attachment.js +8 -14
  40. package/dist/inline-citation.js +1 -1
  41. package/dist/knob-contracts/chat-layout-knobs.d.ts +1 -1
  42. package/dist/knob-contracts/chat-layout-knobs.js +2 -1
  43. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  44. package/dist/knob-contracts/choice-knobs.js +1 -0
  45. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  46. package/dist/knob-contracts/collapsible-knobs.js +1 -1
  47. package/dist/knob-contracts/filter-bar-knobs.d.ts +4 -0
  48. package/dist/knob-contracts/filter-bar-knobs.js +16 -0
  49. package/dist/knob-contracts/infinite-canvas-knobs.d.ts +1 -1
  50. package/dist/knob-contracts/infinite-canvas-knobs.js +3 -0
  51. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  52. package/dist/knob-contracts/page-layout-knobs.js +3 -1
  53. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  54. package/dist/knob-contracts/popup-knobs.js +1 -0
  55. package/dist/knob-contracts/table-of-contents-knobs.d.ts +1 -1
  56. package/dist/knob-contracts/table-of-contents-knobs.js +3 -5
  57. package/dist/lib/phone-input-format.js +1 -1
  58. package/dist/markdown-block.js +11 -7
  59. package/dist/scripts/contrast-eval.js +5 -4
  60. package/dist/styles/index.css +5 -4
  61. package/dist/styles/recipes/button-group.css +1 -1
  62. package/dist/styles/recipes/button.css +2 -2
  63. package/dist/styles/recipes/chat-composer.css +14 -6
  64. package/dist/styles/recipes/chat-layout.css +29 -2
  65. package/dist/styles/recipes/choice.css +10 -3
  66. package/dist/styles/recipes/code-diff.css +16 -4
  67. package/dist/styles/recipes/code.css +11 -5
  68. package/dist/styles/recipes/collapsible.css +37 -0
  69. package/dist/styles/recipes/color-picker.css +12 -2
  70. package/dist/styles/recipes/dockable-panel.css +11 -3
  71. package/dist/styles/recipes/field-parts.css +62 -0
  72. package/dist/styles/recipes/field.css +28 -6
  73. package/dist/styles/recipes/filter-bar.css +174 -0
  74. package/dist/styles/recipes/infinite-canvas.css +51 -3
  75. package/dist/styles/recipes/inline-attachment.css +6 -1
  76. package/dist/styles/recipes/page-layout.css +18 -0
  77. package/dist/styles/recipes/pagination.css +1 -1
  78. package/dist/styles/recipes/popup-controls.css +16 -0
  79. package/dist/styles/recipes/popup-drawer.css +34 -32
  80. package/dist/styles/recipes/popup-lists.css +11 -2
  81. package/dist/styles/recipes/popup.css +10 -12
  82. package/dist/styles/recipes/range.css +1 -1
  83. package/dist/styles/recipes/resizable.css +34 -0
  84. package/dist/styles/recipes/spinner.css +4 -0
  85. package/dist/styles/recipes/table-of-contents.css +42 -42
  86. package/dist/styles/recipes/tabs.css +21 -0
  87. package/dist/styles/recipes/track-highlight.css +2 -1
  88. package/dist/styles/recipes/transcript-divider.css +2 -2
  89. package/dist/styles/theme.css +250 -91
  90. package/dist/ui/alert-dialog.js +1 -1
  91. package/dist/ui/autocomplete.js +5 -1
  92. package/dist/ui/button.js +2 -2
  93. package/dist/ui/checkbox-group.js +1 -1
  94. package/dist/ui/code-diff.js +1 -1
  95. package/dist/ui/code.js +3 -3
  96. package/dist/ui/collapsible.js +1 -1
  97. package/dist/ui/color-picker.js +1 -1
  98. package/dist/ui/combobox-disabled-selection.d.ts +1 -1
  99. package/dist/ui/combobox-disabled-selection.js +2 -1
  100. package/dist/ui/combobox.d.ts +5 -23
  101. package/dist/ui/combobox.js +26 -14
  102. package/dist/ui/command.js +9 -1
  103. package/dist/ui/context-menu.js +1 -1
  104. package/dist/ui/dialog.js +1 -1
  105. package/dist/ui/dockable-panel.js +18 -10
  106. package/dist/ui/drawer.d.ts +7 -4
  107. package/dist/ui/drawer.js +36 -23
  108. package/dist/ui/dropdown-menu.js +1 -1
  109. package/dist/ui/dropzone.d.ts +3 -1
  110. package/dist/ui/dropzone.js +3 -1
  111. package/dist/ui/field.js +1 -1
  112. package/dist/ui/hover-card.js +1 -1
  113. package/dist/ui/infinite-canvas.d.ts +11 -0
  114. package/dist/ui/infinite-canvas.js +82 -7
  115. package/dist/ui/input-group.d.ts +2 -1
  116. package/dist/ui/input-group.js +12 -3
  117. package/dist/ui/input.js +9 -0
  118. package/dist/ui/item.js +1 -1
  119. package/dist/ui/markdown-elements.js +11 -8
  120. package/dist/ui/menubar.js +1 -1
  121. package/dist/ui/morphing-panel.js +1 -1
  122. package/dist/ui/navigation-menu.js +1 -1
  123. package/dist/ui/number-field.d.ts +1 -1
  124. package/dist/ui/number-field.js +13 -2
  125. package/dist/ui/phone-input.js +2 -2
  126. package/dist/ui/popover.js +1 -1
  127. package/dist/ui/radio-group.d.ts +1 -0
  128. package/dist/ui/radio-group.js +11 -1
  129. package/dist/ui/resizable.d.ts +18 -1
  130. package/dist/ui/resizable.js +127 -7
  131. package/dist/ui/responsive-dialog.js +6 -3
  132. package/dist/ui/rich-tooltip.js +1 -1
  133. package/dist/ui/scroll-area.d.ts +4 -1
  134. package/dist/ui/scroll-area.js +2 -1
  135. package/dist/ui/select.d.ts +2 -1
  136. package/dist/ui/select.js +58 -33
  137. package/dist/ui/sheet.js +1 -1
  138. package/dist/ui/sidebar-menu.js +1 -1
  139. package/dist/ui/sidebar-provider.js +2 -2
  140. package/dist/ui/sidebar-resize-rail.js +1 -1
  141. package/dist/ui/sidebar.js +1 -1
  142. package/dist/ui/table-of-contents.d.ts +4 -3
  143. package/dist/ui/table-of-contents.js +126 -47
  144. package/dist/ui/table.js +11 -7
  145. package/dist/ui/toast.js +1 -1
  146. package/dist/ui/toggle.d.ts +1 -1
  147. package/dist/ui/toggle.js +2 -1
  148. package/dist/ui/tooltip.js +1 -1
  149. package/dist/ui/tree.js +1 -1
  150. package/dist/ui/trigger-menu.js +7 -3
  151. package/dist/user-ask.js +1 -1
  152. package/package.json +1 -1
@@ -10,6 +10,9 @@
10
10
  --cui-page-layout-header-column-gap: calc(var(--spacing) * 4);
11
11
  --cui-page-layout-header-row-gap: calc(var(--spacing) * 2);
12
12
  --cui-page-layout-sticky-gap: 0px;
13
+ --cui-page-layout-background: var(--canvas);
14
+ --cui-page-layout-sticky-header-background: oklch(from var(--cui-page-layout-background) l c h / 0.85);
15
+ background: var(--cui-page-layout-background);
13
16
 
14
17
  /* Header and body both read this, so they stop at the same right edge. */
15
18
  --cui-page-layout-size: calc(var(--cui-page-layout-article-size) + var(--cui-page-layout-padding-inline) * 2);
@@ -97,6 +100,9 @@
97
100
  position: sticky;
98
101
  top: var(--cui-page-layout-sticky-gap);
99
102
  z-index: 20;
103
+ background: var(--cui-page-layout-sticky-header-background);
104
+ -webkit-backdrop-filter: blur(12px);
105
+ backdrop-filter: blur(12px);
100
106
  }
101
107
 
102
108
  /* Zero height: the band hangs over the body instead of displacing it. */
@@ -217,3 +223,15 @@
217
223
  inherits: true;
218
224
  initial-value: 0px;
219
225
  }
226
+
227
+ @property --cui-page-layout-background {
228
+ syntax: "<color>";
229
+ inherits: true;
230
+ initial-value: transparent;
231
+ }
232
+
233
+ @property --cui-page-layout-sticky-header-background {
234
+ syntax: "<color>";
235
+ inherits: true;
236
+ initial-value: transparent;
237
+ }
@@ -25,7 +25,7 @@
25
25
  }
26
26
 
27
27
  :where([data-control-family="pagination"][data-slot="link"][data-active="true"]) {
28
- --cui-pagination-link-background: oklch(from var(--card) l c h / 0.72);
28
+ --cui-pagination-link-background: var(--control-fill);
29
29
  --_pagination-link-border-color: var(--border);
30
30
  --cui-pagination-link-shadow: var(--shadow-sm);
31
31
  }
@@ -7,6 +7,22 @@
7
7
  outline-style: none;
8
8
  }
9
9
 
10
+ :where([data-control-family="popup"][data-popup-kind="hover-card"][data-slot="trigger"]:is(a)) {
11
+ border-radius: var(--radius-sm);
12
+ color: var(--foreground);
13
+ font-weight: var(--font-weight-medium);
14
+ text-decoration-line: underline;
15
+ text-decoration-color: var(--border);
16
+ text-decoration-thickness: 1px;
17
+ text-underline-offset: 2px;
18
+ cursor: pointer;
19
+ transition: text-decoration-color var(--duration-fast) var(--ease-standard);
20
+ }
21
+
22
+ :where([data-control-family="popup"][data-popup-kind="hover-card"][data-slot="trigger"]:is(a):is(:hover, [data-popup-open])) {
23
+ text-decoration-color: var(--foreground);
24
+ }
25
+
10
26
  :where([data-control-family="popup"][data-popup-kind="navigation-menu"][data-slot="link"]) {
11
27
  text-decoration-line: none;
12
28
  }
@@ -1,43 +1,46 @@
1
1
  @layer components {
2
2
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-popup-part="surface"]) {
3
- /* The sheet sits on the page surface, and its edge is a real border the variants size per side. */
3
+ /* The edge is a real border drawn only on the sides the variant exposes, so the popup's inset ring stays off. */
4
4
  --cui-popup-radius: var(--radius-panel);
5
5
  --cui-popup-background: var(--background);
6
6
  --cui-popup-foreground: var(--foreground);
7
- --cui-popup-border-width: 0px;
8
- --cui-popup-shadow: var(--shadow-modal);
7
+ --cui-popup-shadow: var(--shadow-overlay);
8
+ --cui-popup-backdrop-filter: none;
9
9
  --_drawer-content-closed-translate: 0 100%;
10
+ --_drawer-edge-inset-end: calc(var(--spacing) * 4);
10
11
  border: 0 solid var(--cui-popup-border-color);
11
12
  border-radius: 0;
13
+ box-shadow: var(--cui-popup-shadow);
12
14
  }
13
15
 
14
16
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-popup-part="surface"][data-surface-variant="card"]) {
15
17
  --cui-popup-background: var(--card);
18
+ --cui-popup-foreground: var(--card-foreground);
16
19
  }
17
20
 
18
21
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-variant="floating"]) {
19
- border-width: 1px;
22
+ border-width: var(--cui-popup-border-width);
20
23
  border-radius: var(--cui-popup-radius);
21
24
  }
22
25
 
23
26
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-variant="edge"][data-side="bottom"]) {
24
- border-top-width: 1px;
27
+ border-top-width: var(--cui-popup-border-width);
25
28
  border-radius: var(--cui-popup-radius) var(--cui-popup-radius) 0 0;
26
29
  }
27
30
 
28
31
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-variant="edge"][data-side="top"]) {
29
- border-bottom-width: 1px;
32
+ border-bottom-width: var(--cui-popup-border-width);
30
33
  --_drawer-content-closed-translate: 0 -100%;
31
34
  border-radius: 0 0 var(--cui-popup-radius) var(--cui-popup-radius);
32
35
  }
33
36
 
34
37
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-variant="edge"][data-side="right"]) {
35
- border-left-width: 1px;
38
+ border-left-width: var(--cui-popup-border-width);
36
39
  --_drawer-content-closed-translate: 100% 0;
37
40
  }
38
41
 
39
42
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-variant="edge"][data-side="left"]) {
40
- border-right-width: 1px;
43
+ border-right-width: var(--cui-popup-border-width);
41
44
  --_drawer-content-closed-translate: -100% 0;
42
45
  }
43
46
 
@@ -74,10 +77,19 @@
74
77
  margin-block: calc(var(--spacing) * 1) calc(var(--spacing) * 2.5);
75
78
  }
76
79
 
77
- :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="scroll"]) {
80
+ :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="body"]) {
78
81
  gap: calc(var(--spacing) * 4);
79
82
  }
80
83
 
84
+ /* Block padding lives inside the scroller, never on the popup: the scroll edge would clip a focus ring on the first or last row. */
85
+ :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="body"][data-padding="default"]) {
86
+ padding-block: calc(var(--spacing) * 4);
87
+ }
88
+
89
+ :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="body"][data-padding="default"]:last-child) {
90
+ padding-block-end: var(--_drawer-edge-inset-end);
91
+ }
92
+
81
93
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="viewport"][data-variant="floating"]) {
82
94
  padding: calc(var(--spacing) * 2);
83
95
  }
@@ -94,35 +106,22 @@
94
106
  text-wrap: pretty;
95
107
  }
96
108
 
97
- :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-padding="default"][data-side="bottom"]) {
98
- padding-block-end: calc(var(--spacing) * 4);
99
- }
100
-
101
- :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-padding="default"][data-side="top"]) {
102
- padding-block-start: calc(var(--spacing) * 4);
103
- }
104
-
105
- :where(
106
- [data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-padding="default"]:is(
107
- [data-side="left"],
108
- [data-side="right"]
109
- )
110
- ) {
111
- padding-block: calc(var(--spacing) * 4);
112
- }
113
-
114
- :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="footer"]) {
115
- gap: calc(var(--spacing) * 2);
116
- padding-inline: calc(var(--spacing) * 4);
109
+ :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-side="bottom"]) {
110
+ --_drawer-edge-inset-end: max(calc(var(--spacing) * 4), env(safe-area-inset-bottom));
117
111
  }
118
112
 
119
113
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="header"]) {
120
114
  gap: calc(var(--spacing) * 1.5);
121
- padding-inline: calc(var(--spacing) * 4);
115
+ padding: calc(var(--spacing) * 4) calc(var(--spacing) * 4) 0;
122
116
  --_drawer-header-text-align: center;
123
117
  text-align: var(--_drawer-header-text-align);
124
118
  }
125
119
 
120
+ :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="footer"]) {
121
+ gap: calc(var(--spacing) * 2);
122
+ padding: 0 calc(var(--spacing) * 4) var(--_drawer-edge-inset-end);
123
+ }
124
+
126
125
  @media (width >= 40rem) {
127
126
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="header"]) {
128
127
  --_drawer-header-text-align: left;
@@ -131,15 +130,18 @@
131
130
  }
132
131
 
133
132
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"]) {
134
- gap: calc(var(--spacing) * 4);
135
133
  outline-style: none;
136
134
  transform: translate(var(--drawer-swipe-movement-x, 0), var(--drawer-swipe-movement-y, 0));
137
- transition-property: transform, translate, scale, rotate;
135
+ transition-property: transform, translate, scale, rotate, filter;
138
136
  --_drawer-content-transition-duration: var(--duration-base);
139
137
  transition-duration: var(--_drawer-content-transition-duration);
140
138
  transition-timing-function: var(--ease-emphasized);
141
139
  }
142
140
 
141
+ :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-nested-drawer-open]) {
142
+ filter: brightness(0.95);
143
+ }
144
+
143
145
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-starting-style]),
144
146
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="content"][data-ending-style]) {
145
147
  translate: var(--_drawer-content-closed-translate);
@@ -144,7 +144,7 @@
144
144
  outline-style: none;
145
145
  }
146
146
 
147
- :where([data-control-family="popup"][data-popup-part="item"] > span:first-child) {
147
+ :where([data-control-family="popup"][data-slot="item-text"]) {
148
148
  gap: calc(var(--spacing) * 2);
149
149
  }
150
150
 
@@ -190,8 +190,17 @@
190
190
  }
191
191
 
192
192
  :where([data-control-family="popup"][data-popup-part="bar"]) {
193
+ --_popup-bar-item-radius: min(var(--cui-popup-item-radius), calc(var(--control-h-sm) / 2));
194
+ --_popup-bar-padding: calc(var(--spacing) * 1);
195
+ --cui-popup-radius: calc(
196
+ var(--_popup-bar-item-radius) +
197
+ clamp(0px, calc(var(--_popup-bar-item-radius) * 1000), var(--_popup-bar-padding))
198
+ );
199
+ --nest-radius: var(--_popup-bar-item-radius);
200
+ padding: var(--_popup-bar-padding);
193
201
  gap: calc(var(--spacing) * 0.5);
194
- padding: calc(var(--spacing) * 1);
202
+ --cui-popup-background: var(--card);
203
+ --cui-popup-shadow: var(--shadow-xs);
195
204
  }
196
205
 
197
206
  :where([data-control-family="popup"][data-popup-kind="navigation-menu"][data-slot="list"]) {
@@ -59,8 +59,9 @@
59
59
  :where([data-control-family="popup"][data-popup-part="backdrop"]) {
60
60
  --cui-popup-backdrop-background: oklch(from var(--foreground) l c h / var(--overlay-opacity));
61
61
  background-color: var(--cui-popup-backdrop-background);
62
- -webkit-backdrop-filter: blur(var(--backdrop-blur-overlay));
63
- backdrop-filter: blur(var(--backdrop-blur-overlay));
62
+ --cui-popup-backdrop-blur: blur(var(--backdrop-blur-overlay));
63
+ -webkit-backdrop-filter: var(--cui-popup-backdrop-blur);
64
+ backdrop-filter: var(--cui-popup-backdrop-blur);
64
65
  transition: opacity var(--duration-base) var(--ease-emphasized);
65
66
  }
66
67
  :where(.dark [data-control-family="popup"][data-popup-part="backdrop"]) {
@@ -72,11 +73,6 @@
72
73
  :where([data-control-family="popup"][data-popup-part="list-surface"]) {
73
74
  padding: var(--popover-padding);
74
75
  }
75
- :where([data-control-family="popup"][data-popup-part="bar"]) {
76
- --cui-popup-radius: var(--radius-control);
77
- --cui-popup-background: var(--card);
78
- --cui-popup-shadow: var(--shadow-xs);
79
- }
80
76
  :where([data-control-family="popup"][data-popup-part="surface"][data-surface="modal"]) {
81
77
  --cui-popup-radius: var(--radius-panel);
82
78
  --cui-popup-shadow: var(--shadow-modal);
@@ -90,7 +86,7 @@
90
86
 
91
87
  :where([data-control-family="popup"][data-popup-kind="sheet"][data-popup-part="surface"]) {
92
88
  --cui-popup-radius: 0px;
93
- --cui-popup-shadow: var(--shadow-modal);
89
+ --cui-popup-shadow: var(--shadow-overlay);
94
90
  }
95
91
 
96
92
  :where([data-control-family="popup"][data-popup-kind="dialog"][data-slot="title"]),
@@ -217,10 +213,7 @@
217
213
  transition-timing-function: var(--ease-emphasized);
218
214
  }
219
215
 
220
- :where(
221
- [data-control-family="button"][data-popup-kind="select"][data-slot="trigger"][data-popup-open]
222
- [data-control-family="popup"][data-popup-kind="select"][data-slot="icon"]
223
- ),
216
+ :where([data-control-family="popup"][data-popup-kind="select"][data-slot="icon"][data-popup-open]),
224
217
  :where(
225
218
  [data-control-family="button"][data-popup-kind="navigation-menu"][data-slot="trigger"][data-popup-open]
226
219
  :where([data-control-family="popup"][data-popup-kind="navigation-menu"][data-slot="icon"])
@@ -343,6 +336,11 @@
343
336
  initial-value: transparent;
344
337
  }
345
338
 
339
+ @property --cui-popup-backdrop-blur {
340
+ syntax: "*";
341
+ inherits: true;
342
+ }
343
+
346
344
  @property --cui-popup-item-radius {
347
345
  syntax: "<length-percentage>";
348
346
  inherits: true;
@@ -41,7 +41,7 @@
41
41
  :where([data-control-family="range"][data-range-kind="slider"][data-slot="root"][data-variant="plain"]) {
42
42
  --cui-range-track-radius: 3px;
43
43
  --cui-range-track-background: var(--hover-fill);
44
- --cui-range-indicator-radius: 0px;
44
+ --cui-range-indicator-radius: var(--cui-range-track-radius);
45
45
  --cui-range-indicator-background: oklch(from var(--foreground) l c h / 0.14);
46
46
  --cui-range-thumb-radius: 1px;
47
47
  --cui-range-thumb-background: oklch(from var(--foreground) l c h / 0.3);
@@ -30,6 +30,40 @@
30
30
  outline-style: none;
31
31
  }
32
32
 
33
+ :where([data-control-family="resizable"][data-slot="handle"][data-axis="vertical"]:not([data-cursor="none"])) {
34
+ cursor: col-resize;
35
+ }
36
+
37
+ :where([data-control-family="resizable"][data-slot="handle"][data-axis="horizontal"]:not([data-cursor="none"])) {
38
+ cursor: row-resize;
39
+ }
40
+
41
+ /* biome-ignore-start lint/complexity/noImportantStyles: Resize drag cursor must beat every cursor under the pointer. */
42
+ :where(
43
+ :root:has(
44
+ [data-control-family="resizable"][data-slot="handle"][data-axis="vertical"]:not([data-cursor="none"]):is(
45
+ [data-separator="hover"],
46
+ [data-separator="active"]
47
+ )
48
+ )
49
+ *
50
+ ) {
51
+ cursor: col-resize !important;
52
+ }
53
+
54
+ :where(
55
+ :root:has(
56
+ [data-control-family="resizable"][data-slot="handle"][data-axis="horizontal"]:not([data-cursor="none"]):is(
57
+ [data-separator="hover"],
58
+ [data-separator="active"]
59
+ )
60
+ )
61
+ *
62
+ ) {
63
+ cursor: row-resize !important;
64
+ }
65
+ /* biome-ignore-end lint/complexity/noImportantStyles: Resize drag cursor must beat every cursor under the pointer. */
66
+
33
67
  :where([data-control-family="resizable"][data-slot="handle"][data-variant="solid"]) {
34
68
  background-color: var(--border);
35
69
  }
@@ -4,6 +4,10 @@
4
4
  color: var(--cui-spinner-foreground);
5
5
  }
6
6
 
7
+ :where([data-control-family="button"] [data-control-family="spinner"][data-slot="root"]) {
8
+ --cui-spinner-foreground: currentColor;
9
+ }
10
+
7
11
  :where([data-control-family="spinner"][data-slot="indicator"]) {
8
12
  inline-size: calc(var(--spacing) * 4);
9
13
  block-size: calc(var(--spacing) * 4);
@@ -13,7 +13,7 @@
13
13
  --cui-table-of-contents-label-gap: calc(var(--spacing) * 3);
14
14
  --cui-table-of-contents-item-foreground: var(--muted-foreground);
15
15
  --cui-table-of-contents-item-hover-foreground: var(--foreground);
16
- --cui-table-of-contents-item-active-foreground: var(--foreground);
16
+ --cui-table-of-contents-item-active-foreground: var(--primary-text);
17
17
  --cui-table-of-contents-item-font-size: var(--text-body);
18
18
  --cui-table-of-contents-item-line-height: var(--leading-normal);
19
19
  --cui-table-of-contents-item-font-weight: var(--font-weight-normal);
@@ -21,13 +21,11 @@
21
21
  --cui-table-of-contents-item-padding-block: calc(var(--spacing) * 1.5);
22
22
  --cui-table-of-contents-item-padding-inline: calc(var(--spacing) * 3);
23
23
  --cui-table-of-contents-item-indent-size: calc(var(--spacing) * 2);
24
- --cui-table-of-contents-rail-background: var(--border);
24
+ --cui-table-of-contents-rail-stroke: var(--border);
25
25
  --cui-table-of-contents-rail-size: 1px;
26
- --cui-table-of-contents-trail-background: var(--foreground);
26
+ --cui-table-of-contents-trail-stroke: var(--primary-text);
27
27
  --cui-table-of-contents-trail-size: 2px;
28
- --cui-table-of-contents-trail-radius: var(--cui-table-of-contents-trail-size);
29
- --cui-table-of-contents-highlight-radius: var(--radius-popup-item);
30
- --cui-table-of-contents-highlight-background: var(--active-fill);
28
+ --cui-table-of-contents-indicator-foreground: var(--cui-table-of-contents-trail-stroke);
31
29
  border: var(--cui-table-of-contents-border-width) solid var(--cui-table-of-contents-border-color);
32
30
  border-radius: var(--cui-table-of-contents-radius);
33
31
  background-color: var(--cui-table-of-contents-background);
@@ -47,8 +45,41 @@
47
45
  }
48
46
 
49
47
  :where([data-control-family="table-of-contents"][data-slot="rail"]) {
50
- inline-size: var(--cui-table-of-contents-rail-size);
51
- background-color: var(--cui-table-of-contents-rail-background);
48
+ fill: none;
49
+ stroke: var(--cui-table-of-contents-rail-stroke);
50
+ stroke-width: var(--cui-table-of-contents-rail-size);
51
+ stroke-linejoin: round;
52
+ }
53
+
54
+ :where([data-control-family="table-of-contents"][data-slot="trail"]) {
55
+ fill: none;
56
+ stroke: var(--cui-table-of-contents-trail-stroke);
57
+ stroke-width: var(--cui-table-of-contents-trail-size);
58
+ stroke-linecap: round;
59
+ stroke-linejoin: round;
60
+ stroke-dasharray: var(--_toc-trail-length) var(--_toc-rail-length);
61
+ stroke-dashoffset: calc(-1 * var(--_toc-trail-start));
62
+ opacity: 0;
63
+ transition-property: stroke-dasharray, stroke-dashoffset, opacity;
64
+ transition-duration: var(--duration-base);
65
+ transition-timing-function: var(--ease-standard);
66
+ }
67
+
68
+ :where([data-control-family="table-of-contents"][data-slot="indicator"]) {
69
+ display: grid;
70
+ place-items: center;
71
+ color: var(--cui-table-of-contents-indicator-foreground);
72
+ offset-distance: var(--_toc-indicator-distance);
73
+ offset-rotate: 0deg;
74
+ opacity: 0;
75
+ transition-property: offset-distance, opacity;
76
+ transition-duration: var(--duration-base);
77
+ transition-timing-function: var(--ease-standard);
78
+ }
79
+
80
+ :where([data-control-family="table-of-contents"][data-slot="trail"][data-visible]),
81
+ :where([data-control-family="table-of-contents"][data-slot="indicator"][data-visible]) {
82
+ opacity: 1;
52
83
  }
53
84
 
54
85
  :where([data-control-family="table-of-contents"][data-slot="item"]) {
@@ -83,25 +114,6 @@
83
114
  :where([data-control-family="table-of-contents"][data-slot="item"][data-active]) {
84
115
  color: var(--cui-table-of-contents-item-active-foreground);
85
116
  }
86
-
87
- :where([data-control-family="table-of-contents"][data-slot="root"] [data-control-family="track-highlight"][data-slot="root"]) {
88
- --cui-track-highlight-transition-duration: var(--duration-base);
89
- --cui-track-highlight-radius: var(--cui-table-of-contents-highlight-radius);
90
- --cui-track-highlight-background: var(--cui-table-of-contents-highlight-background);
91
- --cui-track-highlight-ring-color: transparent;
92
- --cui-track-highlight-shadow: none;
93
- }
94
-
95
- :where([data-control-family="table-of-contents"][data-slot="root"][data-variant="trail"]) {
96
- --cui-table-of-contents-highlight-radius: 0px;
97
- --cui-table-of-contents-highlight-background: transparent;
98
- }
99
-
100
- :where([data-control-family="table-of-contents"][data-slot="trail"]) {
101
- inline-size: var(--cui-table-of-contents-trail-size);
102
- border-radius: var(--cui-table-of-contents-trail-radius);
103
- background-color: var(--cui-table-of-contents-trail-background);
104
- }
105
117
  }
106
118
 
107
119
  @property --cui-table-of-contents-background {
@@ -230,7 +242,7 @@
230
242
  initial-value: 0px;
231
243
  }
232
244
 
233
- @property --cui-table-of-contents-rail-background {
245
+ @property --cui-table-of-contents-rail-stroke {
234
246
  syntax: "<color>";
235
247
  inherits: true;
236
248
  initial-value: transparent;
@@ -242,7 +254,7 @@
242
254
  initial-value: 0px;
243
255
  }
244
256
 
245
- @property --cui-table-of-contents-trail-background {
257
+ @property --cui-table-of-contents-trail-stroke {
246
258
  syntax: "<color>";
247
259
  inherits: true;
248
260
  initial-value: transparent;
@@ -254,19 +266,7 @@
254
266
  initial-value: 0px;
255
267
  }
256
268
 
257
- @property --cui-table-of-contents-trail-radius {
258
- syntax: "<length-percentage>";
259
- inherits: true;
260
- initial-value: 0px;
261
- }
262
-
263
- @property --cui-table-of-contents-highlight-radius {
264
- syntax: "<length-percentage>";
265
- inherits: true;
266
- initial-value: 0px;
267
- }
268
-
269
- @property --cui-table-of-contents-highlight-background {
269
+ @property --cui-table-of-contents-indicator-foreground {
270
270
  syntax: "<color>";
271
271
  inherits: true;
272
272
  initial-value: transparent;
@@ -16,6 +16,12 @@
16
16
  --cui-tabs-border-color: var(--border);
17
17
  --cui-tabs-border-width: 1px;
18
18
  }
19
+
20
+ :where([data-control-family="tabs"][data-slot="root"][data-orientation="vertical"]) {
21
+ display: flex;
22
+ gap: calc(var(--spacing) * 4);
23
+ }
24
+
19
25
  :where([data-control-family="tabs"][data-slot="list"]) {
20
26
  --_tabs-trigger-radius-fit: min(var(--cui-tabs-trigger-radius), calc(var(--_tabs-trigger-h) / 2));
21
27
  position: relative;
@@ -100,6 +106,7 @@
100
106
  /* One trigger radius for the flare, plus the surface corner arc it must clear. */
101
107
  --_tabs-browser-inset: calc(var(--_tabs-trigger-radius-fit) + var(--radius-panel));
102
108
  min-height: calc(var(--_tabs-trigger-h) + var(--cui-tabs-list-padding));
109
+ width: auto;
103
110
  align-items: flex-end;
104
111
  isolation: isolate;
105
112
  /* The slide machinery promotes the surface wrapper mid-switch — the strip stays above it. */
@@ -172,6 +179,20 @@
172
179
  outline-style: none;
173
180
  }
174
181
 
182
+ :where(
183
+ [data-control-family="tabs"][data-slot="list"][data-orientation="horizontal"]:not([data-variant="browser"]) ~ [data-slot="panel"]
184
+ ) {
185
+ margin-block-start: calc(var(--spacing) * 3);
186
+ }
187
+
188
+ :where([data-control-family="tabs"][data-slot="list"][data-variant="browser"] ~ [data-slot="panel"]) {
189
+ border: var(--cui-tabs-border-width) solid var(--cui-tabs-border-color);
190
+ border-top: none;
191
+ border-radius: 0 0 var(--radius-panel) var(--radius-panel);
192
+ background: var(--cui-tabs-indicator-background);
193
+ padding: calc(var(--spacing) * 4);
194
+ }
195
+
175
196
  :where([data-control-family="tabs"][data-slot="list"][data-variant="browser"] [data-control-family="tabs"][data-slot="tab"]) {
176
197
  border-top-left-radius: var(--_tabs-trigger-radius-fit);
177
198
  border-top-right-radius: var(--_tabs-trigger-radius-fit);
@@ -59,7 +59,8 @@
59
59
  [data-control-family="checkbox-group"]
60
60
  )
61
61
  > [data-control-family="track-highlight"]
62
- ) {
62
+ ),
63
+ :where([data-track]:has(> [data-control-family="button"][data-track-item]) > [data-control-family="track-highlight"]) {
63
64
  --cui-track-highlight-radius: var(--radius-control);
64
65
  }
65
66
 
@@ -3,8 +3,8 @@
3
3
  --cui-transcript-divider-foreground: var(--muted-foreground);
4
4
  --cui-transcript-divider-line-color: var(--border);
5
5
  --cui-transcript-divider-danger-foreground: var(--destructive-text);
6
- --cui-transcript-divider-success-foreground: var(--badge-green-foreground);
7
- --cui-transcript-divider-warning-foreground: var(--badge-yellow-foreground);
6
+ --cui-transcript-divider-success-foreground: var(--success-text);
7
+ --cui-transcript-divider-warning-foreground: var(--warning-text);
8
8
  margin-block: calc(var(--spacing) * 2);
9
9
  color: var(--cui-transcript-divider-foreground);
10
10
  font-size: var(--text-caption);