@astryxdesign/core 0.7.8 → 0.7.9-canary.07992bb

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 (403) hide show
  1. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -1
  2. package/dist/AppShell/observeMainOverflow.js +9 -6
  3. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  4. package/dist/BottomSheet/BottomSheet.js +5 -0
  5. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  6. package/dist/BottomSheet/BottomSheetPanel.js +40 -8
  7. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  8. package/dist/BottomSheet/useSheetGestures.js +61 -21
  9. package/dist/Calendar/Calendar.d.ts +14 -2
  10. package/dist/Calendar/Calendar.d.ts.map +1 -1
  11. package/dist/Calendar/Calendar.js +63 -74
  12. package/dist/Calendar/getInitialFocusDate.d.ts +4 -1
  13. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -1
  14. package/dist/Calendar/getInitialFocusDate.js +7 -5
  15. package/dist/Calendar/hooks/useCalendarDays.d.ts +19 -2
  16. package/dist/Calendar/hooks/useCalendarDays.d.ts.map +1 -1
  17. package/dist/Calendar/hooks/useCalendarDays.js +57 -64
  18. package/dist/Calendar/hooks/useCalendarNavigation.d.ts +28 -3
  19. package/dist/Calendar/hooks/useCalendarNavigation.d.ts.map +1 -1
  20. package/dist/Calendar/hooks/useCalendarNavigation.js +33 -22
  21. package/dist/Calendar/styles.d.ts +1 -1
  22. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  23. package/dist/CheckboxInput/CheckboxInput.js +54 -11
  24. package/dist/ClickableCard/ClickableCard.d.ts +1 -1
  25. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  26. package/dist/ClickableCard/ClickableCard.js +5 -1
  27. package/dist/DateInput/DateInput.d.ts.map +1 -1
  28. package/dist/DateInput/DateInput.js +4 -1
  29. package/dist/DateInput/PickerWheel.d.ts.map +1 -1
  30. package/dist/DateInput/PickerWheel.js +7 -1
  31. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  32. package/dist/DateRangeInput/DateRangeInput.js +5 -2
  33. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  34. package/dist/DateTimeInput/DateTimeInput.js +4 -1
  35. package/dist/Dialog/Dialog.d.ts +2 -1
  36. package/dist/Dialog/Dialog.d.ts.map +1 -1
  37. package/dist/Dialog/Dialog.js +12 -1
  38. package/dist/Drawer/useDrawerDialogPresence.d.ts +2 -1
  39. package/dist/Drawer/useDrawerDialogPresence.d.ts.map +1 -1
  40. package/dist/Drawer/useDrawerDialogPresence.js +11 -2
  41. package/dist/DropdownMenu/DropdownMenu.d.ts +9 -1
  42. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  43. package/dist/DropdownMenu/DropdownMenu.js +9 -4
  44. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
  45. package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +3 -2
  46. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  47. package/dist/DropdownMenu/DropdownMenuItem.js +3 -2
  48. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  49. package/dist/DropdownMenu/DropdownMenuRadioItem.js +3 -2
  50. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  51. package/dist/DropdownMenu/DropdownMenuSubMenu.js +3 -2
  52. package/dist/Field/inputDisabledFocus.d.ts +4 -4
  53. package/dist/Field/inputStyles.stylex.d.ts +1 -1
  54. package/dist/FileInput/FileInput.d.ts.map +1 -1
  55. package/dist/FileInput/FileInput.js +16 -2
  56. package/dist/HoverCard/useHoverCard.d.ts +3 -1
  57. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  58. package/dist/Icon/Icon.d.ts +1 -1
  59. package/dist/InfoTip/InfoTip.d.ts +1 -0
  60. package/dist/InfoTip/InfoTip.d.ts.map +1 -1
  61. package/dist/InfoTip/InfoTip.js +1 -0
  62. package/dist/InputGroup/InputGroup.d.ts +4 -3
  63. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  64. package/dist/InputGroup/InputGroup.js +2 -2
  65. package/dist/InputGroup/groupStyles.d.ts +1 -1
  66. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  67. package/dist/InputGroup/groupStyles.js +1 -1
  68. package/dist/Item/Item.d.ts +2 -1
  69. package/dist/Item/Item.d.ts.map +1 -1
  70. package/dist/Item/Item.js +29 -6
  71. package/dist/Layer/holdEntranceInput.d.ts +24 -0
  72. package/dist/Layer/holdEntranceInput.d.ts.map +1 -0
  73. package/dist/Layer/holdEntranceInput.js +65 -0
  74. package/dist/Layer/inputHold.d.ts +49 -0
  75. package/dist/Layer/inputHold.d.ts.map +1 -0
  76. package/dist/Layer/inputHold.js +636 -0
  77. package/dist/Layer/preserveAnimations.d.ts +1 -5
  78. package/dist/Layer/preserveAnimations.d.ts.map +1 -1
  79. package/dist/Layer/preserveAnimations.js +12 -214
  80. package/dist/Layer/useLayer.d.ts +3 -1
  81. package/dist/Layer/useLayer.d.ts.map +1 -1
  82. package/dist/Layer/useLayer.js +64 -4
  83. package/dist/Layout/LayoutContent.d.ts +3 -1
  84. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  85. package/dist/Layout/LayoutContent.js +12 -4
  86. package/dist/Layout/LayoutPanel.d.ts +4 -1
  87. package/dist/Layout/LayoutPanel.d.ts.map +1 -1
  88. package/dist/Layout/LayoutPanel.js +13 -4
  89. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  90. package/dist/Lightbox/Lightbox.js +4 -0
  91. package/dist/MetadataList/MetadataList.js +1 -1
  92. package/dist/MobileNav/MobileNav.d.ts +11 -1
  93. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  94. package/dist/MobileNav/MobileNav.js +39 -1
  95. package/dist/MoreMenu/MoreMenu.d.ts +5 -3
  96. package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
  97. package/dist/NumberInput/NumberInput.d.ts +4 -2
  98. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  99. package/dist/NumberInput/NumberInput.js +244 -11
  100. package/dist/Popover/usePopover.d.ts +1 -0
  101. package/dist/Popover/usePopover.d.ts.map +1 -1
  102. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  103. package/dist/PowerSearch/PowerSearch.js +12 -5
  104. package/dist/PowerSearch/PowerSearchBottomSheet.d.ts.map +1 -1
  105. package/dist/PowerSearch/PowerSearchBottomSheet.js +4 -2
  106. package/dist/PowerSearch/PowerSearchToken.d.ts.map +1 -1
  107. package/dist/PowerSearch/PowerSearchToken.js +3 -1
  108. package/dist/PowerSearch/formatFilterValue.d.ts +9 -3
  109. package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
  110. package/dist/PowerSearch/formatFilterValue.js +14 -11
  111. package/dist/PowerSearch/formatTokenValue.d.ts +6 -2
  112. package/dist/PowerSearch/formatTokenValue.d.ts.map +1 -1
  113. package/dist/PowerSearch/formatTokenValue.js +6 -3
  114. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  115. package/dist/RadioList/RadioListItem.js +22 -4
  116. package/dist/SelectableCard/SelectableCard.d.ts +1 -1
  117. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  118. package/dist/SelectableCard/SelectableCard.js +5 -1
  119. package/dist/Spinner/Spinner.d.ts.map +1 -1
  120. package/dist/Spinner/Spinner.js +14 -71
  121. package/dist/Spinner/index.d.ts +1 -1
  122. package/dist/Spinner/index.d.ts.map +1 -1
  123. package/dist/Spinner/spinnerRotor.d.ts +28 -0
  124. package/dist/Spinner/spinnerRotor.d.ts.map +1 -0
  125. package/dist/Spinner/spinnerRotor.js +98 -0
  126. package/dist/Stack/StackItem.d.ts +8 -4
  127. package/dist/Stack/StackItem.d.ts.map +1 -1
  128. package/dist/Stack/StackItem.js +17 -4
  129. package/dist/Switch/Switch.d.ts.map +1 -1
  130. package/dist/Switch/Switch.js +13 -10
  131. package/dist/Table/plugins/sortable/useTableSortable.js +1 -1
  132. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  133. package/dist/Timestamp/Timestamp.js +14 -8
  134. package/dist/Timestamp/formatInstant.d.ts +10 -1
  135. package/dist/Timestamp/formatInstant.d.ts.map +1 -1
  136. package/dist/Timestamp/formatInstant.js +13 -27
  137. package/dist/Timestamp/tooltipEntries.d.ts +5 -3
  138. package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
  139. package/dist/Timestamp/tooltipEntries.js +6 -4
  140. package/dist/Token/Token.d.ts.map +1 -1
  141. package/dist/Token/Token.js +9 -0
  142. package/dist/Token/TokenLink.d.ts +1 -1
  143. package/dist/Token/TokenLink.d.ts.map +1 -1
  144. package/dist/Token/TokenLink.js +4 -1
  145. package/dist/Tokenizer/Tokenizer.d.ts +14 -10
  146. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  147. package/dist/Tokenizer/Tokenizer.js +189 -89
  148. package/dist/Tooltip/useTooltip.d.ts +3 -1
  149. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  150. package/dist/Tooltip/useTooltip.js +162 -59
  151. package/dist/TreeList/TreeListItem.d.ts +2 -1
  152. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  153. package/dist/TreeList/TreeListItem.js +27 -3
  154. package/dist/astryx.css +45 -18
  155. package/dist/gestures/GestureHost.d.ts +2 -2
  156. package/dist/gestures/GestureHost.d.ts.map +1 -1
  157. package/dist/gestures/GestureHost.js +21 -6
  158. package/dist/gestures/PanGestureRecognizer.d.ts +11 -1
  159. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  160. package/dist/gestures/PanGestureRecognizer.js +15 -1
  161. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +6 -1
  162. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -1
  163. package/dist/gestures/nativeScroll.d.ts +3 -6
  164. package/dist/gestures/nativeScroll.d.ts.map +1 -1
  165. package/dist/gestures/nativeScroll.js +7 -52
  166. package/dist/gestures/wheelSegmenter.d.ts +68 -1
  167. package/dist/gestures/wheelSegmenter.d.ts.map +1 -1
  168. package/dist/gestures/wheelSegmenter.js +199 -10
  169. package/dist/hooks/StackItemScrollRegion.d.ts +31 -0
  170. package/dist/hooks/StackItemScrollRegion.d.ts.map +1 -0
  171. package/dist/hooks/StackItemScrollRegion.js +40 -0
  172. package/dist/hooks/menuPressGesture.d.ts +133 -21
  173. package/dist/hooks/menuPressGesture.d.ts.map +1 -1
  174. package/dist/hooks/menuPressGesture.js +155 -30
  175. package/dist/hooks/menuPressValues.d.ts +16 -0
  176. package/dist/hooks/menuPressValues.d.ts.map +1 -0
  177. package/dist/hooks/menuPressValues.js +18 -0
  178. package/dist/hooks/useClickableContainer.d.ts +27 -5
  179. package/dist/hooks/useClickableContainer.d.ts.map +1 -1
  180. package/dist/hooks/useClickableContainer.js +41 -5
  181. package/dist/hooks/useFocusTrap.d.ts +10 -0
  182. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  183. package/dist/hooks/useFocusTrap.js +225 -132
  184. package/dist/hooks/useMenuPress.d.ts +34 -1
  185. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  186. package/dist/hooks/useMenuPress.js +93 -5
  187. package/dist/hooks/usePressFeedback.d.ts +6 -6
  188. package/dist/hooks/usePressFeedback.js +6 -6
  189. package/dist/hooks/useScrollRegionProps.d.ts +35 -0
  190. package/dist/hooks/useScrollRegionProps.d.ts.map +1 -0
  191. package/dist/hooks/useScrollRegionProps.js +51 -0
  192. package/dist/i18n/InternationalizationContext.d.ts +6 -0
  193. package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
  194. package/dist/i18n/InternationalizationProvider.d.ts +21 -3
  195. package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
  196. package/dist/i18n/InternationalizationProvider.js +8 -3
  197. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts +8 -0
  198. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.d.ts.map +1 -0
  199. package/dist/i18n/generated-english/hooks/useScrollRegionProps.generated.js +12 -0
  200. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  201. package/dist/i18n/generated-locales/en.generated.js +1 -0
  202. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  203. package/dist/i18n/generated-locales/pseudo.generated.js +1 -0
  204. package/dist/i18n/index.d.ts +2 -0
  205. package/dist/i18n/index.d.ts.map +1 -1
  206. package/dist/i18n/index.js +1 -0
  207. package/dist/i18n/useCalendarSystem.d.ts +19 -0
  208. package/dist/i18n/useCalendarSystem.d.ts.map +1 -0
  209. package/dist/i18n/useCalendarSystem.js +61 -0
  210. package/dist/internal/spinner-rotor.d.ts +16 -0
  211. package/dist/internal/spinner-rotor.d.ts.map +1 -0
  212. package/dist/internal/spinner-rotor.js +16 -0
  213. package/dist/internal/touch.d.ts +14 -1
  214. package/dist/internal/touch.d.ts.map +1 -1
  215. package/dist/internal/touch.js +20 -2
  216. package/dist/motion/carryAnimations.d.ts +58 -0
  217. package/dist/motion/carryAnimations.d.ts.map +1 -0
  218. package/dist/motion/carryAnimations.js +305 -0
  219. package/dist/motion/transientCopy.d.ts +4 -2
  220. package/dist/motion/transientCopy.d.ts.map +1 -1
  221. package/dist/motion/transientCopy.js +34 -5
  222. package/dist/motion/uikit/gestures.d.ts +41 -0
  223. package/dist/motion/uikit/gestures.d.ts.map +1 -1
  224. package/dist/motion/uikit/gestures.js +25 -0
  225. package/dist/motion/uikit/index.d.ts +1 -1
  226. package/dist/motion/uikit/index.d.ts.map +1 -1
  227. package/dist/motion/uikit/index.js +1 -1
  228. package/dist/motion/uikit/timing.d.ts +14 -10
  229. package/dist/motion/uikit/timing.d.ts.map +1 -1
  230. package/dist/motion/uikit/timing.js +7 -5
  231. package/dist/privateAttributes/menuPressLit.stylex.d.ts +52 -0
  232. package/dist/privateAttributes/menuPressLit.stylex.d.ts.map +1 -0
  233. package/dist/privateAttributes/menuPressLit.stylex.js +99 -0
  234. package/dist/privateAttributes/press.stylex.d.ts +139 -0
  235. package/dist/privateAttributes/press.stylex.d.ts.map +1 -0
  236. package/dist/privateAttributes/press.stylex.js +97 -0
  237. package/dist/theme/themeMotion.d.ts +3 -2
  238. package/dist/theme/themeMotion.d.ts.map +1 -1
  239. package/dist/theme/themeMotion.js +3 -2
  240. package/dist/theme/tokens.stylex.d.ts +2 -2
  241. package/dist/theme/tokens.stylex.js +1 -1
  242. package/dist/utils/calendarSystem.d.ts +114 -0
  243. package/dist/utils/calendarSystem.d.ts.map +1 -0
  244. package/dist/utils/calendarSystem.js +386 -0
  245. package/dist/utils/flatTree.d.ts +6 -3
  246. package/dist/utils/flatTree.d.ts.map +1 -1
  247. package/dist/utils/flatTree.js +13 -3
  248. package/dist/utils/hitArea.d.ts.map +1 -1
  249. package/dist/utils/hitArea.js +82 -5
  250. package/dist/utils/inputStream.d.ts +14 -1
  251. package/dist/utils/inputStream.d.ts.map +1 -1
  252. package/dist/utils/inputStream.js +40 -9
  253. package/dist/utils/interactionOverlay.stylex.d.ts +5 -9
  254. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  255. package/dist/utils/interactionOverlay.stylex.js +29 -31
  256. package/dist/utils/plainDate.d.ts +23 -7
  257. package/dist/utils/plainDate.d.ts.map +1 -1
  258. package/dist/utils/plainDate.js +57 -18
  259. package/dist/utils/pressFeedback.d.ts +10 -2
  260. package/dist/utils/pressFeedback.d.ts.map +1 -1
  261. package/dist/utils/pressFeedback.js +40 -15
  262. package/dist/utils/pressGesture.d.ts +12 -6
  263. package/dist/utils/pressGesture.d.ts.map +1 -1
  264. package/dist/utils/pressGesture.js +26 -8
  265. package/dist/utils/scrollView.d.ts +25 -0
  266. package/dist/utils/scrollView.d.ts.map +1 -0
  267. package/dist/utils/scrollView.js +108 -0
  268. package/dist/utils/selectionLock.d.ts.map +1 -1
  269. package/dist/utils/selectionLock.js +1 -10
  270. package/dist/utils/touchHitArea.stylex.d.ts +35 -0
  271. package/dist/utils/touchHitArea.stylex.d.ts.map +1 -0
  272. package/dist/utils/touchHitArea.stylex.js +32 -0
  273. package/dist/utils/triggerFocus.d.ts +5 -0
  274. package/dist/utils/triggerFocus.d.ts.map +1 -1
  275. package/dist/utils/triggerFocus.js +9 -2
  276. package/locales/en.json +4 -0
  277. package/locales/pseudo.json +3 -0
  278. package/package.json +10 -4
  279. package/src/AppShell/observeMainOverflow.ts +9 -6
  280. package/src/BottomSheet/BottomSheet.tsx +5 -0
  281. package/src/BottomSheet/BottomSheetPanel.tsx +64 -7
  282. package/src/BottomSheet/useSheetGestures.ts +83 -20
  283. package/src/Calendar/Calendar.doc.mjs +76 -6
  284. package/src/Calendar/Calendar.tsx +123 -104
  285. package/src/Calendar/getInitialFocusDate.ts +22 -8
  286. package/src/Calendar/hooks/useCalendarDays.ts +89 -63
  287. package/src/Calendar/hooks/useCalendarNavigation.ts +68 -26
  288. package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -2
  289. package/src/CheckboxInput/CheckboxInput.tsx +71 -9
  290. package/src/ClickableCard/ClickableCard.tsx +8 -1
  291. package/src/DateInput/DateInput.tsx +2 -0
  292. package/src/DateInput/PickerWheel.tsx +7 -2
  293. package/src/DateRangeInput/DateRangeInput.tsx +3 -1
  294. package/src/DateTimeInput/DateTimeInput.tsx +2 -0
  295. package/src/Dialog/Dialog.doc.mjs +1 -1
  296. package/src/Dialog/Dialog.tsx +12 -1
  297. package/src/Drawer/Drawer.doc.mjs +1 -1
  298. package/src/Drawer/useDrawerDialogPresence.ts +9 -2
  299. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -2
  300. package/src/DropdownMenu/DropdownMenu.tsx +29 -5
  301. package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +5 -1
  302. package/src/DropdownMenu/DropdownMenuItem.tsx +8 -4
  303. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +5 -1
  304. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +5 -1
  305. package/src/FileInput/FileInput.tsx +16 -2
  306. package/src/HoverCard/useHoverCard.tsx +3 -1
  307. package/src/InfoTip/InfoTip.doc.mjs +26 -2
  308. package/src/InfoTip/InfoTip.tsx +1 -0
  309. package/src/InputGroup/InputGroup.doc.mjs +4 -3
  310. package/src/InputGroup/InputGroup.tsx +4 -3
  311. package/src/InputGroup/groupStyles.ts +3 -1
  312. package/src/Item/Item.tsx +51 -9
  313. package/src/Layer/holdEntranceInput.ts +84 -0
  314. package/src/Layer/inputHold.ts +734 -0
  315. package/src/Layer/preserveAnimations.ts +12 -275
  316. package/src/Layer/useLayer.tsx +77 -4
  317. package/src/Layout/LayoutContent.doc.mjs +6 -3
  318. package/src/Layout/LayoutContent.tsx +10 -4
  319. package/src/Layout/LayoutPanel.doc.mjs +6 -3
  320. package/src/Layout/LayoutPanel.tsx +11 -4
  321. package/src/Lightbox/Lightbox.tsx +4 -0
  322. package/src/MetadataList/MetadataList.tsx +1 -1
  323. package/src/MobileNav/MobileNav.doc.mjs +3 -3
  324. package/src/MobileNav/MobileNav.tsx +39 -1
  325. package/src/MoreMenu/MoreMenu.doc.mjs +2 -4
  326. package/src/MoreMenu/MoreMenu.tsx +5 -3
  327. package/src/NumberInput/NumberInput.doc.mjs +1 -1
  328. package/src/NumberInput/NumberInput.tsx +259 -11
  329. package/src/Popover/usePopover.tsx +1 -0
  330. package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
  331. package/src/PowerSearch/PowerSearch.tsx +20 -3
  332. package/src/PowerSearch/PowerSearchBottomSheet.tsx +4 -1
  333. package/src/PowerSearch/PowerSearchToken.tsx +3 -0
  334. package/src/PowerSearch/formatFilterValue.ts +21 -11
  335. package/src/PowerSearch/formatTokenValue.ts +7 -1
  336. package/src/RadioList/RadioListItem.doc.mjs +3 -2
  337. package/src/RadioList/RadioListItem.tsx +25 -7
  338. package/src/SelectableCard/SelectableCard.tsx +8 -1
  339. package/src/Spinner/Spinner.tsx +7 -89
  340. package/src/Spinner/index.ts +1 -5
  341. package/src/Spinner/spinnerRotor.ts +113 -0
  342. package/src/Stack/Stack.doc.mjs +1 -1
  343. package/src/Stack/StackItem.tsx +27 -13
  344. package/src/Switch/Switch.tsx +7 -6
  345. package/src/Table/plugins/sortable/useTableSortable.tsx +1 -1
  346. package/src/Timestamp/Timestamp.doc.mjs +3 -3
  347. package/src/Timestamp/Timestamp.tsx +13 -8
  348. package/src/Timestamp/formatInstant.ts +49 -28
  349. package/src/Timestamp/tooltipEntries.ts +7 -3
  350. package/src/Token/Token.tsx +18 -1
  351. package/src/Token/TokenLink.tsx +7 -1
  352. package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
  353. package/src/Tokenizer/Tokenizer.tsx +252 -115
  354. package/src/Tooltip/useTooltip.tsx +178 -80
  355. package/src/TreeList/TreeListItem.tsx +36 -2
  356. package/src/gestures/GestureHost.ts +21 -5
  357. package/src/gestures/PanGestureRecognizer.ts +19 -2
  358. package/src/gestures/README.md +14 -5
  359. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +6 -1
  360. package/src/gestures/nativeScroll.ts +12 -68
  361. package/src/gestures/wheelSegmenter.ts +243 -10
  362. package/src/hooks/StackItemScrollRegion.tsx +57 -0
  363. package/src/hooks/menuPressGesture.ts +244 -38
  364. package/src/hooks/menuPressValues.ts +18 -0
  365. package/src/hooks/useClickableContainer.doc.mjs +8 -2
  366. package/src/hooks/useClickableContainer.ts +72 -6
  367. package/src/hooks/useFocusTrap.ts +268 -151
  368. package/src/hooks/useMenuPress.ts +118 -11
  369. package/src/hooks/usePressFeedback.doc.mjs +3 -3
  370. package/src/hooks/usePressFeedback.ts +6 -6
  371. package/src/hooks/useScrollRegionProps.ts +76 -0
  372. package/src/i18n/InternationalizationContext.ts +6 -0
  373. package/src/i18n/InternationalizationProvider.doc.mjs +29 -1
  374. package/src/i18n/InternationalizationProvider.tsx +33 -3
  375. package/src/i18n/generated-english/hooks/useScrollRegionProps.generated.ts +13 -0
  376. package/src/i18n/generated-locales/en.generated.ts +1 -0
  377. package/src/i18n/generated-locales/pseudo.generated.ts +1 -0
  378. package/src/i18n/index.ts +2 -0
  379. package/src/i18n/useCalendarSystem.ts +95 -0
  380. package/src/internal/spinner-rotor.ts +20 -0
  381. package/src/internal/touch.ts +34 -1
  382. package/src/motion/MEASUREMENTS.md +11 -0
  383. package/src/motion/carryAnimations.ts +389 -0
  384. package/src/motion/transientCopy.ts +45 -5
  385. package/src/motion/uikit/gestures.ts +22 -0
  386. package/src/motion/uikit/index.ts +1 -0
  387. package/src/motion/uikit/timing.ts +7 -5
  388. package/src/privateAttributes/menuPressLit.stylex.ts +104 -0
  389. package/src/privateAttributes/press.stylex.ts +243 -0
  390. package/src/theme/themeMotion.ts +3 -2
  391. package/src/theme/tokens.stylex.ts +1 -1
  392. package/src/utils/calendarSystem.ts +548 -0
  393. package/src/utils/flatTree.ts +15 -3
  394. package/src/utils/hitArea.ts +107 -5
  395. package/src/utils/inputStream.ts +47 -10
  396. package/src/utils/interactionOverlay.stylex.ts +19 -22
  397. package/src/utils/plainDate.ts +84 -19
  398. package/src/utils/pressFeedback.ts +46 -14
  399. package/src/utils/pressGesture.ts +35 -9
  400. package/src/utils/scrollView.ts +135 -0
  401. package/src/utils/selectionLock.ts +5 -10
  402. package/src/utils/touchHitArea.stylex.ts +41 -0
  403. package/src/utils/triggerFocus.ts +17 -4
@@ -20,12 +20,12 @@ export const docs = {
20
20
  name: 'pressableProps',
21
21
  type: "{'data-astryx-pressable': ''}",
22
22
  description:
23
- "The marker attribute to spread on the element that paints the press. Compose one of `interactionOverlayStyles` (from `@astryxdesign/core/utils`) on the same element — `backgroundColor` or `backgroundImage` for a surface whose hover and press are the system's overlays, `pressedBackgroundColor` for one whose hover is its own — and it paints the pressed token at the press's strength on the first frame of a believed press and fades it over the release, keeping `:active` for a mouse on a desktop. On a phone or tablet, where the stylesheet drops `:active`, the controller also paints a mouse, trackpad or Space-key press: at once, held while the button or key is down, faded at the release. A press is themed through `--color-overlay-pressed`.",
23
+ "The marker attribute to spread on the element that paints the press. Compose one of `interactionOverlayStyles` (from `@astryxdesign/core/utils`) on the same element — `backgroundColor` or `backgroundImage` for a surface whose hover and press are the system's overlays, `pressedBackgroundColor` for one whose hover is its own — and it paints the pressed token on the first frame of a press and fades it over the release, keeping `:active` for a mouse on a desktop. On a phone or tablet, where the stylesheet drops `:active`, the controller also paints a mouse, trackpad or Space-key press: at once, held while the button or key is down, faded at the release. A press is themed through `--color-overlay-pressed`.",
24
24
  },
25
25
  ],
26
26
  usage: {
27
27
  description:
28
- 'The touch press model every Astryx pressable uses, for a local component that paints its own press. Under a finger, CSS `:active` paints on the touch itself and can outlive the start of a scroll; the press model instead waits 150 ms before believing a press, cancels it the moment the finger travels 10 px or a scroll claims the gesture, never brings it back inside that gesture, answers a quick tap at the lift, and fades the release over 200 ms — the clocks a native list uses. One document-level controller does this for every marked element (installed by the first pressable to mount, removed by the last to unmount), so calling the hook adds no listener or state to your element. On a desktop a mouse press is still your `:active` rule: keep it, and drop it under `@media (pointer: coarse)` the way the built-in components do. That query reads the primary pointer, so on a phone or tablet it also drops `:active` for a connected mouse, trackpad or keyboard; the controller paints those presses there (at once, faded at the release), so nothing goes unanswered.',
28
+ 'The touch press model every Astryx pressable uses, for a local component that paints its own press. Under a finger, CSS `:active` paints on the touch itself and can outlive the start of a scroll; the press model instead tracks the touch the way UIKit tracks a control: it highlights as the finger lands (after the content-touch delay inside a scroller, where a flick paints nothing), a quick tap answers at the lift, and a scroll that takes the touch cancels it with no fade. One document-level controller does this for every marked element (installed by the first pressable to mount, removed by the last to unmount), so calling the hook adds no listener or state to your element. On a desktop a mouse press is still your `:active` rule: keep it, and drop it under `@media (pointer: coarse)` the way the built-in components do. That query reads the primary pointer, so on a phone or tablet it also drops `:active` for a connected mouse, trackpad or keyboard; the controller paints those presses there (at once, faded at the release), so nothing goes unanswered.',
29
29
  bestPractices: [
30
30
  {
31
31
  guidance: true,
@@ -58,7 +58,7 @@ export const docs = {
58
58
  /** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
59
59
  export const docsDense = {
60
60
  description:
61
- 'Marks an element as a pressable surface of the touch press model (150 ms onset, 10 px slop, cancel on scroll, tap answers at lift, 200 ms fade) and installs the shared document controller; on a coarse primary pointer it also paints mouse, trackpad and Space-key presses at once. Returns the data-astryx-pressable marker to spread; compose one of interactionOverlayStyles on the same element to paint.',
61
+ 'Marks an element as a pressable surface of the touch press model, tracked like a UIKit control (highlight as the finger lands, 150 ms inside a scroller, fade at the lift), and installs the shared document controller; on a coarse primary pointer it also paints mouse, trackpad and Space-key presses at once. Returns the data-astryx-pressable marker to spread; compose one of interactionOverlayStyles on the same element to paint.',
62
62
  paramDescriptions: {},
63
63
  returnDescriptions: {
64
64
  pressableProps:
@@ -26,11 +26,11 @@ import {installPressFeedback, pressableProps} from '../utils/pressFeedback';
26
26
  * `interactionOverlayStyles` (from `@astryxdesign/core/utils`) on the same
27
27
  * element: `backgroundColor` or `backgroundImage` for a surface whose hover
28
28
  * and press are the system's overlays, `pressedBackgroundColor` for one
29
- * whose hover is its own. The controller writes its attribute on the element
30
- * while a touch press is believed (after the onset delay, cancelled by travel
31
- * or by a scroll) and for the release, and the composed style paints the
32
- * pressed token at the press's strength on the first frame and fades it over
33
- * the release, keeping `:active` for a mouse on a desktop. On a phone or
29
+ * whose hover is its own. Under a finger the controller tracks the press the
30
+ * way UIKit tracks a control and writes its
31
+ * attribute on the element while the press is held and for the release; the
32
+ * composed style paints the pressed token on the first frame and fades it
33
+ * over the release, keeping `:active` for a mouse on a desktop. On a phone or
34
34
  * tablet the stylesheet drops `:active` for every press, so the controller
35
35
  * also paints a mouse, trackpad or Space-key press there, at once. A press is
36
36
  * themed through `--color-overlay-pressed`, which the hold, the flash and the
@@ -46,7 +46,7 @@ import {installPressFeedback, pressableProps} from '../utils/pressFeedback';
46
46
  * @example
47
47
  * ```
48
48
  * const pressable = usePressFeedback();
49
- * return <div role="button" {...pressable} {...stylex.props(styles.row)} />;
49
+ * return <button {...pressable} {...stylex.props(styles.button)} />;
50
50
  * ```
51
51
  */
52
52
  export function usePressFeedback(): typeof pressableProps {
@@ -0,0 +1,76 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useScrollRegionProps.ts
7
+ * @input Whether a region may scroll, and the caller's role and label
8
+ * @output useScrollRegionProps: a ref for the region, and the role and
9
+ * accessible name that the region carries while its content overflows
10
+ * @position Internal hook for LayoutContent, LayoutPanel and StackItem.
11
+ *
12
+ * SYNC: When modified, update:
13
+ * - /packages/core/src/hooks/useScrollRegionProps.test.tsx
14
+ * - /packages/core/src/AppShell/observeMainOverflow.ts
15
+ */
16
+
17
+ import {useCallback, useState, type AriaRole, type RefCallback} from 'react';
18
+ import {
19
+ registerEnglishFallback,
20
+ useComponentTranslator,
21
+ } from '../i18n/useComponentTranslator';
22
+ import english from '../i18n/generated-english/hooks/useScrollRegionProps.generated';
23
+ import {observeMainOverflow} from '../AppShell/observeMainOverflow';
24
+
25
+ registerEnglishFallback(english);
26
+
27
+ export interface ScrollRegionOptions {
28
+ /** Whether the region may scroll at all (`overflow: auto`). */
29
+ isScrollable: boolean;
30
+ /** The caller's role. It always wins, and takes no default name. */
31
+ role?: AriaRole;
32
+ /** The caller's accessible name. It always wins. */
33
+ label?: string;
34
+ }
35
+
36
+ export interface ScrollRegionProps {
37
+ ref: RefCallback<HTMLElement>;
38
+ role: AriaRole | undefined;
39
+ 'aria-label': string | undefined;
40
+ }
41
+
42
+ /**
43
+ * The region's ref, role and accessible name. While the region may scroll
44
+ * and its content overflows, it is a group named by the caller's `label`, or
45
+ * by the translated "Content". A caller's `role` is kept with only the
46
+ * caller's `label`: a single main landmark relies on its role alone. When
47
+ * the region does not scroll, the caller's own `role` and `label` pass
48
+ * through unchanged.
49
+ */
50
+ export function useScrollRegionProps({
51
+ isScrollable,
52
+ role,
53
+ label,
54
+ }: ScrollRegionOptions): ScrollRegionProps {
55
+ const t = useComponentTranslator();
56
+ const [overflows, setOverflows] = useState(false);
57
+ // A caller's role takes no default name, so its region is not observed.
58
+ const hasRole = role != null;
59
+ const ref = useCallback(
60
+ (element: HTMLElement | null) => {
61
+ if (element == null || !isScrollable || hasRole) {
62
+ setOverflows(false);
63
+ return undefined;
64
+ }
65
+ return observeMainOverflow(element, setOverflows);
66
+ },
67
+ [hasRole, isScrollable],
68
+ );
69
+ const isGroup = !hasRole && isScrollable && overflows;
70
+ return {
71
+ ref,
72
+ role: role ?? (isGroup ? 'group' : undefined),
73
+ 'aria-label':
74
+ label ?? (isGroup ? t('@astryx.scrollRegion.label') : undefined),
75
+ };
76
+ }
@@ -25,10 +25,16 @@
25
25
  import {createContext} from 'react';
26
26
  import {getResolve} from './resolve';
27
27
  import type {Locale, MessagesByLocale, Overrides} from './types';
28
+ import type {CalendarSystem} from '../utils/calendarSystem';
28
29
 
29
30
  export interface InternationalizationContextValue {
30
31
  locale: Locale;
31
32
  direction: 'ltr' | 'rtl';
33
+ /**
34
+ * The provider's requested calendar system. A context without it means
35
+ * Gregorian dates.
36
+ */
37
+ calendar?: CalendarSystem;
32
38
  messages: MessagesByLocale;
33
39
  overrides?: Overrides;
34
40
  translate: ReturnType<typeof getResolve>;
@@ -26,7 +26,7 @@ export const docs = {
26
26
  name: 'Provider boundary',
27
27
  required: true,
28
28
  description:
29
- 'A nonvisual context boundary that supplies locale, message catalogs, overrides, and direction to descendant Astryx components. It renders no DOM element.',
29
+ 'A nonvisual context boundary that supplies locale, message catalogs, overrides, and direction to descendant Astryx components, and a calendar system to `Calendar`. It renders no DOM element.',
30
30
  },
31
31
  ],
32
32
  bestPractices: [
@@ -50,6 +50,11 @@ export const docs = {
50
50
  description:
51
51
  "Set the `dir` attribute on `<html>` (or a wrapping element) yourself; the provider does not set it. Astryx components mirror layout and directional icons from the DOM `dir`, so an RTL locale won't visually mirror without it. Use `getLocaleDirection(locale)` to derive the value for both the provider and the DOM.",
52
52
  },
53
+ {
54
+ guidance: true,
55
+ description:
56
+ 'Set `calendar` to show `Calendar` in another calendar system and write Timestamp and PowerSearch dates in it; `DateInput`, `DateRangeInput`, and `DateTimeInput` show Gregorian dates. A locale never selects the calendar: `fa-IR` shows Gregorian dates until you set `calendar="persian"`, and a `-u-ca-` keyword in `locale`, as in `th-TH-u-ca-buddhist`, keeps Gregorian dates too. Date values stay Gregorian ISO strings.',
57
+ },
53
58
  {
54
59
  guidance: false,
55
60
  description:
@@ -86,6 +91,13 @@ export const docs = {
86
91
  description:
87
92
  'Explicit text-direction override for the context. When omitted, direction is derived from `locale` via `Intl.Locale.getTextInfo()`. This sets the direction Astryx reads, but it does NOT set the DOM `dir` attribute; you must set `dir` on `<html>` (or a wrapping element) yourself, since Astryx components mirror layout and directional icons from the DOM `dir`, not from this prop. Set both to the same value and keep them in sync.',
88
93
  },
94
+ {
95
+ name: 'calendar',
96
+ type: "'gregory' | 'iso8601' | 'buddhist' | 'roc' | 'japanese' | 'persian' | 'indian' | 'hebrew' | 'chinese' | 'dangi' | 'coptic' | 'ethiopic' | 'ethioaa' | 'islamic-civil' | 'islamic-tbla' | 'islamic-umalqura'",
97
+ required: false,
98
+ description:
99
+ "Calendar system of the subtree, such as 'persian', 'hebrew', or 'buddhist'. `Calendar` shows it, and Timestamp and PowerSearch write their dates in it. `DateInput`, `DateRangeInput`, and `DateTimeInput` show Gregorian dates. When omitted, the calendar is Gregorian: a locale never selects it, neither by its default calendar nor by a `-u-ca-` keyword. A component's own `calendar` prop takes precedence. Values stay Gregorian ISO dates. Calendars other than gregory, iso8601, buddhist, roc, and japanese need `Temporal`; the context keeps the requested calendar, and where the runtime lacks `Temporal`, these components show Gregorian dates and warn in development. Load a polyfill such as `temporal-polyfill/full/global` on the server and in the browser.",
100
+ },
89
101
  {
90
102
  name: 'children',
91
103
  type: 'ReactNode',
@@ -124,6 +136,20 @@ export function AppI18n({children}: {children: ReactNode}) {
124
136
  {children}
125
137
  </InternationalizationProvider>
126
138
  );
139
+ }`,
140
+ },
141
+ {
142
+ label: 'Show Calendar in the Persian calendar',
143
+ code: `import type {ReactNode} from 'react';
144
+ import {InternationalizationProvider} from '@astryxdesign/core/i18n';
145
+
146
+ // Values stay Gregorian ISO dates, for example '2026-10-30'.
147
+ export function AppI18n({children}: {children: ReactNode}) {
148
+ return (
149
+ <InternationalizationProvider locale="fa-IR" calendar="persian">
150
+ {children}
151
+ </InternationalizationProvider>
152
+ );
127
153
  }`,
128
154
  },
129
155
  {
@@ -190,5 +216,7 @@ export const docsDense = {
190
216
  'map of BCP 47 tag to a rich Catalog or generated RuntimeCatalog; "en" is always available',
191
217
  overrides:
192
218
  'sparse per-locale key overrides applied on top of shipped defaults',
219
+ calendar:
220
+ 'calendar system for Calendar, Timestamp, and PowerSearch dates; date inputs stay Gregorian (default: gregory; a -u-ca- keyword in locale does not select it); values stay Gregorian ISO; non-Gregorian-aligned calendars need Temporal',
193
221
  },
194
222
  };
@@ -4,9 +4,9 @@
4
4
 
5
5
  /**
6
6
  * @file InternationalizationProvider.tsx
7
- * @input React, InternationalizationContext, i18n types
7
+ * @input React, InternationalizationContext, i18n types, calendar resolution
8
8
  * @output Exports InternationalizationProvider component and props type
9
- * @position Provider component for astryx i18n locale + messages
9
+ * @position Provider component for astryx i18n locale, messages, and calendar
10
10
  *
11
11
  * Wraps a subtree with a locale and (optional) additional message catalogs +
12
12
  * overrides. Astryx components inside the subtree resolve their strings via
@@ -22,6 +22,8 @@
22
22
  import {useMemo, type ReactNode} from 'react';
23
23
  import {InternationalizationContext} from './InternationalizationContext';
24
24
  import {getLocaleDirection} from './getLocaleDirection';
25
+ import {resolveCalendarSystem} from './useCalendarSystem';
26
+ import type {CalendarSystem} from '../utils/calendarSystem';
25
27
  import type {
26
28
  Locale,
27
29
  MessagesByLocale,
@@ -30,6 +32,8 @@ import type {
30
32
  } from './types';
31
33
  import {getResolve} from './resolve';
32
34
 
35
+ const PROVIDER_NAME = 'InternationalizationProvider';
36
+
33
37
  function normalizeMessages(
34
38
  messages: ProviderMessagesByLocale,
35
39
  ): MessagesByLocale {
@@ -100,6 +104,23 @@ export interface InternationalizationProviderProps {
100
104
  * in sync (e.g. `dir={getLocaleDirection(locale)}` on both).
101
105
  */
102
106
  dir?: 'ltr' | 'rtl';
107
+ /**
108
+ * The calendar system of this subtree, such as `'persian'` or `'hebrew'`.
109
+ * `Calendar` shows it, and Timestamp and PowerSearch write their dates in it.
110
+ * The date inputs show Gregorian dates. Values stay Gregorian ISO dates. When
111
+ * omitted, the calendar is Gregorian: a locale never selects it, neither by
112
+ * its default calendar nor by a `-u-ca-` keyword. A component's own
113
+ * `calendar` prop takes precedence. Calendars other than `gregory`,
114
+ * `iso8601`, `buddhist`, `roc`, and `japanese` need `Temporal`. The context
115
+ * keeps the requested calendar; where `Temporal` is missing, these components
116
+ * show Gregorian dates and warn once in development.
117
+ *
118
+ * @example
119
+ * ```
120
+ * <InternationalizationProvider locale="fa-IR" calendar="persian">
121
+ * ```
122
+ */
123
+ calendar?: CalendarSystem;
103
124
  children: ReactNode;
104
125
  }
105
126
 
@@ -112,19 +133,28 @@ export function InternationalizationProvider({
112
133
  messages,
113
134
  overrides,
114
135
  dir,
136
+ calendar: calendarProp,
115
137
  children,
116
138
  }: InternationalizationProviderProps) {
117
139
  const direction = dir ?? getLocaleDirection(locale);
140
+ const calendar = useMemo(
141
+ () =>
142
+ calendarProp != null
143
+ ? resolveCalendarSystem(calendarProp, PROVIDER_NAME)
144
+ : 'gregory',
145
+ [calendarProp],
146
+ );
118
147
  const value = useMemo(() => {
119
148
  const providedMessages = messages ?? {};
120
149
  return {
121
150
  locale,
122
151
  direction,
152
+ calendar,
123
153
  messages: normalizeMessages(providedMessages),
124
154
  overrides,
125
155
  translate: getResolve(locale, providedMessages, overrides),
126
156
  };
127
- }, [locale, direction, messages, overrides]);
157
+ }, [locale, direction, calendar, messages, overrides]);
128
158
  return (
129
159
  <InternationalizationContext value={value}>
130
160
  {children}
@@ -0,0 +1,13 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @generated by scripts/generate-i18n-runtime.mjs from packages/core/locales/en.json,
5
+ * holding the English for the catalog keys named in packages/core/src/hooks/useScrollRegionProps.ts.
6
+ * Do not edit by hand. Run `pnpm generate:i18n-runtime` instead.
7
+ */
8
+
9
+ const english: Readonly<Record<string, string>> = {
10
+ "@astryx.scrollRegion.label": "Content"
11
+ };
12
+
13
+ export default english;
@@ -375,6 +375,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
375
375
  '@astryx.banner.expand': 'Expand',
376
376
  '@astryx.button.loading': 'Loading',
377
377
  '@astryx.spinner.loading': 'Loading',
378
+ '@astryx.scrollRegion.label': 'Content',
378
379
  '@astryx.chatComposerDrawer.expand': 'Expand {label}',
379
380
  '@astryx.chatComposerDrawer.collapse': 'Collapse {label}',
380
381
  '@astryx.chatDictationButton.startDictation': 'Start dictation',
@@ -383,6 +383,7 @@ const runtimeCatalog: Readonly<Record<string, string>> = {
383
383
  '@astryx.banner.expand': '⟦Éẋþàñð⟧',
384
384
  '@astryx.button.loading': '⟦Łóàðíñĝ⟧',
385
385
  '@astryx.spinner.loading': '⟦Łóàðíñĝ⟧',
386
+ '@astryx.scrollRegion.label': '⟦Çóñţéñţ⟧',
386
387
  '@astryx.chatComposerDrawer.expand': '⟦Éẋþàñð {label}⟧',
387
388
  '@astryx.chatComposerDrawer.collapse': '⟦Çółłàþšé {label}⟧',
388
389
  '@astryx.chatDictationButton.startDictation': '⟦Šţàřţ ðíçţàţíóñ⟧',
package/src/i18n/index.ts CHANGED
@@ -15,6 +15,7 @@
15
15
  * - useDirection — hook returning the ambient text direction
16
16
  * - getLocaleDirection — server-safe locale → direction helper
17
17
  * - Translator — interface for consumer-injected runtimes
18
+ * - CalendarSystem — the calendars date components can show
18
19
  *
19
20
  * `useTranslator` and `InternationalizationContext` are the public paths
20
21
  * that resolve any Astryx key, so they register the whole English catalog.
@@ -39,6 +40,7 @@ export {useLocale} from './useLocale';
39
40
  export {useCollator} from './useCollator';
40
41
  export {useDirection} from './useDirection';
41
42
  export {getLocaleDirection} from './getLocaleDirection';
43
+ export type {CalendarSystem} from '../utils/calendarSystem';
42
44
  export type {Translator} from './translator';
43
45
  export type {
44
46
  Locale,
@@ -0,0 +1,95 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useCalendarSystem.ts
7
+ * @input InternationalizationContext, an optional component `calendar`
8
+ * @output The calendar system a date component shows, and the helpers that
9
+ * normalize a calendar identifier
10
+ * @position Internal i18n hook; read by InternationalizationProvider, date
11
+ * components, and the public calendar hooks. Not re-exported from the i18n
12
+ * barrel.
13
+ */
14
+
15
+ import {use} from 'react';
16
+ import {InternationalizationContext} from './InternationalizationContext';
17
+ import {
18
+ type CalendarSystem,
19
+ isCalendarSystem,
20
+ isCalendarSystemAvailable,
21
+ } from '../utils/calendarSystem';
22
+ import {warnOnce} from '../utils/devWarning';
23
+
24
+ /**
25
+ * Normalizes a calendar identifier. An identifier outside `CalendarSystem`
26
+ * resolves to `gregory` and warns once in development.
27
+ */
28
+ export function resolveCalendarSystem(
29
+ id: string,
30
+ source: string,
31
+ ): CalendarSystem {
32
+ if (isCalendarSystem(id)) {
33
+ return id;
34
+ }
35
+ warnOnce(
36
+ `calendar-unsupported:${id}`,
37
+ source,
38
+ `The calendar "${id}" is not supported; showing Gregorian dates.`,
39
+ );
40
+ return 'gregory';
41
+ }
42
+
43
+ /**
44
+ * A calendar this runtime can show, else `gregory`. Calendars outside the
45
+ * Gregorian-aligned set need a `Temporal` that supports them. The fallback
46
+ * warns once for each calendar, on the server and in the browser.
47
+ */
48
+ function availableCalendarOrGregorian(
49
+ calendar: CalendarSystem,
50
+ source: string,
51
+ ): CalendarSystem {
52
+ if (isCalendarSystemAvailable(calendar)) {
53
+ return calendar;
54
+ }
55
+ warnOnce(
56
+ `calendar-unavailable:${calendar}`,
57
+ source,
58
+ `The "${calendar}" calendar needs a Temporal that supports it, and this ` +
59
+ 'runtime has none; showing Gregorian dates. Load a Temporal polyfill ' +
60
+ "with every calendar, such as 'temporal-polyfill/full/global', on the " +
61
+ 'server and in the browser.',
62
+ );
63
+ return 'gregory';
64
+ }
65
+
66
+ /**
67
+ * The calendar that a caller names, without the provider: an unknown
68
+ * identifier, or one this runtime cannot show, becomes `gregory` and warns
69
+ * once in development.
70
+ */
71
+ export function resolveShownCalendar(
72
+ calendar: string,
73
+ source: string,
74
+ ): CalendarSystem {
75
+ return availableCalendarOrGregorian(
76
+ resolveCalendarSystem(calendar, source),
77
+ source,
78
+ );
79
+ }
80
+
81
+ /**
82
+ * The calendar a date component shows: its own `calendar`, else the
83
+ * provider's resolved calendar, else `gregory`. It resolves during render, so
84
+ * the server and the browser agree when both have `Temporal` or both lack it.
85
+ */
86
+ export function useCalendarSystem(
87
+ calendar: CalendarSystem | undefined,
88
+ source: string,
89
+ ): CalendarSystem {
90
+ const context = use(InternationalizationContext);
91
+ return resolveShownCalendar(
92
+ calendar ?? context.calendar ?? 'gregory',
93
+ source,
94
+ );
95
+ }
@@ -0,0 +1,20 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ /**
3
+ * @file spinner-rotor.ts
4
+ * @input Spinner's shared rotor
5
+ * @output `@astryxdesign/core/internal/spinner-rotor`: SPINNER_ARC_FRACTION,
6
+ * spinnerRotorStyles and syncRotationPhase, re-exported by name for Lab's
7
+ * indeterminate CircularProgress
8
+ * @position An internal entry reserved for Astryx's own packages. It is
9
+ * undocumented, outside the public API and its compatibility promise, and
10
+ * versioned in lockstep with Core. The `@astryx/no-core-internal-import`
11
+ * lint rule allows it only in Core and Lab. Core components import the
12
+ * same modules by relative path. Named re-exports only.
13
+ *
14
+ * SYNC: When modified, update scripts/sync-exports.js.
15
+ */
16
+ export {
17
+ SPINNER_ARC_FRACTION,
18
+ spinnerRotorStyles,
19
+ syncRotationPhase,
20
+ } from '../Spinner/spinnerRotor';
@@ -2,7 +2,9 @@
2
2
 
3
3
  /**
4
4
  * @file touch.ts
5
- * @input The gesture core: the arena, the recognizers, and their geometry
5
+ * @input The gesture core: the arena, the recognizers, and their geometry;
6
+ * the pan, the motion animator and the motion math that Lab's
7
+ * useRefreshControl reads
6
8
  * @output `@astryxdesign/core/internal/touch`: the gesture core's primitives
7
9
  * for Lab components, re-exported by name
8
10
  * @position An internal entry reserved for Astryx's own packages:
@@ -39,3 +41,34 @@ export {
39
41
  export {LongPressGestureRecognizer} from '../gestures/LongPressGestureRecognizer';
40
42
  export {TapGestureRecognizer} from '../gestures/TapGestureRecognizer';
41
43
  export {DEFAULT_ENVIRONMENT} from '../gestures/types';
44
+
45
+ // Lab's useRefreshControl reads these: its pull's pan and the hook that
46
+ // starts it. It also reads the motion animator and math, and the scroll
47
+ // view's bounce spring, for its pull, settle and end. Its indicator fades
48
+ // along the settle's curve, and the motion-role parsers read the theme's
49
+ // tokens for its end.
50
+ export {PanGestureRecognizer} from '../gestures/PanGestureRecognizer';
51
+ export type {PanGestureRecognizerOptions} from '../gestures/PanGestureRecognizer';
52
+ export type {
53
+ GestureEventContext,
54
+ GestureTouch,
55
+ PointerKind,
56
+ } from '../gestures/types';
57
+ export {useGestureRecognizer} from '../gestures/useGestureRecognizer';
58
+ // The animator's internal factory. The public one, `createAnimator`, plays
59
+ // only the theme's state-change motion.
60
+ export {createMotionAnimator} from '../motion/animator';
61
+ export type {
62
+ Animator as MotionAnimator,
63
+ AnimatorOptions as MotionAnimatorOptions,
64
+ MotionCurve,
65
+ } from '../motion/animator';
66
+ export {cubicBezier} from '../motion/bezier';
67
+ export {mapProgress} from '../motion/progress';
68
+ export {parseCssEasing, parseMotionRoleValue} from '../motion/roles';
69
+ export {
70
+ rubberBand,
71
+ rubberBandInverse,
72
+ rubberBandSlope,
73
+ } from '../motion/rubberBand';
74
+ export {scroll} from '../motion/uikit/scroll';
@@ -314,3 +314,14 @@ scroll view coasts with 0.25 × the pan's velocity plus 0.75 × its value one
314
314
  event earlier (four HID releases; `velocity.scrollReleaseWeight`, which a
315
315
  pan's `scrollVelocity()` reads). On UIKit, Reduce Motion with Prefer Cross-Fade changes
316
316
  nothing on a picker; the Wheel follows design:reduced-motion instead.
317
+
318
+ ## Menus (UIMenu)
319
+
320
+ Probe: the UIKit lab host app with a UIButton whose `UIMenu` is its primary
321
+ action (`showsMenuAsPrimaryAction`), three to twelve items, on a plain view
322
+ and inside a UIScrollView; the gesture-state, presentation-modifier,
323
+ display-link and feedback hooks; real HID touches.
324
+
325
+ | ID | Scene | Gesture | Extract | Method |
326
+ | ----- | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ------ |
327
+ | M-MN2 | button on a plain view | hold until the menu is open, then lift still; move 8 pt down, 8 pt right, 12 pt down, (7, 7), (8, 8) and lift; move 6 pt before the open and 6 pt after | row picked or not; handoff and list-selection recognizer states; highlighted row per frame: threshold, metric, where it is counted from | C |