@womp/kookie-ui 0.35.0 → 0.35.2

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 (87) hide show
  1. package/components.css +35 -35
  2. package/dist/cjs/components/alert-dialog.js +1 -1
  3. package/dist/cjs/components/alert-dialog.js.map +3 -3
  4. package/dist/cjs/components/command.d.ts.map +1 -1
  5. package/dist/cjs/components/command.js +1 -1
  6. package/dist/cjs/components/command.js.map +3 -3
  7. package/dist/cjs/components/dialog.js +1 -1
  8. package/dist/cjs/components/dialog.js.map +3 -3
  9. package/dist/cjs/components/index.js +2 -2
  10. package/dist/cjs/components/index.js.map +3 -3
  11. package/dist/cjs/components/navigator.d.ts +6 -1
  12. package/dist/cjs/components/navigator.d.ts.map +1 -1
  13. package/dist/cjs/components/navigator.js +1 -1
  14. package/dist/cjs/components/navigator.js.map +2 -2
  15. package/dist/cjs/components/sheet.js +1 -1
  16. package/dist/cjs/components/sheet.js.map +3 -3
  17. package/dist/cjs/hooks/index.js +2 -2
  18. package/dist/cjs/hooks/index.js.map +3 -3
  19. package/dist/cjs/hooks/use-body-pointer-events-cleanup.d.ts +6 -0
  20. package/dist/cjs/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  21. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js +1 -1
  22. package/dist/cjs/hooks/use-body-pointer-events-cleanup.js.map +3 -3
  23. package/dist/cjs/index.js +3 -3
  24. package/dist/cjs/index.js.map +3 -3
  25. package/dist/esm/chunk-3RJVW6RK.js +3 -0
  26. package/dist/esm/{chunk-7VJF6EXN.js.map → chunk-3RJVW6RK.js.map} +3 -3
  27. package/dist/esm/chunk-LR4X7SVV.js +3 -0
  28. package/dist/esm/chunk-LR4X7SVV.js.map +7 -0
  29. package/dist/esm/{chunk-J7MIXG6M.js → chunk-QV66TN2A.js} +2 -2
  30. package/dist/esm/chunk-SR42NATX.js +3 -0
  31. package/dist/esm/chunk-SR42NATX.js.map +7 -0
  32. package/dist/esm/chunk-UH6CJXHY.js +3 -0
  33. package/dist/esm/chunk-UH6CJXHY.js.map +7 -0
  34. package/dist/esm/chunk-XVN43IZL.js +3 -0
  35. package/dist/esm/chunk-XVN43IZL.js.map +7 -0
  36. package/dist/esm/components/alert-dialog.js +1 -1
  37. package/dist/esm/components/command.d.ts.map +1 -1
  38. package/dist/esm/components/command.js +1 -1
  39. package/dist/esm/components/dialog.js +1 -1
  40. package/dist/esm/components/index.js +1 -1
  41. package/dist/esm/components/navigator.d.ts +6 -1
  42. package/dist/esm/components/navigator.d.ts.map +1 -1
  43. package/dist/esm/components/navigator.js +1 -1
  44. package/dist/esm/components/sheet.js +1 -1
  45. package/dist/esm/hooks/index.js +1 -1
  46. package/dist/esm/hooks/use-body-pointer-events-cleanup.d.ts +6 -0
  47. package/dist/esm/hooks/use-body-pointer-events-cleanup.d.ts.map +1 -1
  48. package/dist/esm/hooks/use-body-pointer-events-cleanup.js +1 -1
  49. package/dist/esm/index.js +1 -1
  50. package/package.json +1 -1
  51. package/src/components/_internal/base-card.css +3 -3
  52. package/src/components/_internal/base-menu.css +1 -1
  53. package/src/components/_internal/base-sidebar-menu.css +1 -1
  54. package/src/components/_internal/base-tab-list.css +1 -1
  55. package/src/components/accordion.css +2 -2
  56. package/src/components/alert-dialog.tsx +2 -2
  57. package/src/components/avatar.css +2 -2
  58. package/src/components/card.css +1 -1
  59. package/src/components/chatbar.css +2 -2
  60. package/src/components/combobox.css +1 -1
  61. package/src/components/command.css +1 -1
  62. package/src/components/command.tsx +16 -3
  63. package/src/components/dialog.tsx +2 -2
  64. package/src/components/kbd.css +2 -2
  65. package/src/components/message-scroller.css +1 -1
  66. package/src/components/navigator.css +1 -1
  67. package/src/components/navigator.tsx +14 -1
  68. package/src/components/scroll-area.css +1 -1
  69. package/src/components/select.css +6 -6
  70. package/src/components/sidebar.css +2 -2
  71. package/src/components/text-area.css +1 -1
  72. package/src/components/text-field.css +3 -3
  73. package/src/components/virtual-menu.css +1 -1
  74. package/src/hooks/use-body-pointer-events-cleanup.ts +12 -0
  75. package/src/styles/tokens/constants.css +3 -3
  76. package/styles.css +37 -37
  77. package/tokens.css +2 -2
  78. package/dist/esm/chunk-7VJF6EXN.js +0 -3
  79. package/dist/esm/chunk-CAM66IXC.js +0 -3
  80. package/dist/esm/chunk-CAM66IXC.js.map +0 -7
  81. package/dist/esm/chunk-GZPB6MRQ.js +0 -3
  82. package/dist/esm/chunk-GZPB6MRQ.js.map +0 -7
  83. package/dist/esm/chunk-I5TPDYJO.js +0 -3
  84. package/dist/esm/chunk-I5TPDYJO.js.map +0 -7
  85. package/dist/esm/chunk-NZJRXZYX.js +0 -3
  86. package/dist/esm/chunk-NZJRXZYX.js.map +0 -7
  87. /package/dist/esm/{chunk-J7MIXG6M.js.map → chunk-QV66TN2A.js.map} +0 -0
@@ -163,7 +163,7 @@
163
163
 
164
164
  /* Focus */
165
165
  &:where(:focus-visible) {
166
- outline: 2px solid var(--v-focus-color);
166
+ outline: var(--focus-ring-width) solid var(--v-focus-color);
167
167
  outline-offset: var(--v-focus-offset);
168
168
 
169
169
  &::after {
@@ -273,7 +273,7 @@
273
273
 
274
274
  /* Focus */
275
275
  &:where(:focus-visible) {
276
- outline: 2px solid var(--v-focus-color);
276
+ outline: var(--focus-ring-width) solid var(--v-focus-color);
277
277
  outline-offset: var(--v-focus-offset);
278
278
  }
279
279
 
@@ -338,7 +338,7 @@
338
338
  }
339
339
 
340
340
  &:where(:focus-visible) {
341
- outline: 2px solid var(--focus-8);
341
+ outline: var(--focus-ring-width) solid var(--focus-8);
342
342
  outline-offset: 2px;
343
343
  }
344
344
 
@@ -347,7 +347,7 @@
347
347
  /* Forced colors support */
348
348
  @media (forced-colors: active) {
349
349
  .kui-BaseMenuItem:where(:focus-visible) {
350
- outline: 2px solid Highlight;
350
+ outline: var(--focus-ring-width) solid Highlight;
351
351
  outline-offset: 2px;
352
352
  }
353
353
 
@@ -66,7 +66,7 @@
66
66
 
67
67
  /* Focus state */
68
68
  &:where(:focus-visible) {
69
- outline: 2px solid var(--focus-8);
69
+ outline: var(--focus-ring-width) solid var(--focus-8);
70
70
  outline-offset: 2px;
71
71
  }
72
72
 
@@ -228,7 +228,7 @@
228
228
  }
229
229
 
230
230
  .kui-BaseTabListTrigger:where(:focus-visible) :where(.kui-BaseTabListTriggerInner) {
231
- outline: 2px solid Highlight;
231
+ outline: var(--focus-ring-width) solid Highlight;
232
232
  outline-offset: 2px;
233
233
  }
234
234
  }
@@ -190,7 +190,7 @@
190
190
 
191
191
  /* Trigger focus states */
192
192
  :where(.kui-AccordionTrigger:focus-visible) {
193
- outline: var(--focus-outline-width) solid var(--focus-8);
193
+ outline: var(--focus-ring-width) solid var(--focus-8);
194
194
  outline-offset: var(--focus-outline-offset-inset);
195
195
  }
196
196
 
@@ -246,7 +246,7 @@
246
246
  }
247
247
 
248
248
  :where(.kui-AccordionTrigger:focus-visible) {
249
- outline: 2px solid CanvasText;
249
+ outline: var(--focus-ring-width) solid CanvasText;
250
250
  outline-offset: 2px;
251
251
  }
252
252
 
@@ -9,7 +9,7 @@ import { PortalTheme } from './_internal/portal-theme.js';
9
9
  import { extractProps } from '../helpers/extract-props.js';
10
10
  import { useThemeSizeProps } from '../hooks/theme-size.js';
11
11
  import { requireReactElement } from '../helpers/require-react-element.js';
12
- import { useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
12
+ import { releaseBodyPointerEvents, useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
13
13
 
14
14
  import type { AlertDialogContentOwnProps } from './alert-dialog.props.js';
15
15
  import type { ComponentPropsWithout, RemovedProps, ComponentPropsAs } from '../helpers/component-props.js';
@@ -61,7 +61,7 @@ const AlertDialogContent = React.forwardRef<AlertDialogContentElement, AlertDial
61
61
  // Radix returns focus to the trigger unless the caller prevents it.
62
62
  onCloseAutoFocus?.(event);
63
63
  // Restore pointer-events to body (Radix UI fix for issue #1241)
64
- document.body.style.pointerEvents = '';
64
+ releaseBodyPointerEvents();
65
65
  }}
66
66
  />
67
67
  </div>
@@ -38,8 +38,8 @@
38
38
  cursor: pointer;
39
39
 
40
40
  &:where(:focus-visible) {
41
- outline: var(--focus-outline-width) solid var(--focus-8);
42
- outline-offset: var(--focus-outline-offset);
41
+ outline: var(--focus-ring-width) solid var(--focus-8);
42
+ outline-offset: var(--focus-ring-offset);
43
43
  }
44
44
 
45
45
  /* Disabled is a colour remap: the element still hit-tests, so the cursor stops promising a press. */
@@ -19,7 +19,7 @@
19
19
  --base-card-border-radius: var(--kui-sf-r);
20
20
 
21
21
  &:where(:focus-visible) {
22
- outline: 2px solid var(--focus-8);
22
+ outline: var(--focus-ring-width) solid var(--focus-8);
23
23
  outline-offset: -1px;
24
24
 
25
25
  &::after {
@@ -341,7 +341,7 @@
341
341
 
342
342
  /* Focus state - outline ring (raised has its own box-shadow ring) */
343
343
  &:where(:focus-within) {
344
- outline: 2px solid var(--v-focus-color, var(--focus-8));
344
+ outline: var(--focus-ring-width) solid var(--v-focus-color, var(--focus-8));
345
345
  outline-offset: -1px;
346
346
  }
347
347
  }
@@ -417,7 +417,7 @@
417
417
  border: 1px solid CanvasText;
418
418
  }
419
419
  .kui-ChatbarBox:where(.kui-variant-raised):where(:focus-within) {
420
- outline: 2px solid Highlight;
420
+ outline: var(--focus-ring-width) solid Highlight;
421
421
  outline-offset: -1px;
422
422
  }
423
423
  .kui-ChatbarRoot:where([data-disabled]) .kui-ChatbarBox {
@@ -124,7 +124,7 @@
124
124
  /* Items never take DOM focus, so the base menu :focus-visible rule never matches. */
125
125
  @media (forced-colors: active) {
126
126
  .kui-ComboboxItem:where([data-selected='true']) {
127
- outline: 2px solid Highlight;
127
+ outline: var(--focus-ring-width) solid Highlight;
128
128
  outline-offset: -2px;
129
129
  }
130
130
  }
@@ -187,7 +187,7 @@
187
187
 
188
188
  @media (forced-colors: active) {
189
189
  .kui-CommandItem:where([data-selected='true']) {
190
- outline: 2px solid Highlight;
190
+ outline: var(--focus-ring-width) solid Highlight;
191
191
  outline-offset: -2px;
192
192
  }
193
193
 
@@ -23,7 +23,7 @@ import { Command as CommandPrimitive } from 'cmdk';
23
23
  import { Dialog as DialogPrimitive } from 'radix-ui';
24
24
 
25
25
  import { PortalTheme } from './_internal/portal-theme.js';
26
- import { useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
26
+ import { releaseBodyPointerEvents, useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
27
27
  import { useThemeSize } from '../hooks/theme-size.js';
28
28
 
29
29
  type Size = '1' | '2' | '3' | '4';
@@ -194,7 +194,7 @@ function CommandContent({ 'aria-label': label, filter = defaultFilter, itemToStr
194
194
  className={classNames('kui-CommandContent', `kui-r-size-${size}`, className)}
195
195
  style={style}
196
196
  onCloseAutoFocus={() => {
197
- document.body.style.pointerEvents = '';
197
+ releaseBodyPointerEvents();
198
198
  }}
199
199
  >
200
200
  <DialogPrimitive.Title className="kui-sr-only">{label}</DialogPrimitive.Title>
@@ -304,8 +304,21 @@ interface CommandGroupLabelProps {
304
304
 
305
305
  /** The group's name, above its rows. */
306
306
  function CommandGroupLabel({ children, className }: CommandGroupLabelProps) {
307
+ const id = React.useId();
308
+ const ref = React.useRef<HTMLDivElement>(null);
309
+ // cmdk renders the group's `role="group"` element itself and gives no way to name it from a
310
+ // child, so the label names it here, as Combobox.Label does. The label stays out of the
311
+ // reading order: a screen reader hears it as the group's name, not as a row.
312
+ React.useLayoutEffect(() => {
313
+ const group = ref.current?.closest('[cmdk-group-items]');
314
+ if (!group || group.hasAttribute('aria-labelledby')) return;
315
+ group.setAttribute('aria-labelledby', id);
316
+ return () => {
317
+ if (group.getAttribute('aria-labelledby') === id) group.removeAttribute('aria-labelledby');
318
+ };
319
+ }, [id]);
307
320
  return (
308
- <div className={classNames('kui-BaseMenuLabel', 'kui-CommandGroupLabel', className)} aria-hidden>
321
+ <div ref={ref} id={id} className={classNames('kui-BaseMenuLabel', 'kui-CommandGroupLabel', className)} aria-hidden>
309
322
  {children}
310
323
  </div>
311
324
  );
@@ -10,7 +10,7 @@ import { NavigatorHostContext, type NavigatorHost } from './_internal/navigator-
10
10
  import { extractProps } from '../helpers/extract-props.js';
11
11
  import { useThemeSizeProps } from '../hooks/theme-size.js';
12
12
  import { requireReactElement } from '../helpers/require-react-element.js';
13
- import { useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
13
+ import { releaseBodyPointerEvents, useBodyPointerEventsCleanup } from '../hooks/use-body-pointer-events-cleanup.js';
14
14
 
15
15
  import type { DialogContentOwnProps } from './dialog.props.js';
16
16
  import type { ComponentPropsWithout, RemovedProps, ComponentPropsAs } from '../helpers/component-props.js';
@@ -69,7 +69,7 @@ const DialogContent = React.forwardRef<DialogContentElement, DialogContentProps>
69
69
  // Radix returns focus to the trigger unless the caller prevents it.
70
70
  onCloseAutoFocus?.(event);
71
71
  // Restore pointer-events to body (Radix UI fix for issue #1241)
72
- document.body.style.pointerEvents = '';
72
+ releaseBodyPointerEvents();
73
73
  }}
74
74
  />
75
75
  </div>
@@ -103,7 +103,7 @@
103
103
  box-shadow: inset 0 var(--raised-border-width) var(--black-a3), 0 0 0 var(--raised-border-width) var(--neutral-a7);
104
104
  }
105
105
  &:where(:focus-visible) {
106
- outline: 2px solid var(--focus-8);
106
+ outline: var(--focus-ring-width) solid var(--focus-8);
107
107
  }
108
108
  }
109
109
  }
@@ -124,7 +124,7 @@
124
124
  background-color: var(--neutral-a5);
125
125
  }
126
126
  &:where(:focus-visible) {
127
- outline: 2px solid var(--focus-8);
127
+ outline: var(--focus-ring-width) solid var(--focus-8);
128
128
  }
129
129
  }
130
130
  }
@@ -20,7 +20,7 @@
20
20
  outline: none;
21
21
 
22
22
  &:where(:focus-visible) {
23
- outline: 2px solid var(--focus-8);
23
+ outline: var(--focus-ring-width) solid var(--focus-8);
24
24
  outline-offset: -2px;
25
25
  }
26
26
  }
@@ -80,6 +80,6 @@
80
80
  }
81
81
 
82
82
  .kui-NavigatorLink:where(:focus-visible) {
83
- outline: 2px solid var(--focus-8);
83
+ outline: var(--focus-ring-width) solid var(--focus-8);
84
84
  outline-offset: -2px;
85
85
  }
@@ -85,7 +85,12 @@ function Level({ visible, children }: { visible: boolean; children: React.ReactN
85
85
  }
86
86
 
87
87
  interface NavigatorProps<T> {
88
- /** The screens above the root, as values. Use it with `onPathChange` to control the path. */
88
+ /**
89
+ * The screens above the root, as values. Use it with `onPathChange` to control the path. Each
90
+ * value is a string or a number: a screen is told apart by its value, and every object reads the
91
+ * same, so an object here would hand one screen's state to the next. Keep an id in the path and
92
+ * look the record up in `screen`.
93
+ */
89
94
  path?: readonly T[];
90
95
  /** The path to start with when the navigator controls its own path. */
91
96
  defaultPath?: readonly T[];
@@ -125,6 +130,14 @@ function Navigator<T>({ path: pathProp, defaultPath, onPathChange, screen, root,
125
130
  direction = path.length < before.length ? 'pop' : path.length > before.length || !Object.is(path[path.length - 1], before[before.length - 1]) ? 'push' : seen.direction;
126
131
  setSeen({ path, direction });
127
132
  }
133
+ // A screen's key is its depth and its value as text, and every object is the same text.
134
+ React.useEffect(() => {
135
+ if (process.env.NODE_ENV === 'production') return;
136
+ if (path.some((value) => value !== null && typeof value === 'object')) {
137
+ console.error('Navigator: a value in `path` is an object. Path values must be strings or numbers; keep an id in the path and look the record up in `screen`.');
138
+ }
139
+ }, [path]);
140
+
128
141
  const titles = React.useRef<(string | undefined)[]>([]);
129
142
  const openers = React.useRef<(HTMLElement | null)[]>([]);
130
143
  const [version, setVersion] = React.useState(0);
@@ -60,7 +60,7 @@
60
60
  position: absolute;
61
61
  inset: 0;
62
62
  pointer-events: none;
63
- outline: 2px solid var(--focus-8);
63
+ outline: var(--focus-ring-width) solid var(--focus-8);
64
64
  outline-offset: -2px;
65
65
  }
66
66
  }
@@ -21,7 +21,7 @@
21
21
  }
22
22
 
23
23
  &:where(:focus-visible) {
24
- outline: var(--focus-outline-width) solid var(--focus-8);
24
+ outline: var(--focus-ring-width) solid var(--focus-8);
25
25
  outline-offset: var(--focus-outline-offset-inset);
26
26
  }
27
27
  }
@@ -203,7 +203,7 @@
203
203
  box-shadow: var(--field-chrome);
204
204
 
205
205
  &:where(:focus-visible) {
206
- outline: 2px solid var(--focus-8);
206
+ outline: var(--focus-ring-width) solid var(--focus-8);
207
207
  outline-offset: 2px;
208
208
  }
209
209
 
@@ -240,7 +240,7 @@
240
240
  color: var(--accent-ink);
241
241
 
242
242
  &:where(:focus-visible) {
243
- outline: 2px solid var(--accent-8);
243
+ outline: var(--focus-ring-width) solid var(--accent-8);
244
244
  outline-offset: -1px;
245
245
  }
246
246
 
@@ -293,7 +293,7 @@
293
293
  }
294
294
 
295
295
  &:where(:focus-visible) {
296
- outline: 2px solid var(--focus-8);
296
+ outline: var(--focus-ring-width) solid var(--focus-8);
297
297
  outline-offset: -1px;
298
298
  }
299
299
 
@@ -336,7 +336,7 @@
336
336
  }
337
337
 
338
338
  &:where(:focus-visible) {
339
- outline: 2px solid var(--focus-8);
339
+ outline: var(--focus-ring-width) solid var(--focus-8);
340
340
  outline-offset: -1px;
341
341
  }
342
342
 
@@ -380,7 +380,7 @@
380
380
  }
381
381
 
382
382
  &:where(:focus-visible) {
383
- outline: 2px solid var(--focus-8);
383
+ outline: var(--focus-ring-width) solid var(--focus-8);
384
384
  outline-offset: -1px;
385
385
  }
386
386
 
@@ -402,7 +402,7 @@
402
402
 
403
403
  /* Focus state */
404
404
  &:where(:focus-visible) {
405
- outline: 2px solid var(--focus-8);
405
+ outline: var(--focus-ring-width) solid var(--focus-8);
406
406
  outline-offset: 2px;
407
407
  }
408
408
 
@@ -860,7 +860,7 @@
860
860
  /* Popover menu button focus (arrow-key navigation) */
861
861
  /* stylelint-disable-next-line selector-max-specificity */
862
862
  .kui-SidebarSearchPopover .kui-SidebarMenuButton:where(:focus-visible) {
863
- outline: 2px solid var(--focus-8);
863
+ outline: var(--focus-ring-width) solid var(--focus-8);
864
864
  outline-offset: -2px;
865
865
  }
866
866
 
@@ -33,7 +33,7 @@
33
33
  isolation: isolate;
34
34
 
35
35
  &:where(:focus-within) {
36
- outline: 2px solid var(--v-focus-color, var(--focus-8));
36
+ outline: var(--focus-ring-width) solid var(--v-focus-color, var(--focus-8));
37
37
  outline-offset: -1px;
38
38
  }
39
39
 
@@ -12,13 +12,13 @@
12
12
 
13
13
  @supports selector(:has(*)) {
14
14
  &:where(:has(.kui-TextFieldInput:focus)) {
15
- outline: 2px solid var(--text-field-focus-color);
15
+ outline: var(--focus-ring-width) solid var(--text-field-focus-color);
16
16
  outline-offset: -1px;
17
17
  }
18
18
  }
19
19
  @supports not selector(:has(*)) {
20
20
  &:where(:focus-within) {
21
- outline: 2px solid var(--text-field-focus-color);
21
+ outline: var(--focus-ring-width) solid var(--text-field-focus-color);
22
22
  outline-offset: -1px;
23
23
  }
24
24
  }
@@ -88,7 +88,7 @@
88
88
  }
89
89
  }
90
90
  &::-webkit-calendar-picker-indicator:where(:focus-visible) {
91
- outline: 2px solid var(--text-field-focus-color);
91
+ outline: var(--focus-ring-width) solid var(--text-field-focus-color);
92
92
  }
93
93
 
94
94
  /* Remove focus ring from date fields and use the selection color */
@@ -19,7 +19,7 @@
19
19
  outline: none;
20
20
 
21
21
  &:where(:focus-visible) {
22
- outline: 2px solid var(--focus-8);
22
+ outline: var(--focus-ring-width) solid var(--focus-8);
23
23
  outline-offset: -2px;
24
24
  }
25
25
  }
@@ -114,6 +114,18 @@ function install(): () => void {
114
114
  };
115
115
  }
116
116
 
117
+ /**
118
+ * Clears a `pointer-events: none` that Radix left on `document.body`, for a dialog that has just
119
+ * closed. Leaves it alone while another modal is still open: that modal needs the page behind it
120
+ * to stay blocked, and it clears the value itself when it closes.
121
+ */
122
+ export function releaseBodyPointerEvents() {
123
+ if (typeof document === 'undefined') return;
124
+ const stillOpen = document.querySelector('[role="dialog"][data-state="open"], [role="alertdialog"][data-state="open"]');
125
+ if (stillOpen) return;
126
+ document.body.style.pointerEvents = '';
127
+ }
128
+
117
129
  /**
118
130
  * Hook to cleanup stuck pointer-events: none on document.body
119
131
  *
@@ -100,9 +100,9 @@
100
100
  --component-gap-ghost-3: calc(var(--space-2) * 1.5);
101
101
  --component-gap-ghost-4: var(--space-3);
102
102
 
103
- /* Focus outline constants */
104
- --focus-outline-width: 2px;
105
- --focus-outline-offset: 2px;
103
+ /* Older names for the focus ring, kept for apps that read them */
104
+ --focus-outline-width: var(--focus-ring-width);
105
+ --focus-outline-offset: var(--focus-ring-offset);
106
106
  --focus-outline-offset-inset: -1px;
107
107
 
108
108
  /* Component padding relationships */