@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
@@ -1,8 +1,9 @@
1
1
  @layer components {
2
2
  :where([data-control-family="choice"][data-choice-kind="checkbox"][data-slot="root"]),
3
3
  :where([data-control-family="choice"][data-choice-kind="radio-group"][data-slot="item"]) {
4
- inline-size: calc(var(--spacing) * 4);
5
- block-size: calc(var(--spacing) * 4);
4
+ --cui-choice-size: calc(var(--spacing) * 4);
5
+ inline-size: var(--cui-choice-size);
6
+ block-size: var(--cui-choice-size);
6
7
  --cui-choice-radius: var(--radius-sm);
7
8
  --cui-choice-shadow: inset 0 0 0 var(--cui-choice-border-width) var(--cui-choice-border-color), var(--shadow-sm);
8
9
  --cui-choice-border-color: var(--control-boundary);
@@ -95,6 +96,12 @@
95
96
  }
96
97
  }
97
98
 
99
+ @property --cui-choice-size {
100
+ syntax: "<length-percentage>";
101
+ inherits: true;
102
+ initial-value: 0px;
103
+ }
104
+
98
105
  @property --cui-choice-radius {
99
106
  syntax: "<length-percentage>";
100
107
  inherits: true;
@@ -2,6 +2,7 @@
2
2
  :where([data-control-family="collapsible"][data-slot="root"]) {
3
3
  --cui-collapsible-trigger-radius: var(--radius-control);
4
4
  --cui-collapsible-trigger-hover-background: var(--hover-fill);
5
+ --cui-collapsible-trigger-padding-inline: calc(var(--spacing) * 2);
5
6
  }
6
7
 
7
8
  :where([data-control-family="collapsible"][data-slot="trigger"]) {
@@ -11,7 +12,7 @@
11
12
  align-items: center;
12
13
  gap: calc(var(--spacing) * 2);
13
14
  border-radius: var(--cui-collapsible-trigger-radius);
14
- padding-inline: calc(var(--spacing) * 2);
15
+ padding-inline: var(--cui-collapsible-trigger-padding-inline);
15
16
  color: var(--foreground);
16
17
  font-size: var(--text-label);
17
18
  font-weight: var(--font-weight-medium);
@@ -79,3 +80,9 @@
79
80
  inherits: true;
80
81
  initial-value: transparent;
81
82
  }
83
+
84
+ @property --cui-collapsible-trigger-padding-inline {
85
+ syntax: "<length-percentage>";
86
+ inherits: true;
87
+ initial-value: 0px;
88
+ }
@@ -1,4 +1,8 @@
1
1
  @layer components {
2
+ :where([data-control-family="color-picker"][data-slot="output"]) {
3
+ gap: calc(var(--spacing) * 2);
4
+ }
5
+
2
6
  :where([data-control-family="color-picker"][data-slot="output-value"]) {
3
7
  font-family: var(--font-mono);
4
8
  font-size: var(--text-caption);
@@ -6,11 +6,19 @@
6
6
  --cui-emoji-picker-active-background: var(--accent);
7
7
  --cui-emoji-picker-header-background: var(--popover);
8
8
  --cui-emoji-picker-header-foreground: var(--muted-foreground);
9
+ --cui-emoji-picker-header-font-size: var(--text-caption);
10
+ --cui-emoji-picker-search-font-size: var(--text-label);
9
11
  --cui-emoji-picker-height: 22rem;
10
12
  --_emoji-picker-recent-block-size: 0px;
13
+ --_emoji-picker-touch-min: 0px;
11
14
  }
12
15
  :where([data-control-family="emoji-picker"][data-slot="root"]:not([data-variant="reactions"])) {
13
- inline-size: calc(var(--_emoji-picker-columns) * var(--cui-emoji-picker-cell-size) + var(--spacing) * 4);
16
+ inline-size: calc(
17
+ var(--_emoji-picker-columns) *
18
+ max(var(--cui-emoji-picker-cell-size), var(--_emoji-picker-touch-min)) +
19
+ var(--spacing) *
20
+ 4
21
+ );
14
22
  max-inline-size: 100%;
15
23
  block-size: var(--cui-emoji-picker-height);
16
24
  color: var(--foreground);
@@ -27,7 +35,8 @@
27
35
  :where([data-control-family="emoji-picker"][data-slot="category"]) {
28
36
  display: grid;
29
37
  place-items: center;
30
- flex: 0 0 calc(var(--spacing) * 9);
38
+ flex: 0 1 calc(var(--spacing) * 9);
39
+ min-inline-size: 0;
31
40
  block-size: calc(var(--spacing) * 9);
32
41
  border-radius: var(--cui-emoji-picker-cell-radius);
33
42
  color: var(--muted-foreground);
@@ -109,7 +118,7 @@
109
118
  background: var(--control-fill);
110
119
  box-shadow: var(--shadow-inset);
111
120
  color: var(--foreground);
112
- font-size: var(--text-label);
121
+ font-size: var(--cui-emoji-picker-search-font-size);
113
122
  --focus-ring-offset: calc(var(--focus-ring-width) * -1);
114
123
  }
115
124
 
@@ -131,7 +140,7 @@
131
140
  padding: calc(var(--spacing) * 1.5) calc(var(--spacing) * 2.5) calc(var(--spacing) * 1);
132
141
  background: var(--cui-emoji-picker-header-background);
133
142
  color: var(--cui-emoji-picker-header-foreground);
134
- font-size: var(--text-caption);
143
+ font-size: var(--cui-emoji-picker-header-font-size);
135
144
  font-weight: var(--font-weight-medium);
136
145
  }
137
146
 
@@ -141,8 +150,8 @@
141
150
  }
142
151
 
143
152
  :where([data-control-family="emoji-picker"][data-slot="emoji"]) {
144
- inline-size: var(--cui-emoji-picker-cell-size);
145
- block-size: var(--cui-emoji-picker-cell-size);
153
+ inline-size: max(var(--cui-emoji-picker-cell-size), var(--_emoji-picker-touch-min));
154
+ block-size: max(var(--cui-emoji-picker-cell-size), var(--_emoji-picker-touch-min));
146
155
  border-radius: var(--cui-emoji-picker-cell-radius);
147
156
  background: transparent;
148
157
  font-size: var(--cui-emoji-picker-glyph-size);
@@ -176,10 +185,10 @@
176
185
 
177
186
  @media (pointer: coarse) {
178
187
  :where([data-control-family="emoji-picker"][data-slot="root"]) {
179
- --cui-emoji-picker-cell-size: 44px;
188
+ --_emoji-picker-touch-min: 44px;
180
189
  }
181
190
  :where([data-control-family="emoji-picker"][data-slot="category"]) {
182
- flex-basis: 44px;
191
+ flex: 0 0 44px;
183
192
  block-size: 44px;
184
193
  }
185
194
  :where([data-control-family="emoji-picker"][data-slot="search-input"]) {
@@ -229,3 +238,15 @@
229
238
  inherits: true;
230
239
  initial-value: transparent;
231
240
  }
241
+
242
+ @property --cui-emoji-picker-header-font-size {
243
+ syntax: "<length-percentage>";
244
+ inherits: true;
245
+ initial-value: 0px;
246
+ }
247
+
248
+ @property --cui-emoji-picker-search-font-size {
249
+ syntax: "<length-percentage>";
250
+ inherits: true;
251
+ initial-value: 0px;
252
+ }
@@ -33,6 +33,11 @@
33
33
  overflow-wrap: anywhere;
34
34
  }
35
35
 
36
+ :where([data-control-family="empty"][data-slot="root"][data-variant="outline"]) {
37
+ --cui-empty-border-color: var(--border);
38
+ --cui-empty-border-style: dashed;
39
+ }
40
+
36
41
  :where([data-control-family="empty"][data-slot="media"]) {
37
42
  inline-size: var(--cui-empty-media-size);
38
43
  block-size: var(--cui-empty-media-size);
@@ -173,8 +173,8 @@
173
173
 
174
174
  :where([data-control-family="field"][data-field-kind="field"][data-slot="label"]) {
175
175
  color: var(--foreground);
176
- font-size: var(--text-label);
177
- font-weight: var(--font-weight-medium);
176
+ font-size: var(--cui-field-label-font-size);
177
+ font-weight: var(--cui-field-label-font-weight);
178
178
  }
179
179
 
180
180
  :where([data-control-family="field"][data-field-kind="field"][data-slot="label"][data-disabled]) {
@@ -183,7 +183,7 @@
183
183
 
184
184
  :where([data-control-family="field"][data-field-kind="field"][data-slot="description"]) {
185
185
  color: var(--muted-foreground);
186
- font-size: var(--text-caption);
186
+ font-size: var(--cui-field-description-font-size);
187
187
  text-wrap: pretty;
188
188
  }
189
189
 
@@ -193,21 +193,96 @@
193
193
  }
194
194
 
195
195
  :where([data-control-family="field"][data-field-kind="field"][data-slot="separator"]) {
196
+ block-size: 1px;
196
197
  font-size: var(--text-caption);
197
198
  }
198
199
 
199
200
  :where([data-control-family="field"][data-field-kind="field"][data-slot="separator-content"]) {
201
+ margin-inline: auto;
202
+ padding-inline: calc(var(--spacing) * 2);
200
203
  background-color: var(--background);
201
204
  color: var(--muted-foreground);
202
205
  }
203
206
 
204
207
  :where([data-control-family="field"][data-field-kind="field"][data-slot="set"]) {
208
+ gap: calc(var(--spacing) * 4);
205
209
  border-width: 0px;
206
210
  }
207
211
 
212
+ :where([data-control-family="field"][data-field-kind="field"]) {
213
+ --cui-field-legend-font-size: var(--text-label);
214
+ --cui-field-legend-font-weight: var(--font-weight-semibold);
215
+ }
216
+
208
217
  :where([data-control-family="field"][data-field-kind="field"][data-slot="legend"]) {
209
218
  color: var(--foreground);
210
- font-size: var(--text-label);
211
- font-weight: var(--font-weight-semibold);
219
+ font-size: var(--cui-field-legend-font-size);
220
+ font-weight: var(--cui-field-legend-font-weight);
221
+ }
222
+
223
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="legend"][data-variant="section"]) {
224
+ --cui-field-legend-font-size: var(--text-body);
225
+ }
226
+
227
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="root"]) {
228
+ gap: calc(var(--spacing) * 1.5) calc(var(--spacing) * 3);
229
+ }
230
+
231
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="content"]) {
232
+ gap: calc(var(--spacing) * 1);
233
+ }
234
+
235
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="group"]),
236
+ :where([data-control-family="field"][data-field-kind="form"][data-slot="root"]) {
237
+ gap: calc(var(--spacing) * 5);
212
238
  }
239
+
240
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="group"][data-variant="card"]) {
241
+ gap: 0;
242
+ overflow: hidden;
243
+ border: var(--cui-field-group-border-width) solid var(--cui-field-group-border-color);
244
+ border-radius: var(--cui-field-group-radius);
245
+ background: var(--cui-field-group-background);
246
+ box-shadow: var(--cui-field-group-shadow);
247
+ --_field-group-padding-block: var(--cui-field-group-padding-block);
248
+ --_field-group-padding-inline: var(--cui-field-group-padding-inline);
249
+ --_field-group-separator-color: var(--cui-field-group-separator-color);
250
+ --_field-group-separator-inset: var(--cui-field-group-separator-inset);
251
+ }
252
+
253
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="group"][data-variant="card"] > *) {
254
+ position: relative;
255
+ padding-block: var(--_field-group-padding-block);
256
+ padding-inline: var(--_field-group-padding-inline);
257
+ }
258
+
259
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="group"][data-variant="card"] > * + *)::before {
260
+ content: "";
261
+ position: absolute;
262
+ inset-block-start: 0;
263
+ inset-inline: var(--_field-group-separator-inset);
264
+ block-size: 1px;
265
+ background: var(--_field-group-separator-color);
266
+ }
267
+
268
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="item"]) {
269
+ gap: calc(var(--spacing) * 2);
270
+ }
271
+
272
+ :where([data-control-family="field"][data-field-kind="field"][data-slot="separator"][data-content]) {
273
+ margin-block: calc(var(--spacing) * 2);
274
+ block-size: calc(var(--spacing) * 5);
275
+ }
276
+ }
277
+
278
+ @property --cui-field-legend-font-size {
279
+ syntax: "<length-percentage>";
280
+ inherits: true;
281
+ initial-value: 0px;
282
+ }
283
+
284
+ @property --cui-field-legend-font-weight {
285
+ syntax: "<number>";
286
+ inherits: true;
287
+ initial-value: 400;
213
288
  }
@@ -17,11 +17,15 @@
17
17
  --cui-field-height: var(--control-h-md);
18
18
  --cui-field-padding-inline: var(--padding-x);
19
19
  --cui-field-font-size: var(--text-body);
20
+ --cui-field-font-weight: 400;
21
+ --cui-field-font-family: var(--font-body);
20
22
  border: var(--cui-field-border-width) solid var(--cui-field-border-color);
21
23
  border-radius: var(--cui-field-radius);
22
24
  background: var(--cui-field-background);
23
25
  box-shadow: var(--cui-field-shadow);
24
26
  color: var(--cui-field-foreground);
27
+ font-family: var(--cui-field-font-family);
28
+ font-weight: var(--cui-field-font-weight);
25
29
  backdrop-filter: var(--cui-field-backdrop-filter);
26
30
  }
27
31
 
@@ -128,24 +132,28 @@
128
132
  }
129
133
  :where([data-control-family="field"][data-field-kind="select"][data-slot="trigger"]) {
130
134
  cursor: pointer;
131
- font-weight: var(--font-weight-medium);
135
+ --cui-field-font-weight: var(--font-weight-medium);
136
+ font-weight: var(--cui-field-font-weight);
132
137
  }
133
138
 
134
139
  :where([data-control-family="field"][data-field-kind="input-otp"][data-slot="slot"]) {
135
140
  text-align: center;
136
141
  font-size: var(--text-body);
137
- font-weight: var(--font-weight-medium);
142
+ --cui-field-font-weight: var(--font-weight-medium);
143
+ font-weight: var(--cui-field-font-weight);
138
144
  font-variant-numeric: tabular-nums;
139
145
  }
140
146
 
141
147
  :where([data-control-family="field"][data-field-kind="combobox"][data-slot="input"]) {
142
148
  padding-inline-end: calc(var(--spacing) * 9);
143
- font-weight: var(--font-weight-medium);
149
+ --cui-field-font-weight: var(--font-weight-medium);
150
+ font-weight: var(--cui-field-font-weight);
144
151
  }
145
152
 
146
153
  :where([data-control-family="field"][data-field-kind="native-select"][data-slot="root"]) {
147
154
  padding-inline-end: calc(var(--padding-x) * 1.4);
148
- font-weight: var(--font-weight-medium);
155
+ --cui-field-font-weight: var(--font-weight-medium);
156
+ font-weight: var(--cui-field-font-weight);
149
157
  appearance: none;
150
158
  }
151
159
 
@@ -172,13 +180,15 @@
172
180
  :where([data-control-family="field"][data-field-kind="number-field"][data-slot="input"]) {
173
181
  padding-inline: calc(var(--spacing) * 2);
174
182
  text-align: center;
175
- font-weight: var(--font-weight-medium);
183
+ --cui-field-font-weight: var(--font-weight-medium);
184
+ font-weight: var(--cui-field-font-weight);
176
185
  font-variant-numeric: tabular-nums;
177
186
  }
178
187
 
179
188
  :where([data-control-family="field"][data-field-kind="number-field"][data-slot="group"]) {
180
189
  padding-inline: 0;
181
- font-weight: var(--font-weight-medium);
190
+ --cui-field-font-weight: var(--font-weight-medium);
191
+ font-weight: var(--cui-field-font-weight);
182
192
  }
183
193
 
184
194
  :where([data-control-family="field"][data-field-kind="textarea"][data-slot="root"]) {
@@ -190,42 +200,23 @@
190
200
 
191
201
  :where([data-control-family="field"][data-field-kind="autocomplete"][data-slot="input"]) {
192
202
  padding-inline-end: calc(var(--spacing) * 9);
193
- font-weight: var(--font-weight-medium);
203
+ --cui-field-font-weight: var(--font-weight-medium);
204
+ font-weight: var(--cui-field-font-weight);
194
205
  }
195
206
 
196
- :where([data-control-family="field"][data-field-kind="field"][data-slot="root"]) {
197
- gap: calc(var(--spacing) * 1.5) calc(var(--spacing) * 3);
198
- }
199
-
200
- :where([data-control-family="field"][data-field-kind="field"][data-slot="content"]) {
201
- gap: calc(var(--spacing) * 1);
202
- }
203
-
204
- :where([data-control-family="field"][data-field-kind="field"][data-slot="group"]),
205
- :where([data-control-family="field"][data-field-kind="form"][data-slot="root"]) {
206
- gap: calc(var(--spacing) * 5);
207
- }
208
-
209
- :where([data-control-family="field"][data-field-kind="field"][data-slot="item"]) {
210
- gap: calc(var(--spacing) * 2);
211
- }
212
-
213
- :where([data-control-family="field"][data-field-kind="field"][data-slot="set"]) {
214
- gap: calc(var(--spacing) * 4);
215
- }
216
-
217
- :where([data-control-family="field"][data-field-kind="field"][data-slot="separator"]) {
218
- block-size: 1px;
219
- }
220
-
221
- :where([data-control-family="field"][data-field-kind="field"][data-slot="separator"][data-content]) {
222
- margin-block: calc(var(--spacing) * 2);
223
- block-size: calc(var(--spacing) * 5);
224
- }
225
-
226
- :where([data-control-family="field"][data-field-kind="field"][data-slot="separator-content"]) {
227
- margin-inline: auto;
228
- padding-inline: calc(var(--spacing) * 2);
207
+ :where([data-control-family="field"][data-field-kind="field"]) {
208
+ --cui-field-label-font-size: var(--text-label);
209
+ --cui-field-label-font-weight: var(--font-weight-medium);
210
+ --cui-field-description-font-size: var(--text-caption);
211
+ --cui-field-group-radius: var(--radius-lg);
212
+ --cui-field-group-background: var(--card);
213
+ --cui-field-group-border-color: var(--border);
214
+ --cui-field-group-border-width: 1px;
215
+ --cui-field-group-shadow: 0 0 transparent;
216
+ --cui-field-group-padding-block: calc(var(--spacing) * 3);
217
+ --cui-field-group-padding-inline: calc(var(--spacing) * 4);
218
+ --cui-field-group-separator-color: var(--border);
219
+ --cui-field-group-separator-inset: 0px;
229
220
  }
230
221
 
231
222
  @media (pointer: coarse) {
@@ -321,3 +312,85 @@
321
312
  inherits: true;
322
313
  initial-value: 0px;
323
314
  }
315
+
316
+ @property --cui-field-font-weight {
317
+ syntax: "<number>";
318
+ inherits: true;
319
+ initial-value: 400;
320
+ }
321
+
322
+ @property --cui-field-font-family {
323
+ syntax: "*";
324
+ inherits: true;
325
+ }
326
+
327
+ @property --cui-field-group-radius {
328
+ syntax: "<length-percentage>";
329
+ inherits: true;
330
+ initial-value: 0px;
331
+ }
332
+
333
+ @property --cui-field-group-background {
334
+ syntax: "<color>";
335
+ inherits: true;
336
+ initial-value: transparent;
337
+ }
338
+
339
+ @property --cui-field-group-border-color {
340
+ syntax: "<color>";
341
+ inherits: true;
342
+ initial-value: transparent;
343
+ }
344
+
345
+ @property --cui-field-group-border-width {
346
+ syntax: "<length>";
347
+ inherits: true;
348
+ initial-value: 0px;
349
+ }
350
+
351
+ @property --cui-field-group-shadow {
352
+ syntax: "*";
353
+ inherits: true;
354
+ }
355
+
356
+ @property --cui-field-group-padding-block {
357
+ syntax: "<length-percentage>";
358
+ inherits: true;
359
+ initial-value: 0px;
360
+ }
361
+
362
+ @property --cui-field-group-padding-inline {
363
+ syntax: "<length-percentage>";
364
+ inherits: true;
365
+ initial-value: 0px;
366
+ }
367
+
368
+ @property --cui-field-group-separator-color {
369
+ syntax: "<color>";
370
+ inherits: true;
371
+ initial-value: transparent;
372
+ }
373
+
374
+ @property --cui-field-group-separator-inset {
375
+ syntax: "<length-percentage>";
376
+ inherits: true;
377
+ initial-value: 0px;
378
+ }
379
+
380
+ @property --cui-field-label-font-size {
381
+ syntax: "<length-percentage>";
382
+ inherits: true;
383
+ initial-value: 0px;
384
+ }
385
+
386
+ @property --cui-field-label-font-weight {
387
+ syntax: "<number>";
388
+ inherits: true;
389
+ initial-value: 400;
390
+ }
391
+
392
+ @property --cui-field-description-font-size {
393
+ syntax: "<length-percentage>";
394
+ inherits: true;
395
+ initial-value: 0px;
396
+ }
@@ -1,13 +1,18 @@
1
1
  @layer components {
2
2
  :where([data-control-family="item"][data-slot="root"]) {
3
3
  --cui-item-radius: var(--radius-lg);
4
- --cui-item-hover-background: transparent;
4
+ --cui-item-hover-background: var(--hover-fill);
5
+ --cui-item-current-background: var(--active-fill);
5
6
  --cui-item-hover-border-color: var(--_item-border-color);
6
7
  --cui-item-border-width: 0px;
7
8
  --cui-item-active-scale: 0.99;
8
9
  --cui-item-gap: calc(var(--spacing) * 3);
9
10
  --cui-item-padding-block: calc(var(--spacing) * 3);
10
11
  --cui-item-padding-inline: calc(var(--spacing) * 3);
12
+ --cui-item-description-font-size: var(--text-body);
13
+ --cui-item-description-line-height: var(--leading-relaxed);
14
+ --cui-item-description-foreground: var(--muted-foreground);
15
+ --cui-item-media-foreground: var(--muted-foreground);
11
16
  --_item-background: transparent;
12
17
  --_item-border-color: transparent;
13
18
  outline: var(--cui-item-border-width) solid var(--_item-border-color);
@@ -61,6 +66,10 @@
61
66
  --_item-background: oklch(from var(--muted) l c h / 0.5);
62
67
  }
63
68
 
69
+ :where([data-control-family="item"][data-slot="root"][aria-current]:not([aria-current="false"])) {
70
+ --_item-background: var(--cui-item-current-background);
71
+ }
72
+
64
73
  @media (hover: hover) {
65
74
  :where(
66
75
  [data-control-family="item"][data-slot="root"]:is(a, button, [href], [role="button"]):not(
@@ -91,9 +100,9 @@
91
100
  }
92
101
 
93
102
  :where([data-control-family="item"][data-slot="description"]) {
94
- font-size: var(--text-body);
95
- line-height: var(--leading-relaxed);
96
- color: var(--muted-foreground);
103
+ font-size: var(--cui-item-description-font-size);
104
+ line-height: var(--cui-item-description-line-height);
105
+ color: var(--cui-item-description-foreground);
97
106
  text-wrap: pretty;
98
107
  }
99
108
 
@@ -107,7 +116,7 @@
107
116
  }
108
117
 
109
118
  :where([data-control-family="item"][data-slot="media"]) {
110
- color: var(--muted-foreground);
119
+ color: var(--cui-item-media-foreground);
111
120
  }
112
121
  }
113
122
 
@@ -123,6 +132,12 @@
123
132
  initial-value: transparent;
124
133
  }
125
134
 
135
+ @property --cui-item-current-background {
136
+ syntax: "<color>";
137
+ inherits: true;
138
+ initial-value: transparent;
139
+ }
140
+
126
141
  @property --cui-item-hover-border-color {
127
142
  syntax: "<color>";
128
143
  inherits: true;
@@ -158,3 +173,27 @@
158
173
  inherits: true;
159
174
  initial-value: 0px;
160
175
  }
176
+
177
+ @property --cui-item-description-font-size {
178
+ syntax: "<length-percentage>";
179
+ inherits: true;
180
+ initial-value: 0px;
181
+ }
182
+
183
+ @property --cui-item-description-line-height {
184
+ syntax: "<number>";
185
+ inherits: true;
186
+ initial-value: 1.5;
187
+ }
188
+
189
+ @property --cui-item-description-foreground {
190
+ syntax: "<color>";
191
+ inherits: true;
192
+ initial-value: transparent;
193
+ }
194
+
195
+ @property --cui-item-media-foreground {
196
+ syntax: "<color>";
197
+ inherits: true;
198
+ initial-value: transparent;
199
+ }
@@ -3,7 +3,10 @@
3
3
  block-size: calc(var(--spacing) * 5);
4
4
  min-inline-size: calc(var(--spacing) * 5);
5
5
  gap: calc(var(--spacing) * 1);
6
- padding-inline: calc(var(--spacing) * 1.5);
6
+ padding-inline: var(--cui-kbd-padding-inline);
7
+ --cui-kbd-padding-inline: calc(var(--spacing) * 1.5);
8
+ --cui-kbd-font-size: var(--text-micro);
9
+ --cui-kbd-font-weight: var(--font-weight-medium);
7
10
  --cui-kbd-radius: var(--radius-control);
8
11
  --cui-kbd-background: oklch(from var(--card) l c h / 0.6);
9
12
  --cui-kbd-foreground: var(--muted-foreground);
@@ -15,17 +18,16 @@
15
18
  inset 0 0 0 var(--control-rim-width) var(--cui-kbd-border-color),
16
19
  var(--cui-kbd-shadow);
17
20
  color: var(--cui-kbd-foreground);
18
- font-size: var(--text-micro);
21
+ font-size: var(--cui-kbd-font-size);
19
22
  font-family: var(--font-sans);
20
- font-weight: var(--font-weight-medium);
23
+ font-weight: var(--cui-kbd-font-weight);
21
24
  }
22
25
 
23
26
  :where([data-control-family="kbd"][data-slot="root"][data-variant="ghost"]) {
24
27
  min-inline-size: 0;
25
28
  padding-inline: 0;
26
- --cui-kbd-background: transparent;
27
- --cui-kbd-border-color: transparent;
28
- --cui-kbd-shadow: 0 0 transparent;
29
+ background: transparent;
30
+ box-shadow: none;
29
31
  }
30
32
 
31
33
  @media (forced-colors: active) {
@@ -68,3 +70,21 @@
68
70
  syntax: "*";
69
71
  inherits: true;
70
72
  }
73
+
74
+ @property --cui-kbd-padding-inline {
75
+ syntax: "<length-percentage>";
76
+ inherits: true;
77
+ initial-value: 0px;
78
+ }
79
+
80
+ @property --cui-kbd-font-size {
81
+ syntax: "<length-percentage>";
82
+ inherits: true;
83
+ initial-value: 0px;
84
+ }
85
+
86
+ @property --cui-kbd-font-weight {
87
+ syntax: "<number>";
88
+ inherits: true;
89
+ initial-value: 400;
90
+ }
@@ -93,7 +93,7 @@
93
93
  padding-inline-end: calc(var(--_morphing-panel-close-size) + var(--spacing) * 6);
94
94
  }
95
95
 
96
- :where([data-control-family="morphing-panel"][data-slot="body"]) {
96
+ :where([data-control-family="morphing-panel"][data-slot="body"][data-padding="default"]) {
97
97
  padding: calc(var(--spacing) * 4);
98
98
  }
99
99