@astryxdesign/core 0.7.5 → 0.7.6-canary.00507ba

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 (595) 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/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +183 -5
  6. package/dist/AppShell/observeMainOverflow.d.ts +9 -0
  7. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
  8. package/dist/AppShell/observeMainOverflow.js +125 -0
  9. package/dist/Avatar/Avatar.d.ts.map +1 -1
  10. package/dist/Avatar/Avatar.js +12 -3
  11. package/dist/Badge/Badge.d.ts.map +1 -1
  12. package/dist/Badge/Badge.js +7 -1
  13. package/dist/BottomSheet/BottomSheet.js +1 -1
  14. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  16. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  17. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  18. package/dist/BottomSheet/useSheetGestures.js +30 -3
  19. package/dist/Button/Button.js +4 -4
  20. package/dist/Carousel/Carousel.d.ts +3 -1
  21. package/dist/Carousel/Carousel.d.ts.map +1 -1
  22. package/dist/Carousel/Carousel.js +12 -3
  23. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  25. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  26. package/dist/ClickableCard/ClickableCard.js +37 -4
  27. package/dist/DateInput/DateInput.d.ts.map +1 -1
  28. package/dist/DateInput/DateInput.js +12 -4
  29. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  30. package/dist/DateInput/MonthScroller.js +101 -15
  31. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  32. package/dist/DateInput/TouchDateField.js +8 -3
  33. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  34. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  35. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  36. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  37. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  38. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  39. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  40. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  41. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  42. package/dist/Dialog/Dialog.d.ts.map +1 -1
  43. package/dist/Dialog/Dialog.js +34 -9
  44. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  45. package/dist/Dialog/DialogHeader.js +5 -4
  46. package/dist/Divider/Divider.d.ts.map +1 -1
  47. package/dist/Divider/Divider.js +2 -1
  48. package/dist/Drawer/Drawer.d.ts +1 -0
  49. package/dist/Drawer/Drawer.d.ts.map +1 -1
  50. package/dist/Drawer/Drawer.js +7 -2
  51. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  52. package/dist/DropdownMenu/DropdownMenu.js +7 -3
  53. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  54. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  55. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  56. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  57. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  58. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  59. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  60. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  61. package/dist/EmptyState/EmptyState.js +2 -1
  62. package/dist/Field/FieldLabel.d.ts +1 -1
  63. package/dist/Field/FieldLabel.d.ts.map +1 -1
  64. package/dist/Field/FieldLabel.js +4 -4
  65. package/dist/Field/InputClearButton.js +3 -3
  66. package/dist/Field/PanelSearchInput.js +2 -2
  67. package/dist/FieldStatus/FieldStatus.js +2 -2
  68. package/dist/FileInput/FileInput.d.ts.map +1 -1
  69. package/dist/FileInput/FileInput.js +7 -1
  70. package/dist/Heading/Heading.js +1 -1
  71. package/dist/Icon/Icon.js +1 -1
  72. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  73. package/dist/Indicator/CheckIndicator.js +2 -1
  74. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  75. package/dist/Indicator/CheckboxIndicator.js +3 -1
  76. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  77. package/dist/Indicator/RadioIndicator.js +3 -1
  78. package/dist/Item/Item.d.ts.map +1 -1
  79. package/dist/Item/Item.js +2 -1
  80. package/dist/Item/ItemSwipeLayer.js +1 -1
  81. package/dist/Layer/popoverOperations.d.ts +27 -0
  82. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  83. package/dist/Layer/popoverOperations.js +159 -0
  84. package/dist/Layer/useLayer.d.ts +1 -1
  85. package/dist/Layer/useLayer.d.ts.map +1 -1
  86. package/dist/Layer/useLayer.js +93 -59
  87. package/dist/Layout/Layout.js +1 -1
  88. package/dist/Layout/LayoutContent.js +1 -1
  89. package/dist/Layout/LayoutFooter.js +1 -1
  90. package/dist/Layout/LayoutHeader.js +1 -1
  91. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  92. package/dist/Lightbox/Lightbox.js +5 -0
  93. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  94. package/dist/List/List.js +1 -1
  95. package/dist/List/ListItem.js +3 -3
  96. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  97. package/dist/MobileNav/MobileNav.js +7 -2
  98. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  99. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  100. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  101. package/dist/MultiSelector/MultiSelector.js +26 -10
  102. package/dist/NumberInput/NumberInput.d.ts +3 -1
  103. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  104. package/dist/NumberInput/NumberInput.js +3 -3
  105. package/dist/NumberInput/numberParser.d.ts +3 -0
  106. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  107. package/dist/NumberInput/numberParser.js +7 -44
  108. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  109. package/dist/ProgressBar/ProgressBar.js +16 -12
  110. package/dist/Resizable/useResizable.d.ts.map +1 -1
  111. package/dist/Resizable/useResizable.js +28 -2
  112. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  113. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  114. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  115. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  116. package/dist/Selector/useSelectorPresentation.js +20 -4
  117. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  118. package/dist/Skeleton/Skeleton.js +1 -1
  119. package/dist/Slider/Slider.d.ts.map +1 -1
  120. package/dist/Slider/Slider.js +10 -2
  121. package/dist/Spinner/Spinner.d.ts.map +1 -1
  122. package/dist/Spinner/Spinner.js +3 -3
  123. package/dist/Stack/Stack.js +1 -1
  124. package/dist/Stack/StackItem.js +1 -1
  125. package/dist/TabList/TabList.d.ts.map +1 -1
  126. package/dist/TabList/TabList.js +16 -1
  127. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  128. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  129. package/dist/Text/Text.js +1 -1
  130. package/dist/Text/useTruncation.d.ts.map +1 -1
  131. package/dist/Text/useTruncation.js +23 -5
  132. package/dist/TextArea/TextArea.d.ts +1 -1
  133. package/dist/TextArea/TextArea.d.ts.map +1 -1
  134. package/dist/TextArea/TextArea.js +13 -2
  135. package/dist/TextInput/TextInput.d.ts.map +1 -1
  136. package/dist/TextInput/TextInput.js +3 -3
  137. package/dist/TimeInput/TimeInput.d.ts +6 -2
  138. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  139. package/dist/TimeInput/TimeInput.js +21 -14
  140. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  141. package/dist/TimeInput/TouchTimeField.js +5 -4
  142. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  143. package/dist/Timestamp/Timestamp.js +2 -2
  144. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  145. package/dist/Toast/Toast.d.ts.map +1 -1
  146. package/dist/Toast/Toast.js +60 -20
  147. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  148. package/dist/Toast/ToastViewport.js +82 -51
  149. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  150. package/dist/Tokenizer/Tokenizer.js +13 -2
  151. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  152. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  153. package/dist/Toolbar/Toolbar.js +2 -1
  154. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  155. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  156. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  157. package/dist/TopNav/TopNavMenu.js +1 -0
  158. package/dist/Typeahead/Typeahead.d.ts +1 -1
  159. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  160. package/dist/Typeahead/Typeahead.js +9 -1
  161. package/dist/astryx.css +21 -4
  162. package/dist/gestures/GestureArena.d.ts +6 -0
  163. package/dist/gestures/GestureArena.d.ts.map +1 -1
  164. package/dist/gestures/GestureArena.js +39 -0
  165. package/dist/gestures/GestureHost.d.ts +352 -0
  166. package/dist/gestures/GestureHost.d.ts.map +1 -0
  167. package/dist/gestures/GestureHost.js +1773 -0
  168. package/dist/gestures/GestureRecognizer.d.ts +10 -0
  169. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  170. package/dist/gestures/GestureRecognizer.js +16 -0
  171. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  172. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  173. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  174. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  175. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  176. package/dist/gestures/PanGestureRecognizer.js +3 -0
  177. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  178. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  179. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  180. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  181. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  182. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  183. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  184. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  185. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  186. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  187. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  188. package/dist/gestures/TapGestureRecognizer.js +3 -0
  189. package/dist/gestures/VelocityTracker.d.ts +6 -2
  190. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  191. package/dist/gestures/VelocityTracker.js +7 -3
  192. package/dist/gestures/haptics.d.ts +65 -0
  193. package/dist/gestures/haptics.d.ts.map +1 -0
  194. package/dist/gestures/haptics.js +182 -0
  195. package/dist/gestures/nativeScroll.d.ts +42 -0
  196. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  197. package/dist/gestures/nativeScroll.js +228 -0
  198. package/dist/gestures/touchAction.d.ts +60 -0
  199. package/dist/gestures/touchAction.d.ts.map +1 -0
  200. package/dist/gestures/touchAction.js +157 -0
  201. package/dist/gestures/touchActionRule.d.ts +34 -0
  202. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  203. package/dist/gestures/touchActionRule.js +140 -0
  204. package/dist/gestures/types.d.ts +18 -7
  205. package/dist/gestures/types.d.ts.map +1 -1
  206. package/dist/gestures/types.js +22 -2
  207. package/dist/hooks/index.d.ts +1 -1
  208. package/dist/hooks/index.d.ts.map +1 -1
  209. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  210. package/dist/hooks/modalAnnounce.js +107 -61
  211. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
  212. package/dist/hooks/scrollKeyboardDelegation.js +7 -3
  213. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  214. package/dist/hooks/useAdaptivePresentation.js +4 -1
  215. package/dist/hooks/useAnnounce.d.ts +101 -42
  216. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  217. package/dist/hooks/useAnnounce.js +161 -75
  218. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  219. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  220. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  221. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  222. package/dist/hooks/useBusyAnnouncement.js +6 -12
  223. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  224. package/dist/hooks/useMenuHover.js +12 -1
  225. package/dist/hooks/useScrollOverflow.d.ts +2 -1
  226. package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
  227. package/dist/hooks/useScrollOverflow.js +56 -10
  228. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  229. package/dist/i18n/generated-locales/en.generated.js +6 -0
  230. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  231. package/dist/i18n/generated-locales/pseudo.generated.js +6 -0
  232. package/dist/motion/animator.d.ts +7 -1
  233. package/dist/motion/animator.d.ts.map +1 -1
  234. package/dist/motion/animator.js +119 -27
  235. package/dist/theme/defineTheme.d.ts +19 -5
  236. package/dist/theme/defineTheme.d.ts.map +1 -1
  237. package/dist/theme/defineTheme.js +64 -4
  238. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  239. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  240. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  241. package/dist/theme/domainTokens/index.d.ts +5 -4
  242. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  243. package/dist/theme/domainTokens/index.js +5 -9
  244. package/dist/theme/index.d.ts +1 -0
  245. package/dist/theme/index.d.ts.map +1 -1
  246. package/dist/theme/motionKnobs.d.ts +56 -0
  247. package/dist/theme/motionKnobs.d.ts.map +1 -0
  248. package/dist/theme/motionKnobs.js +48 -0
  249. package/dist/theme/resolveThemeValues.d.ts +11 -4
  250. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  251. package/dist/theme/resolveThemeValues.js +40 -4
  252. package/dist/theme/themeAdaptations.d.ts +7 -3
  253. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  254. package/dist/theme/themeAdaptations.js +36 -7
  255. package/dist/theme/themeMotion.d.ts +96 -0
  256. package/dist/theme/themeMotion.d.ts.map +1 -0
  257. package/dist/theme/themeMotion.js +177 -0
  258. package/dist/theme/tokenReferences.d.ts +31 -0
  259. package/dist/theme/tokenReferences.d.ts.map +1 -0
  260. package/dist/theme/tokenReferences.js +132 -0
  261. package/dist/theme/tokens.d.ts +1 -0
  262. package/dist/theme/tokens.d.ts.map +1 -1
  263. package/dist/theme/tokens.js +9 -129
  264. package/dist/theme/tokens.stylex.d.ts +12 -0
  265. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  266. package/dist/theme/tokens.stylex.js +12 -0
  267. package/dist/utils/focusReturn.d.ts +17 -1
  268. package/dist/utils/focusReturn.d.ts.map +1 -1
  269. package/dist/utils/focusReturn.js +11 -4
  270. package/dist/utils/getNodeText.d.ts +8 -0
  271. package/dist/utils/getNodeText.d.ts.map +1 -0
  272. package/dist/utils/getNodeText.js +37 -0
  273. package/dist/utils/interactionModality.d.ts +11 -2
  274. package/dist/utils/interactionModality.d.ts.map +1 -1
  275. package/dist/utils/interactionModality.js +58 -5
  276. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  277. package/dist/utils/interactionOverlay.stylex.js +17 -8
  278. package/dist/utils/plainDate.d.ts +2 -0
  279. package/dist/utils/plainDate.d.ts.map +1 -1
  280. package/dist/utils/plainDate.js +46 -3
  281. package/dist/utils/presentation.d.ts +50 -0
  282. package/dist/utils/presentation.d.ts.map +1 -0
  283. package/dist/utils/presentation.js +125 -0
  284. package/dist/utils/pressFeedback.d.ts.map +1 -1
  285. package/dist/utils/pressFeedback.js +20 -1
  286. package/dist/utils/primaryClick.d.ts +11 -0
  287. package/dist/utils/primaryClick.d.ts.map +1 -0
  288. package/dist/utils/primaryClick.js +25 -0
  289. package/dist/utils/sharedMutationObserver.d.ts +19 -11
  290. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  291. package/dist/utils/sharedMutationObserver.js +66 -26
  292. package/dist/utils/timeFormat.d.ts +47 -0
  293. package/dist/utils/timeFormat.d.ts.map +1 -0
  294. package/dist/utils/timeFormat.js +240 -0
  295. package/dist/utils/touchPresentation.d.ts.map +1 -1
  296. package/dist/utils/touchPresentation.js +5 -3
  297. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  298. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  299. package/dist/utils/touchPresentation.stylex.js +33 -0
  300. package/dist/utils/unicodeDigits.d.ts +20 -0
  301. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  302. package/dist/utils/unicodeDigits.js +70 -0
  303. package/locales/en.json +27 -3
  304. package/locales/pseudo.json +18 -0
  305. package/package.json +5 -4
  306. package/src/AlertDialog/AlertDialog.tsx +6 -5
  307. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  308. package/src/AppShell/AppShell.doc.mjs +1 -1
  309. package/src/AppShell/AppShell.spec.md +9 -12
  310. package/src/AppShell/AppShell.test.tsx +164 -2
  311. package/src/AppShell/AppShell.tsx +225 -5
  312. package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
  313. package/src/AppShell/observeMainOverflow.test.ts +173 -0
  314. package/src/AppShell/observeMainOverflow.ts +143 -0
  315. package/src/Avatar/Avatar.spec.md +22 -22
  316. package/src/Avatar/Avatar.tsx +18 -1
  317. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  318. package/src/Badge/Badge.doc.mjs +1 -1
  319. package/src/Badge/Badge.tsx +19 -2
  320. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  321. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  322. package/src/BottomSheet/BottomSheet.tsx +1 -1
  323. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  324. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  325. package/src/BottomSheet/useSheetGestures.ts +37 -6
  326. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  327. package/src/Button/Button.tsx +4 -4
  328. package/src/Calendar/Calendar.spec.md +87 -48
  329. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  330. package/src/Carousel/Carousel.doc.mjs +1 -1
  331. package/src/Carousel/Carousel.spec.md +9 -9
  332. package/src/Carousel/Carousel.test.tsx +124 -3
  333. package/src/Carousel/Carousel.tsx +10 -2
  334. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  335. package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
  336. package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
  337. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  338. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  339. package/src/ClickableCard/ClickableCard.tsx +48 -4
  340. package/src/Collapsible/Collapsible.spec.md +2 -0
  341. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  342. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  343. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  344. package/src/ComplexSelector/ComplexSelector.test.tsx +37 -0
  345. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  346. package/src/DateInput/DateInput.test.tsx +115 -3
  347. package/src/DateInput/DateInput.tsx +29 -14
  348. package/src/DateInput/DateInputTouch.test.tsx +76 -0
  349. package/src/DateInput/MonthScroller.tsx +106 -20
  350. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  351. package/src/DateInput/TouchDateField.tsx +14 -3
  352. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  353. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  354. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  355. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  356. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  357. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  358. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  359. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  360. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  361. package/src/Dialog/Dialog.test.tsx +216 -2
  362. package/src/Dialog/Dialog.tsx +42 -9
  363. package/src/Dialog/DialogHeader.tsx +5 -4
  364. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  365. package/src/Divider/Divider.tsx +2 -1
  366. package/src/Drawer/Drawer.spec.md +111 -80
  367. package/src/Drawer/Drawer.test.tsx +35 -0
  368. package/src/Drawer/Drawer.tsx +13 -2
  369. package/src/Drawer/DrawerHeader.spec.md +181 -0
  370. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  371. package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
  372. package/src/DropdownMenu/DropdownMenu.tsx +10 -3
  373. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  374. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  375. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  376. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  377. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  378. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  379. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  380. package/src/EmptyState/EmptyState.tsx +2 -1
  381. package/src/Field/FieldLabel.tsx +5 -4
  382. package/src/Field/InputClearButton.tsx +3 -3
  383. package/src/Field/PanelSearchInput.tsx +2 -2
  384. package/src/FieldStatus/FieldStatus.tsx +2 -2
  385. package/src/FileInput/FileInput.test.tsx +21 -0
  386. package/src/FileInput/FileInput.tsx +4 -1
  387. package/src/FormLayout/FormLayout.spec.md +7 -8
  388. package/src/Heading/Heading.tsx +1 -1
  389. package/src/Icon/Icon.tsx +1 -1
  390. package/src/Indicator/CheckIndicator.spec.md +47 -42
  391. package/src/Indicator/CheckIndicator.tsx +2 -1
  392. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  393. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  394. package/src/Indicator/Indicator.spec.md +188 -0
  395. package/src/Indicator/RadioIndicator.tsx +3 -1
  396. package/src/Item/Item.tsx +2 -1
  397. package/src/Item/ItemSwipeLayer.tsx +1 -1
  398. package/src/Kbd/Kbd.spec.md +81 -38
  399. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  400. package/src/Layer/popoverOperations.test.ts +205 -0
  401. package/src/Layer/popoverOperations.ts +172 -0
  402. package/src/Layer/useLayer.test.tsx +348 -1
  403. package/src/Layer/useLayer.tsx +118 -71
  404. package/src/Layout/Layout.spec.md +127 -131
  405. package/src/Layout/Layout.tsx +1 -1
  406. package/src/Layout/LayoutContent.spec.md +205 -0
  407. package/src/Layout/LayoutContent.tsx +1 -1
  408. package/src/Layout/LayoutFooter.spec.md +190 -0
  409. package/src/Layout/LayoutFooter.tsx +1 -1
  410. package/src/Layout/LayoutHeader.spec.md +193 -0
  411. package/src/Layout/LayoutHeader.tsx +1 -1
  412. package/src/Layout/LayoutPanel.spec.md +194 -0
  413. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  414. package/src/Lightbox/Lightbox.test.tsx +18 -0
  415. package/src/Lightbox/Lightbox.tsx +5 -0
  416. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  417. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  418. package/src/List/List.tsx +1 -1
  419. package/src/List/ListItem.spec.md +205 -0
  420. package/src/List/ListItem.tsx +3 -3
  421. package/src/MetadataList/MetadataList.spec.md +187 -0
  422. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  423. package/src/MobileNav/MobileNav.test.tsx +15 -0
  424. package/src/MobileNav/MobileNav.tsx +9 -1
  425. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  426. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  427. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  428. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  429. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  430. package/src/MultiSelector/MultiSelector.tsx +25 -10
  431. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  432. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  433. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  434. package/src/NumberInput/NumberInput.spec.md +59 -37
  435. package/src/NumberInput/NumberInput.tsx +13 -3
  436. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  437. package/src/NumberInput/numberParser.ts +7 -45
  438. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  439. package/src/ProgressBar/ProgressBar.tsx +58 -10
  440. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  441. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  442. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  443. package/src/Resizable/useResizable.test.ts +43 -0
  444. package/src/Resizable/useResizable.ts +32 -9
  445. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  446. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  447. package/src/Selector/Selector.test.tsx +90 -1
  448. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  449. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  450. package/src/Selector/useSelectorPresentation.ts +31 -3
  451. package/src/SideNav/SideNav.test.tsx +27 -0
  452. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  453. package/src/Skeleton/Skeleton.tsx +3 -1
  454. package/src/Slider/Slider.test.tsx +31 -0
  455. package/src/Slider/Slider.tsx +8 -3
  456. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  457. package/src/Spinner/Spinner.tsx +5 -3
  458. package/src/Stack/Stack.tsx +1 -1
  459. package/src/Stack/StackItem.tsx +1 -1
  460. package/src/TabList/TabList.test.tsx +58 -4
  461. package/src/TabList/TabList.tsx +16 -1
  462. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  463. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  464. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  465. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  466. package/src/Text/Text.tsx +1 -1
  467. package/src/Text/useTruncation.test.tsx +128 -1
  468. package/src/Text/useTruncation.ts +23 -5
  469. package/src/TextArea/TextArea.spec.md +10 -13
  470. package/src/TextArea/TextArea.test.tsx +60 -0
  471. package/src/TextArea/TextArea.tsx +15 -1
  472. package/src/TextInput/TextInput.test.tsx +21 -0
  473. package/src/TextInput/TextInput.tsx +3 -1
  474. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  475. package/src/TimeInput/Presentation.test.tsx +21 -0
  476. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  477. package/src/TimeInput/TimeInput.spec.md +45 -48
  478. package/src/TimeInput/TimeInput.test.tsx +76 -0
  479. package/src/TimeInput/TimeInput.tsx +36 -18
  480. package/src/TimeInput/TouchTimeField.tsx +4 -6
  481. package/src/Timestamp/Timestamp.spec.md +6 -12
  482. package/src/Timestamp/Timestamp.test.tsx +30 -5
  483. package/src/Timestamp/Timestamp.tsx +6 -2
  484. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  485. package/src/Toast/Toast.spec.md +14 -20
  486. package/src/Toast/Toast.tsx +104 -36
  487. package/src/Toast/ToastViewport.test.tsx +719 -1
  488. package/src/Toast/ToastViewport.tsx +100 -50
  489. package/src/Tokenizer/Tokenizer.spec.md +5 -3
  490. package/src/Tokenizer/Tokenizer.test.tsx +68 -0
  491. package/src/Tokenizer/Tokenizer.tsx +14 -2
  492. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
  493. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  494. package/src/Toolbar/Toolbar.spec.md +5 -6
  495. package/src/Toolbar/Toolbar.test.tsx +30 -0
  496. package/src/Toolbar/Toolbar.tsx +2 -1
  497. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  498. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  499. package/src/TopNav/TopNav.test.tsx +27 -0
  500. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  501. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  502. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  503. package/src/TopNav/TopNavMenu.tsx +1 -0
  504. package/src/Typeahead/Typeahead.test.tsx +40 -0
  505. package/src/Typeahead/Typeahead.tsx +12 -1
  506. package/src/__tests__/pressState.ts +8 -4
  507. package/src/gestures/GestureArena.ts +35 -0
  508. package/src/gestures/GestureHost.ts +2065 -0
  509. package/src/gestures/GestureRecognizer.ts +18 -0
  510. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  511. package/src/gestures/PanGestureRecognizer.ts +4 -0
  512. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  513. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  514. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  515. package/src/gestures/TapGestureRecognizer.ts +4 -0
  516. package/src/gestures/VelocityTracker.ts +10 -3
  517. package/src/gestures/__tests__/GestureHost.test.ts +2087 -0
  518. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  519. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  520. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  521. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  522. package/src/gestures/__tests__/arena.test.ts +5 -0
  523. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  524. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  525. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  526. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  527. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  528. package/src/gestures/__tests__/haptics.test.ts +187 -0
  529. package/src/gestures/__tests__/harness.ts +21 -2
  530. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  531. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  532. package/src/gestures/haptics.ts +203 -0
  533. package/src/gestures/nativeScroll.ts +277 -0
  534. package/src/gestures/touchAction.ts +191 -0
  535. package/src/gestures/touchActionRule.ts +157 -0
  536. package/src/gestures/types.ts +30 -9
  537. package/src/hooks/index.ts +5 -1
  538. package/src/hooks/modalAnnounce.ts +129 -72
  539. package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
  540. package/src/hooks/scrollKeyboardDelegation.ts +9 -3
  541. package/src/hooks/useAdaptivePresentation.ts +4 -1
  542. package/src/hooks/useAnnounce.doc.mjs +35 -3
  543. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  544. package/src/hooks/useAnnounce.ts +209 -102
  545. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  546. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  547. package/src/hooks/useBusyAnnouncement.ts +7 -10
  548. package/src/hooks/useMenuHover.ts +15 -1
  549. package/src/hooks/useScrollOverflow.doc.mjs +1 -1
  550. package/src/hooks/useScrollOverflow.test.tsx +102 -1
  551. package/src/hooks/useScrollOverflow.ts +59 -10
  552. package/src/i18n/generated-locales/en.generated.ts +7 -0
  553. package/src/i18n/generated-locales/pseudo.generated.ts +7 -0
  554. package/src/motion/README.md +11 -1
  555. package/src/motion/animator.test.ts +151 -3
  556. package/src/motion/animator.ts +149 -33
  557. package/src/theme/Theme.doc.mjs +1 -1
  558. package/src/theme/defineTheme.ts +117 -8
  559. package/src/theme/derivedVarRegistry.test.ts +4 -0
  560. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  561. package/src/theme/domainTokens/index.ts +6 -10
  562. package/src/theme/expandMotionScale.test.ts +1 -1
  563. package/src/theme/index.ts +5 -0
  564. package/src/theme/motionKnobs.ts +82 -0
  565. package/src/theme/resolveThemeValues.ts +68 -6
  566. package/src/theme/themeAdaptations.ts +52 -12
  567. package/src/theme/themeMotion.test.ts +620 -0
  568. package/src/theme/themeMotion.ts +221 -0
  569. package/src/theme/tokenReferences.ts +149 -0
  570. package/src/theme/tokens.stylex.ts +10 -0
  571. package/src/theme/tokens.ts +15 -158
  572. package/src/utils/focusReturn.ts +17 -6
  573. package/src/utils/getNodeText.test.ts +24 -0
  574. package/src/utils/getNodeText.ts +37 -0
  575. package/src/utils/interactionModality.test.ts +45 -1
  576. package/src/utils/interactionModality.ts +64 -5
  577. package/src/utils/interactionOverlay.stylex.ts +12 -3
  578. package/src/utils/plainDate.test.ts +90 -0
  579. package/src/utils/plainDate.ts +58 -3
  580. package/src/utils/presentation.test.ts +380 -0
  581. package/src/utils/presentation.ts +180 -0
  582. package/src/utils/pressFeedback.test.ts +138 -0
  583. package/src/utils/pressFeedback.ts +34 -11
  584. package/src/utils/pressPaintPriority.test.ts +80 -0
  585. package/src/utils/primaryClick.test.ts +38 -0
  586. package/src/utils/primaryClick.ts +28 -0
  587. package/src/utils/sharedMutationObserver.test.ts +54 -1
  588. package/src/utils/sharedMutationObserver.ts +87 -29
  589. package/src/utils/timeFormat.test.ts +204 -0
  590. package/src/utils/timeFormat.ts +314 -0
  591. package/src/utils/touchPresentation.stylex.ts +43 -0
  592. package/src/utils/touchPresentation.test.ts +140 -1
  593. package/src/utils/touchPresentation.ts +5 -3
  594. package/src/utils/unicodeDigits.test.ts +44 -0
  595. package/src/utils/unicodeDigits.ts +71 -0
@@ -0,0 +1,177 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file themeMotion.ts
5
+ * @input A theme's motion configuration: the knobs (`tempo`, `character`),
6
+ * the existing `MotionScaleConfig`, or both
7
+ * @output The resolved knobs, the motion tokens they generate, and
8
+ * `resolveThemeMotion`, the internal resolver the animator and server code
9
+ * read (`spec:AST-108` FR1, FR2, FR5, FR6)
10
+ * @position Theme utility; consumed by resolveThemeValues.ts. Pure: no DOM,
11
+ * no import-time work, safe on the server.
12
+ *
13
+ * `tempo` scales every motion duration token, clamped to 0.75–1.5.
14
+ * `character` picks the entrance and move curves. Every theme follows each
15
+ * person's Reduce Motion setting (`reducedMotion` resolves to `'system'`).
16
+ * No spring reads the knobs yet. With the defaults (tempo 1, `'standard'`, `'system'`) every token is
17
+ * today's.
18
+ *
19
+ * A `MotionScaleConfig` keeps generating its duration tokens, and its fields
20
+ * win over `tempo` (FR5); explicit `tokens` win over both in
21
+ * resolveThemeValues.
22
+ *
23
+ * SYNC: When modified, update:
24
+ * - /packages/core/src/theme/themeMotion.test.ts
25
+ * - /packages/core/src/theme/resolveThemeValues.ts
26
+ * - /packages/core/src/theme/defineTheme.ts (the `motion` field's docs)
27
+ */
28
+
29
+ import { expandMotionScale } from "./expandMotionScale.js";
30
+ import { resolveKnobs } from "./motionKnobs.js";
31
+ import { durationDefaults, easeDefaults } from "./tokens.stylex.js";
32
+ import { resolveTokenReferences } from "./tokenReferences.js";
33
+ export { TEMPO_RANGE } from "./motionKnobs.js";
34
+
35
+ /**
36
+ * A theme's `motion`: the knobs, the existing `MotionScaleConfig`, or both.
37
+ * A `MotionScaleConfig`'s fields win over `tempo` for the durations they set.
38
+ */
39
+
40
+ /**
41
+ * The entrance and move curve at each character. `'standard'` is the theme's
42
+ * `--ease-standard`, so a theme that overrides that easing keeps its entrances
43
+ * on it.
44
+ */
45
+ export const CHARACTER_EASE = {
46
+ crisp: 'cubic-bezier(0, 0, 0.2, 1)',
47
+ standard: null,
48
+ expressive: 'cubic-bezier(0.3, 1.2, 0.5, 1)'
49
+ };
50
+
51
+ /** The knobs of `config`, defaults filled in, `tempo` clamped. */
52
+ export function resolveMotionKnobs(config) {
53
+ return resolveKnobs(config);
54
+ }
55
+ function isScaleConfig(config) {
56
+ return 'fast' in config && 'medium' in config && 'ratio' in config;
57
+ }
58
+
59
+ /** A duration token's value in ms (`'175ms'` → 175). */
60
+ function msOf(value) {
61
+ return Number.parseFloat(value);
62
+ }
63
+
64
+ /**
65
+ * The private custom property a theme with a `tempo` writes beside its
66
+ * duration tokens: the press release fade (`utils/interactionOverlay.stylex.ts`)
67
+ * multiplies its clock by it.
68
+ */
69
+ export const MOTION_TEMPO_PROPERTY = '--_astryx-motion-tempo';
70
+
71
+ /** The duration tokens at `tempo`: today's values times it, to the ms. */
72
+ export function durationTokensAt(tempo) {
73
+ const tokens = {};
74
+ for (const [name, value] of Object.entries(durationDefaults)) {
75
+ tokens[name] = `${Math.round(msOf(value) * tempo)}ms`;
76
+ }
77
+ return tokens;
78
+ }
79
+
80
+ /**
81
+ * The private custom property holding a duration token's value before
82
+ * `tempo` scaled it (`--duration-slow` → `--_astryx-pre-tempo-duration-slow`).
83
+ * Busy loops (Spinner, Skeleton) read it, falling back to the token, so their
84
+ * timing follows a duration scale or an explicit token but never `tempo`
85
+ * (FR4). Private, like every property the knobs add beside the core tokens
86
+ * (`architecture:theme-tokens` INV1).
87
+ */
88
+ export function preTempoName(token) {
89
+ return token.replace(/^--duration-/, '--_astryx-pre-tempo-duration-');
90
+ }
91
+
92
+ /**
93
+ * The motion tokens `config` generates (FR2, FR5): `--duration-*` times
94
+ * `tempo`, with a `MotionScaleConfig`'s own durations winning, and the
95
+ * job-named `--ease-entrance` and `--ease-move` at the theme's character.
96
+ * A knob the config leaves out writes nothing, so a theme extending another
97
+ * keeps the base's value for it; a knob it sets is written even at its
98
+ * default, so a child can set a base's tempo back to 1.
99
+ */
100
+ export function expandThemeMotion(config) {
101
+ const knobs = resolveMotionKnobs(config);
102
+ const tokens = {};
103
+ if (knobs.tempoIsSet) {
104
+ Object.assign(tokens, durationTokensAt(knobs.tempo));
105
+ for (const [name, value] of Object.entries(durationDefaults)) {
106
+ tokens[preTempoName(name)] = value;
107
+ }
108
+ // The press release fade, a fixed clock in the stylesheet, scales by the
109
+ // tempo itself (FR4; `component:Button` FR15), read where it plays.
110
+ tokens[MOTION_TEMPO_PROPERTY] = String(knobs.tempo);
111
+ }
112
+ if (isScaleConfig(config)) {
113
+ const scale = expandMotionScale(config);
114
+ Object.assign(tokens, scale);
115
+ if (knobs.tempoIsSet) {
116
+ for (const [name, value] of Object.entries(scale)) {
117
+ if (name.startsWith('--duration-')) {
118
+ tokens[preTempoName(name)] = value;
119
+ }
120
+ }
121
+ }
122
+ }
123
+ const scaleEasing = isScaleConfig(config) && config.easing != null ? config.easing : null;
124
+ const ease = CHARACTER_EASE[knobs.character] ?? (config.character != null ? scaleEasing ?? easeDefaults['--ease-standard'] : scaleEasing);
125
+ if (ease != null) {
126
+ tokens['--ease-entrance'] = ease;
127
+ tokens['--ease-move'] = ease;
128
+ }
129
+ return tokens;
130
+ }
131
+
132
+ /** What `resolveThemeMotion` returns for a theme. */
133
+
134
+ /**
135
+ * A theme's motion values, for the animator and for server code (FR6): the
136
+ * knobs, and the duration and easing tokens they resolve to with the theme's
137
+ * explicit tokens applied. A token written as a reference (`var(--name)`)
138
+ * resolves through the theme's tokens, as `resolveThemeTokens` resolves it
139
+ * (`architecture:theme-tokens` INV6). Pure: it reads only `theme`.
140
+ */
141
+ export function resolveThemeMotion(theme) {
142
+ // A defined theme's motion is its axes': its own merged with its base's.
143
+ const config = theme.__axes?.motion ?? theme.motion;
144
+ const knobs = resolveMotionKnobs(config);
145
+ const generated = config ? expandThemeMotion(config) : {};
146
+ // The graph the references resolve through: the defaults, the knobs'
147
+ // tokens, then the theme's own (a light/dark pair is not a motion value, so
148
+ // only plain strings take part).
149
+ const graph = {
150
+ ...durationDefaults,
151
+ ...easeDefaults,
152
+ ...generated
153
+ };
154
+ for (const tokens of [theme.localTokens, theme.tokens]) {
155
+ for (const [name, value] of Object.entries(tokens ?? {})) {
156
+ if (typeof value === 'string') {
157
+ graph[name] = value;
158
+ }
159
+ }
160
+ }
161
+ const explicit = name => typeof theme.tokens?.[name] === 'string' || name in generated;
162
+ const resolved = resolveTokenReferences(graph);
163
+ const durations = {};
164
+ for (const name of Object.keys(durationDefaults)) {
165
+ durations[name] = resolved[name];
166
+ }
167
+ const standard = resolved['--ease-standard'];
168
+ return {
169
+ knobs,
170
+ durations,
171
+ easings: {
172
+ '--ease-standard': standard,
173
+ '--ease-entrance': explicit('--ease-entrance') ? resolved['--ease-entrance'] : standard,
174
+ '--ease-move': explicit('--ease-move') ? resolved['--ease-move'] : standard
175
+ }
176
+ };
177
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @file tokenReferences.ts
3
+ * @input A flat map of token names to raw CSS values
4
+ * @output `resolveTokenReferences`, which follows `var(--name[, fallback])`
5
+ * references through the map, and the CSS parsing helpers it shares
6
+ * (`splitTopLevelComma`, `findMatchingParen`)
7
+ * @position Theme utility with no imports: tokens.ts resolves a theme's token
8
+ * graph on it (evaluating color functions as it goes), and themeMotion.ts
9
+ * resolves motion tokens written as references on it. Pure; safe on the
10
+ * server.
11
+ *
12
+ * SYNC: When modified, update:
13
+ * - /packages/core/src/theme/tokens.ts
14
+ * - /packages/core/src/theme/themeMotion.ts
15
+ */
16
+ /**
17
+ * Split the arguments of a CSS function body on the first top-level comma.
18
+ * Handles nested functions such as rgba(), color-mix(), var(), and quoted strings.
19
+ */
20
+ export declare function splitTopLevelComma(input: string): [string, string] | null;
21
+ /** Index of the `)` matching the `(` at `openIndex`, or -1 when unbalanced. */
22
+ export declare function findMatchingParen(input: string, openIndex: number): number;
23
+ /**
24
+ * Resolves every value in `raw` to a concrete one: each `var(--name[,
25
+ * fallback])` is replaced by `name`'s resolved value, or by its fallback when
26
+ * `raw` has no `name`, and is kept as written when neither exists or the
27
+ * references form a cycle. `evaluate` then runs on each substituted value
28
+ * (tokens.ts evaluates CSS color functions there).
29
+ */
30
+ export declare function resolveTokenReferences(raw: Readonly<Record<string, string>>, evaluate?: (expr: string) => string): Record<string, string>;
31
+ //# sourceMappingURL=tokenReferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenReferences.d.ts","sourceRoot":"","sources":["../../src/theme/tokenReferences.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAwCzE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAc1E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACrC,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAqB,GAChD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyDxB"}
@@ -0,0 +1,132 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file tokenReferences.ts
5
+ * @input A flat map of token names to raw CSS values
6
+ * @output `resolveTokenReferences`, which follows `var(--name[, fallback])`
7
+ * references through the map, and the CSS parsing helpers it shares
8
+ * (`splitTopLevelComma`, `findMatchingParen`)
9
+ * @position Theme utility with no imports: tokens.ts resolves a theme's token
10
+ * graph on it (evaluating color functions as it goes), and themeMotion.ts
11
+ * resolves motion tokens written as references on it. Pure; safe on the
12
+ * server.
13
+ *
14
+ * SYNC: When modified, update:
15
+ * - /packages/core/src/theme/tokens.ts
16
+ * - /packages/core/src/theme/themeMotion.ts
17
+ */
18
+
19
+ /**
20
+ * Split the arguments of a CSS function body on the first top-level comma.
21
+ * Handles nested functions such as rgba(), color-mix(), var(), and quoted strings.
22
+ */
23
+ export function splitTopLevelComma(input) {
24
+ let depth = 0;
25
+ let quote = null;
26
+ let isEscaped = false;
27
+ for (let i = 0; i < input.length; i++) {
28
+ const char = input[i];
29
+ if (quote !== null) {
30
+ if (isEscaped) {
31
+ isEscaped = false;
32
+ } else if (char === '\\') {
33
+ isEscaped = true;
34
+ } else if (char === quote) {
35
+ quote = null;
36
+ }
37
+ continue;
38
+ }
39
+ if (char === '"' || char === "'") {
40
+ quote = char;
41
+ continue;
42
+ }
43
+ if (char === '(') {
44
+ depth++;
45
+ continue;
46
+ }
47
+ if (char === ')') {
48
+ depth = Math.max(0, depth - 1);
49
+ continue;
50
+ }
51
+ if (char === ',' && depth === 0) {
52
+ return [input.slice(0, i).trim(), input.slice(i + 1).trim()];
53
+ }
54
+ }
55
+ return null;
56
+ }
57
+
58
+ /** Index of the `)` matching the `(` at `openIndex`, or -1 when unbalanced. */
59
+ export function findMatchingParen(input, openIndex) {
60
+ let depth = 0;
61
+ for (let i = openIndex; i < input.length; i++) {
62
+ const char = input[i];
63
+ if (char === '(') {
64
+ depth++;
65
+ } else if (char === ')') {
66
+ depth--;
67
+ if (depth === 0) {
68
+ return i;
69
+ }
70
+ }
71
+ }
72
+ return -1;
73
+ }
74
+
75
+ /**
76
+ * Resolves every value in `raw` to a concrete one: each `var(--name[,
77
+ * fallback])` is replaced by `name`'s resolved value, or by its fallback when
78
+ * `raw` has no `name`, and is kept as written when neither exists or the
79
+ * references form a cycle. `evaluate` then runs on each substituted value
80
+ * (tokens.ts evaluates CSS color functions there).
81
+ */
82
+ export function resolveTokenReferences(raw, evaluate = expr => expr) {
83
+ const cache = {};
84
+
85
+ // `seen` tracks the reference chain, so a cycle resolves to the literal
86
+ // reference instead of recursing forever.
87
+ const substitute = (expr, seen) => {
88
+ const start = expr.indexOf('var(');
89
+ if (start === -1) {
90
+ return expr;
91
+ }
92
+ const openIndex = start + 'var'.length;
93
+ const closeIndex = findMatchingParen(expr, openIndex);
94
+ if (closeIndex === -1) {
95
+ return expr;
96
+ }
97
+ const inner = expr.slice(openIndex + 1, closeIndex);
98
+ const commaSplit = splitTopLevelComma(inner);
99
+ const name = (commaSplit ? commaSplit[0] : inner).trim();
100
+ const fallback = commaSplit ? commaSplit[1] : null;
101
+ let replacement;
102
+ if (seen.has(name)) {
103
+ replacement = expr.slice(start, closeIndex + 1);
104
+ } else if (name in raw) {
105
+ seen.add(name);
106
+ replacement = reference(name, seen);
107
+ seen.delete(name);
108
+ } else if (fallback !== null) {
109
+ replacement = substitute(fallback.trim(), seen);
110
+ } else {
111
+ replacement = expr.slice(start, closeIndex + 1);
112
+ }
113
+ const rest = substitute(expr.slice(closeIndex + 1), seen);
114
+ return expr.slice(0, start) + replacement + rest;
115
+ };
116
+ const reference = (name, seen) => {
117
+ if (name in cache) {
118
+ return cache[name];
119
+ }
120
+ const value = raw[name];
121
+ if (value === undefined) {
122
+ return '';
123
+ }
124
+ const resolved = evaluate(value.includes('var(') ? substitute(value, seen) : value);
125
+ cache[name] = resolved;
126
+ return resolved;
127
+ };
128
+ for (const name of Object.keys(raw)) {
129
+ reference(name, new Set());
130
+ }
131
+ return cache;
132
+ }
@@ -15,6 +15,7 @@
15
15
  *
16
16
  * SYNC: When modified, update:
17
17
  * - /packages/core/src/theme/useTheme.ts
18
+ * - /packages/core/src/theme/tokenReferences.ts (the `var()` resolver)
18
19
  * - /packages/core/src/theme/index.ts
19
20
  */
20
21
  import { type DefinedTheme, type TokenName } from './defineTheme.js';
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/theme/tokens.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EAEf,MAAM,eAAe,CAAC;AAIvB,kFAAkF;AAClF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,kGAAkG;IAClG,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,2DAA2D;AAC3D,MAAM,WAAW,wBAAyB,SAAQ,yBAAyB;IACzE,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,CAEhE;AAED,sFAAsF;AACtF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAElB,CAAC;AAqT/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACtC,OAAO,EAAE,yBAAyB,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8CxB;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACtC,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAC/B,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAGR"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/theme/tokens.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,SAAS,EAEf,MAAM,eAAe,CAAC;AASvB,kFAAkF;AAClF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEjD,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,kGAAkG;IAClG,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,2DAA2D;AAC3D,MAAM,WAAW,wBAAyB,SAAQ,yBAAyB;IACzE,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,CAEhE;AAED,sFAAsF;AACtF,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAElB,CAAC;AAgK/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACtC,OAAO,EAAE,yBAAyB,GACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8CxB;AAED,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACtC,IAAI,EAAE,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EAC/B,OAAO,EAAE,wBAAwB,GAChC,MAAM,CAGR"}
@@ -17,12 +17,14 @@
17
17
  *
18
18
  * SYNC: When modified, update:
19
19
  * - /packages/core/src/theme/useTheme.ts
20
+ * - /packages/core/src/theme/tokenReferences.ts (the `var()` resolver)
20
21
  * - /packages/core/src/theme/index.ts
21
22
  */
22
23
 
23
24
  import { tokenDefaults } from "./defineTheme.js";
24
25
  import { parseColor, formatColor } from "../utils/color.js";
25
26
  import { generatedScopedStatusRoleDefaults } from "./generateThemeRules.js";
27
+ import { findMatchingParen, resolveTokenReferences, splitTopLevelComma } from "./tokenReferences.js";
26
28
 
27
29
  /** Resolved color mode used when choosing the side of light/dark token values. */
28
30
 
@@ -54,45 +56,6 @@ export function tokenVar(name) {
54
56
  /** Flat map of every known Astryx token name to its `var(--token-name)` reference. */
55
57
  export const tokenVars = Object.fromEntries(Object.keys(tokenDefaults).map(name => [name, tokenVar(name)]));
56
58
 
57
- /**
58
- * Split the arguments of a CSS function body on the first top-level comma.
59
- * Handles nested functions such as rgba(), color-mix(), var(), and quoted strings.
60
- */
61
- function splitTopLevelComma(input) {
62
- let depth = 0;
63
- let quote = null;
64
- let isEscaped = false;
65
- for (let i = 0; i < input.length; i++) {
66
- const char = input[i];
67
- if (quote !== null) {
68
- if (isEscaped) {
69
- isEscaped = false;
70
- } else if (char === '\\') {
71
- isEscaped = true;
72
- } else if (char === quote) {
73
- quote = null;
74
- }
75
- continue;
76
- }
77
- if (char === '"' || char === "'") {
78
- quote = char;
79
- continue;
80
- }
81
- if (char === '(') {
82
- depth++;
83
- continue;
84
- }
85
- if (char === ')') {
86
- depth = Math.max(0, depth - 1);
87
- continue;
88
- }
89
- if (char === ',' && depth === 0) {
90
- return [input.slice(0, i).trim(), input.slice(i + 1).trim()];
91
- }
92
- }
93
- return null;
94
- }
95
-
96
59
  /** Parse a CSS light-dark(light, dark) function into its two argument values. */
97
60
  function parseLightDark(value) {
98
61
  const trimmed = value.trim();
@@ -129,27 +92,11 @@ function resolveXDSTokenValue(value, mode) {
129
92
  // Generated themes emit derived tokens as references to other tokens rather
130
93
  // than baked-in values, so a scoped CSS override of a base token re-themes the
131
94
  // subtree that references it. The CSS cascade resolves those references, but
132
- // non-CSS consumers (canvas, SVG, data-viz) need the concrete value. These
133
- // helpers replay the same resolution in JS: follow `var()` references through
134
- // the resolved token map (iteratively, guarding against cycles) and evaluate
135
- // the CSS color functions used by the theme generator against those values.
136
-
137
- /** Index of the `)` matching the `(` at `openIndex`, or -1 when unbalanced. */
138
- function findMatchingParen(input, openIndex) {
139
- let depth = 0;
140
- for (let i = openIndex; i < input.length; i++) {
141
- const char = input[i];
142
- if (char === '(') {
143
- depth++;
144
- } else if (char === ')') {
145
- depth--;
146
- if (depth === 0) {
147
- return i;
148
- }
149
- }
150
- }
151
- return -1;
152
- }
95
+ // non-CSS consumers (canvas, SVG, data-viz) need the concrete value. The same
96
+ // resolution replays in JS: tokenReferences.ts follows `var()` references
97
+ // through the resolved token map (guarding against cycles), and these helpers
98
+ // evaluate the CSS color functions used by the theme generator against those
99
+ // values.
153
100
 
154
101
  /** Split a color-mix component into its color and optional percentage. */
155
102
  function parseMixComponent(part) {
@@ -262,73 +209,6 @@ function evaluateColorFunctions(expr) {
262
209
  return expr.slice(0, idx) + replacement + evaluateColorFunctions(expr.slice(closeIndex + 1));
263
210
  }
264
211
 
265
- /**
266
- * Substitute `var(--name[, fallback])` references with their resolved values.
267
- * `seen` tracks the reference chain so cycles resolve to the literal reference
268
- * instead of recursing forever.
269
- */
270
- function substituteVars(expr, raw, cache, seen) {
271
- const start = expr.indexOf('var(');
272
- if (start === -1) {
273
- return expr;
274
- }
275
- const openIndex = start + 'var'.length;
276
- const closeIndex = findMatchingParen(expr, openIndex);
277
- if (closeIndex === -1) {
278
- return expr;
279
- }
280
- const inner = expr.slice(openIndex + 1, closeIndex);
281
- const commaSplit = splitTopLevelComma(inner);
282
- const name = (commaSplit ? commaSplit[0] : inner).trim();
283
- const fallback = commaSplit ? commaSplit[1] : null;
284
- let replacement;
285
- if (seen.has(name)) {
286
- replacement = expr.slice(start, closeIndex + 1);
287
- } else if (name in raw) {
288
- seen.add(name);
289
- replacement = resolveReference(name, raw, cache, seen);
290
- seen.delete(name);
291
- } else if (fallback !== null) {
292
- replacement = substituteVars(fallback.trim(), raw, cache, seen);
293
- } else {
294
- replacement = expr.slice(start, closeIndex + 1);
295
- }
296
- const rest = substituteVars(expr.slice(closeIndex + 1), raw, cache, seen);
297
- return expr.slice(0, start) + replacement + rest;
298
- }
299
-
300
- /** Fully resolve a single expression: substitute references, then evaluate colors. */
301
- function resolveExpression(expr, raw, cache, seen) {
302
- if (!expr.includes('var(') && !expr.includes('color-mix(')) {
303
- return expr;
304
- }
305
- const substituted = substituteVars(expr, raw, cache, seen);
306
- return evaluateColorFunctions(substituted);
307
- }
308
-
309
- /** Resolve one token by name, memoizing the result in `cache`. */
310
- function resolveReference(name, raw, cache, seen) {
311
- if (name in cache) {
312
- return cache[name];
313
- }
314
- const value = raw[name];
315
- if (value === undefined) {
316
- return '';
317
- }
318
- const resolved = resolveExpression(value, raw, cache, seen);
319
- cache[name] = resolved;
320
- return resolved;
321
- }
322
-
323
- /** Resolve every reference/color function in a raw token map to concrete values. */
324
- function resolveReferences(raw) {
325
- const cache = {};
326
- for (const name of Object.keys(raw)) {
327
- resolveReference(name, raw, cache, new Set());
328
- }
329
- return cache;
330
- }
331
-
332
212
  /**
333
213
  * Resolve all Astryx token values for a theme and effective color mode.
334
214
  *
@@ -352,7 +232,7 @@ export function resolveThemeTokens(theme, options) {
352
232
  resolved[key] = resolveXDSTokenValue(value, mode);
353
233
  }
354
234
  if (theme == null) {
355
- return resolveReferences(resolved);
235
+ return resolveTokenReferences(resolved, evaluateColorFunctions);
356
236
  }
357
237
 
358
238
  // A theme's local tokens resolve its references to them, then leave the
@@ -378,7 +258,7 @@ export function resolveThemeTokens(theme, options) {
378
258
  }
379
259
  }
380
260
  }
381
- return Object.fromEntries(Object.entries(resolveReferences(resolved)).filter(([key]) => !localKeys.has(key)));
261
+ return Object.fromEntries(Object.entries(resolveTokenReferences(resolved, evaluateColorFunctions)).filter(([key]) => !localKeys.has(key)));
382
262
  }
383
263
 
384
264
  /** Resolve one Astryx token value for a theme and effective color mode. */
@@ -340,10 +340,22 @@ export declare const durationVars: stylex.VarGroup<Readonly<{
340
340
  export type DurationVarName = keyof typeof durationDefaults;
341
341
  export declare const easeDefaults: {
342
342
  readonly '--ease-standard': "cubic-bezier(0.24, 1, 0.4, 1)";
343
+ /**
344
+ * Entrances: a layer or element arriving. A theme's `character` sets it
345
+ * (spec:AST-108 FR2); at `'standard'` it equals --ease-standard.
346
+ */
347
+ readonly '--ease-entrance': "cubic-bezier(0.24, 1, 0.4, 1)";
348
+ /**
349
+ * Moves: an element changing place or size on screen. A theme's
350
+ * `character` sets it; at `'standard'` it equals --ease-standard.
351
+ */
352
+ readonly '--ease-move': "cubic-bezier(0.24, 1, 0.4, 1)";
343
353
  readonly '--ease-exit': "cubic-bezier(0.3, 0, 0.6, 0.6)";
344
354
  };
345
355
  export declare const easeVars: stylex.VarGroup<Readonly<{
346
356
  readonly '--ease-standard': "cubic-bezier(0.24, 1, 0.4, 1)";
357
+ readonly '--ease-entrance': "cubic-bezier(0.24, 1, 0.4, 1)";
358
+ readonly '--ease-move': "cubic-bezier(0.24, 1, 0.4, 1)";
347
359
  readonly '--ease-exit': "cubic-bezier(0.3, 0, 0.6, 0.6)";
348
360
  }>, symbol>;
349
361
  export type EaseVarName = keyof typeof easeDefaults;
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.stylex.d.ts","sourceRoot":"","sources":["../../src/theme/tokens.stylex.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAM3C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsJhB,CAAC;AAEX,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAmC,CAAC;AAS1D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;CAgBlB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;WAAqC,CAAC;AAM9D,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;WAAkC,CAAC;AAMxD,eAAO,MAAM,cAAc;;CAEjB,CAAC;AAEX,eAAO,MAAM,UAAU;;WAAoC,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AAWxD,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,eAAO,MAAM,SAAS;;;;;WAAmC,CAAC;AAM1D,eAAO,MAAM,cAAc;;;;;;;;CAWjB,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;WAAoC,CAAC;AAQ5D,eAAO,MAAM,cAAc;;;;;;;;;CAejB,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;WAAoC,CAAC;AAU5D,eAAO,MAAM,gBAAgB;;;;;;;;;;CAUnB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;WAAsC,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAU5D,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,eAAO,MAAM,QAAQ;;;WAAkC,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,YAAY,CAAC;AAKpD,eAAO,MAAM,kBAAkB;;;;CAMrB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;WAAwC,CAAC;AAMpE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAcnB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;WAAsC,CAAC;AAMhE,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;WAAwC,CAAC;AAMpE,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AACtD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,YAAY,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAC5D,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAehE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DpB,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAuC,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,iBAAiB,CAAC"}
1
+ {"version":3,"file":"tokens.stylex.d.ts","sourceRoot":"","sources":["../../src/theme/tokens.stylex.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAM3C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsJhB,CAAC;AAEX,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAmC,CAAC;AAS1D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;CAgBlB,CAAC;AAEX,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;WAAqC,CAAC;AAM9D,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;WAAkC,CAAC;AAMxD,eAAO,MAAM,cAAc;;CAEjB,CAAC;AAEX,eAAO,MAAM,UAAU;;WAAoC,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AAWxD,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,eAAO,MAAM,SAAS;;;;;WAAmC,CAAC;AAM1D,eAAO,MAAM,cAAc;;;;;;;;CAWjB,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;WAAoC,CAAC;AAQ5D,eAAO,MAAM,cAAc;;;;;;;;;CAejB,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;WAAoC,CAAC;AAU5D,eAAO,MAAM,gBAAgB;;;;;;;;;;CAUnB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;WAAsC,CAAC;AAEhE,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAU5D,eAAO,MAAM,YAAY;;IAEvB;;;OAGG;;IAEH;;;OAGG;;;CAGK,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;;WAAkC,CAAC;AAExD,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,YAAY,CAAC;AAKpD,eAAO,MAAM,kBAAkB;;;;CAMrB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;WAAwC,CAAC;AAMpE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAcnB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;;;;;WAAsC,CAAC;AAMhE,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAEX,eAAO,MAAM,cAAc;;;;;WAAwC,CAAC;AAMpE,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,aAAa,CAAC;AACtD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,eAAe,CAAC;AAC1D,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,YAAY,CAAC;AACpD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,cAAc,CAAC;AACxD,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAC5D,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,kBAAkB,CAAC;AAehE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DpB,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAAuC,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,iBAAiB,CAAC"}
@@ -455,10 +455,22 @@ export const durationVars = {
455
455
 
456
456
  export const easeDefaults = {
457
457
  '--ease-standard': 'cubic-bezier(0.24, 1, 0.4, 1)',
458
+ /**
459
+ * Entrances: a layer or element arriving. A theme's `character` sets it
460
+ * (spec:AST-108 FR2); at `'standard'` it equals --ease-standard.
461
+ */
462
+ '--ease-entrance': 'cubic-bezier(0.24, 1, 0.4, 1)',
463
+ /**
464
+ * Moves: an element changing place or size on screen. A theme's
465
+ * `character` sets it; at `'standard'` it equals --ease-standard.
466
+ */
467
+ '--ease-move': 'cubic-bezier(0.24, 1, 0.4, 1)',
458
468
  '--ease-exit': 'cubic-bezier(0.3, 0, 0.6, 0.6)'
459
469
  };
460
470
  export const easeVars = {
461
471
  "--ease-standard": "var(--ease-standard)",
472
+ "--ease-entrance": "var(--ease-entrance)",
473
+ "--ease-move": "var(--ease-move)",
462
474
  "--ease-exit": "var(--ease-exit)",
463
475
  __varGroupHash__: "xf09i69"
464
476
  };
@@ -1,3 +1,15 @@
1
+ /**
2
+ * @file focusReturn.ts
3
+ * @input The document's current active element and the shared interaction
4
+ * modality.
5
+ * @output Whether focus is currently "detached" — on nothing in particular —
6
+ * and a focus move whose ring follows the last input.
7
+ * @position Utility; used by overlay triggers (e.g. DateInput, DateTimeInput)
8
+ * that return focus to their control when the overlay closes, but only when
9
+ * the dismiss did not already move focus somewhere the user chose, and by
10
+ * overlays (Dialog, DropdownMenu) that move focus programmatically.
11
+ */
12
+ import { type InteractionModality } from './interactionModality.js';
1
13
  /**
2
14
  * True when focus rests on nothing in particular — no active element, or the
3
15
  * document body / root element.
@@ -21,8 +33,12 @@ export declare function isFocusDetached(doc?: Document): boolean;
21
33
  * autofocus target, the control that opened a Dialog, or a menu trigger the
22
34
  * caller renders. Pass `options` (for example `preventScroll`) as to `focus()`.
23
35
  *
36
+ * `modality` defaults to the page's last input. A caller moving focus inside a
37
+ * second document (a same-origin iframe, a Document Picture-in-Picture window)
38
+ * passes that document's, which it tracks with `trackInteractionModalityIn`.
39
+ *
24
40
  * Make sure modality tracking is active (`useInteractionModalityTracking()`)
25
41
  * in the component that calls this.
26
42
  */
27
- export declare function focusForLastInput(element: HTMLElement, options?: FocusOptions): void;
43
+ export declare function focusForLastInput(element: HTMLElement, options?: FocusOptions, modality?: InteractionModality): void;
28
44
  //# sourceMappingURL=focusReturn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"focusReturn.d.ts","sourceRoot":"","sources":["../../src/utils/focusReturn.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,QAAmB,GAAG,OAAO,CAKjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,YAAY,GACrB,IAAI,CAwBN"}
1
+ {"version":3,"file":"focusReturn.d.ts","sourceRoot":"","sources":["../../src/utils/focusReturn.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAEL,KAAK,mBAAmB,EACzB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,GAAG,GAAE,QAAmB,GAAG,OAAO,CAKjE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,YAAY,EACtB,QAAQ,GAAE,mBAA8C,GACvD,IAAI,CA2BN"}
@@ -41,14 +41,21 @@ export function isFocusDetached(doc = document) {
41
41
  * autofocus target, the control that opened a Dialog, or a menu trigger the
42
42
  * caller renders. Pass `options` (for example `preventScroll`) as to `focus()`.
43
43
  *
44
+ * `modality` defaults to the page's last input. A caller moving focus inside a
45
+ * second document (a same-origin iframe, a Document Picture-in-Picture window)
46
+ * passes that document's, which it tracks with `trackInteractionModalityIn`.
47
+ *
44
48
  * Make sure modality tracking is active (`useInteractionModalityTracking()`)
45
49
  * in the component that calls this.
46
50
  */
47
- export function focusForLastInput(element, options) {
51
+ export function focusForLastInput(element, options, modality = getInteractionModality()) {
48
52
  // A text-entry field paints its own focus treatment to show where typing
49
- // goes, and an extra blur there can run validation or mark it touched.
50
- const isTextEntry = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement || element.isContentEditable;
51
- if (isTextEntry || getInteractionModality() !== 'pointer') {
53
+ // goes, and an extra blur there can run validation or mark it touched. The
54
+ // field's own window: one in an iframe or a Picture-in-Picture window is
55
+ // never an instance of the page's constructors.
56
+ const view = element.ownerDocument.defaultView ?? window;
57
+ const isTextEntry = element instanceof view.HTMLInputElement || element instanceof view.HTMLTextAreaElement || element instanceof view.HTMLSelectElement || element.isContentEditable;
58
+ if (isTextEntry || modality !== 'pointer') {
52
59
  if (options === undefined) {
53
60
  element.focus();
54
61
  } else {