@astryxdesign/core 0.7.7 → 0.7.8-canary.0588a13

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 (798) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +4 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +46 -6
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +11 -3
  6. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  7. package/dist/BottomSheet/BottomSheet.js +1 -0
  8. package/dist/BottomSheet/BottomSheetPanel.d.ts +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  10. package/dist/BottomSheet/BottomSheetPanel.js +55 -18
  11. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  12. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  13. package/dist/BottomSheet/bottomSheetStack.js +1 -1
  14. package/dist/BottomSheet/useSheetGestures.d.ts +3 -1
  15. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  16. package/dist/BottomSheet/useSheetGestures.js +16 -1
  17. package/dist/Button/Button.d.ts.map +1 -1
  18. package/dist/Button/Button.js +17 -1
  19. package/dist/Calendar/Calendar.d.ts.map +1 -1
  20. package/dist/Calendar/Calendar.js +18 -22
  21. package/dist/Calendar/getWeekdayHeaderNames.d.ts +16 -0
  22. package/dist/Calendar/getWeekdayHeaderNames.d.ts.map +1 -0
  23. package/dist/Calendar/getWeekdayHeaderNames.js +70 -0
  24. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  25. package/dist/Calendar/hooks/useCalendarDays.js +2 -10
  26. package/dist/Calendar/{standaloneShortWeekdayNames.generated.d.ts → weekdayHeaderNames.generated.d.ts} +14 -14
  27. package/dist/Calendar/weekdayHeaderNames.generated.d.ts.map +1 -0
  28. package/dist/Calendar/{standaloneShortWeekdayNames.generated.js → weekdayHeaderNames.generated.js} +12 -12
  29. package/dist/Carousel/Carousel.d.ts.map +1 -1
  30. package/dist/Carousel/Carousel.js +2 -0
  31. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  32. package/dist/Chat/ChatComposerInput.js +6 -1
  33. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  34. package/dist/Chat/ChatMessageList.js +2 -1
  35. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  36. package/dist/Chat/useChatDictation.js +2 -0
  37. package/dist/Chat/useChatNewMessages.js +1 -1
  38. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  39. package/dist/Chat/useChatStreamScroll.js +2 -0
  40. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  41. package/dist/Chat/useSpeechRecognition.js +3 -0
  42. package/dist/Chat/useTriggerMenu.js +1 -1
  43. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  44. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  45. package/dist/CheckboxList/CheckboxList.d.ts +20 -2
  46. package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
  47. package/dist/CheckboxList/CheckboxList.js +12 -4
  48. package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
  49. package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
  50. package/dist/CheckboxList/CheckboxListContext.js +2 -1
  51. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  52. package/dist/CheckboxList/CheckboxListItem.js +14 -2
  53. package/dist/CheckboxList/requiredGroup.d.ts +22 -0
  54. package/dist/CheckboxList/requiredGroup.d.ts.map +1 -0
  55. package/dist/CheckboxList/requiredGroup.js +52 -0
  56. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  57. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  58. package/dist/CodeBlock/CodeBlock.js +28 -11
  59. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  60. package/dist/CommandPalette/CommandPalette.js +2 -0
  61. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  62. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  63. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  64. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  65. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  66. package/dist/ContextMenu/ContextMenu.js +2 -2
  67. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  68. package/dist/DateInput/MonthScroller.js +5 -2
  69. package/dist/DateInput/PickerWheel.d.ts +19 -0
  70. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  71. package/dist/DateInput/PickerWheel.js +646 -0
  72. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  73. package/dist/DateInput/TouchDateField.js +9 -30
  74. package/dist/DateInput/Wheel.d.ts +18 -37
  75. package/dist/DateInput/Wheel.d.ts.map +1 -1
  76. package/dist/DateInput/Wheel.js +133 -120
  77. package/dist/DateInput/datePickerTouch.d.ts +13 -0
  78. package/dist/DateInput/datePickerTouch.d.ts.map +1 -0
  79. package/dist/DateInput/datePickerTouch.js +14 -0
  80. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  81. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  82. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  83. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  84. package/dist/DateInput/usePointerDragScroll.js +2 -0
  85. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  86. package/dist/DateInput/useScrollSettle.js +3 -0
  87. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  88. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  89. package/dist/DateInput/useWheelListbox.js +88 -0
  90. package/dist/DateInput/wheelOptions.d.ts +94 -0
  91. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  92. package/dist/DateInput/wheelOptions.js +110 -0
  93. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  94. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  95. package/dist/DateInput/wheelPhysics.js +341 -0
  96. package/dist/DateInput/wheelStrip.d.ts +92 -0
  97. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  98. package/dist/DateInput/wheelStrip.js +258 -0
  99. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  100. package/dist/DateTimeInput/TouchDateTimeField.js +70 -127
  101. package/dist/Dialog/Dialog.d.ts.map +1 -1
  102. package/dist/Dialog/Dialog.js +9 -32
  103. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  104. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  105. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  106. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  107. package/dist/Field/Field.js +2 -2
  108. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  109. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  110. package/dist/FormLayout/FormLayout.d.ts +5 -1
  111. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  112. package/dist/HoverCard/HoverCard.d.ts +6 -4
  113. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  114. package/dist/HoverCard/HoverCard.js +48 -3
  115. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  116. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  117. package/dist/HoverCard/useHoverCard.js +26 -34
  118. package/dist/Icon/Icon.d.ts +5 -1
  119. package/dist/Icon/Icon.d.ts.map +1 -1
  120. package/dist/Icon/Icon.js +20 -3
  121. package/dist/InfoTip/InfoTip.d.ts +5 -5
  122. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  123. package/dist/InfoTip/InfoTip.js +58 -19
  124. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  125. package/dist/Item/useSwipeAction.js +3 -0
  126. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  127. package/dist/Layer/modalOutlet.js +2 -0
  128. package/dist/Layer/outsidePress.d.ts.map +1 -1
  129. package/dist/Layer/outsidePress.js +1 -0
  130. package/dist/Layer/useLayer.d.ts.map +1 -1
  131. package/dist/Layer/useLayer.js +4 -1
  132. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  133. package/dist/Layer/useLayerDismissal.js +3 -0
  134. package/dist/Layer/useTouchTrigger.d.ts +13 -7
  135. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  136. package/dist/Layer/useTouchTrigger.js +20 -6
  137. package/dist/Layout/index.d.ts +1 -1
  138. package/dist/Layout/index.d.ts.map +1 -1
  139. package/dist/Layout/index.js +1 -1
  140. package/dist/Layout/layoutReset.js +1 -1
  141. package/dist/Layout/overlayPaddingReset.stylex.d.ts +68 -0
  142. package/dist/Layout/overlayPaddingReset.stylex.d.ts.map +1 -0
  143. package/dist/Layout/overlayPaddingReset.stylex.js +72 -0
  144. package/dist/Layout/padding.stylex.d.ts +5 -129
  145. package/dist/Layout/padding.stylex.d.ts.map +1 -1
  146. package/dist/Layout/padding.stylex.js +9 -143
  147. package/dist/Layout/paddingStyles.stylex.d.ts +83 -0
  148. package/dist/Layout/paddingStyles.stylex.d.ts.map +1 -0
  149. package/dist/Layout/paddingStyles.stylex.js +99 -0
  150. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  151. package/dist/Lightbox/Lightbox.js +20 -1
  152. package/dist/MobileNav/MobileNav.d.ts +3 -2
  153. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  154. package/dist/MobileNav/MobileNav.js +10 -26
  155. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  156. package/dist/MultiSelector/MultiSelector.js +2 -1
  157. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  158. package/dist/NumberInput/NumberInput.js +2 -1
  159. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  160. package/dist/Outline/useOutlineFromDOM.js +3 -0
  161. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  162. package/dist/Outline/useScrollSpy.js +3 -0
  163. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  164. package/dist/OverflowList/OverflowList.js +3 -0
  165. package/dist/Overlay/Overlay.d.ts.map +1 -1
  166. package/dist/Overlay/Overlay.js +7 -2
  167. package/dist/Popover/Popover.d.ts.map +1 -1
  168. package/dist/Popover/Popover.js +6 -0
  169. package/dist/Popover/usePopover.js +2 -2
  170. package/dist/PowerSearch/PowerSearch.d.ts +41 -4
  171. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  172. package/dist/PowerSearch/PowerSearch.js +441 -134
  173. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +125 -0
  174. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  175. package/dist/PowerSearch/PowerSearchBottomSheet.js +2041 -0
  176. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  177. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  178. package/dist/PowerSearch/PowerSearchEditPopover.js +43 -10
  179. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  180. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  181. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  182. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  183. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  184. package/dist/PowerSearch/PowerSearchToken.js +3 -2
  185. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  186. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  187. package/dist/PowerSearch/PowerSearchValueEditor.js +273 -86
  188. package/dist/PowerSearch/formatFilterValue.d.ts +14 -7
  189. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  190. package/dist/PowerSearch/formatFilterValue.js +31 -23
  191. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  192. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  193. package/dist/PowerSearch/formatTokenValue.js +161 -0
  194. package/dist/PowerSearch/index.d.ts +1 -1
  195. package/dist/PowerSearch/index.d.ts.map +1 -1
  196. package/dist/PowerSearch/powerSearchDateZone.d.ts +25 -0
  197. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  198. package/dist/PowerSearch/powerSearchDateZone.js +57 -0
  199. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  200. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  201. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  202. package/dist/PowerSearch/types.d.ts +8 -1
  203. package/dist/PowerSearch/types.d.ts.map +1 -1
  204. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  205. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  206. package/dist/RadioList/RadioList.d.ts.map +1 -1
  207. package/dist/RadioList/RadioList.js +3 -2
  208. package/dist/RadioList/RadioListItem.d.ts +1 -1
  209. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  210. package/dist/RadioList/RadioListItem.js +5 -3
  211. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  212. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  213. package/dist/Resizable/ResizeHandle.js +116 -92
  214. package/dist/Resizable/createResizable.d.ts +199 -0
  215. package/dist/Resizable/createResizable.d.ts.map +1 -0
  216. package/dist/Resizable/createResizable.js +733 -0
  217. package/dist/Resizable/separatorAttributes.d.ts +45 -0
  218. package/dist/Resizable/separatorAttributes.d.ts.map +1 -0
  219. package/dist/Resizable/separatorAttributes.js +35 -0
  220. package/dist/Resizable/useResizable.d.ts +3 -3
  221. package/dist/Resizable/useResizable.d.ts.map +1 -1
  222. package/dist/Resizable/useResizable.js +252 -459
  223. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  224. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  225. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  226. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  227. package/dist/SelectableCard/SelectableCard.js +36 -11
  228. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  229. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  230. package/dist/SelectableCard/selectableCardInput.js +20 -0
  231. package/dist/Selector/Selector.d.ts.map +1 -1
  232. package/dist/Selector/Selector.js +7 -9
  233. package/dist/SideNav/SideNav.d.ts.map +1 -1
  234. package/dist/SideNav/SideNav.js +36 -5
  235. package/dist/Slider/Slider.d.ts.map +1 -1
  236. package/dist/Slider/Slider.js +16 -11
  237. package/dist/Slider/sliderTouchController.js +2 -2
  238. package/dist/Spinner/Spinner.d.ts +1 -1
  239. package/dist/Spinner/Spinner.d.ts.map +1 -1
  240. package/dist/Spinner/Spinner.js +60 -58
  241. package/dist/Stepper/Stepper.d.ts.map +1 -1
  242. package/dist/Stepper/Stepper.js +10 -15
  243. package/dist/Switch/Switch.d.ts.map +1 -1
  244. package/dist/Switch/Switch.js +4 -10
  245. package/dist/Switch/useSwitchTouch.js +4 -4
  246. package/dist/Table/BaseTable.d.ts.map +1 -1
  247. package/dist/Table/BaseTable.js +29 -8
  248. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  249. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  250. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  251. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  252. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +12 -0
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +17 -3
  255. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  256. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  257. package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
  258. package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
  259. package/dist/Table/plugins/tree/useTableTreeData.js +27 -14
  260. package/dist/TextArea/TextArea.d.ts.map +1 -1
  261. package/dist/TextArea/TextArea.js +2 -1
  262. package/dist/TextInput/TextInput.d.ts +2 -2
  263. package/dist/TextInput/TextInput.d.ts.map +1 -1
  264. package/dist/TextInput/TextInput.js +12 -8
  265. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  266. package/dist/TimeInput/TimeInput.js +2 -0
  267. package/dist/TimeInput/TimeWheels.d.ts +32 -0
  268. package/dist/TimeInput/TimeWheels.d.ts.map +1 -0
  269. package/dist/TimeInput/TimeWheels.js +144 -0
  270. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  271. package/dist/TimeInput/TouchTimeField.js +63 -116
  272. package/dist/TimeInput/timeWheelRules.d.ts +124 -0
  273. package/dist/TimeInput/timeWheelRules.d.ts.map +1 -0
  274. package/dist/TimeInput/timeWheelRules.js +277 -0
  275. package/dist/Timer/Timer.d.ts.map +1 -1
  276. package/dist/Timer/Timer.js +2 -0
  277. package/dist/Timestamp/Timestamp.js +1 -1
  278. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  279. package/dist/Timestamp/formatInstant.js +1 -23
  280. package/dist/Toast/Toast.d.ts +11 -1
  281. package/dist/Toast/Toast.d.ts.map +1 -1
  282. package/dist/Toast/Toast.js +25 -15
  283. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  284. package/dist/Toast/ToastViewport.js +97 -34
  285. package/dist/Toast/types.d.ts +9 -3
  286. package/dist/Toast/types.d.ts.map +1 -1
  287. package/dist/Toast/useToast.d.ts.map +1 -1
  288. package/dist/Toast/useToast.js +1 -0
  289. package/dist/Tokenizer/Tokenizer.d.ts +44 -46
  290. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  291. package/dist/Tokenizer/Tokenizer.js +20 -21
  292. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  293. package/dist/Tokenizer/TokenizerBottomSheet.js +12 -18
  294. package/dist/Tokenizer/index.d.ts +1 -1
  295. package/dist/Tokenizer/index.d.ts.map +1 -1
  296. package/dist/Tooltip/Tooltip.d.ts +2 -23
  297. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  298. package/dist/Tooltip/Tooltip.js +5 -29
  299. package/dist/Tooltip/useTooltip.d.ts +23 -30
  300. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  301. package/dist/Tooltip/useTooltip.js +200 -108
  302. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  303. package/dist/Typeahead/BaseTypeahead.js +27 -18
  304. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  305. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  306. package/dist/animator/createAnimator.d.ts +98 -0
  307. package/dist/animator/createAnimator.d.ts.map +1 -0
  308. package/dist/animator/createAnimator.js +259 -0
  309. package/dist/astryx.css +53 -8
  310. package/dist/gestures/GestureHost.d.ts +16 -1
  311. package/dist/gestures/GestureHost.d.ts.map +1 -1
  312. package/dist/gestures/GestureHost.js +4 -1
  313. package/dist/gestures/PressTracker.d.ts.map +1 -1
  314. package/dist/gestures/PressTracker.js +4 -3
  315. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  316. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  317. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  318. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  319. package/dist/hooks/actionGroupTracker.js +18 -7
  320. package/dist/hooks/index.d.ts +1 -0
  321. package/dist/hooks/index.d.ts.map +1 -1
  322. package/dist/hooks/index.js +1 -0
  323. package/dist/hooks/longPressDetector.d.ts +66 -0
  324. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  325. package/dist/hooks/longPressDetector.js +200 -0
  326. package/dist/hooks/pressGroupContext.d.ts +6 -0
  327. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  328. package/dist/hooks/pressGroupContext.js +20 -0
  329. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  330. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  331. package/dist/hooks/rootScrollStyles.js +207 -0
  332. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  333. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  334. package/dist/hooks/scrollLockTouchGuard.js +117 -0
  335. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  336. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  337. package/dist/hooks/scrollbarGutter.js +36 -23
  338. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  339. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  340. package/dist/hooks/useActionGroupTracking.js +174 -0
  341. package/dist/hooks/useAnimator.d.ts +41 -0
  342. package/dist/hooks/useAnimator.d.ts.map +1 -0
  343. package/dist/hooks/useAnimator.js +70 -0
  344. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  345. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  346. package/dist/hooks/useAttachment.d.ts +1 -1
  347. package/dist/hooks/useAttachment.js +1 -1
  348. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  349. package/dist/hooks/useAutoMediaMode.js +1 -0
  350. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  351. package/dist/hooks/useBusyAnnouncement.js +2 -0
  352. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  353. package/dist/hooks/useDevWarning.js +2 -0
  354. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  355. package/dist/hooks/useFocusTrap.js +2 -0
  356. package/dist/hooks/useGridFocus.d.ts +8 -5
  357. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  358. package/dist/hooks/useGridFocus.js +4 -3
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -0
  361. package/dist/hooks/useImageMode.d.ts.map +1 -1
  362. package/dist/hooks/useImageMode.js +3 -0
  363. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  364. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  365. package/dist/hooks/useInputStatusIcon.js +2 -2
  366. package/dist/hooks/useIsomorphicLayoutEffect.d.ts +2 -2
  367. package/dist/hooks/useIsomorphicLayoutEffect.d.ts.map +1 -1
  368. package/dist/hooks/useKeyboardHint.js +1 -1
  369. package/dist/hooks/useLongPress.d.ts +8 -9
  370. package/dist/hooks/useLongPress.d.ts.map +1 -1
  371. package/dist/hooks/useLongPress.js +23 -106
  372. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  373. package/dist/hooks/useMenuHover.js +2 -0
  374. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  375. package/dist/hooks/useMenuPress.js +3 -0
  376. package/dist/hooks/useOverflow.d.ts.map +1 -1
  377. package/dist/hooks/useOverflow.js +2 -1
  378. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  379. package/dist/hooks/usePressFeedback.js +1 -0
  380. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  381. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  382. package/dist/hooks/useResolvedRequired.js +3 -0
  383. package/dist/hooks/useScrollLock.d.ts +8 -9
  384. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  385. package/dist/hooks/useScrollLock.js +50 -48
  386. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  387. package/dist/hooks/useScrollableArea.js +5 -0
  388. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  389. package/dist/hooks/useStreamingText.js +3 -0
  390. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  391. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  392. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +45 -0
  393. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  394. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  395. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  396. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  397. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  398. package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts +8 -0
  399. package/dist/i18n/generated-english/Resizable/createResizable.generated.d.ts.map +1 -0
  400. package/dist/i18n/generated-english/Resizable/createResizable.generated.js +13 -0
  401. package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.d.ts.map +1 -1
  402. package/dist/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.js +3 -1
  403. package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.d.ts.map +1 -1
  404. package/dist/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.js +3 -1
  405. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts +8 -0
  406. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.d.ts.map +1 -0
  407. package/dist/i18n/generated-english/TimeInput/TimeWheels.generated.js +17 -0
  408. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  409. package/dist/i18n/generated-locales/en.generated.js +37 -0
  410. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  411. package/dist/i18n/generated-locales/pseudo.generated.js +37 -0
  412. package/dist/index.d.ts +1 -0
  413. package/dist/index.d.ts.map +1 -1
  414. package/dist/index.js +4 -0
  415. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  416. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  417. package/dist/internal/indicatorPress.stylex.js +26 -0
  418. package/dist/internal/selectable-card.d.ts +21 -0
  419. package/dist/internal/selectable-card.d.ts.map +1 -0
  420. package/dist/internal/selectable-card.js +20 -0
  421. package/dist/internal/sheetDraft.d.ts +2 -2
  422. package/dist/internal/sheetDraft.js +2 -2
  423. package/dist/keyboard/index.d.ts +17 -0
  424. package/dist/keyboard/index.d.ts.map +1 -0
  425. package/dist/keyboard/index.js +19 -0
  426. package/dist/keyboard/keyboardHeight.d.ts +149 -0
  427. package/dist/keyboard/keyboardHeight.d.ts.map +1 -0
  428. package/dist/keyboard/keyboardHeight.js +432 -0
  429. package/dist/keyboard/keyboardLayoutGuide.d.ts +59 -0
  430. package/dist/keyboard/keyboardLayoutGuide.d.ts.map +1 -0
  431. package/dist/keyboard/keyboardLayoutGuide.js +207 -0
  432. package/dist/keyboard/keyboardModel.d.ts +93 -0
  433. package/dist/keyboard/keyboardModel.d.ts.map +1 -0
  434. package/dist/keyboard/keyboardModel.js +220 -0
  435. package/dist/keyboard/rideKeyboard.d.ts +42 -0
  436. package/dist/keyboard/rideKeyboard.d.ts.map +1 -0
  437. package/dist/keyboard/rideKeyboard.js +77 -0
  438. package/dist/keyboard/useMobileKeyboard.d.ts +61 -0
  439. package/dist/keyboard/useMobileKeyboard.d.ts.map +1 -0
  440. package/dist/keyboard/useMobileKeyboard.js +699 -0
  441. package/dist/motion/android/index.d.ts +16 -0
  442. package/dist/motion/android/index.d.ts.map +1 -0
  443. package/dist/motion/android/index.js +18 -0
  444. package/dist/motion/android/keyboard.d.ts +83 -0
  445. package/dist/motion/android/keyboard.d.ts.map +1 -0
  446. package/dist/motion/android/keyboard.js +96 -0
  447. package/dist/motion/animatedLayout.d.ts +8 -0
  448. package/dist/motion/animatedLayout.d.ts.map +1 -1
  449. package/dist/motion/animatedLayout.js +246 -53
  450. package/dist/motion/animator.d.ts +14 -14
  451. package/dist/motion/animator.d.ts.map +1 -1
  452. package/dist/motion/animator.js +45 -26
  453. package/dist/motion/frameBlock.d.ts +14 -0
  454. package/dist/motion/frameBlock.d.ts.map +1 -0
  455. package/dist/motion/frameBlock.js +16 -0
  456. package/dist/motion/progress.d.ts +88 -0
  457. package/dist/motion/progress.d.ts.map +1 -0
  458. package/dist/motion/progress.js +128 -0
  459. package/dist/motion/reducedMotion.d.ts.map +1 -1
  460. package/dist/motion/reducedMotion.js +3 -1
  461. package/dist/motion/uikit/alert.d.ts +41 -0
  462. package/dist/motion/uikit/alert.d.ts.map +1 -0
  463. package/dist/motion/uikit/alert.js +43 -0
  464. package/dist/motion/uikit/datePicker.d.ts +58 -0
  465. package/dist/motion/uikit/datePicker.d.ts.map +1 -0
  466. package/dist/motion/uikit/datePicker.js +60 -0
  467. package/dist/motion/uikit/index.d.ts +6 -4
  468. package/dist/motion/uikit/index.d.ts.map +1 -1
  469. package/dist/motion/uikit/index.js +6 -4
  470. package/dist/motion/uikit/picker.d.ts +96 -0
  471. package/dist/motion/uikit/picker.d.ts.map +1 -0
  472. package/dist/motion/uikit/picker.js +117 -0
  473. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  474. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  475. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  476. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  477. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  478. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  479. package/dist/theme/Theme.d.ts.map +1 -1
  480. package/dist/theme/Theme.js +29 -4
  481. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  482. package/dist/theme/generateThemeRules.js +14 -13
  483. package/dist/theme/motionKnobs.d.ts +4 -3
  484. package/dist/theme/motionKnobs.d.ts.map +1 -1
  485. package/dist/theme/motionKnobs.js +3 -2
  486. package/dist/theme/themeMotion.d.ts +6 -0
  487. package/dist/theme/themeMotion.d.ts.map +1 -1
  488. package/dist/theme/themeMotion.js +15 -2
  489. package/dist/theme/tokens.stylex.d.ts +3 -0
  490. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  491. package/dist/theme/tokens.stylex.js +4 -1
  492. package/dist/utils/dateParser.d.ts.map +1 -1
  493. package/dist/utils/dateParser.js +12 -0
  494. package/dist/utils/disabledInteraction.d.ts +10 -2
  495. package/dist/utils/disabledInteraction.d.ts.map +1 -1
  496. package/dist/utils/disabledInteraction.js +16 -2
  497. package/dist/utils/focusReturn.d.ts +22 -25
  498. package/dist/utils/focusReturn.d.ts.map +1 -1
  499. package/dist/utils/focusReturn.js +36 -29
  500. package/dist/utils/index.d.ts +1 -1
  501. package/dist/utils/index.d.ts.map +1 -1
  502. package/dist/utils/index.js +1 -1
  503. package/dist/utils/interactionModality.d.ts.map +1 -1
  504. package/dist/utils/interactionModality.js +4 -0
  505. package/dist/utils/interactionOverlay.stylex.d.ts +6 -4
  506. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  507. package/dist/utils/interactionOverlay.stylex.js +6 -4
  508. package/dist/utils/isFocusDetached.d.ts +27 -0
  509. package/dist/utils/isFocusDetached.d.ts.map +1 -0
  510. package/dist/utils/isFocusDetached.js +32 -0
  511. package/dist/utils/layoutViewport.d.ts +25 -0
  512. package/dist/utils/layoutViewport.d.ts.map +1 -0
  513. package/dist/utils/layoutViewport.js +102 -0
  514. package/dist/utils/plainDate.d.ts +31 -0
  515. package/dist/utils/plainDate.d.ts.map +1 -1
  516. package/dist/utils/plainDate.js +68 -4
  517. package/dist/utils/pressFeedback.d.ts +6 -0
  518. package/dist/utils/pressFeedback.d.ts.map +1 -1
  519. package/dist/utils/pressFeedback.js +97 -18
  520. package/dist/utils/pressGesture.d.ts +4 -2
  521. package/dist/utils/pressGesture.d.ts.map +1 -1
  522. package/dist/utils/pressGesture.js +3 -1
  523. package/dist/utils/selectionLock.d.ts +10 -1
  524. package/dist/utils/selectionLock.d.ts.map +1 -1
  525. package/dist/utils/selectionLock.js +31 -5
  526. package/dist/utils/sharedMutationObserver.d.ts +2 -1
  527. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  528. package/dist/utils/sharedMutationObserver.js +2 -1
  529. package/dist/utils/timeParser.d.ts +2 -1
  530. package/dist/utils/timeParser.d.ts.map +1 -1
  531. package/dist/utils/timeParser.js +29 -3
  532. package/dist/utils/triggerFocus.d.ts +36 -0
  533. package/dist/utils/triggerFocus.d.ts.map +1 -0
  534. package/dist/utils/triggerFocus.js +65 -0
  535. package/locales/en.json +148 -0
  536. package/locales/pseudo.json +111 -0
  537. package/package.json +14 -9
  538. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  539. package/src/AlertDialog/AlertDialog.tsx +46 -5
  540. package/src/AppShell/AppShell.tsx +13 -4
  541. package/src/BottomSheet/BottomSheet.doc.mjs +1 -1
  542. package/src/BottomSheet/BottomSheet.tsx +1 -0
  543. package/src/BottomSheet/BottomSheetPanel.tsx +80 -16
  544. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +5 -0
  545. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  546. package/src/BottomSheet/bottomSheetStack.ts +1 -1
  547. package/src/BottomSheet/useSheetGestures.ts +16 -1
  548. package/src/Button/Button.tsx +26 -4
  549. package/src/Calendar/Calendar.tsx +40 -32
  550. package/src/Calendar/getWeekdayHeaderNames.ts +88 -0
  551. package/src/Calendar/hooks/useCalendarDays.ts +5 -10
  552. package/src/Calendar/{standaloneShortWeekdayNames.generated.ts → weekdayHeaderNames.generated.ts} +14 -14
  553. package/src/Carousel/Carousel.tsx +1 -0
  554. package/src/Chat/ChatComposerInput.tsx +4 -7
  555. package/src/Chat/ChatMessageList.tsx +2 -1
  556. package/src/Chat/useChatDictation.ts +1 -0
  557. package/src/Chat/useChatNewMessages.ts +1 -1
  558. package/src/Chat/useChatStreamScroll.ts +2 -0
  559. package/src/Chat/useSpeechRecognition.ts +2 -0
  560. package/src/Chat/useTriggerMenu.tsx +1 -1
  561. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  562. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  563. package/src/CheckboxList/CheckboxList.doc.mjs +14 -0
  564. package/src/CheckboxList/CheckboxList.tsx +43 -2
  565. package/src/CheckboxList/CheckboxListContext.tsx +9 -1
  566. package/src/CheckboxList/CheckboxListItem.tsx +23 -2
  567. package/src/CheckboxList/requiredGroup.ts +77 -0
  568. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  569. package/src/CodeBlock/CodeBlock.tsx +41 -4
  570. package/src/CommandPalette/CommandPalette.tsx +1 -0
  571. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  572. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  573. package/src/ContextMenu/ContextMenu.tsx +2 -2
  574. package/src/DateInput/MonthScroller.tsx +8 -2
  575. package/src/DateInput/PickerWheel.tsx +796 -0
  576. package/src/DateInput/TouchDateField.tsx +6 -32
  577. package/src/DateInput/Wheel.tsx +188 -171
  578. package/src/DateInput/datePickerTouch.ts +15 -0
  579. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  580. package/src/DateInput/usePointerDragScroll.ts +1 -0
  581. package/src/DateInput/useScrollSettle.ts +2 -0
  582. package/src/DateInput/useWheelListbox.ts +112 -0
  583. package/src/DateInput/wheelOptions.ts +184 -0
  584. package/src/DateInput/wheelPhysics.ts +406 -0
  585. package/src/DateInput/wheelStrip.ts +341 -0
  586. package/src/DateTimeInput/TouchDateTimeField.tsx +100 -189
  587. package/src/Dialog/Dialog.tsx +12 -32
  588. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  589. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  590. package/src/Field/Field.tsx +2 -2
  591. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  592. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  593. package/src/FormLayout/FormLayout.tsx +5 -1
  594. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  595. package/src/HoverCard/HoverCard.tsx +58 -6
  596. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  597. package/src/HoverCard/useHoverCard.tsx +55 -55
  598. package/src/Icon/Icon.doc.mjs +51 -10
  599. package/src/Icon/Icon.tsx +31 -8
  600. package/src/IconButton/IconButton.doc.mjs +141 -21
  601. package/src/InfoTip/InfoTip.tsx +72 -16
  602. package/src/Item/useSwipeAction.ts +2 -0
  603. package/src/Layer/modalOutlet.ts +2 -0
  604. package/src/Layer/outsidePress.ts +1 -0
  605. package/src/Layer/useLayer.tsx +3 -1
  606. package/src/Layer/useLayerDismissal.ts +2 -0
  607. package/src/Layer/useTouchTrigger.ts +19 -6
  608. package/src/Layout/index.ts +1 -1
  609. package/src/Layout/layoutReset.ts +1 -1
  610. package/src/Layout/overlayPaddingReset.stylex.ts +73 -0
  611. package/src/Layout/padding.stylex.ts +9 -133
  612. package/src/Layout/paddingStyles.stylex.ts +87 -0
  613. package/src/Lightbox/Lightbox.tsx +20 -1
  614. package/src/Lightbox/useLightbox.doc.mjs +167 -0
  615. package/src/MobileNav/MobileNav.tsx +10 -31
  616. package/src/MultiSelector/MultiSelector.tsx +2 -7
  617. package/src/NumberInput/NumberInput.tsx +2 -7
  618. package/src/Outline/useOutlineFromDOM.ts +2 -0
  619. package/src/Outline/useScrollSpy.ts +2 -0
  620. package/src/OverflowList/OverflowList.tsx +2 -0
  621. package/src/Overlay/Overlay.tsx +7 -2
  622. package/src/Popover/Popover.tsx +4 -0
  623. package/src/Popover/usePopover.tsx +2 -2
  624. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  625. package/src/PowerSearch/PowerSearch.tsx +622 -157
  626. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2700 -0
  627. package/src/PowerSearch/PowerSearchEditPopover.tsx +65 -9
  628. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  629. package/src/PowerSearch/PowerSearchToken.tsx +2 -0
  630. package/src/PowerSearch/PowerSearchValueEditor.tsx +340 -59
  631. package/src/PowerSearch/formatFilterValue.ts +49 -27
  632. package/src/PowerSearch/formatTokenValue.ts +220 -0
  633. package/src/PowerSearch/index.ts +5 -1
  634. package/src/PowerSearch/powerSearchDateZone.ts +95 -0
  635. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  636. package/src/PowerSearch/types.ts +8 -1
  637. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  638. package/src/RadioList/RadioList.tsx +3 -2
  639. package/src/RadioList/RadioListItem.tsx +5 -3
  640. package/src/Resizable/Resizable.doc.mjs +5 -4
  641. package/src/Resizable/ResizeHandle.tsx +187 -135
  642. package/src/Resizable/createResizable.ts +1046 -0
  643. package/src/Resizable/separatorAttributes.ts +73 -0
  644. package/src/Resizable/useResizable.ts +292 -623
  645. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  646. package/src/SelectableCard/SelectableCard.tsx +39 -10
  647. package/src/SelectableCard/selectableCardInput.ts +30 -0
  648. package/src/Selector/Selector.tsx +7 -19
  649. package/src/SideNav/SideNav.tsx +41 -5
  650. package/src/Slider/Slider.tsx +20 -11
  651. package/src/Slider/sliderTouchController.ts +2 -2
  652. package/src/Spinner/Spinner.tsx +77 -63
  653. package/src/Stepper/Stepper.tsx +10 -27
  654. package/src/Switch/Switch.tsx +2 -6
  655. package/src/Switch/useSwitchTouch.ts +4 -4
  656. package/src/Table/BaseTable.tsx +46 -12
  657. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  658. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  659. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +31 -7
  660. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  661. package/src/Table/plugins/tree/useTableTreeData.tsx +43 -20
  662. package/src/Table/useTableRowExpansion.doc.mjs +9 -0
  663. package/src/Table/useTableTreeData.doc.mjs +15 -3
  664. package/src/TextArea/TextArea.tsx +2 -7
  665. package/src/TextInput/TextInput.tsx +13 -17
  666. package/src/TimeInput/TimeInput.tsx +2 -0
  667. package/src/TimeInput/TimeWheels.tsx +218 -0
  668. package/src/TimeInput/TouchTimeField.tsx +93 -155
  669. package/src/TimeInput/timeWheelRules.ts +352 -0
  670. package/src/Timer/Timer.tsx +1 -0
  671. package/src/Timestamp/Timestamp.tsx +1 -1
  672. package/src/Timestamp/formatInstant.ts +1 -33
  673. package/src/Toast/Toast.doc.mjs +4 -3
  674. package/src/Toast/Toast.tsx +52 -32
  675. package/src/Toast/ToastViewport.tsx +123 -35
  676. package/src/Toast/types.ts +9 -3
  677. package/src/Toast/useToast.tsx +1 -0
  678. package/src/Tokenizer/Tokenizer.doc.mjs +10 -10
  679. package/src/Tokenizer/Tokenizer.tsx +61 -62
  680. package/src/Tokenizer/TokenizerBottomSheet.tsx +17 -23
  681. package/src/Tokenizer/index.ts +1 -0
  682. package/src/Tooltip/Tooltip.tsx +6 -42
  683. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  684. package/src/Tooltip/useTooltip.tsx +243 -134
  685. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  686. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  687. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  688. package/src/animator/createAnimator.doc.mjs +153 -0
  689. package/src/animator/createAnimator.ts +324 -0
  690. package/src/gestures/GestureHost.ts +6 -5
  691. package/src/gestures/PressTracker.ts +4 -3
  692. package/src/gestures/README.md +10 -4
  693. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  694. package/src/hooks/actionGroupTracker.ts +25 -9
  695. package/src/hooks/index.ts +2 -0
  696. package/src/hooks/longPressDetector.ts +273 -0
  697. package/src/hooks/pressGroupContext.ts +21 -0
  698. package/src/hooks/rootScrollStyles.ts +247 -0
  699. package/src/hooks/scrollLockTouchGuard.ts +149 -0
  700. package/src/hooks/scrollbarGutter.ts +41 -26
  701. package/src/hooks/useActionGroupTracking.ts +224 -0
  702. package/src/hooks/useAnimator.doc.mjs +109 -0
  703. package/src/hooks/useAnimator.ts +67 -0
  704. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  705. package/src/hooks/useAttachment.ts +1 -1
  706. package/src/hooks/useAutoMediaMode.ts +1 -0
  707. package/src/hooks/useBusyAnnouncement.ts +2 -0
  708. package/src/hooks/useDevWarning.ts +2 -0
  709. package/src/hooks/useFocusTrap.ts +2 -0
  710. package/src/hooks/useGridFocus.doc.mjs +6 -6
  711. package/src/hooks/useGridFocus.ts +10 -7
  712. package/src/hooks/useHotkeys.ts +2 -0
  713. package/src/hooks/useImageMode.ts +2 -0
  714. package/src/hooks/useInputStatusIcon.tsx +3 -2
  715. package/src/hooks/useKeyboardHint.tsx +1 -1
  716. package/src/hooks/useLongPress.doc.mjs +2 -2
  717. package/src/hooks/useLongPress.ts +32 -122
  718. package/src/hooks/useMenuHover.ts +1 -0
  719. package/src/hooks/useMenuPress.ts +2 -0
  720. package/src/hooks/useOverflow.ts +2 -1
  721. package/src/hooks/usePressFeedback.ts +1 -0
  722. package/src/hooks/useResolvedRequired.ts +3 -0
  723. package/src/hooks/useScrollLock.doc.mjs +51 -12
  724. package/src/hooks/useScrollLock.ts +53 -60
  725. package/src/hooks/useScrollableArea.ts +4 -0
  726. package/src/hooks/useStreamingText.ts +2 -0
  727. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +46 -0
  728. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  729. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  730. package/src/i18n/generated-english/Resizable/createResizable.generated.ts +14 -0
  731. package/src/i18n/generated-english/Table/plugins/rowExpansion/useTableRowExpansion.generated.ts +3 -1
  732. package/src/i18n/generated-english/Table/plugins/tree/useTableTreeData.generated.ts +3 -1
  733. package/src/i18n/generated-english/TimeInput/TimeWheels.generated.ts +18 -0
  734. package/src/i18n/generated-locales/en.generated.ts +47 -0
  735. package/src/i18n/generated-locales/pseudo.generated.ts +48 -0
  736. package/src/index.ts +13 -0
  737. package/src/internal/indicatorPress.stylex.ts +24 -0
  738. package/src/internal/selectable-card.ts +21 -0
  739. package/src/internal/sheetDraft.ts +2 -2
  740. package/src/keyboard/README.md +197 -0
  741. package/src/keyboard/index.ts +48 -0
  742. package/src/keyboard/keyboardHeight.ts +543 -0
  743. package/src/keyboard/keyboardLayoutGuide.ts +266 -0
  744. package/src/keyboard/keyboardModel.ts +301 -0
  745. package/src/keyboard/rideKeyboard.ts +100 -0
  746. package/src/keyboard/useMobileKeyboard.ts +866 -0
  747. package/src/motion/MEASUREMENTS.md +28 -0
  748. package/src/motion/README.md +12 -5
  749. package/src/motion/android/index.ts +18 -0
  750. package/src/motion/android/keyboard.ts +96 -0
  751. package/src/motion/animatedLayout.ts +323 -60
  752. package/src/motion/animator.ts +66 -37
  753. package/src/motion/frameBlock.ts +16 -0
  754. package/src/motion/progress.ts +155 -0
  755. package/src/motion/reducedMotion.ts +3 -1
  756. package/src/motion/uikit/alert.ts +43 -0
  757. package/src/motion/uikit/datePicker.ts +60 -0
  758. package/src/motion/uikit/index.ts +6 -4
  759. package/src/motion/uikit/picker.ts +116 -0
  760. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  761. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  762. package/src/theme/Theme.tsx +37 -3
  763. package/src/theme/generateThemeRules.ts +14 -12
  764. package/src/theme/motionKnobs.ts +4 -3
  765. package/src/theme/themeMotion.ts +17 -2
  766. package/src/theme/tokens.stylex.ts +2 -0
  767. package/src/utils/dateParser.ts +16 -0
  768. package/src/utils/disabledInteraction.ts +23 -2
  769. package/src/utils/focusReturn.ts +38 -31
  770. package/src/utils/index.ts +1 -1
  771. package/src/utils/interactionModality.ts +4 -0
  772. package/src/utils/interactionOverlay.stylex.ts +6 -4
  773. package/src/utils/isFocusDetached.ts +34 -0
  774. package/src/utils/layoutViewport.ts +104 -0
  775. package/src/utils/plainDate.ts +80 -4
  776. package/src/utils/pressFeedback.ts +126 -30
  777. package/src/utils/pressGesture.ts +4 -2
  778. package/src/utils/selectionLock.ts +40 -6
  779. package/src/utils/sharedMutationObserver.ts +2 -1
  780. package/src/utils/timeParser.ts +40 -3
  781. package/src/utils/triggerFocus.ts +80 -0
  782. package/dist/BottomSheet/useMobileKeyboard.d.ts +0 -21
  783. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +0 -1
  784. package/dist/BottomSheet/useMobileKeyboard.js +0 -407
  785. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +0 -14
  786. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts.map +0 -1
  787. package/dist/Calendar/getStandaloneShortWeekdayNames.js +0 -26
  788. package/dist/Calendar/standaloneShortWeekdayNames.generated.d.ts.map +0 -1
  789. package/dist/Layer/usePressPin.d.ts +0 -93
  790. package/dist/Layer/usePressPin.d.ts.map +0 -1
  791. package/dist/Layer/usePressPin.js +0 -363
  792. package/dist/internal/touch-sheet.d.ts +0 -21
  793. package/dist/internal/touch-sheet.d.ts.map +0 -1
  794. package/dist/internal/touch-sheet.js +0 -19
  795. package/src/BottomSheet/useMobileKeyboard.ts +0 -538
  796. package/src/Calendar/getStandaloneShortWeekdayNames.ts +0 -38
  797. package/src/Layer/usePressPin.ts +0 -510
  798. package/src/internal/touch-sheet.ts +0 -21
@@ -4,19 +4,25 @@
4
4
 
5
5
  /**
6
6
  * @file PowerSearch.tsx
7
- * @input PowerSearchConfig, filters, onChange
7
+ * @input PowerSearchConfig, filters, onChange; Tokenizer, Field parts, Token,
8
+ * useAdaptivePresentation, and PowerSearchBottomSheet (lazy)
8
9
  * @output Structured filter bar with token-based filter management
9
10
  * @position Main component; forwards DOM ref and exposes tokenizer control via
10
- * handleRef
11
+ * handleRef. The `presentation` prop swaps the tokenizer field and editor
12
+ * popover for one trigger that opens PowerSearchBottomSheet.
11
13
  *
12
14
  * SYNC: When modified, update:
13
15
  * - /packages/core/src/PowerSearch/index.ts
16
+ * - /packages/core/src/PowerSearch/PowerSearchBottomSheet.tsx (sheet presentation)
14
17
  * - /packages/cli/assets/templates/blocks/components/PowerSearch/ (showcase blocks)
15
18
  */
16
19
 
17
20
  import React, {
21
+ lazy,
22
+ Suspense,
18
23
  useCallback,
19
24
  useEffect,
25
+ useId,
20
26
  useImperativeHandle,
21
27
  useMemo,
22
28
  useRef,
@@ -37,30 +43,48 @@ import {Token} from '../Token';
37
43
  import {TokenNamingContext} from '../Token/TokenNamingContext';
38
44
  import {Avatar} from '../Avatar';
39
45
  import {layerAnimations} from '../Layer/layerAnimations.stylex';
40
- import {Icon} from '../Icon';
46
+ import {Icon, renderIconSlot} from '../Icon';
41
47
  import type {IconType} from '../Icon';
42
48
  import type {IconName} from '../Icon/globalIconRegistry';
43
49
  import type {InputStatus} from '../Field';
50
+ import {Field} from '../Field/Field';
51
+ import {
52
+ inputStatusBorderStyles,
53
+ inputStatusFocusWithinStyles,
54
+ inputStatusHoverShadowStyles,
55
+ inputWrapperStyles,
56
+ } from '../Field/inputStyles.stylex';
44
57
  import {usePopover} from '../Popover/usePopover';
58
+ import {useTooltip} from '../Tooltip/useTooltip';
45
59
  import {layerViewportInset} from '../Layer/layerViewportInset.stylex';
46
60
  import {useAnnounce} from '../hooks/useAnnounce';
61
+ import {
62
+ type AdaptivePresentation,
63
+ useAdaptivePresentation,
64
+ } from '../hooks/useAdaptivePresentation';
65
+ import {useDevWarning} from '../hooks/useDevWarning';
66
+ import {useIsHydrating} from '../hooks/useIsHydrating';
47
67
  import {
48
68
  spacingVars,
49
69
  colorVars,
70
+ sizeVars,
50
71
  typeScaleVars,
72
+ typographyVars,
51
73
  fontWeightVars,
52
74
  } from '../theme/tokens.stylex';
53
75
  import {useSize} from '../SizeContext/SizeContext';
76
+ import {isFocusDetached} from '../utils/isFocusDetached';
77
+ import {isRenderable} from '../utils/isRenderable';
54
78
  import {useInternalConfig} from './useInternalConfig';
55
79
  import {usePowerSearchSource} from './usePowerSearchSource';
80
+ import {formatFilterValue} from './formatFilterValue';
81
+ import {NestedEditor, PowerSearchEditPopover} from './PowerSearchEditPopover';
56
82
  import {
57
- formatFilterValue,
58
- formatDateAbsoluteCompact,
59
- } from './formatFilterValue';
60
- import {PowerSearchEditPopover} from './PowerSearchEditPopover';
83
+ buildRelativeDateOptions,
84
+ PowerSearchValueEditor,
85
+ } from './PowerSearchValueEditor';
61
86
  import {resolveOperatorLabel} from './resolveOperatorLabel';
62
87
  import {themeProps} from '../utils/themeProps';
63
- import {truncateCharacters} from '../utils/characters';
64
88
  import {useLocale} from '../i18n/useLocale';
65
89
  import type {Locale} from '../i18n/types';
66
90
  import type {SearchableItem} from '../Typeahead/types';
@@ -74,10 +98,14 @@ import type {
74
98
  PowerSearchHandle,
75
99
  FilterValue,
76
100
  OperatorValue,
77
- EnumItem,
78
101
  PowerSearchComponents,
79
102
  PowerSearchOperator,
80
103
  } from './types';
104
+ import type {
105
+ PowerSearchBottomSheetProps,
106
+ PowerSearchSheetEditors,
107
+ } from './PowerSearchBottomSheet';
108
+ import {formatTokenValueText} from './formatTokenValue';
81
109
 
82
110
  import {useMergedRefs} from '../hooks/useMergedRefs';
83
111
  import type {FieldStatusPlacement} from '../Field/fieldStatusPlacement';
@@ -150,130 +178,127 @@ const resultCountStyles = stylex.create({
150
178
  },
151
179
  });
152
180
 
153
- function truncateString(value: string, limit: number): string {
154
- // Same semantics as before — strings within limit + 3 pass through, longer
155
- // ones cut to limit + '...' — but counted in characters, not code units.
156
- return truncateCharacters(value, limit + 3, '...');
157
- }
181
+ // The sheet presentation's trigger field: the same control box as the
182
+ // tokenizer field, with display-only tokens and one button as its only tab
183
+ // stop.
184
+ const sheetTriggerSizeStyles = stylex.create({
185
+ sm: {minHeight: sizeVars['--size-element-sm']},
186
+ md: {minHeight: sizeVars['--size-element-md']},
187
+ lg: {minHeight: sizeVars['--size-element-lg']},
188
+ });
158
189
 
159
- function getEnumLabel(values: ReadonlyArray<EnumItem>, value: string): string {
160
- return values.find(v => v.value === value)?.label ?? value;
161
- }
190
+ const sheetTriggerStyles = stylex.create({
191
+ wrapper: {
192
+ position: 'relative',
193
+ flexWrap: 'nowrap',
194
+ gap: spacingVars['--spacing-1'],
195
+ height: 'auto',
196
+ cursor: {
197
+ default: 'pointer',
198
+ ':is([aria-disabled="true"])': 'default',
199
+ },
200
+ },
201
+ wrapperWithTokens: {
202
+ paddingBlock: `calc(${spacingVars['--spacing-1']} - 1px)`,
203
+ paddingInline: `calc(${spacingVars['--spacing-1']} - 1px)`,
204
+ },
205
+ contentSection: {
206
+ position: 'relative',
207
+ minWidth: 0,
208
+ flexGrow: 1,
209
+ display: 'flex',
210
+ alignItems: 'center',
211
+ flexWrap: 'wrap',
212
+ columnGap: spacingVars['--spacing-1'],
213
+ rowGap: `calc(${spacingVars['--spacing-1']} - 1px)`,
214
+ },
215
+ startIconWithTokens: {
216
+ marginInlineStart: `calc(${spacingVars['--spacing-2']} - ${spacingVars['--spacing-1']} + 1px)`,
217
+ },
218
+ // The only tab stop in the field. It stays visually borderless while the
219
+ // wrapper delegates taps on tokens and empty space to it.
220
+ trigger: {
221
+ appearance: 'none',
222
+ flex: '1 1 40px',
223
+ minWidth: '40px',
224
+ alignSelf: 'stretch',
225
+ display: 'flex',
226
+ alignItems: 'center',
227
+ paddingBlock: 0,
228
+ paddingInline: spacingVars['--spacing-1'],
229
+ margin: 0,
230
+ borderWidth: 0,
231
+ borderStyle: 'none',
232
+ backgroundColor: 'transparent',
233
+ color: colorVars['--color-text-secondary'],
234
+ fontFamily: typographyVars['--font-family-body'],
235
+ fontSize: typeScaleVars['--text-body-size'],
236
+ lineHeight: typeScaleVars['--text-body-leading'],
237
+ textAlign: 'start',
238
+ whiteSpace: 'nowrap',
239
+ cursor: {
240
+ default: 'pointer',
241
+ ':is([aria-disabled="true"])': 'default',
242
+ },
243
+ outline: 'none',
244
+ },
245
+ // Once a token is present the empty trigger covers the token lane instead
246
+ // of reserving 40px or wrapping onto an otherwise blank row.
247
+ triggerWithTokens: {
248
+ position: 'absolute',
249
+ inset: 0,
250
+ minWidth: 0,
251
+ padding: 0,
252
+ },
253
+ endSection: {
254
+ display: 'flex',
255
+ alignItems: 'center',
256
+ gap: spacingVars['--spacing-2'],
257
+ flexShrink: 0,
258
+ paddingInlineEnd: spacingVars['--spacing-1'],
259
+ },
260
+ });
261
+
262
+ // The sheet flow (three standalone sheets, the sheet editors) only
263
+ // renders for the bottom-sheet presentation. Loading it on demand keeps it out
264
+ // of pages whose PowerSearch stays a tokenizer field.
265
+ // One import promise, shared by the preload and the lazy element: the sheet
266
+ // presentation loads the flow's chunk as soon as it is active, so the first
267
+ // press does not wait for the network, while nothing of the flow is rendered
268
+ // until a press.
269
+ const loadPowerSearchBottomSheet = async () =>
270
+ import('./PowerSearchBottomSheet');
271
+ const LazyPowerSearchBottomSheet = lazy(async () =>
272
+ loadPowerSearchBottomSheet().then(module => ({
273
+ default: module.PowerSearchBottomSheet,
274
+ })),
275
+ );
276
+ // The value step reuses the popover presentation's editors, which this
277
+ // module already loads; see PowerSearchSheetEditors.
278
+ const SHEET_EDITORS: PowerSearchSheetEditors = {
279
+ NestedEditor,
280
+ PowerSearchValueEditor,
281
+ buildRelativeDateOptions,
282
+ };
162
283
 
163
284
  /**
164
- * The visible text of a filter token's value. The token renders it, and the
165
- * token's remove button and editor dialog are named by the same text.
285
+ * Hosts the lazily loaded sheet flow. Renders nothing on the server or in the
286
+ * render that hydrates server HTML: a lazy component that has not loaded yet
287
+ * would leave server markup incomplete and abort hydration. The closed flow
288
+ * has no visible markup, so it first renders right after hydration.
166
289
  */
167
- function tokenValueText(
168
- operatorValue: OperatorValue,
169
- filterValue: FilterValue,
170
- maxLength: number,
171
- locale: Locale,
172
- ): string | null {
173
- switch (filterValue.type) {
174
- case 'empty':
175
- return null;
176
-
177
- case 'string':
178
- return truncateString(filterValue.value, maxLength);
179
-
180
- case 'integer':
181
- case 'float':
182
- return String(filterValue.value);
183
-
184
- case 'enum':
185
- if (operatorValue.type === 'enum') {
186
- return truncateString(
187
- getEnumLabel(operatorValue.values, filterValue.value),
188
- maxLength,
189
- );
190
- }
191
- return truncateString(filterValue.value, maxLength);
192
-
193
- case 'string_list': {
194
- const items = filterValue.value;
195
- if (items.length === 0) {
196
- return null;
197
- }
198
- if (items.length === 1) {
199
- return truncateString(items[0], maxLength);
200
- }
201
- const totalLength = items.reduce((sum, s) => sum + s.length, 0);
202
- if (totalLength > maxLength) {
203
- return `${items.length} items`;
204
- }
205
- return items.join(', ');
206
- }
207
-
208
- case 'enum_list': {
209
- const items = filterValue.value;
210
- if (items.length === 0) {
211
- return null;
212
- }
213
- if (operatorValue.type === 'enum_list') {
214
- const labels = items.map(v => getEnumLabel(operatorValue.values, v));
215
- if (labels.length === 1) {
216
- return truncateString(labels[0], maxLength);
217
- }
218
- const totalLength = labels.reduce((sum, s) => sum + s.length, 0);
219
- if (totalLength > maxLength) {
220
- return `${labels.length} items`;
221
- }
222
- return labels.join(', ');
223
- }
224
- if (items.length === 1) {
225
- return truncateString(items[0], maxLength);
226
- }
227
- return `${items.length} items`;
228
- }
229
-
230
- case 'entity_list': {
231
- const entities = filterValue.value;
232
- if (entities.length === 0) {
233
- return null;
234
- }
235
- if (entities.length === 1) {
236
- return truncateString(entities[0].label, maxLength);
237
- }
238
- const totalLength = entities.reduce((sum, e) => sum + e.label.length, 0);
239
- if (totalLength > maxLength) {
240
- return `${entities.length} items`;
241
- }
242
- return entities.map(e => e.label).join(', ');
243
- }
244
-
245
- case 'time':
246
- return filterValue.value;
247
-
248
- case 'date_absolute':
249
- return truncateString(
250
- formatDateAbsoluteCompact(filterValue.unixSeconds, locale),
251
- maxLength,
252
- );
253
-
254
- case 'date_relative':
255
- return truncateString(filterValue.value, maxLength);
256
-
257
- case 'date_range':
258
- return 'date range';
259
-
260
- case 'custom':
261
- if (operatorValue.type === 'custom') {
262
- return truncateString(
263
- operatorValue.getString(filterValue.value),
264
- maxLength,
265
- );
266
- }
267
- return filterValue.value;
268
-
269
- case 'nested': {
270
- const count = filterValue.value.length;
271
- return count === 1 ? '1 filter' : `${count} filters`;
272
- }
273
-
274
- default:
275
- return null;
290
+ function PowerSearchSheetHost(
291
+ props: Omit<PowerSearchBottomSheetProps, 'editors'>,
292
+ ) {
293
+ const isHydrating = useIsHydrating();
294
+ if (isHydrating) {
295
+ return null;
276
296
  }
297
+ return (
298
+ <Suspense fallback={null}>
299
+ <LazyPowerSearchBottomSheet {...props} editors={SHEET_EDITORS} />
300
+ </Suspense>
301
+ );
277
302
  }
278
303
 
279
304
  function PowerSearchTokenValue({text}: {text: string}) {
@@ -356,7 +381,13 @@ export interface PowerSearchProps extends Omit<
356
381
  maxSearchResults?: number;
357
382
  /** Label for the save button in edit popover. @default 'Apply' */
358
383
  popoverSaveButtonLabel?: string;
359
- /** Timezone ID for date formatting. */
384
+ /**
385
+ * IANA zone a date-only `date_absolute` value, and each absolute part of a
386
+ * `date_range`, is read and written in: the token, the label and the editor
387
+ * show its day there, and a picked day stores as that midnight. Unset, a
388
+ * day is its UTC day. A `date_absolute` with `isDateOnly: false` shows and
389
+ * edits its date and time in it; unset, in the viewer's zone.
390
+ */
360
391
  timezoneID?: string;
361
392
  /**
362
393
  * Controls how tokens overflow when the container is too narrow.
@@ -388,8 +419,36 @@ export interface PowerSearchProps extends Omit<
388
419
  * Keys are operator value types (e.g. 'string', 'enum', 'date_absolute').
389
420
  */
390
421
  components?: PowerSearchComponents;
422
+ /**
423
+ * How the field presents filter editing.
424
+ * - `'popover'`: the tokenizer field with its typeahead and the editor
425
+ * popover, on every device.
426
+ * - `'bottom-sheet'`: the whole field is one trigger showing display-only
427
+ * filter tokens; it opens a stack of sheets. Filters lists the filters
428
+ * as rows that edit or remove one, with Add filter, Done, and Clear
429
+ * all, which asks first and keeps read-only filters. Add filter opens
430
+ * above it with the fields (or the content search with inline
431
+ * suggestions), and a value step opens above that, stages operator →
432
+ * value, and confirms from its footer. Dismissing a step reveals the
433
+ * one beneath. The flow edits a draft: `onChange` is called when Done
434
+ * applies it, once per edit in order, and a dismissal with a changed
435
+ * draft asks before discarding it. Suited to compact touch screens,
436
+ * where the editor popover competes with the software keyboard.
437
+ * - `'adaptive'`: the bottom sheet on compact coarse-pointer screens,
438
+ * otherwise the popover — the same resolution Selector uses. The server
439
+ * render and the hydrating render are the popover.
440
+ *
441
+ * In the sheet presentation `menuWidth` and `tokenOverflowBehavior` have
442
+ * no surface to act on and warn in development. Pass `'popover'` to keep
443
+ * the tokenizer field and the editor popover on every device.
444
+ * @default 'adaptive'
445
+ */
446
+ presentation?: PowerSearchPresentation;
391
447
  }
392
448
 
449
+ /** How PowerSearch presents filter editing; see `PowerSearchProps.presentation`. */
450
+ export type PowerSearchPresentation = AdaptivePresentation;
451
+
393
452
  // =============================================================================
394
453
  // State
395
454
  // =============================================================================
@@ -524,6 +583,7 @@ export function PowerSearch({
524
583
  className,
525
584
  style,
526
585
  components: componentOverrides,
586
+ presentation = 'adaptive',
527
587
  }: PowerSearchProps) {
528
588
  const size = useSize(sizeProp, 'md');
529
589
  const config = useInternalConfig(configProp);
@@ -537,6 +597,100 @@ export function PowerSearch({
537
597
  popoverSaveButtonLabelFromProps ?? t('@astryx.powersearch.editor.apply');
538
598
  const tokenizerRef = useRef<TokenizerHandle>(null);
539
599
 
600
+ const resolvedPresentation = useAdaptivePresentation(presentation);
601
+ const [isSheetOpen, setIsSheetOpen] = useState(false);
602
+ // Latched for the flow's lifetime: the flow stays presented after it closes
603
+ // until the sheets have run their exit and handed focus back to the trigger.
604
+ // Without the latch, `adaptive` resolving to `popover` mid-session (a phone
605
+ // turned to landscape) would unmount the sheets and the trigger they return
606
+ // focus to in the same render, dropping focus to the page body.
607
+ const [isSheetPresented, setIsSheetPresented] = useState(false);
608
+ const isSheetPresentation =
609
+ isSheetOpen || isSheetPresented || resolvedPresentation === 'bottom-sheet';
610
+ const triggerRef = useRef<HTMLButtonElement>(null);
611
+ // `hasAutoFocus` applies only to the control the field first mounts. A
612
+ // presentation swap remounts the control (combobox input or trigger), and
613
+ // React's `autoFocus` on the new one would pull focus from wherever on the
614
+ // page it was; the roots' callback refs hand over the focus the field held
615
+ // instead. A field that never swaps keeps `autoFocus` on every render, so a
616
+ // Dialog that keeps it mounted still finds its `data-autofocus` on open.
617
+ const [autoFocusState, setAutoFocusState] = useState({
618
+ presentation: isSheetPresentation,
619
+ isFirstControl: true,
620
+ });
621
+ if (autoFocusState.presentation !== isSheetPresentation) {
622
+ setAutoFocusState({
623
+ presentation: isSheetPresentation,
624
+ isFirstControl: false,
625
+ });
626
+ }
627
+ const autoFocusOnMount =
628
+ hasAutoFocus &&
629
+ autoFocusState.isFirstControl &&
630
+ autoFocusState.presentation === isSheetPresentation;
631
+ // A focus the swap moves continues the same visit to the field: the
632
+ // control that held focus is gone (no blur fires for a removed element), so
633
+ // the caller is told of neither a blur nor a new focus.
634
+ const isSwapFocusRef = useRef(false);
635
+ const focusAfterSwap = useCallback((control: {focus(): void} | null) => {
636
+ if (control == null) {
637
+ return;
638
+ }
639
+ isSwapFocusRef.current = true;
640
+ try {
641
+ control.focus();
642
+ } finally {
643
+ isSwapFocusRef.current = false;
644
+ }
645
+ }, []);
646
+ const handleFieldFocus = useCallback(
647
+ (event: React.FocusEvent) => {
648
+ if (!isSwapFocusRef.current) {
649
+ onFocus?.(event);
650
+ }
651
+ },
652
+ [onFocus],
653
+ );
654
+ const handleFieldBlur = useCallback(
655
+ (event: React.FocusEvent) => {
656
+ onBlur?.(event);
657
+ },
658
+ [onBlur],
659
+ );
660
+ // While the flow is open, the sheet announces its own content from inside
661
+ // its dialog; this component announces only with the flow closed, and
662
+ // `useAnnounce` routes those messages by where the field is — into a Dialog
663
+ // or modal Drawer that holds it, or the shared channel when no modal does.
664
+ // A result count that changed during the flow's exit is spoken once the
665
+ // flow has fully closed and focus is back on the trigger: the closing
666
+ // dialog stays modal through its exit, so neither its region nor the
667
+ // page-body channel is heard before.
668
+ const afterCloseResultCountRef = useRef<string | null>(null);
669
+ const triggerId = useId();
670
+ const triggerLabelId = useId();
671
+ const triggerContentId = useId();
672
+ const statusMessageId = useId();
673
+ // A field that becomes disabled cannot keep its flow open, and must not
674
+ // reopen it when re-enabled. Adjusted in the
675
+ // render that sees the change, not an effect, so no frame shows both.
676
+ const [wasDisabled, setWasDisabled] = useState(isDisabled);
677
+ if (isDisabled !== wasDisabled) {
678
+ setWasDisabled(isDisabled);
679
+ if (isDisabled && isSheetOpen) {
680
+ setIsSheetOpen(false);
681
+ }
682
+ }
683
+ useDevWarning(
684
+ 'PowerSearch',
685
+ '`menuWidth` has no surface in the bottom-sheet presentation: the sheet flow has no typeahead popover to size. Pass `presentation="popover"` to keep the popover on every device, or leave it out.',
686
+ isSheetPresentation && menuWidth != null,
687
+ );
688
+ useDevWarning(
689
+ 'PowerSearch',
690
+ '`tokenOverflowBehavior` has no surface in the bottom-sheet presentation: the trigger wraps its display-only tokens. Pass `presentation="popover"` to keep the tokenizer field on every device, or leave it out.',
691
+ isSheetPresentation && tokenOverflowBehavior != null,
692
+ );
693
+
540
694
  const [popoverState, setPopoverStateRaw] = useState<PopoverState>({
541
695
  type: 'idle',
542
696
  });
@@ -552,7 +706,7 @@ export function PowerSearch({
552
706
  const operatorLabel = operator ? resolveOperatorLabel(operator, t) : '';
553
707
  const label = `${fieldLabel}: ${operatorLabel}`.trim();
554
708
  const value = operator
555
- ? tokenValueText(
709
+ ? formatTokenValueText(
556
710
  operator.value,
557
711
  filter.value,
558
712
  Math.max(
@@ -560,11 +714,14 @@ export function PowerSearch({
560
714
  10,
561
715
  ),
562
716
  locale,
717
+ undefined,
718
+ undefined,
719
+ timezoneID,
563
720
  )
564
721
  : null;
565
722
  return {label, value, full: value != null ? `${label} ${value}` : label};
566
723
  },
567
- [config, maxTokenLength, t, locale],
724
+ [config, maxTokenLength, t, locale, timezoneID],
568
725
  );
569
726
  // The built-in token being edited. A token from a `components` override
570
727
  // names itself, so its editor keeps the plain popover.
@@ -581,9 +738,21 @@ export function PowerSearch({
581
738
  componentOverrides?.[editedOperator.value.type]?.Token == null
582
739
  ? editedFilter
583
740
  : undefined;
741
+ // Whether the editor popover is open, for the hand-off below, which runs
742
+ // in the commit that swaps presentations.
743
+ const isPopoverOpenRef = useRef(false);
744
+ // When `adaptive` flips to the sheet while the editor popover is open (a
745
+ // phone rotated), the editing ends with the popover: its state returns to
746
+ // idle (through the raw setter, since the tokenizer input is gone), in the
747
+ // render that sees the swap, so a later switch back does not reopen a stale
748
+ // editor.
749
+ if (isSheetPresentation && popoverState.type !== 'idle') {
750
+ setPopoverStateRaw({type: 'idle'});
751
+ }
584
752
 
585
753
  // Layer for positioning the edit popover anchored to the tokenizer
586
754
  const handleLayerHide = useCallback(() => {
755
+ isPopoverOpenRef.current = false;
587
756
  setPopoverStateRaw({type: 'idle'});
588
757
  }, []);
589
758
 
@@ -604,9 +773,54 @@ export function PowerSearch({
604
773
  : undefined,
605
774
  });
606
775
 
776
+ // A presentation swap removes the focused control, so the other
777
+ // presentation's primary control (the combobox input or the trigger) takes
778
+ // focus and focus never falls to the page body. Each presentation keys its
779
+ // root, so a swap mounts a new root. The detaching root notes that it held
780
+ // focus, which also covers an input focused by server-rendered `autofocus`
781
+ // before hydration. The editor popover is portaled outside the root, so an
782
+ // open editor counts as held focus. The attaching root gives focus to its
783
+ // primary control when focus has fallen to the page body; the sheet root
784
+ // also hides a popover layer left open.
785
+ const isFocusPendingHandOffRef = useRef(false);
786
+ const hidePopover = popover.hide;
787
+ const handOffFocusRef = useCallback(
788
+ (node: HTMLDivElement | null) => {
789
+ if (node == null) {
790
+ return;
791
+ }
792
+ const trigger = triggerRef.current;
793
+ const isSheetRoot = trigger != null && node.contains(trigger);
794
+ // The sheet presentation preloads the flow's chunk, so the first press
795
+ // opens without waiting for the network; nothing renders.
796
+ if (isSheetRoot) {
797
+ void loadPowerSearchBottomSheet();
798
+ }
799
+ if (isSheetRoot && isPopoverOpenRef.current) {
800
+ isPopoverOpenRef.current = false;
801
+ hidePopover();
802
+ }
803
+ const takesFocus = isFocusPendingHandOffRef.current;
804
+ isFocusPendingHandOffRef.current = false;
805
+ if (takesFocus && isFocusDetached(node.ownerDocument)) {
806
+ focusAfterSwap(isSheetRoot ? trigger : tokenizerRef.current);
807
+ }
808
+ return () => {
809
+ if (
810
+ node.contains(node.ownerDocument.activeElement) ||
811
+ isPopoverOpenRef.current
812
+ ) {
813
+ isFocusPendingHandOffRef.current = true;
814
+ }
815
+ };
816
+ },
817
+ [focusAfterSwap, hidePopover],
818
+ );
819
+
607
820
  // Wrapper that manages layer visibility and tokenizer focus alongside state
608
821
  const setPopoverState = useCallback(
609
822
  (state: PopoverState) => {
823
+ isPopoverOpenRef.current = state.type !== 'idle';
610
824
  setPopoverStateRaw(state);
611
825
  if (state.type !== 'idle') {
612
826
  // Schedule after the current frame so React can render the popover
@@ -623,13 +837,22 @@ export function PowerSearch({
623
837
  [popover],
624
838
  );
625
839
 
626
- // Expose imperative handle
840
+ // Expose imperative handle; in the sheet presentation the trigger is the
841
+ // field's focusable control.
627
842
  useImperativeHandle(handleRef, () => ({
628
843
  focusTypeahead() {
629
- tokenizerRef.current?.focus();
844
+ if (isSheetPresentation) {
845
+ triggerRef.current?.focus();
846
+ } else {
847
+ tokenizerRef.current?.focus();
848
+ }
630
849
  },
631
850
  blurTypeahead() {
632
- tokenizerRef.current?.blur();
851
+ if (isSheetPresentation) {
852
+ triggerRef.current?.blur();
853
+ } else {
854
+ tokenizerRef.current?.blur();
855
+ }
633
856
  },
634
857
  }));
635
858
 
@@ -833,10 +1056,12 @@ export function PowerSearch({
833
1056
  setPopoverState({type: 'idle'});
834
1057
  }, [setPopoverState]);
835
1058
 
836
- // Custom token renderer
837
- // Custom token renderer
838
- const renderToken = useCallback(
839
- (item: PowerSearchItem, onRemove: () => void) => {
1059
+ // Token renderer for both presentations. Given `onRemove`, the token is
1060
+ // the tokenizer field's: click edits, × removes. Without it (the sheet
1061
+ // presentation's trigger) the token is display-only; the field as a whole
1062
+ // opens the flow.
1063
+ const renderFilterToken = useCallback(
1064
+ (item: PowerSearchItem, onRemove: (() => void) | undefined) => {
840
1065
  const auxData = item.auxiliaryData;
841
1066
  const filterIndex = auxData?.filterIndex ?? -1;
842
1067
  const filter = filterIndex >= 0 ? filters[filterIndex] : undefined;
@@ -846,7 +1071,8 @@ export function PowerSearch({
846
1071
  ? config.getOperator(auxData.fieldKey, auxData.operatorKey)
847
1072
  : undefined;
848
1073
 
849
- const canInteract = !isReadOnly && !isDisabled && !filter?.isReadOnly;
1074
+ const canInteract =
1075
+ onRemove != null && !isReadOnly && !isDisabled && !filter?.isReadOnly;
850
1076
  const handleClick = canInteract
851
1077
  ? () => handleTokenClick(filterIndex)
852
1078
  : undefined;
@@ -868,6 +1094,7 @@ export function PowerSearch({
868
1094
  onClick={handleClick}
869
1095
  onRemove={handleRemove}
870
1096
  isDisabled={isDisabled}
1097
+ timezoneID={timezoneID}
871
1098
  />
872
1099
  );
873
1100
  }
@@ -944,6 +1171,7 @@ export function PowerSearch({
944
1171
  );
945
1172
  },
946
1173
  [
1174
+ timezoneID,
947
1175
  filters,
948
1176
  config,
949
1177
  configProp,
@@ -959,6 +1187,12 @@ export function PowerSearch({
959
1187
  ],
960
1188
  );
961
1189
 
1190
+ const renderToken = useCallback(
1191
+ (item: PowerSearchItem, onRemove: () => void) =>
1192
+ renderFilterToken(item, onRemove),
1193
+ [renderFilterToken],
1194
+ );
1195
+
962
1196
  // Custom typeahead item renderer — adds field icon and description
963
1197
  const renderItem = useCallback(
964
1198
  (item: PowerSearchItem) => {
@@ -1032,6 +1266,7 @@ export function PowerSearch({
1032
1266
  onCancel={handlePopoverCancel}
1033
1267
  saveButtonLabel={popoverSaveButtonLabel}
1034
1268
  isReadOnly={isReadOnly}
1269
+ timezoneID={timezoneID}
1035
1270
  />
1036
1271
  );
1037
1272
  }
@@ -1047,9 +1282,11 @@ export function PowerSearch({
1047
1282
  saveButtonLabel={popoverSaveButtonLabel}
1048
1283
  maxMenuItems={maxOperatorMenuItems}
1049
1284
  isReadOnly={isReadOnly}
1285
+ timezoneID={timezoneID}
1050
1286
  />
1051
1287
  );
1052
1288
  }, [
1289
+ timezoneID,
1053
1290
  popoverPartialFilter,
1054
1291
  popoverState,
1055
1292
  EditorOverride,
@@ -1076,13 +1313,18 @@ export function PowerSearch({
1076
1313
  return resultCount;
1077
1314
  }, [resultCount, t]);
1078
1315
 
1079
- // Announce result-count changes to screen readers through a polite live
1080
- // region, mirroring the way Typeahead announces its dropdown result count.
1081
- // The count is otherwise only shown visually and stays silent to assistive
1082
- // tech. Only a change after mount is spoken: the guard compares against the
1083
- // last announced text rather than a mounted flag, so StrictMode's effect
1084
- // replay (which resets a flag and would speak the count present on mount
1085
- // unprompted) announces nothing until the count changes.
1316
+ // This Effect synchronizes a polite live region with the result count,
1317
+ // mirroring the way Typeahead announces its dropdown result count: the count
1318
+ // is otherwise only shown visually and stays silent to assistive tech. The
1319
+ // region follows where the field is: the modal that holds the field (a
1320
+ // Dialog, a modal Drawer), else the shared channel. While a sheet of the flow is open the sheet itself announces the
1321
+ // count from inside its dialog, and this Effect stays quiet. Only a
1322
+ // change after mount is spoken — the count present on mount is not
1323
+ // announced unprompted — and the guard compares against the last announced
1324
+ // text rather than a mounted flag, so StrictMode's effect replay announces
1325
+ // nothing either. A change that lands while the flow is closing waits for
1326
+ // the trigger focus, since the dialog is still modal through its exit. The
1327
+ // announcement acquires no resource, so there is no cleanup.
1086
1328
  const announce = useAnnounce();
1087
1329
  // PowerSearch words its Clear all as its record does; the field announces
1088
1330
  // these words instead of Tokenizer's (component:Tokenizer AR7).
@@ -1095,15 +1337,20 @@ export function PowerSearch({
1095
1337
  [hasReadOnlyFilter, t],
1096
1338
  );
1097
1339
  const announcedResultCountRef = useRef(resultCountText);
1340
+ const isSheetExiting = isSheetPresented && !isSheetOpen;
1098
1341
  useEffect(() => {
1099
1342
  if (resultCountText === announcedResultCountRef.current) {
1100
1343
  return;
1101
1344
  }
1102
1345
  announcedResultCountRef.current = resultCountText;
1103
1346
  if (resultCountText != null) {
1104
- announce(resultCountText);
1347
+ if (isSheetExiting) {
1348
+ afterCloseResultCountRef.current = resultCountText;
1349
+ } else if (!isSheetOpen) {
1350
+ announce(resultCountText);
1351
+ }
1105
1352
  }
1106
- }, [resultCountText, announce]);
1353
+ }, [resultCountText, announce, isSheetExiting, isSheetOpen]);
1107
1354
 
1108
1355
  // Build combined endContent from resultCount + endContent props
1109
1356
  const combinedEndContent = useMemo((): React.ReactNode => {
@@ -1124,14 +1371,231 @@ export function PowerSearch({
1124
1371
  return resultCountNode || endContent || undefined;
1125
1372
  }, [resultCountText, endContent]);
1126
1373
 
1374
+ // ------------------------------------------------------- sheet trigger --
1375
+
1376
+ // Disabled-reason tooltip for the sheet trigger. Disabled controls swallow
1377
+ // pointer events, so the listeners attach to the field's control box; the
1378
+ // trigger stays perceivable through aria-disabled.
1379
+ const showsDisabledMessage = isDisabled && !!disabledMessage;
1380
+ const disabledMessageTooltip = useTooltip({
1381
+ placement: 'above',
1382
+ focusTrigger: 'always',
1383
+ isEnabled: isSheetPresentation && showsDisabledMessage,
1384
+ });
1385
+ const rootRef = useMergedRefs(
1386
+ ref,
1387
+ popover.triggerRef as React.Ref<HTMLDivElement>,
1388
+ handOffFocusRef,
1389
+ );
1390
+
1391
+ const openSheet = useCallback(() => {
1392
+ if (isDisabled) {
1393
+ return;
1394
+ }
1395
+ // The flow restores focus to the element that was active when it opened;
1396
+ // make sure that is the trigger even for a tap on a token.
1397
+ triggerRef.current?.focus({preventScroll: true});
1398
+ setIsSheetPresented(true);
1399
+ setIsSheetOpen(true);
1400
+ }, [isDisabled]);
1401
+
1402
+ // The field's end lane — the result count and `endContent` — sits outside
1403
+ // the trigger button: a caller's action button there keeps its own tab stop
1404
+ // and taps, and an interactive control must not nest in a component
1405
+ // button, so a tap on it must not open the flow.
1406
+ const endLaneRef = useRef<HTMLDivElement>(null);
1407
+ const handleTriggerWrapperClick = useCallback(
1408
+ (event: React.MouseEvent<HTMLDivElement>) => {
1409
+ // Tokens are display-only; a tap on them or the empty space around them
1410
+ // opens the flow. The trigger button handles its own click, and the end
1411
+ // lane handles its own.
1412
+ if (
1413
+ event.target instanceof Node &&
1414
+ (triggerRef.current?.contains(event.target) ||
1415
+ endLaneRef.current?.contains(event.target))
1416
+ ) {
1417
+ return;
1418
+ }
1419
+ openSheet();
1420
+ },
1421
+ [openSheet],
1422
+ );
1423
+
1424
+ const handleTriggerFocusWithin = useCallback(
1425
+ (event: React.FocusEvent<HTMLDivElement>) => {
1426
+ // The flow focuses the trigger only after its exit completes; that focus
1427
+ // is the signal that the retained sheets can leave. If the resolution
1428
+ // moved to the popover meanwhile, the tokenizer input takes over the
1429
+ // focus once it mounts (the hand-off above).
1430
+ if (!isSheetOpen && isSheetPresented) {
1431
+ setIsSheetPresented(false);
1432
+ // The dialogs have closed: the page-body channel is exposed again.
1433
+ const resultCount = afterCloseResultCountRef.current;
1434
+ afterCloseResultCountRef.current = null;
1435
+ if (resultCount != null) {
1436
+ announce(resultCount);
1437
+ }
1438
+ }
1439
+ if (
1440
+ !(event.relatedTarget instanceof Node) ||
1441
+ !event.currentTarget.contains(event.relatedTarget)
1442
+ ) {
1443
+ handleFieldFocus(event);
1444
+ }
1445
+ },
1446
+ [announce, handleFieldFocus, isSheetOpen, isSheetPresented],
1447
+ );
1448
+ const handleTriggerBlurWithin = useCallback(
1449
+ (event: React.FocusEvent<HTMLDivElement>) => {
1450
+ if (
1451
+ !(event.relatedTarget instanceof Node) ||
1452
+ !event.currentTarget.contains(event.relatedTarget)
1453
+ ) {
1454
+ handleFieldBlur(event);
1455
+ }
1456
+ },
1457
+ [handleFieldBlur],
1458
+ );
1459
+
1460
+ if (isSheetPresentation) {
1461
+ const triggerDescribedBy =
1462
+ [
1463
+ status?.message ? statusMessageId : null,
1464
+ showsDisabledMessage ? disabledMessageTooltip.describedBy : null,
1465
+ ]
1466
+ .filter(Boolean)
1467
+ .join(' ') || undefined;
1468
+
1469
+ return (
1470
+ <div key="sheet" ref={rootRef} {...themeProps('power-search')}>
1471
+ <Field
1472
+ label={label}
1473
+ isLabelHidden={isLabelHidden}
1474
+ inputID={triggerId}
1475
+ labelID={triggerLabelId}
1476
+ isDisabled={isDisabled}
1477
+ status={
1478
+ status
1479
+ ? {
1480
+ type: status.type,
1481
+ message: status.message,
1482
+ messageID: status.message ? statusMessageId : undefined,
1483
+ }
1484
+ : undefined
1485
+ }
1486
+ statusVariant={statusVariant}
1487
+ xstyle={xstyle}
1488
+ className={className}
1489
+ style={style}>
1490
+ <div
1491
+ ref={disabledMessageTooltip.ref}
1492
+ onClick={handleTriggerWrapperClick}
1493
+ onFocus={handleTriggerFocusWithin}
1494
+ onBlur={handleTriggerBlurWithin}
1495
+ aria-disabled={isDisabled ? true : undefined}
1496
+ {...stylex.props(
1497
+ inputWrapperStyles.base,
1498
+ sheetTriggerStyles.wrapper,
1499
+ filters.length > 0 && sheetTriggerStyles.wrapperWithTokens,
1500
+ sheetTriggerSizeStyles[size],
1501
+ isDisabled && inputWrapperStyles.disabled,
1502
+ status && inputStatusBorderStyles[status.type],
1503
+ status &&
1504
+ !isDisabled &&
1505
+ inputStatusHoverShadowStyles[status.type],
1506
+ status && inputStatusFocusWithinStyles[status.type],
1507
+ )}>
1508
+ {/* The trigger's name is the label plus everything visible here:
1509
+ the placeholder, or the tokens, so speech input can say what
1510
+ it sees and assistive technology hears the selected filters
1511
+ (WCAG 2.5.3). */}
1512
+ <div
1513
+ id={triggerContentId}
1514
+ {...stylex.props(sheetTriggerStyles.contentSection)}>
1515
+ {isRenderable(startIcon as React.ReactNode) && (
1516
+ <span
1517
+ {...stylex.props(
1518
+ filters.length > 0 &&
1519
+ sheetTriggerStyles.startIconWithTokens,
1520
+ )}>
1521
+ {renderIconSlot(startIcon, {size: 'sm', color: 'secondary'})}
1522
+ </span>
1523
+ )}
1524
+ {tokenizerValue.map(item => (
1525
+ <React.Fragment key={item.id}>
1526
+ {renderFilterToken(item, undefined)}
1527
+ </React.Fragment>
1528
+ ))}
1529
+ <button
1530
+ type="button"
1531
+ id={triggerId}
1532
+ ref={triggerRef}
1533
+ // The field's primary control: `data-testid` lands here, as it
1534
+ // lands on the combobox input in the popover presentation.
1535
+ data-testid={testId}
1536
+ autoFocus={autoFocusOnMount}
1537
+ onClick={openSheet}
1538
+ aria-disabled={isDisabled ? true : undefined}
1539
+ aria-haspopup="dialog"
1540
+ aria-expanded={isSheetOpen}
1541
+ aria-labelledby={`${triggerLabelId} ${triggerContentId}`}
1542
+ aria-describedby={triggerDescribedBy}
1543
+ {...stylex.props(
1544
+ sheetTriggerStyles.trigger,
1545
+ filters.length > 0 && sheetTriggerStyles.triggerWithTokens,
1546
+ )}>
1547
+ {filters.length === 0 ? placeholder : null}
1548
+ </button>
1549
+ </div>
1550
+ {(endContent || isRenderable(resultCountText)) && (
1551
+ <div
1552
+ ref={endLaneRef}
1553
+ {...stylex.props(sheetTriggerStyles.endSection)}>
1554
+ {isRenderable(resultCountText) && (
1555
+ <span {...stylex.props(resultCountStyles.text)}>
1556
+ {resultCountText}
1557
+ </span>
1558
+ )}
1559
+ {endContent}
1560
+ </div>
1561
+ )}
1562
+ </div>
1563
+ {showsDisabledMessage &&
1564
+ disabledMessageTooltip.renderTooltip(disabledMessage)}
1565
+ </Field>
1566
+ {/* Mounted from the press until the flow's exit has completed and
1567
+ focus is back on the trigger (`isSheetPresented`): at rest the
1568
+ field renders its trigger alone — no closed dialogs, rows, search
1569
+ field or editors in the DOM. */}
1570
+ {(isSheetOpen || isSheetPresented) && (
1571
+ <PowerSearchSheetHost
1572
+ isOpen={isSheetOpen}
1573
+ onOpenChange={setIsSheetOpen}
1574
+ finalFocusRef={triggerRef}
1575
+ resultCountText={resultCountText}
1576
+ config={config}
1577
+ configProp={configProp}
1578
+ filters={filters}
1579
+ onChange={onChange}
1580
+ searchSource={searchSource}
1581
+ placeholder={placeholder}
1582
+ isReadOnly={isReadOnly}
1583
+ isDisabled={isDisabled}
1584
+ hasClear={hasClear}
1585
+ maxOperatorMenuItems={maxOperatorMenuItems}
1586
+ timezoneID={timezoneID}
1587
+ maxSearchResults={maxSearchResults}
1588
+ saveButtonLabel={popoverSaveButtonLabelFromProps}
1589
+ components={componentOverrides}
1590
+ />
1591
+ )}
1592
+ </div>
1593
+ );
1594
+ }
1595
+
1127
1596
  return (
1128
1597
  <>
1129
- <div
1130
- ref={useMergedRefs(
1131
- ref,
1132
- popover.triggerRef as React.Ref<HTMLDivElement>,
1133
- )}
1134
- {...themeProps('power-search')}>
1598
+ <div key="popover" ref={rootRef} {...themeProps('power-search')}>
1135
1599
  {/* The field's Clear all announces PowerSearch's own words
1136
1600
  (component:PowerSearch; component:Tokenizer AR7). */}
1137
1601
  <TokenizerClearAllMessageContext value={clearAllMessage}>
@@ -1148,7 +1612,7 @@ export function PowerSearch({
1148
1612
  maxMenuItems={MAX_BROWSE_MENU_ITEMS}
1149
1613
  menuWidth={menuWidth}
1150
1614
  placeholder={filters.length === 0 ? placeholder : ''}
1151
- hasAutoFocus={hasAutoFocus}
1615
+ hasAutoFocus={autoFocusOnMount}
1152
1616
  hasClear={hasClear && !isReadOnly}
1153
1617
  startIcon={startIcon}
1154
1618
  endContent={combinedEndContent}
@@ -1160,12 +1624,13 @@ export function PowerSearch({
1160
1624
  debounceMs={0}
1161
1625
  status={status}
1162
1626
  statusVariant={statusVariant}
1163
- onFocus={onFocus}
1164
- onBlur={onBlur}
1627
+ onFocus={handleFieldFocus}
1628
+ onBlur={handleFieldBlur}
1165
1629
  containerXstyle={xstyle}
1166
1630
  containerClassName={className}
1167
1631
  containerStyle={style}
1168
1632
  data-testid={testId}
1633
+ presentation="popover"
1169
1634
  />
1170
1635
  </TokenizerItemRemovableContext>
1171
1636
  </TokenizerClearAllMessageContext>