@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
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../src/TextInput/TextInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextInput.d.ts","sourceRoot":"","sources":["../../src/TextInput/TextInput.tsx"],"names":[],"mappings":"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"}
@@ -24,7 +24,7 @@ import { renderIconSlot } from "../Icon/index.js";
24
24
  import { Spinner } from "../Spinner/index.js";
25
25
  import { useTooltip } from "../Tooltip/index.js";
26
26
  import { VisuallyHidden } from "../VisuallyHidden/index.js";
27
- import { getInputARIA } from "../utils/index.js";
27
+ import { getInputARIA, isImeKeyEvent } from "../utils/index.js";
28
28
  const sizeStyles = {
29
29
  sm: {
30
30
  kZKoxP: "x6k0iem",
@@ -160,9 +160,19 @@ export function TextInput({
160
160
  };
161
161
 
162
162
  // Handle clear button click
163
- const handleClear = useCallback(() => {
163
+ const handleClear = useCallback(e => {
164
164
  onChange?.('', null);
165
- inputRef.current?.focus();
165
+ if (!e || e.detail === 0) {
166
+ inputRef.current?.focus();
167
+ } else {
168
+ // Defer focus restoration past the button's unmount task so iOS Safari
169
+ // and touch browsers don't jump the page scroll to 0 on tap.
170
+ requestAnimationFrame(() => {
171
+ inputRef.current?.focus({
172
+ preventScroll: true
173
+ });
174
+ });
175
+ }
166
176
  }, [onChange]);
167
177
 
168
178
  // Focus input when clicking anywhere on the wrapper (icons, padding, etc.)
@@ -205,7 +215,12 @@ export function TextInput({
205
215
  value: optimisticValue,
206
216
  onChange: handleChange,
207
217
  onKeyDown: onEnter || onKeyDown ? e => {
208
- if (e.key === 'Enter') {
218
+ // The composing keydown fires before compositionend, so without
219
+ // this guard pressing Enter to commit a Japanese/Chinese/Korean
220
+ // IME conversion would trigger onEnter (submit/save actions)
221
+ // before the user intends to submit. onKeyDown still receives
222
+ // the raw event. See utils/ime.ts (#6082).
223
+ if (e.key === 'Enter' && !isImeKeyEvent(e.nativeEvent)) {
209
224
  onEnter?.();
210
225
  }
211
226
  onKeyDown?.(e);
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../../src/TimeInput/TimeInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../../src/TimeInput/TimeInput.tsx"],"names":[],"mappings":"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"}
@@ -317,11 +317,21 @@ export function TimeInput({
317
317
  }, [value, hasSeconds, increment, min, max, fireChange, isDisabled, announce, formatDisplayTime]);
318
318
 
319
319
  // Handle clear button click
320
- const handleClear = useCallback(() => {
320
+ const handleClear = useCallback(e => {
321
321
  fireChange(undefined);
322
322
  // Focusing a native time control reopens the OS picker on iOS.
323
323
  if (!usesNativeTimePicker) {
324
- inputRef.current?.focus();
324
+ if (!e || e.detail === 0) {
325
+ inputRef.current?.focus();
326
+ } else {
327
+ // Defer focus restoration past the button's unmount task so iOS Safari
328
+ // and touch browsers don't jump the page scroll to 0 on tap.
329
+ requestAnimationFrame(() => {
330
+ inputRef.current?.focus({
331
+ preventScroll: true
332
+ });
333
+ });
334
+ }
325
335
  }
326
336
  }, [fireChange, usesNativeTimePicker]);
327
337
 
@@ -48,7 +48,7 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<BaseP
48
48
  * @default 10
49
49
  */
50
50
  maxMenuItems?: number;
51
- /** Fixed dropdown width in pixels. Never shrinks below the anchor width. */
51
+ /** Requested dropdown width in pixels before viewport clamping. */
52
52
  menuWidth?: number;
53
53
  /**
54
54
  * Minimum query length before the search source is queried. Below it no
@@ -56,8 +56,8 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<BaseP
56
56
  * for a result set that cannot be meaningful yet — and the user does not
57
57
  * see "no results" for a query that was never searched.
58
58
  *
59
- * Measured with `String.length` (UTF-16 code units), like every other
60
- * length check in the library.
59
+ * Measured by grapheme cluster, so one visible character counts once even
60
+ * when JavaScript represents it with multiple UTF-16 code units.
61
61
  *
62
62
  * @default 1 — every non-empty query is searched.
63
63
  */
@@ -76,8 +76,10 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<BaseP
76
76
  * When disabled with a reason, keeps the input focusable via `aria-disabled`
77
77
  * (instead of the native `disabled` attribute) and `readOnly` so an
78
78
  * associated disabled-reason tooltip stays discoverable by keyboard and
79
- * assistive technology. Value mutation is still blocked by the `isDisabled`
80
- * guards. Consumers (Typeahead) own the tooltip and wrapper.
79
+ * assistive technology. Query and text mutation are blocked, but an
80
+ * already-open highlighted option can still be selected with Enter after a
81
+ * transition into this state. Consumers (Typeahead) own the tooltip and
82
+ * wrapper.
81
83
  * @default false
82
84
  */
83
85
  isFocusableDisabled?: boolean;
@@ -122,15 +124,18 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<BaseP
122
124
  */
123
125
  debounceMs?: number;
124
126
  /**
125
- * ID for the input element (for label association).
127
+ * Legacy input-specific alias for the native `id` prop. When provided, this
128
+ * alias takes precedence; otherwise the native prop is preserved.
126
129
  */
127
130
  inputId?: string;
128
131
  /**
129
- * Additional aria-describedby IDs.
132
+ * Legacy input-specific alias for native `aria-describedby`. When provided,
133
+ * this alias takes precedence; otherwise the native prop is preserved.
130
134
  */
131
135
  ariaDescribedBy?: string;
132
136
  /**
133
- * Additional aria-labelledby IDs.
137
+ * Legacy input-specific alias for native `aria-labelledby`. When provided,
138
+ * this alias takes precedence; otherwise the native prop is preserved.
134
139
  */
135
140
  ariaLabelledBy?: string;
136
141
  /**
@@ -138,12 +143,13 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<BaseP
138
143
  */
139
144
  inputXStyle?: StyleXStyles;
140
145
  /**
141
- * Tab-order override for the input element. Typeahead passes `-1` while
142
- * its selected-value token is shown: the input is visually collapsed
143
- * (width 0 / opacity 0) but must stay programmatically focusable for
144
- * token edit/clear interactions, so removing it from the Tab order is
145
- * what prevents an invisible tab stop (WCAG 2.4.3 / 2.4.7). The input
146
- * remains focusable via `.focus()` regardless of this value.
146
+ * Legacy input-specific alias for native `tabIndex`. When provided, this
147
+ * alias takes precedence; otherwise the native prop is preserved. Typeahead
148
+ * passes `-1` while its selected-value token is shown: the input is visually
149
+ * collapsed (width 0 / opacity 0) but must stay programmatically focusable
150
+ * for token edit/clear interactions, so removing it from the Tab order is
151
+ * what prevents an invisible tab stop (WCAG 2.4.3 / 2.4.7). The input remains
152
+ * focusable via `.focus()` regardless of this value.
147
153
  */
148
154
  inputTabIndex?: number;
149
155
  /**
@@ -178,6 +184,7 @@ export interface BaseTypeaheadProps<T extends SearchableItem> extends Omit<BaseP
178
184
  * searchSource={source}
179
185
  * value={selected}
180
186
  * onChange={setSelected}
187
+ * aria-label="Search frameworks"
181
188
  * anchorRef={wrapperRef}
182
189
  * placeholder="Search..."
183
190
  * />
@@ -1 +1 @@
1
- {"version":3,"file":"BaseTypeahead.d.ts","sourceRoot":"","sources":["../../src/Typeahead/BaseTypeahead.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAMZ,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAkBnD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAS1D,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,IAAI,CACxE,SAAS,CAAC,WAAW,CAAC,EACtB,UAAU,CACX;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAE9B;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnC;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC;IAEpC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAEtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;IAE3B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE1C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAE/D;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAoID;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,EA+rBrB,CAAC,CAAC,SAAS,cAAc,EAC5B,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KACzB,KAAK,CAAC,YAAY,CAAC"}
1
+ {"version":3,"file":"BaseTypeahead.d.ts","sourceRoot":"","sources":["../../src/Typeahead/BaseTypeahead.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAMZ,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAyBnD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAS1D,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,IAAI,CACxE,SAAS,CAAC,WAAW,CAAC,EACtB,UAAU,CACX;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAE9B;;OAEG;IACH,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAEhB;;OAEG;IACH,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAEnC;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC;IAEpC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;OAUG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;;;OASG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAExC;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IAEtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,YAAY,CAAC;IAE3B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE1C;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAE/D;;;;OAIG;IACH,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AA+JD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,aAAa,EA2tBrB,CAAC,CAAC,SAAS,cAAc,EAC5B,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,KACzB,KAAK,CAAC,YAAY,CAAC"}
@@ -28,8 +28,8 @@ import { TypeaheadItem } from "./TypeaheadItem.js";
28
28
  import { Icon } from "../Icon/index.js";
29
29
  import { Spinner } from "../Spinner/index.js";
30
30
  import "../theme/tokens.stylex.js";
31
- import { colorVars, spacingVars, radiusVars, typographyVars, fontWeightVars, typeScaleVars } from "../theme/tokens.stylex.js";
32
- import { getKey, groupItems, mergeProps } from "../utils/index.js";
31
+ import { borderVars, colorVars, spacingVars, radiusVars, typographyVars, fontWeightVars, typeScaleVars } from "../theme/tokens.stylex.js";
32
+ import { characterCount, composeEventHandlers, getKey, groupItems, mergeProps } from "../utils/index.js";
33
33
  import { themeProps } from "../utils/themeProps.js";
34
34
  import { useTranslator } from "../i18n/index.js";
35
35
  import { useMergedRefs } from "../hooks/useMergedRefs.js";
@@ -37,14 +37,17 @@ import { useMergedRefs } from "../hooks/useMergedRefs.js";
37
37
  // Types
38
38
  // =============================================================================
39
39
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
40
- const _temp = {
41
- kzqmXN: "x5lhr3w",
42
- "$$css": true
43
- };
44
40
  // =============================================================================
45
41
  // Styles
46
42
  // =============================================================================
47
43
 
44
+ const TYPEAHEAD_VIEWPORT_GUTTER = spacingVars['--spacing-4'];
45
+ const TYPEAHEAD_POSITION_AREA_MAX_INLINE_SIZE = `calc(100% - max(${TYPEAHEAD_VIEWPORT_GUTTER}, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px)))`;
46
+ const TYPEAHEAD_POSITION_AREA_MAX_INLINE_SIZE_FALLBACK = `calc(100% - ${TYPEAHEAD_VIEWPORT_GUTTER})`;
47
+ const _temp = {
48
+ kzqmXN: "x5lhr3w",
49
+ "$$css": true
50
+ };
48
51
  const styles = {
49
52
  input: {
50
53
  k1xSpc: "x1lliihq",
@@ -67,7 +70,9 @@ const styles = {
67
70
  $$css: true
68
71
  },
69
72
  popover: {
73
+ kB7OPa: "x9f619",
70
74
  k7Eaqz: "xrzjruh",
75
+ ks0D6T: "xbd96yr",
71
76
  $$css: true
72
77
  },
73
78
  popoverCustomWidth: width => [_temp, {
@@ -88,11 +93,19 @@ const styles = {
88
93
  },
89
94
  itemHighlighted: {
90
95
  kWkggS: "x1lmrjuc",
96
+ kjBf7l: "x1x84bn5",
97
+ k3XXqK: "x815t2r",
98
+ kMeerF: "x1xvue0r",
91
99
  $$css: true
92
100
  },
93
101
  itemSelected: {
94
102
  k63SB2: "x1e4wzip",
95
103
  $$css: true
104
+ },
105
+ defaultItem: {
106
+ k7Eaqz: "xeuugli",
107
+ kzqmXN: "xh8yej3",
108
+ $$css: true
96
109
  }
97
110
  };
98
111
 
@@ -127,7 +140,8 @@ const itemSizeStyles = {
127
140
  * untouched state, and `hasEntriesOnFocus` owns what happens there.
128
141
  */
129
142
  function isBelowMinQueryLength(query, minQueryLength) {
130
- return query.length > 0 && query.length < minQueryLength;
143
+ const length = characterCount(query);
144
+ return length > 0 && length < minQueryLength;
131
145
  }
132
146
 
133
147
  // =============================================================================
@@ -148,6 +162,7 @@ function isBelowMinQueryLength(query, minQueryLength) {
148
162
  * searchSource={source}
149
163
  * value={selected}
150
164
  * onChange={setSelected}
165
+ * aria-label="Search frameworks"
151
166
  * anchorRef={wrapperRef}
152
167
  * placeholder="Search..."
153
168
  * />
@@ -179,13 +194,29 @@ export const BaseTypeahead = function BaseTypeahead({
179
194
  onKeyDown: externalOnKeyDown,
180
195
  debounceMs = 150,
181
196
  size = 'md',
182
- ref
197
+ xstyle,
198
+ className,
199
+ style,
200
+ onPointerDown: onPointerDownProp,
201
+ onFocus: onFocusProp,
202
+ onBlur: onBlurProp,
203
+ id: nativeInputId,
204
+ 'aria-describedby': nativeAriaDescribedBy,
205
+ 'aria-labelledby': nativeAriaLabelledBy,
206
+ tabIndex: nativeInputTabIndex,
207
+ ref,
208
+ ...rest
183
209
  }) {
184
210
  const t = useTranslator();
185
211
  const placeholder = placeholderFromProps ?? t('@astryx.typeahead.searchPlaceholder');
186
212
  const emptySearchResultsText = emptySearchResultsTextFromProps ?? t('@astryx.typeahead.emptySearchResults');
187
213
  const generatedId = useId();
188
- const inputId = externalInputId ?? generatedId;
214
+ // Keep the released input-specific aliases authoritative when a caller uses
215
+ // them, but do not let an omitted alias erase the equivalent native BaseProp.
216
+ const inputId = externalInputId ?? nativeInputId ?? generatedId;
217
+ const inputAriaDescribedBy = ariaDescribedBy ?? nativeAriaDescribedBy;
218
+ const inputAriaLabelledBy = ariaLabelledBy ?? nativeAriaLabelledBy;
219
+ const resolvedInputTabIndex = inputTabIndex ?? nativeInputTabIndex;
189
220
  const listboxId = useId();
190
221
  const inputRef = useRef(null);
191
222
  const fallbackAnchorRef = useRef(null);
@@ -610,6 +641,7 @@ export const BaseTypeahead = function BaseTypeahead({
610
641
  }, [searchSource]);
611
642
  return /*#__PURE__*/_jsxs(_Fragment, {
612
643
  children: [/*#__PURE__*/_jsx("input", {
644
+ ...rest,
613
645
  ref: useMergedRefs(ref, inputRef, fallbackAnchorRef),
614
646
  id: inputId,
615
647
  type: "text",
@@ -619,34 +651,35 @@ export const BaseTypeahead = function BaseTypeahead({
619
651
  "aria-activedescendant": popover.isOpen && highlightedIndex >= 0 && highlightedIndex < results.length ? getItemId(highlightedIndex) : undefined,
620
652
  "aria-autocomplete": "list",
621
653
  "aria-busy": isLoading || undefined,
622
- "aria-describedby": ariaDescribedBy,
623
- "aria-labelledby": ariaLabelledBy,
654
+ "aria-describedby": inputAriaDescribedBy,
655
+ "aria-labelledby": inputAriaLabelledBy,
624
656
  "aria-disabled": isFocusableDisabled ? 'true' : undefined,
625
- tabIndex: inputTabIndex,
657
+ tabIndex: resolvedInputTabIndex,
626
658
  value: query,
627
659
  onChange: handleInputChange,
628
- onPointerDown: () => {
660
+ onPointerDown: composeEventHandlers(() => {
629
661
  pointerActiveRef.current = true;
630
662
  document.addEventListener('click', () => {
631
663
  pointerActiveRef.current = false;
632
664
  }, {
633
665
  once: true
634
666
  });
635
- },
636
- onFocus: handleFocus,
637
- onBlur: handleBlur,
667
+ }, onPointerDownProp),
668
+ onFocus: composeEventHandlers(handleFocus, onFocusProp),
669
+ onBlur: composeEventHandlers(handleBlur, onBlurProp),
638
670
  onKeyDown: handleKeyDown,
639
671
  placeholder: placeholder
640
672
  // When a disabled-reason tooltip is shown the input keeps focusability
641
673
  // via aria-disabled + readOnly instead of the native disabled
642
- // attribute; value mutation stays blocked by the isDisabled guards.
674
+ // attribute. Query and text mutation are blocked, but an already-open
675
+ // highlighted option can still be selected with Enter after transition.
643
676
  ,
644
677
  disabled: isDisabled && !isFocusableDisabled,
645
678
  readOnly: isFocusableDisabled || undefined,
646
679
  autoFocus: hasAutoFocus,
647
680
  "data-autofocus": hasAutoFocus || undefined,
648
681
  autoComplete: "off",
649
- ...stylex.props(styles.input, isDisabled && styles.inputDisabled, inputXStyle)
682
+ ...mergeProps(stylex.props(styles.input, isDisabled && styles.inputDisabled, inputXStyle, xstyle), className, style)
650
683
  }), isLoading && busyLane == null && /*#__PURE__*/_jsx("span", {
651
684
  ...{
652
685
  className: "x3nfvp2 x6s0dn4 xl56j7k x2lah0s x9epnlk"
@@ -663,6 +696,8 @@ export const BaseTypeahead = function BaseTypeahead({
663
696
  className: "x9f619 xuyqlj2 x1odjw0f x9epnlk"
664
697
  }),
665
698
  children: results.length === 0 && hasSearched ? /*#__PURE__*/_jsx("div", {
699
+ role: "option",
700
+ "aria-disabled": "true",
666
701
  ...mergeProps(themeProps('typeahead-empty-state'), {
667
702
  className: "x1b2ylru x2b8uid x141an7d xv1l7n4"
668
703
  }),
@@ -683,10 +718,11 @@ export const BaseTypeahead = function BaseTypeahead({
683
718
  ...stylex.props(styles.item, itemSizeStyles[size], index === highlightedIndex && styles.itemHighlighted, isSelected && styles.itemSelected),
684
719
  children: [/*#__PURE__*/_jsx("span", {
685
720
  ...{
686
- className: "x78zum5 x98rzlu xeuugli"
721
+ className: "x78zum5 x98rzlu xeuugli xb3r6kr"
687
722
  },
688
723
  children: renderItem ? renderItem(item) : /*#__PURE__*/_jsx(TypeaheadItem, {
689
- item: item
724
+ item: item,
725
+ xstyle: styles.defaultItem
690
726
  })
691
727
  }), isSelected && /*#__PURE__*/_jsx(Icon, {
692
728
  icon: "check",
package/dist/astryx.css CHANGED
@@ -36,6 +36,8 @@
36
36
  @property --x-maxWidth { syntax: "*"; inherits: false;}
37
37
  @property --x-minHeight { syntax: "*"; inherits: false;}
38
38
  @property --x-minWidth { syntax: "*"; inherits: false;}
39
+ @property --x-overflowX { syntax: "*"; inherits: false;}
40
+ @property --x-overflowY { syntax: "*"; inherits: false;}
39
41
  @property --x-paddingBlock { syntax: "*"; inherits: false;}
40
42
  @property --x-paddingInline { syntax: "*"; inherits: false;}
41
43
  @property --x-paddingInlineEnd { syntax: "*"; inherits: false;}
@@ -1167,6 +1169,9 @@
1167
1169
  .xrw9175:not(#\#):not(#\#):not(#\#){scroll-padding-block-end:48px}
1168
1170
  .x1hdbdi8:not(#\#):not(#\#):not(#\#){scroll-snap-align:center}
1169
1171
  .x1bhewko:not(#\#):not(#\#):not(#\#){scroll-snap-align:start}
1172
+ .x19jbwzc:not(#\#):not(#\#):not(#\#){scrollbar-color:var(--color-neutral) transparent}
1173
+ .x24f09q:not(#\#):not(#\#):not(#\#){scrollbar-gutter:auto}
1174
+ .xosa0jh:not(#\#):not(#\#):not(#\#){scrollbar-width:auto}
1170
1175
  .x1rohswg:not(#\#):not(#\#):not(#\#){scrollbar-width:none}
1171
1176
  .x1vy8frr:not(#\#):not(#\#):not(#\#){stroke-dasharray:calc(var(--_spinner-ring-diameter) * 1.1780972450961724) calc(var(--_spinner-ring-diameter) * 1.9634954084936207)}
1172
1177
  .x1owpc8m:not(#\#):not(#\#):not(#\#){stroke-linecap:round}
@@ -1326,6 +1331,7 @@
1326
1331
  .x5um2zc.x5um2zc:where(.x1twag4g:first-child *):not(#\#):not(#\#):not(#\#){visibility:hidden}
1327
1332
  .x1se5z8o.x1se5z8o:where(.x1twag4g:last-child *):not(#\#):not(#\#):not(#\#){visibility:hidden}
1328
1333
  @supports (animation-timeline: view()){.x1iu2jvn.x1iu2jvn:not(#\#):not(#\#):not(#\#){animation-name:x1tut0r7-B}}
1334
+ @supports (container-type: scroll-state){.xafyuhj.xafyuhj:not(#\#):not(#\#):not(#\#){container-type:scroll-state}}
1329
1335
  .xfd3fxj:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){animation-name:x1c2q33o-B}
1330
1336
  .x1vxsm5i:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){animation-name:xu7jd1z-B}
1331
1337
  .x18lne9g:is([dir="rtl"] *):not(#\#):not(#\#):not(#\#){animation-name:xwmkjkf-B}
@@ -1446,7 +1452,11 @@
1446
1452
  @media (pointer: coarse){.x1jymrmb.x1jymrmb:not(#\#):not(#\#):not(#\#){margin-inline-start:auto}}
1447
1453
  @media (forced-colors: active){.x1tbh5bv.x1tbh5bv:not(#\#):not(#\#):not(#\#){opacity:1}}
1448
1454
  @media (pointer: coarse){.xozvky.xozvky:not(#\#):not(#\#):not(#\#){order:1}}
1455
+ @media (forced-colors: active){.x1x84bn5.x1x84bn5:not(#\#):not(#\#):not(#\#){outline-color:Highlight}}
1456
+ @media (forced-colors: active){.x815t2r.x815t2r:not(#\#):not(#\#):not(#\#){outline-style:solid}}
1457
+ @media (forced-colors: active){.x1xvue0r.x1xvue0r:not(#\#):not(#\#):not(#\#){outline-width:var(--border-width)}}
1449
1458
  @media (prefers-reduced-motion: reduce){.xg83hb1.xg83hb1:not(#\#):not(#\#):not(#\#){scroll-behavior:auto}}
1459
+ @media (forced-colors: active){.xrih18v.xrih18v:not(#\#):not(#\#):not(#\#){scrollbar-color:auto}}
1450
1460
  @media (prefers-reduced-motion: reduce){.xwgk2z2.xwgk2z2:not(#\#):not(#\#):not(#\#){transition-delay:var(--_reveal-delay-reduced,0s,0s)}}
1451
1461
  @media (prefers-reduced-motion: reduce){.xsagj69.xsagj69:not(#\#):not(#\#):not(#\#){transition-duration:.01ms}}
1452
1462
  @media (prefers-reduced-motion: reduce){.xzg1mie.xzg1mie:not(#\#):not(#\#):not(#\#){transition-duration:.01s}}
@@ -1649,6 +1659,7 @@
1649
1659
  .x1ap80js:not(#\#):not(#\#):not(#\#):not(#\#){max-width:800px}
1650
1660
  .xq8v1hd:not(#\#):not(#\#):not(#\#):not(#\#){max-width:90%}
1651
1661
  .xbd96yr:not(#\#):not(#\#):not(#\#):not(#\#){max-width:calc(100% - var(--spacing-4));max-width:calc(100% - max(var(--spacing-4),env(safe-area-inset-left,0px),env(safe-area-inset-right,0px)))}
1662
+ .x1rfgw7b:not(#\#):not(#\#):not(#\#):not(#\#){max-width:calc(100% + var(--container-padding-inline-start,0px) + var(--container-padding-inline-end,0px))}
1652
1663
  .xs2v1xk:not(#\#):not(#\#):not(#\#):not(#\#){max-width:calc(100vw - var(--spacing-4) - var(--spacing-4));max-width:calc(100vi - max(var(--spacing-4),env(safe-area-inset-left,0px)) - max(var(--spacing-4),env(safe-area-inset-right,0px)))}
1653
1664
  .xl6temz:not(#\#):not(#\#):not(#\#):not(#\#){max-width:max(80%,280px)}
1654
1665
  .x1m1aaou:not(#\#):not(#\#):not(#\#):not(#\#){max-width:min(960px,calc(100dvw - var(--spacing-4)))}
@@ -1673,6 +1684,7 @@
1673
1684
  .x82snj4:not(#\#):not(#\#):not(#\#):not(#\#){min-height:var(--x-minHeight)}
1674
1685
  .x1dg37ty:not(#\#):not(#\#):not(#\#):not(#\#){min-height:44px}
1675
1686
  .xeuugli:not(#\#):not(#\#):not(#\#):not(#\#){min-width:0}
1687
+ .xgqtt45:not(#\#):not(#\#):not(#\#):not(#\#){min-width:100%}
1676
1688
  .x1i9suas:not(#\#):not(#\#):not(#\#):not(#\#){min-width:120px}
1677
1689
  .x1d77m7x:not(#\#):not(#\#):not(#\#):not(#\#){min-width:140px}
1678
1690
  .x12knhqr:not(#\#):not(#\#):not(#\#):not(#\#){min-width:160px;min-width:min(160px,calc(100vw - var(--spacing-4) - var(--spacing-4)));min-width:min(160px,calc(100vi - max(var(--spacing-4),env(safe-area-inset-left,0px)) - max(var(--spacing-4),env(safe-area-inset-right,0px))))}
@@ -1703,8 +1715,10 @@
1703
1715
  .x1tutbut:not(#\#):not(#\#):not(#\#):not(#\#){min-width:44px}
1704
1716
  .xw2csxc:not(#\#):not(#\#):not(#\#):not(#\#){overflow-x:auto}
1705
1717
  .x6ikm8r:not(#\#):not(#\#):not(#\#):not(#\#){overflow-x:hidden}
1718
+ .xyto64x:not(#\#):not(#\#):not(#\#):not(#\#){overflow-x:var(--x-overflowX)}
1706
1719
  .x1odjw0f:not(#\#):not(#\#):not(#\#):not(#\#){overflow-y:auto}
1707
1720
  .x10wlt62:not(#\#):not(#\#):not(#\#):not(#\#){overflow-y:hidden}
1721
+ .x4ncuvb:not(#\#):not(#\#):not(#\#):not(#\#){overflow-y:var(--x-overflowY)}
1708
1722
  .x7p5m3t:not(#\#):not(#\#):not(#\#):not(#\#){overscroll-behavior-x:contain}
1709
1723
  .x18d9i69:not(#\#):not(#\#):not(#\#):not(#\#){padding-bottom:0}
1710
1724
  .x1j85h84:not(#\#):not(#\#):not(#\#):not(#\#){padding-bottom:1px}
@@ -1806,6 +1820,7 @@
1806
1820
  .xx6qvi6:not(#\#):not(#\#):not(#\#):not(#\#){width:calc(100% + var(--container-padding-inline-start,0px) + var(--container-padding-inline-end,0px))}
1807
1821
  .x1y2t9nm:not(#\#):not(#\#):not(#\#):not(#\#){width:calc(44px - 8px)}
1808
1822
  .xeq5yr9:not(#\#):not(#\#):not(#\#):not(#\#){width:fit-content}
1823
+ .xezivpi:not(#\#):not(#\#):not(#\#):not(#\#){width:max-content}
1809
1824
  .x63cpjl:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--_progressbar-mark-width,2px)}
1810
1825
  .x6v0vjy:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--_spinner-box-size)}
1811
1826
  .xjk4fl7:not(#\#):not(#\#):not(#\#):not(#\#){width:var(--border-width)}
@@ -30,6 +30,8 @@ export { useOverflow } from './useOverflow';
30
30
  export type { UseOverflowOptions, UseOverflowReturn } from './useOverflow';
31
31
  export { useScrollOverflow } from './useScrollOverflow';
32
32
  export type { ScrollOverflowState } from './useScrollOverflow';
33
+ export { useScrollableArea } from './useScrollableArea';
34
+ export type { ScrollAxis, ScrollAxisState, ScrollOverscroll, ScrollStickyContainment, ScrollKeyboardAccess, ScrollableAreaState, ScrollableElementProps, UseScrollableAreaOptions, UseScrollableAreaResult, } from './useScrollableArea';
33
35
  export { useScrollLock } from './useScrollLock';
34
36
  export { useEntryAnimation } from './useEntryAnimation';
35
37
  export type { EntryAnimationPreset } from './useEntryAnimation';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,EAAC,wBAAwB,EAAE,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACtE,YAAY,EAAC,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAC,UAAU,EAAE,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAElE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAC,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAC,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAC,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,YAAY,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,YAAY,EACV,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAC,mBAAmB,EAAE,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAE5E,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAC1C,YAAY,EAAC,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAEzE,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAC,mBAAmB,EAAC,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAC,oBAAoB,EAAC,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAC,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AACpD,YAAY,EACV,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAC,iBAAiB,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EACL,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAC,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAC,wBAAwB,EAAC,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,YAAY,EACV,yBAAyB,EACzB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,YAAY,EACV,eAAe,EACf,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,YAAY,EAAC,mBAAmB,EAAE,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,qBAAqB,EAAC,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ export { useMediaQuery } from "./useMediaQuery.js";
23
23
  export { useMergedRefs } from "./useMergedRefs.js";
24
24
  export { useOverflow } from "./useOverflow.js";
25
25
  export { useScrollOverflow } from "./useScrollOverflow.js";
26
+ export { useScrollableArea } from "./useScrollableArea.js";
26
27
  export { useScrollLock } from "./useScrollLock.js";
27
28
  export { useEntryAnimation } from "./useEntryAnimation.js";
28
29
  export { useStreamingText } from "./useStreamingText.js";
@@ -0,0 +1,24 @@
1
+ /** Shared geometry primitives for logical-axis scroll ownership. */
2
+ export declare const SCROLL_OVERFLOW_TOLERANCE = 1;
3
+ export type LogicalScrollAxis = 'inline' | 'block';
4
+ export type PhysicalScrollAxis = 'x' | 'y';
5
+ export interface LogicalAxisMapping {
6
+ inline: PhysicalScrollAxis;
7
+ block: PhysicalScrollAxis;
8
+ inlineReversed: boolean;
9
+ blockReversed: boolean;
10
+ }
11
+ export interface MeasuredScrollAxisState {
12
+ isScrollable: boolean;
13
+ atStart: boolean;
14
+ atEnd: boolean;
15
+ }
16
+ export interface LogicalOverflowGeometry {
17
+ inline: boolean;
18
+ block: boolean;
19
+ }
20
+ export declare function getLogicalAxisMapping(writingMode: string, direction: string): LogicalAxisMapping;
21
+ export declare function isScrollCapableOverflow(value: string): boolean;
22
+ export declare function measureLogicalOverflowGeometry(element: HTMLElement, logicalAxis: LogicalScrollAxis, mapping: LogicalAxisMapping): boolean | null;
23
+ export declare function measureLogicalScrollAxis(element: HTMLElement, logicalAxis: LogicalScrollAxis, mapping: LogicalAxisMapping): MeasuredScrollAxisState | null;
24
+ //# sourceMappingURL=scrollGeometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollGeometry.d.ts","sourceRoot":"","sources":["../../src/hooks/scrollGeometry.ts"],"names":[],"mappings":"AAEA,oEAAoE;AAEpE,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,OAAO,CAAC;AACnD,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,GAAG,CAAC;AAE3C,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAQD,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAyBpB;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAwCD,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE,kBAAkB,GAC1B,OAAO,GAAG,IAAI,CAYhB;AAED,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,iBAAiB,EAC9B,OAAO,EAAE,kBAAkB,GAC1B,uBAAuB,GAAG,IAAI,CA2BhC"}
@@ -0,0 +1,86 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /** Shared geometry primitives for logical-axis scroll ownership. */
4
+
5
+ export const SCROLL_OVERFLOW_TOLERANCE = 1;
6
+ const INACTIVE_AXIS_STATE = {
7
+ isScrollable: false,
8
+ atStart: true,
9
+ atEnd: true
10
+ };
11
+ export function getLogicalAxisMapping(writingMode, direction) {
12
+ const mode = writingMode.toLowerCase();
13
+ const isVertical = mode.startsWith('vertical') || mode.startsWith('sideways');
14
+ const isRtl = direction === 'rtl';
15
+ if (!isVertical) {
16
+ return {
17
+ inline: 'x',
18
+ block: 'y',
19
+ inlineReversed: isRtl,
20
+ blockReversed: false
21
+ };
22
+ }
23
+
24
+ // sideways-lr runs its natural inline direction from bottom to top. The
25
+ // other vertical/sideways modes run top to bottom; `direction` reverses each.
26
+ const inlineReversed = mode === 'sideways-lr' ? !isRtl : isRtl;
27
+ const blockReversed = mode.endsWith('-rl');
28
+ return {
29
+ inline: 'y',
30
+ block: 'x',
31
+ inlineReversed,
32
+ blockReversed
33
+ };
34
+ }
35
+ export function isScrollCapableOverflow(value) {
36
+ return value === 'auto' || value === 'scroll' || value === 'overlay';
37
+ }
38
+ function physicalMetrics(element, physicalAxis) {
39
+ const computedStyle = getComputedStyle(element);
40
+ if (physicalAxis === 'x') {
41
+ return {
42
+ clientExtent: element.clientWidth,
43
+ contentExtent: element.scrollWidth,
44
+ offset: element.scrollLeft,
45
+ overflow: computedStyle.overflowX
46
+ };
47
+ }
48
+ return {
49
+ clientExtent: element.clientHeight,
50
+ contentExtent: element.scrollHeight,
51
+ offset: element.scrollTop,
52
+ overflow: computedStyle.overflowY
53
+ };
54
+ }
55
+ function isMeasurable(element, computedStyle) {
56
+ return element.isConnected && computedStyle.display !== 'none' && element.clientWidth > 0 && element.clientHeight > 0;
57
+ }
58
+ export function measureLogicalOverflowGeometry(element, logicalAxis, mapping) {
59
+ const computedStyle = getComputedStyle(element);
60
+ if (!isMeasurable(element, computedStyle)) {
61
+ return null;
62
+ }
63
+ const physicalAxis = mapping[logicalAxis];
64
+ const clientExtent = physicalAxis === 'x' ? element.clientWidth : element.clientHeight;
65
+ const contentExtent = physicalAxis === 'x' ? element.scrollWidth : element.scrollHeight;
66
+ return contentExtent - clientExtent > SCROLL_OVERFLOW_TOLERANCE;
67
+ }
68
+ export function measureLogicalScrollAxis(element, logicalAxis, mapping) {
69
+ const computedStyle = getComputedStyle(element);
70
+ if (!isMeasurable(element, computedStyle)) {
71
+ return null;
72
+ }
73
+ const physicalAxis = mapping[logicalAxis];
74
+ const metrics = physicalMetrics(element, physicalAxis);
75
+ const maxOffset = metrics.contentExtent - metrics.clientExtent;
76
+ if (!isScrollCapableOverflow(metrics.overflow) || maxOffset <= SCROLL_OVERFLOW_TOLERANCE) {
77
+ return INACTIVE_AXIS_STATE;
78
+ }
79
+ const isReversed = mapping[`${logicalAxis}Reversed`];
80
+ const logicalOffset = Math.min(maxOffset, Math.max(0, isReversed ? Math.abs(metrics.offset) : metrics.offset));
81
+ return {
82
+ isScrollable: true,
83
+ atStart: logicalOffset <= SCROLL_OVERFLOW_TOLERANCE,
84
+ atEnd: logicalOffset >= maxOffset - SCROLL_OVERFLOW_TOLERANCE
85
+ };
86
+ }
@@ -0,0 +1,15 @@
1
+ /** Private DOM registry used by future axis-aware Sticky consumers. */
2
+ export interface RegisteredScrollAxisState {
3
+ isScrollable: boolean;
4
+ atStart: boolean;
5
+ atEnd: boolean;
6
+ }
7
+ export interface RegisteredScrollOwnerState {
8
+ inline: RegisteredScrollAxisState;
9
+ block: RegisteredScrollAxisState;
10
+ }
11
+ export declare function registerScrollOwner(element: HTMLElement, state: RegisteredScrollOwnerState): void;
12
+ export declare function unregisterScrollOwner(element: HTMLElement): void;
13
+ export declare function getRegisteredScrollOwnerState(element: HTMLElement): RegisteredScrollOwnerState | undefined;
14
+ export declare function findNearestScrollOwner(element: Element, axis: 'inline' | 'block'): HTMLElement | null;
15
+ //# sourceMappingURL=scrollOwnerRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollOwnerRegistry.d.ts","sourceRoot":"","sources":["../../src/hooks/scrollOwnerRegistry.ts"],"names":[],"mappings":"AAEA,uEAAuE;AAEvE,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,yBAAyB,CAAC;IAClC,KAAK,EAAE,yBAAyB,CAAC;CAClC;AAID,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,0BAA0B,GAChC,IAAI,CAEN;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAEhE;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,WAAW,GACnB,0BAA0B,GAAG,SAAS,CAExC;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,QAAQ,GAAG,OAAO,GACvB,WAAW,GAAG,IAAI,CASpB"}