@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
@@ -99,12 +99,24 @@ export function PanelSearchInput({
99
99
  setIsKeyboardFocus(false);
100
100
  onBlur?.(e);
101
101
  }, [onBlur]);
102
- const handleClear = useCallback(() => {
102
+ const handleClear = useCallback(e => {
103
103
  onValueChange('');
104
104
  // Clearing puts the caret back where the user was typing, matching
105
- // TextInput's built-in clear.
106
- if (typeof ref === 'object' && ref?.current) {
107
- ref.current.focus();
105
+ // TextInput's built-in clear. Defer focus restoration past the button's
106
+ // unmount task so touch browsers don't jump page scroll on tap, while
107
+ // preserving synchronous focus for keyboard users.
108
+ if (!e || e.detail === 0) {
109
+ if (typeof ref === 'object' && ref?.current) {
110
+ ref.current.focus();
111
+ }
112
+ } else {
113
+ requestAnimationFrame(() => {
114
+ if (typeof ref === 'object' && ref?.current) {
115
+ ref.current.focus({
116
+ preventScroll: true
117
+ });
118
+ }
119
+ });
108
120
  }
109
121
  }, [onValueChange, ref]);
110
122
  return /*#__PURE__*/_jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"FileInput.d.ts","sourceRoot":"","sources":["../../src/FileInput/FileInput.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AASlB,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,eAAe,IAAI,mBAAmB,GACvC,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAgO9C,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,UAAU,GAAG,cAAc,GAAG,OAAO,CACtC;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC5B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAqB,EACrB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,UAAkB,EAClB,OAAO,EACP,QAAQ,EACR,UAAkB,EAClB,eAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,MAAM,EAAE,UAAU,EAClB,aAA0B,EAC1B,WAAW,EACX,WAAW,EACX,IAAc,EACd,UAAkB,EAClB,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BA+ZhB;yBA1be,SAAS"}
1
+ {"version":3,"file":"FileInput.d.ts","sourceRoot":"","sources":["../../src/FileInput/FileInput.tsx"],"names":[],"mappings":"AAsCA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AASlB,YAAY,EACV,WAAW,IAAI,eAAe,EAC9B,eAAe,IAAI,mBAAmB,GACvC,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAgO9C,MAAM,WAAW,cAAe,SAAQ,IAAI,CAC1C,SAAS,EACT,UAAU,GAAG,cAAc,GAAG,OAAO,CACtC;IACC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAC5B;;OAEG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAqB,EACrB,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,MAAM,EACN,UAAkB,EAClB,OAAO,EACP,QAAQ,EACR,UAAkB,EAClB,eAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,MAAM,EAAE,UAAU,EAClB,aAA0B,EAC1B,WAAW,EACX,WAAW,EACX,IAAc,EACd,UAAkB,EAClB,YAAY,EACZ,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAwahB;yBAnce,SAAS"}
@@ -308,7 +308,18 @@ export function FileInput({
308
308
  onChange(null);
309
309
  if (inputRef.current) {
310
310
  inputRef.current.value = '';
311
- inputRef.current.focus();
311
+ const targetInput = inputRef.current;
312
+ if (e.detail === 0) {
313
+ targetInput.focus();
314
+ } else {
315
+ // Defer focus restoration past the button's unmount task so iOS Safari
316
+ // and touch browsers don't jump the page scroll to 0 on tap.
317
+ requestAnimationFrame(() => {
318
+ targetInput.focus({
319
+ preventScroll: true
320
+ });
321
+ });
322
+ }
312
323
  }
313
324
  }, [onChange]);
314
325
  const handleClick = useCallback(() => {
@@ -359,8 +359,8 @@ export function useHoverCard(options = {}) {
359
359
  const renderHoverCard = useCallback((children, props) => {
360
360
  const renderPlacement = props?.placement ?? placement;
361
361
  const themeClassName = themeProps('hover-card', undefined, {
362
- // `hovercard` ran the compound name together; themes styling it keep
363
- // working until the next major.
362
+ // `hovercard` ran the compound name together; keep it emitted so
363
+ // existing themes continue to work.
364
364
  legacyNames: ['hovercard']
365
365
  }).className;
366
366
  const renderProps = {
@@ -147,8 +147,8 @@ export function CheckboxIndicator({
147
147
  checked: isChecked ? 'checked' : isIndeterminate ? 'indeterminate' : null,
148
148
  disabled: isDisabled ? 'disabled' : null
149
149
  },
150
- // `checkbox` was the target before indicators existed; themes
151
- // styling it keep working until the next major.
150
+ // `checkbox` was the target before indicators existed; keep it
151
+ // emitted so existing themes continue to work.
152
152
  {
153
153
  legacyNames: ['checkbox']
154
154
  }), stylex.props(styles.box, boxSizeStyles[size], isCheckedOrIndeterminate ? styles.checked : styles.unchecked, isDisabled && styles.disabled, isDisabled && !isCheckedOrIndeterminate && styles.disabledUnchecked, xstyle), className, style),
@@ -120,8 +120,8 @@ export function RadioIndicator({
120
120
  checked: isChecked ? 'checked' : null,
121
121
  disabled: isDisabled ? 'disabled' : null
122
122
  },
123
- // `radio` was the target before indicators existed; themes styling
124
- // it keep working until the next major.
123
+ // `radio` was the target before indicators existed; keep it emitted
124
+ // so existing themes continue to work.
125
125
  {
126
126
  legacyNames: ['radio']
127
127
  }), stylex.props(styles.circle, circleSizeStyles[size], isChecked ? styles.checked : styles.unchecked, isDisabled && styles.disabled, isDisabled && !isChecked && styles.disabledUnchecked, xstyle), className, style),
@@ -88,6 +88,16 @@ export declare function isTextComposing(): boolean;
88
88
  * gate on this so every channel agrees on who is on top.
89
89
  */
90
90
  export declare function isTopmostLayer(token: object): boolean;
91
+ /**
92
+ * Resolve a keydown through the shared stack immediately.
93
+ *
94
+ * The document listener is the normal path. A host may call this at its own
95
+ * element boundary after a consumer handler when that handler can stop
96
+ * propagation before the event reaches `document`. The same stack still picks
97
+ * the owner, and `preventDefault()` records the decision so a bubbling event is
98
+ * not handled twice.
99
+ */
100
+ export declare function dispatchLayerEscapeKeyDown(event: KeyboardEvent): void;
91
101
  /**
92
102
  * Add a layer to the stack for as long as it is active. Returns the unregister
93
103
  * function; callers own calling it.
@@ -1 +1 @@
1
- {"version":3,"file":"layerStack.d.ts","sourceRoot":"","sources":["../../src/Layer/layerStack.ts"],"names":[],"mappings":"AAoEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,mBAAmB,CAAC;IAC9B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACxC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA2ED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AA2BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAwED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAc7E;AAED,2DAA2D;AAC3D,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C"}
1
+ {"version":3,"file":"layerStack.d.ts","sourceRoot":"","sources":["../../src/Layer/layerStack.ts"],"names":[],"mappings":"AAsEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,mBAAmB,CAAC;IAC9B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACxC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA2ED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AA2BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD;AAeD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CA4BrE;AA6BD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAc7E;AAED,2DAA2D;AAC3D,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C"}
@@ -6,7 +6,8 @@
6
6
  * @file layerStack.ts
7
7
  * @input Uses the isImeKeyEvent predicate from utils/ime
8
8
  * @output Exports the shared layer dismissal stack: registration, top-most
9
- * ordering, and the single document-level Escape listener
9
+ * ordering, the document-level Escape listener, and its internal local-event
10
+ * dispatcher
10
11
  * @position Internal to the Layer system; consumed by useLayerDismissal, which
11
12
  * is what overlays actually call. Not exported from the package root.
12
13
  *
@@ -34,11 +35,12 @@
34
35
  * ## Bubble phase, not capture
35
36
  *
36
37
  * The listener is on the BUBBLE phase so content inside a layer can claim the
37
- * press first, either by `stopPropagation()` (the press never reaches us) or by
38
- * `preventDefault()` (we see it and stand down). Editors are the motivating
39
- * case: Monaco and the rich-text editor use Escape to close their own find
40
- * widget or autocomplete, and that must win over dismissing the Dialog they sit
41
- * in. A capture-phase listener would take the press away from them.
38
+ * press first, either by `stopPropagation()` (the press never reaches the
39
+ * document listener) or by `preventDefault()` (we see it and stand down).
40
+ * A host whose public event prop can stop propagation may route the still-
41
+ * unprevented event through `dispatchLayerEscapeKeyDown` at its own boundary;
42
+ * the same stack still chooses the owner. Editors are why `preventDefault()`
43
+ * remains the explicit cancellation signal: their own Escape action must win.
42
44
  *
43
45
  * ## The stack, not the browser, decides
44
46
  *
@@ -223,7 +225,17 @@ function dispatchEscape() {
223
225
  top.dismiss();
224
226
  return true;
225
227
  }
226
- function handleKeyDown(event) {
228
+
229
+ /**
230
+ * Resolve a keydown through the shared stack immediately.
231
+ *
232
+ * The document listener is the normal path. A host may call this at its own
233
+ * element boundary after a consumer handler when that handler can stop
234
+ * propagation before the event reaches `document`. The same stack still picks
235
+ * the owner, and `preventDefault()` records the decision so a bubbling event is
236
+ * not handled twice.
237
+ */
238
+ export function dispatchLayerEscapeKeyDown(event) {
227
239
  if (event.key !== 'Escape') {
228
240
  return;
229
241
  }
@@ -256,7 +268,7 @@ function startListening() {
256
268
  if (isListening || typeof document === 'undefined') {
257
269
  return;
258
270
  }
259
- document.addEventListener('keydown', handleKeyDown);
271
+ document.addEventListener('keydown', dispatchLayerEscapeKeyDown);
260
272
  document.addEventListener('compositionstart', handleCompositionStart, true);
261
273
  document.addEventListener('compositionend', handleCompositionEnd, true);
262
274
  document.addEventListener('blur', handleCompositionEnd, true);
@@ -266,7 +278,7 @@ function stopListening() {
266
278
  if (!isListening || typeof document === 'undefined') {
267
279
  return;
268
280
  }
269
- document.removeEventListener('keydown', handleKeyDown);
281
+ document.removeEventListener('keydown', dispatchLayerEscapeKeyDown);
270
282
  document.removeEventListener('compositionstart', handleCompositionStart, true);
271
283
  document.removeEventListener('compositionend', handleCompositionEnd, true);
272
284
  document.removeEventListener('blur', handleCompositionEnd, true);
@@ -67,9 +67,8 @@ export interface UseLayerDismissalReturn {
67
67
  * The layer does NOT attach a key listener — the stack owns one listener and
68
68
  * routes each Escape press to the top-most REGISTERED layer, so one press
69
69
  * dismisses exactly one of them. Dialog (and what is built on it), Popover and
70
- * the menus built on it, Tooltip, HoverCard, Lightbox and MobileNav register
71
- * today; `BottomSheetSwitcher` registers through its focus trap when modal and
72
- * still handles its own press when not.
70
+ * the menus built on it, Tooltip, HoverCard, Lightbox, MobileNav and
71
+ * BottomSheetSwitcher register today.
73
72
  *
74
73
  * `BottomSheet`, `CommandPalette`, `ContextMenu`, `DropdownMenuSubMenu`,
75
74
  * `PowerSearchEditPopover` and lab's `Drawer` still run their own Escape
@@ -1 +1 @@
1
- {"version":3,"file":"useLayerDismissal.d.ts","sourceRoot":"","sources":["../../src/Layer/useLayerDismissal.ts"],"names":[],"mappings":"AAqBA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAC,mBAAmB,EAAC,CAAC;AAElC,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;OAOG;IACH,2BAA2B,EAAE,MAAM,OAAO,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,uBAAuB,CAiDzB"}
1
+ {"version":3,"file":"useLayerDismissal.d.ts","sourceRoot":"","sources":["../../src/Layer/useLayerDismissal.ts"],"names":[],"mappings":"AAqBA,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAC,mBAAmB,EAAC,CAAC;AAElC,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,WAAW,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;;OAOG;IACH,2BAA2B,EAAE,MAAM,OAAO,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,wBAAwB,GAChC,uBAAuB,CAiDzB"}
@@ -24,9 +24,8 @@ import { isTextComposing, isTopmostLayer, registerLayer } from "./layerStack.js"
24
24
  * The layer does NOT attach a key listener — the stack owns one listener and
25
25
  * routes each Escape press to the top-most REGISTERED layer, so one press
26
26
  * dismisses exactly one of them. Dialog (and what is built on it), Popover and
27
- * the menus built on it, Tooltip, HoverCard, Lightbox and MobileNav register
28
- * today; `BottomSheetSwitcher` registers through its focus trap when modal and
29
- * still handles its own press when not.
27
+ * the menus built on it, Tooltip, HoverCard, Lightbox, MobileNav and
28
+ * BottomSheetSwitcher register today.
30
29
  *
31
30
  * `BottomSheet`, `CommandPalette`, `ContextMenu`, `DropdownMenuSubMenu`,
32
31
  * `PowerSearchEditPopover` and lab's `Drawer` still run their own Escape
@@ -68,8 +68,8 @@ export function NavIcon({
68
68
  return /*#__PURE__*/_jsx("span", {
69
69
  ref: ref,
70
70
  ...mergeProps(themeProps('nav-icon', undefined, {
71
- // `navicon` ran the compound name together; themes styling it keep
72
- // working until the next major.
71
+ // `navicon` ran the compound name together; keep it emitted so
72
+ // existing themes continue to work.
73
73
  legacyNames: ['navicon']
74
74
  }), stylex.props(styles.base, xstyle), className, style),
75
75
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/NumberInput/NumberInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/NumberInput/NumberInput.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAML,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAS3C,OAAO,EAGL,KAAK,WAAW,EAKhB,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAuB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAwI5D,QAAA,MAAM,UAAU;;;;;;;;;;EAUd,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,UAAU,CAAC;AAMtD,YAAY,EACV,WAAW,IAAI,iBAAiB,EAChC,eAAe,IAAI,qBAAqB,GACzC,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAM9C,UAAU,oBAAqB,SAAQ,IAAI,CACzC,SAAS,EACT,UAAU,GAAG,cAAc,CAC5B;IACC,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACjC;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACjC;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IAEvB;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACpD;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC1D;AAED;;;GAGG;AACH,KAAK,4BAA4B,GAAG,oBAAoB,GAAG;IACzD,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,KAAK,yBAAyB,GAAG,oBAAoB,GAAG;IACtD;;;;;;OAMG;IACH,QAAQ,EAAE,IAAI,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAC1B,4BAA4B,GAAG,yBAAyB,CAAC;AAsF3D;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,aAAqB,EACrB,WAAW,EACX,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,UAAkB,EAClB,eAAe,EACf,SAAS,EACT,SAAS,EACT,MAAM,EACN,aAA0B,EAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EACR,KAAK,EACL,WAAW,EACX,YAAY,EACZ,YAAoB,EACpB,QAAQ,EACR,YAAY,EACZ,GAAG,EACH,GAAG,EACH,IAAI,EACJ,WAAW,EACX,cAAqB,EACrB,iBAAyB,EACzB,KAAK,EACL,aAAqB,EACrB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,EACT,KAAK,EACL,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,IAAI,EACR,EAAE,gBAAgB,+BAwelB;yBAhhBe,WAAW"}
@@ -454,12 +454,22 @@ export function NumberInput({
454
454
  const canDecrement = getNextValue(-1) !== valueForStepping;
455
455
 
456
456
  // Handle clear button click
457
- const handleClear = useCallback(() => {
457
+ const handleClear = useCallback(e => {
458
458
  if (hasClear) {
459
459
  onChange(null);
460
460
  }
461
461
  setPendingInput(null);
462
- inputRef.current?.focus();
462
+ if (!e || e.detail === 0) {
463
+ inputRef.current?.focus();
464
+ } else {
465
+ // Defer focus restoration past the button's unmount task so iOS Safari
466
+ // and touch browsers don't jump the page scroll to 0 on tap.
467
+ requestAnimationFrame(() => {
468
+ inputRef.current?.focus({
469
+ preventScroll: true
470
+ });
471
+ });
472
+ }
463
473
  }, [hasClear, onChange]);
464
474
 
465
475
  // Focus input when clicking anywhere on the wrapper (icons, padding, etc.)
@@ -128,8 +128,9 @@ export interface UsePopoverOptions {
128
128
  * or radius rule paints the wrong box. Name the surface through this option
129
129
  * and document the class in the component's `theming.targets`.
130
130
  *
131
- * The shared `astryx-popover-surface` class is always present alongside it,
132
- * so a theme can style every popup surface at once.
131
+ * The canonical `astryx-popover` target and deprecated
132
+ * `astryx-popover-surface` compatibility alias are always present alongside
133
+ * any component-owned refinement target.
133
134
  */
134
135
  surfaceTarget?: string;
135
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePopover.d.ts","sourceRoot":"","sources":["../../src/Popover/usePopover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAW,KAAK,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAGpE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AA2FnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAE5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;;;;;;;OAaG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAE7C;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI,CAAC;IAEpD;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,kBAAkB,KAAK,SAAS,CAAC;IAEvE;;OAEG;IACH,YAAY,EAAE;QACZ,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC;QACnC,eAAe,EAAE,OAAO,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAiPD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAE5E"}
1
+ {"version":3,"file":"usePopover.d.ts","sourceRoot":"","sources":["../../src/Popover/usePopover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAW,KAAK,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAGpE,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AA2FnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAE5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAE7C;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI,CAAC;IAEpD;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,kBAAkB,KAAK,SAAS,CAAC;IAEvE;;OAEG;IACH,YAAY,EAAE;QACZ,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC;QACnC,eAAe,EAAE,OAAO,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAmPD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAE5E"}
@@ -232,8 +232,10 @@ function usePopoverImplementation(options = {}) {
232
232
  // `mergeProps` is positional — a third OBJECT argument is read as
233
233
  // `style`, not as more props — so the surface's classes are composed
234
234
  // into one props object before merging with the StyleX result.
235
- const surfaceProps = themeProps('popover-surface');
236
- const surfaceClassName = surfaceTarget != null ? `${surfaceProps.className} ${stableClassName(surfaceTarget)}` : surfaceProps.className;
235
+ const surfaceProps = themeProps('popover', undefined, {
236
+ legacyNames: ['popover-surface']
237
+ });
238
+ const surfaceClassName = surfaceTarget != null && surfaceTarget !== 'popover' ? `${surfaceProps.className} ${stableClassName(surfaceTarget)}` : surfaceProps.className;
237
239
  return layer.render(/*#__PURE__*/_jsx(LayerDepthProvider, {
238
240
  children: /*#__PURE__*/_jsxs("div", {
239
241
  ref: contentRef,
@@ -287,8 +287,8 @@ export function ProgressBar({
287
287
  ...mergeProps(themeProps('progress-bar', {
288
288
  variant
289
289
  },
290
- // `progressbar` ran the compound name together; themes styling it
291
- // keep working until the next major.
290
+ // `progressbar` ran the compound name together; keep it emitted so
291
+ // existing themes continue to work.
292
292
  {
293
293
  legacyNames: ['progressbar']
294
294
  }), stylex.props(styles.container, xstyle), className, style),
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @file ScrollableArea.tsx
3
+ * @input Logical scroll intent, accessible name, overscroll policy, viewport sizing, content padding, and content
4
+ * @output Native scroll viewport with an observed real content box
5
+ * @position Reference composition over useScrollableArea
6
+ *
7
+ * SYNC: When modified, update:
8
+ * - /packages/core/src/ScrollableArea/ScrollableArea.test.tsx
9
+ * - /packages/core/src/ScrollableArea/ScrollableArea.doc.mjs
10
+ * - /apps/storybook/stories/ScrollableArea.stories.tsx
11
+ */
12
+ import type { ReactNode } from 'react';
13
+ import type { BaseProps } from '../BaseProps';
14
+ import type { SizeValue, SpacingStep } from '../utils/types';
15
+ import { type ScrollAxis, type ScrollOverscroll, type ScrollStickyContainment } from '../hooks/useScrollableArea';
16
+ export type ScrollableAreaStickyContainment = ScrollStickyContainment;
17
+ export interface ScrollableAreaProps extends Omit<BaseProps<HTMLDivElement>, 'aria-label' | 'children' | 'role' | 'tabIndex'> {
18
+ /** Content rendered inside the observed content box. */
19
+ children?: ReactNode;
20
+ /** Logical axis or axes where scrolling is allowed. @default 'block' */
21
+ axis?: ScrollAxis;
22
+ /** Accessible name used when an effective viewport enters the tab order. */
23
+ label: string;
24
+ /** Semantics for the named scroll viewport. @default 'group' */
25
+ role?: 'group' | 'region';
26
+ /** Whether effective axes pass scroll gestures to ancestors at an edge. @default 'allow' */
27
+ overscroll?: ScrollOverscroll;
28
+ /** Width of the viewport; numbers are interpreted as pixels. */
29
+ width?: SizeValue;
30
+ /** Height of the viewport; numbers are interpreted as pixels. */
31
+ height?: SizeValue;
32
+ /** Maximum width of the viewport. */
33
+ maxWidth?: SizeValue;
34
+ /** Minimum height of the viewport. */
35
+ minHeight?: SizeValue;
36
+ /** Whether a fitting viewport deliberately remains a Sticky containing boundary. @default 'whenScrollable' */
37
+ stickyContainment?: ScrollableAreaStickyContainment;
38
+ /** Content padding using the shared spacing scale. @default 0 */
39
+ padding?: SpacingStep;
40
+ /** Logical inline-axis content padding; overrides `padding` on that axis. */
41
+ paddingInline?: SpacingStep;
42
+ /** Logical inline-start content padding; overrides broader padding values. */
43
+ paddingInlineStart?: SpacingStep;
44
+ /** Logical inline-end content padding; overrides broader padding values. */
45
+ paddingInlineEnd?: SpacingStep;
46
+ /** Logical block-axis content padding; overrides `padding` on that axis. */
47
+ paddingBlock?: SpacingStep;
48
+ /** Logical block-start content padding; overrides broader padding values. */
49
+ paddingBlockStart?: SpacingStep;
50
+ /** Logical block-end content padding; overrides broader padding values. */
51
+ paddingBlockEnd?: SpacingStep;
52
+ /** Let the viewport escape inherited container padding. @default false */
53
+ isFullBleed?: boolean;
54
+ /** Ref connected to the native scroll viewport. */
55
+ ref?: React.Ref<HTMLDivElement>;
56
+ }
57
+ /**
58
+ * A native scroll viewport with axis-aware accessibility and chaining.
59
+ *
60
+ * The root is the viewport. Its single child is a normal block content box with
61
+ * a 100% minimum size; children participate in that box rather than directly in
62
+ * viewport flex/grid layout. Inline scrolling gives the box max-content inline
63
+ * sizing, and its minimum block size deliberately does not create a definite
64
+ * percentage-height basis. Use the hook on owned structure when those formatting
65
+ * semantics must stay unchanged. Native scrolling and platform scrollbars remain
66
+ * authoritative.
67
+ *
68
+ * @example
69
+ * ```
70
+ * <ScrollableArea axis="block" label="Activity history">
71
+ * <ActivityList />
72
+ * </ScrollableArea>
73
+ * ```
74
+ */
75
+ export declare function ScrollableArea({ children, axis, label, role, overscroll, width, height, maxWidth, minHeight, stickyContainment, padding, paddingInline, paddingInlineStart, paddingInlineEnd, paddingBlock, paddingBlockStart, paddingBlockEnd, isFullBleed, ref, xstyle, className, style, ...props }: ScrollableAreaProps): import("react").JSX.Element;
76
+ export declare namespace ScrollableArea {
77
+ var displayName: string;
78
+ }
79
+ //# sourceMappingURL=ScrollableArea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollableArea.d.ts","sourceRoot":"","sources":["../../src/ScrollableArea/ScrollableArea.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAErC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAe5C,OAAO,KAAK,EAAC,SAAS,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,MAAM,4BAA4B,CAAC;AA0DpC,MAAM,MAAM,+BAA+B,GAAG,uBAAuB,CAAC;AAEtE,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAC/C,SAAS,CAAC,cAAc,CAAC,EACzB,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAChD;IACC,wDAAwD;IACxD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,wEAAwE;IACxE,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,4FAA4F;IAC5F,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iEAAiE;IACjE,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sCAAsC;IACtC,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8GAA8G;IAC9G,iBAAiB,CAAC,EAAE,+BAA+B,CAAC;IACpD,iEAAiE;IACjE,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,2EAA2E;IAC3E,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,0EAA0E;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mDAAmD;IACnD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,IAAc,EACd,KAAK,EACL,IAAc,EACd,UAAoB,EACpB,KAAK,EACL,MAAM,EACN,QAAQ,EACR,SAAS,EACT,iBAAoC,EACpC,OAAW,EACX,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,WAAmB,EACnB,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,KAAK,EACT,EAAE,mBAAmB,+BAuErB;yBA/Fe,cAAc"}
@@ -0,0 +1,144 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file ScrollableArea.tsx
7
+ * @input Logical scroll intent, accessible name, overscroll policy, viewport sizing, content padding, and content
8
+ * @output Native scroll viewport with an observed real content box
9
+ * @position Reference composition over useScrollableArea
10
+ *
11
+ * SYNC: When modified, update:
12
+ * - /packages/core/src/ScrollableArea/ScrollableArea.test.tsx
13
+ * - /packages/core/src/ScrollableArea/ScrollableArea.doc.mjs
14
+ * - /apps/storybook/stories/ScrollableArea.stories.tsx
15
+ */
16
+ import * as stylex from '@stylexjs/stylex';
17
+ import { paddingStyles, paddingInlineStyles, paddingInlineStartStyles, paddingInlineEndStyles, paddingBlockStyles, paddingBlockStartStyles, paddingBlockEndStyles, containerPaddingInlineVarStyles, containerPaddingInlineStartVarStyles, containerPaddingInlineEndVarStyles, containerPaddingBlockStartVarStyles, containerPaddingBlockEndVarStyles } from "../Layout/padding.stylex.js";
18
+ import { useScrollableArea } from "../hooks/useScrollableArea.js";
19
+ import "../theme/tokens.stylex.js";
20
+ import { colorVars } from "../theme/tokens.stylex.js";
21
+ import { focusOutlineStyles } from "../utils/focusOutline.stylex.js";
22
+ import { mergeProps } from "../utils/mergeProps.js";
23
+ import { themeProps } from "../utils/themeProps.js";
24
+ import { jsx as _jsx } from "react/jsx-runtime";
25
+ const styles = {
26
+ viewport: {
27
+ kB7OPa: "x9f619",
28
+ ks0D6T: "x193iq5w",
29
+ kskxy: "xmz0i5r",
30
+ kuHK5b: "x5lxg6s",
31
+ k6w4Gs: "x19jbwzc xrih18v",
32
+ k5wCbM: "xosa0jh",
33
+ kZ7BSC: "x24f09q",
34
+ k9g6sI: "xafyuhj",
35
+ $$css: true
36
+ },
37
+ fullBleed: {
38
+ keTefX: "xojxgvx",
39
+ k71WvV: "x1fcf3bl",
40
+ ks0D6T: "x1rfgw7b",
41
+ keoZOQ: "xkibk3",
42
+ k1K539: "xlayyun",
43
+ $$css: true
44
+ },
45
+ content: {
46
+ kB7OPa: "x9f619",
47
+ k7Eaqz: "xgqtt45",
48
+ kAzted: "x1us19tq",
49
+ $$css: true
50
+ },
51
+ contentWithInlineOverflow: {
52
+ kzqmXN: "xezivpi",
53
+ $$css: true
54
+ }
55
+ };
56
+ const dynamicStyles = {
57
+ sizing: (width, height, maxWidth, minHeight) => [{
58
+ kzqmXN: width != null ? "x5lhr3w" : width,
59
+ kZKoxP: height != null ? "x16ye13r" : height,
60
+ ks0D6T: maxWidth != null ? "xf68679" : maxWidth,
61
+ kAzted: minHeight != null ? "x82snj4" : minHeight,
62
+ $$css: true
63
+ }, {
64
+ "--x-width": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(width),
65
+ "--x-height": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(height),
66
+ "--x-maxWidth": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(maxWidth),
67
+ "--x-minHeight": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(minHeight)
68
+ }]
69
+ };
70
+ /**
71
+ * A native scroll viewport with axis-aware accessibility and chaining.
72
+ *
73
+ * The root is the viewport. Its single child is a normal block content box with
74
+ * a 100% minimum size; children participate in that box rather than directly in
75
+ * viewport flex/grid layout. Inline scrolling gives the box max-content inline
76
+ * sizing, and its minimum block size deliberately does not create a definite
77
+ * percentage-height basis. Use the hook on owned structure when those formatting
78
+ * semantics must stay unchanged. Native scrolling and platform scrollbars remain
79
+ * authoritative.
80
+ *
81
+ * @example
82
+ * ```
83
+ * <ScrollableArea axis="block" label="Activity history">
84
+ * <ActivityList />
85
+ * </ScrollableArea>
86
+ * ```
87
+ */
88
+ export function ScrollableArea({
89
+ children,
90
+ axis = 'block',
91
+ label,
92
+ role = 'group',
93
+ overscroll = 'allow',
94
+ width,
95
+ height,
96
+ maxWidth,
97
+ minHeight,
98
+ stickyContainment = 'whenScrollable',
99
+ padding = 0,
100
+ paddingInline,
101
+ paddingInlineStart,
102
+ paddingInlineEnd,
103
+ paddingBlock,
104
+ paddingBlockStart,
105
+ paddingBlockEnd,
106
+ isFullBleed = false,
107
+ ref,
108
+ xstyle,
109
+ className,
110
+ style,
111
+ ...props
112
+ }) {
113
+ const {
114
+ getViewportProps,
115
+ getContentProps
116
+ } = useScrollableArea({
117
+ axis,
118
+ keyboardAccess: {
119
+ owner: 'viewport',
120
+ label,
121
+ role
122
+ },
123
+ overscroll,
124
+ stickyContainment
125
+ });
126
+ const mergedViewportProps = mergeProps(themeProps('scrollable-area', {
127
+ axis
128
+ }), stylex.props(styles.viewport, isFullBleed && styles.fullBleed, focusOutlineStyles.focusVisible, dynamicStyles.sizing(width ?? null, height ?? null, maxWidth ?? null, minHeight ?? null), xstyle), className, style);
129
+ const viewportProps = getViewportProps({
130
+ ...props,
131
+ ref,
132
+ ...mergedViewportProps
133
+ });
134
+ return /*#__PURE__*/_jsx("div", {
135
+ ...viewportProps,
136
+ children: /*#__PURE__*/_jsx("div", {
137
+ ...getContentProps({
138
+ ...stylex.props(styles.content, axis !== 'block' && styles.contentWithInlineOverflow, paddingStyles[padding], containerPaddingInlineVarStyles[padding], containerPaddingBlockStartVarStyles[padding], containerPaddingBlockEndVarStyles[padding], paddingInline != null && paddingInlineStyles[paddingInline], paddingInline != null && containerPaddingInlineVarStyles[paddingInline], paddingBlock != null && paddingBlockStyles[paddingBlock], paddingBlock != null && containerPaddingBlockStartVarStyles[paddingBlock], paddingBlock != null && containerPaddingBlockEndVarStyles[paddingBlock], paddingInlineStart != null && paddingInlineStartStyles[paddingInlineStart], paddingInlineStart != null && containerPaddingInlineStartVarStyles[paddingInlineStart], paddingInlineEnd != null && paddingInlineEndStyles[paddingInlineEnd], paddingInlineEnd != null && containerPaddingInlineEndVarStyles[paddingInlineEnd], paddingBlockStart != null && paddingBlockStartStyles[paddingBlockStart], paddingBlockStart != null && containerPaddingBlockStartVarStyles[paddingBlockStart], paddingBlockEnd != null && paddingBlockEndStyles[paddingBlockEnd], paddingBlockEnd != null && containerPaddingBlockEndVarStyles[paddingBlockEnd])
139
+ }),
140
+ children: children
141
+ })
142
+ });
143
+ }
144
+ ScrollableArea.displayName = 'ScrollableArea';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @file index.ts
3
+ * @input ScrollableArea implementation and shared hook types
4
+ * @output Public ScrollableArea package surface
5
+ * @position Package entry point for ScrollableArea
6
+ */
7
+ export { ScrollableArea } from './ScrollableArea';
8
+ export type { ScrollableAreaProps, ScrollableAreaStickyContainment, } from './ScrollableArea';
9
+ export { useScrollableArea } from '../hooks/useScrollableArea';
10
+ export type { ScrollAxis, ScrollAxisState, ScrollOverscroll, ScrollStickyContainment, ScrollKeyboardAccess, ScrollableAreaState, ScrollableElementProps, UseScrollableAreaOptions, UseScrollableAreaResult, } from '../hooks/useScrollableArea';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ScrollableArea/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAChD,YAAY,EACV,mBAAmB,EACnB,+BAA+B,GAChC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAC,iBAAiB,EAAC,MAAM,4BAA4B,CAAC;AAC7D,YAAY,EACV,UAAU,EACV,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file index.ts
5
+ * @input ScrollableArea implementation and shared hook types
6
+ * @output Public ScrollableArea package surface
7
+ * @position Package entry point for ScrollableArea
8
+ */
9
+
10
+ export { ScrollableArea } from "./ScrollableArea.js";
11
+ export { useScrollableArea } from "../hooks/useScrollableArea.js";
@@ -146,8 +146,8 @@ export function StatusDot({
146
146
  ...mergeProps(themeProps('status-dot', {
147
147
  variant
148
148
  },
149
- // `statusdot` ran the compound name together; themes styling it keep
150
- // working until the next major.
149
+ // `statusdot` ran the compound name together; keep it emitted so
150
+ // existing themes continue to work.
151
151
  {
152
152
  legacyNames: ['statusdot']
153
153
  }), stylex.props(styles.base, variants[variant], isPulsing && styles.pulsing, isPulsing && styles.reducedMotion, xstyle), className, style),
@@ -278,8 +278,8 @@ export function TextArea({
278
278
  disabled: isDisabled ? 'disabled' : null,
279
279
  readonly: isReadOnly ? 'readonly' : null
280
280
  },
281
- // `textarea` ran the compound name together; themes styling it
282
- // keep working until the next major.
281
+ // `textarea` ran the compound name together; keep it emitted so
282
+ // existing themes continue to work.
283
283
  {
284
284
  legacyNames: ['textarea']
285
285
  }), stylex.props(inputWrapperStyles.base, styles.wrapper, isDisabled && inputWrapperStyles.disabled, status && inputStatusBorderStyles[status.type], status && !isDisabled && inputStatusHoverShadowStyles[status.type], status && inputStatusFocusWithinStyles[status.type], xstyle), className, style),