@astryxdesign/core 0.7.7 → 0.7.8-canary.0b39b51

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 (581) 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 +5 -0
  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.map +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.js +25 -4
  10. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  11. package/dist/BottomSheet/BottomSheetSwitcher.js +5 -0
  12. package/dist/BottomSheet/useMobileKeyboard.d.ts.map +1 -1
  13. package/dist/BottomSheet/useMobileKeyboard.js +6 -0
  14. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  15. package/dist/BottomSheet/useSheetGestures.js +12 -1
  16. package/dist/Button/Button.d.ts.map +1 -1
  17. package/dist/Button/Button.js +17 -1
  18. package/dist/Calendar/Calendar.d.ts.map +1 -1
  19. package/dist/Calendar/Calendar.js +15 -16
  20. package/dist/Carousel/Carousel.d.ts.map +1 -1
  21. package/dist/Carousel/Carousel.js +2 -0
  22. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  23. package/dist/Chat/ChatComposerInput.js +4 -0
  24. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  25. package/dist/Chat/ChatMessageList.js +2 -1
  26. package/dist/Chat/useChatDictation.d.ts.map +1 -1
  27. package/dist/Chat/useChatDictation.js +2 -0
  28. package/dist/Chat/useChatNewMessages.js +1 -1
  29. package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
  30. package/dist/Chat/useChatStreamScroll.js +2 -0
  31. package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
  32. package/dist/Chat/useSpeechRecognition.js +3 -0
  33. package/dist/Chat/useTriggerMenu.js +1 -1
  34. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  35. package/dist/CheckboxInput/CheckboxInput.js +17 -12
  36. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  37. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  38. package/dist/CodeBlock/CodeBlock.js +28 -11
  39. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  40. package/dist/CommandPalette/CommandPalette.js +2 -0
  41. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  42. package/dist/CommandPalette/CommandPaletteItem.js +2 -0
  43. package/dist/ComplexSelector/ComplexSelector.d.ts +4 -1
  44. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  45. package/dist/ComplexSelector/ComplexSelector.js +14 -4
  46. package/dist/ContextMenu/ContextMenu.js +2 -2
  47. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  48. package/dist/DateInput/MonthScroller.js +5 -2
  49. package/dist/DateInput/PickerWheel.d.ts +19 -0
  50. package/dist/DateInput/PickerWheel.d.ts.map +1 -0
  51. package/dist/DateInput/PickerWheel.js +625 -0
  52. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  53. package/dist/DateInput/TouchDateField.js +1 -0
  54. package/dist/DateInput/Wheel.d.ts +18 -37
  55. package/dist/DateInput/Wheel.d.ts.map +1 -1
  56. package/dist/DateInput/Wheel.js +84 -113
  57. package/dist/DateInput/useOwnScrollGesture.d.ts +10 -0
  58. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  59. package/dist/DateInput/useOwnScrollGesture.js +16 -3
  60. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  61. package/dist/DateInput/usePointerDragScroll.js +2 -0
  62. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  63. package/dist/DateInput/useScrollSettle.js +3 -0
  64. package/dist/DateInput/useWheelListbox.d.ts +59 -0
  65. package/dist/DateInput/useWheelListbox.d.ts.map +1 -0
  66. package/dist/DateInput/useWheelListbox.js +88 -0
  67. package/dist/DateInput/wheelOptions.d.ts +74 -0
  68. package/dist/DateInput/wheelOptions.d.ts.map +1 -0
  69. package/dist/DateInput/wheelOptions.js +98 -0
  70. package/dist/DateInput/wheelPhysics.d.ts +127 -0
  71. package/dist/DateInput/wheelPhysics.d.ts.map +1 -0
  72. package/dist/DateInput/wheelPhysics.js +341 -0
  73. package/dist/DateInput/wheelStrip.d.ts +92 -0
  74. package/dist/DateInput/wheelStrip.d.ts.map +1 -0
  75. package/dist/DateInput/wheelStrip.js +258 -0
  76. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  77. package/dist/DateTimeInput/TouchDateTimeField.js +2 -0
  78. package/dist/Dialog/Dialog.d.ts.map +1 -1
  79. package/dist/Dialog/Dialog.js +9 -32
  80. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  81. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  82. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  83. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  84. package/dist/Field/Field.js +2 -2
  85. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  86. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  87. package/dist/FormLayout/FormLayout.d.ts +5 -1
  88. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  89. package/dist/HoverCard/HoverCard.d.ts +6 -4
  90. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  91. package/dist/HoverCard/HoverCard.js +48 -3
  92. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  93. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  94. package/dist/HoverCard/useHoverCard.js +20 -33
  95. package/dist/Icon/Icon.d.ts +5 -1
  96. package/dist/Icon/Icon.d.ts.map +1 -1
  97. package/dist/Icon/Icon.js +5 -2
  98. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  99. package/dist/Item/useSwipeAction.js +3 -0
  100. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  101. package/dist/Layer/modalOutlet.js +2 -0
  102. package/dist/Layer/outsidePress.d.ts.map +1 -1
  103. package/dist/Layer/outsidePress.js +1 -0
  104. package/dist/Layer/useLayer.d.ts.map +1 -1
  105. package/dist/Layer/useLayer.js +3 -0
  106. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  107. package/dist/Layer/useLayerDismissal.js +3 -0
  108. package/dist/Layer/usePressPin.d.ts +17 -5
  109. package/dist/Layer/usePressPin.d.ts.map +1 -1
  110. package/dist/Layer/usePressPin.js +62 -12
  111. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  112. package/dist/Layer/useTouchTrigger.js +3 -0
  113. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  114. package/dist/Lightbox/Lightbox.js +19 -0
  115. package/dist/MobileNav/MobileNav.d.ts +3 -2
  116. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  117. package/dist/MobileNav/MobileNav.js +9 -25
  118. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  119. package/dist/Outline/useOutlineFromDOM.js +3 -0
  120. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  121. package/dist/Outline/useScrollSpy.js +3 -0
  122. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  123. package/dist/OverflowList/OverflowList.js +3 -0
  124. package/dist/Popover/Popover.d.ts.map +1 -1
  125. package/dist/Popover/Popover.js +6 -0
  126. package/dist/PowerSearch/PowerSearch.d.ts +43 -4
  127. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  128. package/dist/PowerSearch/PowerSearch.js +445 -134
  129. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  130. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  131. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  132. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  133. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  134. package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
  135. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  136. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  137. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  138. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  139. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  140. package/dist/PowerSearch/PowerSearchToken.js +7 -2
  141. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  142. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  143. package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
  144. package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
  145. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  146. package/dist/PowerSearch/formatFilterValue.js +33 -12
  147. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  148. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  149. package/dist/PowerSearch/formatTokenValue.js +162 -0
  150. package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
  151. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  152. package/dist/PowerSearch/powerSearchDateZone.js +37 -0
  153. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  154. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  155. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  156. package/dist/PowerSearch/types.d.ts +2 -0
  157. package/dist/PowerSearch/types.d.ts.map +1 -1
  158. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  159. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  160. package/dist/RadioList/RadioList.d.ts.map +1 -1
  161. package/dist/RadioList/RadioList.js +3 -2
  162. package/dist/RadioList/RadioListItem.d.ts +1 -1
  163. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  164. package/dist/RadioList/RadioListItem.js +5 -3
  165. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  166. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  167. package/dist/Resizable/ResizeHandle.js +101 -77
  168. package/dist/Resizable/createResizable.d.ts +145 -0
  169. package/dist/Resizable/createResizable.d.ts.map +1 -0
  170. package/dist/Resizable/createResizable.js +575 -0
  171. package/dist/Resizable/useResizable.d.ts +3 -3
  172. package/dist/Resizable/useResizable.d.ts.map +1 -1
  173. package/dist/Resizable/useResizable.js +252 -459
  174. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  175. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  176. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  177. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  178. package/dist/SelectableCard/SelectableCard.js +36 -11
  179. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  180. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  181. package/dist/SelectableCard/selectableCardInput.js +20 -0
  182. package/dist/Selector/Selector.d.ts.map +1 -1
  183. package/dist/Selector/Selector.js +5 -8
  184. package/dist/Slider/sliderTouchController.js +2 -2
  185. package/dist/Spinner/Spinner.d.ts +1 -1
  186. package/dist/Spinner/Spinner.d.ts.map +1 -1
  187. package/dist/Spinner/Spinner.js +60 -58
  188. package/dist/Switch/Switch.d.ts.map +1 -1
  189. package/dist/Switch/Switch.js +4 -10
  190. package/dist/Switch/useSwitchTouch.js +4 -4
  191. package/dist/Table/BaseTable.d.ts.map +1 -1
  192. package/dist/Table/BaseTable.js +29 -8
  193. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  194. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  195. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  196. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  197. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  198. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  199. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  200. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  201. package/dist/TextInput/TextInput.d.ts +2 -2
  202. package/dist/TextInput/TextInput.d.ts.map +1 -1
  203. package/dist/TextInput/TextInput.js +10 -7
  204. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  205. package/dist/TimeInput/TimeInput.js +2 -0
  206. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  207. package/dist/TimeInput/TouchTimeField.js +2 -0
  208. package/dist/Timer/Timer.d.ts.map +1 -1
  209. package/dist/Timer/Timer.js +2 -0
  210. package/dist/Timestamp/Timestamp.js +1 -1
  211. package/dist/Toast/Toast.d.ts +11 -1
  212. package/dist/Toast/Toast.d.ts.map +1 -1
  213. package/dist/Toast/Toast.js +25 -15
  214. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  215. package/dist/Toast/ToastViewport.js +97 -34
  216. package/dist/Toast/types.d.ts +9 -3
  217. package/dist/Toast/types.d.ts.map +1 -1
  218. package/dist/Toast/useToast.d.ts.map +1 -1
  219. package/dist/Toast/useToast.js +1 -0
  220. package/dist/Tokenizer/Tokenizer.d.ts +49 -37
  221. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  222. package/dist/Tokenizer/Tokenizer.js +22 -19
  223. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  224. package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
  225. package/dist/Tokenizer/index.d.ts +1 -1
  226. package/dist/Tokenizer/index.d.ts.map +1 -1
  227. package/dist/Tooltip/useTooltip.d.ts +19 -1
  228. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  229. package/dist/Tooltip/useTooltip.js +34 -53
  230. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  231. package/dist/Typeahead/BaseTypeahead.js +27 -18
  232. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  233. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  234. package/dist/animator/createAnimator.d.ts +98 -0
  235. package/dist/animator/createAnimator.d.ts.map +1 -0
  236. package/dist/animator/createAnimator.js +259 -0
  237. package/dist/astryx.css +39 -6
  238. package/dist/gestures/GestureHost.d.ts +16 -1
  239. package/dist/gestures/GestureHost.d.ts.map +1 -1
  240. package/dist/gestures/GestureHost.js +1 -1
  241. package/dist/gestures/PressTracker.d.ts.map +1 -1
  242. package/dist/gestures/PressTracker.js +4 -3
  243. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  244. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  245. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  246. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  247. package/dist/hooks/actionGroupTracker.js +13 -3
  248. package/dist/hooks/index.d.ts +1 -0
  249. package/dist/hooks/index.d.ts.map +1 -1
  250. package/dist/hooks/index.js +1 -0
  251. package/dist/hooks/longPressDetector.d.ts +66 -0
  252. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  253. package/dist/hooks/longPressDetector.js +200 -0
  254. package/dist/hooks/pressGroupContext.d.ts +6 -0
  255. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  256. package/dist/hooks/pressGroupContext.js +20 -0
  257. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  258. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  259. package/dist/hooks/rootScrollStyles.js +207 -0
  260. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  261. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  262. package/dist/hooks/scrollLockTouchGuard.js +134 -0
  263. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  264. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  265. package/dist/hooks/scrollbarGutter.js +36 -23
  266. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  267. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  268. package/dist/hooks/useActionGroupTracking.js +174 -0
  269. package/dist/hooks/useAnimator.d.ts +41 -0
  270. package/dist/hooks/useAnimator.d.ts.map +1 -0
  271. package/dist/hooks/useAnimator.js +70 -0
  272. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  273. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  274. package/dist/hooks/useAttachment.d.ts +1 -1
  275. package/dist/hooks/useAttachment.js +1 -1
  276. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  277. package/dist/hooks/useAutoMediaMode.js +1 -0
  278. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  279. package/dist/hooks/useBusyAnnouncement.js +2 -0
  280. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  281. package/dist/hooks/useDevWarning.js +2 -0
  282. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  283. package/dist/hooks/useFocusTrap.js +2 -0
  284. package/dist/hooks/useGridFocus.d.ts +8 -5
  285. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  286. package/dist/hooks/useGridFocus.js +4 -3
  287. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  288. package/dist/hooks/useHotkeys.js +3 -0
  289. package/dist/hooks/useImageMode.d.ts.map +1 -1
  290. package/dist/hooks/useImageMode.js +3 -0
  291. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  292. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  293. package/dist/hooks/useInputStatusIcon.js +2 -2
  294. package/dist/hooks/useKeyboardHint.js +1 -1
  295. package/dist/hooks/useLongPress.d.ts +8 -9
  296. package/dist/hooks/useLongPress.d.ts.map +1 -1
  297. package/dist/hooks/useLongPress.js +23 -106
  298. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  299. package/dist/hooks/useMenuHover.js +2 -0
  300. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  301. package/dist/hooks/useMenuPress.js +3 -0
  302. package/dist/hooks/useOverflow.d.ts.map +1 -1
  303. package/dist/hooks/useOverflow.js +2 -1
  304. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  305. package/dist/hooks/usePressFeedback.js +1 -0
  306. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  307. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  308. package/dist/hooks/useResolvedRequired.js +3 -0
  309. package/dist/hooks/useScrollLock.d.ts +7 -9
  310. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  311. package/dist/hooks/useScrollLock.js +55 -48
  312. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  313. package/dist/hooks/useScrollableArea.js +5 -0
  314. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  315. package/dist/hooks/useStreamingText.js +3 -0
  316. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  317. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  318. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  319. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  320. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  321. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  322. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  323. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  324. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/en.generated.js +30 -0
  326. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  328. package/dist/index.d.ts +1 -0
  329. package/dist/index.d.ts.map +1 -1
  330. package/dist/index.js +4 -0
  331. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  332. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  333. package/dist/internal/indicatorPress.stylex.js +26 -0
  334. package/dist/internal/selectable-card.d.ts +21 -0
  335. package/dist/internal/selectable-card.d.ts.map +1 -0
  336. package/dist/internal/selectable-card.js +20 -0
  337. package/dist/internal/sheetDraft.d.ts +2 -2
  338. package/dist/internal/sheetDraft.js +2 -2
  339. package/dist/motion/animatedLayout.d.ts.map +1 -1
  340. package/dist/motion/animatedLayout.js +7 -7
  341. package/dist/motion/animator.d.ts +14 -14
  342. package/dist/motion/animator.d.ts.map +1 -1
  343. package/dist/motion/animator.js +45 -20
  344. package/dist/motion/progress.d.ts +88 -0
  345. package/dist/motion/progress.d.ts.map +1 -0
  346. package/dist/motion/progress.js +128 -0
  347. package/dist/motion/reducedMotion.d.ts.map +1 -1
  348. package/dist/motion/reducedMotion.js +3 -1
  349. package/dist/motion/uikit/alert.d.ts +41 -0
  350. package/dist/motion/uikit/alert.d.ts.map +1 -0
  351. package/dist/motion/uikit/alert.js +43 -0
  352. package/dist/motion/uikit/index.d.ts +4 -3
  353. package/dist/motion/uikit/index.d.ts.map +1 -1
  354. package/dist/motion/uikit/index.js +4 -3
  355. package/dist/motion/uikit/picker.d.ts +96 -0
  356. package/dist/motion/uikit/picker.d.ts.map +1 -0
  357. package/dist/motion/uikit/picker.js +117 -0
  358. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  359. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  360. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  361. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  362. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  363. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  364. package/dist/theme/Theme.d.ts.map +1 -1
  365. package/dist/theme/Theme.js +29 -4
  366. package/dist/theme/motionKnobs.d.ts +4 -3
  367. package/dist/theme/motionKnobs.d.ts.map +1 -1
  368. package/dist/theme/motionKnobs.js +3 -2
  369. package/dist/theme/themeMotion.d.ts +6 -0
  370. package/dist/theme/themeMotion.d.ts.map +1 -1
  371. package/dist/theme/themeMotion.js +7 -0
  372. package/dist/utils/dateParser.d.ts.map +1 -1
  373. package/dist/utils/dateParser.js +12 -0
  374. package/dist/utils/focusReturn.d.ts +15 -0
  375. package/dist/utils/focusReturn.d.ts.map +1 -1
  376. package/dist/utils/focusReturn.js +28 -0
  377. package/dist/utils/interactionModality.d.ts.map +1 -1
  378. package/dist/utils/interactionModality.js +4 -0
  379. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  380. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  381. package/dist/utils/interactionOverlay.stylex.js +3 -2
  382. package/dist/utils/plainDate.d.ts +8 -0
  383. package/dist/utils/plainDate.d.ts.map +1 -1
  384. package/dist/utils/plainDate.js +19 -0
  385. package/dist/utils/pressFeedback.d.ts.map +1 -1
  386. package/dist/utils/pressFeedback.js +20 -6
  387. package/dist/utils/triggerFocus.d.ts +36 -0
  388. package/dist/utils/triggerFocus.d.ts.map +1 -0
  389. package/dist/utils/triggerFocus.js +65 -0
  390. package/locales/en.json +120 -0
  391. package/locales/pseudo.json +90 -0
  392. package/package.json +14 -9
  393. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  394. package/src/AlertDialog/AlertDialog.tsx +46 -5
  395. package/src/AppShell/AppShell.tsx +4 -0
  396. package/src/BottomSheet/BottomSheet.tsx +1 -0
  397. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  398. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  399. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  400. package/src/BottomSheet/useSheetGestures.ts +10 -1
  401. package/src/Button/Button.tsx +26 -4
  402. package/src/Calendar/Calendar.tsx +36 -25
  403. package/src/Carousel/Carousel.tsx +1 -0
  404. package/src/Chat/ChatComposerInput.tsx +2 -0
  405. package/src/Chat/ChatMessageList.tsx +2 -1
  406. package/src/Chat/useChatDictation.ts +1 -0
  407. package/src/Chat/useChatNewMessages.ts +1 -1
  408. package/src/Chat/useChatStreamScroll.ts +2 -0
  409. package/src/Chat/useSpeechRecognition.ts +2 -0
  410. package/src/Chat/useTriggerMenu.tsx +1 -1
  411. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  412. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  413. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  414. package/src/CodeBlock/CodeBlock.tsx +41 -4
  415. package/src/CommandPalette/CommandPalette.tsx +1 -0
  416. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  417. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  418. package/src/ContextMenu/ContextMenu.tsx +2 -2
  419. package/src/DateInput/MonthScroller.tsx +8 -2
  420. package/src/DateInput/PickerWheel.tsx +765 -0
  421. package/src/DateInput/TouchDateField.tsx +1 -0
  422. package/src/DateInput/Wheel.tsx +94 -150
  423. package/src/DateInput/useOwnScrollGesture.ts +25 -3
  424. package/src/DateInput/usePointerDragScroll.ts +1 -0
  425. package/src/DateInput/useScrollSettle.ts +2 -0
  426. package/src/DateInput/useWheelListbox.ts +112 -0
  427. package/src/DateInput/wheelOptions.ts +155 -0
  428. package/src/DateInput/wheelPhysics.ts +406 -0
  429. package/src/DateInput/wheelStrip.ts +341 -0
  430. package/src/DateTimeInput/TouchDateTimeField.tsx +2 -0
  431. package/src/Dialog/Dialog.tsx +12 -32
  432. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  433. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  434. package/src/Field/Field.tsx +2 -2
  435. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  436. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  437. package/src/FormLayout/FormLayout.tsx +5 -1
  438. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  439. package/src/HoverCard/HoverCard.tsx +58 -6
  440. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  441. package/src/HoverCard/useHoverCard.tsx +49 -54
  442. package/src/Icon/Icon.doc.mjs +49 -8
  443. package/src/Icon/Icon.tsx +15 -7
  444. package/src/IconButton/IconButton.doc.mjs +141 -21
  445. package/src/Item/useSwipeAction.ts +2 -0
  446. package/src/Layer/modalOutlet.ts +2 -0
  447. package/src/Layer/outsidePress.ts +1 -0
  448. package/src/Layer/useLayer.tsx +2 -0
  449. package/src/Layer/useLayerDismissal.ts +2 -0
  450. package/src/Layer/usePressPin.ts +81 -15
  451. package/src/Layer/useTouchTrigger.ts +2 -0
  452. package/src/Lightbox/Lightbox.tsx +19 -0
  453. package/src/MobileNav/MobileNav.tsx +9 -30
  454. package/src/Outline/useOutlineFromDOM.ts +2 -0
  455. package/src/Outline/useScrollSpy.ts +2 -0
  456. package/src/OverflowList/OverflowList.tsx +2 -0
  457. package/src/Popover/Popover.tsx +4 -0
  458. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  459. package/src/PowerSearch/PowerSearch.tsx +627 -157
  460. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  461. package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
  462. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  463. package/src/PowerSearch/PowerSearchToken.tsx +7 -0
  464. package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
  465. package/src/PowerSearch/formatFilterValue.ts +55 -17
  466. package/src/PowerSearch/formatTokenValue.ts +222 -0
  467. package/src/PowerSearch/powerSearchDateZone.ts +64 -0
  468. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  469. package/src/PowerSearch/types.ts +2 -0
  470. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  471. package/src/RadioList/RadioList.tsx +3 -2
  472. package/src/RadioList/RadioListItem.tsx +5 -3
  473. package/src/Resizable/Resizable.doc.mjs +5 -4
  474. package/src/Resizable/ResizeHandle.tsx +169 -109
  475. package/src/Resizable/createResizable.ts +831 -0
  476. package/src/Resizable/useResizable.ts +292 -623
  477. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  478. package/src/SelectableCard/SelectableCard.tsx +39 -10
  479. package/src/SelectableCard/selectableCardInput.ts +30 -0
  480. package/src/Selector/Selector.tsx +5 -12
  481. package/src/Slider/sliderTouchController.ts +2 -2
  482. package/src/Spinner/Spinner.tsx +77 -63
  483. package/src/Switch/Switch.tsx +2 -6
  484. package/src/Switch/useSwitchTouch.ts +4 -4
  485. package/src/Table/BaseTable.tsx +46 -12
  486. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  487. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  488. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  489. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  490. package/src/TextInput/TextInput.tsx +11 -10
  491. package/src/TimeInput/TimeInput.tsx +2 -0
  492. package/src/TimeInput/TouchTimeField.tsx +2 -0
  493. package/src/Timer/Timer.tsx +1 -0
  494. package/src/Timestamp/Timestamp.tsx +1 -1
  495. package/src/Toast/Toast.doc.mjs +4 -3
  496. package/src/Toast/Toast.tsx +52 -32
  497. package/src/Toast/ToastViewport.tsx +123 -35
  498. package/src/Toast/types.ts +9 -3
  499. package/src/Toast/useToast.tsx +1 -0
  500. package/src/Tokenizer/Tokenizer.doc.mjs +19 -3
  501. package/src/Tokenizer/Tokenizer.tsx +73 -51
  502. package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
  503. package/src/Tokenizer/index.ts +1 -0
  504. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  505. package/src/Tooltip/useTooltip.tsx +61 -56
  506. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  507. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  508. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  509. package/src/animator/createAnimator.doc.mjs +153 -0
  510. package/src/animator/createAnimator.ts +324 -0
  511. package/src/gestures/GestureHost.ts +1 -1
  512. package/src/gestures/PressTracker.ts +4 -3
  513. package/src/gestures/README.md +10 -4
  514. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  515. package/src/hooks/actionGroupTracker.ts +20 -5
  516. package/src/hooks/index.ts +2 -0
  517. package/src/hooks/longPressDetector.ts +273 -0
  518. package/src/hooks/pressGroupContext.ts +21 -0
  519. package/src/hooks/rootScrollStyles.ts +247 -0
  520. package/src/hooks/scrollLockTouchGuard.ts +182 -0
  521. package/src/hooks/scrollbarGutter.ts +41 -26
  522. package/src/hooks/useActionGroupTracking.ts +224 -0
  523. package/src/hooks/useAnimator.doc.mjs +109 -0
  524. package/src/hooks/useAnimator.ts +67 -0
  525. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  526. package/src/hooks/useAttachment.ts +1 -1
  527. package/src/hooks/useAutoMediaMode.ts +1 -0
  528. package/src/hooks/useBusyAnnouncement.ts +2 -0
  529. package/src/hooks/useDevWarning.ts +2 -0
  530. package/src/hooks/useFocusTrap.ts +2 -0
  531. package/src/hooks/useGridFocus.doc.mjs +6 -6
  532. package/src/hooks/useGridFocus.ts +10 -7
  533. package/src/hooks/useHotkeys.ts +2 -0
  534. package/src/hooks/useImageMode.ts +2 -0
  535. package/src/hooks/useInputStatusIcon.tsx +3 -2
  536. package/src/hooks/useKeyboardHint.tsx +1 -1
  537. package/src/hooks/useLongPress.doc.mjs +2 -2
  538. package/src/hooks/useLongPress.ts +32 -122
  539. package/src/hooks/useMenuHover.ts +1 -0
  540. package/src/hooks/useMenuPress.ts +2 -0
  541. package/src/hooks/useOverflow.ts +2 -1
  542. package/src/hooks/usePressFeedback.ts +1 -0
  543. package/src/hooks/useResolvedRequired.ts +3 -0
  544. package/src/hooks/useScrollLock.doc.mjs +51 -12
  545. package/src/hooks/useScrollLock.ts +57 -60
  546. package/src/hooks/useScrollableArea.ts +4 -0
  547. package/src/hooks/useStreamingText.ts +2 -0
  548. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  549. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  550. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  551. package/src/i18n/generated-locales/en.generated.ts +41 -0
  552. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  553. package/src/index.ts +13 -0
  554. package/src/internal/indicatorPress.stylex.ts +24 -0
  555. package/src/internal/selectable-card.ts +21 -0
  556. package/src/internal/sheetDraft.ts +2 -2
  557. package/src/motion/MEASUREMENTS.md +18 -0
  558. package/src/motion/README.md +10 -5
  559. package/src/motion/animatedLayout.ts +10 -5
  560. package/src/motion/animator.ts +66 -31
  561. package/src/motion/progress.ts +155 -0
  562. package/src/motion/reducedMotion.ts +3 -1
  563. package/src/motion/uikit/alert.ts +43 -0
  564. package/src/motion/uikit/index.ts +4 -3
  565. package/src/motion/uikit/picker.ts +116 -0
  566. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  567. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  568. package/src/theme/Theme.tsx +37 -3
  569. package/src/theme/motionKnobs.ts +4 -3
  570. package/src/theme/themeMotion.ts +7 -0
  571. package/src/utils/dateParser.ts +16 -0
  572. package/src/utils/focusReturn.ts +30 -0
  573. package/src/utils/interactionModality.ts +4 -0
  574. package/src/utils/interactionOverlay.stylex.ts +3 -2
  575. package/src/utils/plainDate.ts +21 -0
  576. package/src/utils/pressFeedback.ts +24 -6
  577. package/src/utils/triggerFocus.ts +80 -0
  578. package/dist/internal/touch-sheet.d.ts +0 -21
  579. package/dist/internal/touch-sheet.d.ts.map +0 -1
  580. package/dist/internal/touch-sheet.js +0 -19
  581. package/src/internal/touch-sheet.ts +0 -21
@@ -16,6 +16,7 @@ import type {Locale, TranslatorFn} from '../i18n';
16
16
  import {truncateCharacters} from '../utils/characters';
17
17
  import {registerEnglishFallback} from '../i18n/englishFallback';
18
18
  import english from '../i18n/generated-english/PowerSearch/formatFilterValue.generated';
19
+ import {resolveDateZone} from './powerSearchDateZone';
19
20
 
20
21
  registerEnglishFallback(english);
21
22
 
@@ -32,33 +33,64 @@ function formatEnumLabel(
32
33
  }
33
34
 
34
35
  function formatNumber(value: number, locale: Locale, units?: string): string {
35
- const formatted = new Intl.NumberFormat(locale).format(value);
36
+ const formatted = formatSharedNumber(value, locale);
36
37
  return units ? `${formatted} ${units}` : formatted;
37
38
  }
38
39
 
40
+ /**
41
+ * A number in the provider locale's digits, decimal mark, and — unless the
42
+ * options say otherwise — grouping. The shared number helper for
43
+ * PowerSearch's own readings of a value — this module owns the raw `Intl`
44
+ * access.
45
+ */
46
+ export function formatSharedNumber(
47
+ value: number,
48
+ locale: Locale,
49
+ options?: Pick<
50
+ Intl.NumberFormatOptions,
51
+ 'useGrouping' | 'maximumFractionDigits'
52
+ >,
53
+ ): string {
54
+ return new Intl.NumberFormat(locale, options).format(value);
55
+ }
56
+
57
+ /**
58
+ * The one reading of a calendar-day `date_absolute` value: its day in the
59
+ * zone `resolveDateZone` names. The token text and the accessible label share
60
+ * it; the editors read the same zone through `resolveDateZone`, so a value
61
+ * never reads as two days in one field. A value whose operator sets
62
+ * `isDateOnly: false` is not a calendar day: it keeps its date and time in
63
+ * `timezoneID`, else the viewer's zone.
64
+ */
39
65
  export function formatDateAbsolute(
40
66
  unixSeconds: number,
41
67
  locale: Locale,
42
- timezoneID?: string,
68
+ timezoneID: string | undefined,
69
+ isDateOnly = true,
43
70
  ): string {
44
- const options: Intl.DateTimeFormatOptions = {
45
- year: 'numeric',
46
- month: 'short',
47
- day: 'numeric',
48
- hour: 'numeric',
49
- minute: '2-digit',
50
- ...(timezoneID ? {timeZone: timezoneID} : {}),
51
- calendar: 'gregory',
52
- };
71
+ const options: Intl.DateTimeFormatOptions = isDateOnly
72
+ ? {
73
+ year: 'numeric',
74
+ month: 'short',
75
+ day: 'numeric',
76
+ timeZone: resolveDateZone(timezoneID, true),
77
+ calendar: 'gregory',
78
+ }
79
+ : {
80
+ year: 'numeric',
81
+ month: 'short',
82
+ day: 'numeric',
83
+ hour: 'numeric',
84
+ minute: '2-digit',
85
+ timeZone: resolveDateZone(timezoneID, false),
86
+ calendar: 'gregory',
87
+ };
53
88
  return new Intl.DateTimeFormat(locale, options).format(unixSeconds * 1000);
54
89
  }
55
90
 
56
91
  /**
57
- * Compact date-only rendering (no time-of-day) for the token pill's inline
58
- * value display, which has less room than the editor's full summary. Kept
59
- * separate from {@link formatDateAbsolute} rather than reusing it with
60
- * different options threaded through a param, since the two callers want
61
- * genuinely different shapes, not a parameterization of the same one.
92
+ * The released token text for a value with a time of day: its day in the
93
+ * viewer's zone, as the token has always shown it.
62
94
  */
63
95
  export function formatDateAbsoluteCompact(
64
96
  unixSeconds: number,
@@ -188,7 +220,13 @@ export function formatFilterValue(
188
220
 
189
221
  case 'date_absolute':
190
222
  return truncate(
191
- formatDateAbsolute(filterValue.unixSeconds, locale, timezoneID),
223
+ formatDateAbsolute(
224
+ filterValue.unixSeconds,
225
+ locale,
226
+ timezoneID,
227
+ operatorValue.type !== 'date_absolute' ||
228
+ operatorValue.isDateOnly !== false,
229
+ ),
192
230
  maxLength,
193
231
  );
194
232
 
@@ -0,0 +1,222 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @fileoverview The text a PowerSearch filter token shows for a value.
5
+ *
6
+ * @input `OperatorValue`, `FilterValue`, a width budget, and the locale.
7
+ * @output `formatTokenValueText` — one string, or null for an empty value.
8
+ * @position Shared by the token itself (`PowerSearch.tsx`) and the sheet
9
+ * presentation's Filters rows and removal announcement
10
+ * (`PowerSearchBottomSheet.tsx`), so every reading of a value on the field
11
+ * uses the same words and the same zone handling.
12
+ */
13
+
14
+ import type {OperatorValue, FilterValue, EnumItem} from './types';
15
+ import type {Locale, TranslatorFn} from '../i18n';
16
+ import {truncateCharacters} from '../utils/characters';
17
+ import {
18
+ formatDateAbsolute,
19
+ formatDateAbsoluteCompact,
20
+ formatSharedNumber,
21
+ } from './formatFilterValue';
22
+ import {registerEnglishFallback} from '../i18n/englishFallback';
23
+ import english from '../i18n/generated-english/PowerSearch/formatTokenValue.generated';
24
+
25
+ registerEnglishFallback(english);
26
+
27
+ type ListFormatFn = (items: ReadonlyArray<string>) => string;
28
+
29
+ function truncateString(value: string, limit: number): string {
30
+ // Same semantics as before — strings within limit + 3 pass through, longer
31
+ // ones cut to limit + '...' — but counted in characters, not code units.
32
+ return truncateCharacters(value, limit + 3, '...');
33
+ }
34
+
35
+ function getEnumLabel(values: ReadonlyArray<EnumItem>, value: string): string {
36
+ return values.find(v => v.value === value)?.label ?? value;
37
+ }
38
+
39
+ // Intl's maximum fraction cap: no number the row formats is rounded.
40
+ const MAX_FRACTION_DIGITS = 100;
41
+
42
+ // Whether a locale writes a number with the token's own numerals: Latin
43
+ // digits and a `.` decimal mark, so `String(value)` is already the locale's
44
+ // reading. Probed once per locale through the shared number helper.
45
+ const tokenNumeralLocales = new Map<string, boolean>();
46
+ function usesTokenNumerals(locale: Locale): boolean {
47
+ let uses = tokenNumeralLocales.get(locale);
48
+ if (uses == null) {
49
+ uses =
50
+ formatSharedNumber(1234567.5, locale, {
51
+ useGrouping: false,
52
+ maximumFractionDigits: MAX_FRACTION_DIGITS,
53
+ }) === '1234567.5';
54
+ tokenNumeralLocales.set(locale, uses);
55
+ }
56
+ return uses;
57
+ }
58
+
59
+ // A number as the token reads it. Where the locale writes Latin digits and a
60
+ // `.` decimal mark, use the token's own text, `String(value)`. Elsewhere, use
61
+ // the locale's digits and decimal mark, with no grouping and no rounding: the
62
+ // fraction cap is Intl's maximum, so `1e-21` keeps its digits.
63
+ function formatNumberAsToken(value: number, locale: Locale): string {
64
+ return usesTokenNumerals(locale)
65
+ ? String(value)
66
+ : formatSharedNumber(value, locale, {
67
+ useGrouping: false,
68
+ maximumFractionDigits: MAX_FRACTION_DIGITS,
69
+ });
70
+ }
71
+
72
+ // The summaries, lists, and numbers the token writes as English literals, and
73
+ // the locale-aware readings of the same: with a translator (the sheet
74
+ // presentation's rows and announcements) the summaries resolve through the
75
+ // catalog, lists through the provider locale's list format, and numbers
76
+ // through its number format; without one they stay the token's own literals,
77
+ // the released popover token's text. In English the two read identically.
78
+ function itemsSummary(count: number, t: TranslatorFn | undefined): string {
79
+ return t
80
+ ? t('@astryx.powersearch.valueEditor.itemsCount', {count})
81
+ : // eslint-disable-next-line @astryx/no-hardcoded-i18n-string -- the popover token's released English text; translating it is a separate stable change
82
+ `${count} items`;
83
+ }
84
+
85
+ function formatListText(
86
+ labels: ReadonlyArray<string>,
87
+ maxLength: number,
88
+ t: TranslatorFn | undefined,
89
+ formatList: ListFormatFn | undefined,
90
+ ): string | null {
91
+ if (labels.length === 0) {
92
+ return null;
93
+ }
94
+ if (labels.length === 1) {
95
+ return truncateString(labels[0], maxLength);
96
+ }
97
+ const totalLength = labels.reduce((sum, s) => sum + s.length, 0);
98
+ if (totalLength > maxLength) {
99
+ return itemsSummary(labels.length, t);
100
+ }
101
+ return formatList ? formatList(labels) : labels.join(', ');
102
+ }
103
+
104
+ /**
105
+ * The text a filter token shows for a value: the one place that decides how
106
+ * a value reads on the field, so every other reading of the same value —
107
+ * the sheet presentation's Filters rows and its removal announcement — can
108
+ * use the same words and the same zone handling. `maxLength` is the token's
109
+ * width budget; pass `Number.MAX_SAFE_INTEGER` for the untruncated text.
110
+ * With `t`, the list, date-range and nested summaries resolve through the
111
+ * catalog (`@astryx.powersearch.valueEditor.*`); without it they are the
112
+ * token's own literals. With `formatList` (the provider's list formatter),
113
+ * several labels join as a list in the locale; without it they join with
114
+ * the token's literal ", ".
115
+ */
116
+ export function formatTokenValueText(
117
+ operatorValue: OperatorValue,
118
+ filterValue: FilterValue,
119
+ maxLength: number,
120
+ locale: Locale,
121
+ t?: TranslatorFn,
122
+ formatList?: ListFormatFn,
123
+ timezoneID?: string,
124
+ ): string | null {
125
+ switch (filterValue.type) {
126
+ case 'empty':
127
+ return null;
128
+
129
+ case 'string':
130
+ return truncateString(filterValue.value, maxLength);
131
+
132
+ case 'integer':
133
+ case 'float':
134
+ return t
135
+ ? formatNumberAsToken(filterValue.value, locale)
136
+ : String(filterValue.value);
137
+
138
+ case 'enum':
139
+ if (operatorValue.type === 'enum') {
140
+ return truncateString(
141
+ getEnumLabel(operatorValue.values, filterValue.value),
142
+ maxLength,
143
+ );
144
+ }
145
+ return truncateString(filterValue.value, maxLength);
146
+
147
+ case 'string_list':
148
+ return formatListText(filterValue.value, maxLength, t, formatList);
149
+
150
+ case 'enum_list': {
151
+ const items = filterValue.value;
152
+ if (items.length === 0) {
153
+ return null;
154
+ }
155
+ if (operatorValue.type === 'enum_list') {
156
+ return formatListText(
157
+ items.map(v => getEnumLabel(operatorValue.values, v)),
158
+ maxLength,
159
+ t,
160
+ formatList,
161
+ );
162
+ }
163
+ if (items.length === 1) {
164
+ return truncateString(items[0], maxLength);
165
+ }
166
+ return itemsSummary(items.length, t);
167
+ }
168
+
169
+ case 'entity_list':
170
+ return formatListText(
171
+ filterValue.value.map(e => e.label),
172
+ maxLength,
173
+ t,
174
+ formatList,
175
+ );
176
+
177
+ case 'time':
178
+ return filterValue.value;
179
+
180
+ case 'date_absolute':
181
+ // A date-only value reads in the zone its editor uses. An
182
+ // `isDateOnly: false` value reads its day in the viewer's zone.
183
+ return truncateString(
184
+ operatorValue.type === 'date_absolute' &&
185
+ operatorValue.isDateOnly === false
186
+ ? formatDateAbsoluteCompact(filterValue.unixSeconds, locale)
187
+ : formatDateAbsolute(filterValue.unixSeconds, locale, timezoneID),
188
+ maxLength,
189
+ );
190
+
191
+ case 'date_relative':
192
+ return truncateString(filterValue.value, maxLength);
193
+
194
+ case 'date_range':
195
+ if (t) {
196
+ return t('@astryx.powersearch.valueEditor.dateRange');
197
+ }
198
+ // eslint-disable-next-line @astryx/no-hardcoded-i18n-string -- the popover token's released English text; translating it is a separate stable change
199
+ return 'date range';
200
+
201
+ case 'custom':
202
+ if (operatorValue.type === 'custom') {
203
+ return truncateString(
204
+ operatorValue.getString(filterValue.value),
205
+ maxLength,
206
+ );
207
+ }
208
+ return filterValue.value;
209
+
210
+ case 'nested': {
211
+ const count = filterValue.value.length;
212
+ if (t) {
213
+ return t('@astryx.powersearch.valueEditor.filtersCount', {count});
214
+ }
215
+ // eslint-disable-next-line @astryx/no-hardcoded-i18n-string -- the popover token's released English text; translating it is a separate stable change
216
+ return count === 1 ? '1 filter' : `${count} filters`;
217
+ }
218
+
219
+ default:
220
+ return null;
221
+ }
222
+ }
@@ -0,0 +1,64 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file powerSearchDateZone.ts
5
+ * @input A `date_absolute` or range part's `unixSeconds`, the operator's
6
+ * `isDateOnly`, and the PowerSearch `timezoneID`
7
+ * @output The one zone every reading of such a value uses, and the
8
+ * conversions between an instant and the calendar day shown in that zone
9
+ * @position Shared by the token text, the accessible label, and the value
10
+ * editors, so a value reads as the same day everywhere in one field
11
+ */
12
+
13
+ import type {ISODateString} from '../utils/dateTypes';
14
+ import {
15
+ plainDateFromDate,
16
+ plainDateFromInstant,
17
+ plainDateFromISO,
18
+ plainDateToDate,
19
+ plainDateToInstant,
20
+ plainDateToISO,
21
+ } from '../utils/plainDate';
22
+
23
+ /**
24
+ * The zone a date value is read and written in. A calendar day is stored as
25
+ * midnight in `timezoneID`. With no `timezoneID` the day is the UTC day, so
26
+ * a value written before a zone was given keeps its day. A value with a time
27
+ * of day shows in `timezoneID`, else in the viewer's zone. `undefined` names
28
+ * the viewer's zone, because `Intl` and `Date` default to it.
29
+ */
30
+ export function resolveDateZone(
31
+ timezoneID: string | undefined,
32
+ isDateOnly: boolean,
33
+ ): string | undefined {
34
+ // An empty string is no zone, as the formatter always read it.
35
+ if (timezoneID) {
36
+ return timezoneID;
37
+ }
38
+ return isDateOnly ? 'UTC' : undefined;
39
+ }
40
+
41
+ export function unixSecondsToISODate(
42
+ unixSeconds: number,
43
+ zone: string | undefined,
44
+ ): ISODateString {
45
+ const instant = unixSeconds * 1000;
46
+
47
+ return plainDateToISO(
48
+ zone == null
49
+ ? plainDateFromDate(new Date(instant))
50
+ : plainDateFromInstant(instant, zone),
51
+ );
52
+ }
53
+
54
+ export function isoDateToUnixSeconds(
55
+ date: ISODateString,
56
+ zone: string | undefined,
57
+ ): number {
58
+ const plain = plainDateFromISO(date);
59
+ const instant =
60
+ zone == null
61
+ ? plainDateToDate(plain).getTime()
62
+ : plainDateToInstant(plain, zone);
63
+ return Math.floor(instant / 1000);
64
+ }
@@ -0,0 +1,224 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file powerSearchSheetUtils.ts
5
+ * @input PowerSearch config/filter types and the field typeahead source
6
+ * @output Pure helpers for the sheet presentation: which operators the
7
+ * sheet's own controls edit, field matching, filter identity tracking
8
+ * across controlled re-renders, the focus target after a removal, and the
9
+ * content search's suggestion source over the field typeahead
10
+ * @position Helper module; consumed by PowerSearchBottomSheet.tsx and its
11
+ * tests
12
+ */
13
+
14
+ import type {SearchSource} from '../Typeahead/types';
15
+ import type {InternalConfig} from './useInternalConfig';
16
+ import type {
17
+ PowerSearchField,
18
+ PowerSearchFilter,
19
+ PowerSearchItem,
20
+ PowerSearchOperator,
21
+ } from './types';
22
+
23
+ // =============================================================================
24
+ // Operators and fields
25
+ // =============================================================================
26
+
27
+ /**
28
+ * Whether the value step edits an operator's value with a sheet-native
29
+ * control (choice rows, or the popover's editor in its sheet presentation).
30
+ * A `nested` value is the exception: it is edited by the popover's built-in
31
+ * NestedEditor, rendered in the step's body,
32
+ * so every operator opens an editable step and no field is left out.
33
+ */
34
+ export function isSupportedOperator(operator: PowerSearchOperator): boolean {
35
+ return operator.value.type !== 'nested';
36
+ }
37
+
38
+ export function fieldMatchesQuery(
39
+ field: PowerSearchField,
40
+ normalizedQuery: string,
41
+ ): boolean {
42
+ if (normalizedQuery === '') {
43
+ return true;
44
+ }
45
+ if (field.label.toLowerCase().includes(normalizedQuery)) {
46
+ return true;
47
+ }
48
+ return (
49
+ field.typeaheadAliases?.some(alias =>
50
+ alias.toLowerCase().includes(normalizedQuery),
51
+ ) ?? false
52
+ );
53
+ }
54
+
55
+ /** Synchronous suggestion source; the sheet renders results inline. */
56
+ export interface SheetSuggestionSource {
57
+ search(query: string): PowerSearchItem[];
58
+ bootstrap(): PowerSearchItem[];
59
+ }
60
+
61
+ /**
62
+ * The field typeahead source as the content search's rows: the popover
63
+ * presentation's own suggestions, minus any whose field the config no longer
64
+ * knows. That source resolves synchronously from the config; a promise (none
65
+ * today) yields no rows rather than a stale list.
66
+ */
67
+ export function createSheetSuggestionSource(
68
+ config: InternalConfig,
69
+ source: SearchSource<PowerSearchItem>,
70
+ ): SheetSuggestionSource {
71
+ // Every suggestion whose field the config knows is offered: the value step
72
+ // edits every operator, `nested` included.
73
+ const isEditable = (item: PowerSearchItem): boolean => {
74
+ const aux = item.auxiliaryData;
75
+ return aux != null && config.getField(aux.fieldKey) != null;
76
+ };
77
+ const settle = (
78
+ results: PowerSearchItem[] | Promise<PowerSearchItem[]>,
79
+ ): PowerSearchItem[] =>
80
+ Array.isArray(results) ? results.filter(isEditable) : [];
81
+ return {
82
+ search: query => settle(source.search(query)),
83
+ bootstrap: () => settle(source.bootstrap()),
84
+ };
85
+ }
86
+
87
+ // =============================================================================
88
+ // Filter identity across controlled updates
89
+ // =============================================================================
90
+
91
+ function stableSerialize(value: unknown): string {
92
+ if (Array.isArray(value)) {
93
+ return `[${value.map(stableSerialize).join(',')}]`;
94
+ }
95
+ if (value != null && typeof value === 'object') {
96
+ return `{${Object.entries(value)
97
+ .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
98
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableSerialize(entry)}`)
99
+ .join(',')}}`;
100
+ }
101
+ return JSON.stringify(value) ?? 'undefined';
102
+ }
103
+
104
+ /**
105
+ * Stable identities for the Filters rows across controlled updates, so a row
106
+ * keeps its element — and its focus — when the parent reorders the filters or
107
+ * removes one above it. A filter object seen before keeps its
108
+ * id; a new object takes the id of a filter from the previous update with the
109
+ * same signature that no present object claims (a parent that clones its
110
+ * values on every change); anything else mints a new id. Two equal filters
111
+ * are told apart by order. Call `next` once per render with the current list.
112
+ */
113
+ export function createFilterIdentities(): {
114
+ next: (filters: ReadonlyArray<PowerSearchFilter>) => number[];
115
+ } {
116
+ const byObject = new WeakMap<PowerSearchFilter, number>();
117
+ let previousBySignature = new Map<string, number[]>();
118
+ let nextId = 0;
119
+ return {
120
+ next(filters) {
121
+ const used = new Set<number>();
122
+ const ids: (number | null)[] = filters.map(filter => {
123
+ const known = byObject.get(filter);
124
+ if (known == null || used.has(known)) {
125
+ return null;
126
+ }
127
+ used.add(known);
128
+ return known;
129
+ });
130
+ const bySignature = new Map<string, number[]>();
131
+ filters.forEach((filter, index) => {
132
+ const signature = filterSignature(filter);
133
+ let id = ids[index];
134
+ if (id == null) {
135
+ id =
136
+ previousBySignature
137
+ .get(signature)
138
+ ?.find(candidate => !used.has(candidate)) ?? nextId++;
139
+ used.add(id);
140
+ byObject.set(filter, id);
141
+ ids[index] = id;
142
+ }
143
+ bySignature.set(signature, [...(bySignature.get(signature) ?? []), id]);
144
+ });
145
+ previousBySignature = bySignature;
146
+ return ids as number[];
147
+ },
148
+ };
149
+ }
150
+
151
+ /** Structural snapshot of a filter, for parents that clone their values. */
152
+ export function filterSignature(filter: PowerSearchFilter): string {
153
+ return stableSerialize({
154
+ field: filter.field,
155
+ operator: filter.operator,
156
+ value: filter.value,
157
+ isReadOnly: filter.isReadOnly ?? false,
158
+ });
159
+ }
160
+
161
+ /**
162
+ * Finds the filter a step was opened on after the controlled parent may have
163
+ * reordered, cloned, or removed it: object identity first, then the original
164
+ * slot when it still holds a structurally equal filter, then a unique
165
+ * structural match anywhere. Returns null when the target is gone or
166
+ * ambiguous, so an edit never lands on a different filter.
167
+ */
168
+ export function resolveFilterIdentityIndex(
169
+ filters: ReadonlyArray<PowerSearchFilter>,
170
+ sourceFilter: PowerSearchFilter,
171
+ sourceSignature: string,
172
+ preferredIndex: number,
173
+ ): number | null {
174
+ const identityIndex = filters.indexOf(sourceFilter);
175
+ if (identityIndex >= 0) {
176
+ return identityIndex;
177
+ }
178
+ if (
179
+ filters[preferredIndex] != null &&
180
+ filterSignature(filters[preferredIndex]) === sourceSignature
181
+ ) {
182
+ return preferredIndex;
183
+ }
184
+ const matchingIndices = filters.flatMap((filter, index) =>
185
+ filterSignature(filter) === sourceSignature ? [index] : [],
186
+ );
187
+ return matchingIndices.length === 1 ? matchingIndices[0] : null;
188
+ }
189
+
190
+ /**
191
+ * After removing the filter at `removedIndex`, focus should land on the
192
+ * nearest remaining row that is a button, preferring the one after it.
193
+ * `isRowButton` is the Filters sheet's own rule for which rows are buttons:
194
+ * the field interactive and the filter not read-only (a `nested` or stale
195
+ * filter's row is a button too).
196
+ */
197
+ export function nearestEditableIndex(
198
+ nextFilters: ReadonlyArray<PowerSearchFilter>,
199
+ removedIndex: number,
200
+ isRowButton: (filter: PowerSearchFilter) => boolean = filter =>
201
+ !filter.isReadOnly,
202
+ ): number | undefined {
203
+ const editableIndices = nextFilters.flatMap((candidate, candidateIndex) =>
204
+ isRowButton(candidate) ? [candidateIndex] : [],
205
+ );
206
+ return editableIndices.reduce<number | undefined>((nearest, candidate) => {
207
+ if (nearest == null) {
208
+ return candidate;
209
+ }
210
+ const candidateDistance = Math.abs(candidate - removedIndex);
211
+ const nearestDistance = Math.abs(nearest - removedIndex);
212
+ if (candidateDistance < nearestDistance) {
213
+ return candidate;
214
+ }
215
+ if (
216
+ candidateDistance === nearestDistance &&
217
+ candidate >= removedIndex &&
218
+ nearest < removedIndex
219
+ ) {
220
+ return candidate;
221
+ }
222
+ return nearest;
223
+ }, undefined);
224
+ }
@@ -407,6 +407,8 @@ export interface PowerSearchTokenProps {
407
407
  readonly onClick?: () => void;
408
408
  readonly onRemove?: () => void;
409
409
  readonly isDisabled?: boolean;
410
+ /** The zone the field reads date values in; see PowerSearch `timezoneID`. */
411
+ readonly timezoneID?: string;
410
412
  }
411
413
 
412
414
  /**
@@ -75,6 +75,8 @@ export function useProgressBarTouch(
75
75
  const watchesTrack = isTouch && hasMarks;
76
76
  const trackRef = useRef<HTMLDivElement | null>(null);
77
77
  const [trackWidth, setTrackWidth] = useState(0);
78
+ // Syncs the shared resize observer with the track while the track width is
79
+ // needed.
78
80
  useEffect(() => {
79
81
  const element = trackRef.current;
80
82
  if (!watchesTrack || element == null) {
@@ -29,9 +29,10 @@ import * as stylex from '@stylexjs/stylex';
29
29
  import {spacingVars} from '../theme/tokens.stylex';
30
30
  import {Field} from '../Field/Field';
31
31
  import type {InputStatus} from '../Field/types';
32
- import {useTooltip} from '../Tooltip';
32
+ import {useTooltip} from '../Tooltip/useTooltip';
33
33
  import {useResolvedRequired} from '../hooks/useResolvedRequired';
34
- import {composeEventHandlers, mergeProps} from '../utils';
34
+ import {composeEventHandlers} from '../utils/composeEventHandlers';
35
+ import {mergeProps} from '../utils/mergeProps';
35
36
  import {joinAriaIDs} from '../utils/inputAria';
36
37
  import {
37
38
  type FieldInputBaseProps,
@@ -26,12 +26,14 @@ import {RadioListContext} from './RadioList';
26
26
  import {RadioListReasonContext} from './RadioListReasonContext';
27
27
  import {joinAriaIDs} from '../utils/inputAria';
28
28
  import {colorVars, radiusVars} from '../theme/tokens.stylex';
29
- import {mergeProps, isRenderable, rtlStyles} from '../utils';
29
+ import {isRenderable} from '../utils/isRenderable';
30
+ import {mergeProps} from '../utils/mergeProps';
31
+ import {rtlStyles} from '../utils/rtlStyles';
30
32
  import {indicatorScope} from '../Indicator/indicator.markers.stylex';
31
33
  import {useIndicatorFocusRing} from '../hooks/useIndicatorFocusRing';
32
34
  import {usePressFeedback} from '../hooks/usePressFeedback';
33
- import {useIndicator} from '../Indicator';
34
- import {Item, type ItemAlign} from '../Item';
35
+ import {useIndicator} from '../Indicator/useIndicator';
36
+ import {Item, type ItemAlign} from '../Item/Item';
35
37
  import {themeProps} from '../utils/themeProps';
36
38
 
37
39
  // The touch press's paint, declared by the shared overlay styles on the