@womp/kookie-ui 0.25.1 → 0.26.0

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 (151) hide show
  1. package/components.css +229 -528
  2. package/dist/cjs/components/_internal/base-checkbox.props.d.ts +0 -6
  3. package/dist/cjs/components/_internal/base-checkbox.props.d.ts.map +1 -1
  4. package/dist/cjs/components/_internal/base-checkbox.props.js +1 -1
  5. package/dist/cjs/components/_internal/base-checkbox.props.js.map +3 -3
  6. package/dist/cjs/components/_internal/base-radio.props.d.ts +0 -6
  7. package/dist/cjs/components/_internal/base-radio.props.d.ts.map +1 -1
  8. package/dist/cjs/components/_internal/base-radio.props.js +1 -1
  9. package/dist/cjs/components/_internal/base-radio.props.js.map +3 -3
  10. package/dist/cjs/components/checkbox-group.d.ts.map +1 -1
  11. package/dist/cjs/components/checkbox-group.js +1 -1
  12. package/dist/cjs/components/checkbox-group.js.map +3 -3
  13. package/dist/cjs/components/checkbox-group.props.d.ts +0 -6
  14. package/dist/cjs/components/checkbox-group.props.d.ts.map +1 -1
  15. package/dist/cjs/components/checkbox-group.props.js +1 -1
  16. package/dist/cjs/components/checkbox-group.props.js.map +3 -3
  17. package/dist/cjs/components/checkbox.js +1 -1
  18. package/dist/cjs/components/checkbox.js.map +3 -3
  19. package/dist/cjs/components/checkbox.props.js +1 -1
  20. package/dist/cjs/components/checkbox.props.js.map +3 -3
  21. package/dist/cjs/components/index.js +2 -2
  22. package/dist/cjs/components/index.js.map +4 -4
  23. package/dist/cjs/components/radio-group.d.ts.map +1 -1
  24. package/dist/cjs/components/radio-group.js +1 -1
  25. package/dist/cjs/components/radio-group.js.map +4 -4
  26. package/dist/cjs/components/radio-group.props.d.ts +0 -6
  27. package/dist/cjs/components/radio-group.props.d.ts.map +1 -1
  28. package/dist/cjs/components/radio-group.props.js +1 -1
  29. package/dist/cjs/components/radio-group.props.js.map +4 -4
  30. package/dist/cjs/components/radio.js +1 -1
  31. package/dist/cjs/components/radio.js.map +3 -3
  32. package/dist/cjs/components/radio.props.js +1 -1
  33. package/dist/cjs/components/radio.props.js.map +3 -3
  34. package/dist/cjs/components/slider.js +1 -1
  35. package/dist/cjs/components/slider.js.map +3 -3
  36. package/dist/cjs/components/slider.props.d.ts +0 -6
  37. package/dist/cjs/components/slider.props.d.ts.map +1 -1
  38. package/dist/cjs/components/slider.props.js +1 -1
  39. package/dist/cjs/components/slider.props.js.map +3 -3
  40. package/dist/cjs/components/switch.js +1 -1
  41. package/dist/cjs/components/switch.js.map +3 -3
  42. package/dist/cjs/components/switch.props.d.ts +0 -6
  43. package/dist/cjs/components/switch.props.d.ts.map +1 -1
  44. package/dist/cjs/components/switch.props.js +1 -1
  45. package/dist/cjs/components/switch.props.js.map +3 -3
  46. package/dist/cjs/index.js +4 -4
  47. package/dist/cjs/index.js.map +4 -4
  48. package/dist/esm/chunk-37GC4A2O.js +3 -0
  49. package/dist/esm/chunk-37GC4A2O.js.map +7 -0
  50. package/dist/esm/chunk-4S5L25RO.js +3 -0
  51. package/dist/esm/chunk-4S5L25RO.js.map +7 -0
  52. package/dist/esm/chunk-6BB2A6VU.js +3 -0
  53. package/dist/esm/chunk-6BB2A6VU.js.map +7 -0
  54. package/dist/esm/chunk-CBWERXF4.js +3 -0
  55. package/dist/esm/chunk-CBWERXF4.js.map +7 -0
  56. package/dist/esm/{chunk-XPVRXQSW.js → chunk-FCKJD2PW.js} +2 -2
  57. package/dist/esm/chunk-HV7USGHD.js +3 -0
  58. package/dist/esm/chunk-HV7USGHD.js.map +7 -0
  59. package/dist/esm/chunk-IE5ACUZS.js +3 -0
  60. package/dist/esm/{chunk-ZDSY6CJL.js → chunk-JS23YQ4M.js} +2 -2
  61. package/dist/esm/chunk-M3NI3D6R.js +3 -0
  62. package/dist/esm/chunk-M3NI3D6R.js.map +7 -0
  63. package/dist/esm/{chunk-PZZJH2LR.js → chunk-NZCAGHCL.js} +2 -2
  64. package/dist/esm/chunk-R7THBMND.js +3 -0
  65. package/dist/esm/chunk-R7THBMND.js.map +7 -0
  66. package/dist/esm/{chunk-3CY6H4TE.js → chunk-YDBFIJHB.js} +2 -2
  67. package/dist/esm/components/_internal/base-checkbox.props.d.ts +0 -6
  68. package/dist/esm/components/_internal/base-checkbox.props.d.ts.map +1 -1
  69. package/dist/esm/components/_internal/base-checkbox.props.js +1 -1
  70. package/dist/esm/components/_internal/base-radio.props.d.ts +0 -6
  71. package/dist/esm/components/_internal/base-radio.props.d.ts.map +1 -1
  72. package/dist/esm/components/_internal/base-radio.props.js +1 -1
  73. package/dist/esm/components/checkbox-group.d.ts.map +1 -1
  74. package/dist/esm/components/checkbox-group.js +1 -1
  75. package/dist/esm/components/checkbox-group.props.d.ts +0 -6
  76. package/dist/esm/components/checkbox-group.props.d.ts.map +1 -1
  77. package/dist/esm/components/checkbox-group.props.js +1 -1
  78. package/dist/esm/components/checkbox.js +1 -1
  79. package/dist/esm/components/checkbox.props.js +1 -1
  80. package/dist/esm/components/index.js +1 -1
  81. package/dist/esm/components/radio-group.d.ts.map +1 -1
  82. package/dist/esm/components/radio-group.js +1 -1
  83. package/dist/esm/components/radio-group.props.d.ts +0 -6
  84. package/dist/esm/components/radio-group.props.d.ts.map +1 -1
  85. package/dist/esm/components/radio-group.props.js +1 -1
  86. package/dist/esm/components/radio.js +1 -1
  87. package/dist/esm/components/radio.props.js +1 -1
  88. package/dist/esm/components/slider.js +1 -1
  89. package/dist/esm/components/slider.props.d.ts +0 -6
  90. package/dist/esm/components/slider.props.d.ts.map +1 -1
  91. package/dist/esm/components/slider.props.js +1 -1
  92. package/dist/esm/components/switch.js +1 -1
  93. package/dist/esm/components/switch.props.d.ts +0 -6
  94. package/dist/esm/components/switch.props.d.ts.map +1 -1
  95. package/dist/esm/components/switch.props.js +1 -1
  96. package/dist/esm/index.js +1 -1
  97. package/package.json +1 -1
  98. package/src/components/_internal/base-button.css +11 -5
  99. package/src/components/_internal/base-card.css +2 -2
  100. package/src/components/_internal/base-checkbox.css +39 -199
  101. package/src/components/_internal/base-checkbox.props.ts +0 -3
  102. package/src/components/_internal/base-dialog.css +1 -1
  103. package/src/components/_internal/base-menu.css +3 -2
  104. package/src/components/_internal/base-radio.css +38 -173
  105. package/src/components/_internal/base-radio.props.ts +0 -3
  106. package/src/components/accordion.css +2 -2
  107. package/src/components/avatar.css +2 -2
  108. package/src/components/chatbar.css +3 -4
  109. package/src/components/checkbox-group.css +1 -1
  110. package/src/components/checkbox-group.tsx +0 -2
  111. package/src/components/checkbox.css +1 -1
  112. package/src/components/chip.css +1 -1
  113. package/src/components/popover.css +1 -1
  114. package/src/components/radio-group.props.tsx +0 -5
  115. package/src/components/radio-group.tsx +0 -2
  116. package/src/components/segmented-control.css +4 -1
  117. package/src/components/select.css +14 -31
  118. package/src/components/shell.css +23 -18
  119. package/src/components/sidebar.css +20 -0
  120. package/src/components/slider.css +9 -40
  121. package/src/components/slider.props.tsx +0 -3
  122. package/src/components/switch.css +11 -52
  123. package/src/components/switch.props.tsx +0 -3
  124. package/src/components/text-area.css +16 -31
  125. package/src/components/text-field.css +16 -32
  126. package/src/components/toolbar.css +1 -1
  127. package/src/styles/tokens/color.css +31 -2
  128. package/src/styles/tokens/shadow.css +50 -122
  129. package/styles.css +274 -562
  130. package/tokens/base.css +45 -34
  131. package/tokens.css +45 -34
  132. package/dist/esm/chunk-2Z2I27ZS.js +0 -3
  133. package/dist/esm/chunk-2Z2I27ZS.js.map +0 -7
  134. package/dist/esm/chunk-AZHSPPBV.js +0 -3
  135. package/dist/esm/chunk-AZHSPPBV.js.map +0 -7
  136. package/dist/esm/chunk-BMKUGZ4I.js +0 -3
  137. package/dist/esm/chunk-FFJE25TJ.js +0 -3
  138. package/dist/esm/chunk-FFJE25TJ.js.map +0 -7
  139. package/dist/esm/chunk-FM3GBCX5.js +0 -3
  140. package/dist/esm/chunk-FM3GBCX5.js.map +0 -7
  141. package/dist/esm/chunk-N5H7C3PZ.js +0 -3
  142. package/dist/esm/chunk-N5H7C3PZ.js.map +0 -7
  143. package/dist/esm/chunk-RB5VHWAW.js +0 -3
  144. package/dist/esm/chunk-RB5VHWAW.js.map +0 -7
  145. package/dist/esm/chunk-ZFDHZEWN.js +0 -3
  146. package/dist/esm/chunk-ZFDHZEWN.js.map +0 -7
  147. /package/dist/esm/{chunk-XPVRXQSW.js.map → chunk-FCKJD2PW.js.map} +0 -0
  148. /package/dist/esm/{chunk-BMKUGZ4I.js.map → chunk-IE5ACUZS.js.map} +0 -0
  149. /package/dist/esm/{chunk-ZDSY6CJL.js.map → chunk-JS23YQ4M.js.map} +0 -0
  150. /package/dist/esm/{chunk-PZZJH2LR.js.map → chunk-NZCAGHCL.js.map} +0 -0
  151. /package/dist/esm/{chunk-3CY6H4TE.js.map → chunk-YDBFIJHB.js.map} +0 -0
@@ -30,7 +30,7 @@
30
30
 
31
31
  :where(.kui-AccordionRoot:where(.kui-variant-raised)) {
32
32
  background-color: var(--color-surface);
33
- box-shadow: var(--shadow-2);
33
+ box-shadow: var(--surface-chrome);
34
34
  }
35
35
 
36
36
  :where(.kui-AccordionRoot:where(.kui-variant-soft)) {
@@ -158,7 +158,7 @@
158
158
  @media (hover: hover) {
159
159
  :where(.kui-AccordionRoot:where(.kui-variant-raised):hover) {
160
160
  background-color: var(--accent-2);
161
- box-shadow: var(--shadow-2);
161
+ box-shadow: var(--surface-chrome);
162
162
  }
163
163
  }
164
164
 
@@ -389,7 +389,7 @@
389
389
  top: 0;
390
390
  color: var(--accent-ink);
391
391
  background-color: var(--color-surface);
392
- box-shadow: var(--shadow-2);
392
+ box-shadow: var(--control-chrome);
393
393
  }
394
394
 
395
395
  &:where([data-disabled]) :where(.kui-AvatarFallback) {
@@ -405,7 +405,7 @@
405
405
  @media (hover: hover) {
406
406
  &:where(:hover:not(:disabled, [data-disabled])) {
407
407
  background-color: var(--neutral-2);
408
- box-shadow: var(--shadow-2);
408
+ box-shadow: var(--control-chrome);
409
409
 
410
410
  & :where(.kui-AvatarFallback) {
411
411
  background-color: inherit;
@@ -387,26 +387,25 @@
387
387
  * *
388
388
  ***************************************************************************************************/
389
389
 
390
- /* Raised variant - uses --color-surface and shadow */
390
+ /* Raised variant: a surface, as v2's composer is. It casts the surface role. */
391
391
  .kui-ChatbarBox:where(.kui-variant-raised) {
392
392
  --text-area-border-width: 0px;
393
393
  --v-selection-color: var(--focus-a5);
394
394
  --v-focus-color: var(--focus-8);
395
395
 
396
396
  background-color: var(--color-surface);
397
- box-shadow: var(--shadow-2);
397
+ box-shadow: var(--surface-chrome);
398
398
 
399
399
  /* Hover effects */
400
400
  @media (hover: hover) {
401
401
  &:where(:hover:not(:focus-within)):where(:not(.kui-ChatbarRoot:is([data-disabled], [data-readonly]) *)) {
402
402
  background-color: var(--accent-2);
403
- box-shadow: var(--shadow-3);
404
403
  }
405
404
  }
406
405
 
407
406
  /* Focus state - accent ring */
408
407
  &:where(:focus-within) {
409
- box-shadow: var(--shadow-2), 0 0 0 2px var(--v-focus-color, var(--focus-8));
408
+ box-shadow: var(--surface-chrome), 0 0 0 2px var(--v-focus-color, var(--focus-8));
410
409
  }
411
410
  }
412
411
 
@@ -12,7 +12,7 @@
12
12
  width: fit-content;
13
13
  }
14
14
 
15
- /* The disabled cursor and colours live in the base mark, per variant. */
15
+ /* The disabled cursor and colours live in the base mark. */
16
16
  .kui-CheckboxGroupItemCheckbox {
17
17
  &:where(:focus-visible)::before {
18
18
  outline: var(--focus-ring-width, 2px) solid var(--focus-8);
@@ -41,7 +41,6 @@ const CheckboxGroupRoot = React.forwardRef<CheckboxGroupRootElement, CheckboxGro
41
41
  {
42
42
  color = checkboxGroupRootPropDefs.color.default,
43
43
  size: sizeProp,
44
- variant = checkboxGroupRootPropDefs.variant.default,
45
44
  ...props
46
45
  }: ScopedProps<CheckboxGroupRootProps>,
47
46
  forwardedRef,
@@ -54,7 +53,6 @@ const CheckboxGroupRoot = React.forwardRef<CheckboxGroupRootElement, CheckboxGro
54
53
  scope={__scopeCheckboxGroup}
55
54
  color={color}
56
55
  size={size}
57
- variant={variant}
58
56
  >
59
57
  <CheckboxGroupPrimitive.Root
60
58
  {...checkboxGroupScope}
@@ -1,6 +1,6 @@
1
1
  @import './_internal/base-checkbox.css';
2
2
 
3
- /* The disabled cursor and colours live in the base mark, per variant. */
3
+ /* The disabled cursor and colours live in the base mark. */
4
4
  .kui-CheckboxRoot {
5
5
  &:where(:focus-visible)::before {
6
6
  outline: var(--focus-ring-width, 2px) solid var(--focus-8);
@@ -150,7 +150,7 @@
150
150
  position: relative;
151
151
  top: var(--raised-elevation-offset);
152
152
  color: var(--accent-ink);
153
- box-shadow: var(--shadow-2);
153
+ box-shadow: var(--control-chrome);
154
154
 
155
155
  --raised-surface: var(--color-surface);
156
156
  background-color: var(--raised-surface);
@@ -1,6 +1,6 @@
1
1
  .kui-PopoverContent {
2
2
  background-color: var(--color-surface);
3
- box-shadow: var(--shadow-5);
3
+ box-shadow: var(--floating-chrome);
4
4
  min-width: var(--radix-popover-trigger-width);
5
5
  outline: 0;
6
6
  overflow: auto;
@@ -1,21 +1,16 @@
1
- import { baseRadioPropDefs } from './_internal/base-radio.props.js';
2
1
  import { asChildPropDef } from '../props/as-child.prop.js';
3
2
  import { colorPropDef } from '../props/color.prop.js';
4
3
 
5
4
  import type { PropDef } from '../props/prop-def.js';
6
5
 
7
6
  const sizes = ['1', '2', '3', '4'] as const;
8
- // The same list as Radio: a group offers exactly what its items can draw.
9
- const variants = baseRadioPropDefs.variant.values;
10
7
 
11
8
  const radioGroupRootPropDefs = {
12
9
  ...asChildPropDef,
13
10
  size: { type: 'enum', className: 'kui-r-size', values: sizes, default: '2', responsive: true },
14
- variant: { type: 'enum', className: 'kui-variant', values: variants, default: 'raised' },
15
11
  ...colorPropDef,
16
12
  } satisfies {
17
13
  size: PropDef<(typeof sizes)[number]>;
18
- variant: PropDef<(typeof variants)[number]>;
19
14
  };
20
15
 
21
16
  export { radioGroupRootPropDefs };
@@ -39,7 +39,6 @@ const RadioGroupRoot = React.forwardRef<RadioGroupRootElement, RadioGroupRootPro
39
39
  {
40
40
  color = radioGroupRootPropDefs.color.default,
41
41
  size: sizeProp,
42
- variant = radioGroupRootPropDefs.variant.default,
43
42
  ...props
44
43
  }: ScopedProps<RadioGroupRootProps>,
45
44
  forwardedRef
@@ -52,7 +51,6 @@ const RadioGroupRoot = React.forwardRef<RadioGroupRootElement, RadioGroupRootPro
52
51
  scope={__scopeRadioGroup}
53
52
  color={color}
54
53
  size={size}
55
- variant={variant}
56
54
  >
57
55
  <RadioGroupPrimitive.Root
58
56
  {...radioGroupScope}
@@ -171,7 +171,7 @@
171
171
  position: absolute;
172
172
  border-radius: max(calc(var(--border-width-standard) * 0.5), calc(var(--segmented-control-border-radius) - var(--border-width-standard)));
173
173
  background-color: var(--segmented-control-indicator-background-color);
174
- box-shadow: var(--shadow-2);
174
+ box-shadow: var(--control-chrome);
175
175
  content: '';
176
176
  }
177
177
 
@@ -472,7 +472,10 @@
472
472
  .kui-SegmentedControlIndicator::before {
473
473
  background-color: Highlight;
474
474
  }
475
+ /* The browser paints a Canvas backplate behind forced text, which covered the chosen label
476
+ * with a white box. The chosen segment opts out and paints its own system pair. */
475
477
  .kui-SegmentedControlItem:where([data-state='on']) {
478
+ forced-color-adjust: none;
476
479
  color: HighlightText;
477
480
  }
478
481
  .kui-SegmentedControlRoot:where([data-disabled]),
@@ -53,7 +53,7 @@
53
53
  overflow: hidden;
54
54
  z-index: 200; /* Above dialogs (100) so select inside dialogs/sheets work */
55
55
  background-color: var(--color-surface);
56
- box-shadow: var(--shadow-5);
56
+ box-shadow: var(--floating-chrome);
57
57
 
58
58
  &:where([data-side]) {
59
59
  min-width: var(--radix-select-trigger-width);
@@ -194,14 +194,13 @@
194
194
  * *
195
195
  ***************************************************************************************************/
196
196
 
197
- /* raised */
197
+ /* raised: the default. A field, as in v2: a flat soft fill with a faint edge, no shadow. */
198
198
 
199
199
  .kui-SelectTrigger:where(.kui-variant-raised) {
200
200
  position: relative;
201
- top: var(--raised-elevation-offset);
202
201
  color: var(--accent-ink);
203
- background-color: var(--color-surface);
204
- box-shadow: var(--shadow-2);
202
+ background-color: var(--field-fill);
203
+ box-shadow: var(--control-chrome);
205
204
 
206
205
  &:where(:focus-visible) {
207
206
  outline: 2px solid var(--focus-8);
@@ -210,26 +209,21 @@
210
209
 
211
210
  @media (hover: hover) {
212
211
  &:where(:hover:not(:disabled)) {
213
- background-color: var(--accent-2);
214
- box-shadow: var(--shadow-2);
212
+ background-color: var(--field-fill-hover);
215
213
  }
216
214
  }
217
215
 
218
- &:where([data-state='open']) {
219
- background-color: var(--accent-3);
220
- }
221
-
216
+ &:where([data-state='open']),
222
217
  &:where(:active:not([data-state='open'], [data-disabled])) {
223
- background-color: var(--accent-3);
218
+ background-color: var(--neutral-5);
224
219
  }
225
220
 
226
221
  &:where(:disabled) {
227
222
  color: var(--neutral-a8);
228
- background-color: var(--neutral-a3);
229
- box-shadow: none;
223
+ background-color: var(--field-fill-disabled);
224
+ box-shadow: inset 0 0 0 1px var(--field-edge-disabled);
230
225
  outline: none;
231
226
  cursor: default;
232
- top: 0;
233
227
  }
234
228
 
235
229
  &:where([data-placeholder]) {
@@ -423,27 +417,16 @@
423
417
  * Only the border and the focus ring move; the fill stays the variant's.
424
418
  */
425
419
  .kui-SelectTrigger:where([aria-invalid='true']) {
426
- &:where(:not(.kui-variant-raised)) {
427
- box-shadow: inset 0 0 0 1px var(--red-6);
420
+ box-shadow: inset 0 0 0 1px var(--red-6);
428
421
 
429
- @media (hover: hover) {
430
- &:where(:hover:not(:disabled)) {
431
- box-shadow: inset 0 0 0 1px var(--red-7);
432
- }
433
- }
434
- &:where([data-state='open'], :active) {
422
+ @media (hover: hover) {
423
+ &:where(:hover:not(:disabled)) {
435
424
  box-shadow: inset 0 0 0 1px var(--red-7);
436
425
  }
437
426
  }
438
427
 
439
- &:where(.kui-variant-raised) {
440
- box-shadow: var(--shadow-2), inset 0 0 0 1px var(--red-6);
441
-
442
- @media (hover: hover) {
443
- &:where(:hover:not(:disabled)) {
444
- box-shadow: var(--shadow-2), inset 0 0 0 1px var(--red-7);
445
- }
446
- }
428
+ &:where([data-state='open'], :active) {
429
+ box-shadow: inset 0 0 0 1px var(--red-7);
447
430
  }
448
431
 
449
432
  &:where(:focus-visible) {
@@ -249,13 +249,18 @@
249
249
  z-index: 1;
250
250
  pointer-events: none;
251
251
 
252
- & > :where(*),
253
- & > :where(.kui-Toolbar) > :where(*) {
252
+ & > :where(*) {
254
253
  pointer-events: auto;
255
254
  }
255
+ /* A Toolbar spans the row, and so may a cluster inside it. pointer-events inherits, so the
256
+ Toolbar passes clicks through and only its controls and groups take them back: the empty
257
+ stretch between them lets clicks reach the content. */
256
258
  & > :where(.kui-Toolbar) {
257
259
  pointer-events: none;
258
260
  }
261
+ & > :where(.kui-Toolbar) :where(.kui-ToolbarGroup, .kui-BaseButton, .kui-TextFieldRoot, .kui-SelectTrigger, .kui-SegmentedControlRoot, [href], [tabindex]) {
262
+ pointer-events: auto;
263
+ }
259
264
  }
260
265
  .kui-ShellPaneHeader[data-float] {
261
266
  top: 0;
@@ -460,7 +465,7 @@
460
465
  --kui-shell-row: 1 / -1;
461
466
  --kui-shell-col: 1 / -1;
462
467
  --kui-shell-surface: var(--color-surface);
463
- --kui-shell-shadow: var(--shadow-5);
468
+ --kui-shell-shadow: var(--dialog-chrome);
464
469
  --kui-shell-edge: 1px;
465
470
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
466
471
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -474,7 +479,7 @@
474
479
  --kui-shell-row: 2 / 3;
475
480
  --kui-shell-col: 1 / -1;
476
481
  --kui-shell-surface: var(--color-surface);
477
- --kui-shell-shadow: var(--shadow-4);
482
+ --kui-shell-shadow: var(--surface-chrome);
478
483
  --kui-shell-edge: 1px;
479
484
  --kui-shell-cap: initial;
480
485
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -507,7 +512,7 @@
507
512
  --kui-shell-row: 1 / -1;
508
513
  --kui-shell-col: 1 / -1;
509
514
  --kui-shell-surface: var(--color-surface);
510
- --kui-shell-shadow: var(--shadow-5);
515
+ --kui-shell-shadow: var(--dialog-chrome);
511
516
  --kui-shell-edge: 1px;
512
517
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
513
518
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -521,7 +526,7 @@
521
526
  --kui-shell-row: 2 / 3;
522
527
  --kui-shell-col: 1 / -1;
523
528
  --kui-shell-surface: var(--color-surface);
524
- --kui-shell-shadow: var(--shadow-4);
529
+ --kui-shell-shadow: var(--surface-chrome);
525
530
  --kui-shell-edge: 1px;
526
531
  --kui-shell-cap: initial;
527
532
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -562,7 +567,7 @@
562
567
  --kui-shell-row: 1 / -1;
563
568
  --kui-shell-col: 1 / -1;
564
569
  --kui-shell-surface: var(--color-surface);
565
- --kui-shell-shadow: var(--shadow-5);
570
+ --kui-shell-shadow: var(--dialog-chrome);
566
571
  --kui-shell-edge: 1px;
567
572
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
568
573
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -576,7 +581,7 @@
576
581
  --kui-shell-row: 2 / 3;
577
582
  --kui-shell-col: 1 / -1;
578
583
  --kui-shell-surface: var(--color-surface);
579
- --kui-shell-shadow: var(--shadow-4);
584
+ --kui-shell-shadow: var(--surface-chrome);
580
585
  --kui-shell-edge: 1px;
581
586
  --kui-shell-cap: initial;
582
587
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -618,7 +623,7 @@
618
623
  --kui-shell-row: 1 / -1;
619
624
  --kui-shell-col: 1 / -1;
620
625
  --kui-shell-surface: var(--color-surface);
621
- --kui-shell-shadow: var(--shadow-5);
626
+ --kui-shell-shadow: var(--dialog-chrome);
622
627
  --kui-shell-edge: 1px;
623
628
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
624
629
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -632,7 +637,7 @@
632
637
  --kui-shell-row: 2 / 3;
633
638
  --kui-shell-col: 1 / -1;
634
639
  --kui-shell-surface: var(--color-surface);
635
- --kui-shell-shadow: var(--shadow-4);
640
+ --kui-shell-shadow: var(--surface-chrome);
636
641
  --kui-shell-edge: 1px;
637
642
  --kui-shell-cap: initial;
638
643
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -674,7 +679,7 @@
674
679
  --kui-shell-row: 1 / -1;
675
680
  --kui-shell-col: 1 / -1;
676
681
  --kui-shell-surface: var(--color-surface);
677
- --kui-shell-shadow: var(--shadow-5);
682
+ --kui-shell-shadow: var(--dialog-chrome);
678
683
  --kui-shell-edge: 1px;
679
684
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
680
685
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -688,7 +693,7 @@
688
693
  --kui-shell-row: 2 / 3;
689
694
  --kui-shell-col: 1 / -1;
690
695
  --kui-shell-surface: var(--color-surface);
691
- --kui-shell-shadow: var(--shadow-4);
696
+ --kui-shell-shadow: var(--surface-chrome);
692
697
  --kui-shell-edge: 1px;
693
698
  --kui-shell-cap: initial;
694
699
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -730,7 +735,7 @@
730
735
  --kui-shell-row: 1 / -1;
731
736
  --kui-shell-col: 1 / -1;
732
737
  --kui-shell-surface: var(--color-surface);
733
- --kui-shell-shadow: var(--shadow-5);
738
+ --kui-shell-shadow: var(--dialog-chrome);
734
739
  --kui-shell-edge: 1px;
735
740
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
736
741
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -744,7 +749,7 @@
744
749
  --kui-shell-row: 2 / 3;
745
750
  --kui-shell-col: 1 / -1;
746
751
  --kui-shell-surface: var(--color-surface);
747
- --kui-shell-shadow: var(--shadow-4);
752
+ --kui-shell-shadow: var(--surface-chrome);
748
753
  --kui-shell-edge: 1px;
749
754
  --kui-shell-cap: initial;
750
755
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -786,7 +791,7 @@
786
791
  --kui-shell-row: 1 / -1;
787
792
  --kui-shell-col: 1 / -1;
788
793
  --kui-shell-surface: var(--color-surface);
789
- --kui-shell-shadow: var(--shadow-5);
794
+ --kui-shell-shadow: var(--dialog-chrome);
790
795
  --kui-shell-edge: 1px;
791
796
  --kui-shell-cap: calc(100% - var(--space-9) - var(--kui-shell-start, 0px));
792
797
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -800,7 +805,7 @@
800
805
  --kui-shell-row: 2 / 3;
801
806
  --kui-shell-col: 1 / -1;
802
807
  --kui-shell-surface: var(--color-surface);
803
- --kui-shell-shadow: var(--shadow-4);
808
+ --kui-shell-shadow: var(--surface-chrome);
804
809
  --kui-shell-edge: 1px;
805
810
  --kui-shell-cap: initial;
806
811
  --kui-shell-offset: var(--shell-rail-offset, 0px);
@@ -834,7 +839,7 @@
834
839
  --kui-shell-row: 2 / 3;
835
840
  --kui-shell-col: 1 / -1;
836
841
  --kui-shell-surface: var(--color-surface);
837
- --kui-shell-shadow: var(--shadow-4);
842
+ --kui-shell-shadow: var(--surface-chrome);
838
843
  --kui-shell-edge: 1px;
839
844
  --kui-shell-offset: var(--shell-rail-offset, 0px);
840
845
  --kui-shell-handle: none;
@@ -892,7 +897,7 @@
892
897
  margin: var(--shell-inset-gap);
893
898
  border-radius: var(--radius-surface-1);
894
899
  background: var(--color-page);
895
- box-shadow: var(--shadow-2);
900
+ box-shadow: var(--surface-chrome);
896
901
  }
897
902
 
898
903
  /*
@@ -337,6 +337,11 @@
337
337
  & :where(.kui-SidebarMenuButton) {
338
338
  flex: 1;
339
339
  }
340
+
341
+ /* A Toolbar fills the header, so its leading and trailing groups sit at the two ends. */
342
+ & > :where(.kui-Toolbar) {
343
+ flex: 1;
344
+ }
340
345
  }
341
346
 
342
347
  .kui-SidebarFooter:where(.kui-SidebarFooter--container) {
@@ -351,6 +356,11 @@
351
356
  & :where(.kui-SidebarMenuButton) {
352
357
  flex: 1;
353
358
  }
359
+
360
+ /* A Toolbar fills the footer, so its leading and trailing groups sit at the two ends. */
361
+ & > :where(.kui-Toolbar) {
362
+ flex: 1;
363
+ }
354
364
  }
355
365
 
356
366
  /* Header/Footer Menu Button Support */
@@ -954,3 +964,13 @@
954
964
  color: var(--accent-solid-contrast);
955
965
  }
956
966
  }
967
+
968
+ /* High contrast drops background colours, so the current row lost its only mark. It takes the
969
+ * system highlight pair instead, as a chosen segment does. */
970
+ @media (forced-colors: active) {
971
+ .kui-SidebarMenuButton:where([data-active]) {
972
+ forced-color-adjust: none;
973
+ background-color: Highlight;
974
+ color: HighlightText;
975
+ }
976
+ }
@@ -81,7 +81,7 @@
81
81
  inset: calc(var(--slider-thumb-inset-factor) * var(--slider-thumb-overshoot-base, var(--slider-track-size)) * -1);
82
82
  background-color: var(--accent-solid-thumb);
83
83
  border-radius: var(--slider-thumb-radius);
84
- box-shadow: var(--slider-thumb-box-shadow, var(--shadow-2));
84
+ box-shadow: var(--slider-thumb-box-shadow, var(--grip-chrome));
85
85
  cursor: pointer;
86
86
  }
87
87
 
@@ -142,54 +142,23 @@
142
142
 
143
143
  /***************************************************************************************************
144
144
  * *
145
- * VARIANTS *
145
+ * THE LOOK *
146
146
  * *
147
147
  ***************************************************************************************************/
148
148
 
149
- /* surface */
149
+ /* One look, as in v2. The track is the switch's well, a soft fill with no edge; the range is the
150
+ * accent solid; the thumb is the switch's grip. */
150
151
 
151
- .kui-SliderRoot:where(.kui-variant-surface) {
152
- & :where(.kui-SliderTrack) {
153
- background-color: var(--neutral-2);
154
- box-shadow: inset 0 0 0 1px var(--neutral-6);
155
-
156
- &:where([data-disabled]) {
157
- box-shadow: inset 0 0 0 1px var(--neutral-5);
158
- }
159
- }
160
-
161
- & :where(.kui-SliderRange) {
162
- background-color: var(--accent-solid);
163
- }
164
- }
165
-
166
- /* soft */
167
-
168
- .kui-SliderRoot:where(.kui-variant-soft) {
169
- & :where(.kui-SliderTrack) {
170
- background-color: var(--neutral-3);
171
- }
172
-
173
- & :where(.kui-SliderRange) {
174
- background-color: var(--accent-solid);
175
- }
152
+ .kui-SliderTrack {
153
+ background-color: var(--color-track);
176
154
  }
177
155
 
178
- /* outline */
179
-
180
- .kui-SliderRoot:where(.kui-variant-outline) {
181
- & :where(.kui-SliderTrack) {
182
- /* Base state: no background, just border */
183
- box-shadow: inset 0 0 0 1px var(--neutral-6);
184
- }
185
-
186
- & :where(.kui-SliderRange) {
187
- background-color: var(--accent-solid);
188
- }
156
+ .kui-SliderRange {
157
+ background-color: var(--accent-solid);
189
158
  }
190
159
 
191
160
  /* all disabled Sliders: a colour remap, never opacity, and a default cursor.
192
- * These come after every variant at the same specificity, so they win by order. */
161
+ * These come after the look at the same specificity, so they win by order. */
193
162
 
194
163
  [data-disabled] {
195
164
  .kui-SliderRoot:where(&) {
@@ -4,18 +4,15 @@ import { radiusPropDef } from '../props/radius.prop.js';
4
4
  import type { PropDef } from '../props/prop-def.js';
5
5
 
6
6
  const sizes = ['1', '2', '3', '4'] as const;
7
- const variants = ['surface', 'soft', 'outline'] as const;
8
7
 
9
8
  const sliderPropDefs = {
10
9
  size: { type: 'enum', className: 'kui-r-size', values: sizes, default: '2', responsive: true },
11
- variant: { type: 'enum', className: 'kui-variant', values: variants, default: 'surface' },
12
10
  showTickLabels: { type: 'boolean' },
13
11
  snapToTicks: { type: 'boolean' },
14
12
  ...colorPropDef,
15
13
  ...radiusPropDef,
16
14
  } satisfies {
17
15
  size: PropDef<(typeof sizes)[number]>;
18
- variant: PropDef<(typeof variants)[number]>;
19
16
  showTickLabels: PropDef<boolean>;
20
17
  snapToTicks: PropDef<boolean>;
21
18
  };
@@ -30,13 +30,14 @@
30
30
  }
31
31
 
32
32
  .kui-SwitchThumb {
33
- background-color: white;
33
+ /* The grip: the surface colour, near-white in dark. */
34
+ background-color: var(--color-thumb);
34
35
  position: absolute;
35
36
  inset-inline-start: var(--switch-thumb-inset);
36
37
  width: var(--switch-thumb-size);
37
38
  height: var(--switch-thumb-size);
38
39
  border-radius: 9999px;
39
- box-shadow: var(--shadow-2);
40
+ box-shadow: var(--grip-chrome);
40
41
 
41
42
  &:where([data-state='checked']) {
42
43
  background-color: var(--accent-solid-thumb);
@@ -82,75 +83,33 @@
82
83
 
83
84
  /***************************************************************************************************
84
85
  * *
85
- * VARIANTS *
86
+ * THE LOOK *
86
87
  * *
87
88
  ***************************************************************************************************/
88
89
 
89
- /* surface */
90
+ /* One look, as in v2. Off, the track is a well: a soft fill with no edge. On, it is the accent
91
+ * solid. Hover is one step darker, press two. Disabled switches take neither. */
90
92
 
91
- .kui-SwitchRoot:where(.kui-variant-surface) {
93
+ .kui-SwitchRoot {
92
94
  &::before {
93
- background-color: var(--neutral-2);
94
- box-shadow: inset 0 0 0 1px var(--neutral-6);
95
- }
96
-
97
- &:where([data-state='checked'])::before {
98
- background-color: var(--accent-solid);
95
+ background-color: var(--color-track);
99
96
  box-shadow: none;
100
97
  }
101
- }
102
-
103
- /* soft */
104
-
105
- .kui-SwitchRoot:where(.kui-variant-soft) {
106
- &::before {
107
- background-color: var(--neutral-3);
108
- }
109
98
 
110
99
  &:where([data-state='checked'])::before {
111
100
  background-color: var(--accent-solid);
112
101
  }
113
- }
114
-
115
- /* outline */
116
-
117
- .kui-SwitchRoot:where(.kui-variant-outline) {
118
- &::before {
119
- /* Base state: no background, just border */
120
- box-shadow: inset 0 0 0 1px var(--neutral-6);
121
- }
122
-
123
- &:where([data-state='checked'])::before {
124
- background-color: var(--accent-solid);
125
- box-shadow: none;
126
- }
127
- }
128
-
129
- /* Hover is one step up the variant's own ramp, press two. Disabled switches take neither. */
130
-
131
- .kui-SwitchRoot {
132
- --switch-off-hover: var(--neutral-a2);
133
- --switch-off-active: var(--neutral-a3);
134
-
135
- &:where(.kui-variant-surface) {
136
- --switch-off-hover: var(--neutral-3);
137
- --switch-off-active: var(--neutral-4);
138
- }
139
- &:where(.kui-variant-soft) {
140
- --switch-off-hover: var(--neutral-4);
141
- --switch-off-active: var(--neutral-5);
142
- }
143
102
 
144
103
  @media (hover: hover) {
145
104
  &:where(:hover:not([data-disabled]))::before {
146
- background-color: var(--switch-off-hover);
105
+ background-color: var(--color-track-hover);
147
106
  }
148
107
  &:where(:hover:not([data-disabled]):is([data-state='checked']))::before {
149
108
  background-color: var(--accent-solid-hover);
150
109
  }
151
110
  }
152
111
  &:where(:active:not([data-disabled]))::before {
153
- background-color: var(--switch-off-active);
112
+ background-color: var(--color-track-active);
154
113
  }
155
114
  &:where(:active:not([data-disabled]):is([data-state='checked']))::before {
156
115
  background-color: var(--accent-solid-active);
@@ -158,7 +117,7 @@
158
117
  }
159
118
 
160
119
  /* all disabled Switches: a colour remap, never opacity, and a default cursor.
161
- * These come after every variant at the same specificity, so they win by order. */
120
+ * These come after the look at the same specificity, so they win by order. */
162
121
 
163
122
  [data-disabled] {
164
123
  .kui-SwitchRoot:where(&) {