@ctrl-ui/react 0.9.6 → 0.9.9

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 (133) hide show
  1. package/README.md +38 -2
  2. package/dist/activity.d.ts +3 -1
  3. package/dist/activity.js +2 -1
  4. package/dist/blocks/agent-run-sidebar.js +11 -10
  5. package/dist/blocks/agent-run.d.ts +3 -1
  6. package/dist/blocks/agent-run.js +21 -13
  7. package/dist/blocks/coding-agent.js +50 -69
  8. package/dist/blocks/design-canvas-inspector.js +1 -1
  9. package/dist/blocks/design-canvas.js +41 -34
  10. package/dist/blocks/discussion.js +1 -1
  11. package/dist/blocks/file-explorer.js +66 -47
  12. package/dist/blocks/settings.js +37 -41
  13. package/dist/blocks/team-chat.js +2 -1
  14. package/dist/blocks/theme-toggle.d.ts +2 -1
  15. package/dist/blocks/theme-toggle.js +13 -4
  16. package/dist/hooks/use-mobile.d.ts +1 -1
  17. package/dist/hooks/use-mobile.js +1 -1
  18. package/dist/knob-contracts/badge-knobs.d.ts +1 -1
  19. package/dist/knob-contracts/badge-knobs.js +3 -1
  20. package/dist/knob-contracts/button-knobs.d.ts +1 -1
  21. package/dist/knob-contracts/button-knobs.js +1 -0
  22. package/dist/knob-contracts/calendar-knobs.d.ts +1 -1
  23. package/dist/knob-contracts/calendar-knobs.js +9 -1
  24. package/dist/knob-contracts/card-knobs.d.ts +1 -1
  25. package/dist/knob-contracts/card-knobs.js +5 -1
  26. package/dist/knob-contracts/choice-knobs.d.ts +1 -1
  27. package/dist/knob-contracts/choice-knobs.js +1 -0
  28. package/dist/knob-contracts/collapsible-knobs.d.ts +1 -1
  29. package/dist/knob-contracts/collapsible-knobs.js +5 -1
  30. package/dist/knob-contracts/emoji-picker-knobs.d.ts +1 -1
  31. package/dist/knob-contracts/emoji-picker-knobs.js +3 -1
  32. package/dist/knob-contracts/field-knobs.d.ts +1 -1
  33. package/dist/knob-contracts/field-knobs.js +17 -1
  34. package/dist/knob-contracts/item-knobs.d.ts +1 -1
  35. package/dist/knob-contracts/item-knobs.js +6 -1
  36. package/dist/knob-contracts/kbd-knobs.d.ts +1 -1
  37. package/dist/knob-contracts/kbd-knobs.js +4 -1
  38. package/dist/knob-contracts/page-layout-knobs.d.ts +1 -1
  39. package/dist/knob-contracts/page-layout-knobs.js +1 -0
  40. package/dist/knob-contracts/pagination-knobs.d.ts +1 -1
  41. package/dist/knob-contracts/pagination-knobs.js +2 -1
  42. package/dist/knob-contracts/popup-knobs.d.ts +1 -1
  43. package/dist/knob-contracts/popup-knobs.js +9 -0
  44. package/dist/knob-contracts/range-knobs.d.ts +1 -1
  45. package/dist/knob-contracts/range-knobs.js +2 -0
  46. package/dist/knob-contracts/sidebar-knobs.d.ts +1 -1
  47. package/dist/knob-contracts/sidebar-knobs.js +2 -0
  48. package/dist/knob-contracts/tabs-knobs.d.ts +1 -1
  49. package/dist/knob-contracts/tabs-knobs.js +3 -0
  50. package/dist/knob-contracts/timeline-knobs.d.ts +1 -1
  51. package/dist/knob-contracts/timeline-knobs.js +4 -1
  52. package/dist/knob-contracts/tree-knobs.d.ts +1 -1
  53. package/dist/knob-contracts/tree-knobs.js +3 -1
  54. package/dist/skin.d.ts +2 -0
  55. package/dist/styles/index.css +2 -3
  56. package/dist/styles/recipes/activity.css +4 -0
  57. package/dist/styles/recipes/avatar.css +1 -1
  58. package/dist/styles/recipes/badge.css +17 -0
  59. package/dist/styles/recipes/button.css +8 -1
  60. package/dist/styles/recipes/calendar.css +82 -6
  61. package/dist/styles/recipes/card.css +40 -5
  62. package/dist/styles/recipes/choice.css +9 -2
  63. package/dist/styles/recipes/collapsible.css +8 -1
  64. package/dist/styles/recipes/color-picker-values.css +4 -0
  65. package/dist/styles/recipes/emoji-picker.css +29 -8
  66. package/dist/styles/recipes/empty.css +5 -0
  67. package/dist/styles/recipes/field-parts.css +80 -5
  68. package/dist/styles/recipes/field.css +113 -40
  69. package/dist/styles/recipes/item.css +44 -5
  70. package/dist/styles/recipes/kbd.css +26 -6
  71. package/dist/styles/recipes/morphing-panel.css +1 -1
  72. package/dist/styles/recipes/page-layout.css +18 -2
  73. package/dist/styles/recipes/pagination.css +8 -0
  74. package/dist/styles/recipes/popup-controls.css +41 -0
  75. package/dist/styles/recipes/popup-drawer.css +1 -0
  76. package/dist/styles/recipes/popup-lists.css +55 -6
  77. package/dist/styles/recipes/popup-motion.css +7 -1
  78. package/dist/styles/recipes/popup.css +10 -0
  79. package/dist/styles/recipes/range.css +16 -2
  80. package/dist/styles/recipes/sidebar-mobile.css +1 -1
  81. package/dist/styles/recipes/sidebar-parts.css +17 -1
  82. package/dist/styles/recipes/sidebar.css +11 -0
  83. package/dist/styles/recipes/skeleton.css +8 -0
  84. package/dist/styles/recipes/tabs.css +41 -8
  85. package/dist/styles/recipes/timeline.css +25 -2
  86. package/dist/styles/recipes/tree.css +33 -0
  87. package/dist/styles/theme.css +11 -1
  88. package/dist/surface-variants.d.ts +2 -0
  89. package/dist/surface-variants.js +2 -1
  90. package/dist/ui/alert-dialog.js +1 -1
  91. package/dist/ui/badge.js +1 -1
  92. package/dist/ui/calendar.js +9 -4
  93. package/dist/ui/card.d.ts +3 -1
  94. package/dist/ui/card.js +2 -1
  95. package/dist/ui/context-menu.d.ts +3 -1
  96. package/dist/ui/context-menu.js +2 -1
  97. package/dist/ui/dialog.js +1 -1
  98. package/dist/ui/dropdown-menu.d.ts +6 -3
  99. package/dist/ui/dropdown-menu.js +25 -7
  100. package/dist/ui/dropzone.js +10 -11
  101. package/dist/ui/empty.d.ts +4 -1
  102. package/dist/ui/empty.js +4 -2
  103. package/dist/ui/field.d.ts +6 -2
  104. package/dist/ui/field.js +4 -2
  105. package/dist/ui/menubar.d.ts +3 -1
  106. package/dist/ui/menubar.js +2 -1
  107. package/dist/ui/morphing-panel.d.ts +5 -1
  108. package/dist/ui/morphing-panel.js +4 -2
  109. package/dist/ui/select.js +2 -2
  110. package/dist/ui/sheet.d.ts +9 -0
  111. package/dist/ui/sheet.js +23 -1
  112. package/dist/ui/sidebar-mobile.js +1 -1
  113. package/dist/ui/sidebar-provider.d.ts +3 -1
  114. package/dist/ui/sidebar-provider.js +3 -2
  115. package/dist/ui/sidebar-resize-rail.js +1 -1
  116. package/dist/ui/sidebar.d.ts +6 -5
  117. package/dist/ui/sidebar.js +10 -9
  118. package/dist/ui/skeleton.d.ts +4 -1
  119. package/dist/ui/skeleton.js +8 -2
  120. package/dist/ui/tabs.d.ts +1 -1
  121. package/dist/ui/tabs.js +2 -13
  122. package/dist/ui/timeline.js +1 -1
  123. package/dist/ui/typography.d.ts +11 -5
  124. package/dist/ui/typography.js +18 -6
  125. package/lint/biome-preset.json +3 -0
  126. package/lint/class-policy.mjs +17 -0
  127. package/lint/eslint-plugin.mjs +87 -0
  128. package/lint/grit-rules.mjs +40 -0
  129. package/lint/no-component-style-classes.grit +16 -0
  130. package/lint/no-raw-type-classes.grit +2 -3
  131. package/lint/write-grit-rules.mjs +19 -0
  132. package/package.json +11 -2
  133. 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
+ }
@@ -1,4 +1,10 @@
1
1
  @layer components {
2
+ :where([data-control-family="popup"][data-popup-part="item"][data-tone="danger"]) {
3
+ --cui-popup-item-foreground: var(--destructive-text);
4
+ --cui-popup-item-highlight-background: oklch(from var(--destructive-text) l c h / 0.12);
5
+ --cui-popup-item-highlight-foreground: var(--destructive-text);
6
+ }
7
+
2
8
  :where([data-control-family="popup"][data-popup-kind="dialog"][data-slot="title"]),
3
9
  :where([data-control-family="popup"][data-popup-kind="alert-dialog"][data-slot="title"]),
4
10
  :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="title"]),
@@ -75,6 +81,15 @@
75
81
  gap: calc(var(--spacing) * 4);
76
82
  }
77
83
 
84
+ :where([data-control-family="popup"][data-popup-kind="dialog"][data-popup-part="surface"]) {
85
+ max-inline-size: var(--cui-popup-dialog-max-inline-size);
86
+ }
87
+
88
+ :where([data-control-family="popup"][data-popup-kind="alert-dialog"][data-popup-part="surface"]) {
89
+ --cui-popup-dialog-max-inline-size: 28rem;
90
+ max-inline-size: var(--cui-popup-dialog-max-inline-size);
91
+ }
92
+
78
93
  :where([data-control-family="popup"][data-popup-kind="dialog"][data-slot="header"]),
79
94
  :where([data-control-family="popup"][data-popup-kind="alert-dialog"][data-slot="header"]) {
80
95
  gap: calc(var(--spacing) * 1.5);
@@ -103,6 +118,32 @@
103
118
  padding: calc(var(--spacing) * 4);
104
119
  }
105
120
 
121
+ :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="content"]:has(> [data-slot="body"])) {
122
+ gap: 0;
123
+ }
124
+
125
+ :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="body"]) {
126
+ gap: calc(var(--spacing) * 4);
127
+ overscroll-behavior: contain;
128
+ }
129
+
130
+ :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="body"][data-padding="default"]) {
131
+ padding: calc(var(--spacing) * 4);
132
+ }
133
+
134
+ :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="footer"]) {
135
+ gap: calc(var(--spacing) * 2);
136
+ padding: calc(var(--spacing) * 4);
137
+ }
138
+
139
+ :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="header"]:has(+ [data-slot="body"])) {
140
+ border-block-end: 1px solid var(--cui-popup-separator-color);
141
+ }
142
+
143
+ :where([data-control-family="popup"][data-popup-kind="sheet"][data-slot="body"] + [data-slot="footer"]) {
144
+ border-block-start: 1px solid var(--cui-popup-separator-color);
145
+ }
146
+
106
147
  :where([data-control-family="popup"][data-popup-kind="popover"][data-slot="header"]) {
107
148
  gap: calc(var(--spacing) * 1.5);
108
149
  padding-block-end: calc(var(--spacing) * 3);
@@ -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);
@@ -15,6 +15,14 @@
15
15
  background-image: var(--cui-skeleton-background-image);
16
16
  }
17
17
 
18
+ :where([data-control-family="skeleton"][data-slot="root"][data-shape="circle"]) {
19
+ --cui-skeleton-radius: 9999px;
20
+ }
21
+
22
+ :where([data-control-family="skeleton"][data-slot="root"][data-shape="panel"]) {
23
+ --cui-skeleton-radius: var(--radius-panel);
24
+ }
25
+
18
26
  :where([data-control-family="skeleton"][data-slot="root"][data-variant="shimmer"]) {
19
27
  --cui-skeleton-easing: linear;
20
28
  }
@@ -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;
@@ -7,11 +7,14 @@
7
7
  --cui-timeline-success-foreground: var(--foreground);
8
8
  --cui-timeline-error-foreground: var(--destructive-text);
9
9
  --cui-timeline-separator-background: var(--border);
10
+ --cui-timeline-separator-inline-size: 1px;
10
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);
11
14
  }
12
15
  :where([data-control-family="timeline"][data-slot="item"]) {
13
16
  column-gap: calc(var(--spacing) * 3);
14
- padding-block-end: calc(var(--spacing) * 5);
17
+ padding-block-end: var(--cui-timeline-item-padding-block);
15
18
  }
16
19
 
17
20
  :where([data-control-family="timeline"][data-slot="item"]:last-child) {
@@ -52,13 +55,15 @@
52
55
  }
53
56
 
54
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);
55
60
  background: var(--cui-timeline-separator-background);
56
61
  }
57
62
 
58
63
  :where([data-control-family="timeline"][data-slot="title"]) {
59
64
  color: var(--cui-timeline-title-foreground);
60
65
  font-size: var(--text-label);
61
- font-weight: var(--font-weight-medium);
66
+ font-weight: var(--cui-timeline-title-font-weight);
62
67
  line-height: calc(var(--spacing) * 5);
63
68
  text-wrap: balance;
64
69
  }
@@ -118,3 +123,21 @@
118
123
  inherits: true;
119
124
  initial-value: transparent;
120
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
+ }
@@ -10,6 +10,8 @@
10
10
  --cui-tree-item-trigger-font-size: var(--text-body);
11
11
  --cui-tree-item-trigger-selected-font-weight: var(--font-weight-normal);
12
12
  --cui-tree-indent-inset: 1.25rem;
13
+ --cui-tree-guide-background: transparent;
14
+ --cui-tree-guide-inline-size: 1px;
13
15
  }
14
16
 
15
17
  :where([data-control-family="tree"][data-slot="list"]) {
@@ -119,10 +121,29 @@
119
121
  }
120
122
 
121
123
  :where([data-control-family="tree"][data-slot="item-group"]) {
124
+ position: relative;
122
125
  translate: 0 0;
123
126
  transition: translate var(--duration-base) var(--ease-emphasized);
124
127
  }
125
128
 
129
+ :where([data-control-family="tree"][data-slot="item-group"])::before {
130
+ content: "";
131
+ position: absolute;
132
+ inset-block: 0;
133
+ inset-inline-start: calc(
134
+ var(--_tree-level, 1) *
135
+ var(--cui-tree-indent-inset) +
136
+ var(--spacing) *
137
+ 2 -
138
+ var(--cui-tree-guide-inline-size) /
139
+ 2
140
+ );
141
+ inline-size: var(--cui-tree-guide-inline-size);
142
+ border-radius: var(--cui-tree-guide-inline-size);
143
+ background-color: var(--cui-tree-guide-background);
144
+ pointer-events: none;
145
+ }
146
+
126
147
  :where([data-control-family="tree"][data-slot="item-content"]:is([data-starting-style], [data-ending-style]) > [data-slot="item-group"]) {
127
148
  translate: 0 calc(var(--spacing) * -1);
128
149
  }
@@ -187,3 +208,15 @@
187
208
  inherits: true;
188
209
  initial-value: transparent;
189
210
  }
211
+
212
+ @property --cui-tree-guide-background {
213
+ syntax: "<color>";
214
+ inherits: true;
215
+ initial-value: transparent;
216
+ }
217
+
218
+ @property --cui-tree-guide-inline-size {
219
+ syntax: "<length-percentage>";
220
+ inherits: true;
221
+ initial-value: 0px;
222
+ }
@@ -242,10 +242,15 @@
242
242
  --font-body: var(--font-sans);
243
243
  --font-display: var(--font-sans);
244
244
  --text-micro: 0.625rem;
245
+ --text-micro--line-height: 1.5;
245
246
  --text-caption: 0.6875rem;
247
+ --text-caption--line-height: 1.5;
246
248
  --text-label: 0.75rem;
249
+ --text-label--line-height: 1.5;
247
250
  --text-body: 0.875rem;
251
+ --text-body--line-height: 1.5;
248
252
  --text-body-lg: 1rem;
253
+ --text-body-lg--line-height: 1.5;
249
254
  --text-heading-4: 0.9375rem;
250
255
  --text-heading-4--line-height: 1.4;
251
256
  --text-heading-4--font-weight: 600;
@@ -421,7 +426,7 @@
421
426
  /* biome-ignore-end lint/complexity/noImportantStyles: Reduced motion must override skin and inline motion. */
422
427
 
423
428
  @theme static {
424
- --breakpoint-lg: 64rem;
429
+ --breakpoint-sidebar: 64rem;
425
430
  }
426
431
 
427
432
  @theme inline {
@@ -485,10 +490,15 @@
485
490
  --spacing-control-lg: var(--control-h-lg);
486
491
 
487
492
  --text-micro: var(--text-micro);
493
+ --text-micro--line-height: var(--text-micro--line-height);
488
494
  --text-caption: var(--text-caption);
495
+ --text-caption--line-height: var(--text-caption--line-height);
489
496
  --text-label: var(--text-label);
497
+ --text-label--line-height: var(--text-label--line-height);
490
498
  --text-body: var(--text-body);
499
+ --text-body--line-height: var(--text-body--line-height);
491
500
  --text-body-lg: var(--text-body-lg);
501
+ --text-body-lg--line-height: var(--text-body-lg--line-height);
492
502
  --text-heading-4: var(--text-heading-4);
493
503
  --text-heading-4--line-height: var(--text-heading-4--line-height);
494
504
  --text-heading-4--font-weight: var(--text-heading-4--font-weight);
@@ -1,5 +1,7 @@
1
1
  //#region src/surface-variants.d.ts
2
2
  export declare const popupItemStructureClasses = "flex select-none items-center";
3
+ export declare const popupItemTones: readonly ["neutral", "danger"];
4
+ export type PopupItemTone = (typeof popupItemTones)[number];
3
5
  export declare const popupParts: readonly ["backdrop", "surface", "list-surface", "list-content", "bar", "item", "navigation-link", "label", "separator", "shortcut"];
4
6
  export type PopupPart = (typeof popupParts)[number];
5
7
  //#endregion