@astryxdesign/core 0.6.1 → 0.6.2-canary.2b2113d

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 (88) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/BottomSheet/BottomSheet.d.ts +1 -1
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +3 -1
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts +7 -5
  6. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheetPanel.js +56 -19
  8. package/dist/DateRangeInput/DateRangeInput.d.ts +3 -0
  9. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  10. package/dist/DateRangeInput/DateRangeInput.js +16 -9
  11. package/dist/Dialog/DialogHeader.d.ts +1 -1
  12. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  13. package/dist/Dialog/DialogHeader.js +10 -7
  14. package/dist/FileInput/FileInput.d.ts.map +1 -1
  15. package/dist/FileInput/FileInput.js +9 -3
  16. package/dist/Markdown/Markdown.d.ts +10 -2
  17. package/dist/Markdown/Markdown.d.ts.map +1 -1
  18. package/dist/Markdown/Markdown.js +58 -14
  19. package/dist/Markdown/index.d.ts +1 -1
  20. package/dist/Markdown/index.d.ts.map +1 -1
  21. package/dist/Markdown/parser.d.ts +126 -12
  22. package/dist/Markdown/parser.d.ts.map +1 -1
  23. package/dist/Markdown/parser.js +369 -34
  24. package/dist/Markdown/utils.d.ts +1 -1
  25. package/dist/Markdown/utils.d.ts.map +1 -1
  26. package/dist/Slider/Slider.d.ts.map +1 -1
  27. package/dist/Slider/Slider.js +5 -2
  28. package/dist/Spinner/Spinner.d.ts +1 -1
  29. package/dist/Spinner/Spinner.d.ts.map +1 -1
  30. package/dist/Spinner/Spinner.js +23 -15
  31. package/dist/astryx.css +5 -2
  32. package/dist/hooks/scrollKeyboardDelegation.d.ts +3 -0
  33. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -0
  34. package/dist/hooks/scrollKeyboardDelegation.js +146 -0
  35. package/dist/hooks/useScrollableArea.d.ts +6 -2
  36. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  37. package/dist/hooks/useScrollableArea.js +17 -5
  38. package/locales/en.json +16 -0
  39. package/locales/pseudo.json +12 -0
  40. package/package.json +7 -5
  41. package/scripts/agent-doc-state.mjs +1 -1
  42. package/src/BottomSheet/BottomSheet.doc.mjs +8 -1
  43. package/src/BottomSheet/BottomSheet.spec.md +46 -20
  44. package/src/BottomSheet/BottomSheet.test.tsx +6 -3
  45. package/src/BottomSheet/BottomSheet.tsx +3 -1
  46. package/src/BottomSheet/BottomSheetKeyboard.test.tsx +195 -0
  47. package/src/BottomSheet/BottomSheetPanel.test.tsx +11 -1
  48. package/src/BottomSheet/BottomSheetPanel.tsx +49 -16
  49. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +344 -0
  50. package/src/DateRangeInput/DateRangeInput.doc.mjs +35 -7
  51. package/src/DateRangeInput/DateRangeInput.spec.md +203 -0
  52. package/src/DateRangeInput/DateRangeInput.test.tsx +100 -4
  53. package/src/DateRangeInput/DateRangeInput.tsx +29 -20
  54. package/src/Dialog/Dialog.doc.mjs +3 -0
  55. package/src/Dialog/Dialog.spec.md +1 -1
  56. package/src/Dialog/DialogHeader.doc.mjs +38 -0
  57. package/src/Dialog/DialogHeader.test.tsx +49 -0
  58. package/src/Dialog/DialogHeader.tsx +23 -4
  59. package/src/Dialog/modules/DialogHeader.spec.md +152 -0
  60. package/src/FileInput/FileInput.doc.mjs +2 -0
  61. package/src/FileInput/FileInput.spec.md +199 -0
  62. package/src/FileInput/FileInput.test.tsx +14 -0
  63. package/src/FileInput/FileInput.tsx +13 -3
  64. package/src/Markdown/Markdown.doc.mjs +167 -42
  65. package/src/Markdown/Markdown.public.test.ts +157 -0
  66. package/src/Markdown/Markdown.spec.md +149 -70
  67. package/src/Markdown/Markdown.test.tsx +107 -3
  68. package/src/Markdown/Markdown.tsx +116 -35
  69. package/src/Markdown/incremental.test.ts +175 -7
  70. package/src/Markdown/index.ts +6 -0
  71. package/src/Markdown/parser.perf.test.ts +3 -1
  72. package/src/Markdown/parser.test.ts +122 -0
  73. package/src/Markdown/parser.ts +609 -81
  74. package/src/Markdown/utils.ts +6 -0
  75. package/src/ScrollableArea/modules/useScrollableArea.spec.md +50 -22
  76. package/src/Slider/Slider.doc.mjs +16 -0
  77. package/src/Slider/Slider.spec.md +61 -47
  78. package/src/Slider/Slider.test.tsx +18 -0
  79. package/src/Slider/Slider.tsx +12 -6
  80. package/src/Spinner/Spinner.doc.mjs +6 -3
  81. package/src/Spinner/Spinner.test.tsx +37 -0
  82. package/src/Spinner/Spinner.tsx +31 -14
  83. package/src/hooks/scrollKeyboardDelegation.test.ts +155 -0
  84. package/src/hooks/scrollKeyboardDelegation.ts +233 -0
  85. package/src/hooks/useScrollableArea.doc.mjs +15 -3
  86. package/src/hooks/useScrollableArea.test.tsx +59 -1
  87. package/src/hooks/useScrollableArea.ts +34 -10
  88. package/src/theme/derivedVarRegistry.test.ts +6 -4
@@ -4,8 +4,8 @@
4
4
 
5
5
  /**
6
6
  * @file useScrollableArea.ts
7
- * @input Logical scroll intent, keyboard ownership, caller-owned viewport/content props
8
- * @output Safe prop getters and stable per-axis effective scroll state
7
+ * @input Logical scroll intent, focus-time keyboard delegation, caller-owned viewport/content props
8
+ * @output Safe prop getters, native keyboard entry, and stable per-axis effective scroll state
9
9
  * @position Canonical behavior core for ScrollableArea and structure-owning adopters
10
10
  *
11
11
  * SYNC: When modified, update:
@@ -26,6 +26,7 @@ import {
26
26
  } from 'react';
27
27
  import * as stylex from '@stylexjs/stylex';
28
28
  import type {BaseProps} from '../BaseProps';
29
+ import {attachScrollKeyboardDelegation} from './scrollKeyboardDelegation';
29
30
  import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
30
31
  import {mergeProps} from '../utils/mergeProps';
31
32
  import {mergeRefs} from '../utils/mergeRefs';
@@ -48,7 +49,12 @@ export type ScrollStickyContainment = 'whenScrollable' | 'always';
48
49
 
49
50
  export type ScrollKeyboardAccess =
50
51
  | {owner: 'content'}
51
- | {owner: 'viewport'; label: string; role?: 'group' | 'region'};
52
+ | {owner: 'viewport'; label: string; role?: 'group' | 'region'}
53
+ | {
54
+ owner: 'contentOrViewport';
55
+ label: string;
56
+ role?: 'group' | 'region';
57
+ };
52
58
 
53
59
  export interface ScrollAxisState {
54
60
  isScrollable: boolean;
@@ -285,6 +291,8 @@ export function useScrollableArea({
285
291
  content.addEventListener('transitionend', scheduleMeasure);
286
292
  content.addEventListener('animationend', scheduleMeasure);
287
293
 
294
+ // Geometry invalidation is independent of keyboard eligibility. The latter
295
+ // is inspected only on native keyboard entry, never by these observers.
288
296
  const mutationObserver =
289
297
  typeof MutationObserver === 'undefined'
290
298
  ? null
@@ -346,6 +354,20 @@ export function useScrollableArea({
346
354
  [axis, measured],
347
355
  );
348
356
 
357
+ const hasEffectiveAxis =
358
+ state.inline.isScrollable || state.block.isScrollable;
359
+ useIsomorphicLayoutEffect(() => {
360
+ if (
361
+ keyboardAccess.owner !== 'contentOrViewport' ||
362
+ !hasEffectiveAxis ||
363
+ viewport == null ||
364
+ content == null
365
+ ) {
366
+ return;
367
+ }
368
+ return attachScrollKeyboardDelegation(viewport, content);
369
+ }, [content, hasEffectiveAxis, keyboardAccess.owner, viewport]);
370
+
349
371
  const getViewportProps = useCallback(
350
372
  <E extends HTMLElement>(
351
373
  props: ScrollableElementProps<E> = {},
@@ -385,8 +407,9 @@ export function useScrollableArea({
385
407
  ),
386
408
  ),
387
409
  ) as ScrollableElementProps<E>;
410
+ const viewportIsKeyboardOwner = keyboardAccess.owner !== 'content';
388
411
  const keepsProgrammaticFocus =
389
- !hasEffectiveAxis &&
412
+ (!viewportIsKeyboardOwner || !hasEffectiveAxis) &&
390
413
  viewport != null &&
391
414
  typeof document !== 'undefined' &&
392
415
  document.activeElement === viewport;
@@ -409,15 +432,16 @@ export function useScrollableArea({
409
432
  }
410
433
 
411
434
  const keyboardProps =
412
- keyboardAccess.owner === 'viewport'
435
+ keyboardAccess.owner !== 'content'
413
436
  ? {
414
437
  role: keyboardAccess.role ?? 'group',
415
438
  'aria-label': keyboardAccess.label,
416
- tabIndex: hasEffectiveAxis
417
- ? 0
418
- : keepsProgrammaticFocus
419
- ? -1
420
- : undefined,
439
+ tabIndex:
440
+ viewportIsKeyboardOwner && hasEffectiveAxis
441
+ ? 0
442
+ : keepsProgrammaticFocus
443
+ ? -1
444
+ : undefined,
421
445
  }
422
446
  : {};
423
447
 
@@ -310,15 +310,17 @@ const VARS_WITHOUT_DERIVED_MAPPING = new Set([
310
310
  // It is one component of one shadow in the list, so no standard property
311
311
  // maps onto it either — a theme sets it beside the fill it has to contrast.
312
312
  '--selectable-card-ring-color',
313
- // The spinner's ring is drawn as an SVG circle, so none of its four vars is
313
+ // The spinner's ring is drawn as an SVG circle, so none of its five vars is
314
314
  // a CSS property of the element carrying the theme target: `width` and
315
- // `borderWidth` would name a box the ring is not, and a `color` mapping
316
- // would take the label's text color with it. They are public vars a theme
317
- // sets directly under a size- or shade-variant key.
315
+ // `borderWidth` would name a box the ring is not, a `color` mapping would
316
+ // take the label's text color with it, and the arc fraction is a pure
317
+ // dash-length multiplier with no standard property to attach to. They are
318
+ // public vars a theme sets directly under a size- or shade-variant key.
318
319
  '--spinner-diameter',
319
320
  '--spinner-stroke-width',
320
321
  '--spinner-color',
321
322
  '--spinner-track-color',
323
+ '--spinner-arc-fraction',
322
324
  ]);
323
325
 
324
326
  // ---------------------------------------------------------------------------