@astryxdesign/core 0.7.7 → 0.7.8-canary.30b1896

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 (540) 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/TouchDateField.d.ts.map +1 -1
  50. package/dist/DateInput/TouchDateField.js +1 -0
  51. package/dist/DateInput/Wheel.d.ts.map +1 -1
  52. package/dist/DateInput/Wheel.js +4 -0
  53. package/dist/DateInput/useOwnScrollGesture.d.ts.map +1 -1
  54. package/dist/DateInput/useOwnScrollGesture.js +3 -0
  55. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  56. package/dist/DateInput/usePointerDragScroll.js +2 -0
  57. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  58. package/dist/DateInput/useScrollSettle.js +3 -0
  59. package/dist/Dialog/Dialog.d.ts.map +1 -1
  60. package/dist/Dialog/Dialog.js +9 -32
  61. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  62. package/dist/Drawer/useDrawerDialogPresence.js +3 -0
  63. package/dist/DropdownMenu/useMenuOverflow.d.ts.map +1 -1
  64. package/dist/DropdownMenu/useMenuOverflow.js +5 -0
  65. package/dist/Field/Field.js +2 -2
  66. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts.map +1 -1
  67. package/dist/FieldStatus/useFieldStatusAnnouncement.js +1 -0
  68. package/dist/FormLayout/FormLayout.d.ts +5 -1
  69. package/dist/FormLayout/FormLayout.d.ts.map +1 -1
  70. package/dist/HoverCard/HoverCard.d.ts +6 -4
  71. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  72. package/dist/HoverCard/HoverCard.js +48 -3
  73. package/dist/HoverCard/useHoverCard.d.ts +5 -4
  74. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  75. package/dist/HoverCard/useHoverCard.js +20 -33
  76. package/dist/Icon/Icon.d.ts +5 -1
  77. package/dist/Icon/Icon.d.ts.map +1 -1
  78. package/dist/Icon/Icon.js +5 -2
  79. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  80. package/dist/Item/useSwipeAction.js +3 -0
  81. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  82. package/dist/Layer/modalOutlet.js +2 -0
  83. package/dist/Layer/outsidePress.d.ts.map +1 -1
  84. package/dist/Layer/outsidePress.js +1 -0
  85. package/dist/Layer/useLayer.d.ts.map +1 -1
  86. package/dist/Layer/useLayer.js +3 -0
  87. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  88. package/dist/Layer/useLayerDismissal.js +3 -0
  89. package/dist/Layer/usePressPin.d.ts +17 -5
  90. package/dist/Layer/usePressPin.d.ts.map +1 -1
  91. package/dist/Layer/usePressPin.js +62 -12
  92. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  93. package/dist/Layer/useTouchTrigger.js +3 -0
  94. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  95. package/dist/Lightbox/Lightbox.js +19 -0
  96. package/dist/MobileNav/MobileNav.d.ts +3 -2
  97. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  98. package/dist/MobileNav/MobileNav.js +9 -25
  99. package/dist/Outline/useOutlineFromDOM.d.ts.map +1 -1
  100. package/dist/Outline/useOutlineFromDOM.js +3 -0
  101. package/dist/Outline/useScrollSpy.d.ts.map +1 -1
  102. package/dist/Outline/useScrollSpy.js +3 -0
  103. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  104. package/dist/OverflowList/OverflowList.js +3 -0
  105. package/dist/Popover/Popover.d.ts.map +1 -1
  106. package/dist/Popover/Popover.js +6 -0
  107. package/dist/PowerSearch/PowerSearch.d.ts +43 -4
  108. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  109. package/dist/PowerSearch/PowerSearch.js +445 -134
  110. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts +102 -0
  111. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -0
  112. package/dist/PowerSearch/PowerSearchBottomSheet.js +1919 -0
  113. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +35 -2
  114. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  115. package/dist/PowerSearch/PowerSearchEditPopover.js +25 -6
  116. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  117. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts.map +1 -1
  118. package/dist/PowerSearch/PowerSearchFilterEditor.js +4 -2
  119. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  120. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  121. package/dist/PowerSearch/PowerSearchToken.js +7 -2
  122. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +38 -3
  123. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  124. package/dist/PowerSearch/PowerSearchValueEditor.js +193 -83
  125. package/dist/PowerSearch/formatFilterValue.d.ts +18 -6
  126. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  127. package/dist/PowerSearch/formatFilterValue.js +33 -12
  128. package/dist/PowerSearch/formatTokenValue.d.ts +28 -0
  129. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -0
  130. package/dist/PowerSearch/formatTokenValue.js +162 -0
  131. package/dist/PowerSearch/powerSearchDateZone.d.ts +21 -0
  132. package/dist/PowerSearch/powerSearchDateZone.d.ts.map +1 -0
  133. package/dist/PowerSearch/powerSearchDateZone.js +37 -0
  134. package/dist/PowerSearch/powerSearchSheetUtils.d.ts +65 -0
  135. package/dist/PowerSearch/powerSearchSheetUtils.d.ts.map +1 -0
  136. package/dist/PowerSearch/powerSearchSheetUtils.js +168 -0
  137. package/dist/PowerSearch/types.d.ts +2 -0
  138. package/dist/PowerSearch/types.d.ts.map +1 -1
  139. package/dist/ProgressBar/ProgressBarTouch.d.ts.map +1 -1
  140. package/dist/ProgressBar/ProgressBarTouch.js +2 -0
  141. package/dist/RadioList/RadioList.d.ts.map +1 -1
  142. package/dist/RadioList/RadioList.js +3 -2
  143. package/dist/RadioList/RadioListItem.d.ts +1 -1
  144. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  145. package/dist/RadioList/RadioListItem.js +5 -3
  146. package/dist/Resizable/ResizeHandle.d.ts +2 -1
  147. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  148. package/dist/Resizable/ResizeHandle.js +101 -77
  149. package/dist/Resizable/createResizable.d.ts +145 -0
  150. package/dist/Resizable/createResizable.d.ts.map +1 -0
  151. package/dist/Resizable/createResizable.js +575 -0
  152. package/dist/Resizable/useResizable.d.ts +3 -3
  153. package/dist/Resizable/useResizable.d.ts.map +1 -1
  154. package/dist/Resizable/useResizable.js +252 -459
  155. package/dist/SegmentedControl/useSegmentedSelectionMotion.d.ts.map +1 -1
  156. package/dist/SegmentedControl/useSegmentedSelectionMotion.js +3 -3
  157. package/dist/SelectableCard/SelectableCard.d.ts +2 -0
  158. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  159. package/dist/SelectableCard/SelectableCard.js +36 -11
  160. package/dist/SelectableCard/selectableCardInput.d.ts +12 -0
  161. package/dist/SelectableCard/selectableCardInput.d.ts.map +1 -0
  162. package/dist/SelectableCard/selectableCardInput.js +20 -0
  163. package/dist/Selector/Selector.d.ts.map +1 -1
  164. package/dist/Selector/Selector.js +5 -8
  165. package/dist/Slider/sliderTouchController.js +2 -2
  166. package/dist/Spinner/Spinner.d.ts +1 -1
  167. package/dist/Spinner/Spinner.d.ts.map +1 -1
  168. package/dist/Spinner/Spinner.js +60 -58
  169. package/dist/Switch/Switch.d.ts.map +1 -1
  170. package/dist/Switch/Switch.js +4 -10
  171. package/dist/Switch/useSwitchTouch.js +4 -4
  172. package/dist/Table/BaseTable.d.ts.map +1 -1
  173. package/dist/Table/BaseTable.js +29 -8
  174. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  175. package/dist/Table/plugins/columnResize/useTableColumnResize.js +3 -1
  176. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  177. package/dist/Table/plugins/filtering/useTableFiltering.js +2 -1
  178. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  179. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +4 -0
  180. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  181. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +2 -0
  182. package/dist/TextInput/TextInput.d.ts +2 -2
  183. package/dist/TextInput/TextInput.d.ts.map +1 -1
  184. package/dist/TextInput/TextInput.js +10 -7
  185. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  186. package/dist/TimeInput/TimeInput.js +2 -0
  187. package/dist/Timer/Timer.d.ts.map +1 -1
  188. package/dist/Timer/Timer.js +2 -0
  189. package/dist/Timestamp/Timestamp.js +1 -1
  190. package/dist/Toast/Toast.d.ts +11 -1
  191. package/dist/Toast/Toast.d.ts.map +1 -1
  192. package/dist/Toast/Toast.js +25 -15
  193. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  194. package/dist/Toast/ToastViewport.js +97 -34
  195. package/dist/Toast/types.d.ts +9 -3
  196. package/dist/Toast/types.d.ts.map +1 -1
  197. package/dist/Toast/useToast.d.ts.map +1 -1
  198. package/dist/Toast/useToast.js +1 -0
  199. package/dist/Tokenizer/Tokenizer.d.ts +49 -37
  200. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  201. package/dist/Tokenizer/Tokenizer.js +22 -19
  202. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +1 -1
  203. package/dist/Tokenizer/TokenizerBottomSheet.js +1 -1
  204. package/dist/Tokenizer/index.d.ts +1 -1
  205. package/dist/Tokenizer/index.d.ts.map +1 -1
  206. package/dist/Tooltip/useTooltip.d.ts +19 -1
  207. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  208. package/dist/Tooltip/useTooltip.js +34 -53
  209. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  210. package/dist/Typeahead/BaseTypeahead.js +27 -18
  211. package/dist/Typeahead/TypeaheadItem.d.ts +2 -1
  212. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  213. package/dist/animator/createAnimator.d.ts +98 -0
  214. package/dist/animator/createAnimator.d.ts.map +1 -0
  215. package/dist/animator/createAnimator.js +259 -0
  216. package/dist/astryx.css +36 -6
  217. package/dist/gestures/PressTracker.d.ts.map +1 -1
  218. package/dist/gestures/PressTracker.js +4 -3
  219. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -1
  220. package/dist/hooks/ModalAnnounceProvider.js +1 -0
  221. package/dist/hooks/actionGroupTracker.d.ts +4 -1
  222. package/dist/hooks/actionGroupTracker.d.ts.map +1 -1
  223. package/dist/hooks/actionGroupTracker.js +13 -3
  224. package/dist/hooks/index.d.ts +1 -0
  225. package/dist/hooks/index.d.ts.map +1 -1
  226. package/dist/hooks/index.js +1 -0
  227. package/dist/hooks/longPressDetector.d.ts +66 -0
  228. package/dist/hooks/longPressDetector.d.ts.map +1 -0
  229. package/dist/hooks/longPressDetector.js +200 -0
  230. package/dist/hooks/pressGroupContext.d.ts +6 -0
  231. package/dist/hooks/pressGroupContext.d.ts.map +1 -0
  232. package/dist/hooks/pressGroupContext.js +20 -0
  233. package/dist/hooks/rootScrollStyles.d.ts +48 -0
  234. package/dist/hooks/rootScrollStyles.d.ts.map +1 -0
  235. package/dist/hooks/rootScrollStyles.js +207 -0
  236. package/dist/hooks/scrollLockTouchGuard.d.ts +13 -0
  237. package/dist/hooks/scrollLockTouchGuard.d.ts.map +1 -0
  238. package/dist/hooks/scrollLockTouchGuard.js +134 -0
  239. package/dist/hooks/scrollbarGutter.d.ts +4 -4
  240. package/dist/hooks/scrollbarGutter.d.ts.map +1 -1
  241. package/dist/hooks/scrollbarGutter.js +36 -23
  242. package/dist/hooks/useActionGroupTracking.d.ts +53 -0
  243. package/dist/hooks/useActionGroupTracking.d.ts.map +1 -0
  244. package/dist/hooks/useActionGroupTracking.js +174 -0
  245. package/dist/hooks/useAnimator.d.ts +41 -0
  246. package/dist/hooks/useAnimator.d.ts.map +1 -0
  247. package/dist/hooks/useAnimator.js +70 -0
  248. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  249. package/dist/hooks/useAnnounceRenderedText.js +1 -0
  250. package/dist/hooks/useAttachment.d.ts +1 -1
  251. package/dist/hooks/useAttachment.js +1 -1
  252. package/dist/hooks/useAutoMediaMode.d.ts.map +1 -1
  253. package/dist/hooks/useAutoMediaMode.js +1 -0
  254. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  255. package/dist/hooks/useBusyAnnouncement.js +2 -0
  256. package/dist/hooks/useDevWarning.d.ts.map +1 -1
  257. package/dist/hooks/useDevWarning.js +2 -0
  258. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  259. package/dist/hooks/useFocusTrap.js +2 -0
  260. package/dist/hooks/useGridFocus.d.ts +8 -5
  261. package/dist/hooks/useGridFocus.d.ts.map +1 -1
  262. package/dist/hooks/useGridFocus.js +4 -3
  263. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  264. package/dist/hooks/useHotkeys.js +3 -0
  265. package/dist/hooks/useImageMode.d.ts.map +1 -1
  266. package/dist/hooks/useImageMode.js +3 -0
  267. package/dist/hooks/useInputStatusIcon.d.ts +1 -1
  268. package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
  269. package/dist/hooks/useInputStatusIcon.js +2 -2
  270. package/dist/hooks/useKeyboardHint.js +1 -1
  271. package/dist/hooks/useLongPress.d.ts +8 -9
  272. package/dist/hooks/useLongPress.d.ts.map +1 -1
  273. package/dist/hooks/useLongPress.js +23 -106
  274. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  275. package/dist/hooks/useMenuHover.js +2 -0
  276. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  277. package/dist/hooks/useMenuPress.js +3 -0
  278. package/dist/hooks/useOverflow.d.ts.map +1 -1
  279. package/dist/hooks/useOverflow.js +2 -1
  280. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  281. package/dist/hooks/usePressFeedback.js +1 -0
  282. package/dist/hooks/useResolvedRequired.d.ts +3 -0
  283. package/dist/hooks/useResolvedRequired.d.ts.map +1 -1
  284. package/dist/hooks/useResolvedRequired.js +3 -0
  285. package/dist/hooks/useScrollLock.d.ts +7 -9
  286. package/dist/hooks/useScrollLock.d.ts.map +1 -1
  287. package/dist/hooks/useScrollLock.js +55 -48
  288. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  289. package/dist/hooks/useScrollableArea.js +5 -0
  290. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  291. package/dist/hooks/useStreamingText.js +3 -0
  292. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts +8 -0
  293. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.d.ts.map +1 -0
  294. package/dist/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.js +42 -0
  295. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.d.ts.map +1 -1
  296. package/dist/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.js +6 -0
  297. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts +8 -0
  298. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.d.ts.map +1 -0
  299. package/dist/i18n/generated-english/PowerSearch/formatTokenValue.generated.js +14 -0
  300. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  301. package/dist/i18n/generated-locales/en.generated.js +30 -0
  302. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/pseudo.generated.js +30 -0
  304. package/dist/index.d.ts +1 -0
  305. package/dist/index.d.ts.map +1 -1
  306. package/dist/index.js +4 -0
  307. package/dist/internal/indicatorPress.stylex.d.ts +20 -0
  308. package/dist/internal/indicatorPress.stylex.d.ts.map +1 -0
  309. package/dist/internal/indicatorPress.stylex.js +26 -0
  310. package/dist/internal/selectable-card.d.ts +21 -0
  311. package/dist/internal/selectable-card.d.ts.map +1 -0
  312. package/dist/internal/selectable-card.js +20 -0
  313. package/dist/internal/sheetDraft.d.ts +2 -2
  314. package/dist/internal/sheetDraft.js +2 -2
  315. package/dist/motion/animatedLayout.d.ts.map +1 -1
  316. package/dist/motion/animatedLayout.js +7 -7
  317. package/dist/motion/animator.d.ts +14 -14
  318. package/dist/motion/animator.d.ts.map +1 -1
  319. package/dist/motion/animator.js +45 -20
  320. package/dist/motion/progress.d.ts +88 -0
  321. package/dist/motion/progress.d.ts.map +1 -0
  322. package/dist/motion/progress.js +128 -0
  323. package/dist/motion/reducedMotion.d.ts.map +1 -1
  324. package/dist/motion/reducedMotion.js +3 -1
  325. package/dist/motion/uikit/alert.d.ts +41 -0
  326. package/dist/motion/uikit/alert.d.ts.map +1 -0
  327. package/dist/motion/uikit/alert.js +43 -0
  328. package/dist/privateAttributes/pressGroupItem.stylex.d.ts +22 -0
  329. package/dist/privateAttributes/pressGroupItem.stylex.d.ts.map +1 -0
  330. package/dist/privateAttributes/pressGroupItem.stylex.js +36 -0
  331. package/dist/privateAttributes/reducedMotion.stylex.d.ts +23 -0
  332. package/dist/privateAttributes/reducedMotion.stylex.d.ts.map +1 -0
  333. package/dist/privateAttributes/reducedMotion.stylex.js +40 -0
  334. package/dist/theme/Theme.d.ts.map +1 -1
  335. package/dist/theme/Theme.js +29 -4
  336. package/dist/theme/motionKnobs.d.ts +4 -3
  337. package/dist/theme/motionKnobs.d.ts.map +1 -1
  338. package/dist/theme/motionKnobs.js +3 -2
  339. package/dist/theme/themeMotion.d.ts +6 -0
  340. package/dist/theme/themeMotion.d.ts.map +1 -1
  341. package/dist/theme/themeMotion.js +7 -0
  342. package/dist/utils/dateParser.d.ts.map +1 -1
  343. package/dist/utils/dateParser.js +12 -0
  344. package/dist/utils/focusReturn.d.ts +15 -0
  345. package/dist/utils/focusReturn.d.ts.map +1 -1
  346. package/dist/utils/focusReturn.js +28 -0
  347. package/dist/utils/interactionModality.d.ts.map +1 -1
  348. package/dist/utils/interactionModality.js +4 -0
  349. package/dist/utils/interactionOverlay.stylex.d.ts +3 -2
  350. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  351. package/dist/utils/interactionOverlay.stylex.js +3 -2
  352. package/dist/utils/plainDate.d.ts +8 -0
  353. package/dist/utils/plainDate.d.ts.map +1 -1
  354. package/dist/utils/plainDate.js +19 -0
  355. package/dist/utils/pressFeedback.d.ts.map +1 -1
  356. package/dist/utils/pressFeedback.js +20 -6
  357. package/dist/utils/triggerFocus.d.ts +36 -0
  358. package/dist/utils/triggerFocus.d.ts.map +1 -0
  359. package/dist/utils/triggerFocus.js +65 -0
  360. package/locales/en.json +120 -0
  361. package/locales/pseudo.json +90 -0
  362. package/package.json +14 -9
  363. package/src/AlertDialog/AlertDialog.doc.mjs +2 -2
  364. package/src/AlertDialog/AlertDialog.tsx +46 -5
  365. package/src/AppShell/AppShell.tsx +4 -0
  366. package/src/BottomSheet/BottomSheet.tsx +1 -0
  367. package/src/BottomSheet/BottomSheetPanel.tsx +39 -3
  368. package/src/BottomSheet/BottomSheetSwitcher.tsx +5 -0
  369. package/src/BottomSheet/useMobileKeyboard.ts +4 -0
  370. package/src/BottomSheet/useSheetGestures.ts +10 -1
  371. package/src/Button/Button.tsx +26 -4
  372. package/src/Calendar/Calendar.tsx +36 -25
  373. package/src/Carousel/Carousel.tsx +1 -0
  374. package/src/Chat/ChatComposerInput.tsx +2 -0
  375. package/src/Chat/ChatMessageList.tsx +2 -1
  376. package/src/Chat/useChatDictation.ts +1 -0
  377. package/src/Chat/useChatNewMessages.ts +1 -1
  378. package/src/Chat/useChatStreamScroll.ts +2 -0
  379. package/src/Chat/useSpeechRecognition.ts +2 -0
  380. package/src/Chat/useTriggerMenu.tsx +1 -1
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -0
  382. package/src/CheckboxInput/CheckboxInput.tsx +38 -15
  383. package/src/CodeBlock/CodeBlock.doc.mjs +9 -1
  384. package/src/CodeBlock/CodeBlock.tsx +41 -4
  385. package/src/CommandPalette/CommandPalette.tsx +1 -0
  386. package/src/CommandPalette/CommandPaletteItem.tsx +1 -0
  387. package/src/ComplexSelector/ComplexSelector.tsx +20 -5
  388. package/src/ContextMenu/ContextMenu.tsx +2 -2
  389. package/src/DateInput/MonthScroller.tsx +8 -2
  390. package/src/DateInput/TouchDateField.tsx +1 -0
  391. package/src/DateInput/Wheel.tsx +4 -0
  392. package/src/DateInput/useOwnScrollGesture.ts +2 -0
  393. package/src/DateInput/usePointerDragScroll.ts +1 -0
  394. package/src/DateInput/useScrollSettle.ts +2 -0
  395. package/src/Dialog/Dialog.tsx +12 -32
  396. package/src/Drawer/useDrawerDialogPresence.ts +2 -0
  397. package/src/DropdownMenu/useMenuOverflow.ts +3 -0
  398. package/src/Field/Field.tsx +2 -2
  399. package/src/FieldStatus/useFieldStatusAnnouncement.ts +1 -0
  400. package/src/FormLayout/FormLayout.doc.mjs +181 -46
  401. package/src/FormLayout/FormLayout.tsx +5 -1
  402. package/src/HoverCard/HoverCard.doc.mjs +10 -8
  403. package/src/HoverCard/HoverCard.tsx +58 -6
  404. package/src/HoverCard/useHoverCard.doc.mjs +178 -36
  405. package/src/HoverCard/useHoverCard.tsx +49 -54
  406. package/src/Icon/Icon.doc.mjs +49 -8
  407. package/src/Icon/Icon.tsx +15 -7
  408. package/src/IconButton/IconButton.doc.mjs +141 -21
  409. package/src/Item/useSwipeAction.ts +2 -0
  410. package/src/Layer/modalOutlet.ts +2 -0
  411. package/src/Layer/outsidePress.ts +1 -0
  412. package/src/Layer/useLayer.tsx +2 -0
  413. package/src/Layer/useLayerDismissal.ts +2 -0
  414. package/src/Layer/usePressPin.ts +81 -15
  415. package/src/Layer/useTouchTrigger.ts +2 -0
  416. package/src/Lightbox/Lightbox.tsx +19 -0
  417. package/src/MobileNav/MobileNav.tsx +9 -30
  418. package/src/Outline/useOutlineFromDOM.ts +2 -0
  419. package/src/Outline/useScrollSpy.ts +2 -0
  420. package/src/OverflowList/OverflowList.tsx +2 -0
  421. package/src/Popover/Popover.tsx +4 -0
  422. package/src/PowerSearch/PowerSearch.doc.mjs +60 -8
  423. package/src/PowerSearch/PowerSearch.tsx +627 -157
  424. package/src/PowerSearch/PowerSearchBottomSheet.tsx +2525 -0
  425. package/src/PowerSearch/PowerSearchEditPopover.tsx +39 -6
  426. package/src/PowerSearch/PowerSearchFilterEditor.tsx +2 -0
  427. package/src/PowerSearch/PowerSearchToken.tsx +7 -0
  428. package/src/PowerSearch/PowerSearchValueEditor.tsx +244 -58
  429. package/src/PowerSearch/formatFilterValue.ts +55 -17
  430. package/src/PowerSearch/formatTokenValue.ts +222 -0
  431. package/src/PowerSearch/powerSearchDateZone.ts +64 -0
  432. package/src/PowerSearch/powerSearchSheetUtils.ts +224 -0
  433. package/src/PowerSearch/types.ts +2 -0
  434. package/src/ProgressBar/ProgressBarTouch.ts +2 -0
  435. package/src/RadioList/RadioList.tsx +3 -2
  436. package/src/RadioList/RadioListItem.tsx +5 -3
  437. package/src/Resizable/Resizable.doc.mjs +5 -4
  438. package/src/Resizable/ResizeHandle.tsx +169 -109
  439. package/src/Resizable/createResizable.ts +831 -0
  440. package/src/Resizable/useResizable.ts +292 -623
  441. package/src/SegmentedControl/useSegmentedSelectionMotion.ts +6 -3
  442. package/src/SelectableCard/SelectableCard.tsx +39 -10
  443. package/src/SelectableCard/selectableCardInput.ts +30 -0
  444. package/src/Selector/Selector.tsx +5 -12
  445. package/src/Slider/sliderTouchController.ts +2 -2
  446. package/src/Spinner/Spinner.tsx +77 -63
  447. package/src/Switch/Switch.tsx +2 -6
  448. package/src/Switch/useSwitchTouch.ts +4 -4
  449. package/src/Table/BaseTable.tsx +46 -12
  450. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +2 -1
  451. package/src/Table/plugins/filtering/useTableFiltering.tsx +1 -0
  452. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +4 -0
  453. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +2 -0
  454. package/src/TextInput/TextInput.tsx +11 -10
  455. package/src/TimeInput/TimeInput.tsx +2 -0
  456. package/src/Timer/Timer.tsx +1 -0
  457. package/src/Timestamp/Timestamp.tsx +1 -1
  458. package/src/Toast/Toast.doc.mjs +4 -3
  459. package/src/Toast/Toast.tsx +52 -32
  460. package/src/Toast/ToastViewport.tsx +123 -35
  461. package/src/Toast/types.ts +9 -3
  462. package/src/Toast/useToast.tsx +1 -0
  463. package/src/Tokenizer/Tokenizer.doc.mjs +19 -3
  464. package/src/Tokenizer/Tokenizer.tsx +73 -51
  465. package/src/Tokenizer/TokenizerBottomSheet.tsx +1 -1
  466. package/src/Tokenizer/index.ts +1 -0
  467. package/src/Tooltip/useTooltip.doc.mjs +24 -0
  468. package/src/Tooltip/useTooltip.tsx +61 -56
  469. package/src/Typeahead/BaseTypeahead.tsx +27 -17
  470. package/src/Typeahead/TypeaheadItem.doc.mjs +6 -3
  471. package/src/Typeahead/TypeaheadItem.tsx +2 -1
  472. package/src/animator/createAnimator.doc.mjs +153 -0
  473. package/src/animator/createAnimator.ts +324 -0
  474. package/src/gestures/PressTracker.ts +4 -3
  475. package/src/gestures/README.md +10 -4
  476. package/src/hooks/ModalAnnounceProvider.tsx +1 -0
  477. package/src/hooks/actionGroupTracker.ts +20 -5
  478. package/src/hooks/index.ts +2 -0
  479. package/src/hooks/longPressDetector.ts +273 -0
  480. package/src/hooks/pressGroupContext.ts +21 -0
  481. package/src/hooks/rootScrollStyles.ts +247 -0
  482. package/src/hooks/scrollLockTouchGuard.ts +182 -0
  483. package/src/hooks/scrollbarGutter.ts +41 -26
  484. package/src/hooks/useActionGroupTracking.ts +224 -0
  485. package/src/hooks/useAnimator.doc.mjs +109 -0
  486. package/src/hooks/useAnimator.ts +67 -0
  487. package/src/hooks/useAnnounceRenderedText.ts +1 -0
  488. package/src/hooks/useAttachment.ts +1 -1
  489. package/src/hooks/useAutoMediaMode.ts +1 -0
  490. package/src/hooks/useBusyAnnouncement.ts +2 -0
  491. package/src/hooks/useDevWarning.ts +2 -0
  492. package/src/hooks/useFocusTrap.ts +2 -0
  493. package/src/hooks/useGridFocus.doc.mjs +6 -6
  494. package/src/hooks/useGridFocus.ts +10 -7
  495. package/src/hooks/useHotkeys.ts +2 -0
  496. package/src/hooks/useImageMode.ts +2 -0
  497. package/src/hooks/useInputStatusIcon.tsx +3 -2
  498. package/src/hooks/useKeyboardHint.tsx +1 -1
  499. package/src/hooks/useLongPress.doc.mjs +2 -2
  500. package/src/hooks/useLongPress.ts +32 -122
  501. package/src/hooks/useMenuHover.ts +1 -0
  502. package/src/hooks/useMenuPress.ts +2 -0
  503. package/src/hooks/useOverflow.ts +2 -1
  504. package/src/hooks/usePressFeedback.ts +1 -0
  505. package/src/hooks/useResolvedRequired.ts +3 -0
  506. package/src/hooks/useScrollLock.doc.mjs +51 -12
  507. package/src/hooks/useScrollLock.ts +57 -60
  508. package/src/hooks/useScrollableArea.ts +4 -0
  509. package/src/hooks/useStreamingText.ts +2 -0
  510. package/src/i18n/generated-english/PowerSearch/PowerSearchBottomSheet.generated.ts +43 -0
  511. package/src/i18n/generated-english/PowerSearch/PowerSearchValueEditor.generated.ts +6 -0
  512. package/src/i18n/generated-english/PowerSearch/formatTokenValue.generated.ts +15 -0
  513. package/src/i18n/generated-locales/en.generated.ts +41 -0
  514. package/src/i18n/generated-locales/pseudo.generated.ts +42 -0
  515. package/src/index.ts +13 -0
  516. package/src/internal/indicatorPress.stylex.ts +24 -0
  517. package/src/internal/selectable-card.ts +21 -0
  518. package/src/internal/sheetDraft.ts +2 -2
  519. package/src/motion/README.md +9 -5
  520. package/src/motion/animatedLayout.ts +10 -5
  521. package/src/motion/animator.ts +66 -31
  522. package/src/motion/progress.ts +155 -0
  523. package/src/motion/reducedMotion.ts +3 -1
  524. package/src/motion/uikit/alert.ts +43 -0
  525. package/src/privateAttributes/pressGroupItem.stylex.ts +44 -0
  526. package/src/privateAttributes/reducedMotion.stylex.ts +45 -0
  527. package/src/theme/Theme.tsx +37 -3
  528. package/src/theme/motionKnobs.ts +4 -3
  529. package/src/theme/themeMotion.ts +7 -0
  530. package/src/utils/dateParser.ts +16 -0
  531. package/src/utils/focusReturn.ts +30 -0
  532. package/src/utils/interactionModality.ts +4 -0
  533. package/src/utils/interactionOverlay.stylex.ts +3 -2
  534. package/src/utils/plainDate.ts +21 -0
  535. package/src/utils/pressFeedback.ts +24 -6
  536. package/src/utils/triggerFocus.ts +80 -0
  537. package/dist/internal/touch-sheet.d.ts +0 -21
  538. package/dist/internal/touch-sheet.d.ts.map +0 -1
  539. package/dist/internal/touch-sheet.js +0 -19
  540. package/src/internal/touch-sheet.ts +0 -21
@@ -71,15 +71,16 @@ export const docs = {
71
71
  props: [
72
72
  {
73
73
  name: 'icon',
74
- type: 'IconName | ComponentType<SVGProps>',
74
+ type: 'IconName | NamespacedIconName | ComponentType<SVGProps>',
75
75
  description:
76
- 'Semantic icon name or SVG component. Valid semantic names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. For any icon not in this list, pass an SVG component directly (e.g. import from lucide-react or @heroicons/react). Note: this prop is called `icon`, not `name`.',
76
+ 'Semantic icon name or SVG component. Valid semantic names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. A namespaced key such as `richtext:bold` names a glyph that one component or library registers, and a theme can replace it by key; a namespaced key that nothing registers renders nothing. For any icon not in this list, pass an SVG component directly (e.g. import from lucide-react or @heroicons/react). Note: this prop is called `icon`, not `name`.',
77
77
  required: true,
78
78
  },
79
79
  {
80
80
  name: 'color',
81
81
  type: "'primary' | 'secondary' | 'tertiary' | 'disabled' | 'accent' | 'info' | 'success' | 'error' | 'warning' | 'inherit'",
82
- description: 'Color variant mapped to Astryx icon color tokens.',
82
+ description:
83
+ 'Color variant mapped to Astryx icon color tokens. Semantic values (primary through warning) follow the role, and inherit uses the surrounding text color. On the web, Icon also accepts the palette values blue, red, green, gray, cyan, teal, yellow, orange, pink, and purple, which pick a non-semantic hue.',
83
84
  default: "'inherit'",
84
85
  },
85
86
  {
@@ -107,6 +108,24 @@ export const docs = {
107
108
  description:
108
109
  "StyleX styles for customization (color, size, opacity). Folded into the icon's own stylex.props() call so it composes with the base color/size styles. Must be a stylex.create() value, not an inline style object like style={{}}.",
109
110
  },
111
+ {
112
+ name: 'className',
113
+ type: 'string',
114
+ description:
115
+ 'Class name added to the rendered glyph, beside the astryx-icon target class.',
116
+ },
117
+ {
118
+ name: 'style',
119
+ type: 'CSSProperties',
120
+ description:
121
+ "Inline styles merged onto the rendered glyph after Icon's own size and color styles.",
122
+ },
123
+ {
124
+ name: 'ref',
125
+ type: 'Ref<SVGSVGElement>',
126
+ description:
127
+ 'Ref to the rendered SVG element when icon is an icon component. A semantic or namespaced name renders inside an internal wrapper, and the ref is not attached.',
128
+ },
110
129
  ],
111
130
  theming: {
112
131
  targets: [{className: 'astryx-icon', visualProps: ['color', 'size']}],
@@ -207,15 +226,16 @@ export const docsZh = {
207
226
  props: [
208
227
  {
209
228
  name: 'icon',
210
- type: 'IconName | ComponentType<SVGProps>',
229
+ type: 'IconName | NamespacedIconName | ComponentType<SVGProps>',
211
230
  description:
212
- '语义图标名称或 SVG 组件。有效语义名称:close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone。列表之外的图标请直接传入 SVG 组件。',
231
+ '语义图标名称或 SVG 组件。有效语义名称:close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone。命名空间键(如 `richtext:bold`)指向某个组件或库注册的图标,主题可以按键替换它;没有注册的命名空间键不渲染任何内容。列表之外的图标请直接传入 SVG 组件。',
213
232
  required: true,
214
233
  },
215
234
  {
216
235
  name: 'color',
217
236
  type: "'primary' | 'secondary' | 'tertiary' | 'disabled' | 'accent' | 'info' | 'success' | 'error' | 'warning' | 'inherit'",
218
- description: '映射到 Astryx 图标颜色令牌的颜色变体。',
237
+ description:
238
+ '映射到 Astryx 图标颜色令牌的颜色变体。语义值(primary 到 warning)跟随角色,inherit 使用周围文字的颜色。在 Web 上,Icon 还接受调色板值 blue、red、green、gray、cyan、teal、yellow、orange、pink 和 purple,它们选择非语义色相。',
219
239
  default: "'inherit'",
220
240
  },
221
241
  {
@@ -243,6 +263,23 @@ export const docsZh = {
243
263
  description:
244
264
  '用于自定义的 StyleX 样式(颜色、尺寸、不透明度)。会并入图标自身的 stylex.props() 调用,从而与基础的颜色/尺寸样式组合。必须是 stylex.create() 的值,而不是像 style={{}} 这样的内联样式对象。',
245
265
  },
266
+ {
267
+ name: 'className',
268
+ type: 'string',
269
+ description: '添加到渲染图标上的类名,与 astryx-icon 目标类名并列。',
270
+ },
271
+ {
272
+ name: 'style',
273
+ type: 'CSSProperties',
274
+ description:
275
+ '合并到渲染图标上的内联样式,位于 Icon 自身的尺寸和颜色样式之后。',
276
+ },
277
+ {
278
+ name: 'ref',
279
+ type: 'Ref<SVGSVGElement>',
280
+ description:
281
+ 'icon 为图标组件时,指向渲染的 SVG 元素的 ref。语义名称或命名空间名称在内部包装元素中渲染,不会附加 ref。',
282
+ },
246
283
  ],
247
284
  theming: {
248
285
  targets: [{className: 'astryx-icon', visualProps: ['color', 'size']}],
@@ -390,8 +427,9 @@ export const docsDense = {
390
427
  ],
391
428
  },
392
429
  propDescriptions: {
393
- icon: 'Semantic icon name or SVG component. Valid names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. For others, pass an SVG component.',
394
- color: 'Color variant mapped to Astryx icon color tokens.',
430
+ icon: 'Semantic icon name or SVG component. Valid names: close, chevronDown, chevronLeft, chevronRight, chevronsLeft, chevronsRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, upload, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone. A namespaced key (`richtext:bold`) names a glyph a component or library registers; an unregistered one renders nothing. For others, pass an SVG component.',
431
+ color:
432
+ 'Color variant mapped to Astryx icon color tokens; inherit = surrounding text color. Web also accepts the non-semantic palette: blue, red, green, gray, cyan, teal, yellow, orange, pink, purple.',
395
433
  size: "xsm/sm/md/lg = 12/16/20/24px at a 16px root, scale w/ root font size; theme sets a size's glyph dimension via width + height (px or rem) on components.icon['size:sm'] etc. Explicit Icon size; otherwise nearest owning-component default, then 'md' when no contextual default exists",
396
434
  variant:
397
435
  "Requests the active theme's alternate artwork (e.g. 'filled'); names from augmentable IconVariantMap. Reaches the entry only if the active theme's iconVariants lists it (and an inherited entry's defining theme does too); else normal artwork. Ignored by a directly passed component; never in the DOM; no theming selector.",
@@ -399,5 +437,8 @@ export const docsDense = {
399
437
  'Accessible name for a meaningful, standalone icon. Sets role="img" + aria-label and drops the default aria-hidden. Omit (default) for decorative icons (stays aria-hidden). Empty string = decorative. The accessible-name/alt-text prop for icons.',
400
438
  xstyle:
401
439
  'StyleX styles (color, size, opacity) via stylex.create(); composes with the base color/size styles.',
440
+ className: 'Class added to the rendered glyph beside astryx-icon.',
441
+ style: "Inline styles merged after Icon's size and color styles.",
442
+ ref: 'Reaches the SVG only when icon is a component; a semantic or namespaced name renders in a wrapper and gets no ref.',
402
443
  },
403
444
  };
package/src/Icon/Icon.tsx CHANGED
@@ -176,7 +176,11 @@ export interface IconProps extends Omit<
176
176
  SVGProps<SVGSVGElement>,
177
177
  'ref' | 'color'
178
178
  > {
179
- /** Ref forwarded to the root element */
179
+ /**
180
+ * Ref to the rendered SVG element when `icon` is an icon component. A
181
+ * semantic or namespaced name renders inside an internal wrapper, and the
182
+ * ref is not attached.
183
+ */
180
184
  ref?: React.Ref<SVGSVGElement>;
181
185
  /**
182
186
  * Icon to render. Can be:
@@ -267,22 +271,26 @@ export interface IconProps extends Omit<
267
271
  xstyle?: StyleXStyles;
268
272
  }
269
273
 
274
+ type IconA11yProps =
275
+ | {role: 'img'; 'aria-label': string; 'aria-hidden': undefined}
276
+ | {'aria-hidden': 'true'};
277
+
270
278
  /**
271
279
  * Derives the ARIA attributes for an icon from its `label` prop.
272
280
  *
273
281
  * - Non-empty `label` → meaningful image: `role="img"` + `aria-label`, and no
274
282
  * `aria-hidden` (an `aria-hidden` element is removed from the accessibility
275
- * tree, so its accessible name would be ignored).
283
+ * tree, so its accessible name would be ignored). Icon passes
284
+ * `aria-hidden: undefined`. Many icon components, such as Heroicons, write
285
+ * `aria-hidden="true"` unless a prop replaces it.
276
286
  * - Omitted or empty `label` → decorative default: `aria-hidden="true"`.
277
287
  *
278
288
  * The result is spread BEFORE `{...props}` in both render modes so an explicit
279
289
  * `aria-hidden` / `role` / `aria-label` from the consumer always wins.
280
290
  */
281
- function getIconA11yProps(
282
- label: string | undefined,
283
- ): {role: 'img'; 'aria-label': string} | {'aria-hidden': 'true'} {
291
+ function getIconA11yProps(label: string | undefined): IconA11yProps {
284
292
  return label != null && label !== ''
285
- ? {role: 'img', 'aria-label': label}
293
+ ? {role: 'img', 'aria-label': label, 'aria-hidden': undefined}
286
294
  : {'aria-hidden': 'true'};
287
295
  }
288
296
 
@@ -392,7 +400,7 @@ function IconFromRegistry({
392
400
  color: IconColor;
393
401
  size: IconSize;
394
402
  variant: IconVariant | undefined;
395
- a11yProps: {role: 'img'; 'aria-label': string} | {'aria-hidden': 'true'};
403
+ a11yProps: IconA11yProps;
396
404
  className?: string;
397
405
  style?: React.CSSProperties;
398
406
  xstyle?: StyleXStyles;
@@ -20,7 +20,8 @@ export const docs = {
20
20
  {
21
21
  name: 'icon',
22
22
  type: 'ReactNode',
23
- description: 'Icon element rendered inside the button. An Astryx Icon with no explicit size defaults to sm for sm/md buttons and md for lg buttons.',
23
+ description:
24
+ 'Icon element rendered inside the button. An Astryx Icon with no explicit size defaults to sm for sm/md buttons and md for lg buttons.',
24
25
  required: true,
25
26
  slotElements: [{__element: 'Icon', props: {icon: 'check'}}],
26
27
  },
@@ -46,19 +47,22 @@ export const docs = {
46
47
  {
47
48
  name: 'isLoading',
48
49
  type: 'boolean',
49
- description: 'Shows a loading spinner and blocks re-activation while staying focusable (aria-busy + aria-disabled, not native disabled).',
50
+ description:
51
+ 'Shows a loading spinner and blocks re-activation while staying focusable (aria-busy + aria-disabled, not native disabled).',
50
52
  default: 'false',
51
53
  },
52
54
  {
53
55
  name: 'isDisabled',
54
56
  type: 'boolean',
55
- description: 'Disables the button.',
57
+ description:
58
+ 'Disables the button. When a tooltip is present, uses aria-disabled instead of native disabled so the button stays focusable.',
56
59
  default: 'false',
57
60
  },
58
61
  {
59
62
  name: 'tooltip',
60
63
  type: 'string',
61
- description: 'Tooltip text shown on hover.',
64
+ description:
65
+ "Tooltip text shown on hover and keyboard focus. It also describes the button, unless it repeats the button's accessible name.",
62
66
  },
63
67
  {
64
68
  name: 'onClick',
@@ -70,10 +74,69 @@ export const docs = {
70
74
  type: '(e: MouseEvent) => void | Promise<void>',
71
75
  description: 'Async click handler with automatic loading state.',
72
76
  },
77
+ {
78
+ name: 'isInterruptible',
79
+ type: 'boolean',
80
+ description:
81
+ 'Keep the button clickable while a clickAction is pending: the spinner and aria-busy still show, but the button is not disabled and the action is not deduped, so a re-click lands and interrupts the in-flight action with a fresh one. Use it for interruptible actions, not fire-once actions (submit, save, pay).',
82
+ default: 'false',
83
+ },
84
+ {
85
+ name: 'width',
86
+ type: 'SizeValue',
87
+ description:
88
+ 'Width of the button. Numbers are treated as pixels, strings are used as-is. Without it the button keeps its icon-only aspect, square by default; with it the button takes that width.',
89
+ },
90
+ {
91
+ name: 'type',
92
+ type: "'button' | 'submit' | 'reset'",
93
+ description: 'HTML button type attribute.',
94
+ default: "'button'",
95
+ },
96
+ {
97
+ name: 'name',
98
+ type: 'string',
99
+ description: 'HTML name attribute for form submission.',
100
+ },
101
+ {
102
+ name: 'value',
103
+ type: 'string | number | readonly string[]',
104
+ description: 'HTML value attribute for form submission.',
105
+ },
106
+ {
107
+ name: 'form',
108
+ type: 'string',
109
+ description: 'Associates the button with a form element by ID.',
110
+ },
111
+ {
112
+ name: 'href',
113
+ type: 'string',
114
+ description:
115
+ 'When provided, renders the button as a link element (<a> or custom link component). A disabled IconButton still renders a <button>.',
116
+ },
117
+ {
118
+ name: 'as',
119
+ type: 'ComponentType',
120
+ description:
121
+ 'Custom link component to use when href is provided (e.g. Next.js Link).',
122
+ },
123
+ {
124
+ name: 'target',
125
+ type: 'string',
126
+ description:
127
+ 'HTML target attribute when rendered as a link (e.g. "_blank").',
128
+ },
129
+ {
130
+ name: 'rel',
131
+ type: 'string',
132
+ description:
133
+ 'HTML rel attribute when rendered as a link (e.g. "noopener noreferrer").',
134
+ },
73
135
  ],
74
136
 
75
137
  usage: {
76
- description: 'A button that shows only an icon with no visible text. Use IconButton in toolbars, table rows, and compact UI where space is tight and the icon is universally understood.',
138
+ description:
139
+ 'A button that shows only an icon with no visible text. Use IconButton in toolbars, table rows, and compact UI where space is tight and the icon is universally understood.',
77
140
  accessibility: [
78
141
  {
79
142
  name: 'Essential icon or spinner arc',
@@ -113,26 +176,68 @@ export const docs = {
113
176
  },
114
177
  ],
115
178
  bestPractices: [
116
- { guidance: true, description: 'Make the aria-label specific: a trash icon labeled "Delete conversation" is clearer than just "Delete" for screen readers.' },
117
- { guidance: true, description: 'Add a tooltip: even a gear icon can mean Settings, Preferences, or Configure.' },
118
- { guidance: true, description: 'Use ghost in toolbars and dense areas to reduce visual clutter.' },
119
- { guidance: false, description: 'Use IconButton if the action isn\'t obvious from the icon alone; use Button with text.' },
120
- { guidance: false, description: 'Skip the tooltip; label only reaches screen readers, sighted users need the hover hint.' },
179
+ {
180
+ guidance: true,
181
+ description:
182
+ 'Make the aria-label specific: a trash icon labeled "Delete conversation" is clearer than just "Delete" for screen readers.',
183
+ },
184
+ {
185
+ guidance: true,
186
+ description:
187
+ 'Add a tooltip: even a gear icon can mean Settings, Preferences, or Configure.',
188
+ },
189
+ {
190
+ guidance: true,
191
+ description:
192
+ 'Use ghost in toolbars and dense areas to reduce visual clutter.',
193
+ },
194
+ {
195
+ guidance: false,
196
+ description:
197
+ "Use IconButton if the action isn't obvious from the icon alone; use Button with text.",
198
+ },
199
+ {
200
+ guidance: false,
201
+ description:
202
+ 'Skip the tooltip; label only reaches screen readers, sighted users need the hover hint.',
203
+ },
121
204
  ],
122
205
  },
123
206
  };
124
207
 
125
208
  /** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
126
209
  export const docsDense = {
127
- description: 'Button showing only an icon, no visible text. Use in toolbars, table rows, compact UI where space is tight + icon universally understood.',
210
+ description:
211
+ 'Button showing only an icon, no visible text. Use in toolbars, table rows, compact UI where space is tight + icon universally understood.',
128
212
  usage: {
129
- description: 'Button showing only an icon, no visible text. Use in toolbars, table rows, compact UI where space is tight + icon universally understood.',
213
+ description:
214
+ 'Button showing only an icon, no visible text. Use in toolbars, table rows, compact UI where space is tight + icon universally understood.',
130
215
  bestPractices: [
131
- { guidance: true, description: 'Make aria-label specific: trash icon labeled "Delete conversation" > just "Delete" for screen readers.' },
132
- { guidance: true, description: 'Add tooltip: even gear icon can mean Settings/Preferences/Configure.' },
133
- { guidance: true, description: 'Use ghost in toolbars + dense areas to reduce visual clutter.' },
134
- { guidance: false, description: "Use IconButton if action isn't obvious from icon alone; use Button w/ text instead." },
135
- { guidance: false, description: 'Skip tooltip: label only reaches screen readers; sighted users need hover hint.' },
216
+ {
217
+ guidance: true,
218
+ description:
219
+ 'Make aria-label specific: trash icon labeled "Delete conversation" > just "Delete" for screen readers.',
220
+ },
221
+ {
222
+ guidance: true,
223
+ description:
224
+ 'Add tooltip: even gear icon can mean Settings/Preferences/Configure.',
225
+ },
226
+ {
227
+ guidance: true,
228
+ description:
229
+ 'Use ghost in toolbars + dense areas to reduce visual clutter.',
230
+ },
231
+ {
232
+ guidance: false,
233
+ description:
234
+ "Use IconButton if action isn't obvious from icon alone; use Button w/ text instead.",
235
+ },
236
+ {
237
+ guidance: false,
238
+ description:
239
+ 'Skip tooltip: label only reaches screen readers; sighted users need hover hint.',
240
+ },
136
241
  ],
137
242
  },
138
243
  propDescriptions: {
@@ -140,11 +245,26 @@ export const docsDense = {
140
245
  icon: 'icon element rendered inside button; unsized Astryx Icon defaults to sm for sm/md buttons and md for lg',
141
246
  variant: 'visual style variant',
142
247
  size: 'size variant',
143
- elevation: 'resting shadow depth: none|low|med|high; raise for a floating action button (FAB)',
144
- isLoading: 'shows loading spinner, blocks re-activation but stays focusable (aria-disabled, not native disabled)',
145
- isDisabled: 'disables button',
146
- tooltip: 'tooltip text shown on hover',
248
+ elevation:
249
+ 'resting shadow depth: none|low|med|high; raise for a floating action button (FAB)',
250
+ isLoading:
251
+ 'shows loading spinner, blocks re-activation but stays focusable (aria-disabled, not native disabled)',
252
+ isDisabled: 'disables button; uses aria-disabled when tooltip present',
253
+ tooltip:
254
+ 'tooltip on hover + keyboard focus; also describes the button unless it repeats the accessible name',
147
255
  onClick: 'standard click handler',
148
256
  clickAction: 'async click handler w/ automatic loading state',
257
+ isInterruptible:
258
+ 'keeps button clickable while clickAction pending; a re-click interrupts it. Not for fire-once actions (submit/save/pay)',
259
+ width:
260
+ 'button width; numbers=pixels, strings=as-is; without it keeps the icon-only aspect (square by default)',
261
+ type: 'HTML button type; defaults to "button"',
262
+ name: 'HTML name for form submission',
263
+ value: 'HTML value for form submission',
264
+ form: 'associates button with form element by ID',
265
+ href: 'renders as a link; a disabled IconButton stays a <button>',
266
+ as: 'custom link component used with href',
267
+ target: 'HTML target when rendered as a link',
268
+ rel: 'HTML rel when rendered as a link',
149
269
  },
150
270
  };
@@ -237,6 +237,8 @@ export function useSwipeAction({
237
237
  reducedMotionRef.current = isReducedMotion;
238
238
  });
239
239
 
240
+ // Releases the settle timer, the animation frame and the pinch watch on
241
+ // unmount.
240
242
  useEffect(
241
243
  () => () => {
242
244
  if (settleTimerRef.current != null) {
@@ -188,6 +188,8 @@ export function useModalOutlet(
188
188
  const isLatestRef = useRef(isLatest);
189
189
  isLatestRef.current = isLatest;
190
190
  const suppliedRef = useRef<HTMLDialogElement | null>(null);
191
+ // Syncs the module registry of modal outlets with this dialog while it is
192
+ // active. It also follows the dialog's native `close` event.
191
193
  useEffect(() => {
192
194
  const element = ref.current;
193
195
  if (!isActive || element == null) {
@@ -96,6 +96,7 @@ export function useOutsidePress(): OutsidePressWatch {
96
96
  },
97
97
  [],
98
98
  );
99
+ // Stops the outside-press listeners on unmount.
99
100
  useEffect(() => stop, [stop]);
100
101
  return useMemo(() => ({start, stop}), [start, stop]);
101
102
  }
@@ -1560,6 +1560,8 @@ function useLayerImplementation(
1560
1560
  forgetDismissalRef.current = forget;
1561
1561
  }, []);
1562
1562
 
1563
+ // Syncs the document's capture-phase gesture tracking with this mount.
1564
+ // Unmount forgets the layer's dismissal.
1563
1565
  useEffect(() => {
1564
1566
  // Install capture-phase gesture tracking before the first interaction.
1565
1567
  currentGesture();
@@ -155,6 +155,8 @@ export function useLayerDismissal(
155
155
 
156
156
  const isRegistered = isActive && isEnabled;
157
157
 
158
+ // Syncs the shared dismissal stack with `isRegistered`. A registered layer
159
+ // gets Escape and outside presses in stack order.
158
160
  useEffect(() => {
159
161
  if (!isRegistered) {
160
162
  wasRegisteredRef.current = false;
@@ -6,8 +6,9 @@
6
6
  * @file usePressPin.ts
7
7
  * @input A hover layer's trigger, open state, show and hide, and its
8
8
  * `triggerBehavior` and `touchTrigger` options
9
- * @output usePressPin, the press toggle that pins a hover layer open;
10
- * isPressPinTrigger; stopPressPinClick; the LayerTriggerBehavior type
9
+ * @output usePressPin, the press toggle that pins a hover layer open, and
10
+ * the app hold behind useTooltip's show() and hide(); isPressPinTrigger;
11
+ * stopPressPinClick; the LayerTriggerBehavior type
11
12
  * @position Core-internal: one call per hover layer, useTooltip's. It owns
12
13
  * the layer's touch trigger, so the host makes no second touch-trigger call.
13
14
  *
@@ -103,8 +104,18 @@ export interface UsePressPinReturn {
103
104
  isHeldOpen: () => boolean;
104
105
  /** Wires the trigger element, or unwires it with `null`. */
105
106
  attach: (element: HTMLElement | null) => void;
106
- /** Drops the pin: Escape, or a hide that came from elsewhere. */
107
+ /** Drops the pin and the app hold: Escape, or a hide from elsewhere. */
107
108
  unpin: () => void;
109
+ /**
110
+ * The app's `show()`: shows the layer and holds it open, as a pin does,
111
+ * until `release`, Escape, a press outside, or focus leaving the trigger
112
+ * and the layer. A controlled layer reports the request instead.
113
+ */
114
+ hold: () => void;
115
+ /** The app's `hide()`: drops the hold and hides the layer. */
116
+ release: () => void;
117
+ /** Whether the app's `show()` holds the layer open now. */
118
+ isAppHeld: () => boolean;
108
119
  /**
109
120
  * While pinned, focus moving onto an element outside the trigger and the
110
121
  * layer closes it. Returns whether the pin decided. The pin calls it for its
@@ -112,8 +123,9 @@ export interface UsePressPinReturn {
112
123
  */
113
124
  handleFocusLeave: (event: FocusEvent) => boolean;
114
125
  /**
115
- * Whether the layer shows pinned on a wired trigger. The host then announces
116
- * its rendered text, unless the layer has a `label`.
126
+ * Whether the layer shows pinned on a wired trigger, or held by the app's
127
+ * `show()`. The host then announces its rendered text, unless the layer has
128
+ * a `label`.
117
129
  */
118
130
  isPinShown: boolean;
119
131
  /** The layer's touch trigger (useTouchTriggerInternal), wired to the pin. */
@@ -175,8 +187,19 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
175
187
  setIsPinnedState(next);
176
188
  }, []);
177
189
 
190
+ // The app's show() holds the layer on any trigger, in any mode.
191
+ const isAppHeldRef = useRef(false);
192
+ const [isAppHeldState, setIsAppHeldState] = useState(false);
193
+ const setAppHeld = useCallback((next: boolean) => {
194
+ isAppHeldRef.current = next;
195
+ setIsAppHeldState(next);
196
+ }, []);
197
+
178
198
  // The last offered element lets a `triggerBehavior` change rewire it.
179
199
  const triggerRef = useRef<HTMLElement | null>(null);
200
+ // Every offered trigger, in any mode, so focus leaving ends a pin or an
201
+ // app hold.
202
+ const focusTargetRef = useRef<HTMLElement | null>(null);
180
203
  const offeredRef = useRef<HTMLElement | null>(null);
181
204
  // A primitive: re-attaching the same trigger renders nothing.
182
205
  const [offeredKind, setOfferedKind] = useState<'none' | 'other' | 'button'>(
@@ -192,6 +215,13 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
192
215
  // a pinned layer through the pin, so the pin drops with it.
193
216
  const hideFromTouch = useCallback(() => {
194
217
  const current = optionsRef.current;
218
+ if (isAppHeldRef.current) {
219
+ setAppHeld(false);
220
+ if (current.isOpen !== undefined) {
221
+ current.report(false);
222
+ return;
223
+ }
224
+ }
195
225
  if (current.triggerBehavior === 'toggle' && triggerRef.current != null) {
196
226
  if (current.isOpen !== undefined) {
197
227
  current.report(false);
@@ -202,7 +232,7 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
202
232
  }
203
233
  }
204
234
  current.hide();
205
- }, [setPinned]);
235
+ }, [setPinned, setAppHeld]);
206
236
 
207
237
  const {
208
238
  isTouchPointerRef,
@@ -233,13 +263,14 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
233
263
  const close = useCallback(() => {
234
264
  const current = optionsRef.current;
235
265
  clearTapOpen();
266
+ setAppHeld(false);
236
267
  if (current.isOpen !== undefined) {
237
268
  current.report(false);
238
269
  return;
239
270
  }
240
271
  setPinned(false);
241
272
  current.hide();
242
- }, [setPinned, clearTapOpen]);
273
+ }, [setPinned, setAppHeld, clearTapOpen]);
243
274
 
244
275
  const announceName = useCallback(() => {
245
276
  const current = optionsRef.current;
@@ -348,6 +379,9 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
348
379
 
349
380
  const isHeldOpen = useCallback(() => {
350
381
  const current = optionsRef.current;
382
+ if (isAppHeldRef.current && current.isLayerOpen) {
383
+ return current.isOpen !== false;
384
+ }
351
385
  if (current.triggerBehavior !== 'toggle' || triggerRef.current == null) {
352
386
  return false;
353
387
  }
@@ -364,7 +398,7 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
364
398
  return false;
365
399
  }
366
400
  const next = event.relatedTarget;
367
- const trigger = triggerRef.current;
401
+ const trigger = focusTargetRef.current;
368
402
  // Focus that leaves for no element is a press's to decide. The trigger
369
403
  // can sit in another document, so the check uses its own window.
370
404
  const view = trigger?.ownerDocument.defaultView;
@@ -387,6 +421,8 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
387
421
  );
388
422
 
389
423
  const unwire = useCallback(() => {
424
+ focusTargetRef.current?.removeEventListener('focusout', handleFocusLeave);
425
+ focusTargetRef.current = null;
390
426
  const previous = triggerRef.current;
391
427
  if (previous == null) {
392
428
  return;
@@ -394,7 +430,6 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
394
430
  previous.removeEventListener('click', handlePress);
395
431
  previous.removeEventListener('keydown', handleKeyDown);
396
432
  previous.removeEventListener('keyup', handleKeyUp);
397
- previous.removeEventListener('focusout', handleFocusLeave);
398
433
  const own = ownStateRef.current;
399
434
  if (own != null) {
400
435
  restoreAttribute(previous, 'aria-expanded', own.expanded);
@@ -423,10 +458,14 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
423
458
  }
424
459
  settledRef.current = {element, mode: current.triggerBehavior};
425
460
  unwire();
426
- if (element == null || current.triggerBehavior !== 'toggle') {
461
+ if (element == null) {
427
462
  return;
428
463
  }
429
- if (!isPressPinTrigger(element)) {
464
+ // Its own focus-leave listener, in any mode: `focusTrigger="never"`
465
+ // attaches none, and an app hold needs it on any trigger.
466
+ element.addEventListener('focusout', handleFocusLeave);
467
+ focusTargetRef.current = element;
468
+ if (current.triggerBehavior !== 'toggle' || !isPressPinTrigger(element)) {
430
469
  return;
431
470
  }
432
471
  element.addEventListener('click', handlePress);
@@ -434,8 +473,6 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
434
473
  element.addEventListener('keydown', handleKeyDown);
435
474
  element.addEventListener('keyup', handleKeyUp);
436
475
  }
437
- // Its own focus-leave listener: `focusTrigger="never"` attaches none.
438
- element.addEventListener('focusout', handleFocusLeave);
439
476
  ownStateRef.current = {
440
477
  expanded: element.getAttribute('aria-expanded'),
441
478
  controls: element.getAttribute('aria-controls'),
@@ -473,7 +510,31 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
473
510
  if (isPinnedRef.current) {
474
511
  setPinned(false);
475
512
  }
476
- }, [setPinned]);
513
+ if (isAppHeldRef.current) {
514
+ setAppHeld(false);
515
+ }
516
+ }, [setPinned, setAppHeld]);
517
+
518
+ const hold = useCallback(() => {
519
+ const current = optionsRef.current;
520
+ if (!current.isEnabled) {
521
+ return;
522
+ }
523
+ setAppHeld(true);
524
+ armOutsideDismiss();
525
+ announceName();
526
+ if (current.isOpen !== undefined) {
527
+ current.report(true);
528
+ return;
529
+ }
530
+ current.show();
531
+ }, [setAppHeld, armOutsideDismiss, announceName]);
532
+
533
+ const release = useCallback(() => {
534
+ close();
535
+ }, [close]);
536
+
537
+ const isAppHeld = useCallback(() => isAppHeldRef.current, []);
477
538
 
478
539
  // Each path that hides a pinned layer drops the pin itself, so a layer that
479
540
  // does not show is never reported expanded.
@@ -490,13 +551,18 @@ export function usePressPin(options: UsePressPinOptions): UsePressPinReturn {
490
551
  writeAttribute(trigger, 'aria-controls', isLayerOpen ? layerId : null);
491
552
  });
492
553
 
493
- const isPinShown = isToggleMode && isWired && isExpanded;
554
+ const isPinShown =
555
+ (isToggleMode && isWired && isExpanded) ||
556
+ (isAppHeldState && isLayerOpen && isOpen !== false);
494
557
 
495
558
  return {
496
559
  isToggleTrigger,
497
560
  isHeldOpen,
498
561
  attach,
499
562
  unpin,
563
+ hold,
564
+ release,
565
+ isAppHeld,
500
566
  handleFocusLeave,
501
567
  isPinShown,
502
568
  touch: {
@@ -436,7 +436,9 @@ export function useTouchTriggerInternal(
436
436
  }
437
437
  }, [triggerRef, disarmOutsideDismiss]);
438
438
 
439
+ // Releases the outside-dismiss listener on unmount.
439
440
  useEffect(() => disarmOutsideDismiss, [disarmOutsideDismiss]);
441
+ // Releases a pending tap on unmount.
440
442
  useEffect(() => () => forgetPendingTapRef.current?.(), []);
441
443
 
442
444
  const isTouchInteraction = useCallback(