@astryxdesign/core 0.6.0 → 0.6.1

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 (203) hide show
  1. package/CHANGELOG.md +41 -3
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +12 -1
  4. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  5. package/dist/BottomSheet/BottomSheetSwitcher.js +44 -15
  6. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +3 -2
  7. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  8. package/dist/Breadcrumbs/BreadcrumbItem.js +3 -7
  9. package/dist/Center/Center.d.ts +23 -16
  10. package/dist/Center/Center.d.ts.map +1 -1
  11. package/dist/Center/Center.js +7 -5
  12. package/dist/CodeBlock/CodeBlock.js +2 -2
  13. package/dist/DateInput/DateInput.d.ts.map +1 -1
  14. package/dist/DateInput/DateInput.js +12 -2
  15. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  16. package/dist/DateTimeInput/DateTimeInput.js +12 -2
  17. package/dist/Field/Field.d.ts.map +1 -1
  18. package/dist/Field/Field.js +1 -0
  19. package/dist/Field/InputClearButton.d.ts +2 -2
  20. package/dist/Field/InputClearButton.d.ts.map +1 -1
  21. package/dist/Field/InputClearButton.js +5 -1
  22. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  23. package/dist/Field/PanelSearchInput.js +16 -4
  24. package/dist/FileInput/FileInput.d.ts.map +1 -1
  25. package/dist/FileInput/FileInput.js +12 -1
  26. package/dist/HoverCard/useHoverCard.js +2 -2
  27. package/dist/Indicator/CheckboxIndicator.js +2 -2
  28. package/dist/Indicator/RadioIndicator.js +2 -2
  29. package/dist/Layer/layerStack.d.ts +10 -0
  30. package/dist/Layer/layerStack.d.ts.map +1 -1
  31. package/dist/Layer/layerStack.js +21 -9
  32. package/dist/Layer/useLayerDismissal.d.ts +2 -3
  33. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  34. package/dist/Layer/useLayerDismissal.js +2 -3
  35. package/dist/NavIcon/NavIcon.js +2 -2
  36. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  37. package/dist/NumberInput/NumberInput.js +12 -2
  38. package/dist/Popover/usePopover.d.ts +3 -2
  39. package/dist/Popover/usePopover.d.ts.map +1 -1
  40. package/dist/Popover/usePopover.js +4 -2
  41. package/dist/ProgressBar/ProgressBar.js +2 -2
  42. package/dist/ScrollableArea/ScrollableArea.d.ts +79 -0
  43. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -0
  44. package/dist/ScrollableArea/ScrollableArea.js +144 -0
  45. package/dist/ScrollableArea/index.d.ts +11 -0
  46. package/dist/ScrollableArea/index.d.ts.map +1 -0
  47. package/dist/ScrollableArea/index.js +11 -0
  48. package/dist/StatusDot/StatusDot.js +2 -2
  49. package/dist/TextArea/TextArea.js +2 -2
  50. package/dist/TextInput/TextInput.d.ts.map +1 -1
  51. package/dist/TextInput/TextInput.js +19 -4
  52. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  53. package/dist/TimeInput/TimeInput.js +12 -2
  54. package/dist/Typeahead/BaseTypeahead.d.ts +21 -14
  55. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  56. package/dist/Typeahead/BaseTypeahead.js +56 -20
  57. package/dist/astryx.css +15 -0
  58. package/dist/hooks/index.d.ts +2 -0
  59. package/dist/hooks/index.d.ts.map +1 -1
  60. package/dist/hooks/index.js +1 -0
  61. package/dist/hooks/scrollGeometry.d.ts +24 -0
  62. package/dist/hooks/scrollGeometry.d.ts.map +1 -0
  63. package/dist/hooks/scrollGeometry.js +86 -0
  64. package/dist/hooks/scrollOwnerRegistry.d.ts +15 -0
  65. package/dist/hooks/scrollOwnerRegistry.d.ts.map +1 -0
  66. package/dist/hooks/scrollOwnerRegistry.js +24 -0
  67. package/dist/hooks/useFocusTrap.d.ts +8 -0
  68. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  69. package/dist/hooks/useFocusTrap.js +22 -11
  70. package/dist/hooks/useScrollableArea.d.ts +51 -0
  71. package/dist/hooks/useScrollableArea.d.ts.map +1 -0
  72. package/dist/hooks/useScrollableArea.js +287 -0
  73. package/dist/index.d.ts +1 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +1 -0
  76. package/dist/theme/defineTheme.d.ts +2 -6
  77. package/dist/theme/defineTheme.d.ts.map +1 -1
  78. package/dist/theme/defineTheme.js +1 -1
  79. package/dist/theme/derivedVarRegistry.js +1 -1
  80. package/dist/theme/localTokens.d.ts +8 -11
  81. package/dist/theme/localTokens.d.ts.map +1 -1
  82. package/dist/theme/localTokens.js +17 -71
  83. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  84. package/dist/theme/themeAdaptations.js +4 -4
  85. package/dist/utils/themeProps.d.ts +10 -10
  86. package/dist/utils/themeProps.d.ts.map +1 -1
  87. package/dist/utils/themeProps.js +27 -10
  88. package/locales/en.json +16 -0
  89. package/locales/pseudo.json +12 -0
  90. package/package.json +7 -2
  91. package/src/AppShell/AppShell.test.tsx +36 -0
  92. package/src/AppShell/AppShell.tsx +4 -1
  93. package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
  94. package/src/Banner/Banner.test.tsx +3 -1
  95. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +56 -1
  96. package/src/BottomSheet/BottomSheetSwitcher.spec.md +211 -0
  97. package/src/BottomSheet/BottomSheetSwitcher.test.tsx +134 -2
  98. package/src/BottomSheet/BottomSheetSwitcher.tsx +43 -20
  99. package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +10 -5
  100. package/src/Breadcrumbs/BreadcrumbItem.spec.md +225 -0
  101. package/src/Breadcrumbs/BreadcrumbItem.tsx +8 -13
  102. package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -2
  103. package/src/Breadcrumbs/Breadcrumbs.test.tsx +49 -2
  104. package/src/Center/Center.doc.mjs +32 -28
  105. package/src/Center/Center.spec.md +225 -0
  106. package/src/Center/Center.test.tsx +42 -4
  107. package/src/Center/Center.tsx +24 -17
  108. package/src/Chat/ChatSystemMessage.test.tsx +2 -9
  109. package/src/CodeBlock/CodeBlock.doc.mjs +2 -2
  110. package/src/CodeBlock/CodeBlock.tsx +2 -2
  111. package/src/DateInput/DateInput.test.tsx +4 -4
  112. package/src/DateInput/DateInput.tsx +15 -4
  113. package/src/DateRangeInput/DateRangeInput.test.tsx +2 -2
  114. package/src/DateTimeInput/DateTimeInput.test.tsx +6 -4
  115. package/src/DateTimeInput/DateTimeInput.tsx +18 -7
  116. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +4 -77
  117. package/src/Field/Field.test.tsx +42 -0
  118. package/src/Field/Field.tsx +6 -0
  119. package/src/Field/InputClearButton.test.tsx +35 -1
  120. package/src/Field/InputClearButton.tsx +7 -3
  121. package/src/Field/PanelSearchInput.tsx +21 -8
  122. package/src/FieldStatus/FieldStatus.spec.md +27 -17
  123. package/src/FieldStatus/FieldStatus.test.tsx +7 -5
  124. package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +198 -0
  125. package/src/FieldStatus/__tests__/StatusMessage.a11y.known-failures.ts +13 -0
  126. package/src/FieldStatus/__tests__/StatusMessage.a11y.renders.tsx +305 -0
  127. package/src/FieldStatus/__tests__/StatusMessage.a11y.states.ts +317 -0
  128. package/src/FieldStatus/__tests__/StatusMessage.a11y.test.tsx +155 -0
  129. package/src/FileInput/FileInput.tsx +10 -1
  130. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +3 -3
  131. package/src/HoverCard/HoverCard.doc.mjs +4 -4
  132. package/src/HoverCard/useHoverCard.tsx +2 -2
  133. package/src/Indicator/CheckboxIndicator.tsx +2 -2
  134. package/src/Indicator/Indicator.doc.mjs +2 -2
  135. package/src/Indicator/Indicator.test.tsx +1 -1
  136. package/src/Indicator/RadioIndicator.tsx +2 -2
  137. package/src/Layer/layerStack.ts +20 -9
  138. package/src/Layer/useLayerDismissal.ts +2 -3
  139. package/src/MultiSelector/MultiSelector.test.tsx +4 -4
  140. package/src/NavIcon/NavIcon.doc.mjs +4 -4
  141. package/src/NavIcon/NavIcon.tsx +2 -2
  142. package/src/NumberInput/NumberInput.tsx +18 -7
  143. package/src/Popover/Popover.doc.mjs +10 -10
  144. package/src/Popover/Popover.spec.md +55 -65
  145. package/src/Popover/Popover.test.tsx +29 -0
  146. package/src/Popover/usePopover.doc.mjs +4 -4
  147. package/src/Popover/usePopover.tsx +7 -4
  148. package/src/ProgressBar/ProgressBar.doc.mjs +4 -4
  149. package/src/ProgressBar/ProgressBar.test.tsx +1 -31
  150. package/src/ProgressBar/ProgressBar.tsx +2 -2
  151. package/src/RadioList/RadioList.test.tsx +5 -144
  152. package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +255 -0
  153. package/src/RadioList/__tests__/RadioGroup.a11y.known-failures.ts +12 -0
  154. package/src/RadioList/__tests__/RadioGroup.a11y.renders.tsx +232 -0
  155. package/src/RadioList/__tests__/RadioGroup.a11y.states.ts +503 -0
  156. package/src/RadioList/__tests__/RadioGroup.a11y.test.tsx +217 -0
  157. package/src/ScrollableArea/ScrollableArea.doc.mjs +100 -0
  158. package/src/ScrollableArea/ScrollableArea.spec.md +189 -0
  159. package/src/ScrollableArea/ScrollableArea.test.tsx +299 -0
  160. package/src/ScrollableArea/ScrollableArea.tsx +259 -0
  161. package/src/ScrollableArea/index.ts +26 -0
  162. package/src/ScrollableArea/modules/useScrollableArea.spec.md +121 -0
  163. package/src/SegmentedControl/SegmentedControl.test.tsx +5 -172
  164. package/src/Selector/Selector.test.tsx +4 -4
  165. package/src/Spinner/Spinner.test.tsx +0 -18
  166. package/src/StatusDot/StatusDot.doc.mjs +4 -4
  167. package/src/StatusDot/StatusDot.tsx +2 -2
  168. package/src/TabList/TabList.test.tsx +5 -9
  169. package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +191 -0
  170. package/src/TabList/__tests__/Tabs.a11y.known-failures.ts +45 -0
  171. package/src/TabList/__tests__/Tabs.a11y.renders.tsx +92 -0
  172. package/src/TabList/__tests__/Tabs.a11y.states.ts +247 -0
  173. package/src/TabList/__tests__/Tabs.a11y.test.tsx +153 -0
  174. package/src/Table/Table.doc.mjs +2 -2
  175. package/src/TextArea/TextArea.doc.mjs +4 -4
  176. package/src/TextArea/TextArea.tsx +2 -2
  177. package/src/TextInput/TextInput.doc.mjs +2 -1
  178. package/src/TextInput/TextInput.test.tsx +94 -0
  179. package/src/TextInput/TextInput.tsx +22 -6
  180. package/src/TimeInput/TimeInput.tsx +18 -7
  181. package/src/Toast/ToastViewport.test.tsx +1 -39
  182. package/src/Typeahead/BaseTypeahead.doc.mjs +229 -33
  183. package/src/Typeahead/BaseTypeahead.spec.md +269 -0
  184. package/src/Typeahead/BaseTypeahead.test.tsx +200 -0
  185. package/src/Typeahead/BaseTypeahead.tsx +99 -30
  186. package/src/hooks/index.ts +13 -0
  187. package/src/hooks/scrollGeometry.ts +155 -0
  188. package/src/hooks/scrollOwnerRegistry.ts +47 -0
  189. package/src/hooks/useFocusTrap.ts +22 -11
  190. package/src/hooks/useFocusTrapEscapeShim.test.tsx +4 -3
  191. package/src/hooks/useScrollableArea.doc.mjs +108 -0
  192. package/src/hooks/useScrollableArea.test.tsx +437 -0
  193. package/src/hooks/useScrollableArea.ts +469 -0
  194. package/src/index.ts +1 -0
  195. package/src/theme/defineTheme.test.ts +65 -105
  196. package/src/theme/defineTheme.ts +3 -9
  197. package/src/theme/derivedVarRegistry.ts +1 -1
  198. package/src/theme/localTokens.ts +25 -96
  199. package/src/theme/publicThemeHelperContract.test.ts +2 -2
  200. package/src/theme/themeAdaptations.test.ts +16 -42
  201. package/src/theme/themeAdaptations.ts +6 -9
  202. package/src/utils/themeProps.test.ts +29 -10
  203. package/src/utils/themeProps.ts +36 -17
@@ -0,0 +1,24 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** Private DOM registry used by future axis-aware Sticky consumers. */
4
+
5
+ const owners = new WeakMap();
6
+ export function registerScrollOwner(element, state) {
7
+ owners.set(element, state);
8
+ }
9
+ export function unregisterScrollOwner(element) {
10
+ owners.delete(element);
11
+ }
12
+ export function getRegisteredScrollOwnerState(element) {
13
+ return owners.get(element);
14
+ }
15
+ export function findNearestScrollOwner(element, axis) {
16
+ let candidate = element.parentElement;
17
+ while (candidate != null) {
18
+ if (owners.get(candidate)?.[axis].isScrollable === true) {
19
+ return candidate;
20
+ }
21
+ candidate = candidate.parentElement;
22
+ }
23
+ return null;
24
+ }
@@ -8,6 +8,14 @@
8
8
  * stack rather than ask whether a trap exists.
9
9
  */
10
10
  export declare function hasActiveFocusTrapEscape(): boolean;
11
+ /**
12
+ * Keep the deprecated `hasActiveFocusTrapEscape` signal accurate for a focus
13
+ * trap whose Escape is coordinated by another registration in the shared
14
+ * stack. This hook is intentionally internal (not re-exported from `hooks`): it
15
+ * preserves the released read-only compatibility signal without creating a
16
+ * second dismissal owner.
17
+ */
18
+ export declare function useFocusTrapEscapeCompatibilitySignal(isActive: boolean): void;
11
19
  /**
12
20
  * Configuration for focus trap behavior
13
21
  */
@@ -1 +1 @@
1
- {"version":3,"file":"useFocusTrap.d.ts","sourceRoot":"","sources":["../../src/hooks/useFocusTrap.ts"],"names":[],"mappings":"AA8BA;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAgFD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACrE;;OAEG;IACH,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC9D,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAAC,CAAC,CAAC,CA0QvB"}
1
+ {"version":3,"file":"useFocusTrap.d.ts","sourceRoot":"","sources":["../../src/hooks/useFocusTrap.ts"],"names":[],"mappings":"AA8BA;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED;;;;;;GAMG;AACH,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAU7E;AAgFD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IACrE;;OAEG;IACH,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,EAC9D,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAAC,CAAC,CAAC,CAkQvB"}
@@ -5,8 +5,8 @@
5
5
  /**
6
6
  * @file useFocusTrap.ts
7
7
  * @input Uses React useCallback, useEffect, useRef
8
- * @output Exports useFocusTrap hook for trapping focus within a container and
9
- * restoring focus to the previously-focused element on deactivation
8
+ * @output Exports useFocusTrap, the deprecated Escape-state shim, and an
9
+ * internal compatibility-signal hook
10
10
  * @position Core hook; used by dialogs, modals, date pickers
11
11
  *
12
12
  * Based on WAI-ARIA dialog pattern:
@@ -39,6 +39,25 @@ export function hasActiveFocusTrapEscape() {
39
39
  return activeEscapeTrapCount > 0;
40
40
  }
41
41
 
42
+ /**
43
+ * Keep the deprecated `hasActiveFocusTrapEscape` signal accurate for a focus
44
+ * trap whose Escape is coordinated by another registration in the shared
45
+ * stack. This hook is intentionally internal (not re-exported from `hooks`): it
46
+ * preserves the released read-only compatibility signal without creating a
47
+ * second dismissal owner.
48
+ */
49
+ export function useFocusTrapEscapeCompatibilitySignal(isActive) {
50
+ useEffect(() => {
51
+ if (!isActive) {
52
+ return;
53
+ }
54
+ activeEscapeTrapCount += 1;
55
+ return () => {
56
+ activeEscapeTrapCount -= 1;
57
+ };
58
+ }, [isActive]);
59
+ }
60
+
42
61
  /**
43
62
  * Whether an element is currently perceivable/focusable — excludes ones hidden
44
63
  * via `display:none`/`visibility:hidden` or inside an `inert`/`hidden` subtree,
@@ -185,15 +204,7 @@ export function useFocusTrap(options) {
185
204
  // still resolve in the right order.
186
205
  getContainer: () => containerRef.current
187
206
  });
188
- useEffect(() => {
189
- if (!isEscapeTrap) {
190
- return;
191
- }
192
- activeEscapeTrapCount += 1;
193
- return () => {
194
- activeEscapeTrapCount -= 1;
195
- };
196
- }, [isEscapeTrap]);
207
+ useFocusTrapEscapeCompatibilitySignal(isEscapeTrap);
197
208
 
198
209
  /**
199
210
  * Focus the first focusable element.
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @file useScrollableArea.ts
3
+ * @input Logical scroll intent, keyboard ownership, caller-owned viewport/content props
4
+ * @output Safe prop getters and stable per-axis effective scroll state
5
+ * @position Canonical behavior core for ScrollableArea and structure-owning adopters
6
+ *
7
+ * SYNC: When modified, update:
8
+ * - /packages/core/src/hooks/useScrollableArea.doc.mjs
9
+ * - /packages/core/src/hooks/useScrollableArea.test.tsx
10
+ * - /packages/core/src/hooks/index.ts
11
+ */
12
+ import { type RefAttributes } from 'react';
13
+ import type { BaseProps } from '../BaseProps';
14
+ export type ScrollAxis = 'inline' | 'block' | 'both';
15
+ export type ScrollOverscroll = 'allow' | 'contain';
16
+ export type ScrollStickyContainment = 'whenScrollable' | 'always';
17
+ export type ScrollKeyboardAccess = {
18
+ owner: 'content';
19
+ } | {
20
+ owner: 'viewport';
21
+ label: string;
22
+ role?: 'group' | 'region';
23
+ };
24
+ export interface ScrollAxisState {
25
+ isScrollable: boolean;
26
+ atStart: boolean;
27
+ atEnd: boolean;
28
+ }
29
+ export interface ScrollableAreaState {
30
+ inline: ScrollAxisState;
31
+ block: ScrollAxisState;
32
+ }
33
+ export interface UseScrollableAreaOptions {
34
+ axis: ScrollAxis;
35
+ keyboardAccess: ScrollKeyboardAccess;
36
+ overscroll?: ScrollOverscroll;
37
+ stickyContainment?: ScrollStickyContainment;
38
+ }
39
+ export type ScrollableElementProps<E extends HTMLElement> = BaseProps<E> & RefAttributes<E>;
40
+ export interface UseScrollableAreaResult {
41
+ getViewportProps<E extends HTMLElement>(props?: ScrollableElementProps<E>): ScrollableElementProps<E>;
42
+ getContentProps<E extends HTMLElement>(props?: ScrollableElementProps<E>): ScrollableElementProps<E>;
43
+ state: ScrollableAreaState;
44
+ }
45
+ /**
46
+ * Adds axis-aware scroll behavior to caller-owned viewport and content boxes.
47
+ * The returned prop getters compose refs and preserve caller props, so spread
48
+ * order cannot detach measurement or override behavior-owned accessibility.
49
+ */
50
+ export declare function useScrollableArea({ axis, keyboardAccess, overscroll, stickyContainment, }: UseScrollableAreaOptions): UseScrollableAreaResult;
51
+ //# sourceMappingURL=useScrollableArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScrollableArea.d.ts","sourceRoot":"","sources":["../../src/hooks/useScrollableArea.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAOL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAiB5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,CAAC;AACnD,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAC5B;IAAC,KAAK,EAAE,SAAS,CAAA;CAAC,GAClB;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAC,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,EAAE,oBAAoB,CAAC;IACrC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,GACtE,aAAa,CAAC,CAAC,CAAC,CAAC;AAEnB,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,CAAC,SAAS,WAAW,EACpC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAChC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC7B,eAAe,CAAC,CAAC,SAAS,WAAW,EACnC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAChC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAiGD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,cAAc,EACd,UAAoB,EACpB,iBAAoC,GACrC,EAAE,wBAAwB,GAAG,uBAAuB,CAwRpD"}
@@ -0,0 +1,287 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
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
9
+ * @position Canonical behavior core for ScrollableArea and structure-owning adopters
10
+ *
11
+ * SYNC: When modified, update:
12
+ * - /packages/core/src/hooks/useScrollableArea.doc.mjs
13
+ * - /packages/core/src/hooks/useScrollableArea.test.tsx
14
+ * - /packages/core/src/hooks/index.ts
15
+ */
16
+ import { useCallback, useMemo, useRef, useState } from 'react';
17
+ import * as stylex from '@stylexjs/stylex';
18
+ import { useIsomorphicLayoutEffect } from "./useIsomorphicLayoutEffect.js";
19
+ import { mergeProps } from "../utils/mergeProps.js";
20
+ import { mergeRefs } from "../utils/mergeRefs.js";
21
+ import { observeResize } from "../utils/sharedResizeObserver.js";
22
+ import { getLogicalAxisMapping, measureLogicalOverflowGeometry, measureLogicalScrollAxis } from "./scrollGeometry.js";
23
+ import { registerScrollOwner, unregisterScrollOwner } from "./scrollOwnerRegistry.js";
24
+ const INACTIVE_AXIS_STATE = {
25
+ isScrollable: false,
26
+ atStart: true,
27
+ atEnd: true
28
+ };
29
+ const INITIAL_STATE = {
30
+ inline: INACTIVE_AXIS_STATE,
31
+ block: INACTIVE_AXIS_STATE
32
+ };
33
+ const INITIAL_OVERFLOW = {
34
+ inline: false,
35
+ block: false
36
+ };
37
+ const INITIAL_MAPPING = {
38
+ inline: 'x',
39
+ block: 'y',
40
+ inlineReversed: false,
41
+ blockReversed: false
42
+ };
43
+ const styles = {
44
+ overflow: (overflowX, overflowY) => [{
45
+ kXHlph: overflowX != null ? "xyto64x" : overflowX,
46
+ kORKVm: overflowY != null ? "x4ncuvb" : overflowY,
47
+ $$css: true
48
+ }, {
49
+ "--x-overflowX": overflowX != null ? overflowX : undefined,
50
+ "--x-overflowY": overflowY != null ? overflowY : undefined
51
+ }]
52
+ };
53
+ function axisIsRequested(requested, axis) {
54
+ return requested === axis || requested === 'both';
55
+ }
56
+ function statesEqual(a, b) {
57
+ return a.inline.isScrollable === b.inline.isScrollable && a.inline.atStart === b.inline.atStart && a.inline.atEnd === b.inline.atEnd && a.block.isScrollable === b.block.isScrollable && a.block.atStart === b.block.atStart && a.block.atEnd === b.block.atEnd;
58
+ }
59
+ function overflowEqual(a, b) {
60
+ return a.inline === b.inline && a.block === b.block;
61
+ }
62
+ function mappingsEqual(a, b) {
63
+ return a.inline === b.inline && a.block === b.block && a.inlineReversed === b.inlineReversed && a.blockReversed === b.blockReversed;
64
+ }
65
+ function withoutOwnedOverflow(style) {
66
+ if (style == null) {
67
+ return undefined;
68
+ }
69
+ const result = {
70
+ ...style
71
+ };
72
+ delete result.overflow;
73
+ delete result.overflowX;
74
+ delete result.overflowY;
75
+ delete result.overflowInline;
76
+ delete result.overflowBlock;
77
+ return result;
78
+ }
79
+ function useStableComposedRef(internalRef) {
80
+ const cachedExternalRef = useRef(undefined);
81
+ const cachedComposedRef = useRef(null);
82
+ return useCallback(externalRef => {
83
+ if (cachedComposedRef.current != null && Object.is(cachedExternalRef.current, externalRef)) {
84
+ return cachedComposedRef.current;
85
+ }
86
+ const composed = mergeRefs(externalRef, internalRef);
87
+ cachedExternalRef.current = externalRef;
88
+ cachedComposedRef.current = composed;
89
+ return composed;
90
+ }, [internalRef]);
91
+ }
92
+
93
+ /**
94
+ * Adds axis-aware scroll behavior to caller-owned viewport and content boxes.
95
+ * The returned prop getters compose refs and preserve caller props, so spread
96
+ * order cannot detach measurement or override behavior-owned accessibility.
97
+ */
98
+ export function useScrollableArea({
99
+ axis,
100
+ keyboardAccess,
101
+ overscroll = 'allow',
102
+ stickyContainment = 'whenScrollable'
103
+ }) {
104
+ const [viewport, setViewport] = useState(null);
105
+ const [content, setContent] = useState(null);
106
+ const [measured, setMeasured] = useState(INITIAL_STATE);
107
+ const [overflow, setOverflow] = useState(INITIAL_OVERFLOW);
108
+ const [mapping, setMapping] = useState(INITIAL_MAPPING);
109
+ const stateRef = useRef(INITIAL_STATE);
110
+ const viewportRef = useCallback(node => {
111
+ setViewport(current => current === node ? current : node);
112
+ }, []);
113
+ const contentRef = useCallback(node => {
114
+ setContent(current => current === node ? current : node);
115
+ }, []);
116
+ const getComposedViewportRef = useStableComposedRef(viewportRef);
117
+ const getComposedContentRef = useStableComposedRef(contentRef);
118
+ useIsomorphicLayoutEffect(() => {
119
+ if (viewport == null || content == null) {
120
+ return;
121
+ }
122
+ let frame = null;
123
+ let isActive = true;
124
+ const measure = () => {
125
+ frame = null;
126
+ const computedStyle = getComputedStyle(viewport);
127
+ const nextMapping = getLogicalAxisMapping(computedStyle.writingMode, computedStyle.direction);
128
+ const inlineOverflow = axisIsRequested(axis, 'inline') ? measureLogicalOverflowGeometry(viewport, 'inline', nextMapping) : false;
129
+ const blockOverflow = axisIsRequested(axis, 'block') ? measureLogicalOverflowGeometry(viewport, 'block', nextMapping) : false;
130
+ const inline = axisIsRequested(axis, 'inline') ? measureLogicalScrollAxis(viewport, 'inline', nextMapping) : INACTIVE_AXIS_STATE;
131
+ const block = axisIsRequested(axis, 'block') ? measureLogicalScrollAxis(viewport, 'block', nextMapping) : INACTIVE_AXIS_STATE;
132
+
133
+ // Hidden, disconnected, and zero-size viewports are unknown rather than
134
+ // fitting. Keep the last valid state until a bounded signal remeasures.
135
+ if (inlineOverflow == null || blockOverflow == null || inline == null || block == null) {
136
+ return;
137
+ }
138
+ const nextOverflow = {
139
+ inline: inlineOverflow,
140
+ block: blockOverflow
141
+ };
142
+ const nextState = {
143
+ inline,
144
+ block
145
+ };
146
+ stateRef.current = nextState;
147
+ registerScrollOwner(viewport, nextState);
148
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- measured DOM geometry controls whether the viewport becomes a CSS scroll container
149
+ setOverflow(current => overflowEqual(current, nextOverflow) ? current : nextOverflow);
150
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- measured DOM state is the hook's output
151
+ setMeasured(current => statesEqual(current, nextState) ? current : nextState);
152
+ // eslint-disable-next-line @eslint-react/set-state-in-effect -- writing-mode changes remap behavior-owned physical CSS
153
+ setMapping(current => mappingsEqual(current, nextMapping) ? current : nextMapping);
154
+ };
155
+ const scheduleMeasure = () => {
156
+ if (!isActive || frame != null) {
157
+ return;
158
+ }
159
+ frame = window.requestAnimationFrame(measure);
160
+ };
161
+ registerScrollOwner(viewport, stateRef.current);
162
+ measure();
163
+ const stopObservingViewport = observeResize(viewport, scheduleMeasure);
164
+ const stopObservingContent = observeResize(content, scheduleMeasure);
165
+ viewport.addEventListener('scroll', scheduleMeasure, {
166
+ passive: true
167
+ });
168
+ window.addEventListener('resize', scheduleMeasure);
169
+ window.visualViewport?.addEventListener('resize', scheduleMeasure);
170
+ content.addEventListener('load', scheduleMeasure, true);
171
+ viewport.addEventListener('transitionend', scheduleMeasure);
172
+ viewport.addEventListener('animationend', scheduleMeasure);
173
+ content.addEventListener('transitionend', scheduleMeasure);
174
+ content.addEventListener('animationend', scheduleMeasure);
175
+ const mutationObserver = typeof MutationObserver === 'undefined' ? null : new MutationObserver(scheduleMeasure);
176
+ mutationObserver?.observe(viewport, {
177
+ attributes: true,
178
+ attributeFilter: ['class', 'dir', 'hidden', 'style']
179
+ });
180
+ mutationObserver?.observe(content, {
181
+ attributes: true,
182
+ attributeFilter: ['class', 'dir', 'hidden', 'style'],
183
+ characterData: true,
184
+ childList: true,
185
+ subtree: true
186
+ });
187
+ let ancestor = viewport.parentElement;
188
+ while (ancestor != null) {
189
+ mutationObserver?.observe(ancestor, {
190
+ attributes: true,
191
+ attributeFilter: ['class', 'dir', 'hidden', 'style']
192
+ });
193
+ ancestor = ancestor.parentElement;
194
+ }
195
+ const fonts = document.fonts;
196
+ fonts?.addEventListener?.('loadingdone', scheduleMeasure);
197
+ void fonts?.ready.then(scheduleMeasure);
198
+ return () => {
199
+ isActive = false;
200
+ unregisterScrollOwner(viewport);
201
+ stopObservingViewport();
202
+ stopObservingContent();
203
+ mutationObserver?.disconnect();
204
+ viewport.removeEventListener('scroll', scheduleMeasure);
205
+ window.removeEventListener('resize', scheduleMeasure);
206
+ window.visualViewport?.removeEventListener('resize', scheduleMeasure);
207
+ content.removeEventListener('load', scheduleMeasure, true);
208
+ viewport.removeEventListener('transitionend', scheduleMeasure);
209
+ viewport.removeEventListener('animationend', scheduleMeasure);
210
+ content.removeEventListener('transitionend', scheduleMeasure);
211
+ content.removeEventListener('animationend', scheduleMeasure);
212
+ fonts?.removeEventListener?.('loadingdone', scheduleMeasure);
213
+ if (frame != null) {
214
+ window.cancelAnimationFrame(frame);
215
+ }
216
+ };
217
+ }, [axis, content, viewport]);
218
+ const state = useMemo(() => ({
219
+ inline: axisIsRequested(axis, 'inline') ? measured.inline : INACTIVE_AXIS_STATE,
220
+ block: axisIsRequested(axis, 'block') ? measured.block : INACTIVE_AXIS_STATE
221
+ }), [axis, measured]);
222
+ const getViewportProps = useCallback((props = {}) => {
223
+ const hasEffectiveAxis = state.inline.isScrollable || state.block.isScrollable;
224
+ const requestedX = axisIsRequested(axis, 'inline') && mapping.inline === 'x' || axisIsRequested(axis, 'block') && mapping.block === 'x';
225
+ const requestedY = axisIsRequested(axis, 'inline') && mapping.inline === 'y' || axisIsRequested(axis, 'block') && mapping.block === 'y';
226
+ const overflowingX = overflow.inline && mapping.inline === 'x' || overflow.block && mapping.block === 'x';
227
+ const overflowingY = overflow.inline && mapping.inline === 'y' || overflow.block && mapping.block === 'y';
228
+ const containsSticky = overflowingX || overflowingY || stickyContainment === 'always';
229
+ const scrollsOnX = stickyContainment === 'always' ? requestedX : overflowingX;
230
+ const scrollsOnY = stickyContainment === 'always' ? requestedY : overflowingY;
231
+ const {
232
+ xstyle,
233
+ ...domProps
234
+ } = props;
235
+ const callerProps = {
236
+ ...domProps,
237
+ style: withoutOwnedOverflow(domProps.style)
238
+ };
239
+ const styledProps = mergeProps(callerProps, stylex.props(xstyle, styles.overflow(containsSticky ? scrollsOnX ? 'auto' : 'hidden' : 'clip', containsSticky ? scrollsOnY ? 'auto' : 'hidden' : 'clip')));
240
+ const keepsProgrammaticFocus = !hasEffectiveAxis && viewport != null && typeof document !== 'undefined' && document.activeElement === viewport;
241
+ const behaviorStyle = {
242
+ ...styledProps.style
243
+ };
244
+ const containInline = overscroll === 'contain' && state.inline.isScrollable;
245
+ const containBlock = overscroll === 'contain' && state.block.isScrollable;
246
+ const inlinePhysical = mapping.inline;
247
+ const blockPhysical = mapping.block;
248
+ if (axisIsRequested(axis, 'inline')) {
249
+ behaviorStyle[inlinePhysical === 'x' ? 'overscrollBehaviorX' : 'overscrollBehaviorY'] = containInline ? 'contain' : 'auto';
250
+ }
251
+ if (axisIsRequested(axis, 'block')) {
252
+ behaviorStyle[blockPhysical === 'x' ? 'overscrollBehaviorX' : 'overscrollBehaviorY'] = containBlock ? 'contain' : 'auto';
253
+ }
254
+ const keyboardProps = keyboardAccess.owner === 'viewport' ? {
255
+ role: keyboardAccess.role ?? 'group',
256
+ 'aria-label': keyboardAccess.label,
257
+ tabIndex: hasEffectiveAxis ? 0 : keepsProgrammaticFocus ? -1 : undefined
258
+ } : {};
259
+ const result = {
260
+ ...styledProps,
261
+ ...keyboardProps,
262
+ ref: getComposedViewportRef(styledProps.ref),
263
+ style: behaviorStyle,
264
+ 'data-scroll-axis': axis,
265
+ 'data-scrollable-inline': state.inline.isScrollable ? 'true' : undefined,
266
+ 'data-scrollable-block': state.block.isScrollable ? 'true' : undefined,
267
+ 'data-scroll-inline-start': state.inline.atStart ? 'true' : undefined,
268
+ 'data-scroll-inline-end': state.inline.atEnd ? 'true' : undefined,
269
+ 'data-scroll-block-start': state.block.atStart ? 'true' : undefined,
270
+ 'data-scroll-block-end': state.block.atEnd ? 'true' : undefined
271
+ };
272
+ return result;
273
+ }, [axis, getComposedViewportRef, keyboardAccess, mapping, overflow, overscroll, state, stickyContainment, viewport]);
274
+ const getContentProps = useCallback((props = {}) => {
275
+ const result = {
276
+ ...props,
277
+ ref: getComposedContentRef(props.ref),
278
+ 'data-scroll-content': ''
279
+ };
280
+ return result;
281
+ }, [getComposedContentRef]);
282
+ return {
283
+ getViewportProps,
284
+ getContentProps,
285
+ state
286
+ };
287
+ }
package/dist/index.d.ts CHANGED
@@ -35,6 +35,7 @@ export * from './CheckboxList';
35
35
  export * from './Collapsible';
36
36
  export * from './RadioList';
37
37
  export * from './Resizable';
38
+ export * from './ScrollableArea';
38
39
  export * from './Divider';
39
40
  export * from './VisuallyHidden';
40
41
  export * from './EmptyState';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAGH,YAAY,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAG3C,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAE1B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAG3B,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC;AACzC,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAG9B,cAAc,UAAU,CAAC;AAGzB,OAAO,EAAC,QAAQ,EAAC,MAAM,SAAS,CAAC;AACjC,YAAY,EACV,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AACtC,YAAY,EAAC,kBAAkB,EAAE,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAGlE,OAAO,EAAC,KAAK,EAAE,QAAQ,EAAC,MAAM,SAAS,CAAC;AACxC,YAAY,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,SAAS,CAAC;AAGjB,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC;AAG1B,cAAc,YAAY,CAAC;AAG3B,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC;AAG1B,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAG1B,cAAc,gBAAgB,CAAC;AAG/B,cAAc,SAAS,CAAC;AAGxB,cAAc,SAAS,CAAC;AAGxB,YAAY,EAAC,YAAY,EAAC,MAAM,QAAQ,CAAC;AACzC,cAAc,SAAS,CAAC;AAGxB,cAAc,QAAQ,CAAC"}
package/dist/index.js CHANGED
@@ -41,6 +41,7 @@ export * from "./CheckboxList/index.js";
41
41
  export * from "./Collapsible/index.js";
42
42
  export * from "./RadioList/index.js";
43
43
  export * from "./Resizable/index.js";
44
+ export * from "./ScrollableArea/index.js";
44
45
  export * from "./Divider/index.js";
45
46
  export * from "./VisuallyHidden/index.js";
46
47
  export * from "./EmptyState/index.js";
@@ -247,12 +247,8 @@ export interface DefineThemeInput {
247
247
  * Values can be a string or [light, dark] tuple.
248
248
  * Only include tokens you want to override; defaults fill the rest. */
249
249
  tokens?: Partial<Record<TokenName, TokenValue>>;
250
- /**
251
- * Theme-family-local CSS custom properties. Keys use the complete
252
- * `--astryx-theme-${name}-...` spelling and values follow `TokenValue`.
253
- * These names are available only to this enrolled theme lineage and do not
254
- * become portable `TokenName` values.
255
- */
250
+ /** Theme-family-local values keyed by any valid CSS custom-property name;
251
+ * prefixes do not establish ownership. */
256
252
  localTokens?: Record<string, TokenValue>;
257
253
  /**
258
254
  * Component style overrides — keyed by component name (lowercase).
@@ -1 +1 @@
1
- {"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,QAAQ,EAAE,kBAAkB,EAAC,MAAM,4BAA4B,CAAC;AAE7E;;;GAGG;AACH,KAAK,kBAAkB,GAAG,OAAO,CAC/B,MAAM,CAAC,QAAQ,GAAG,kBAAkB,EAAE,SAAS,CAAC,CACjD,CAAC;AACF,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAC9C,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAIL,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,UAAU,CAAC;AAQpD,wCAAwC;AACxC,MAAM,MAAM,aAAa,GACrB,MAAM,OAAO,aAAa,GAC1B,MAAM,OAAO,eAAe,GAC5B,MAAM,OAAO,YAAY,GACzB,MAAM,OAAO,cAAc,GAC3B,MAAM,OAAO,aAAa,GAC1B,MAAM,OAAO,cAAc,GAC3B,MAAM,OAAO,cAAc,GAC3B,MAAM,OAAO,gBAAgB,GAC7B,MAAM,OAAO,YAAY,GACzB,MAAM,OAAO,kBAAkB,GAC/B,MAAM,OAAO,gBAAgB,GAC7B,MAAM,OAAO,kBAAkB,GAC/B,MAAM,OAAO,iBAAiB,CAAC;AAEnC,0DAA0D;AAC1D,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,eAAe,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAE/E,2BAA2B;AAC3B,MAAM,WAAW,gBAAgB;IAC/B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoCG;IACH,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB;;4EAEwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAChD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;CAChC;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,gCAAgC;IAChC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,oBAAoB;IACpB,KAAK,CAAC,EAAE,kBAAkB,CAAC;IAC3B,sEAAsE;IACtE,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,kEAAkE;IAClE,OAAO,CAAC,EAAE,IAAI,CAAC;IACf;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACpD,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B;;;OAGG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,0BAA0B,CAAC;IAC3C,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,2BAA2B,EAAE,CAAC;IAClD,qFAAqF;IACrF,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,kEAAkE;AAClE,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG;IAChD,aAAa,EAAE,0BAA0B,CAAC;IAC1C,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAMF,qFAAqF;AACrF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAehD,CAAC;AAwBF;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,oBAAoB,CA+GzE;AAMD,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAC;AAM9B,2DAA2D;AAC3D,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAQpE"}
1
+ {"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"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"}
@@ -226,7 +226,7 @@ export function defineTheme(input) {
226
226
  // media-surface value stays more specific in the authored cascade.
227
227
  const __onDark = resolveOnMedia('dark', input.onDark, base?.__onDark);
228
228
  const __onLight = resolveOnMedia('light', input.onLight, base?.__onLight);
229
- const localTokenContract = resolveLocalTokenContract(input, base, tokens, components, __onDark, __onLight);
229
+ const localTokenContract = resolveLocalTokenContract(input, base, tokens, tokenDefaults);
230
230
 
231
231
  // Adaptations inherit their breakpoint map and ordered rules. Every rule is
232
232
  // re-resolved against this theme's effective root axes, so a child can change
@@ -126,7 +126,7 @@ export const derivedVarRegistry = {
126
126
  * the old key still selects the element. Without this the rule would land but
127
127
  * its derived vars would not expand, and the half that travels through a var
128
128
  * (a hover card's radius, a text area's inline padding) would silently do
129
- * nothing. Drop these with the classes, in the next major.
129
+ * nothing. Keep these aliases aligned with the emitted compatibility classes.
130
130
  */
131
131
  const DEPRECATED_REGISTRY_KEYS = {
132
132
  hovercard: 'hover-card',
@@ -1,14 +1,11 @@
1
1
  /**
2
2
  * @file localTokens.ts
3
3
  * @input Root and adaptation theme-local token declarations and references
4
- * @output Validated enrollment metadata plus normalized conditional writes
5
- * @position Theme-local namespace owner; final adaptation-cycle validation is
4
+ * @output Validated exact-name ownership metadata plus normalized conditional writes
5
+ * @position Theme-local ownership boundary; final adaptation-cycle validation is
6
6
  * performed after the reachable ordered cascade is assembled.
7
7
  */
8
- import type { ComponentStyleMap, DefinedTheme, TokenValue } from './defineTheme';
9
- import type { ResolvedOnMedia } from './onMediaTokens';
10
- /** Whether a custom-property name belongs to Astryx's reserved local namespace. */
11
- export declare function isReservedThemeLocalTokenName(name: string): boolean;
8
+ import type { DefinedTheme, TokenValue } from './defineTheme';
12
9
  export interface ResolvedLocalTokenContract {
13
10
  localTokens: Record<string, string>;
14
11
  owners: Record<string, string>;
@@ -19,18 +16,18 @@ export declare function assertNoTokenCycles(tokenValues: Record<string, string>,
19
16
  * Resolve and validate the opt-in theme-local token contract.
20
17
  *
21
18
  * Themes that omit `localTokens` and do not extend an enrolled base bypass this
22
- * function's reserved-namespace checks so legacy token behavior stays intact.
19
+ * function's exact owner and lineage checks so legacy token behavior stays intact.
23
20
  */
24
21
  export declare function resolveLocalTokenContract(input: {
25
22
  name: string;
26
23
  localTokens?: Record<string, TokenValue>;
27
- }, base: DefinedTheme | undefined, tokens: Record<string, string>, components: ComponentStyleMap | undefined, onDark: ResolvedOnMedia | undefined, onLight: ResolvedOnMedia | undefined): ResolvedLocalTokenContract | undefined;
24
+ }, base: DefinedTheme | undefined, tokens: Record<string, string>, portableTokens: Readonly<Record<string, string>>): ResolvedLocalTokenContract | undefined;
28
25
  /**
29
26
  * Resolve theme-local values written by one adaptation rule.
30
27
  *
31
28
  * Adaptations may replace names already enrolled by the root theme lineage, but
32
- * they never enroll names of their own. This validates one rule's references;
33
- * cycle validation waits until all co-matching writes have cascaded in order.
29
+ * they never enroll names of their own. Cycle validation waits until all
30
+ * co-matching writes have cascaded in order.
34
31
  */
35
- export declare function resolveAdaptationLocalTokens(themeName: string, ruleIndex: number, declarations: Record<string, TokenValue> | undefined, rootLocalTokens: Record<string, string> | undefined, tokens: Record<string, string>, components: ComponentStyleMap | undefined): Record<string, string> | undefined;
32
+ export declare function resolveAdaptationLocalTokens(themeName: string, ruleIndex: number, declarations: Record<string, TokenValue> | undefined, rootLocalTokens: Record<string, string> | undefined): Record<string, string> | undefined;
36
33
  //# sourceMappingURL=localTokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"localTokens.d.ts","sourceRoot":"","sources":["../../src/theme/localTokens.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,iBAAiB,EAAE,YAAY,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAC/E,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,iBAAiB,CAAC;AAOrD,mFAAmF;AACnF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAqED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,IAAI,CA4GN;AA6ED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC1C,EACD,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,UAAU,EAAE,iBAAiB,GAAG,SAAS,EACzC,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,OAAO,EAAE,eAAe,GAAG,SAAS,GACnC,0BAA0B,GAAG,SAAS,CAwExC;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,EACpD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,UAAU,EAAE,iBAAiB,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CA+CpC"}
1
+ {"version":3,"file":"localTokens.d.ts","sourceRoot":"","sources":["../../src/theme/localTokens.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,YAAY,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAY5D,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAuDD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,IAAI,CA4GN;AAwDD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC1C,EACD,IAAI,EAAE,YAAY,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC9B,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC/C,0BAA0B,GAAG,SAAS,CAgExC;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,EACpD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAClD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAwBpC"}