@astryxdesign/core 0.7.5 → 0.7.6-canary.0ef60dd

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 (559) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +5 -5
  4. package/dist/Avatar/Avatar.d.ts.map +1 -1
  5. package/dist/Avatar/Avatar.js +12 -3
  6. package/dist/Badge/Badge.d.ts.map +1 -1
  7. package/dist/Badge/Badge.js +7 -1
  8. package/dist/BottomSheet/BottomSheet.js +1 -1
  9. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  10. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  11. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  12. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  13. package/dist/BottomSheet/useSheetGestures.js +30 -3
  14. package/dist/Button/Button.js +4 -4
  15. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  16. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  17. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  18. package/dist/ClickableCard/ClickableCard.js +37 -4
  19. package/dist/DateInput/DateInput.d.ts.map +1 -1
  20. package/dist/DateInput/DateInput.js +12 -4
  21. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  22. package/dist/DateInput/MonthScroller.js +101 -15
  23. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  24. package/dist/DateInput/TouchDateField.js +8 -3
  25. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  26. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  27. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  28. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  29. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  30. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  31. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  32. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  33. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  34. package/dist/Dialog/Dialog.d.ts.map +1 -1
  35. package/dist/Dialog/Dialog.js +34 -9
  36. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  37. package/dist/Dialog/DialogHeader.js +5 -4
  38. package/dist/Divider/Divider.d.ts.map +1 -1
  39. package/dist/Divider/Divider.js +2 -1
  40. package/dist/Drawer/Drawer.d.ts +1 -0
  41. package/dist/Drawer/Drawer.d.ts.map +1 -1
  42. package/dist/Drawer/Drawer.js +7 -2
  43. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  44. package/dist/DropdownMenu/DropdownMenu.js +7 -3
  45. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  46. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  47. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  48. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  49. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  50. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  51. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  52. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  53. package/dist/EmptyState/EmptyState.js +2 -1
  54. package/dist/Field/FieldLabel.d.ts +1 -1
  55. package/dist/Field/FieldLabel.d.ts.map +1 -1
  56. package/dist/Field/FieldLabel.js +4 -4
  57. package/dist/Field/InputClearButton.js +3 -3
  58. package/dist/Field/PanelSearchInput.js +2 -2
  59. package/dist/FieldStatus/FieldStatus.js +2 -2
  60. package/dist/FileInput/FileInput.d.ts.map +1 -1
  61. package/dist/FileInput/FileInput.js +7 -1
  62. package/dist/Heading/Heading.js +1 -1
  63. package/dist/Icon/Icon.js +1 -1
  64. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  65. package/dist/Indicator/CheckIndicator.js +2 -1
  66. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  67. package/dist/Indicator/CheckboxIndicator.js +3 -1
  68. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  69. package/dist/Indicator/RadioIndicator.js +3 -1
  70. package/dist/Item/Item.d.ts.map +1 -1
  71. package/dist/Item/Item.js +2 -1
  72. package/dist/Item/ItemSwipeLayer.js +1 -1
  73. package/dist/Layer/popoverOperations.d.ts +27 -0
  74. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  75. package/dist/Layer/popoverOperations.js +159 -0
  76. package/dist/Layer/useLayer.d.ts +1 -1
  77. package/dist/Layer/useLayer.d.ts.map +1 -1
  78. package/dist/Layer/useLayer.js +93 -59
  79. package/dist/Layout/Layout.js +1 -1
  80. package/dist/Layout/LayoutContent.js +1 -1
  81. package/dist/Layout/LayoutFooter.js +1 -1
  82. package/dist/Layout/LayoutHeader.js +1 -1
  83. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  84. package/dist/Lightbox/Lightbox.js +5 -0
  85. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  86. package/dist/List/List.js +1 -1
  87. package/dist/List/ListItem.js +3 -3
  88. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  89. package/dist/MobileNav/MobileNav.js +7 -2
  90. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  91. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  92. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  93. package/dist/MultiSelector/MultiSelector.js +26 -10
  94. package/dist/NumberInput/NumberInput.d.ts +3 -1
  95. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  96. package/dist/NumberInput/NumberInput.js +3 -3
  97. package/dist/NumberInput/numberParser.d.ts +3 -0
  98. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  99. package/dist/NumberInput/numberParser.js +7 -44
  100. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  101. package/dist/ProgressBar/ProgressBar.js +16 -12
  102. package/dist/Resizable/useResizable.d.ts.map +1 -1
  103. package/dist/Resizable/useResizable.js +28 -2
  104. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  105. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  106. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  107. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  108. package/dist/Selector/useSelectorPresentation.js +20 -4
  109. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  110. package/dist/Skeleton/Skeleton.js +1 -1
  111. package/dist/Slider/Slider.d.ts.map +1 -1
  112. package/dist/Slider/Slider.js +10 -2
  113. package/dist/Spinner/Spinner.d.ts.map +1 -1
  114. package/dist/Spinner/Spinner.js +3 -3
  115. package/dist/Stack/Stack.js +1 -1
  116. package/dist/Stack/StackItem.js +1 -1
  117. package/dist/TabList/TabList.d.ts.map +1 -1
  118. package/dist/TabList/TabList.js +16 -1
  119. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  120. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  121. package/dist/Text/Text.js +1 -1
  122. package/dist/Text/useTruncation.d.ts.map +1 -1
  123. package/dist/Text/useTruncation.js +23 -5
  124. package/dist/TextArea/TextArea.d.ts +1 -1
  125. package/dist/TextArea/TextArea.d.ts.map +1 -1
  126. package/dist/TextArea/TextArea.js +13 -2
  127. package/dist/TextInput/TextInput.d.ts.map +1 -1
  128. package/dist/TextInput/TextInput.js +3 -3
  129. package/dist/TimeInput/TimeInput.d.ts +6 -2
  130. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  131. package/dist/TimeInput/TimeInput.js +21 -14
  132. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  133. package/dist/TimeInput/TouchTimeField.js +5 -4
  134. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  135. package/dist/Timestamp/Timestamp.js +2 -2
  136. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  137. package/dist/Toast/Toast.d.ts.map +1 -1
  138. package/dist/Toast/Toast.js +60 -20
  139. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  140. package/dist/Toast/ToastViewport.js +82 -51
  141. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  142. package/dist/Tokenizer/Tokenizer.js +13 -2
  143. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  144. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  145. package/dist/Toolbar/Toolbar.js +2 -1
  146. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  147. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  148. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  149. package/dist/TopNav/TopNavMenu.js +1 -0
  150. package/dist/Typeahead/Typeahead.d.ts +1 -1
  151. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  152. package/dist/Typeahead/Typeahead.js +9 -1
  153. package/dist/astryx.css +20 -4
  154. package/dist/gestures/GestureArena.d.ts +6 -0
  155. package/dist/gestures/GestureArena.d.ts.map +1 -1
  156. package/dist/gestures/GestureArena.js +39 -0
  157. package/dist/gestures/GestureHost.d.ts +352 -0
  158. package/dist/gestures/GestureHost.d.ts.map +1 -0
  159. package/dist/gestures/GestureHost.js +1773 -0
  160. package/dist/gestures/GestureRecognizer.d.ts +10 -0
  161. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  162. package/dist/gestures/GestureRecognizer.js +16 -0
  163. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  164. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  165. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  166. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  167. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  168. package/dist/gestures/PanGestureRecognizer.js +3 -0
  169. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  170. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  171. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  172. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  173. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  174. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  175. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  176. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  177. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  178. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  179. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  180. package/dist/gestures/TapGestureRecognizer.js +3 -0
  181. package/dist/gestures/VelocityTracker.d.ts +6 -2
  182. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  183. package/dist/gestures/VelocityTracker.js +7 -3
  184. package/dist/gestures/haptics.d.ts +65 -0
  185. package/dist/gestures/haptics.d.ts.map +1 -0
  186. package/dist/gestures/haptics.js +182 -0
  187. package/dist/gestures/nativeScroll.d.ts +42 -0
  188. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  189. package/dist/gestures/nativeScroll.js +228 -0
  190. package/dist/gestures/touchAction.d.ts +60 -0
  191. package/dist/gestures/touchAction.d.ts.map +1 -0
  192. package/dist/gestures/touchAction.js +157 -0
  193. package/dist/gestures/touchActionRule.d.ts +34 -0
  194. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  195. package/dist/gestures/touchActionRule.js +140 -0
  196. package/dist/gestures/types.d.ts +18 -7
  197. package/dist/gestures/types.d.ts.map +1 -1
  198. package/dist/gestures/types.js +22 -2
  199. package/dist/hooks/index.d.ts +1 -1
  200. package/dist/hooks/index.d.ts.map +1 -1
  201. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  202. package/dist/hooks/modalAnnounce.js +107 -61
  203. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  204. package/dist/hooks/useAdaptivePresentation.js +4 -1
  205. package/dist/hooks/useAnnounce.d.ts +101 -42
  206. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  207. package/dist/hooks/useAnnounce.js +161 -75
  208. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  209. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  210. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  211. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  212. package/dist/hooks/useBusyAnnouncement.js +6 -12
  213. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  214. package/dist/hooks/useMenuHover.js +12 -1
  215. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  216. package/dist/i18n/generated-locales/en.generated.js +5 -0
  217. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  218. package/dist/i18n/generated-locales/pseudo.generated.js +5 -0
  219. package/dist/motion/animator.d.ts +7 -1
  220. package/dist/motion/animator.d.ts.map +1 -1
  221. package/dist/motion/animator.js +119 -27
  222. package/dist/theme/defineTheme.d.ts +19 -5
  223. package/dist/theme/defineTheme.d.ts.map +1 -1
  224. package/dist/theme/defineTheme.js +64 -4
  225. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  226. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  227. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  228. package/dist/theme/domainTokens/index.d.ts +5 -4
  229. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  230. package/dist/theme/domainTokens/index.js +5 -9
  231. package/dist/theme/index.d.ts +1 -0
  232. package/dist/theme/index.d.ts.map +1 -1
  233. package/dist/theme/motionKnobs.d.ts +56 -0
  234. package/dist/theme/motionKnobs.d.ts.map +1 -0
  235. package/dist/theme/motionKnobs.js +48 -0
  236. package/dist/theme/resolveThemeValues.d.ts +11 -4
  237. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  238. package/dist/theme/resolveThemeValues.js +40 -4
  239. package/dist/theme/themeAdaptations.d.ts +7 -3
  240. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  241. package/dist/theme/themeAdaptations.js +36 -7
  242. package/dist/theme/themeMotion.d.ts +96 -0
  243. package/dist/theme/themeMotion.d.ts.map +1 -0
  244. package/dist/theme/themeMotion.js +177 -0
  245. package/dist/theme/tokenReferences.d.ts +31 -0
  246. package/dist/theme/tokenReferences.d.ts.map +1 -0
  247. package/dist/theme/tokenReferences.js +132 -0
  248. package/dist/theme/tokens.d.ts +1 -0
  249. package/dist/theme/tokens.d.ts.map +1 -1
  250. package/dist/theme/tokens.js +9 -129
  251. package/dist/theme/tokens.stylex.d.ts +12 -0
  252. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  253. package/dist/theme/tokens.stylex.js +12 -0
  254. package/dist/utils/focusReturn.d.ts +17 -1
  255. package/dist/utils/focusReturn.d.ts.map +1 -1
  256. package/dist/utils/focusReturn.js +11 -4
  257. package/dist/utils/getNodeText.d.ts +8 -0
  258. package/dist/utils/getNodeText.d.ts.map +1 -0
  259. package/dist/utils/getNodeText.js +37 -0
  260. package/dist/utils/interactionModality.d.ts +11 -2
  261. package/dist/utils/interactionModality.d.ts.map +1 -1
  262. package/dist/utils/interactionModality.js +58 -5
  263. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  264. package/dist/utils/interactionOverlay.stylex.js +17 -8
  265. package/dist/utils/plainDate.d.ts +2 -0
  266. package/dist/utils/plainDate.d.ts.map +1 -1
  267. package/dist/utils/plainDate.js +46 -3
  268. package/dist/utils/presentation.d.ts +50 -0
  269. package/dist/utils/presentation.d.ts.map +1 -0
  270. package/dist/utils/presentation.js +125 -0
  271. package/dist/utils/pressFeedback.d.ts.map +1 -1
  272. package/dist/utils/pressFeedback.js +20 -1
  273. package/dist/utils/primaryClick.d.ts +11 -0
  274. package/dist/utils/primaryClick.d.ts.map +1 -0
  275. package/dist/utils/primaryClick.js +25 -0
  276. package/dist/utils/timeFormat.d.ts +47 -0
  277. package/dist/utils/timeFormat.d.ts.map +1 -0
  278. package/dist/utils/timeFormat.js +240 -0
  279. package/dist/utils/touchPresentation.d.ts.map +1 -1
  280. package/dist/utils/touchPresentation.js +5 -3
  281. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  282. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  283. package/dist/utils/touchPresentation.stylex.js +33 -0
  284. package/dist/utils/unicodeDigits.d.ts +20 -0
  285. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  286. package/dist/utils/unicodeDigits.js +70 -0
  287. package/locales/en.json +23 -3
  288. package/locales/pseudo.json +15 -0
  289. package/package.json +5 -4
  290. package/src/AlertDialog/AlertDialog.tsx +6 -5
  291. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  292. package/src/Avatar/Avatar.spec.md +22 -22
  293. package/src/Avatar/Avatar.tsx +18 -1
  294. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  295. package/src/Badge/Badge.doc.mjs +1 -1
  296. package/src/Badge/Badge.tsx +19 -2
  297. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  298. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  299. package/src/BottomSheet/BottomSheet.tsx +1 -1
  300. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  301. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  302. package/src/BottomSheet/useSheetGestures.ts +37 -6
  303. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  304. package/src/Button/Button.tsx +4 -4
  305. package/src/Calendar/Calendar.spec.md +87 -48
  306. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  307. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  308. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  309. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  310. package/src/ClickableCard/ClickableCard.tsx +48 -4
  311. package/src/Collapsible/Collapsible.spec.md +2 -0
  312. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  313. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  314. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  315. package/src/ComplexSelector/ComplexSelector.test.tsx +37 -0
  316. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  317. package/src/DateInput/DateInput.test.tsx +115 -3
  318. package/src/DateInput/DateInput.tsx +29 -14
  319. package/src/DateInput/DateInputTouch.test.tsx +76 -0
  320. package/src/DateInput/MonthScroller.tsx +106 -20
  321. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  322. package/src/DateInput/TouchDateField.tsx +14 -3
  323. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  324. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  325. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  326. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  327. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  328. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  329. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  330. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  331. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  332. package/src/Dialog/Dialog.test.tsx +216 -2
  333. package/src/Dialog/Dialog.tsx +42 -9
  334. package/src/Dialog/DialogHeader.tsx +5 -4
  335. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  336. package/src/Divider/Divider.tsx +2 -1
  337. package/src/Drawer/Drawer.spec.md +111 -80
  338. package/src/Drawer/Drawer.test.tsx +35 -0
  339. package/src/Drawer/Drawer.tsx +13 -2
  340. package/src/Drawer/DrawerHeader.spec.md +181 -0
  341. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  342. package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
  343. package/src/DropdownMenu/DropdownMenu.tsx +10 -3
  344. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  345. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  346. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  347. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  348. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  349. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  350. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  351. package/src/EmptyState/EmptyState.tsx +2 -1
  352. package/src/Field/FieldLabel.tsx +5 -4
  353. package/src/Field/InputClearButton.tsx +3 -3
  354. package/src/Field/PanelSearchInput.tsx +2 -2
  355. package/src/FieldStatus/FieldStatus.tsx +2 -2
  356. package/src/FileInput/FileInput.test.tsx +21 -0
  357. package/src/FileInput/FileInput.tsx +4 -1
  358. package/src/FormLayout/FormLayout.spec.md +7 -8
  359. package/src/Heading/Heading.tsx +1 -1
  360. package/src/Icon/Icon.tsx +1 -1
  361. package/src/Indicator/CheckIndicator.spec.md +47 -42
  362. package/src/Indicator/CheckIndicator.tsx +2 -1
  363. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  364. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  365. package/src/Indicator/Indicator.spec.md +188 -0
  366. package/src/Indicator/RadioIndicator.tsx +3 -1
  367. package/src/Item/Item.tsx +2 -1
  368. package/src/Item/ItemSwipeLayer.tsx +1 -1
  369. package/src/Kbd/Kbd.spec.md +81 -38
  370. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  371. package/src/Layer/popoverOperations.test.ts +205 -0
  372. package/src/Layer/popoverOperations.ts +172 -0
  373. package/src/Layer/useLayer.test.tsx +348 -1
  374. package/src/Layer/useLayer.tsx +118 -71
  375. package/src/Layout/Layout.spec.md +127 -131
  376. package/src/Layout/Layout.tsx +1 -1
  377. package/src/Layout/LayoutContent.spec.md +205 -0
  378. package/src/Layout/LayoutContent.tsx +1 -1
  379. package/src/Layout/LayoutFooter.spec.md +190 -0
  380. package/src/Layout/LayoutFooter.tsx +1 -1
  381. package/src/Layout/LayoutHeader.spec.md +193 -0
  382. package/src/Layout/LayoutHeader.tsx +1 -1
  383. package/src/Layout/LayoutPanel.spec.md +194 -0
  384. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  385. package/src/Lightbox/Lightbox.test.tsx +18 -0
  386. package/src/Lightbox/Lightbox.tsx +5 -0
  387. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  388. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  389. package/src/List/List.tsx +1 -1
  390. package/src/List/ListItem.spec.md +205 -0
  391. package/src/List/ListItem.tsx +3 -3
  392. package/src/MetadataList/MetadataList.spec.md +187 -0
  393. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  394. package/src/MobileNav/MobileNav.test.tsx +15 -0
  395. package/src/MobileNav/MobileNav.tsx +9 -1
  396. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  397. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  398. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  399. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  400. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  401. package/src/MultiSelector/MultiSelector.tsx +25 -10
  402. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  403. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  404. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  405. package/src/NumberInput/NumberInput.spec.md +59 -37
  406. package/src/NumberInput/NumberInput.tsx +13 -3
  407. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  408. package/src/NumberInput/numberParser.ts +7 -45
  409. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  410. package/src/ProgressBar/ProgressBar.tsx +58 -10
  411. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  412. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  413. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  414. package/src/Resizable/useResizable.test.ts +43 -0
  415. package/src/Resizable/useResizable.ts +32 -9
  416. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  417. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  418. package/src/Selector/Selector.test.tsx +90 -1
  419. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  420. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  421. package/src/Selector/useSelectorPresentation.ts +31 -3
  422. package/src/SideNav/SideNav.test.tsx +27 -0
  423. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  424. package/src/Skeleton/Skeleton.tsx +3 -1
  425. package/src/Slider/Slider.test.tsx +31 -0
  426. package/src/Slider/Slider.tsx +8 -3
  427. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  428. package/src/Spinner/Spinner.tsx +5 -3
  429. package/src/Stack/Stack.tsx +1 -1
  430. package/src/Stack/StackItem.tsx +1 -1
  431. package/src/TabList/TabList.test.tsx +58 -4
  432. package/src/TabList/TabList.tsx +16 -1
  433. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  434. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  435. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  436. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  437. package/src/Text/Text.tsx +1 -1
  438. package/src/Text/useTruncation.test.tsx +128 -1
  439. package/src/Text/useTruncation.ts +23 -5
  440. package/src/TextArea/TextArea.spec.md +10 -13
  441. package/src/TextArea/TextArea.test.tsx +60 -0
  442. package/src/TextArea/TextArea.tsx +15 -1
  443. package/src/TextInput/TextInput.test.tsx +21 -0
  444. package/src/TextInput/TextInput.tsx +3 -1
  445. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  446. package/src/TimeInput/Presentation.test.tsx +21 -0
  447. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  448. package/src/TimeInput/TimeInput.spec.md +45 -48
  449. package/src/TimeInput/TimeInput.test.tsx +76 -0
  450. package/src/TimeInput/TimeInput.tsx +36 -18
  451. package/src/TimeInput/TouchTimeField.tsx +4 -6
  452. package/src/Timestamp/Timestamp.spec.md +6 -12
  453. package/src/Timestamp/Timestamp.test.tsx +30 -5
  454. package/src/Timestamp/Timestamp.tsx +6 -2
  455. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  456. package/src/Toast/Toast.spec.md +14 -20
  457. package/src/Toast/Toast.tsx +104 -36
  458. package/src/Toast/ToastViewport.test.tsx +719 -1
  459. package/src/Toast/ToastViewport.tsx +100 -50
  460. package/src/Tokenizer/Tokenizer.spec.md +5 -3
  461. package/src/Tokenizer/Tokenizer.test.tsx +68 -0
  462. package/src/Tokenizer/Tokenizer.tsx +14 -2
  463. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
  464. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  465. package/src/Toolbar/Toolbar.spec.md +5 -6
  466. package/src/Toolbar/Toolbar.test.tsx +30 -0
  467. package/src/Toolbar/Toolbar.tsx +2 -1
  468. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  469. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  470. package/src/TopNav/TopNav.test.tsx +27 -0
  471. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  472. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  473. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  474. package/src/TopNav/TopNavMenu.tsx +1 -0
  475. package/src/Typeahead/Typeahead.test.tsx +40 -0
  476. package/src/Typeahead/Typeahead.tsx +12 -1
  477. package/src/__tests__/pressState.ts +8 -4
  478. package/src/gestures/GestureArena.ts +35 -0
  479. package/src/gestures/GestureHost.ts +2065 -0
  480. package/src/gestures/GestureRecognizer.ts +18 -0
  481. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  482. package/src/gestures/PanGestureRecognizer.ts +4 -0
  483. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  484. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  485. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  486. package/src/gestures/TapGestureRecognizer.ts +4 -0
  487. package/src/gestures/VelocityTracker.ts +10 -3
  488. package/src/gestures/__tests__/GestureHost.test.ts +2087 -0
  489. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  490. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  491. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  492. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  493. package/src/gestures/__tests__/arena.test.ts +5 -0
  494. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  495. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  496. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  497. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  498. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  499. package/src/gestures/__tests__/haptics.test.ts +187 -0
  500. package/src/gestures/__tests__/harness.ts +21 -2
  501. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  502. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  503. package/src/gestures/haptics.ts +203 -0
  504. package/src/gestures/nativeScroll.ts +277 -0
  505. package/src/gestures/touchAction.ts +191 -0
  506. package/src/gestures/touchActionRule.ts +157 -0
  507. package/src/gestures/types.ts +30 -9
  508. package/src/hooks/index.ts +5 -1
  509. package/src/hooks/modalAnnounce.ts +129 -72
  510. package/src/hooks/useAdaptivePresentation.ts +4 -1
  511. package/src/hooks/useAnnounce.doc.mjs +35 -3
  512. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  513. package/src/hooks/useAnnounce.ts +209 -102
  514. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  515. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  516. package/src/hooks/useBusyAnnouncement.ts +7 -10
  517. package/src/hooks/useMenuHover.ts +15 -1
  518. package/src/i18n/generated-locales/en.generated.ts +6 -0
  519. package/src/i18n/generated-locales/pseudo.generated.ts +6 -0
  520. package/src/motion/README.md +11 -1
  521. package/src/motion/animator.test.ts +151 -3
  522. package/src/motion/animator.ts +149 -33
  523. package/src/theme/Theme.doc.mjs +1 -1
  524. package/src/theme/defineTheme.ts +117 -8
  525. package/src/theme/derivedVarRegistry.test.ts +4 -0
  526. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  527. package/src/theme/domainTokens/index.ts +6 -10
  528. package/src/theme/expandMotionScale.test.ts +1 -1
  529. package/src/theme/index.ts +5 -0
  530. package/src/theme/motionKnobs.ts +82 -0
  531. package/src/theme/resolveThemeValues.ts +68 -6
  532. package/src/theme/themeAdaptations.ts +52 -12
  533. package/src/theme/themeMotion.test.ts +620 -0
  534. package/src/theme/themeMotion.ts +221 -0
  535. package/src/theme/tokenReferences.ts +149 -0
  536. package/src/theme/tokens.stylex.ts +10 -0
  537. package/src/theme/tokens.ts +15 -158
  538. package/src/utils/focusReturn.ts +17 -6
  539. package/src/utils/getNodeText.test.ts +24 -0
  540. package/src/utils/getNodeText.ts +37 -0
  541. package/src/utils/interactionModality.test.ts +45 -1
  542. package/src/utils/interactionModality.ts +64 -5
  543. package/src/utils/interactionOverlay.stylex.ts +12 -3
  544. package/src/utils/plainDate.test.ts +90 -0
  545. package/src/utils/plainDate.ts +58 -3
  546. package/src/utils/presentation.test.ts +380 -0
  547. package/src/utils/presentation.ts +180 -0
  548. package/src/utils/pressFeedback.test.ts +138 -0
  549. package/src/utils/pressFeedback.ts +34 -11
  550. package/src/utils/pressPaintPriority.test.ts +80 -0
  551. package/src/utils/primaryClick.test.ts +38 -0
  552. package/src/utils/primaryClick.ts +28 -0
  553. package/src/utils/timeFormat.test.ts +204 -0
  554. package/src/utils/timeFormat.ts +314 -0
  555. package/src/utils/touchPresentation.stylex.ts +43 -0
  556. package/src/utils/touchPresentation.test.ts +140 -1
  557. package/src/utils/touchPresentation.ts +5 -3
  558. package/src/utils/unicodeDigits.test.ts +44 -0
  559. package/src/utils/unicodeDigits.ts +71 -0
@@ -118,6 +118,7 @@ import {
118
118
  typeScaleDefaults,
119
119
  } from './tokens.stylex';
120
120
  import type {MotionScaleConfig} from './expandMotionScale';
121
+ import type {ThemeMotionConfig} from './themeMotion';
121
122
  import type {RadiusScaleConfig} from './expandRadiusScale';
122
123
  import type {ColorScaleConfig} from './expandColorScale';
123
124
  import {resolveThemeValues, type ThemeValuesInput} from './resolveThemeValues';
@@ -132,7 +133,7 @@ import {
132
133
  } from './themeAdaptations';
133
134
 
134
135
  import type {DomainTokenName} from './domainTokens';
135
- import {domainTokenDefaults} from './domainTokens';
136
+ import {domainTokenDefaults} from './domainTokens/domainTokenDefaults';
136
137
  import type {SyntaxThemeDefinition} from './syntax';
137
138
  import {registerTheme} from './themeRegistry';
138
139
  import {resolveLocalTokenContract} from './localTokens';
@@ -290,13 +291,27 @@ export interface DefineThemeInput<
290
291
  */
291
292
  typography?: TypographyConfig;
292
293
  /**
293
- * Motion configuration. Computes duration min/max variants from
294
- * base values and a scaling ratio: min = base × ratio, max = base / ratio.
294
+ * Motion configuration: two knobs (spec:AST-108), a motion scale, or both.
295
295
  *
296
- * Explicit `tokens` overrides take precedence over motion-generated values.
296
+ * - `tempo` (default 1, clamped to 0.75–1.5) scales every motion duration
297
+ * token; touch motion's springs don't read it yet.
298
+ * - `character` (`'crisp'`, `'standard'` or `'expressive'`) sets the
299
+ * entrance and move curves; exits and fades never overshoot.
300
+ *
301
+ * Every theme follows each person's Reduce Motion setting; nothing loosens it.
302
+ *
303
+ * A motion scale computes duration min/max variants from base values and a
304
+ * ratio (min = base × ratio, max = base / ratio); its durations win over
305
+ * `tempo`, and explicit `tokens` overrides win over both. Finger tracking,
306
+ * momentum, the keyboard, hover, the press's onset delay and tap flash, and
307
+ * busy loops never follow the knobs; the press release fade follows
308
+ * `tempo`.
297
309
  *
298
310
  * @example
299
311
  * ```
312
+ * motion: { tempo: 1.2, character: 'crisp' }
313
+ *
314
+ * // A motion scale, as before:
300
315
  * motion: { fast: 175, medium: 410, slow: 975, ratio: 0.75 }
301
316
  *
302
317
  * // Suggested starting points:
@@ -305,7 +320,7 @@ export interface DefineThemeInput<
305
320
  * // Cinematic: { fast: 200, medium: 500, slow: 1200, ratio: 0.7 }
306
321
  * ```
307
322
  */
308
- motion?: MotionScaleConfig;
323
+ motion?: ThemeMotionConfig;
309
324
  /**
310
325
  * Radius configuration. Generates radius token overrides
311
326
  * from a base unit and multiplier.
@@ -648,6 +663,73 @@ function describeBadBase(value: unknown): string {
648
663
  return `an object with keys [${keys.slice(0, 4).join(', ')}${keys.length > 4 ? ', …' : ''}]`;
649
664
  }
650
665
 
666
+ /** The slow band's duration tokens. */
667
+ const SLOW_BAND = [
668
+ '--duration-slow-min',
669
+ '--duration-slow',
670
+ '--duration-slow-max',
671
+ ] as const;
672
+
673
+ /**
674
+ * The base's tokens for the duration-scale fields a child leaves unset
675
+ * (spec:AST-108 FR5, field by field): a child that sets no `slow` of its own
676
+ * regenerates only the fast and medium bands, so an inherited slow band stays
677
+ * as the base's tokens hold it, at the ratio it was made with; and a child
678
+ * that sets no `easing` keeps the base's `--ease-standard`, an explicit one
679
+ * included, however many themes down either is inherited.
680
+ */
681
+ function inheritedScaleTokens(
682
+ base: DefinedTheme,
683
+ baseMotion: ThemeMotionConfig,
684
+ own: ThemeMotionConfig,
685
+ ): Partial<Record<string, TokenValue>> | undefined {
686
+ const names = [
687
+ ...('slow' in baseMotion && !('slow' in own) ? SLOW_BAND : []),
688
+ ...('easing' in baseMotion && !('easing' in own)
689
+ ? (['--ease-standard'] as const)
690
+ : []),
691
+ ];
692
+ if (names.length === 0) {
693
+ return undefined;
694
+ }
695
+ const tokens = base.tokens as Record<string, string | undefined>;
696
+ return Object.fromEntries(
697
+ names.flatMap(name =>
698
+ tokens[name] !== undefined ? [[name, tokens[name]]] : [],
699
+ ),
700
+ );
701
+ }
702
+
703
+ /**
704
+ * Refuses a duration scale that is missing `fast`, `medium` or `ratio` after
705
+ * inheritance. The scale applies only when all three are present, so a partial
706
+ * one beside a knob (`{fast: 100, tempo: 1.2}`) would otherwise be dropped
707
+ * silently, though its fields win over `tempo` (spec:AST-108 FR5). Adaptation
708
+ * rules refuse the same in `completeMotion`.
709
+ */
710
+ function assertCompleteMotionScale(
711
+ motion: ThemeMotionConfig,
712
+ themeName: string,
713
+ ): void {
714
+ const scale = motion as Partial<MotionScaleConfig>;
715
+ const writesScale =
716
+ scale.fast !== undefined ||
717
+ scale.medium !== undefined ||
718
+ scale.ratio !== undefined ||
719
+ scale.slow !== undefined ||
720
+ scale.easing !== undefined;
721
+ if (
722
+ writesScale &&
723
+ (scale.fast === undefined ||
724
+ scale.medium === undefined ||
725
+ scale.ratio === undefined)
726
+ ) {
727
+ throw new Error(
728
+ `defineTheme("${themeName}"): \`motion\` sets a duration scale field, so it must supply \`fast\`, \`medium\`, and \`ratio\` unless each missing field is inherited from \`extends\`.`,
729
+ );
730
+ }
731
+ }
732
+
651
733
  /**
652
734
  * Create an Astryx theme.
653
735
  *
@@ -682,13 +764,36 @@ export function defineTheme<
682
764
  // The theme's own value axes and the resolved base an `extends` supplies.
683
765
  // The same axis metadata is retained so adaptation rules can complete partial
684
766
  // configs without approximating values from unrelated built-in defaults.
767
+ //
768
+ // Motion inherits field by field (spec:AST-108 FR5): a duration-scale field
769
+ // or knob the child leaves unset keeps its base's value, so the child's
770
+ // motion tokens come from the merged configuration. They resolve base first,
771
+ // then generated (`architecture:theme-authoring-contract`): what the child
772
+ // generates replaces the base's tokens, its explicit ones included. A
773
+ // child's motion regenerates only what it sets: an inherited slow band and
774
+ // an inherited easing keep the base's tokens.
775
+ const baseMotion = base?.__axes?.motion;
776
+ const motion: ThemeMotionConfig | undefined =
777
+ input.motion != null && baseMotion != null
778
+ ? {...baseMotion, ...input.motion}
779
+ : input.motion;
780
+ if (motion != null) {
781
+ assertCompleteMotionScale(motion, input.name);
782
+ }
783
+ const inheritedScale =
784
+ input.motion != null && base != null && baseMotion != null
785
+ ? inheritedScaleTokens(base, baseMotion, input.motion)
786
+ : undefined;
685
787
  const ownValues: ThemeValuesInput = {
686
788
  typography: input.typography,
687
789
  color: input.color,
688
790
  radius: input.radius,
689
- motion: input.motion,
791
+ motion,
690
792
  syntax: input.syntax,
691
- tokens: input.tokens,
793
+ tokens:
794
+ inheritedScale != null && Object.keys(inheritedScale).length > 0
795
+ ? {...inheritedScale, ...input.tokens}
796
+ : input.tokens,
692
797
  components: input.components,
693
798
  };
694
799
  const ownAxes: ThemeGenerativeAxes = {
@@ -701,7 +806,11 @@ export function defineTheme<
701
806
  ? {tokens: base.tokens, components: base.components}
702
807
  : undefined;
703
808
 
704
- const {tokens, components} = resolveThemeValues(ownValues, seed);
809
+ // An explicit --ease-standard follows the character the theme inherits
810
+ // when it sets no motion of its own (FR2).
811
+ const {tokens, components} = resolveThemeValues(ownValues, seed, {
812
+ inheritedCharacter: baseMotion?.character,
813
+ });
705
814
 
706
815
  // On-media token overrides (base's resolved surface, then defaults, then
707
816
  // this theme's own overrides). They compile after adaptations so the
@@ -106,6 +106,10 @@ const STRUCTURAL_VARS = new Set([
106
106
  // authored by a theme.
107
107
  '--_layout-flush-block-start',
108
108
  '--_layout-flush-block-end',
109
+ // ProgressBar's filled share of the track, written inline from `value` on
110
+ // every render and read by the fill's transform. Runtime state, never
111
+ // authored by a theme.
112
+ '--_progress-bar-fill',
109
113
  ]);
110
114
 
111
115
  /**
@@ -0,0 +1,19 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file domainTokens/domainTokenDefaults.ts
5
+ * @input syntaxTokenDefaults, dataTokenDefaults
6
+ * @output domainTokenDefaults
7
+ * @position Merges the domain token defaults for defineTheme. Kept out of the
8
+ * domainTokens barrel because defineTheme sits in a lazily imported module
9
+ * graph, which imports no barrel (pinned by scripts/core-single-bundle.test.mjs).
10
+ */
11
+
12
+ import {syntaxTokenDefaults} from '../syntax/tokens';
13
+ import {dataTokenDefaults} from './dataTokens';
14
+
15
+ /** All domain token defaults merged — used by defineTheme for validation */
16
+ export const domainTokenDefaults: Record<string, string> = {
17
+ ...syntaxTokenDefaults,
18
+ ...dataTokenDefaults,
19
+ };
@@ -6,8 +6,10 @@
6
6
  * @output domainTokenDefaults, DomainTokenName
7
7
  * @position Token aggregator; consumed by defineTheme for validation + autocomplete
8
8
  *
9
- * Merges all domain token defaults into a single map for defineTheme.
10
- * Actual token definitions live in their own directories (syntax/, dataviz/).
9
+ * Re-exports only. The merged map lives in domainTokenDefaults.ts so that
10
+ * defineTheme, inside a lazily imported module graph, imports it without a
11
+ * barrel. Actual token definitions live in their own directories (syntax/,
12
+ * dataviz/).
11
13
  */
12
14
 
13
15
  export {syntaxTokenDefaults} from '../syntax/tokens';
@@ -16,16 +18,10 @@ export type {SyntaxTokenName} from '../syntax/tokens';
16
18
  export {dataTokenDefaults} from './dataTokens';
17
19
  export type {DataTokenName} from './dataTokens';
18
20
 
19
- import {syntaxTokenDefaults} from '../syntax/tokens';
20
- import {dataTokenDefaults} from './dataTokens';
21
+ export {domainTokenDefaults} from './domainTokenDefaults';
22
+
21
23
  import type {SyntaxTokenName} from '../syntax/tokens';
22
24
  import type {DataTokenName} from './dataTokens';
23
25
 
24
- /** All domain token defaults merged — used by defineTheme for validation */
25
- export const domainTokenDefaults: Record<string, string> = {
26
- ...syntaxTokenDefaults,
27
- ...dataTokenDefaults,
28
- };
29
-
30
26
  /** Union of all domain token names */
31
27
  export type DomainTokenName = SyntaxTokenName | DataTokenName;
@@ -139,7 +139,7 @@ describe('touch motion stays internal', () => {
139
139
  fs.readFileSync(path.resolve(__dirname, file), 'utf8');
140
140
  expect(read('../index.ts')).not.toMatch(/from '\.\/motion/);
141
141
  expect(read('./index.ts')).not.toMatch(
142
- /expandMotionRoles|motionScaleOf|MotionConfig|MotionRoleValues|MotionCurvePoints|registerMotionTable|motion\/role/,
142
+ /expandMotionRoles|motionScaleOf|\bMotionConfig\b|MotionRoleValues|MotionCurvePoints|registerMotionTable|motion\/role/,
143
143
  );
144
144
  });
145
145
  });
@@ -104,6 +104,11 @@ export type {ColorScaleConfig, ColorScaleTokens} from './expandColorScale';
104
104
 
105
105
  export {expandMotionScale} from './expandMotionScale';
106
106
  export type {MotionScaleConfig, MotionScaleTokens} from './expandMotionScale';
107
+ export type {
108
+ MotionCharacter,
109
+ ThemeMotionConfig,
110
+ ThemeMotionKnobs,
111
+ } from './themeMotion';
107
112
 
108
113
  // Export token defaults and vars for use in custom components and themes
109
114
  export {
@@ -0,0 +1,82 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file motionKnobs.ts
5
+ * @input A theme's motion knobs (`tempo`, `character`)
6
+ * @output Their types and `resolveMotionKnobs`, which fills in the defaults
7
+ * and clamps `tempo` (`spec:AST-108` FR1). `reducedMotion` is not a public
8
+ * knob until `'always'` ships: every theme resolves to `'system'`
9
+ * @position Theme utility with no imports: themeMotion.ts builds the motion
10
+ * tokens on it, and the motion foundation reads a theme's knobs through it
11
+ * without loading the token stylesheet. Pure; safe on the server and in
12
+ * plain Node.
13
+ *
14
+ * SYNC: When modified, update:
15
+ * - /packages/core/src/theme/themeMotion.ts (re-exports these)
16
+ * - /packages/core/src/theme/themeMotion.test.ts
17
+ */
18
+
19
+ /** How lively a theme's motion feels. */
20
+ export type MotionCharacter = 'crisp' | 'standard' | 'expressive';
21
+
22
+ /**
23
+ * Whose Reduce Motion setting a theme follows: `'system'`, each person's own.
24
+ * Internal: no theme sets it until `'always'` ships (`spec:AST-108` FR6).
25
+ */
26
+ export type ThemeReducedMotion = 'system';
27
+
28
+ /** The motion knobs a theme sets (`spec:AST-108` FR1). */
29
+ export interface ThemeMotionKnobs {
30
+ /**
31
+ * Scales every motion duration: 1 is Astryx's own, 0.75 the quickest and
32
+ * 1.5 the slowest (values outside are clamped). Default 1.
33
+ */
34
+ tempo?: number;
35
+ /**
36
+ * `'crisp'` decelerates without overshoot, `'standard'` is Astryx's own,
37
+ * `'expressive'` overshoots slightly on entrances and moves. Exits and
38
+ * fades never overshoot. Default `'standard'`.
39
+ */
40
+ character?: MotionCharacter;
41
+ }
42
+
43
+ /** The knobs with their defaults filled in and `tempo` clamped. */
44
+ export interface ResolvedMotionKnobs {
45
+ readonly tempo: number;
46
+ readonly character: MotionCharacter;
47
+ readonly reducedMotion: ThemeReducedMotion;
48
+ /**
49
+ * Whether the theme sets `tempo` itself. A `MotionScaleConfig` alone
50
+ * implies a tempo for its CSS durations only; the animator's springs stay
51
+ * at tempo 1 unless this is true (FR5).
52
+ */
53
+ readonly tempoIsSet: boolean;
54
+ }
55
+
56
+ /** The range `tempo` is clamped to. */
57
+ export const TEMPO_RANGE = {min: 0.75, max: 1.5} as const;
58
+
59
+ const CHARACTERS: ReadonlyArray<MotionCharacter> = [
60
+ 'crisp',
61
+ 'standard',
62
+ 'expressive',
63
+ ];
64
+
65
+ /** The knobs of `config`, defaults filled in, `tempo` clamped. */
66
+ export function resolveKnobs(
67
+ config: ThemeMotionKnobs | undefined,
68
+ ): ResolvedMotionKnobs {
69
+ const tempoIsSet =
70
+ typeof config?.tempo === 'number' && Number.isFinite(config.tempo);
71
+ const tempo = tempoIsSet
72
+ ? Math.min(
73
+ TEMPO_RANGE.max,
74
+ Math.max(TEMPO_RANGE.min, config.tempo as number),
75
+ )
76
+ : 1;
77
+ const character =
78
+ config?.character != null && CHARACTERS.includes(config.character)
79
+ ? config.character
80
+ : 'standard';
81
+ return {tempo, character, reducedMotion: 'system', tempoIsSet};
82
+ }
@@ -31,8 +31,14 @@ import {
31
31
  generateTypeScaleComponents,
32
32
  type TypeScaleConfig,
33
33
  } from './expandTypeScale';
34
- import {expandMotionScale, type MotionScaleConfig} from './expandMotionScale';
34
+ import {
35
+ expandThemeMotion,
36
+ preTempoName,
37
+ type MotionCharacter,
38
+ type ThemeMotionConfig,
39
+ } from './themeMotion';
35
40
  import {expandRadiusScale, type RadiusScaleConfig} from './expandRadiusScale';
41
+ import {easeDefaults} from './tokens.stylex';
36
42
  import {expandColorScale, type ColorScaleConfig} from './expandColorScale';
37
43
  import {deepMergeComponents} from './mergeComponents';
38
44
 
@@ -54,8 +60,8 @@ export interface ThemeValuesInput {
54
60
  color?: ColorScaleConfig;
55
61
  /** Radius scale configuration. */
56
62
  radius?: RadiusScaleConfig;
57
- /** Motion scale configuration. */
58
- motion?: MotionScaleConfig;
63
+ /** Motion: the three knobs, a motion scale configuration, or both. */
64
+ motion?: ThemeMotionConfig;
59
65
  /** Syntax highlighting theme. */
60
66
  syntax?: SyntaxThemeDefinition;
61
67
  /** Explicit token overrides — highest precedence. */
@@ -271,7 +277,20 @@ export function buildFontFamilyTokens(
271
277
  export function resolveThemeValues(
272
278
  input: ThemeValuesInput,
273
279
  seed?: ThemeValuesSeed,
274
- {strictTokens = false}: {strictTokens?: boolean} = {},
280
+ {
281
+ strictTokens = false,
282
+ inheritedCharacter,
283
+ standardBeneath,
284
+ }: {
285
+ strictTokens?: boolean;
286
+ /**
287
+ * The motion character in effect beneath this layer, from a base theme or
288
+ * the theme an adaptation rule belongs to, for a layer that sets none.
289
+ */
290
+ inheritedCharacter?: MotionCharacter;
291
+ /** The --ease-standard beneath a layer resolved without a seed: a rule's theme's. */
292
+ standardBeneath?: string;
293
+ } = {},
275
294
  ): ResolvedThemeValues {
276
295
  const tokens: Record<string, string> = {...seed?.tokens};
277
296
 
@@ -293,9 +312,19 @@ export function resolveThemeValues(
293
312
  Object.assign(tokens, expandRadiusScale(input.radius));
294
313
  }
295
314
 
296
- // 4. Motion-generated tokens
315
+ // 4. Motion-generated tokens (spec:AST-108 FR2, FR5). A layer that writes
316
+ // durations also writes the copies busy loops read (FR4), so an enclosing
317
+ // theme's tempo copies never stand in for its own: without a tempo of its
318
+ // own, they are its durations.
297
319
  if (input.motion) {
298
- Object.assign(tokens, expandMotionScale(input.motion));
320
+ const motion = expandThemeMotion(input.motion);
321
+ Object.assign(tokens, motion);
322
+ for (const [name, value] of Object.entries(motion)) {
323
+ const preTempo = preTempoName(name);
324
+ if (preTempo !== name && !(preTempo in motion)) {
325
+ tokens[preTempo] = value;
326
+ }
327
+ }
299
328
  }
300
329
 
301
330
  // 5. Font family tokens
@@ -314,9 +343,42 @@ export function resolveThemeValues(
314
343
  // 7. Explicit token overrides — highest precedence within this input layer.
315
344
  // A generated axis in the same root or adaptation value cannot beat them.
316
345
  if (input.tokens) {
346
+ const own = input.tokens as Partial<Record<string, TokenValue>>;
317
347
  for (const [key, value] of Object.entries(input.tokens)) {
318
348
  if (value !== undefined) {
319
349
  tokens[key] = resolveTokenValue(value, {strict: strictTokens});
350
+ // An explicit duration beats tempo, so a busy loop reading the
351
+ // pre-tempo value reads it too (spec:AST-108 FR4).
352
+ const preTempo = preTempoName(key);
353
+ if (preTempo !== key && own[preTempo] === undefined) {
354
+ tokens[preTempo] = tokens[key];
355
+ }
356
+ }
357
+ }
358
+ }
359
+
360
+ // At 'standard', --ease-entrance and --ease-move equal the resolved
361
+ // --ease-standard (spec:AST-108 FR2): the layer's own, else the one beneath
362
+ // it. A layer that sets them itself, or whose character, its own or the one
363
+ // it inherits, picks its own curve, keeps them.
364
+ const own: Partial<Record<string, TokenValue>> = input.tokens ?? {};
365
+ const ownCharacter =
366
+ input.motion != null && 'character' in input.motion
367
+ ? input.motion.character
368
+ : undefined;
369
+ const character = ownCharacter ?? inheritedCharacter;
370
+ if (
371
+ ownCharacter === 'standard' ||
372
+ (own['--ease-standard'] !== undefined &&
373
+ (character === undefined || character === 'standard'))
374
+ ) {
375
+ const standard =
376
+ tokens['--ease-standard'] ??
377
+ standardBeneath ??
378
+ easeDefaults['--ease-standard'];
379
+ for (const name of ['--ease-entrance', '--ease-move']) {
380
+ if (own[name] === undefined) {
381
+ tokens[name] = standard;
320
382
  }
321
383
  }
322
384
  }
@@ -27,6 +27,7 @@
27
27
  import type {ComponentStyleMap, TokenName, TokenValue} from './defineTheme';
28
28
  import type {TypographyConfig, TypographyRole} from './types';
29
29
  import type {MotionScaleConfig} from './expandMotionScale';
30
+ import type {ThemeMotionConfig, ThemeMotionKnobs} from './themeMotion';
30
31
  import type {RadiusScaleConfig} from './expandRadiusScale';
31
32
  import type {ColorScaleConfig} from './expandColorScale';
32
33
  import {resolveThemeValues, type ThemeValuesInput} from './resolveThemeValues';
@@ -133,8 +134,11 @@ export interface ThemeAdaptationValue {
133
134
  color?: Partial<ColorScaleConfig>;
134
135
  /** Radius axis overrides, completed from root metadata. */
135
136
  radius?: Partial<RadiusScaleConfig>;
136
- /** Motion axis overrides, completed from root metadata. */
137
- motion?: Partial<MotionScaleConfig>;
137
+ /**
138
+ * Motion axis overrides, completed from root metadata: scale fields, or the
139
+ * `tempo` and `character` knobs (spec:AST-108 FR5).
140
+ */
141
+ motion?: Partial<MotionScaleConfig> & ThemeMotionKnobs;
138
142
  /** Portable semantic-token writes. */
139
143
  tokens?: Partial<Record<TokenName, TokenValue>>;
140
144
  /** Replacements for exact theme-local names enrolled by the root lineage. */
@@ -176,7 +180,7 @@ export interface ThemeGenerativeAxes {
176
180
  typography?: TypographyConfig;
177
181
  color?: ColorScaleConfig;
178
182
  radius?: RadiusScaleConfig;
179
- motion?: MotionScaleConfig;
183
+ motion?: ThemeMotionConfig;
180
184
  }
181
185
 
182
186
  /** One rule lowered to concrete CSS writes. */
@@ -570,13 +574,41 @@ function completeRadius(
570
574
  }
571
575
 
572
576
  function completeMotion(
573
- root: MotionScaleConfig | undefined,
574
- rule: Partial<MotionScaleConfig>,
577
+ root: ThemeMotionConfig | undefined,
578
+ rule: Partial<MotionScaleConfig> & ThemeMotionKnobs,
575
579
  path: string,
576
- ): MotionScaleConfig {
577
- const fast = rule.fast ?? root?.fast;
578
- const medium = rule.medium ?? root?.medium;
579
- const ratio = rule.ratio ?? root?.ratio;
580
+ ): ThemeMotionConfig {
581
+ // Not a public field, but a plain-JS caller may still pass it.
582
+ if ((rule as {reducedMotion?: unknown}).reducedMotion !== undefined) {
583
+ throw new Error(
584
+ `${path}.reducedMotion is a theme-wide setting: set it on the theme's own ` +
585
+ `motion, not in an adaptation rule.`,
586
+ );
587
+ }
588
+ const tempo = rule.tempo ?? root?.tempo;
589
+ const character = rule.character ?? root?.character;
590
+ const knobs: ThemeMotionKnobs = {
591
+ ...(tempo !== undefined ? {tempo} : {}),
592
+ ...(character !== undefined ? {character} : {}),
593
+ };
594
+ if (knobs.tempo !== undefined) {
595
+ assertFiniteNumber(knobs.tempo, `${path}.tempo`);
596
+ }
597
+ const rootScale: Partial<MotionScaleConfig> =
598
+ root != null && 'fast' in root ? root : {};
599
+ const writesScale =
600
+ rule.fast !== undefined ||
601
+ rule.medium !== undefined ||
602
+ rule.ratio !== undefined ||
603
+ rule.slow !== undefined ||
604
+ rule.easing !== undefined;
605
+ if (!writesScale && 'fast' in rootScale === false) {
606
+ // Knobs only, over a root with no scale: the knobs generate the tokens.
607
+ return knobs;
608
+ }
609
+ const fast = rule.fast ?? rootScale.fast;
610
+ const medium = rule.medium ?? rootScale.medium;
611
+ const ratio = rule.ratio ?? rootScale.ratio;
580
612
  if (fast === undefined || medium === undefined || ratio === undefined) {
581
613
  throw new Error(
582
614
  `${path} must supply \`fast\`, \`medium\`, and \`ratio\` unless each missing field exists on the effective root motion axis.`,
@@ -585,17 +617,18 @@ function completeMotion(
585
617
  assertFiniteNumber(fast, `${path}.fast`);
586
618
  assertFiniteNumber(medium, `${path}.medium`);
587
619
  assertFiniteNumber(ratio, `${path}.ratio`);
588
- const slow = rule.slow ?? root?.slow;
620
+ const slow = rule.slow ?? rootScale.slow;
589
621
  if (slow !== undefined) {
590
622
  assertFiniteNumber(slow, `${path}.slow`);
591
623
  }
592
- const easing = rule.easing ?? root?.easing;
624
+ const easing = rule.easing ?? rootScale.easing;
593
625
  return {
594
626
  fast,
595
627
  medium,
596
628
  ratio,
597
629
  ...(slow !== undefined ? {slow} : {}),
598
630
  ...(easing !== undefined ? {easing} : {}),
631
+ ...knobs,
599
632
  };
600
633
  }
601
634
 
@@ -990,7 +1023,14 @@ export function resolveThemeAdaptationRules(
990
1023
  // acceptance to preserve, so a malformed token is rejected here rather
991
1024
  // than emitted. The root path stays lenient for compatibility.
992
1025
  // SYNC: packages/core/src/theme/resolveThemeValues.ts (resolveTokenValue)
993
- {strictTokens: true},
1026
+ // A rule without motion of its own keeps the theme's character, so its
1027
+ // explicit --ease-standard leaves that character's curves alone; one
1028
+ // at 'standard' matches the theme's --ease-standard.
1029
+ {
1030
+ strictTokens: true,
1031
+ inheritedCharacter: axes.motion?.character,
1032
+ standardBeneath: rootTokens['--ease-standard'],
1033
+ },
994
1034
  );
995
1035
  for (const [name, value] of Object.entries(resolved.tokens)) {
996
1036
  assertConcreteLeaf(