@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
@@ -69,13 +69,17 @@
69
69
  * Chromium starts it after the block.
70
70
  *
71
71
  * Promotion: Mobile Safari runs an animation whose start time is set from
72
- * script on its compositor at its first commit only if the element already
73
- * has a compositing layer; without one, a block right after that commit
74
- * freezes it (iOS 26.2 simulator: 2 of 7 runs kept moving). Every animation
75
- * the animator creates, and every `set`, therefore promotes its channels in
76
- * the same task: inline `will-change` on the element, merged with the
77
- * element's own. That is enough (5 of 5, and 4 of 4 through the animator);
78
- * promotion ends PROMOTION_LINGER_MS after the last motion.
72
+ * script on its compositor at its first commit only if the element (or the
73
+ * pseudo-element) already has a compositing layer; without one, a block
74
+ * right after that commit freezes it (iOS 26.2 simulator: 2 of 7 runs kept
75
+ * moving, 0 of 5 on a ::before). Every animation the animator creates, and
76
+ * every `set`, therefore promotes its channels in the same task: inline
77
+ * `will-change` on the element, merged with the element's own, or the custom
78
+ * property `--astryx-motion-will-change-<pseudo>` on the host for a
79
+ * pseudo-element, whose style opts in with
80
+ * `will-change: var(--astryx-motion-will-change-before, auto)`. That is
81
+ * enough (5 of 5, and 4 of 4 through the animator); promotion ends
82
+ * PROMOTION_LINGER_MS after the last motion.
79
83
  *
80
84
  * Known limits, iOS Safari (measured on the iOS 26.2 simulator):
81
85
  * - a block in the task that starts a motion delays it: it starts when the
@@ -125,6 +129,14 @@
125
129
  * Motion policy above, a cross-fade on a coarse pointer or after a touch
126
130
  * release (`touchRelease`) and at once elsewhere (DR2, DR3).
127
131
  *
132
+ * A pseudo-element (`options.pseudoElement`, a dialog's `::backdrop`) has no
133
+ * inline style: its end value is held by a static filling animation (after a
134
+ * curve ends, and after `set`) until the next animation replaces it, and for
135
+ * as long as the pseudo-element exists. The browser makes a `::backdrop`
136
+ * again each time its dialog opens, without the hold, so a presentation
137
+ * calls `set` with its starting value right after `showModal()`, in the same
138
+ * task: a `set` before it lands on the backdrop the open replaces.
139
+ *
128
140
  * SSR-safe: nothing touches `window` or `document` at module scope, and an
129
141
  * animator created without an element only keeps state until one is attached.
130
142
  *
@@ -285,7 +297,7 @@ function format(channel, value) {
285
297
  const shared = new WeakMap();
286
298
 
287
299
  /**
288
- * The one animator for `element`, created on
300
+ * The one animator for `element` (and `options.pseudoElement`), created on
289
301
  * first use. Code that animates one element from several places (a swipe on
290
302
  * x, a removal on y) shares it, so their curves compose in one `translate`
291
303
  * track and retargeting one axis leaves the other on its curve; two
@@ -294,10 +306,16 @@ const shared = new WeakMap();
294
306
  * elsewhere or `dispose` it: it lives as long as the element.
295
307
  */
296
308
  export function animatorFor(element, options = {}) {
297
- let animator = shared.get(element);
309
+ let byPseudo = shared.get(element);
310
+ if (byPseudo == null) {
311
+ byPseudo = new Map();
312
+ shared.set(element, byPseudo);
313
+ }
314
+ const key = options.pseudoElement ?? '';
315
+ let animator = byPseudo.get(key);
298
316
  if (animator == null) {
299
317
  animator = createAnimator(element, options);
300
- shared.set(element, animator);
318
+ byPseudo.set(key, animator);
301
319
  }
302
320
  return animator;
303
321
  }
@@ -413,6 +431,7 @@ export function createAnimator(element, options = {}) {
413
431
  const requestFrame = options.requestFrame ?? (typeof requestAnimationFrame === 'function' ? callback => {
414
432
  requestAnimationFrame(() => callback());
415
433
  } : null);
434
+ const pseudoElement = options.pseudoElement;
416
435
  // Reduced Motion reads the person's settings and nothing else: no option
417
436
  // overrides them (design:reduced-motion DR4).
418
437
  const prefersReducedMotion = defaultPrefersReducedMotion;
@@ -463,6 +482,8 @@ export function createAnimator(element, options = {}) {
463
482
  /** The stylesheet's will-change when there is no inline value. */
464
483
  let sheetWillChange = '';
465
484
  let demoteTimer = null;
485
+ /** A pseudo-element is promoted through a custom property on its host. */
486
+ const promotionProperty = pseudoElement == null ? null : `--astryx-motion-will-change-${pseudoElement.replace(/^:+/, '')}`;
466
487
  /** Channels whose identity the last node held inline (see `attach`). */
467
488
  let heldIdentity = new Set();
468
489
 
@@ -533,7 +554,7 @@ export function createAnimator(element, options = {}) {
533
554
 
534
555
  const finalValue = property => segments.get(property)?.target ?? resting[property];
535
556
  const writeInline = (channel, value) => {
536
- if (target == null) {
557
+ if (target == null || pseudoElement != null) {
537
558
  return;
538
559
  }
539
560
  touched.add(channel);
@@ -588,14 +609,36 @@ export function createAnimator(element, options = {}) {
588
609
  }
589
610
  return times;
590
611
  };
612
+
613
+ /** A pseudo-element's resting value, held by a static filling animation. */
614
+ const hold = (channel, time) => {
615
+ if (target == null) {
616
+ return;
617
+ }
618
+ const value = format(channel, finalValue);
619
+ const animation = target.animate([{
620
+ [channel]: value
621
+ }, {
622
+ [channel]: value
623
+ }], {
624
+ duration: 1,
625
+ fill: 'both',
626
+ pseudoElement
627
+ });
628
+ animation.startTime = time;
629
+ running.set(channel, animation);
630
+ };
591
631
  const rebuild = (channel, time) => {
592
632
  const previous = running.get(channel);
593
633
  running.delete(channel);
594
634
  clearTimeout(retireTimers.get(channel));
595
635
  retireTimers.delete(channel);
596
- // The element's inline style holds the end state, so its old animation
597
- // can go first.
598
- previous?.cancel();
636
+ // An element's inline style holds the end state, so its old animation can
637
+ // go first. A pseudo-element has none: its old animation keeps holding the
638
+ // value until the new one exists (same task, no frame in between).
639
+ if (pseudoElement == null) {
640
+ previous?.cancel();
641
+ }
599
642
  const properties = CHANNELS[channel];
600
643
  // Settled curves become resting values.
601
644
  for (const property of properties) {
@@ -612,6 +655,10 @@ export function createAnimator(element, options = {}) {
612
655
  return;
613
656
  }
614
657
  if (moving.length === 0) {
658
+ if (pseudoElement != null) {
659
+ hold(channel, time);
660
+ }
661
+ previous?.cancel();
615
662
  return;
616
663
  }
617
664
  // A channel rebuilt by an explicit call (set, rebase, a retarget of
@@ -624,6 +671,10 @@ export function createAnimator(element, options = {}) {
624
671
  const from = waiting?.provisional ?? time;
625
672
  const end = Math.min(from + MAX_DURATION_MS, Math.max(...moving.map(p => segments.get(p).start + segments.get(p).duration)));
626
673
  if (end <= from) {
674
+ if (pseudoElement != null) {
675
+ hold(channel, time);
676
+ }
677
+ previous?.cancel();
627
678
  return;
628
679
  }
629
680
  if (callGroup != null) {
@@ -702,7 +753,10 @@ export function createAnimator(element, options = {}) {
702
753
  // The main thread drops the animation once it runs after the end; the
703
754
  // inline style already holds the same values, so that changes no pixel.
704
755
  fill: 'both',
705
- easing: 'linear'
756
+ easing: 'linear',
757
+ ...(pseudoElement != null ? {
758
+ pseudoElement
759
+ } : {})
706
760
  });
707
761
  if (waiting != null) {
708
762
  // From rest: no start time, so the browser starts the animation when
@@ -723,7 +777,9 @@ export function createAnimator(element, options = {}) {
723
777
 
724
778
  /**
725
779
  * Once the main thread runs after the curve's end, the animation leaves the
726
- * running state: the element's inline style already shows the end values.
780
+ * running state: an element's inline style already shows the end values; a
781
+ * pseudo-element's end value moves to a static holding animation, created
782
+ * before the long one goes.
727
783
  */
728
784
  const scheduleRetire = (channel, animation, end) => {
729
785
  clearTimeout(retireTimers.get(channel));
@@ -740,6 +796,12 @@ export function createAnimator(element, options = {}) {
740
796
  return;
741
797
  }
742
798
  running.delete(channel);
799
+ // A pseudo-element holds its resting value, unless the stylesheet
800
+ // takes it back now (a borrowed dip that has ended).
801
+ const handsBack = channel === 'opacity' && borrowedOpacity != null && ![...landings].some(landing => landing.fadeIn?.isBorrowed === true);
802
+ if (pseudoElement != null && !handsBack) {
803
+ hold(channel, now());
804
+ }
743
805
  animation.cancel();
744
806
  releaseIdentity(channel);
745
807
  flushReleases();
@@ -750,20 +812,30 @@ export function createAnimator(element, options = {}) {
750
812
  /** The element's own (stylesheet) opacity, read once when a dip starts. */
751
813
  const ownOpacity = () => {
752
814
  const view = target?.ownerDocument.defaultView;
753
- const value = target == null ? NaN : Number.parseFloat(view?.getComputedStyle(target).getPropertyValue('opacity') ?? '');
815
+ const value = target == null ? NaN : Number.parseFloat(view?.getComputedStyle(target, pseudoElement ?? null).getPropertyValue('opacity') ?? '');
754
816
  return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 1;
755
817
  };
756
818
 
757
819
  /**
758
820
  * Whether the animator holds an opacity of its own on the element: an inline
759
- * value it wrote (a `set` over a stylesheet that hides or dims it). A dip
760
- * returns to that value.
821
+ * value it wrote, or a pseudo-element's holding animation (a `set` over a
822
+ * stylesheet that hides or dims it). A dip returns to that value.
761
823
  */
762
- const writesOwnOpacity = () => (target?.style.getPropertyValue('opacity') ?? '') !== '';
824
+ const writesOwnOpacity = () => pseudoElement == null ? (target?.style.getPropertyValue('opacity') ?? '') !== '' : running.has('opacity');
763
825
 
764
- /** Gives the element's opacity back to its stylesheet: its inline value goes. */
826
+ /**
827
+ * Gives the element's opacity back to its stylesheet: an element's inline
828
+ * value goes; a pseudo-element, which has no inline style, loses the
829
+ * animation holding its value.
830
+ */
765
831
  const releaseOwnOpacity = () => {
766
- target?.style.removeProperty('opacity');
832
+ if (pseudoElement == null) {
833
+ target?.style.removeProperty('opacity');
834
+ return;
835
+ }
836
+ const held = running.get('opacity');
837
+ running.delete('opacity');
838
+ held?.cancel();
767
839
  };
768
840
 
769
841
  /**
@@ -844,6 +916,9 @@ export function createAnimator(element, options = {}) {
844
916
  releaseOwnOpacity();
845
917
  return;
846
918
  }
919
+ if (pseudoElement != null) {
920
+ return;
921
+ }
847
922
  if (target.style.getPropertyValue(channel) !== IDENTITY_TEXT[channel]) {
848
923
  return;
849
924
  }
@@ -903,9 +978,17 @@ export function createAnimator(element, options = {}) {
903
978
 
904
979
  // -- promotion -------------------------------------------------------------
905
980
 
906
- /** Writes the promoted channels as will-change. */
981
+ /** Writes the promoted channels as will-change (or the pseudo's property). */
907
982
  const writePromotion = element => {
908
983
  const list = [...promoted].join(', ');
984
+ if (promotionProperty != null) {
985
+ if (list === '') {
986
+ element.style.removeProperty(promotionProperty);
987
+ } else {
988
+ element.style.setProperty(promotionProperty, list);
989
+ }
990
+ return;
991
+ }
909
992
  if (list === '') {
910
993
  element.style.willChange = ownWillChange ?? '';
911
994
  ownWillChange = null;
@@ -924,7 +1007,7 @@ export function createAnimator(element, options = {}) {
924
1007
  };
925
1008
 
926
1009
  /**
927
- * Gives the element a compositing layer for
1010
+ * Gives the element (or its pseudo-element) a compositing layer for
928
1011
  * `channel` from the task that starts the motion: Mobile Safari runs an
929
1012
  * animation whose start time is set from script on its compositor at its
930
1013
  * first commit only if the element already has a layer.
@@ -1747,7 +1830,11 @@ export function createAnimator(element, options = {}) {
1747
1830
  }
1748
1831
  // After the landing's commit, which can promote the element again.
1749
1832
  demote();
1833
+ // A pseudo-element holds an identity with a static animation, which the
1834
+ // cancel below drops: note the channels to hold again on the next node
1835
+ // (never a borrowed opacity, which is the stylesheet's).
1750
1836
  const isOpacityBorrowed = borrowedOpacity != null || [...landings].some(landing => landing.restoreIsBorrowed === true);
1837
+ const pseudoHeld = pseudoElement == null || target == null ? null : new Set(Object.keys(CHANNELS).filter(channel => running.has(channel) && !(channel === 'opacity' && isOpacityBorrowed) && CHANNELS[channel].every(p => !segments.has(p) && resting[p] === IDENTITY[p])));
1751
1838
  for (const animation of running.values()) {
1752
1839
  animation.cancel();
1753
1840
  }
@@ -1767,7 +1854,7 @@ export function createAnimator(element, options = {}) {
1767
1854
  // differs, kept through a detach for the node that comes next.
1768
1855
  if (target != null) {
1769
1856
  const outgoing = target;
1770
- heldIdentity = new Set(Object.keys(CHANNELS).filter(channel => outgoing.style.getPropertyValue(channel) === IDENTITY_TEXT[channel]));
1857
+ heldIdentity = pseudoHeld ?? new Set(Object.keys(CHANNELS).filter(channel => outgoing.style.getPropertyValue(channel) === IDENTITY_TEXT[channel]));
1771
1858
  }
1772
1859
  const held = heldIdentity;
1773
1860
  target = next;
@@ -1792,8 +1879,13 @@ export function createAnimator(element, options = {}) {
1792
1879
  } else if (held.has(channel)) {
1793
1880
  // An identity the animator held inline over a stylesheet that
1794
1881
  // differs goes onto the new node too (writeInline keeps it only
1795
- // where the new node's stylesheet still differs).
1796
- writeInline(channel, property => resting[property]);
1882
+ // where the new node's stylesheet still differs); a pseudo-element's
1883
+ // is held again.
1884
+ if (pseudoElement != null) {
1885
+ hold(channel, time);
1886
+ } else {
1887
+ writeInline(channel, property => resting[property]);
1888
+ }
1797
1889
  }
1798
1890
  }
1799
1891
  flushReleases();
@@ -70,7 +70,7 @@ import type { IndicatorRegistry } from '../Indicator/types.js';
70
70
  import type { TypographyConfig } from './types.js';
71
71
  import { type OnMediaOverrides, type ResolvedOnMedia } from './onMediaTokens.js';
72
72
  import { colorDefaults, spacingDefaults, sizeDefaults, borderDefaults, focusDefaults, radiusDefaults, shadowDefaults, durationDefaults, easeDefaults, typographyDefaults, textSizeDefaults, fontWeightDefaults, typeScaleDefaults } from './tokens.stylex.js';
73
- import type { MotionScaleConfig } from './expandMotionScale.js';
73
+ import type { ThemeMotionConfig } from './themeMotion.js';
74
74
  import type { RadiusScaleConfig } from './expandRadiusScale.js';
75
75
  import type { ColorScaleConfig } from './expandColorScale.js';
76
76
  import { type NormalizedThemeAdaptations, type ResolvedThemeAdaptationRule, type ThemeAdaptations, type ThemeGenerativeAxes } from './themeAdaptations.js';
@@ -202,13 +202,27 @@ export interface DefineThemeInput<IconVariants extends ReadonlyArray<string> | u
202
202
  */
203
203
  typography?: TypographyConfig;
204
204
  /**
205
- * Motion configuration. Computes duration min/max variants from
206
- * base values and a scaling ratio: min = base × ratio, max = base / ratio.
205
+ * Motion configuration: two knobs (spec:AST-108), a motion scale, or both.
207
206
  *
208
- * Explicit `tokens` overrides take precedence over motion-generated values.
207
+ * - `tempo` (default 1, clamped to 0.75–1.5) scales every motion duration
208
+ * token; touch motion's springs don't read it yet.
209
+ * - `character` (`'crisp'`, `'standard'` or `'expressive'`) sets the
210
+ * entrance and move curves; exits and fades never overshoot.
211
+ *
212
+ * Every theme follows each person's Reduce Motion setting; nothing loosens it.
213
+ *
214
+ * A motion scale computes duration min/max variants from base values and a
215
+ * ratio (min = base × ratio, max = base / ratio); its durations win over
216
+ * `tempo`, and explicit `tokens` overrides win over both. Finger tracking,
217
+ * momentum, the keyboard, hover, the press's onset delay and tap flash, and
218
+ * busy loops never follow the knobs; the press release fade follows
219
+ * `tempo`.
209
220
  *
210
221
  * @example
211
222
  * ```
223
+ * motion: { tempo: 1.2, character: 'crisp' }
224
+ *
225
+ * // A motion scale, as before:
212
226
  * motion: { fast: 175, medium: 410, slow: 975, ratio: 0.75 }
213
227
  *
214
228
  * // Suggested starting points:
@@ -217,7 +231,7 @@ export interface DefineThemeInput<IconVariants extends ReadonlyArray<string> | u
217
231
  * // Cinematic: { fast: 200, medium: 500, slow: 1200, ratio: 0.7 }
218
232
  * ```
219
233
  */
220
- motion?: MotionScaleConfig;
234
+ motion?: ThemeMotionConfig;
221
235
  /**
222
236
  * Radius configuration. Generates radius token overrides
223
237
  * from a base unit and multiplier.
@@ -1 +1 @@
1
- {"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"defineTheme.d.ts","sourceRoot":"","sources":["../../src/theme/defineTheme.ts"],"names":[],"mappings":"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"}
@@ -68,7 +68,7 @@ import { resolveOnMedia } from "./onMediaTokens.js";
68
68
  import { colorDefaults, spacingDefaults, sizeDefaults, borderDefaults, focusDefaults, radiusDefaults, shadowDefaults, durationDefaults, easeDefaults, typographyDefaults, textSizeDefaults, fontWeightDefaults, typeScaleDefaults } from "./tokens.stylex.js";
69
69
  import { resolveThemeValues } from "./resolveThemeValues.js";
70
70
  import { normalizeThemeAdaptations, resolveThemeAdaptationRules, resolveThemeGenerativeAxes } from "./themeAdaptations.js";
71
- import { domainTokenDefaults } from "./domainTokens/index.js";
71
+ import { domainTokenDefaults } from "./domainTokens/domainTokenDefaults.js";
72
72
  import { registerTheme } from "./themeRegistry.js";
73
73
  import { resolveLocalTokenContract } from "./localTokens.js";
74
74
 
@@ -204,6 +204,41 @@ function describeBadBase(value) {
204
204
  return `an object with keys [${keys.slice(0, 4).join(', ')}${keys.length > 4 ? ', …' : ''}]`;
205
205
  }
206
206
 
207
+ /** The slow band's duration tokens. */
208
+ const SLOW_BAND = ['--duration-slow-min', '--duration-slow', '--duration-slow-max'];
209
+
210
+ /**
211
+ * The base's tokens for the duration-scale fields a child leaves unset
212
+ * (spec:AST-108 FR5, field by field): a child that sets no `slow` of its own
213
+ * regenerates only the fast and medium bands, so an inherited slow band stays
214
+ * as the base's tokens hold it, at the ratio it was made with; and a child
215
+ * that sets no `easing` keeps the base's `--ease-standard`, an explicit one
216
+ * included, however many themes down either is inherited.
217
+ */
218
+ function inheritedScaleTokens(base, baseMotion, own) {
219
+ const names = [...('slow' in baseMotion && !('slow' in own) ? SLOW_BAND : []), ...('easing' in baseMotion && !('easing' in own) ? ['--ease-standard'] : [])];
220
+ if (names.length === 0) {
221
+ return undefined;
222
+ }
223
+ const tokens = base.tokens;
224
+ return Object.fromEntries(names.flatMap(name => tokens[name] !== undefined ? [[name, tokens[name]]] : []));
225
+ }
226
+
227
+ /**
228
+ * Refuses a duration scale that is missing `fast`, `medium` or `ratio` after
229
+ * inheritance. The scale applies only when all three are present, so a partial
230
+ * one beside a knob (`{fast: 100, tempo: 1.2}`) would otherwise be dropped
231
+ * silently, though its fields win over `tempo` (spec:AST-108 FR5). Adaptation
232
+ * rules refuse the same in `completeMotion`.
233
+ */
234
+ function assertCompleteMotionScale(motion, themeName) {
235
+ const scale = motion;
236
+ const writesScale = scale.fast !== undefined || scale.medium !== undefined || scale.ratio !== undefined || scale.slow !== undefined || scale.easing !== undefined;
237
+ if (writesScale && (scale.fast === undefined || scale.medium === undefined || scale.ratio === undefined)) {
238
+ throw new Error(`defineTheme("${themeName}"): \`motion\` sets a duration scale field, so it must supply \`fast\`, \`medium\`, and \`ratio\` unless each missing field is inherited from \`extends\`.`);
239
+ }
240
+ }
241
+
207
242
  /**
208
243
  * Create an Astryx theme.
209
244
  *
@@ -229,13 +264,33 @@ export function defineTheme(input) {
229
264
  // The theme's own value axes and the resolved base an `extends` supplies.
230
265
  // The same axis metadata is retained so adaptation rules can complete partial
231
266
  // configs without approximating values from unrelated built-in defaults.
267
+ //
268
+ // Motion inherits field by field (spec:AST-108 FR5): a duration-scale field
269
+ // or knob the child leaves unset keeps its base's value, so the child's
270
+ // motion tokens come from the merged configuration. They resolve base first,
271
+ // then generated (`architecture:theme-authoring-contract`): what the child
272
+ // generates replaces the base's tokens, its explicit ones included. A
273
+ // child's motion regenerates only what it sets: an inherited slow band and
274
+ // an inherited easing keep the base's tokens.
275
+ const baseMotion = base?.__axes?.motion;
276
+ const motion = input.motion != null && baseMotion != null ? {
277
+ ...baseMotion,
278
+ ...input.motion
279
+ } : input.motion;
280
+ if (motion != null) {
281
+ assertCompleteMotionScale(motion, input.name);
282
+ }
283
+ const inheritedScale = input.motion != null && base != null && baseMotion != null ? inheritedScaleTokens(base, baseMotion, input.motion) : undefined;
232
284
  const ownValues = {
233
285
  typography: input.typography,
234
286
  color: input.color,
235
287
  radius: input.radius,
236
- motion: input.motion,
288
+ motion,
237
289
  syntax: input.syntax,
238
- tokens: input.tokens,
290
+ tokens: inheritedScale != null && Object.keys(inheritedScale).length > 0 ? {
291
+ ...inheritedScale,
292
+ ...input.tokens
293
+ } : input.tokens,
239
294
  components: input.components
240
295
  };
241
296
  const ownAxes = {
@@ -248,10 +303,15 @@ export function defineTheme(input) {
248
303
  tokens: base.tokens,
249
304
  components: base.components
250
305
  } : undefined;
306
+
307
+ // An explicit --ease-standard follows the character the theme inherits
308
+ // when it sets no motion of its own (FR2).
251
309
  const {
252
310
  tokens,
253
311
  components
254
- } = resolveThemeValues(ownValues, seed);
312
+ } = resolveThemeValues(ownValues, seed, {
313
+ inheritedCharacter: baseMotion?.character
314
+ });
255
315
 
256
316
  // On-media token overrides (base's resolved surface, then defaults, then
257
317
  // this theme's own overrides). They compile after adaptations so the
@@ -0,0 +1,3 @@
1
+ /** All domain token defaults merged — used by defineTheme for validation */
2
+ export declare const domainTokenDefaults: Record<string, string>;
3
+ //# sourceMappingURL=domainTokenDefaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainTokenDefaults.d.ts","sourceRoot":"","sources":["../../../src/theme/domainTokens/domainTokenDefaults.ts"],"names":[],"mappings":"AAcA,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtD,CAAC"}
@@ -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.js";
13
+ import { dataTokenDefaults } from "./dataTokens.js";
14
+
15
+ /** All domain token defaults merged — used by defineTheme for validation */
16
+ export const domainTokenDefaults = {
17
+ ...syntaxTokenDefaults,
18
+ ...dataTokenDefaults
19
+ };
@@ -4,17 +4,18 @@
4
4
  * @output domainTokenDefaults, DomainTokenName
5
5
  * @position Token aggregator; consumed by defineTheme for validation + autocomplete
6
6
  *
7
- * Merges all domain token defaults into a single map for defineTheme.
8
- * Actual token definitions live in their own directories (syntax/, dataviz/).
7
+ * Re-exports only. The merged map lives in domainTokenDefaults.ts so that
8
+ * defineTheme, inside a lazily imported module graph, imports it without a
9
+ * barrel. Actual token definitions live in their own directories (syntax/,
10
+ * dataviz/).
9
11
  */
10
12
  export { syntaxTokenDefaults } from '../syntax/tokens.js';
11
13
  export type { SyntaxTokenName } from '../syntax/tokens.js';
12
14
  export { dataTokenDefaults } from './dataTokens.js';
13
15
  export type { DataTokenName } from './dataTokens.js';
16
+ export { domainTokenDefaults } from './domainTokenDefaults.js';
14
17
  import type { SyntaxTokenName } from '../syntax/tokens.js';
15
18
  import type { DataTokenName } from './dataTokens.js';
16
- /** All domain token defaults merged — used by defineTheme for validation */
17
- export declare const domainTokenDefaults: Record<string, string>;
18
19
  /** Union of all domain token names */
19
20
  export type DomainTokenName = SyntaxTokenName | DataTokenName;
20
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/domainTokens/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAIhD,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGtD,CAAC;AAEF,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/theme/domainTokens/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAC,mBAAmB,EAAC,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,cAAc,CAAC;AAEhD,sCAAsC;AACtC,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,aAAa,CAAC"}
@@ -6,18 +6,14 @@
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.js";
14
16
  export { dataTokenDefaults } from "./dataTokens.js";
15
- import { syntaxTokenDefaults } from "../syntax/tokens.js";
16
- import { dataTokenDefaults } from "./dataTokens.js";
17
- /** All domain token defaults merged — used by defineTheme for validation */
18
- export const domainTokenDefaults = {
19
- ...syntaxTokenDefaults,
20
- ...dataTokenDefaults
21
- };
17
+ export { domainTokenDefaults } from "./domainTokenDefaults.js";
22
18
 
23
19
  /** Union of all domain token names */
@@ -32,6 +32,7 @@ export { expandColorScale } from './expandColorScale.js';
32
32
  export type { ColorScaleConfig, ColorScaleTokens } from './expandColorScale.js';
33
33
  export { expandMotionScale } from './expandMotionScale.js';
34
34
  export type { MotionScaleConfig, MotionScaleTokens } from './expandMotionScale.js';
35
+ export type { MotionCharacter, ThemeMotionConfig, ThemeMotionKnobs, } from './themeMotion.js';
35
36
  export { colorDefaults, spacingDefaults, sizeDefaults, borderDefaults, focusDefaults, radiusDefaults, shadowDefaults, durationDefaults, easeDefaults, typographyDefaults, textSizeDefaults, fontWeightDefaults, typeScaleDefaults, colorVars, spacingVars, sizeVars, borderVars, focusVars, radiusVars, shadowVars, durationVars, easeVars, typographyVars, textSizeVars, fontWeightVars, typeScaleVars, } from './tokens.stylex.js';
36
37
  export type { ColorVarName, SpacingVarName, SizeVarName, BorderVarName, RadiusVarName, ShadowVarName, DurationVarName, EaseVarName, TypographyVarName, TextSizeVarName, FontWeightVarName, TypeScaleVarName, } from './tokens.stylex.js';
37
38
  export { useTheme, useThemeName, ThemeContext } from './useTheme.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @file motionKnobs.ts
3
+ * @input A theme's motion knobs (`tempo`, `character`)
4
+ * @output Their types and `resolveMotionKnobs`, which fills in the defaults
5
+ * and clamps `tempo` (`spec:AST-108` FR1). `reducedMotion` is not a public
6
+ * knob until `'always'` ships: every theme resolves to `'system'`
7
+ * @position Theme utility with no imports: themeMotion.ts builds the motion
8
+ * tokens on it, and the motion foundation reads a theme's knobs through it
9
+ * without loading the token stylesheet. Pure; safe on the server and in
10
+ * plain Node.
11
+ *
12
+ * SYNC: When modified, update:
13
+ * - /packages/core/src/theme/themeMotion.ts (re-exports these)
14
+ * - /packages/core/src/theme/themeMotion.test.ts
15
+ */
16
+ /** How lively a theme's motion feels. */
17
+ export type MotionCharacter = 'crisp' | 'standard' | 'expressive';
18
+ /**
19
+ * Whose Reduce Motion setting a theme follows: `'system'`, each person's own.
20
+ * Internal: no theme sets it until `'always'` ships (`spec:AST-108` FR6).
21
+ */
22
+ export type ThemeReducedMotion = 'system';
23
+ /** The motion knobs a theme sets (`spec:AST-108` FR1). */
24
+ export interface ThemeMotionKnobs {
25
+ /**
26
+ * Scales every motion duration: 1 is Astryx's own, 0.75 the quickest and
27
+ * 1.5 the slowest (values outside are clamped). Default 1.
28
+ */
29
+ tempo?: number;
30
+ /**
31
+ * `'crisp'` decelerates without overshoot, `'standard'` is Astryx's own,
32
+ * `'expressive'` overshoots slightly on entrances and moves. Exits and
33
+ * fades never overshoot. Default `'standard'`.
34
+ */
35
+ character?: MotionCharacter;
36
+ }
37
+ /** The knobs with their defaults filled in and `tempo` clamped. */
38
+ export interface ResolvedMotionKnobs {
39
+ readonly tempo: number;
40
+ readonly character: MotionCharacter;
41
+ readonly reducedMotion: ThemeReducedMotion;
42
+ /**
43
+ * Whether the theme sets `tempo` itself. A `MotionScaleConfig` alone
44
+ * implies a tempo for its CSS durations only; the animator's springs stay
45
+ * at tempo 1 unless this is true (FR5).
46
+ */
47
+ readonly tempoIsSet: boolean;
48
+ }
49
+ /** The range `tempo` is clamped to. */
50
+ export declare const TEMPO_RANGE: {
51
+ readonly min: 0.75;
52
+ readonly max: 1.5;
53
+ };
54
+ /** The knobs of `config`, defaults filled in, `tempo` clamped. */
55
+ export declare function resolveKnobs(config: ThemeMotionKnobs | undefined): ResolvedMotionKnobs;
56
+ //# sourceMappingURL=motionKnobs.d.ts.map