@ctrl-ui/react 0.9.5 → 0.9.8

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 (165) hide show
  1. package/README.md +38 -2
  2. package/dist/action-bar.js +16 -8
  3. package/dist/activity.d.ts +4 -2
  4. package/dist/activity.js +5 -2
  5. package/dist/audio-visualizer.js +1 -1
  6. package/dist/blocks/agent-run-clock.d.ts +5 -0
  7. package/dist/blocks/agent-run-clock.js +52 -0
  8. package/dist/blocks/agent-run-sidebar.d.ts +13 -0
  9. package/dist/blocks/agent-run-sidebar.js +101 -0
  10. package/dist/blocks/agent-run-status.d.ts +32 -0
  11. package/dist/blocks/agent-run-status.js +27 -0
  12. package/dist/blocks/agent-run.d.ts +82 -0
  13. package/dist/blocks/agent-run.js +262 -0
  14. package/dist/blocks/coding-agent.d.ts +1 -1
  15. package/dist/blocks/coding-agent.js +50 -69
  16. package/dist/blocks/design-canvas-data.d.ts +1 -1
  17. package/dist/blocks/design-canvas-inspector.js +1 -1
  18. package/dist/blocks/design-canvas.d.ts +2 -1
  19. package/dist/blocks/design-canvas.js +56 -42
  20. package/dist/blocks/discussion.js +1 -1
  21. package/dist/blocks/file-explorer.js +66 -47
  22. package/dist/blocks/settings.js +37 -41
  23. package/dist/blocks/team-chat.js +2 -1
  24. package/dist/blocks/theme-toggle.d.ts +2 -1
  25. package/dist/blocks/theme-toggle.js +13 -4
  26. package/dist/chat-message.js +33 -39
  27. package/dist/hooks/use-mobile.d.ts +1 -1
  28. package/dist/hooks/use-mobile.js +1 -1
  29. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  30. package/dist/knob-contracts/badge-knobs.js +3 -1
  31. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  32. package/dist/knob-contracts/button-knobs.js +1 -0
  33. package/dist/knob-contracts/calendar-knobs.d.ts +1 -1
  34. package/dist/knob-contracts/calendar-knobs.js +9 -1
  35. package/dist/knob-contracts/card-knobs.d.ts +1 -1
  36. package/dist/knob-contracts/card-knobs.js +5 -1
  37. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  38. package/dist/knob-contracts/choice-knobs.js +1 -0
  39. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  40. package/dist/knob-contracts/collapsible-knobs.js +5 -1
  41. package/dist/knob-contracts/emoji-picker-knobs.d.ts +1 -1
  42. package/dist/knob-contracts/emoji-picker-knobs.js +3 -1
  43. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  44. package/dist/knob-contracts/field-knobs.js +17 -1
  45. package/dist/knob-contracts/infinite-canvas-knobs.d.ts +1 -1
  46. package/dist/knob-contracts/infinite-canvas-knobs.js +1 -7
  47. package/dist/knob-contracts/item-knobs.d.ts +1 -1
  48. package/dist/knob-contracts/item-knobs.js +5 -1
  49. package/dist/knob-contracts/kbd-knobs.d.ts +1 -1
  50. package/dist/knob-contracts/kbd-knobs.js +4 -1
  51. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  52. package/dist/knob-contracts/page-layout-knobs.js +1 -0
  53. package/dist/knob-contracts/pagination-knobs.d.ts +1 -1
  54. package/dist/knob-contracts/pagination-knobs.js +2 -1
  55. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  56. package/dist/knob-contracts/popup-knobs.js +9 -0
  57. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  58. package/dist/knob-contracts/range-knobs.js +2 -0
  59. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  60. package/dist/knob-contracts/sidebar-knobs.js +2 -0
  61. package/dist/knob-contracts/swap-knobs.d.ts +4 -0
  62. package/dist/knob-contracts/swap-knobs.js +9 -0
  63. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  64. package/dist/knob-contracts/tabs-knobs.js +3 -0
  65. package/dist/knob-contracts/timeline-knobs.d.ts +1 -1
  66. package/dist/knob-contracts/timeline-knobs.js +5 -1
  67. package/dist/knob-contracts/tool-approval-knobs.d.ts +4 -0
  68. package/dist/knob-contracts/tool-approval-knobs.js +32 -0
  69. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  70. package/dist/knob-contracts/tree-knobs.js +3 -1
  71. package/dist/lib/infinite-canvas-camera-store.d.ts +65 -0
  72. package/dist/lib/infinite-canvas-camera-store.js +233 -0
  73. package/dist/lib/infinite-canvas-camera.d.ts +33 -0
  74. package/dist/lib/infinite-canvas-camera.js +98 -0
  75. package/dist/lib/infinite-canvas-navigation.d.ts +19 -0
  76. package/dist/lib/infinite-canvas-navigation.js +395 -0
  77. package/dist/markdown-editor/bubble-menu.d.ts +6 -0
  78. package/dist/markdown-editor/bubble-menu.js +45 -0
  79. package/dist/markdown-editor/toolbar.d.ts +17 -1
  80. package/dist/markdown-editor/toolbar.js +103 -81
  81. package/dist/skin.d.ts +2 -0
  82. package/dist/styles/index.css +11 -10
  83. package/dist/styles/recipes/activity.css +12 -0
  84. package/dist/styles/recipes/avatar.css +1 -1
  85. package/dist/styles/recipes/badge.css +17 -0
  86. package/dist/styles/recipes/button-group.css +12 -6
  87. package/dist/styles/recipes/button.css +20 -3
  88. package/dist/styles/recipes/calendar.css +82 -6
  89. package/dist/styles/recipes/card.css +40 -5
  90. package/dist/styles/recipes/chat-message-edit.css +6 -21
  91. package/dist/styles/recipes/choice.css +9 -2
  92. package/dist/styles/recipes/collapsible.css +8 -1
  93. package/dist/styles/recipes/color-picker-values.css +4 -0
  94. package/dist/styles/recipes/emoji-picker.css +29 -8
  95. package/dist/styles/recipes/field-parts.css +80 -5
  96. package/dist/styles/recipes/field.css +113 -40
  97. package/dist/styles/recipes/infinite-canvas.css +17 -57
  98. package/dist/styles/recipes/item.css +33 -5
  99. package/dist/styles/recipes/kbd.css +26 -6
  100. package/dist/styles/recipes/markdown-editor.css +12 -0
  101. package/dist/styles/recipes/morphing-panel.css +1 -1
  102. package/dist/styles/recipes/page-layout.css +18 -2
  103. package/dist/styles/recipes/pagination.css +8 -0
  104. package/dist/styles/recipes/popup-controls.css +9 -0
  105. package/dist/styles/recipes/popup-drawer.css +1 -0
  106. package/dist/styles/recipes/popup-lists.css +55 -6
  107. package/dist/styles/recipes/popup-motion.css +7 -1
  108. package/dist/styles/recipes/popup.css +10 -0
  109. package/dist/styles/recipes/range.css +16 -2
  110. package/dist/styles/recipes/sidebar-mobile.css +1 -1
  111. package/dist/styles/recipes/sidebar-parts.css +17 -1
  112. package/dist/styles/recipes/sidebar.css +11 -0
  113. package/dist/styles/recipes/swap.css +143 -0
  114. package/dist/styles/recipes/tabs.css +41 -8
  115. package/dist/styles/recipes/timeline.css +36 -2
  116. package/dist/styles/recipes/tool-approval.css +267 -0
  117. package/dist/styles/recipes/track-highlight.css +19 -6
  118. package/dist/styles/recipes/tree.css +33 -0
  119. package/dist/styles/theme.css +17 -6
  120. package/dist/tool-approval.d.ts +49 -0
  121. package/dist/tool-approval.js +260 -0
  122. package/dist/ui/alert-dialog.js +1 -1
  123. package/dist/ui/badge.js +1 -1
  124. package/dist/ui/calendar.js +9 -4
  125. package/dist/ui/card.d.ts +3 -1
  126. package/dist/ui/card.js +2 -1
  127. package/dist/ui/code.js +13 -3
  128. package/dist/ui/command.js +1 -0
  129. package/dist/ui/dialog.js +1 -1
  130. package/dist/ui/dropdown-menu.d.ts +1 -1
  131. package/dist/ui/dropdown-menu.js +23 -6
  132. package/dist/ui/dropzone.js +10 -11
  133. package/dist/ui/field.d.ts +6 -2
  134. package/dist/ui/field.js +4 -2
  135. package/dist/ui/infinite-canvas.d.ts +19 -22
  136. package/dist/ui/infinite-canvas.js +264 -325
  137. package/dist/ui/morphing-panel.d.ts +5 -1
  138. package/dist/ui/morphing-panel.js +4 -2
  139. package/dist/ui/rich-tooltip.d.ts +2 -1
  140. package/dist/ui/rich-tooltip.js +32 -29
  141. package/dist/ui/select.js +2 -2
  142. package/dist/ui/sidebar-mobile.js +1 -1
  143. package/dist/ui/sidebar-provider.d.ts +3 -1
  144. package/dist/ui/sidebar-provider.js +3 -2
  145. package/dist/ui/sidebar-resize-rail.js +1 -1
  146. package/dist/ui/sidebar.d.ts +6 -5
  147. package/dist/ui/sidebar.js +10 -9
  148. package/dist/ui/swap.d.ts +14 -0
  149. package/dist/ui/swap.js +69 -0
  150. package/dist/ui/tabs.d.ts +1 -1
  151. package/dist/ui/tabs.js +2 -13
  152. package/dist/ui/timeline.d.ts +1 -1
  153. package/dist/ui/timeline.js +2 -2
  154. package/dist/ui/typography.d.ts +11 -5
  155. package/dist/ui/typography.js +18 -6
  156. package/dist/user-ask.js +1 -1
  157. package/lint/biome-preset.json +3 -0
  158. package/lint/class-policy.mjs +17 -0
  159. package/lint/eslint-plugin.mjs +87 -0
  160. package/lint/grit-rules.mjs +40 -0
  161. package/lint/no-component-style-classes.grit +16 -0
  162. package/lint/no-raw-type-classes.grit +3 -4
  163. package/lint/write-grit-rules.mjs +19 -0
  164. package/package.json +12 -3
  165. package/dist/styles/type-scale.css +0 -72
@@ -10,6 +10,7 @@
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-floating-inset: calc(var(--spacing) * 2);
13
14
  --cui-page-layout-background: var(--canvas);
14
15
  --cui-page-layout-sticky-header-background: oklch(from var(--cui-page-layout-background) l c h / 0.85);
15
16
  --cui-page-layout-sticky-header-backdrop-filter: blur(12px);
@@ -28,6 +29,12 @@
28
29
  --cui-page-layout-article-size: 80rem;
29
30
  }
30
31
 
32
+ @media (width >= 48rem) {
33
+ :where([data-control-family="page-layout"][data-slot="root"]) {
34
+ --cui-page-layout-padding-inline: calc(var(--spacing) * 8);
35
+ }
36
+ }
37
+
31
38
  :where([data-control-family="page-layout"][data-slot="root"][data-width="full"]) {
32
39
  --cui-page-layout-size: none;
33
40
  --cui-page-layout-padding-inline: calc(var(--spacing) * 6);
@@ -117,14 +124,17 @@
117
124
  }
118
125
  }
119
126
 
120
- /* Zero height: the band hangs over the body instead of displacing it. */
127
+ /* Zero height: the band hangs over the body instead of displacing it, pinned to the container corner. */
121
128
  :where([data-control-family="page-layout"][data-slot="header"][data-variant="floating"]) {
122
129
  position: sticky;
123
- inset-block-start: var(--cui-page-layout-sticky-gap);
130
+ inset-block-start: var(--cui-page-layout-floating-inset);
124
131
  z-index: 20;
125
132
  align-items: start;
133
+ max-width: none;
126
134
  height: 0;
135
+ row-gap: 0;
127
136
  padding-block: 0;
137
+ padding-inline: var(--cui-page-layout-floating-inset);
128
138
  pointer-events: none;
129
139
  }
130
140
 
@@ -239,6 +249,12 @@
239
249
  initial-value: 0px;
240
250
  }
241
251
 
252
+ @property --cui-page-layout-floating-inset {
253
+ syntax: "<length-percentage>";
254
+ inherits: true;
255
+ initial-value: 0px;
256
+ }
257
+
242
258
  @property --cui-page-layout-background {
243
259
  syntax: "<color>";
244
260
  inherits: true;
@@ -5,6 +5,7 @@
5
5
  --cui-pagination-link-hover-background: var(--hover-fill);
6
6
  --cui-pagination-link-foreground: var(--foreground);
7
7
  --cui-pagination-link-shadow: none;
8
+ --cui-pagination-link-font-size: 1em;
8
9
  }
9
10
  :where([data-control-family="pagination"][data-slot="content"]) {
10
11
  gap: calc(var(--spacing) * 1);
@@ -20,6 +21,7 @@
20
21
  inset 0 0 0 var(--control-rim-width) var(--_pagination-link-border-color),
21
22
  var(--cui-pagination-link-shadow);
22
23
  color: var(--cui-pagination-link-foreground);
24
+ font-size: var(--cui-pagination-link-font-size);
23
25
  font-variant-numeric: tabular-nums;
24
26
  }
25
27
 
@@ -102,3 +104,9 @@
102
104
  syntax: "*";
103
105
  inherits: true;
104
106
  }
107
+
108
+ @property --cui-pagination-link-font-size {
109
+ syntax: "<length-percentage>";
110
+ inherits: true;
111
+ initial-value: 0px;
112
+ }
@@ -75,6 +75,15 @@
75
75
  gap: calc(var(--spacing) * 4);
76
76
  }
77
77
 
78
+ :where([data-control-family="popup"][data-popup-kind="dialog"][data-popup-part="surface"]) {
79
+ max-inline-size: var(--cui-popup-dialog-max-inline-size);
80
+ }
81
+
82
+ :where([data-control-family="popup"][data-popup-kind="alert-dialog"][data-popup-part="surface"]) {
83
+ --cui-popup-dialog-max-inline-size: 28rem;
84
+ max-inline-size: var(--cui-popup-dialog-max-inline-size);
85
+ }
86
+
78
87
  :where([data-control-family="popup"][data-popup-kind="dialog"][data-slot="header"]),
79
88
  :where([data-control-family="popup"][data-popup-kind="alert-dialog"][data-slot="header"]) {
80
89
  gap: calc(var(--spacing) * 1.5);
@@ -85,6 +85,7 @@
85
85
  /* Block padding lives inside the scroller, never on the popup: the scroll edge would clip a focus ring on the first or last row. */
86
86
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="body"][data-padding="default"]) {
87
87
  padding-block: calc(var(--spacing) * 4);
88
+ padding-inline: calc(var(--spacing) * 4);
88
89
  }
89
90
 
90
91
  :where([data-control-family="popup"][data-popup-kind="drawer"][data-slot="body"][data-padding="default"]:last-child) {
@@ -64,12 +64,12 @@
64
64
  }
65
65
 
66
66
  :where([data-control-family="popup"][data-popup-kind="command"][data-slot="group"] [cmdk-group-heading]) {
67
- padding-inline: calc(var(--spacing) * 2);
68
- padding-block: calc(var(--spacing) * 1.5);
69
- text-transform: uppercase;
70
- font-size: var(--text-caption);
67
+ padding-inline: var(--cui-popup-command-heading-padding-inline);
68
+ padding-block: var(--cui-popup-command-heading-padding-block);
69
+ text-transform: var(--cui-popup-command-heading-text-transform);
70
+ font-size: var(--cui-popup-command-heading-font-size);
71
71
  font-weight: var(--font-weight-medium);
72
- letter-spacing: 0.08em;
72
+ letter-spacing: var(--cui-popup-command-heading-letter-spacing);
73
73
  }
74
74
 
75
75
  :where([data-control-family="popup"][data-popup-kind="command"][data-slot="empty"]),
@@ -153,7 +153,7 @@
153
153
  }
154
154
 
155
155
  :where([data-control-family="popup"][data-popup-part="separator"]) {
156
- margin-block: calc(var(--spacing) * 1);
156
+ margin-block: var(--cui-popup-separator-gap);
157
157
  margin-inline: var(--cui-popup-separator-inset);
158
158
  block-size: 1px;
159
159
  background-color: var(--cui-popup-separator-color);
@@ -175,6 +175,7 @@
175
175
  margin-inline-start: auto;
176
176
  padding-inline-start: calc(var(--spacing) * 4);
177
177
  line-height: 1;
178
+ color: var(--cui-popup-submenu-indicator-foreground);
178
179
  }
179
180
 
180
181
  :where([data-control-family="popup"][data-popup-part="bar"]) {
@@ -317,3 +318,51 @@
317
318
  inherits: true;
318
319
  initial-value: 0px;
319
320
  }
321
+
322
+ @property --cui-popup-separator-gap {
323
+ syntax: "<length-percentage>";
324
+ inherits: true;
325
+ initial-value: 0px;
326
+ }
327
+
328
+ @property --cui-popup-submenu-indicator-foreground {
329
+ syntax: "<color>";
330
+ inherits: true;
331
+ initial-value: transparent;
332
+ }
333
+
334
+ @property --cui-popup-command-heading-padding-block {
335
+ syntax: "<length-percentage>";
336
+ inherits: true;
337
+ initial-value: 0px;
338
+ }
339
+
340
+ @property --cui-popup-command-heading-padding-inline {
341
+ syntax: "<length-percentage>";
342
+ inherits: true;
343
+ initial-value: 0px;
344
+ }
345
+
346
+ @property --cui-popup-command-heading-font-size {
347
+ syntax: "<length-percentage>";
348
+ inherits: true;
349
+ initial-value: 0px;
350
+ }
351
+
352
+ @property --cui-popup-command-heading-letter-spacing {
353
+ syntax: "<length>";
354
+ inherits: true;
355
+ initial-value: 0px;
356
+ }
357
+
358
+ @property --cui-popup-command-heading-text-transform {
359
+ syntax: "none | uppercase | lowercase | capitalize";
360
+ inherits: true;
361
+ initial-value: none;
362
+ }
363
+
364
+ @property --cui-popup-dialog-max-inline-size {
365
+ syntax: "<length-percentage>";
366
+ inherits: true;
367
+ initial-value: 0px;
368
+ }
@@ -63,7 +63,13 @@
63
63
  }
64
64
 
65
65
  :where([data-control-family="popup"][data-popup-kind="tooltip"][data-slot="content"][data-popup-part="surface"][data-arrow="true"]) {
66
- --_popup-tooltip-content-radius: clamp(0px, var(--cui-popup-radius), 3px);
66
+ --_popup-tooltip-content-radius: clamp(0px, var(--cui-popup-radius), var(--cui-popup-tooltip-arrow-radius));
67
67
  border-radius: var(--_popup-tooltip-content-radius);
68
68
  }
69
69
  }
70
+
71
+ @property --cui-popup-tooltip-arrow-radius {
72
+ syntax: "<length-percentage>";
73
+ inherits: true;
74
+ initial-value: 0px;
75
+ }
@@ -37,6 +37,15 @@
37
37
  --cui-popup-label-text-transform: uppercase;
38
38
  --cui-popup-separator-color: var(--border);
39
39
  --cui-popup-separator-inset: calc(var(--popover-padding) * -1);
40
+ --cui-popup-separator-gap: calc(var(--spacing) * 1);
41
+ --cui-popup-submenu-indicator-foreground: var(--cui-popup-item-foreground);
42
+ --cui-popup-tooltip-arrow-radius: 3px;
43
+ --cui-popup-command-heading-padding-block: calc(var(--spacing) * 1.5);
44
+ --cui-popup-command-heading-padding-inline: calc(var(--spacing) * 2);
45
+ --cui-popup-command-heading-font-size: var(--text-caption);
46
+ --cui-popup-command-heading-letter-spacing: calc(var(--cui-popup-command-heading-font-size) * 0.08);
47
+ --cui-popup-command-heading-text-transform: uppercase;
48
+ --cui-popup-dialog-max-inline-size: 32rem;
40
49
  --cui-popup-shortcut-foreground: var(--muted-foreground);
41
50
  --cui-popup-shortcut-font-size: var(--text-body);
42
51
  --cui-popup-shortcut-letter-spacing: 0.02em;
@@ -197,6 +206,7 @@
197
206
  )
198
207
  ) {
199
208
  --cui-popup-shortcut-foreground: var(--cui-popup-item-highlight-foreground);
209
+ --cui-popup-submenu-indicator-foreground: var(--cui-popup-item-highlight-foreground);
200
210
  --muted-foreground: var(--cui-popup-item-highlight-muted-foreground);
201
211
  background-color: var(--cui-popup-item-highlight-background);
202
212
  color: var(--cui-popup-item-highlight-foreground);
@@ -5,6 +5,8 @@
5
5
  --cui-range-indicator-radius: 9999px;
6
6
  --cui-range-indicator-background: var(--primary);
7
7
  --cui-range-thumb-radius: 9999px;
8
+ --cui-range-thumb-inline-size: calc(var(--spacing) * 3.5);
9
+ --cui-range-thumb-block-size: calc(var(--spacing) * 3.5);
8
10
  --cui-range-thumb-background: var(--background);
9
11
  --cui-range-thumb-border-color: var(--control-rim);
10
12
  --cui-range-thumb-shadow: var(--shadow-sm);
@@ -85,8 +87,8 @@
85
87
  }
86
88
 
87
89
  :where([data-control-family="range"][data-range-kind="slider"][data-slot="thumb"][data-variant="default"]) {
88
- inline-size: calc(var(--spacing) * 3.5);
89
- block-size: calc(var(--spacing) * 3.5);
90
+ inline-size: var(--cui-range-thumb-inline-size);
91
+ block-size: var(--cui-range-thumb-block-size);
90
92
  }
91
93
 
92
94
  :where([data-control-family="range"][data-range-kind="slider"][data-slot="thumb"]) {
@@ -347,6 +349,18 @@
347
349
  initial-value: 0px;
348
350
  }
349
351
 
352
+ @property --cui-range-thumb-inline-size {
353
+ syntax: "<length-percentage>";
354
+ inherits: true;
355
+ initial-value: 0px;
356
+ }
357
+
358
+ @property --cui-range-thumb-block-size {
359
+ syntax: "<length-percentage>";
360
+ inherits: true;
361
+ initial-value: 0px;
362
+ }
363
+
350
364
  @property --cui-range-thumb-background {
351
365
  syntax: "<color>";
352
366
  inherits: true;
@@ -93,7 +93,7 @@
93
93
  box-shadow: var(--cui-sidebar-nav-shadow);
94
94
  }
95
95
 
96
- @media (width < 64rem) {
96
+ @variant max-sidebar {
97
97
  :where([data-control-family="sidebar"][data-slot="wrapper"]:has(> [data-slot="mobile-nav-container"])) {
98
98
  flex-direction: column;
99
99
  }
@@ -94,7 +94,7 @@
94
94
  --focus-ring-offset: calc(var(--focus-ring-width) * -1);
95
95
  }
96
96
 
97
- @media (width >= 64rem) {
97
+ @variant sidebar {
98
98
  :where(
99
99
  [data-control-family="sidebar"][data-slot="root"][data-variant="inset"][data-state]
100
100
  ~ [data-control-family="sidebar"][data-slot="inset"]
@@ -122,6 +122,10 @@
122
122
  box-shadow: var(--cui-sidebar-header-shadow);
123
123
  }
124
124
 
125
+ :where([data-control-family="sidebar"][data-slot="header"][data-divider]) {
126
+ border-block-end: var(--cui-sidebar-header-border-width) solid var(--cui-sidebar-header-border-color);
127
+ }
128
+
125
129
  :where([data-control-family="sidebar"][data-slot="content-stack"]) {
126
130
  gap: calc(var(--spacing) * 2);
127
131
  }
@@ -219,3 +223,15 @@
219
223
  inherits: true;
220
224
  initial-value: transparent;
221
225
  }
226
+
227
+ @property --cui-sidebar-header-border-width {
228
+ syntax: "<length>";
229
+ inherits: true;
230
+ initial-value: 0px;
231
+ }
232
+
233
+ @property --cui-sidebar-header-border-color {
234
+ syntax: "<color>";
235
+ inherits: true;
236
+ initial-value: transparent;
237
+ }
@@ -17,6 +17,11 @@
17
17
  background-image: var(--cui-sidebar-wrapper-background-image);
18
18
  }
19
19
 
20
+ :where([data-control-family="sidebar"][data-slot="wrapper"][data-surface="background"]) {
21
+ --cui-sidebar-wrapper-background: var(--background);
22
+ color: var(--foreground);
23
+ }
24
+
20
25
  :where([data-control-family="sidebar"][data-slot="wrapper"]:has([data-control-family="sidebar"][data-variant="inset"][data-state])) {
21
26
  --cui-sidebar-wrapper-background: var(--sidebar);
22
27
  }
@@ -35,6 +40,8 @@
35
40
  --cui-sidebar-inner-shadow: none;
36
41
  --cui-sidebar-header-background: transparent;
37
42
  --cui-sidebar-header-shadow: 0 0 transparent;
43
+ --cui-sidebar-header-border-width: 1px;
44
+ --cui-sidebar-header-border-color: var(--sidebar-border);
38
45
  --cui-sidebar-rail-divider-background: transparent;
39
46
  --cui-sidebar-group-label-foreground: oklch(from var(--sidebar-foreground) l c h / 0.7);
40
47
  --cui-sidebar-group-label-font-size: var(--text-caption);
@@ -71,6 +78,10 @@
71
78
  background-color: transparent;
72
79
  }
73
80
 
81
+ :where([data-control-family="sidebar"][data-slot="root"]:is([data-variant="page"], [data-variant="inset"])[data-state]) {
82
+ --cui-sidebar-header-border-width: 0px;
83
+ }
84
+
74
85
  :where([data-control-family="sidebar"][data-slot="gap"]) {
75
86
  background-color: transparent;
76
87
  transition: width var(--_sidebar-transition-duration) var(--ease-standard);
@@ -0,0 +1,143 @@
1
+ @layer components {
2
+ :where([data-control-family="swap"][data-slot="root"]) {
3
+ --cui-swap-animation-duration: var(--duration-slow);
4
+ --cui-swap-easing: var(--ease-emphasized);
5
+ --cui-swap-label-inset: 60%;
6
+ --cui-swap-icon-scale: 0.5;
7
+ position: relative;
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: inherit;
11
+ inline-size: var(--_swap-inline-size, auto);
12
+ transition: inline-size var(--cui-swap-animation-duration) var(--cui-swap-easing);
13
+ }
14
+
15
+ :where([data-control-family="swap"][data-slot="item"]) {
16
+ display: inline-flex;
17
+ flex: none;
18
+ align-items: center;
19
+ gap: inherit;
20
+ white-space: nowrap;
21
+ }
22
+
23
+ :where([data-control-family="swap"][data-slot="item"]:not([data-state="active"])) {
24
+ position: absolute;
25
+ inset-block: 0;
26
+ inset-inline-start: 0;
27
+ opacity: 0;
28
+ pointer-events: none;
29
+ }
30
+
31
+ :where([data-control-family="swap"][data-slot="item"][data-state="inactive"]) {
32
+ visibility: hidden;
33
+ }
34
+
35
+ :where([data-control-family="swap"][data-slot="label"]) {
36
+ display: inline-block;
37
+ }
38
+
39
+ :where([data-control-family="swap"][data-swapped] > [data-slot="item"][data-state="active"]) {
40
+ animation: cui-swap-item-enter var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
41
+ }
42
+
43
+ :where([data-control-family="swap"][data-swapped] > [data-slot="item"][data-state="exiting"]) {
44
+ animation: cui-swap-item-exit var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
45
+ }
46
+
47
+ :where(
48
+ [data-control-family="swap"][data-swapped]
49
+ > [data-slot="item"][data-state="active"]
50
+ > :not(svg, [data-slot="icon"], [data-control-family="spinner"])
51
+ ) {
52
+ animation: cui-swap-label-enter var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
53
+ }
54
+
55
+ :where(
56
+ [data-control-family="swap"][data-swapped]
57
+ > [data-slot="item"][data-state="exiting"]
58
+ > :not(svg, [data-slot="icon"], [data-control-family="spinner"])
59
+ ) {
60
+ animation: cui-swap-label-exit var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
61
+ }
62
+
63
+ :where(
64
+ [data-control-family="swap"][data-swapped]
65
+ > [data-slot="item"][data-state="active"]
66
+ > :is(svg, [data-slot="icon"], [data-control-family="spinner"])
67
+ ) {
68
+ animation: cui-swap-icon-enter var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
69
+ }
70
+
71
+ :where(
72
+ [data-control-family="swap"][data-swapped]
73
+ > [data-slot="item"][data-state="exiting"]
74
+ > :is(svg, [data-slot="icon"], [data-control-family="spinner"])
75
+ ) {
76
+ animation: cui-swap-icon-exit var(--cui-swap-animation-duration) var(--cui-swap-easing) both;
77
+ }
78
+ }
79
+
80
+ @keyframes cui-swap-item-enter {
81
+ from {
82
+ opacity: 0;
83
+ filter: blur(var(--blur-xs));
84
+ }
85
+ }
86
+
87
+ @keyframes cui-swap-item-exit {
88
+ from {
89
+ opacity: 1;
90
+ filter: blur(0);
91
+ }
92
+ to {
93
+ opacity: 0;
94
+ filter: blur(var(--blur-xs));
95
+ }
96
+ }
97
+
98
+ @keyframes cui-swap-label-enter {
99
+ from {
100
+ translate: 0 var(--cui-swap-label-inset);
101
+ }
102
+ }
103
+
104
+ @keyframes cui-swap-label-exit {
105
+ to {
106
+ translate: 0 calc(var(--cui-swap-label-inset) * -1);
107
+ }
108
+ }
109
+
110
+ @keyframes cui-swap-icon-enter {
111
+ from {
112
+ scale: var(--cui-swap-icon-scale);
113
+ }
114
+ }
115
+
116
+ @keyframes cui-swap-icon-exit {
117
+ to {
118
+ scale: var(--cui-swap-icon-scale);
119
+ }
120
+ }
121
+
122
+ @property --cui-swap-animation-duration {
123
+ syntax: "<time>";
124
+ inherits: true;
125
+ initial-value: 0s;
126
+ }
127
+
128
+ @property --cui-swap-easing {
129
+ syntax: "*";
130
+ inherits: true;
131
+ }
132
+
133
+ @property --cui-swap-label-inset {
134
+ syntax: "<length-percentage>";
135
+ inherits: true;
136
+ initial-value: 0px;
137
+ }
138
+
139
+ @property --cui-swap-icon-scale {
140
+ syntax: "<number>";
141
+ inherits: true;
142
+ initial-value: 1;
143
+ }
@@ -22,6 +22,8 @@
22
22
  --cui-tabs-indicator-shadow: var(--shadow-sm);
23
23
  --cui-tabs-border-color: var(--border);
24
24
  --cui-tabs-border-width: var(--control-rim-width);
25
+ --cui-tabs-font-size: var(--text-label);
26
+ --cui-tabs-font-weight: var(--font-weight-medium);
25
27
  }
26
28
 
27
29
  :where([data-control-family="tabs"][data-slot="root"][data-orientation="vertical"]) {
@@ -30,14 +32,15 @@
30
32
  }
31
33
 
32
34
  :where([data-control-family="tabs"][data-slot="list"]) {
33
- --_tabs-trigger-radius-fit: min(var(--cui-tabs-trigger-radius), calc(var(--_tabs-trigger-h) / 2));
35
+ --cui-tabs-trigger-height: var(--control-h-sm);
36
+ --_tabs-trigger-radius-fit: min(var(--cui-tabs-trigger-radius), calc(var(--cui-tabs-trigger-height) / 2));
34
37
  position: relative;
35
38
  display: flex;
36
- min-height: calc(var(--_tabs-trigger-h) + var(--cui-tabs-list-padding) + var(--cui-tabs-list-padding));
39
+ min-height: calc(var(--cui-tabs-trigger-height) + var(--cui-tabs-list-padding) + var(--cui-tabs-list-padding));
37
40
  width: fit-content;
38
41
  align-items: center;
39
42
  gap: calc(var(--spacing) * 1);
40
- border-radius: min(var(--cui-tabs-list-radius), calc(var(--_tabs-trigger-h) / 2 + var(--cui-tabs-list-padding)));
43
+ border-radius: min(var(--cui-tabs-list-radius), calc(var(--cui-tabs-trigger-height) / 2 + var(--cui-tabs-list-padding)));
41
44
  background: var(--cui-tabs-list-background);
42
45
  box-shadow: var(--cui-tabs-list-shadow);
43
46
  padding: var(--cui-tabs-list-padding);
@@ -45,12 +48,24 @@
45
48
  backdrop-filter: var(--cui-tabs-list-backdrop-filter);
46
49
  }
47
50
 
51
+ :where([data-control-family="tabs"][data-slot="list"][data-size="xs"]) {
52
+ --cui-tabs-trigger-height: var(--control-h-xs);
53
+ }
54
+
55
+ :where([data-control-family="tabs"][data-slot="list"][data-size="md"]) {
56
+ --cui-tabs-trigger-height: var(--control-h-md);
57
+ }
58
+
59
+ :where([data-control-family="tabs"][data-slot="list"][data-size="lg"]) {
60
+ --cui-tabs-trigger-height: var(--control-h-lg);
61
+ }
62
+
48
63
  :where([data-control-family="tabs"][data-slot="indicator"]) {
49
64
  position: absolute;
50
65
  top: 50%;
51
66
  left: 0;
52
67
  z-index: 0;
53
- height: var(--_tabs-trigger-h);
68
+ height: var(--cui-tabs-trigger-height);
54
69
  width: var(--active-tab-width);
55
70
  transform: translateX(var(--active-tab-left)) translateY(-50%);
56
71
  border-radius: var(--_tabs-trigger-radius-fit);
@@ -81,7 +96,7 @@
81
96
  position: relative;
82
97
  z-index: 1;
83
98
  display: inline-flex;
84
- height: var(--_tabs-trigger-h);
99
+ height: var(--cui-tabs-trigger-height);
85
100
  flex-shrink: 0;
86
101
  cursor: pointer;
87
102
  align-items: center;
@@ -91,8 +106,8 @@
91
106
  border-radius: var(--_tabs-trigger-radius-fit);
92
107
  padding-inline: calc(var(--spacing) * 3.5);
93
108
  color: var(--cui-tabs-foreground);
94
- font-size: var(--text-label);
95
- font-weight: var(--font-weight-medium);
109
+ font-size: var(--cui-tabs-font-size);
110
+ font-weight: var(--cui-tabs-font-weight);
96
111
  }
97
112
 
98
113
  :where([data-control-family="tabs"][data-slot="list"]:not([data-orientation="vertical"], [data-variant="browser"]) [data-slot="tab"]) {
@@ -129,7 +144,7 @@
129
144
  :where([data-control-family="tabs"][data-slot="list"][data-variant="browser"]) {
130
145
  --_tabs-browser-corner-double: calc(var(--_tabs-trigger-radius-fit) + var(--_tabs-trigger-radius-fit));
131
146
  --_tabs-browser-inset: calc(var(--_tabs-trigger-radius-fit) + var(--cui-tabs-surface-radius));
132
- min-height: calc(var(--_tabs-trigger-h) + var(--cui-tabs-list-padding));
147
+ min-height: calc(var(--cui-tabs-trigger-height) + var(--cui-tabs-list-padding));
133
148
  width: auto;
134
149
  align-items: flex-end;
135
150
  isolation: isolate;
@@ -269,6 +284,12 @@
269
284
  initial-value: 0px;
270
285
  }
271
286
 
287
+ @property --cui-tabs-trigger-height {
288
+ syntax: "<length-percentage>";
289
+ inherits: true;
290
+ initial-value: 0px;
291
+ }
292
+
272
293
  @property --cui-tabs-list-padding {
273
294
  syntax: "<length-percentage>";
274
295
  inherits: true;
@@ -304,6 +325,18 @@
304
325
  initial-value: transparent;
305
326
  }
306
327
 
328
+ @property --cui-tabs-font-size {
329
+ syntax: "<length-percentage>";
330
+ inherits: true;
331
+ initial-value: 0px;
332
+ }
333
+
334
+ @property --cui-tabs-font-weight {
335
+ syntax: "<number>";
336
+ inherits: true;
337
+ initial-value: 400;
338
+ }
339
+
307
340
  @property --cui-tabs-active-foreground {
308
341
  syntax: "<color>";
309
342
  inherits: true;
@@ -3,14 +3,18 @@
3
3
  --cui-timeline-indicator-background: var(--background);
4
4
  --cui-timeline-indicator-foreground: var(--muted-foreground);
5
5
  --cui-timeline-running-foreground: var(--primary-text);
6
+ --cui-timeline-waiting-foreground: var(--warning-text);
6
7
  --cui-timeline-success-foreground: var(--foreground);
7
8
  --cui-timeline-error-foreground: var(--destructive-text);
8
9
  --cui-timeline-separator-background: var(--border);
10
+ --cui-timeline-separator-inline-size: 1px;
9
11
  --cui-timeline-title-foreground: var(--foreground);
12
+ --cui-timeline-title-font-weight: var(--font-weight-medium);
13
+ --cui-timeline-item-padding-block: calc(var(--spacing) * 5);
10
14
  }
11
15
  :where([data-control-family="timeline"][data-slot="item"]) {
12
16
  column-gap: calc(var(--spacing) * 3);
13
- padding-block-end: calc(var(--spacing) * 5);
17
+ padding-block-end: var(--cui-timeline-item-padding-block);
14
18
  }
15
19
 
16
20
  :where([data-control-family="timeline"][data-slot="item"]:last-child) {
@@ -38,6 +42,10 @@
38
42
  color: var(--cui-timeline-running-foreground);
39
43
  }
40
44
 
45
+ :where([data-control-family="timeline"][data-slot="item"][data-state="waiting"] [data-control-family="timeline"][data-slot="indicator"]) {
46
+ color: var(--cui-timeline-waiting-foreground);
47
+ }
48
+
41
49
  :where([data-control-family="timeline"][data-slot="item"][data-state="success"] [data-control-family="timeline"][data-slot="indicator"]) {
42
50
  color: var(--cui-timeline-success-foreground);
43
51
  }
@@ -47,13 +55,15 @@
47
55
  }
48
56
 
49
57
  :where([data-control-family="timeline"][data-slot="separator"]) {
58
+ inset-inline-start: calc(var(--spacing) * 2 - var(--cui-timeline-separator-inline-size) / 2);
59
+ inline-size: var(--cui-timeline-separator-inline-size);
50
60
  background: var(--cui-timeline-separator-background);
51
61
  }
52
62
 
53
63
  :where([data-control-family="timeline"][data-slot="title"]) {
54
64
  color: var(--cui-timeline-title-foreground);
55
65
  font-size: var(--text-label);
56
- font-weight: var(--font-weight-medium);
66
+ font-weight: var(--cui-timeline-title-font-weight);
57
67
  line-height: calc(var(--spacing) * 5);
58
68
  text-wrap: balance;
59
69
  }
@@ -84,6 +94,12 @@
84
94
  initial-value: transparent;
85
95
  }
86
96
 
97
+ @property --cui-timeline-waiting-foreground {
98
+ syntax: "<color>";
99
+ inherits: true;
100
+ initial-value: transparent;
101
+ }
102
+
87
103
  @property --cui-timeline-success-foreground {
88
104
  syntax: "<color>";
89
105
  inherits: true;
@@ -107,3 +123,21 @@
107
123
  inherits: true;
108
124
  initial-value: transparent;
109
125
  }
126
+
127
+ @property --cui-timeline-title-font-weight {
128
+ syntax: "<number>";
129
+ inherits: true;
130
+ initial-value: 400;
131
+ }
132
+
133
+ @property --cui-timeline-item-padding-block {
134
+ syntax: "<length-percentage>";
135
+ inherits: true;
136
+ initial-value: 0px;
137
+ }
138
+
139
+ @property --cui-timeline-separator-inline-size {
140
+ syntax: "<length-percentage>";
141
+ inherits: true;
142
+ initial-value: 0px;
143
+ }