@astryxdesign/core 0.7.5-canary.fccd771 → 0.7.5

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 (1346) hide show
  1. package/CHANGELOG.md +211 -10
  2. package/README.md +15 -12
  3. package/dist/AlertDialog/AlertDialog.js +1 -1
  4. package/dist/AppShell/AppShell.d.ts +0 -22
  5. package/dist/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +155 -1
  7. package/dist/Avatar/AvatarStatusDot.js +2 -2
  8. package/dist/Badge/Badge.d.ts.map +1 -1
  9. package/dist/Badge/Badge.js +18 -2
  10. package/dist/Banner/Banner.d.ts +1 -0
  11. package/dist/Banner/Banner.d.ts.map +1 -1
  12. package/dist/Banner/Banner.js +64 -9
  13. package/dist/BottomSheet/BottomSheet.d.ts +53 -5
  14. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheet.js +435 -198
  16. package/dist/BottomSheet/BottomSheetHostContext.d.ts +8 -0
  17. package/dist/BottomSheet/BottomSheetHostContext.d.ts.map +1 -0
  18. package/dist/BottomSheet/BottomSheetHostContext.js +35 -0
  19. package/dist/BottomSheet/BottomSheetPanel.d.ts +9 -1
  20. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  21. package/dist/BottomSheet/BottomSheetPanel.js +77 -23
  22. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +53 -14
  23. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  24. package/dist/BottomSheet/BottomSheetSwitcher.js +229 -27
  25. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +6 -0
  26. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts.map +1 -1
  27. package/dist/BottomSheet/bottomSheetEscape.d.ts +3 -0
  28. package/dist/BottomSheet/bottomSheetEscape.d.ts.map +1 -0
  29. package/dist/BottomSheet/bottomSheetEscape.js +20 -0
  30. package/dist/BottomSheet/bottomSheetStack.d.ts +262 -0
  31. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -0
  32. package/dist/BottomSheet/bottomSheetStack.js +1675 -0
  33. package/dist/BottomSheet/useSheetGestures.d.ts +19 -3
  34. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  35. package/dist/BottomSheet/useSheetGestures.js +43 -14
  36. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  37. package/dist/Breadcrumbs/BreadcrumbItem.js +36 -3
  38. package/dist/Button/Button.d.ts.map +1 -1
  39. package/dist/Button/Button.js +18 -7
  40. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposer.js +25 -32
  42. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  43. package/dist/Chat/ChatComposerInput.js +55 -16
  44. package/dist/Chat/ChatMessageMetadata.js +2 -2
  45. package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
  46. package/dist/Chat/ChatPastedTextToken.js +7 -6
  47. package/dist/Chat/ChatToolCalls.js +4 -4
  48. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  49. package/dist/ClickableCard/ClickableCard.js +10 -6
  50. package/dist/CodeBlock/CodeBlock.d.ts +25 -2
  51. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  52. package/dist/CodeBlock/CodeBlock.js +58 -19
  53. package/dist/CodeBlock/grammar.d.ts +134 -0
  54. package/dist/CodeBlock/grammar.d.ts.map +1 -0
  55. package/dist/CodeBlock/grammar.js +219 -0
  56. package/dist/CodeBlock/index.d.ts +2 -0
  57. package/dist/CodeBlock/index.d.ts.map +1 -1
  58. package/dist/CodeBlock/index.js +1 -0
  59. package/dist/CodeBlock/languages/dockerfile.d.ts +3 -0
  60. package/dist/CodeBlock/languages/dockerfile.d.ts.map +1 -0
  61. package/dist/CodeBlock/languages/dockerfile.js +45 -0
  62. package/dist/CodeBlock/languages/graphql.d.ts +3 -0
  63. package/dist/CodeBlock/languages/graphql.d.ts.map +1 -0
  64. package/dist/CodeBlock/languages/graphql.js +27 -0
  65. package/dist/CodeBlock/languages/java.d.ts +3 -0
  66. package/dist/CodeBlock/languages/java.d.ts.map +1 -0
  67. package/dist/CodeBlock/languages/java.js +24 -0
  68. package/dist/CodeBlock/languages/lua.d.ts +3 -0
  69. package/dist/CodeBlock/languages/lua.d.ts.map +1 -0
  70. package/dist/CodeBlock/languages/lua.js +21 -0
  71. package/dist/CodeBlock/languages/objective-c.d.ts +3 -0
  72. package/dist/CodeBlock/languages/objective-c.d.ts.map +1 -0
  73. package/dist/CodeBlock/languages/objective-c.js +27 -0
  74. package/dist/CodeBlock/languages/powershell.d.ts +3 -0
  75. package/dist/CodeBlock/languages/powershell.d.ts.map +1 -0
  76. package/dist/CodeBlock/languages/powershell.js +30 -0
  77. package/dist/CodeBlock/languages/ruby.d.ts +3 -0
  78. package/dist/CodeBlock/languages/ruby.d.ts.map +1 -0
  79. package/dist/CodeBlock/languages/ruby.js +24 -0
  80. package/dist/CodeBlock/languages/thrift.d.ts +3 -0
  81. package/dist/CodeBlock/languages/thrift.d.ts.map +1 -0
  82. package/dist/CodeBlock/languages/thrift.js +18 -0
  83. package/dist/CodeBlock/languages/toml.d.ts +3 -0
  84. package/dist/CodeBlock/languages/toml.d.ts.map +1 -0
  85. package/dist/CodeBlock/languages/toml.js +53 -0
  86. package/dist/CodeBlock/tokenizer.d.ts +8 -4
  87. package/dist/CodeBlock/tokenizer.d.ts.map +1 -1
  88. package/dist/CodeBlock/tokenizer.js +158 -8
  89. package/dist/Collapsible/Collapsible.d.ts +8 -1
  90. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  91. package/dist/Collapsible/Collapsible.js +84 -2
  92. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  93. package/dist/CommandPalette/CommandPalette.js +15 -1
  94. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  95. package/dist/CommandPalette/CommandPaletteEmpty.js +1 -0
  96. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  97. package/dist/CommandPalette/CommandPaletteInput.js +14 -2
  98. package/dist/CommandPalette/busyStartSettle.d.ts +4 -0
  99. package/dist/CommandPalette/busyStartSettle.d.ts.map +1 -0
  100. package/dist/CommandPalette/busyStartSettle.js +23 -0
  101. package/dist/ComplexSelector/ComplexSelector.d.ts +20 -2
  102. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  103. package/dist/ComplexSelector/ComplexSelector.js +42 -7
  104. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  105. package/dist/ContextMenu/ContextMenu.js +48 -13
  106. package/dist/DateInput/DateInput.d.ts.map +1 -1
  107. package/dist/DateInput/DateInput.js +12 -5
  108. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  109. package/dist/DateInput/NativeDateField.js +2 -1
  110. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  111. package/dist/DateInput/TouchDateField.js +2 -1
  112. package/dist/DateInput/Wheel.d.ts.map +1 -1
  113. package/dist/DateInput/Wheel.js +1 -1
  114. package/dist/Dialog/Dialog.d.ts +4 -0
  115. package/dist/Dialog/Dialog.d.ts.map +1 -1
  116. package/dist/Dialog/Dialog.js +20 -8
  117. package/dist/Drawer/Drawer.d.ts.map +1 -1
  118. package/dist/Drawer/Drawer.js +18 -13
  119. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  120. package/dist/DropdownMenu/DropdownMenu.js +34 -30
  121. package/dist/DropdownMenu/DropdownMenuGroup.d.ts +7 -4
  122. package/dist/DropdownMenu/DropdownMenuGroup.d.ts.map +1 -1
  123. package/dist/DropdownMenu/DropdownMenuGroup.js +10 -4
  124. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  125. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +10 -5
  126. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  127. package/dist/DropdownMenu/DropdownMenuRadioItem.js +13 -5
  128. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +6 -6
  129. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  130. package/dist/DropdownMenu/DropdownMenuSubMenu.js +0 -3
  131. package/dist/DropdownMenu/MenuBottomSheet.d.ts +11 -4
  132. package/dist/DropdownMenu/MenuBottomSheet.d.ts.map +1 -1
  133. package/dist/DropdownMenu/MenuBottomSheet.js +35 -9
  134. package/dist/DropdownMenu/MenuBottomSheetActionList.js +3 -3
  135. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +2 -0
  136. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  137. package/dist/DropdownMenu/lazyMenuBottomSheet.js +25 -3
  138. package/dist/DropdownMenu/menuBottomSheet.stylex.d.ts +23 -0
  139. package/dist/DropdownMenu/menuBottomSheet.stylex.d.ts.map +1 -0
  140. package/dist/DropdownMenu/menuBottomSheet.stylex.js +29 -0
  141. package/dist/DropdownMenu/menuItemHover.d.ts +3 -0
  142. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -1
  143. package/dist/DropdownMenu/menuItemHover.js +14 -1
  144. package/dist/DropdownMenu/menuTouchAction.stylex.d.ts +25 -0
  145. package/dist/DropdownMenu/menuTouchAction.stylex.d.ts.map +1 -0
  146. package/dist/DropdownMenu/menuTouchAction.stylex.js +29 -0
  147. package/dist/DropdownMenu/useMenuDrillIn.d.ts.map +1 -1
  148. package/dist/DropdownMenu/useMenuDrillIn.js +7 -5
  149. package/dist/EmptyState/EmptyState.d.ts +4 -2
  150. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  151. package/dist/EmptyState/EmptyState.js +6 -4
  152. package/dist/Field/Field.js +1 -1
  153. package/dist/Field/FieldLabel.js +1 -1
  154. package/dist/Field/PanelSearchInput.d.ts +9 -1
  155. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  156. package/dist/Field/PanelSearchInput.js +31 -22
  157. package/dist/Field/inputDisabledFocus.d.ts +14 -0
  158. package/dist/Field/inputDisabledFocus.d.ts.map +1 -0
  159. package/dist/Field/inputDisabledFocus.js +19 -0
  160. package/dist/Field/inputStyles.stylex.d.ts +9 -9
  161. package/dist/Field/inputStyles.stylex.js +9 -9
  162. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  163. package/dist/FieldStatus/FieldStatus.js +7 -3
  164. package/dist/FileInput/FileInput.d.ts.map +1 -1
  165. package/dist/FileInput/FileInput.js +22 -12
  166. package/dist/Icon/Icon.d.ts +37 -5
  167. package/dist/Icon/Icon.d.ts.map +1 -1
  168. package/dist/Icon/Icon.js +65 -11
  169. package/dist/Icon/IconSize.stylex.d.ts +16 -11
  170. package/dist/Icon/IconSize.stylex.d.ts.map +1 -1
  171. package/dist/Icon/IconSize.stylex.js +27 -11
  172. package/dist/Icon/globalIconRegistry.d.ts +71 -4
  173. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  174. package/dist/Icon/globalIconRegistry.js +163 -23
  175. package/dist/Icon/index.d.ts +26 -2
  176. package/dist/Icon/index.d.ts.map +1 -1
  177. package/dist/Icon/index.js +24 -1
  178. package/dist/Icon/useIcon.d.ts +5 -1
  179. package/dist/Icon/useIcon.d.ts.map +1 -1
  180. package/dist/Icon/useIcon.js +5 -1
  181. package/dist/InputGroup/InputGroup.d.ts +1 -1
  182. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  183. package/dist/InputGroup/InputGroup.js +46 -36
  184. package/dist/InputGroup/InputGroupInternalContext.d.ts +4 -0
  185. package/dist/InputGroup/InputGroupInternalContext.d.ts.map +1 -0
  186. package/dist/InputGroup/InputGroupInternalContext.js +15 -0
  187. package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
  188. package/dist/InputGroup/InputGroupText.js +2 -0
  189. package/dist/InputGroup/groupStyles.d.ts +9 -0
  190. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  191. package/dist/InputGroup/groupStyles.js +28 -14
  192. package/dist/Item/Item.d.ts +5 -1
  193. package/dist/Item/Item.d.ts.map +1 -1
  194. package/dist/Item/Item.js +23 -7
  195. package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.d.ts +2 -0
  196. package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.d.ts.map +1 -0
  197. package/dist/Item/ItemMarkerColumns.a11y.chromium.spec.js +132 -0
  198. package/dist/Item/ItemMarkerColumnsContext.d.ts +14 -0
  199. package/dist/Item/ItemMarkerColumnsContext.d.ts.map +1 -0
  200. package/dist/Item/ItemMarkerColumnsContext.js +18 -0
  201. package/dist/Item/ItemSwipeLayer.d.ts.map +1 -1
  202. package/dist/Item/ItemSwipeLayer.js +3 -0
  203. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  204. package/dist/Item/useSwipeAction.js +60 -5
  205. package/dist/Kbd/Kbd.d.ts +2 -2
  206. package/dist/Kbd/Kbd.d.ts.map +1 -1
  207. package/dist/Kbd/Kbd.js +18 -11
  208. package/dist/Layer/layerAnimations.stylex.d.ts +9 -5
  209. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  210. package/dist/Layer/layerAnimations.stylex.js +23 -10
  211. package/dist/Layer/layerSlideRules.d.ts +62 -2
  212. package/dist/Layer/layerSlideRules.d.ts.map +1 -1
  213. package/dist/Layer/layerSlideRules.js +124 -3
  214. package/dist/Layer/layerStack.d.ts +12 -9
  215. package/dist/Layer/layerStack.d.ts.map +1 -1
  216. package/dist/Layer/layerStack.js +116 -53
  217. package/dist/Layer/modalOutlet.d.ts +44 -6
  218. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  219. package/dist/Layer/modalOutlet.js +150 -14
  220. package/dist/Layer/preserveAnimations.d.ts +11 -0
  221. package/dist/Layer/preserveAnimations.d.ts.map +1 -0
  222. package/dist/Layer/preserveAnimations.js +245 -0
  223. package/dist/Layer/useLayer.d.ts +19 -2
  224. package/dist/Layer/useLayer.d.ts.map +1 -1
  225. package/dist/Layer/useLayer.js +531 -44
  226. package/dist/Layer/useLayerDismissal.d.ts +10 -7
  227. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  228. package/dist/Layer/useLayerDismissal.js +8 -8
  229. package/dist/Layer/useTouchTrigger.d.ts +14 -1
  230. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  231. package/dist/Layer/useTouchTrigger.js +72 -17
  232. package/dist/Layout/Layout.d.ts.map +1 -1
  233. package/dist/Layout/Layout.js +4 -0
  234. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  235. package/dist/Layout/LayoutContent.js +2 -2
  236. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  237. package/dist/Layout/LayoutFooter.js +2 -1
  238. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  239. package/dist/Layout/LayoutHeader.js +2 -1
  240. package/dist/Layout/layoutEdges.stylex.d.ts +20 -0
  241. package/dist/Layout/layoutEdges.stylex.d.ts.map +1 -0
  242. package/dist/Layout/layoutEdges.stylex.js +28 -0
  243. package/dist/Lightbox/Lightbox.d.ts +5 -2
  244. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  245. package/dist/Lightbox/Lightbox.js +111 -89
  246. package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts +2 -0
  247. package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts.map +1 -0
  248. package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.js +78 -0
  249. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts +2 -0
  250. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts.map +1 -0
  251. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +65 -0
  252. package/dist/List/List.d.ts +2 -1
  253. package/dist/List/List.d.ts.map +1 -1
  254. package/dist/List/List.js +9 -2
  255. package/dist/List/ListContext.d.ts +16 -4
  256. package/dist/List/ListContext.d.ts.map +1 -1
  257. package/dist/List/ListContext.js +10 -5
  258. package/dist/List/ListItem.d.ts +7 -1
  259. package/dist/List/ListItem.d.ts.map +1 -1
  260. package/dist/List/ListItem.js +52 -8
  261. package/dist/List/ListMarkers.a11y.chromium.spec.d.ts +2 -0
  262. package/dist/List/ListMarkers.a11y.chromium.spec.d.ts.map +1 -0
  263. package/dist/List/ListMarkers.a11y.chromium.spec.js +677 -0
  264. package/dist/Markdown/Markdown.d.ts +11 -1
  265. package/dist/Markdown/Markdown.d.ts.map +1 -1
  266. package/dist/Markdown/Markdown.fr23.bench.js +3 -1
  267. package/dist/Markdown/Markdown.fr23.sampling.d.ts +16 -0
  268. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -1
  269. package/dist/Markdown/Markdown.fr23.sampling.js +13 -4
  270. package/dist/Markdown/Markdown.js +41 -14
  271. package/dist/Markdown/MarkdownTable.a11y.chromium.spec.js +1 -0
  272. package/dist/MobileNav/MobileNav.d.ts +2 -1
  273. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  274. package/dist/MobileNav/MobileNav.js +46 -37
  275. package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.js +1 -0
  276. package/dist/MobileNav/MobileNavToggle.d.ts +7 -3
  277. package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
  278. package/dist/MobileNav/MobileNavToggle.js +11 -3
  279. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +53 -6
  280. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  281. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  282. package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.js +1 -0
  283. package/dist/MultiSelector/MultiSelector.js +21 -5
  284. package/dist/MultiSelector/OptionActions.a11y.chromium.spec.js +1 -0
  285. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  286. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  287. package/dist/NavMenu/NavHeadingMenu.js +29 -5
  288. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  289. package/dist/NavMenu/NavHeadingMenuItem.js +51 -7
  290. package/dist/NavMenu/NavMenuContext.d.ts +9 -0
  291. package/dist/NavMenu/NavMenuContext.d.ts.map +1 -1
  292. package/dist/NavMenu/NavMenuContext.js +9 -0
  293. package/dist/NumberInput/NumberInput.d.ts +4 -4
  294. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  295. package/dist/NumberInput/NumberInput.js +61 -24
  296. package/dist/Overlay/Overlay.d.ts +3 -3
  297. package/dist/Overlay/Overlay.d.ts.map +1 -1
  298. package/dist/Overlay/Overlay.js +12 -5
  299. package/dist/Popover/Popover.d.ts +41 -2
  300. package/dist/Popover/Popover.d.ts.map +1 -1
  301. package/dist/Popover/Popover.js +276 -44
  302. package/dist/Popover/index.d.ts +1 -1
  303. package/dist/Popover/index.d.ts.map +1 -1
  304. package/dist/Popover/lazyPopoverBottomSheet.d.ts +23 -0
  305. package/dist/Popover/lazyPopoverBottomSheet.d.ts.map +1 -0
  306. package/dist/Popover/lazyPopoverBottomSheet.js +40 -0
  307. package/dist/Popover/usePopover.d.ts.map +1 -1
  308. package/dist/Popover/usePopover.js +11 -5
  309. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  310. package/dist/PowerSearch/PowerSearch.js +7 -5
  311. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  312. package/dist/ProgressBar/ProgressBar.js +8 -0
  313. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  314. package/dist/RadioList/RadioListItem.js +10 -2
  315. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  316. package/dist/ScrollableArea/ScrollableArea.js +1 -1
  317. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  318. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  319. package/dist/SegmentedControl/SegmentedControl.js +6 -2
  320. package/dist/SelectableCard/SelectableCard.d.ts +5 -5
  321. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  322. package/dist/SelectableCard/SelectableCard.js +15 -11
  323. package/dist/Selector/Selector.d.ts.map +1 -1
  324. package/dist/Selector/Selector.js +27 -8
  325. package/dist/Selector/hooks.d.ts +52 -6
  326. package/dist/Selector/hooks.d.ts.map +1 -1
  327. package/dist/Selector/hooks.js +145 -2
  328. package/dist/SideNav/SideNav.d.ts.map +1 -1
  329. package/dist/SideNav/SideNav.js +58 -2
  330. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  331. package/dist/SideNav/SideNavHeading.js +79 -3
  332. package/dist/SideNav/SideNavItem.d.ts +5 -1
  333. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  334. package/dist/SideNav/SideNavItem.js +36 -13
  335. package/dist/SideNav/railMotion.d.ts +54 -0
  336. package/dist/SideNav/railMotion.d.ts.map +1 -0
  337. package/dist/SideNav/railMotion.js +253 -0
  338. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  339. package/dist/Skeleton/Skeleton.js +12 -3
  340. package/dist/Slider/Slider.d.ts.map +1 -1
  341. package/dist/Slider/Slider.js +52 -15
  342. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  343. package/dist/StatusDot/StatusDot.js +12 -0
  344. package/dist/Stepper/Step.d.ts.map +1 -1
  345. package/dist/Stepper/Step.js +10 -6
  346. package/dist/Switch/Switch.d.ts.map +1 -1
  347. package/dist/Switch/Switch.js +5 -5
  348. package/dist/Switch/switch.markers.stylex.d.ts +7 -2
  349. package/dist/Switch/switch.markers.stylex.d.ts.map +1 -1
  350. package/dist/Switch/switch.markers.stylex.js +8 -3
  351. package/dist/TabList/Tab.d.ts.map +1 -1
  352. package/dist/TabList/Tab.js +5 -1
  353. package/dist/TabList/TabMenu.d.ts.map +1 -1
  354. package/dist/TabList/TabMenu.js +25 -3
  355. package/dist/Table/TableCell.d.ts.map +1 -1
  356. package/dist/Table/TableCell.js +5 -1
  357. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  358. package/dist/Table/TableHeaderCell.js +1 -0
  359. package/dist/Table/TableRow.d.ts.map +1 -1
  360. package/dist/Table/TableRow.js +3 -0
  361. package/dist/Table/glidingDivider.d.ts +96 -0
  362. package/dist/Table/glidingDivider.d.ts.map +1 -0
  363. package/dist/Table/glidingDivider.js +275 -0
  364. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  365. package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -2
  366. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +8 -0
  367. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  368. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +374 -13
  369. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  370. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +244 -6
  371. package/dist/Table/rowDivider.d.ts +34 -0
  372. package/dist/Table/rowDivider.d.ts.map +1 -0
  373. package/dist/Table/rowDivider.js +118 -0
  374. package/dist/TextArea/TextArea.d.ts +6 -4
  375. package/dist/TextArea/TextArea.d.ts.map +1 -1
  376. package/dist/TextArea/TextArea.js +15 -12
  377. package/dist/TextInput/TextInput.d.ts +7 -5
  378. package/dist/TextInput/TextInput.d.ts.map +1 -1
  379. package/dist/TextInput/TextInput.js +43 -22
  380. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  381. package/dist/Thumbnail/Thumbnail.js +45 -11
  382. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  383. package/dist/TimeInput/TimeInput.js +12 -4
  384. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  385. package/dist/TimeInput/TouchTimeField.js +2 -1
  386. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  387. package/dist/Toast/ToastViewport.js +62 -6
  388. package/dist/Tokenizer/Tokenizer.d.ts +71 -4
  389. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  390. package/dist/Tokenizer/Tokenizer.js +430 -45
  391. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +98 -0
  392. package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -0
  393. package/dist/Tokenizer/TokenizerBottomSheet.js +721 -0
  394. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  395. package/dist/Tooltip/useTooltip.js +9 -3
  396. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  397. package/dist/TopNav/TopNavHeading.js +26 -0
  398. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  399. package/dist/TopNav/TopNavMegaMenu.js +4 -4
  400. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  401. package/dist/TopNav/TopNavMenu.js +32 -4
  402. package/dist/TreeList/TreeList.d.ts +8 -23
  403. package/dist/TreeList/TreeList.d.ts.map +1 -1
  404. package/dist/TreeList/TreeList.js +175 -3
  405. package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
  406. package/dist/TreeList/TreeListBranches.js +7 -5
  407. package/dist/TreeList/TreeListItem.d.ts +7 -1
  408. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  409. package/dist/TreeList/TreeListItem.js +5 -3
  410. package/dist/Typeahead/BaseTypeahead.d.ts +1 -1
  411. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  412. package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.d.ts +2 -0
  413. package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.d.ts.map +1 -0
  414. package/dist/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.js +118 -0
  415. package/dist/Typeahead/BaseTypeahead.js +27 -11
  416. package/dist/Typeahead/Typeahead.d.ts +1 -1
  417. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  418. package/dist/Typeahead/Typeahead.js +31 -14
  419. package/dist/astryx.css +164 -41
  420. package/dist/gestures/GestureArena.d.ts +175 -0
  421. package/dist/gestures/GestureArena.d.ts.map +1 -0
  422. package/dist/gestures/GestureArena.js +816 -0
  423. package/dist/gestures/GestureRecognizer.d.ts +239 -0
  424. package/dist/gestures/GestureRecognizer.d.ts.map +1 -0
  425. package/dist/gestures/GestureRecognizer.js +487 -0
  426. package/dist/gestures/LongPressGestureRecognizer.d.ts +32 -0
  427. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -0
  428. package/dist/gestures/LongPressGestureRecognizer.js +135 -0
  429. package/dist/gestures/PanGestureRecognizer.d.ts +117 -0
  430. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -0
  431. package/dist/gestures/PanGestureRecognizer.js +349 -0
  432. package/dist/gestures/TapGestureRecognizer.d.ts +39 -0
  433. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -0
  434. package/dist/gestures/TapGestureRecognizer.js +151 -0
  435. package/dist/gestures/VelocityTracker.d.ts +51 -0
  436. package/dist/gestures/VelocityTracker.d.ts.map +1 -0
  437. package/dist/gestures/VelocityTracker.js +186 -0
  438. package/dist/gestures/geometry.d.ts +17 -0
  439. package/dist/gestures/geometry.d.ts.map +1 -0
  440. package/dist/gestures/geometry.js +55 -0
  441. package/dist/gestures/types.d.ts +139 -0
  442. package/dist/gestures/types.d.ts.map +1 -0
  443. package/dist/gestures/types.js +67 -0
  444. package/dist/hooks/AnnounceRenderedText.d.ts +17 -0
  445. package/dist/hooks/AnnounceRenderedText.d.ts.map +1 -0
  446. package/dist/hooks/AnnounceRenderedText.js +32 -0
  447. package/dist/hooks/ModalAnnounceProvider.d.ts +41 -0
  448. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -0
  449. package/dist/hooks/ModalAnnounceProvider.js +133 -0
  450. package/dist/hooks/actionGroupTracker.d.ts +98 -0
  451. package/dist/hooks/actionGroupTracker.d.ts.map +1 -0
  452. package/dist/hooks/actionGroupTracker.js +338 -0
  453. package/dist/hooks/index.d.ts +2 -0
  454. package/dist/hooks/index.d.ts.map +1 -1
  455. package/dist/hooks/index.js +1 -0
  456. package/dist/hooks/menuPressOnItems.d.ts +19 -0
  457. package/dist/hooks/menuPressOnItems.d.ts.map +1 -0
  458. package/dist/hooks/menuPressOnItems.js +32 -0
  459. package/dist/hooks/modalAnnounce.d.ts +18 -0
  460. package/dist/hooks/modalAnnounce.d.ts.map +1 -0
  461. package/dist/hooks/modalAnnounce.js +382 -0
  462. package/dist/hooks/scrollGeometry.d.ts +28 -0
  463. package/dist/hooks/scrollGeometry.d.ts.map +1 -1
  464. package/dist/hooks/scrollGeometry.js +36 -2
  465. package/dist/hooks/useAdaptivePresentation.d.ts +9 -1
  466. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  467. package/dist/hooks/useAdaptivePresentation.js +33 -8
  468. package/dist/hooks/useAnimatedLayout.d.ts +42 -0
  469. package/dist/hooks/useAnimatedLayout.d.ts.map +1 -0
  470. package/dist/hooks/useAnimatedLayout.js +46 -0
  471. package/dist/hooks/useAnnounce.d.ts +132 -1
  472. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  473. package/dist/hooks/useAnnounce.js +356 -27
  474. package/dist/hooks/useAnnounceRenderedText.d.ts +19 -2
  475. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  476. package/dist/hooks/useAnnounceRenderedText.js +52 -11
  477. package/dist/hooks/useBusyAnnouncement.d.ts +9 -5
  478. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  479. package/dist/hooks/useBusyAnnouncement.js +58 -46
  480. package/dist/hooks/useFocusTrap.d.ts +1 -1
  481. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  482. package/dist/hooks/useFocusTrap.js +57 -26
  483. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  484. package/dist/hooks/useMenuHover.js +6 -2
  485. package/dist/hooks/useMenuPress.d.ts +4 -2
  486. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  487. package/dist/hooks/useMenuPress.js +58 -33
  488. package/dist/hooks/usePressFeedback.d.ts +5 -2
  489. package/dist/hooks/usePressFeedback.d.ts.map +1 -1
  490. package/dist/hooks/usePressFeedback.js +5 -2
  491. package/dist/hooks/useScrollableArea.d.ts +5 -0
  492. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  493. package/dist/hooks/useScrollableArea.js +104 -11
  494. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  495. package/dist/i18n/generated-locales/en.generated.js +33 -0
  496. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  497. package/dist/i18n/generated-locales/pseudo.generated.js +33 -0
  498. package/dist/internal/tokenizer-presentation.d.ts +21 -0
  499. package/dist/internal/tokenizer-presentation.d.ts.map +1 -0
  500. package/dist/internal/tokenizer-presentation.js +21 -0
  501. package/dist/internal/touch.d.ts +26 -0
  502. package/dist/internal/touch.d.ts.map +1 -0
  503. package/dist/internal/touch.js +28 -0
  504. package/dist/motion/LayoutChangeSnapshot.d.ts +33 -0
  505. package/dist/motion/LayoutChangeSnapshot.d.ts.map +1 -0
  506. package/dist/motion/LayoutChangeSnapshot.js +37 -0
  507. package/dist/motion/animatedLayout.d.ts +190 -0
  508. package/dist/motion/animatedLayout.d.ts.map +1 -0
  509. package/dist/motion/animatedLayout.js +1502 -0
  510. package/dist/motion/animator.d.ts +240 -0
  511. package/dist/motion/animator.d.ts.map +1 -0
  512. package/dist/motion/animator.js +2203 -0
  513. package/dist/motion/bezier.d.ts +18 -0
  514. package/dist/motion/bezier.d.ts.map +1 -0
  515. package/dist/motion/bezier.js +60 -0
  516. package/dist/motion/coast.d.ts +61 -0
  517. package/dist/motion/coast.d.ts.map +1 -0
  518. package/dist/motion/coast.js +107 -0
  519. package/dist/motion/decay.d.ts +41 -0
  520. package/dist/motion/decay.d.ts.map +1 -0
  521. package/dist/motion/decay.js +90 -0
  522. package/dist/motion/projection.d.ts +36 -0
  523. package/dist/motion/projection.d.ts.map +1 -0
  524. package/dist/motion/projection.js +92 -0
  525. package/dist/motion/reducedMotion.d.ts +25 -0
  526. package/dist/motion/reducedMotion.d.ts.map +1 -0
  527. package/dist/motion/reducedMotion.js +85 -0
  528. package/dist/motion/reducedMotion.stylex.d.ts +19 -0
  529. package/dist/motion/reducedMotion.stylex.d.ts.map +1 -0
  530. package/dist/motion/reducedMotion.stylex.js +37 -0
  531. package/dist/motion/reducedMotionPlan.d.ts +89 -0
  532. package/dist/motion/reducedMotionPlan.d.ts.map +1 -0
  533. package/dist/motion/reducedMotionPlan.js +194 -0
  534. package/dist/motion/resolveSnapPoint.d.ts +52 -0
  535. package/dist/motion/resolveSnapPoint.d.ts.map +1 -0
  536. package/dist/motion/resolveSnapPoint.js +135 -0
  537. package/dist/motion/roleValue.d.ts +33 -0
  538. package/dist/motion/roleValue.d.ts.map +1 -0
  539. package/dist/motion/roleValue.js +84 -0
  540. package/dist/motion/roles.d.ts +79 -0
  541. package/dist/motion/roles.d.ts.map +1 -0
  542. package/dist/motion/roles.js +199 -0
  543. package/dist/motion/rubberBand.d.ts +20 -0
  544. package/dist/motion/rubberBand.d.ts.map +1 -0
  545. package/dist/motion/rubberBand.js +91 -0
  546. package/dist/motion/selectPage.d.ts +26 -0
  547. package/dist/motion/selectPage.d.ts.map +1 -0
  548. package/dist/motion/selectPage.js +55 -0
  549. package/dist/motion/spring.d.ts +193 -0
  550. package/dist/motion/spring.d.ts.map +1 -0
  551. package/dist/motion/spring.js +442 -0
  552. package/dist/motion/transientCopy.d.ts +33 -0
  553. package/dist/motion/transientCopy.d.ts.map +1 -0
  554. package/dist/motion/transientCopy.js +314 -0
  555. package/dist/motion/uikit/gestures.d.ts +642 -0
  556. package/dist/motion/uikit/gestures.d.ts.map +1 -0
  557. package/dist/motion/uikit/gestures.js +428 -0
  558. package/dist/motion/uikit/index.d.ts +24 -0
  559. package/dist/motion/uikit/index.d.ts.map +1 -0
  560. package/dist/motion/uikit/index.js +26 -0
  561. package/dist/motion/uikit/navigation.d.ts +54 -0
  562. package/dist/motion/uikit/navigation.d.ts.map +1 -0
  563. package/dist/motion/uikit/navigation.js +83 -0
  564. package/dist/motion/uikit/scroll.d.ts +116 -0
  565. package/dist/motion/uikit/scroll.d.ts.map +1 -0
  566. package/dist/motion/uikit/scroll.js +146 -0
  567. package/dist/motion/uikit/springs.d.ts +545 -0
  568. package/dist/motion/uikit/springs.d.ts.map +1 -0
  569. package/dist/motion/uikit/springs.js +548 -0
  570. package/dist/motion/uikit/timing.d.ts +202 -0
  571. package/dist/motion/uikit/timing.d.ts.map +1 -0
  572. package/dist/motion/uikit/timing.js +201 -0
  573. package/dist/reset.a11y.chromium.spec.js +1 -0
  574. package/dist/reset.until-found.a11y.browser.spec.js +1 -0
  575. package/dist/theme/declarationBoundary.d.ts +13 -0
  576. package/dist/theme/declarationBoundary.d.ts.map +1 -1
  577. package/dist/theme/declarationBoundary.js +264 -1
  578. package/dist/theme/defineTheme.d.ts +111 -11
  579. package/dist/theme/defineTheme.d.ts.map +1 -1
  580. package/dist/theme/defineTheme.js +97 -7
  581. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  582. package/dist/theme/derivedVarRegistry.js +9 -0
  583. package/dist/theme/generateThemeRules.d.ts +6 -2
  584. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  585. package/dist/theme/generateThemeRules.js +468 -24
  586. package/dist/theme/index.d.ts +2 -2
  587. package/dist/theme/index.d.ts.map +1 -1
  588. package/dist/theme/index.js +1 -1
  589. package/dist/theme/statusColor.d.ts +48 -0
  590. package/dist/theme/statusColor.d.ts.map +1 -0
  591. package/dist/theme/statusColor.js +203 -0
  592. package/dist/theme/statusRoleDerivation.d.ts +11 -0
  593. package/dist/theme/statusRoleDerivation.d.ts.map +1 -0
  594. package/dist/theme/statusRoleDerivation.js +236 -0
  595. package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
  596. package/dist/theme/syntax/SyntaxTheme.js +1 -1
  597. package/dist/theme/syntax/defineSyntaxTheme.js +1 -1
  598. package/dist/theme/syntax/presets.d.ts +1 -1
  599. package/dist/theme/syntax/presets.js +1 -1
  600. package/dist/theme/syntax/tokens.d.ts +1 -1
  601. package/dist/theme/syntax/tokens.js +1 -1
  602. package/dist/theme/themeAdaptations.d.ts +25 -1
  603. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  604. package/dist/theme/themeAdaptations.js +30 -1
  605. package/dist/theme/tokens.d.ts.map +1 -1
  606. package/dist/theme/tokens.js +16 -1
  607. package/dist/theme/tokens.stylex.d.ts +42 -2
  608. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  609. package/dist/theme/tokens.stylex.js +54 -3
  610. package/dist/theme/useTheme.d.ts +4 -2
  611. package/dist/theme/useTheme.d.ts.map +1 -1
  612. package/dist/theme/useTheme.js +10 -4
  613. package/dist/utils/edgeAutoscroll.d.ts +53 -0
  614. package/dist/utils/edgeAutoscroll.d.ts.map +1 -0
  615. package/dist/utils/edgeAutoscroll.js +81 -0
  616. package/dist/utils/hitArea.d.ts +72 -0
  617. package/dist/utils/hitArea.d.ts.map +1 -0
  618. package/dist/utils/hitArea.js +681 -0
  619. package/dist/utils/interactionOverlay.stylex.d.ts +4 -1
  620. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  621. package/dist/utils/interactionOverlay.stylex.js +4 -1
  622. package/dist/utils/pressFeedback.d.ts +5 -1
  623. package/dist/utils/pressFeedback.d.ts.map +1 -1
  624. package/dist/utils/pressFeedback.js +285 -54
  625. package/dist/utils/pressGesture.d.ts +13 -1
  626. package/dist/utils/pressGesture.d.ts.map +1 -1
  627. package/dist/utils/pressGesture.js +40 -1
  628. package/dist/utils/touchPresentation.d.ts +48 -0
  629. package/dist/utils/touchPresentation.d.ts.map +1 -0
  630. package/dist/utils/touchPresentation.js +133 -0
  631. package/locales/af-ZA.json +1 -1
  632. package/locales/ar-SA.json +1 -1
  633. package/locales/ca-ES.json +1 -1
  634. package/locales/cs-CZ.json +1 -1
  635. package/locales/da-DK.json +1 -1
  636. package/locales/de-DE.json +1 -1
  637. package/locales/el-GR.json +1 -1
  638. package/locales/en.json +132 -0
  639. package/locales/es-ES.json +1 -1
  640. package/locales/fi-FI.json +1 -1
  641. package/locales/fr-FR.json +1 -1
  642. package/locales/he-IL.json +1 -1
  643. package/locales/hu-HU.json +1 -1
  644. package/locales/it-IT.json +1 -1
  645. package/locales/ja-JP.json +1 -1
  646. package/locales/ko-KR.json +1 -1
  647. package/locales/nl-NL.json +1 -1
  648. package/locales/no-NO.json +1 -1
  649. package/locales/pl-PL.json +1 -1
  650. package/locales/pseudo.json +99 -0
  651. package/locales/pt-BR.json +1 -1
  652. package/locales/pt-PT.json +1 -1
  653. package/locales/ro-RO.json +1 -1
  654. package/locales/ru-RU.json +1 -1
  655. package/locales/sr-SP.json +1 -1
  656. package/locales/sv-SE.json +1 -1
  657. package/locales/tr-TR.json +1 -1
  658. package/locales/uk-UA.json +1 -1
  659. package/locales/vi-VN.json +1 -1
  660. package/locales/zh-CN.json +1 -1
  661. package/locales/zh-TW.json +1 -1
  662. package/package.json +63 -8
  663. package/src/AlertDialog/AlertDialog.spec.md +85 -31
  664. package/src/AlertDialog/AlertDialog.tsx +1 -1
  665. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +1 -0
  666. package/src/AppShell/AppShell.spec.md +334 -0
  667. package/src/AppShell/AppShell.tsx +170 -2
  668. package/src/AspectRatio/AspectRatio.spec.md +179 -0
  669. package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +1 -0
  670. package/src/Avatar/Avatar.spec.md +253 -0
  671. package/src/Avatar/AvatarStatusDot.spec.md +93 -79
  672. package/src/Avatar/AvatarStatusDot.test.tsx +22 -0
  673. package/src/Avatar/AvatarStatusDot.tsx +2 -2
  674. package/src/AvatarGroup/AvatarGroup.spec.md +205 -0
  675. package/src/AvatarGroup/AvatarGroupOverflow.spec.md +123 -120
  676. package/src/Badge/Badge.spec.md +207 -0
  677. package/src/Badge/Badge.test.tsx +13 -0
  678. package/src/Badge/Badge.tsx +38 -2
  679. package/src/Banner/Banner.spec.md +41 -28
  680. package/src/Banner/Banner.test.tsx +118 -16
  681. package/src/Banner/Banner.tsx +94 -7
  682. package/src/Blockquote/Blockquote.spec.md +171 -0
  683. package/src/BottomSheet/BottomSheet.doc.mjs +106 -24
  684. package/src/BottomSheet/BottomSheet.spec.md +271 -40
  685. package/src/BottomSheet/BottomSheet.test.tsx +491 -5
  686. package/src/BottomSheet/BottomSheet.tsx +544 -145
  687. package/src/BottomSheet/BottomSheetHostContext.ts +44 -0
  688. package/src/BottomSheet/BottomSheetPanel.test.tsx +73 -19
  689. package/src/BottomSheet/BottomSheetPanel.tsx +178 -63
  690. package/src/BottomSheet/BottomSheetReplace.test.tsx +1638 -0
  691. package/src/BottomSheet/BottomSheetStacking.announce.test.tsx +246 -0
  692. package/src/BottomSheet/BottomSheetStacking.test.tsx +3184 -0
  693. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +27 -31
  694. package/src/BottomSheet/BottomSheetSwitcher.spec.md +138 -43
  695. package/src/BottomSheet/BottomSheetSwitcher.tsx +275 -26
  696. package/src/BottomSheet/BottomSheetSwitcherContext.ts +6 -0
  697. package/src/BottomSheet/__tests__/BottomSheetDrag.a11y.chromium.spec.ts +1 -0
  698. package/src/BottomSheet/__tests__/BottomSheetFocusReturn.a11y.browser.spec.ts +1 -0
  699. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +4 -1
  700. package/src/BottomSheet/__tests__/BottomSheetNativeModal.a11y.browser.spec.ts +1 -0
  701. package/src/BottomSheet/__tests__/BottomSheetPinchZoom.a11y.chromium.spec.ts +1 -0
  702. package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +83 -0
  703. package/src/BottomSheet/bottomSheetEscape.ts +21 -0
  704. package/src/BottomSheet/bottomSheetStack.ts +2054 -0
  705. package/src/BottomSheet/useSheetGestures.ts +68 -12
  706. package/src/Breadcrumbs/BreadcrumbItem.spec.md +104 -60
  707. package/src/Breadcrumbs/BreadcrumbItem.tsx +30 -1
  708. package/src/Breadcrumbs/Breadcrumbs.spec.md +165 -0
  709. package/src/Breadcrumbs/Breadcrumbs.test.tsx +90 -0
  710. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +1 -0
  711. package/src/Button/Button.spec.md +322 -0
  712. package/src/Button/Button.test.tsx +8 -1
  713. package/src/Button/Button.tsx +36 -7
  714. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +1 -0
  715. package/src/ButtonGroup/ButtonGroup.spec.md +220 -0
  716. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +1 -0
  717. package/src/Card/Card.spec.md +205 -0
  718. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +1 -0
  719. package/src/Center/Center.spec.md +104 -124
  720. package/src/Chat/ChatComposer.test.tsx +54 -0
  721. package/src/Chat/ChatComposer.tsx +41 -27
  722. package/src/Chat/ChatComposerInput.test.tsx +165 -21
  723. package/src/Chat/ChatComposerInput.tsx +73 -16
  724. package/src/Chat/ChatMessageMetadata.tsx +1 -1
  725. package/src/Chat/ChatPastedTextToken.test.tsx +71 -0
  726. package/src/Chat/ChatPastedTextToken.tsx +8 -7
  727. package/src/Chat/ChatToolCalls.tsx +5 -5
  728. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +22 -4
  729. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +1 -0
  730. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +1 -0
  731. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +1 -0
  732. package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1 -0
  733. package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1 -0
  734. package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +1 -0
  735. package/src/Chat/__tests__/useChatStreamScroll.a11y.chromium.spec.ts +1 -0
  736. package/src/CheckboxInput/CheckboxInput.spec.md +97 -66
  737. package/src/CheckboxInput/__tests__/Checkbox.a11y.chromium.spec.ts +1 -0
  738. package/src/CheckboxList/CheckboxList.spec.md +92 -78
  739. package/src/CheckboxList/CheckboxListItem.spec.md +86 -60
  740. package/src/CheckboxList/__tests__/CheckboxList.a11y.chromium.spec.ts +1 -0
  741. package/src/ClickableCard/ClickableCard.doc.mjs +1 -2
  742. package/src/ClickableCard/ClickableCard.spec.md +124 -128
  743. package/src/ClickableCard/ClickableCard.test.tsx +14 -3
  744. package/src/ClickableCard/ClickableCard.tsx +44 -28
  745. package/src/Code/Code.spec.md +30 -32
  746. package/src/CodeBlock/CodeBlock.doc.mjs +21 -4
  747. package/src/CodeBlock/CodeBlock.spec.md +96 -61
  748. package/src/CodeBlock/CodeBlock.test.tsx +97 -1
  749. package/src/CodeBlock/CodeBlock.tsx +132 -22
  750. package/src/CodeBlock/CodeLanguage.test.tsx +173 -0
  751. package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +290 -0
  752. package/src/CodeBlock/__tests__/CodeBlockLanguages.a11y.chromium.spec.ts +64 -0
  753. package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +1 -0
  754. package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +1 -0
  755. package/src/CodeBlock/grammar.ts +291 -0
  756. package/src/CodeBlock/index.ts +7 -0
  757. package/src/CodeBlock/languages/dockerfile.ts +43 -0
  758. package/src/CodeBlock/languages/graphql.ts +30 -0
  759. package/src/CodeBlock/languages/java.ts +28 -0
  760. package/src/CodeBlock/languages/lua.ts +21 -0
  761. package/src/CodeBlock/languages/objective-c.ts +26 -0
  762. package/src/CodeBlock/languages/powershell.ts +31 -0
  763. package/src/CodeBlock/languages/ruby.ts +29 -0
  764. package/src/CodeBlock/languages/thrift.ts +32 -0
  765. package/src/CodeBlock/languages/toml.ts +36 -0
  766. package/src/CodeBlock/languages.test.ts +402 -0
  767. package/src/CodeBlock/tokenizer.ts +176 -16
  768. package/src/CodeBlock/tokenizerBudget.test.ts +112 -0
  769. package/src/Collapsible/Collapsible.doc.mjs +6 -0
  770. package/src/Collapsible/Collapsible.spec.md +26 -23
  771. package/src/Collapsible/Collapsible.tsx +121 -2
  772. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +1 -0
  773. package/src/Collapsible/__tests__/CollapsibleGroup.a11y.chromium.spec.ts +1 -0
  774. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +1 -0
  775. package/src/CommandPalette/CommandPalette.perf.test.ts +8 -4
  776. package/src/CommandPalette/CommandPalette.tsx +17 -1
  777. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +6 -3
  778. package/src/CommandPalette/CommandPaletteEmpty.spec.md +190 -0
  779. package/src/CommandPalette/CommandPaletteEmpty.tsx +4 -0
  780. package/src/CommandPalette/CommandPaletteInput.tsx +21 -2
  781. package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +1 -0
  782. package/src/CommandPalette/__tests__/CommandPaletteEmptyAudit.a11y.chromium.spec.ts +715 -0
  783. package/src/CommandPalette/__tests__/CommandPaletteFooter.a11y.chromium.spec.ts +3 -2
  784. package/src/CommandPalette/__tests__/CommandPaletteInputAudit.a11y.chromium.spec.ts +1 -0
  785. package/src/CommandPalette/__tests__/CommandPaletteItemAudit.a11y.chromium.spec.ts +1 -0
  786. package/src/CommandPalette/busyStartSettle.ts +26 -0
  787. package/src/ComplexSelector/ComplexSelector.doc.mjs +1 -1
  788. package/src/ComplexSelector/ComplexSelector.focusableDisabled.test.tsx +1 -1
  789. package/src/ComplexSelector/ComplexSelector.fr10.test.tsx +9 -9
  790. package/src/ComplexSelector/ComplexSelector.spec.md +161 -107
  791. package/src/ComplexSelector/ComplexSelector.test.tsx +236 -17
  792. package/src/ComplexSelector/ComplexSelector.tsx +69 -4
  793. package/src/ComplexSelector/__tests__/ComplexSelector.a11y.chromium.spec.ts +965 -0
  794. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  795. package/src/ContextMenu/ContextMenu.spec.md +38 -30
  796. package/src/ContextMenu/ContextMenu.test.tsx +189 -11
  797. package/src/ContextMenu/ContextMenu.tsx +75 -17
  798. package/src/ContextMenu/__tests__/ContextMenuAudit.a11y.chromium.spec.ts +1 -0
  799. package/src/ContextMenu/__tests__/ContextMenuCursorAnchor.a11y.browser.spec.ts +1 -0
  800. package/src/ContextMenu/__tests__/ContextMenuLongPress.a11y.chromium.spec.ts +117 -0
  801. package/src/DateInput/DateInput.tsx +9 -4
  802. package/src/DateInput/DateInputTouch.test.tsx +10 -1
  803. package/src/DateInput/NativeDateField.tsx +2 -1
  804. package/src/DateInput/TouchDateField.tsx +2 -1
  805. package/src/DateInput/Wheel.tsx +4 -1
  806. package/src/DateInput/__tests__/DateInputAudit.a11y.chromium.spec.ts +1 -0
  807. package/src/DateInput/__tests__/WheelPinchZoom.a11y.chromium.spec.ts +171 -0
  808. package/src/Dialog/Dialog.doc.mjs +201 -47
  809. package/src/Dialog/Dialog.spec.md +20 -4
  810. package/src/Dialog/Dialog.tsx +37 -10
  811. package/src/Dialog/__tests__/Dialog.a11y.browser.spec.ts +1 -0
  812. package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +1 -0
  813. package/src/Dialog/__tests__/Dialog.reduced-motion.a11y.browser.spec.ts +252 -0
  814. package/src/Divider/Divider.spec.md +79 -70
  815. package/src/Drawer/Drawer.tsx +38 -35
  816. package/src/Drawer/__tests__/DrawerAudit.a11y.chromium.spec.ts +1 -0
  817. package/src/Drawer/__tests__/DrawerHeaderAudit.a11y.chromium.spec.ts +1 -0
  818. package/src/DropdownMenu/DropdownMenu.spec.md +14 -6
  819. package/src/DropdownMenu/DropdownMenu.ssr.test.tsx +44 -8
  820. package/src/DropdownMenu/DropdownMenu.test.tsx +107 -5
  821. package/src/DropdownMenu/DropdownMenu.tsx +51 -34
  822. package/src/DropdownMenu/DropdownMenuGroup.doc.mjs +2 -2
  823. package/src/DropdownMenu/DropdownMenuGroup.tsx +12 -6
  824. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -5
  825. package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +5 -2
  826. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +226 -0
  827. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +32 -16
  828. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +158 -0
  829. package/src/DropdownMenu/DropdownMenuSheetFirstOpen.test.tsx +72 -0
  830. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +9 -0
  831. package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +225 -0
  832. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +105 -0
  833. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +6 -6
  834. package/src/DropdownMenu/MenuBottomSheet.tsx +42 -7
  835. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +3 -3
  836. package/src/DropdownMenu/__tests__/DropdownMenuDividerAudit.a11y.chromium.spec.ts +1 -0
  837. package/src/DropdownMenu/__tests__/DropdownMenuDrillIn.a11y.chromium.spec.ts +1 -0
  838. package/src/DropdownMenu/__tests__/DropdownMenuFocusReturn.a11y.browser.spec.ts +1 -0
  839. package/src/DropdownMenu/__tests__/DropdownMenuGroupAudit.a11y.chromium.spec.ts +1 -0
  840. package/src/DropdownMenu/__tests__/DropdownMenuItemAudit.a11y.chromium.spec.ts +1 -0
  841. package/src/DropdownMenu/__tests__/DropdownMenuRadioGroupAudit.a11y.chromium.spec.ts +1 -0
  842. package/src/DropdownMenu/__tests__/DropdownMenuRadioItemAudit.a11y.chromium.spec.ts +540 -0
  843. package/src/DropdownMenu/__tests__/DropdownMenuSubMenuAudit.a11y.chromium.spec.ts +671 -0
  844. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +1 -0
  845. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +1 -0
  846. package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +1 -0
  847. package/src/DropdownMenu/__tests__/MenuHoverFocus.a11y.chromium.spec.ts +238 -0
  848. package/src/DropdownMenu/__tests__/MenuPinchZoom.a11y.chromium.spec.ts +1 -0
  849. package/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts +1 -0
  850. package/src/DropdownMenu/__tests__/SubMenuHeaderFooter.a11y.chromium.spec.ts +1 -0
  851. package/src/DropdownMenu/lazyMenuBottomSheet.ts +28 -2
  852. package/src/DropdownMenu/menuBottomSheet.stylex.ts +33 -0
  853. package/src/DropdownMenu/menuItemHover.ts +13 -1
  854. package/src/DropdownMenu/menuTouchAction.stylex.ts +28 -0
  855. package/src/DropdownMenu/modules/useMenuPress.spec.md +90 -62
  856. package/src/DropdownMenu/useMenuDrillIn.tsx +7 -5
  857. package/src/EmptyState/EmptyState.announce.test.tsx +227 -0
  858. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  859. package/src/EmptyState/EmptyState.spec.md +22 -14
  860. package/src/EmptyState/EmptyState.test.tsx +8 -8
  861. package/src/EmptyState/EmptyState.tsx +7 -5
  862. package/src/Field/Field.spec.md +57 -48
  863. package/src/Field/Field.tsx +1 -1
  864. package/src/Field/FieldLabel.spec.md +70 -59
  865. package/src/Field/FieldLabel.tsx +1 -1
  866. package/src/Field/PanelSearchInput.tsx +23 -13
  867. package/src/Field/__tests__/FieldLabelAudit.a11y.chromium.spec.ts +1 -0
  868. package/src/Field/inputDisabledFocus.ts +28 -0
  869. package/src/Field/inputStyles.stylex.ts +15 -15
  870. package/src/FieldStatus/FieldStatus.test.tsx +12 -0
  871. package/src/FieldStatus/FieldStatus.tsx +12 -3
  872. package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +1 -0
  873. package/src/FileInput/FileInput.doc.mjs +1 -1
  874. package/src/FileInput/FileInput.test.tsx +102 -0
  875. package/src/FileInput/FileInput.tsx +18 -12
  876. package/src/FormLayout/FormLayout.spec.md +69 -51
  877. package/src/Grid/Grid.spec.md +72 -69
  878. package/src/Grid/GridSpan.spec.md +158 -0
  879. package/src/Heading/Heading.spec.md +198 -0
  880. package/src/HoverCard/HoverCard.spec.md +244 -0
  881. package/src/HoverCard/HoverCard.test.tsx +93 -3
  882. package/src/Icon/Icon.doc.mjs +67 -5
  883. package/src/Icon/Icon.test.tsx +548 -9
  884. package/src/Icon/Icon.tsx +79 -15
  885. package/src/Icon/IconSize.stylex.ts +27 -11
  886. package/src/Icon/globalIconRegistry.test.tsx +395 -3
  887. package/src/Icon/globalIconRegistry.tsx +184 -36
  888. package/src/Icon/index.ts +29 -1
  889. package/src/Icon/useIcon.ts +5 -1
  890. package/src/IconButton/IconButton.spec.md +197 -0
  891. package/src/IconButton/IconButton.test.tsx +5 -2
  892. package/src/InputGroup/InputGroup.spec.md +199 -0
  893. package/src/InputGroup/InputGroup.test.tsx +120 -0
  894. package/src/InputGroup/InputGroup.tsx +59 -52
  895. package/src/InputGroup/InputGroupInternalContext.ts +15 -0
  896. package/src/InputGroup/InputGroupText.spec.md +139 -0
  897. package/src/InputGroup/InputGroupText.tsx +2 -0
  898. package/src/InputGroup/groupStyles.ts +22 -11
  899. package/src/Item/Item.test.tsx +158 -1
  900. package/src/Item/Item.tsx +42 -7
  901. package/src/Item/ItemMarkerColumns.a11y.chromium.spec.ts +211 -0
  902. package/src/Item/ItemMarkerColumnsContext.tsx +20 -0
  903. package/src/Item/ItemSwipeLayer.tsx +9 -0
  904. package/src/Item/__tests__/ItemSwipeActions.a11y.chromium.spec.ts +1 -0
  905. package/src/Item/__tests__/ItemSwipePinchZoom.a11y.chromium.spec.ts +186 -0
  906. package/src/Item/useSwipeAction.ts +71 -5
  907. package/src/Kbd/Kbd.test.tsx +95 -0
  908. package/src/Kbd/Kbd.tsx +30 -23
  909. package/src/Layer/LayerProvider.spec.md +149 -0
  910. package/src/Layer/__tests__/LayerReducedMotion.a11y.chromium.spec.ts +176 -0
  911. package/src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts +200 -0
  912. package/src/Layer/layerAnimations.stylex.ts +22 -2
  913. package/src/Layer/layerDismissalInvariants.test.tsx +9 -0
  914. package/src/Layer/layerSlideRules.ts +141 -8
  915. package/src/Layer/layerStack.ts +129 -62
  916. package/src/Layer/modalOutlet.ts +156 -15
  917. package/src/Layer/preserveAnimations.ts +304 -0
  918. package/src/Layer/useLayer.doc.mjs +1 -1
  919. package/src/Layer/useLayer.test.tsx +850 -0
  920. package/src/Layer/useLayer.tsx +644 -58
  921. package/src/Layer/useLayerDismissal.test.tsx +85 -2
  922. package/src/Layer/useLayerDismissal.ts +12 -9
  923. package/src/Layer/useTouchTrigger.ts +95 -41
  924. package/src/Layout/Layout.tsx +18 -0
  925. package/src/Layout/LayoutContent.tsx +5 -14
  926. package/src/Layout/LayoutFooter.tsx +2 -0
  927. package/src/Layout/LayoutHeader.tsx +2 -0
  928. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +1 -0
  929. package/src/Layout/layoutEdges.stylex.ts +25 -0
  930. package/src/Lightbox/Lightbox.spec.md +9 -8
  931. package/src/Lightbox/Lightbox.test.tsx +83 -0
  932. package/src/Lightbox/Lightbox.tsx +149 -125
  933. package/src/Lightbox/LightboxKeyboard.a11y.browser.spec.ts +78 -0
  934. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +70 -0
  935. package/src/Link/Link.spec.md +229 -0
  936. package/src/Link/LinkProvider.spec.md +167 -0
  937. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +1 -0
  938. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +1 -0
  939. package/src/List/List.spec.md +113 -34
  940. package/src/List/List.tsx +13 -1
  941. package/src/List/ListContext.tsx +19 -5
  942. package/src/List/ListItem.doc.mjs +3 -3
  943. package/src/List/ListItem.tsx +97 -28
  944. package/src/List/ListMarkers.a11y.chromium.spec.ts +904 -0
  945. package/src/Markdown/Markdown.codeLanguages.test.tsx +137 -0
  946. package/src/Markdown/Markdown.doc.mjs +12 -0
  947. package/src/Markdown/Markdown.fr23.bench.ts +3 -1
  948. package/src/Markdown/Markdown.fr23.perf.test.ts +45 -3
  949. package/src/Markdown/Markdown.fr23.sampling.ts +13 -4
  950. package/src/Markdown/Markdown.spec.md +71 -59
  951. package/src/Markdown/Markdown.test.tsx +50 -0
  952. package/src/Markdown/Markdown.tsx +61 -8
  953. package/src/Markdown/MarkdownTable.a11y.chromium.spec.ts +1 -0
  954. package/src/Markdown/__tests__/MarkdownNesting.a11y.chromium.spec.ts +1 -0
  955. package/src/MobileNav/MobileNav.doc.mjs +2 -2
  956. package/src/MobileNav/MobileNav.spec.md +161 -64
  957. package/src/MobileNav/MobileNav.test.tsx +27 -10
  958. package/src/MobileNav/MobileNav.tsx +51 -38
  959. package/src/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.ts +1 -0
  960. package/src/MobileNav/MobileNavToggle.test.tsx +63 -0
  961. package/src/MobileNav/MobileNavToggle.tsx +13 -5
  962. package/src/MobileNav/__tests__/MobileNavWidth.a11y.chromium.spec.ts +103 -0
  963. package/src/MoreMenu/MoreMenu.doc.mjs +2 -2
  964. package/src/MoreMenu/MoreMenu.spec.md +88 -53
  965. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +67 -9
  966. package/src/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.ts +1 -0
  967. package/src/MultiSelector/MultiSelector.test.tsx +122 -10
  968. package/src/MultiSelector/MultiSelector.tsx +24 -4
  969. package/src/MultiSelector/OptionActions.a11y.chromium.spec.ts +1 -0
  970. package/src/MultiSelector/__tests__/MultiSelector.a11y.chromium.spec.ts +1 -0
  971. package/src/NavIcon/NavIcon.spec.md +66 -38
  972. package/src/NavMenu/NavHeadingMenu.spec.md +104 -46
  973. package/src/NavMenu/NavHeadingMenu.test.tsx +276 -2
  974. package/src/NavMenu/NavHeadingMenu.tsx +42 -4
  975. package/src/NavMenu/NavHeadingMenuItem.tsx +60 -6
  976. package/src/NavMenu/NavMenuContext.tsx +11 -0
  977. package/src/NavMenu/__tests__/NavMenusSlideSelection.a11y.chromium.spec.ts +137 -0
  978. package/src/NumberInput/NumberInput.doc.mjs +6 -6
  979. package/src/NumberInput/NumberInput.spec.md +248 -0
  980. package/src/NumberInput/NumberInput.test.tsx +187 -14
  981. package/src/NumberInput/NumberInput.tsx +86 -24
  982. package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +1 -0
  983. package/src/Overlay/Overlay.doc.mjs +2 -2
  984. package/src/Overlay/Overlay.test.tsx +72 -4
  985. package/src/Overlay/Overlay.tsx +18 -8
  986. package/src/Pagination/Pagination.test.tsx +2 -2
  987. package/src/Popover/Popover.doc.mjs +38 -2
  988. package/src/Popover/Popover.spec.md +90 -11
  989. package/src/Popover/Popover.test.tsx +340 -2
  990. package/src/Popover/Popover.tsx +401 -35
  991. package/src/Popover/PopoverPresentation.test.tsx +952 -0
  992. package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +205 -0
  993. package/src/Popover/index.ts +5 -1
  994. package/src/Popover/lazyPopoverBottomSheet.ts +57 -0
  995. package/src/Popover/usePopover.tsx +11 -5
  996. package/src/PowerSearch/PowerSearch.spec.md +423 -53
  997. package/src/PowerSearch/PowerSearch.test.tsx +77 -1
  998. package/src/PowerSearch/PowerSearch.tsx +7 -5
  999. package/src/ProgressBar/ProgressBar.test.tsx +12 -0
  1000. package/src/ProgressBar/ProgressBar.tsx +18 -0
  1001. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +1 -0
  1002. package/src/RadioList/RadioList.spec.md +227 -0
  1003. package/src/RadioList/RadioList.test.tsx +34 -7
  1004. package/src/RadioList/RadioListItem.press.source-build.test.mjs +80 -0
  1005. package/src/RadioList/RadioListItem.spec.md +223 -0
  1006. package/src/RadioList/RadioListItem.tsx +26 -12
  1007. package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +1 -0
  1008. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +1 -0
  1009. package/src/ScrollableArea/ScrollableArea.spec.md +6 -5
  1010. package/src/ScrollableArea/ScrollableArea.test.tsx +5 -0
  1011. package/src/ScrollableArea/ScrollableArea.tsx +4 -0
  1012. package/src/Section/Section.spec.md +102 -44
  1013. package/src/SegmentedControl/SegmentedControl.spec.md +162 -53
  1014. package/src/SegmentedControl/SegmentedControl.test.tsx +46 -0
  1015. package/src/SegmentedControl/SegmentedControl.tsx +7 -3
  1016. package/src/SegmentedControl/SegmentedControlItem.spec.md +206 -0
  1017. package/src/SelectableCard/SelectableCard.doc.mjs +7 -6
  1018. package/src/SelectableCard/SelectableCard.spec.md +230 -0
  1019. package/src/SelectableCard/SelectableCard.test.tsx +11 -1
  1020. package/src/SelectableCard/SelectableCard.tsx +49 -33
  1021. package/src/Selector/Selector.sheetActiveDescendant.test.tsx +95 -0
  1022. package/src/Selector/Selector.spec.md +12 -4
  1023. package/src/Selector/Selector.test.tsx +114 -8
  1024. package/src/Selector/Selector.tsx +30 -6
  1025. package/src/Selector/__tests__/ComboboxField.a11y.chromium.spec.ts +458 -0
  1026. package/src/Selector/__tests__/EmptyStateAnnouncement.a11y.chromium.spec.ts +1 -0
  1027. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +1 -0
  1028. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +1 -0
  1029. package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +1 -0
  1030. package/src/Selector/hooks.ts +234 -10
  1031. package/src/Selector/useCombobox.doc.mjs +156 -9
  1032. package/src/Selector/useCombobox.public.test.tsx +89 -0
  1033. package/src/Selector/useCombobox.test.tsx +444 -0
  1034. package/src/SideNav/SideNav.spec.md +50 -30
  1035. package/src/SideNav/SideNav.test.tsx +425 -25
  1036. package/src/SideNav/SideNav.tsx +85 -1
  1037. package/src/SideNav/SideNavCollapseButton.spec.md +161 -0
  1038. package/src/SideNav/SideNavHeading.spec.md +226 -0
  1039. package/src/SideNav/SideNavHeading.tsx +102 -6
  1040. package/src/SideNav/SideNavItem.spec.md +246 -0
  1041. package/src/SideNav/SideNavItem.tsx +40 -9
  1042. package/src/SideNav/SideNavRailMotion.test.tsx +620 -0
  1043. package/src/SideNav/SideNavSection.spec.md +153 -0
  1044. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +417 -0
  1045. package/src/SideNav/railMotion.ts +315 -0
  1046. package/src/Skeleton/Skeleton.spec.md +99 -42
  1047. package/src/Skeleton/Skeleton.test.tsx +108 -1
  1048. package/src/Skeleton/Skeleton.tsx +30 -2
  1049. package/src/Slider/Slider.fr10.test.tsx +34 -0
  1050. package/src/Slider/Slider.test.tsx +172 -0
  1051. package/src/Slider/Slider.tsx +70 -14
  1052. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +1 -0
  1053. package/src/Spinner/Spinner.spec.md +231 -0
  1054. package/src/Stack/Stack.spec.md +104 -56
  1055. package/src/StatusDot/StatusDot.spec.md +139 -51
  1056. package/src/StatusDot/StatusDot.test.tsx +13 -0
  1057. package/src/StatusDot/StatusDot.tsx +27 -0
  1058. package/src/Stepper/Step.spec.md +206 -0
  1059. package/src/Stepper/Step.tsx +19 -3
  1060. package/src/Stepper/Stepper.test.tsx +50 -0
  1061. package/src/Switch/Switch.focusRing.source-build.test.mjs +81 -0
  1062. package/src/Switch/Switch.spec.md +150 -66
  1063. package/src/Switch/Switch.tsx +11 -9
  1064. package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +1 -0
  1065. package/src/Switch/switch.markers.stylex.ts +7 -2
  1066. package/src/TabList/Tab.spec.md +201 -0
  1067. package/src/TabList/Tab.tsx +7 -1
  1068. package/src/TabList/TabList.doc.mjs +3 -3
  1069. package/src/TabList/TabList.test.tsx +27 -0
  1070. package/src/TabList/TabMenu.spec.md +198 -0
  1071. package/src/TabList/TabMenu.tsx +24 -1
  1072. package/src/TabList/__tests__/TabListOverflow.interaction.browser.spec.ts +99 -0
  1073. package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +1 -0
  1074. package/src/Table/Table.spec.md +54 -30
  1075. package/src/Table/TableCell.tsx +9 -0
  1076. package/src/Table/TableHeaderCell.tsx +2 -0
  1077. package/src/Table/TableRow.tsx +3 -0
  1078. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +129 -0
  1079. package/src/Table/__tests__/Table.a11y.contracts.ts +35 -0
  1080. package/src/Table/__tests__/Table.a11y.renders.tsx +112 -0
  1081. package/src/Table/__tests__/Table.a11y.states.ts +140 -0
  1082. package/src/Table/__tests__/Table.a11y.test.tsx +198 -0
  1083. package/src/Table/__tests__/TableMinWidth.a11y.chromium.spec.ts +1 -0
  1084. package/src/Table/__tests__/TableRowGlide.a11y.browser.spec.ts +382 -0
  1085. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +1 -0
  1086. package/src/Table/__tests__/TableStickyDividers.a11y.browser.spec.ts +560 -0
  1087. package/src/Table/glidingDivider.ts +336 -0
  1088. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +23 -8
  1089. package/src/Table/plugins/rowExpansion/useTableRowExpansion.glide.test.tsx +280 -0
  1090. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +91 -9
  1091. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +471 -10
  1092. package/src/Table/plugins/rowStatus/useTableRowStatus.spec.md +4 -4
  1093. package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.test.tsx +174 -0
  1094. package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.ts +86 -0
  1095. package/src/Table/plugins/sortable/useTableSortable.test.tsx +0 -12
  1096. package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +51 -1
  1097. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +312 -12
  1098. package/src/Table/rowDivider.ts +154 -0
  1099. package/src/Table/useTableRowExpansion.doc.mjs +8 -0
  1100. package/src/Text/Text.spec.md +114 -127
  1101. package/src/TextArea/TextArea.doc.mjs +6 -6
  1102. package/src/TextArea/TextArea.spec.md +164 -64
  1103. package/src/TextArea/TextArea.test.tsx +65 -6
  1104. package/src/TextArea/TextArea.tsx +27 -15
  1105. package/src/TextInput/TextInput.doc.mjs +8 -8
  1106. package/src/TextInput/TextInput.spec.md +260 -0
  1107. package/src/TextInput/TextInput.test.tsx +126 -10
  1108. package/src/TextInput/TextInput.tsx +57 -23
  1109. package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +1 -0
  1110. package/src/Thumbnail/Thumbnail.doc.mjs +1 -2
  1111. package/src/Thumbnail/Thumbnail.spec.md +244 -0
  1112. package/src/Thumbnail/Thumbnail.test.tsx +120 -7
  1113. package/src/Thumbnail/Thumbnail.tsx +77 -31
  1114. package/src/TimeInput/TimeInput.spec.md +273 -0
  1115. package/src/TimeInput/TimeInput.tsx +12 -4
  1116. package/src/TimeInput/TouchTimeField.tsx +2 -1
  1117. package/src/Timestamp/Timestamp.spec.md +252 -0
  1118. package/src/Toast/Toast.spec.md +300 -0
  1119. package/src/Toast/ToastViewport.modalHost.test.tsx +630 -5
  1120. package/src/Toast/ToastViewport.test.tsx +137 -0
  1121. package/src/Toast/ToastViewport.tsx +63 -6
  1122. package/src/ToggleButton/ToggleButton.spec.md +256 -0
  1123. package/src/ToggleButton/ToggleButtonGroup.spec.md +195 -0
  1124. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +1 -0
  1125. package/src/Token/Token.spec.md +271 -0
  1126. package/src/Token/__tests__/TokenRemoveTarget.a11y.chromium.spec.ts +1 -0
  1127. package/src/Tokenizer/Tokenizer.props-type.test.tsx +126 -0
  1128. package/src/Tokenizer/Tokenizer.spec.md +313 -72
  1129. package/src/Tokenizer/Tokenizer.ssr.test.tsx +196 -0
  1130. package/src/Tokenizer/Tokenizer.test.tsx +44 -8
  1131. package/src/Tokenizer/Tokenizer.tsx +586 -41
  1132. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +2719 -0
  1133. package/src/Tokenizer/TokenizerBottomSheet.tsx +957 -0
  1134. package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +61 -27
  1135. package/src/Toolbar/Toolbar.spec.md +103 -49
  1136. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +1 -0
  1137. package/src/Tooltip/Tooltip.spec.md +161 -36
  1138. package/src/Tooltip/Tooltip.test.tsx +171 -3
  1139. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +1 -0
  1140. package/src/Tooltip/__tests__/Tooltip.a11y.states.ts +2 -2
  1141. package/src/Tooltip/__tests__/TooltipFocusReturn.a11y.chromium.spec.ts +1 -0
  1142. package/src/Tooltip/__tests__/TooltipHoverBridge.a11y.chromium.spec.ts +1 -0
  1143. package/src/Tooltip/__tests__/TooltipTallContent.a11y.browser.spec.ts +673 -0
  1144. package/src/Tooltip/__tests__/TooltipTallContentTracking.a11y.browser.spec.ts +1162 -0
  1145. package/src/Tooltip/useTooltip.tsx +7 -2
  1146. package/src/TopNav/TopNav.spec.md +190 -0
  1147. package/src/TopNav/TopNav.test.tsx +89 -0
  1148. package/src/TopNav/TopNavHeading.spec.md +211 -0
  1149. package/src/TopNav/TopNavHeading.tsx +35 -2
  1150. package/src/TopNav/TopNavItem.spec.md +189 -0
  1151. package/src/TopNav/TopNavMegaMenu.reduced-motion.source-build.test.mjs +83 -0
  1152. package/src/TopNav/TopNavMegaMenu.spec.md +190 -0
  1153. package/src/TopNav/TopNavMegaMenu.tsx +21 -4
  1154. package/src/TopNav/TopNavMegaMenuFeaturedCard.spec.md +150 -0
  1155. package/src/TopNav/TopNavMegaMenuItem.spec.md +155 -0
  1156. package/src/TopNav/TopNavMenu.spec.md +202 -0
  1157. package/src/TopNav/TopNavMenu.test.tsx +65 -1
  1158. package/src/TopNav/TopNavMenu.tsx +30 -1
  1159. package/src/TopNav/__tests__/TopNavMobileLongHeading.a11y.chromium.spec.ts +1 -0
  1160. package/src/TreeList/TreeList.doc.mjs +13 -0
  1161. package/src/TreeList/TreeList.spec.md +54 -35
  1162. package/src/TreeList/TreeList.tsx +234 -2
  1163. package/src/TreeList/TreeListBranches.tsx +8 -6
  1164. package/src/TreeList/TreeListItem.tsx +12 -6
  1165. package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +19 -6
  1166. package/src/TreeList/__tests__/TreeListGuideAlignment.interaction.browser.spec.ts +127 -0
  1167. package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +1 -0
  1168. package/src/Typeahead/BaseTypeahead.emptyState.a11y.chromium.spec.ts +138 -0
  1169. package/src/Typeahead/BaseTypeahead.test.tsx +201 -4
  1170. package/src/Typeahead/BaseTypeahead.tsx +26 -10
  1171. package/src/Typeahead/Typeahead.test.tsx +114 -1
  1172. package/src/Typeahead/Typeahead.tsx +34 -16
  1173. package/src/VisuallyHidden/VisuallyHidden.spec.md +170 -0
  1174. package/src/__tests__/BusyOwnerAnnouncement.test.tsx +66 -5
  1175. package/src/__tests__/CardPress.a11y.chromium.spec.ts +353 -0
  1176. package/src/__tests__/DisabledTriggerFocus.a11y.chromium.spec.ts +2 -1
  1177. package/src/__tests__/PressModality.a11y.chromium.spec.ts +392 -0
  1178. package/src/__tests__/PressedState.a11y.chromium.spec.ts +1 -0
  1179. package/src/__tests__/pressState.ts +43 -1
  1180. package/src/__tests__/unthemedLength.ts +34 -0
  1181. package/src/gestures/GestureArena.ts +966 -0
  1182. package/src/gestures/GestureRecognizer.ts +626 -0
  1183. package/src/gestures/LongPressGestureRecognizer.ts +186 -0
  1184. package/src/gestures/PanGestureRecognizer.ts +410 -0
  1185. package/src/gestures/TapGestureRecognizer.ts +192 -0
  1186. package/src/gestures/VelocityTracker.ts +194 -0
  1187. package/src/gestures/__tests__/LongPressGestureRecognizer.test.ts +141 -0
  1188. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +327 -0
  1189. package/src/gestures/__tests__/TapGestureRecognizer.test.ts +154 -0
  1190. package/src/gestures/__tests__/VelocityTracker.streams.test.ts +243 -0
  1191. package/src/gestures/__tests__/VelocityTracker.test.ts +261 -0
  1192. package/src/gestures/__tests__/arena.test.ts +824 -0
  1193. package/src/gestures/__tests__/arenaContinuous.test.ts +207 -0
  1194. package/src/gestures/__tests__/arenaTapLongPress.test.ts +211 -0
  1195. package/src/gestures/__tests__/fixtures/pointer-streams/README.md +82 -0
  1196. package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-fling.json +130 -0
  1197. package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-slow.json +860 -0
  1198. package/src/gestures/__tests__/fixtures/pointer-streams/android-chromium-stop-release.json +357 -0
  1199. package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-fling.json +66 -0
  1200. package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-slow.json +268 -0
  1201. package/src/gestures/__tests__/fixtures/pointer-streams/android-firefox-stop-release.json +128 -0
  1202. package/src/gestures/__tests__/fixtures/pointer-streams/capture.html +123 -0
  1203. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-fling.json +64 -0
  1204. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-slow.json +268 -0
  1205. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-mouse-stop-release.json +124 -0
  1206. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-fling.json +64 -0
  1207. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-slow.json +268 -0
  1208. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-pen-stop-release.json +124 -0
  1209. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-fling.json +84 -0
  1210. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-slow.json +381 -0
  1211. package/src/gestures/__tests__/fixtures/pointer-streams/desktop-chromium-touch-stop-release.json +171 -0
  1212. package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-fling.json +45 -0
  1213. package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-slow.json +101 -0
  1214. package/src/gestures/__tests__/fixtures/pointer-streams/ios-safari-stop-release.json +130 -0
  1215. package/src/gestures/__tests__/harness.ts +204 -0
  1216. package/src/gestures/geometry.ts +55 -0
  1217. package/src/gestures/types.ts +161 -0
  1218. package/src/hooks/AnnounceRenderedText.tsx +27 -0
  1219. package/src/hooks/ModalAnnounceProvider.tsx +155 -0
  1220. package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +98 -4
  1221. package/src/hooks/__tests__/menuLinkClicks.ts +71 -0
  1222. package/src/hooks/actionGroupTracker.exports.test.ts +28 -0
  1223. package/src/hooks/actionGroupTracker.test.ts +510 -0
  1224. package/src/hooks/actionGroupTracker.ts +449 -0
  1225. package/src/hooks/index.ts +6 -0
  1226. package/src/hooks/menuPressOnItems.ts +40 -0
  1227. package/src/hooks/modalAnnounce.ts +439 -0
  1228. package/src/hooks/scrollGeometry.ts +71 -4
  1229. package/src/hooks/useAdaptivePresentation.ts +46 -9
  1230. package/src/hooks/useAnimatedLayout.doc.mjs +101 -0
  1231. package/src/hooks/useAnimatedLayout.ts +61 -0
  1232. package/src/hooks/useAnnounce.doc.mjs +4 -4
  1233. package/src/hooks/useAnnounce.modal.test.tsx +1291 -0
  1234. package/src/hooks/useAnnounce.test.tsx +64 -4
  1235. package/src/hooks/useAnnounce.ts +452 -28
  1236. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +226 -0
  1237. package/src/hooks/useAnnounceRenderedText.ts +81 -11
  1238. package/src/hooks/useBusyAnnouncement.adopters.test.tsx +69 -0
  1239. package/src/hooks/useBusyAnnouncement.test.tsx +112 -0
  1240. package/src/hooks/useBusyAnnouncement.ts +64 -54
  1241. package/src/hooks/useFocusTrap.doc.mjs +3 -3
  1242. package/src/hooks/useFocusTrap.test.tsx +135 -2
  1243. package/src/hooks/useFocusTrap.ts +59 -27
  1244. package/src/hooks/useMenuHover.ts +6 -2
  1245. package/src/hooks/useMenuPress.doc.mjs +2 -2
  1246. package/src/hooks/useMenuPress.test.tsx +5 -2
  1247. package/src/hooks/useMenuPress.ts +72 -37
  1248. package/src/hooks/usePressFeedback.doc.mjs +4 -4
  1249. package/src/hooks/usePressFeedback.ts +5 -2
  1250. package/src/hooks/useScrollableArea.test.tsx +344 -3
  1251. package/src/hooks/useScrollableArea.ts +120 -12
  1252. package/src/i18n/generated-locales/en.generated.ts +35 -0
  1253. package/src/i18n/generated-locales/pseudo.generated.ts +37 -0
  1254. package/src/internal/tokenizer-presentation.test.ts +29 -0
  1255. package/src/internal/tokenizer-presentation.ts +25 -0
  1256. package/src/internal/touch.test.ts +44 -0
  1257. package/src/internal/touch.ts +41 -0
  1258. package/src/motion/LayoutChangeSnapshot.tsx +50 -0
  1259. package/src/motion/MEASUREMENTS.md +271 -0
  1260. package/src/motion/README.md +218 -0
  1261. package/src/motion/__tests__/animatedLayout.interaction.browser.spec.ts +1613 -0
  1262. package/src/motion/__tests__/animatedLayoutAdopters.interaction.browser.spec.ts +217 -0
  1263. package/src/motion/__tests__/animatedLayoutBundle.ts +17 -0
  1264. package/src/motion/animatedLayout.boundary.test.ts +155 -0
  1265. package/src/motion/animatedLayout.swap.test.ts +827 -0
  1266. package/src/motion/animatedLayout.test.ts +1154 -0
  1267. package/src/motion/animatedLayout.ts +1801 -0
  1268. package/src/motion/animatedLayoutAdopters.test.tsx +500 -0
  1269. package/src/motion/animator.test.ts +2653 -0
  1270. package/src/motion/animator.ts +2794 -0
  1271. package/src/motion/bezier.test.ts +52 -0
  1272. package/src/motion/bezier.ts +64 -0
  1273. package/src/motion/coast.test.ts +99 -0
  1274. package/src/motion/coast.ts +150 -0
  1275. package/src/motion/decay.test.ts +120 -0
  1276. package/src/motion/decay.ts +126 -0
  1277. package/src/motion/projection.test.ts +107 -0
  1278. package/src/motion/projection.ts +116 -0
  1279. package/src/motion/reducedMotion.stylex.ts +41 -0
  1280. package/src/motion/reducedMotion.test.ts +129 -0
  1281. package/src/motion/reducedMotion.ts +94 -0
  1282. package/src/motion/reducedMotionPlan.test.ts +182 -0
  1283. package/src/motion/reducedMotionPlan.ts +263 -0
  1284. package/src/motion/resolveSnapPoint.test.ts +189 -0
  1285. package/src/motion/resolveSnapPoint.ts +169 -0
  1286. package/src/motion/roleValue.ts +105 -0
  1287. package/src/motion/roles.test.ts +256 -0
  1288. package/src/motion/roles.ts +262 -0
  1289. package/src/motion/rubberBand.test.ts +88 -0
  1290. package/src/motion/rubberBand.ts +115 -0
  1291. package/src/motion/selectPage.test.ts +31 -0
  1292. package/src/motion/selectPage.ts +55 -0
  1293. package/src/motion/spring.test.ts +650 -0
  1294. package/src/motion/spring.ts +551 -0
  1295. package/src/motion/transientCopy.ts +374 -0
  1296. package/src/motion/uikit/gestures.test.ts +89 -0
  1297. package/src/motion/uikit/gestures.ts +359 -0
  1298. package/src/motion/uikit/index.ts +80 -0
  1299. package/src/motion/uikit/navigation.ts +83 -0
  1300. package/src/motion/uikit/scroll.ts +141 -0
  1301. package/src/motion/uikit/springRows.test.ts +71 -0
  1302. package/src/motion/uikit/springs.ts +514 -0
  1303. package/src/motion/uikit/timing.ts +210 -0
  1304. package/src/motion/uikit/uikit.test.ts +364 -0
  1305. package/src/motion/uikit/values.test.ts +110 -0
  1306. package/src/reset.a11y.chromium.spec.ts +1 -0
  1307. package/src/reset.until-found.a11y.browser.spec.ts +1 -0
  1308. package/src/serverSafeComponents.test.ts +10 -0
  1309. package/src/tailwind-theme.css +51 -1
  1310. package/src/tailwind-theme.test.ts +51 -0
  1311. package/src/theme/Theme.test.tsx +28 -0
  1312. package/src/theme/__tests__/SpacingRootFontSize.a11y.chromium.spec.ts +1 -0
  1313. package/src/theme/declarationBoundary.ts +282 -1
  1314. package/src/theme/defineTheme.test.ts +529 -12
  1315. package/src/theme/defineTheme.ts +231 -19
  1316. package/src/theme/derivedVarRegistry.test.ts +34 -5
  1317. package/src/theme/derivedVarRegistry.ts +4 -0
  1318. package/src/theme/expandMotionScale.test.ts +17 -0
  1319. package/src/theme/extensibleAxes.test.ts +74 -29
  1320. package/src/theme/generateThemeRules.ts +772 -35
  1321. package/src/theme/index.ts +3 -0
  1322. package/src/theme/onMediaTokens.test.ts +186 -0
  1323. package/src/theme/statusColor.ts +189 -0
  1324. package/src/theme/statusRoleDerivation.ts +289 -0
  1325. package/src/theme/syntax/SyntaxTheme.tsx +1 -1
  1326. package/src/theme/syntax/defineSyntaxTheme.ts +1 -1
  1327. package/src/theme/syntax/presets.ts +1 -1
  1328. package/src/theme/syntax/tokens.ts +1 -1
  1329. package/src/theme/themeAdaptations.test.ts +412 -0
  1330. package/src/theme/themeAdaptations.ts +43 -1
  1331. package/src/theme/tokens.stylex.ts +36 -2
  1332. package/src/theme/tokens.test.ts +111 -1
  1333. package/src/theme/tokens.ts +23 -1
  1334. package/src/theme/useTheme.ts +10 -4
  1335. package/src/utils/customPropertyArmLayering.test.ts +131 -0
  1336. package/src/utils/edgeAutoscroll.test.ts +192 -0
  1337. package/src/utils/edgeAutoscroll.ts +111 -0
  1338. package/src/utils/hitArea.test.ts +628 -0
  1339. package/src/utils/hitArea.ts +770 -0
  1340. package/src/utils/interactionOverlay.stylex.ts +4 -1
  1341. package/src/utils/pressFeedback.test.ts +310 -2
  1342. package/src/utils/pressFeedback.ts +306 -54
  1343. package/src/utils/pressGesture.test.ts +50 -0
  1344. package/src/utils/pressGesture.ts +40 -2
  1345. package/src/utils/touchPresentation.test.ts +323 -0
  1346. package/src/utils/touchPresentation.ts +153 -0
@@ -0,0 +1,1154 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file animatedLayout.test.ts
5
+ * @input vitest (jsdom), the animated-layout module, a recording stand-in for
6
+ * Element.animate and stubbed layout rectangles (jsdom lays nothing out)
7
+ * @output Checks the handle (`spec:AST-105` FR1), that nothing runs without
8
+ * one (FR2), which elements the walk takes and how it moves them (FR3),
9
+ * the shared `springs.settle` motion and Reduce Motion by pointer (FR4),
10
+ * and the indicator's transition
11
+ * @position Testing; the real geometry is proven in
12
+ * __tests__/animatedLayout.interaction.browser.spec.ts
13
+ */
14
+
15
+ import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
16
+ import {
17
+ applyLayoutChangeTransition,
18
+ createAnimatedLayout,
19
+ holdLayoutExit,
20
+ playLayoutChange,
21
+ releaseLayoutExit,
22
+ reportLayoutChange,
23
+ } from './animatedLayout';
24
+
25
+ interface Played {
26
+ element: Element;
27
+ keyframes: Keyframe[];
28
+ options: KeyframeAnimationOptions;
29
+ cancel: ReturnType<typeof vi.fn>;
30
+ finish?: () => void;
31
+ }
32
+
33
+ let played: Played[] = [];
34
+ let media: Record<string, boolean> = {};
35
+ const originalAnimate = Element.prototype.animate;
36
+ const originalMatchMedia = window.matchMedia;
37
+
38
+ beforeEach(() => {
39
+ played = [];
40
+ media = {};
41
+ Element.prototype.animate = function (
42
+ this: Element,
43
+ keyframes: Keyframe[] | PropertyIndexedKeyframes | null,
44
+ options?: number | KeyframeAnimationOptions,
45
+ ) {
46
+ const cancel = vi.fn();
47
+ played.push({
48
+ element: this,
49
+ keyframes: keyframes as Keyframe[],
50
+ options: options as KeyframeAnimationOptions,
51
+ cancel,
52
+ });
53
+ // Every glide reads as 100 ms in when a later change retargets it.
54
+ const entry = played[played.length - 1];
55
+ return {
56
+ cancel,
57
+ addEventListener(type: string, listener: () => void) {
58
+ if (type === 'finish') {
59
+ entry.finish = listener;
60
+ }
61
+ },
62
+ currentTime: 100,
63
+ } as unknown as Animation;
64
+ };
65
+ window.matchMedia = (query: string) =>
66
+ ({
67
+ matches: media[query] === true,
68
+ media: query,
69
+ addEventListener() {},
70
+ removeEventListener() {},
71
+ }) as unknown as MediaQueryList;
72
+ });
73
+
74
+ afterEach(() => {
75
+ Element.prototype.animate = originalAnimate;
76
+ window.matchMedia = originalMatchMedia;
77
+ document.body.innerHTML = '';
78
+ });
79
+
80
+ /** Gives `element` a rectangle that follows `phase` (before or after). */
81
+ function placeAt(
82
+ element: Element,
83
+ rects: {
84
+ before: [number, number, number, number];
85
+ after?: [number, number, number, number];
86
+ },
87
+ phase: {current: 'before' | 'after'},
88
+ ) {
89
+ vi.spyOn(element, 'getBoundingClientRect').mockImplementation(() => {
90
+ const [x, y, w, h] =
91
+ phase.current === 'before' || rects.after == null
92
+ ? rects.before
93
+ : rects.after;
94
+ return new DOMRect(x, y, w, h);
95
+ });
96
+ }
97
+
98
+ const flushMicrotasks = async () => {
99
+ await Promise.resolve();
100
+ await Promise.resolve();
101
+ };
102
+
103
+ /**
104
+ * An area with a changed element and the given followers after it, each
105
+ * shifted by `shift` px down after the change unless it says otherwise.
106
+ */
107
+ function setUp(html: string) {
108
+ document.body.innerHTML = html;
109
+ const area = document.getElementById('area') as HTMLElement;
110
+ const changed = document.getElementById('changed') as HTMLElement;
111
+ const phase: {current: 'before' | 'after'} = {current: 'before'};
112
+ placeAt(area, {before: [0, 0, 400, 600]}, phase);
113
+ placeAt(changed, {before: [0, 0, 400, 0], after: [0, 0, 400, 80]}, phase);
114
+ return {area, changed, phase};
115
+ }
116
+
117
+ function translateOf(entry: Played): {x: number; y: number} {
118
+ const first = String(entry.keyframes[0].translate ?? '');
119
+ const match = /^(-?[\d.e+-]+)px\s+(-?[\d.e+-]+)px/.exec(first);
120
+ return match == null
121
+ ? {x: 0, y: 0}
122
+ : {x: Number(match[1]), y: Number(match[2])};
123
+ }
124
+
125
+ async function runChange(
126
+ layout: ReturnType<typeof createAnimatedLayout> | null,
127
+ changed: Element,
128
+ phase: {current: 'before' | 'after'},
129
+ ) {
130
+ const report = reportLayoutChange(layout, () => changed);
131
+ report.measureBefore();
132
+ phase.current = 'after';
133
+ report.animate();
134
+ playLayoutChange(layout, changed);
135
+ await flushMicrotasks();
136
+ }
137
+
138
+ describe('the handle (spec:AST-105 FR1)', () => {
139
+ it('has no public members', () => {
140
+ const area = document.createElement('div');
141
+ const handle = createAnimatedLayout(() => area);
142
+ expect(Object.keys(handle)).toEqual([]);
143
+ expect(Object.getOwnPropertyNames(handle)).toEqual([]);
144
+ expect(Object.isFrozen(handle)).toBe(true);
145
+ });
146
+ });
147
+
148
+ describe('without a handle (spec:AST-105 FR2)', () => {
149
+ it('measures nothing and plays nothing', async () => {
150
+ const {changed, phase} = setUp(
151
+ '<div id="area"><div id="changed"></div><div id="a"></div></div>',
152
+ );
153
+ const a = document.getElementById('a') as HTMLElement;
154
+ placeAt(a, {before: [0, 0, 400, 40], after: [0, 80, 400, 40]}, phase);
155
+ await runChange(null, changed, phase);
156
+ expect(played).toEqual([]);
157
+ });
158
+ });
159
+
160
+ describe('the walk (spec:AST-105 FR3, Coverage)', () => {
161
+ it('moves following siblings at every level up to the area, by their layout change, and nothing past it', async () => {
162
+ const {area, changed, phase} = setUp(
163
+ `<div id="area"><section id="l1"><div id="l2"><div id="changed"></div><div id="s2"></div></div><div id="s1"></div></section><div id="s0"></div></div>
164
+ <div id="outside"></div>`,
165
+ );
166
+ for (const [id, y] of [
167
+ ['s2', 0],
168
+ ['s1', 50],
169
+ ['s0', 100],
170
+ ['outside', 700],
171
+ ] as const) {
172
+ placeAt(
173
+ document.getElementById(id) as HTMLElement,
174
+ {before: [0, y, 400, 40], after: [0, y + 80, 400, 40]},
175
+ phase,
176
+ );
177
+ }
178
+ await runChange(
179
+ createAnimatedLayout(() => area),
180
+ changed,
181
+ phase,
182
+ );
183
+ const moved = played
184
+ .filter(p => p.keyframes[0].translate != null)
185
+ .map(p => (p.element as HTMLElement).id);
186
+ expect(moved.sort()).toEqual(['s0', 's1', 's2']);
187
+ for (const entry of played.filter(p => p.keyframes[0].translate != null)) {
188
+ expect(translateOf(entry).y).toBeCloseTo(-80);
189
+ // One replace-composited translate, which the compositor runs.
190
+ expect(entry.options.composite).toBeUndefined();
191
+ expect(entry.options.easing).toBe('linear');
192
+ // Lands where layout put it.
193
+ expect(String(entry.keyframes.at(-1)?.translate)).toBe('0px 0px');
194
+ }
195
+ });
196
+
197
+ it('reads every follower (place, transform, scale) before it starts any glide, so a long page is laid out once', async () => {
198
+ const {area, changed, phase} = setUp(
199
+ '<div id="area"><div id="changed"></div><div id="a"></div><div id="b"></div><div id="c"></div></div>',
200
+ );
201
+ for (const [id, y] of [
202
+ ['a', 0],
203
+ ['b', 40],
204
+ ['c', 80],
205
+ ] as const) {
206
+ placeAt(
207
+ document.getElementById(id) as HTMLElement,
208
+ {before: [0, y, 400, 40], after: [0, y + 80, 400, 40]},
209
+ phase,
210
+ );
211
+ }
212
+ // A style or layout read after a glide started lays the page out again.
213
+ const readsAfterAGlide: string[] = [];
214
+ const computed = window.getComputedStyle.bind(window);
215
+ vi.spyOn(window, 'getComputedStyle').mockImplementation(
216
+ (element: Element, pseudo?: string | null) => {
217
+ if (played.some(p => p.keyframes[0].translate != null)) {
218
+ readsAfterAGlide.push((element as HTMLElement).id);
219
+ }
220
+ return computed(element, pseudo);
221
+ },
222
+ );
223
+ await runChange(
224
+ createAnimatedLayout(() => area),
225
+ changed,
226
+ phase,
227
+ );
228
+ expect(played.filter(p => p.keyframes[0].translate != null)).toHaveLength(
229
+ 3,
230
+ );
231
+ expect(readsAfterAGlide).toEqual([]);
232
+ });
233
+
234
+ it('takes the children of a display: contents wrapper and skips absolute, fixed, hidden and display: none elements', async () => {
235
+ const {area, changed, phase} = setUp(
236
+ `<div id="area"><div id="changed"></div>
237
+ <div id="wrap" style="display: contents"><div id="c1"></div><div id="c2"></div></div>
238
+ <div id="abs" style="position: absolute"></div>
239
+ <div id="fixed" style="position: fixed"></div>
240
+ <div id="hidden" style="visibility: hidden"></div>
241
+ <div id="none" style="display: none"></div></div>`,
242
+ );
243
+ for (const id of ['c1', 'c2', 'abs', 'fixed', 'hidden', 'none']) {
244
+ placeAt(
245
+ document.getElementById(id) as HTMLElement,
246
+ {before: [0, 10, 400, 40], after: [0, 90, 400, 40]},
247
+ phase,
248
+ );
249
+ }
250
+ await runChange(
251
+ createAnimatedLayout(() => area),
252
+ changed,
253
+ phase,
254
+ );
255
+ const moved = played
256
+ .filter(p => p.keyframes[0].translate != null)
257
+ .map(p => (p.element as HTMLElement).id);
258
+ expect(moved.sort()).toEqual(['c1', 'c2']);
259
+ });
260
+
261
+ it('leaves an element whose rectangle did not change, and one outside the visible part before and after', async () => {
262
+ const {area, changed, phase} = setUp(
263
+ '<div id="area"><div id="changed"></div><div id="still"></div><div id="far"></div></div>',
264
+ );
265
+ placeAt(
266
+ document.getElementById('still') as HTMLElement,
267
+ {before: [0, 10, 400, 40]},
268
+ phase,
269
+ );
270
+ placeAt(
271
+ document.getElementById('far') as HTMLElement,
272
+ {before: [0, 2000, 400, 40], after: [0, 2080, 400, 40]},
273
+ phase,
274
+ );
275
+ await runChange(
276
+ createAnimatedLayout(() => area),
277
+ changed,
278
+ phase,
279
+ );
280
+ expect(played.filter(p => p.keyframes[0].translate != null)).toEqual([]);
281
+ });
282
+
283
+ it('moves each element once for two changes in one frame, by the total', async () => {
284
+ document.body.innerHTML =
285
+ '<div id="area"><div id="g1"></div><div id="g2"></div><div id="after"></div></div>';
286
+ const area = document.getElementById('area') as HTMLElement;
287
+ const phase: {current: 'before' | 'after'} = {current: 'before'};
288
+ placeAt(area, {before: [0, 0, 400, 600]}, phase);
289
+ placeAt(
290
+ document.getElementById('after') as HTMLElement,
291
+ {before: [0, 0, 400, 40], after: [0, 160, 400, 40]},
292
+ phase,
293
+ );
294
+ const layout = createAnimatedLayout(() => area);
295
+ const one = reportLayoutChange(layout, () => document.getElementById('g1'));
296
+ const two = reportLayoutChange(layout, () => document.getElementById('g2'));
297
+ one.measureBefore();
298
+ two.measureBefore();
299
+ phase.current = 'after';
300
+ one.animate();
301
+ two.animate();
302
+ await flushMicrotasks();
303
+ const moves = played.filter(p => (p.element as HTMLElement).id === 'after');
304
+ expect(moves).toHaveLength(1);
305
+ expect(translateOf(moves[0]).y).toBeCloseTo(-160);
306
+ });
307
+
308
+ it('never scrolls the area', async () => {
309
+ const {area, changed, phase} = setUp(
310
+ '<div id="area"><div id="changed"></div><div id="a"></div></div>',
311
+ );
312
+ area.scrollTop = 0;
313
+ placeAt(
314
+ document.getElementById('a') as HTMLElement,
315
+ {before: [0, 0, 400, 40], after: [0, 80, 400, 40]},
316
+ phase,
317
+ );
318
+ const scrollTo = vi.fn();
319
+ area.scrollTo = scrollTo;
320
+ await runChange(
321
+ createAnimatedLayout(() => area),
322
+ changed,
323
+ phase,
324
+ );
325
+ expect(scrollTo).not.toHaveBeenCalled();
326
+ expect(area.scrollTop).toBe(0);
327
+ });
328
+ });
329
+
330
+ describe('one shared motion (spec:AST-105 FR4)', () => {
331
+ async function changeOnce(style = '') {
332
+ const {area, changed, phase} = setUp(
333
+ `<div id="area" style="${style}"><div id="changed"></div><div id="a"></div></div>`,
334
+ );
335
+ placeAt(
336
+ document.getElementById('a') as HTMLElement,
337
+ {before: [0, 0, 400, 40], after: [0, 80, 400, 40]},
338
+ phase,
339
+ );
340
+ await runChange(
341
+ createAnimatedLayout(() => area),
342
+ changed,
343
+ phase,
344
+ );
345
+ }
346
+
347
+ it('plays the changed element and its followers on springs.settle, with one duration', async () => {
348
+ await changeOnce();
349
+ const follower = played.find(p => (p.element as HTMLElement).id === 'a');
350
+ const own = played.find(p => (p.element as HTMLElement).id === 'changed');
351
+ expect(follower).toBeDefined();
352
+ expect(own).toBeDefined();
353
+ expect(own?.options.duration).toBe(follower?.options.duration);
354
+ // SwiftUI's smooth spring (0.5 s, no bounce) settles in about 0.6 s.
355
+ expect(Number(follower?.options.duration)).toBeGreaterThan(400);
356
+ expect(Number(follower?.options.duration)).toBeLessThan(900);
357
+ });
358
+
359
+ it("ignores a scope's --motion-springs-settle: the role is internal", async () => {
360
+ await changeOnce();
361
+ const shared = played.find(p => (p.element as HTMLElement).id === 'a');
362
+ played = [];
363
+ document.body.innerHTML = '';
364
+ await changeOnce('--motion-springs-settle: 0.2s 0');
365
+ const scoped = played.find(p => (p.element as HTMLElement).id === 'a');
366
+ expect(scoped?.options.duration).toBe(shared?.options.duration);
367
+ });
368
+
369
+ it('cross-fades with no travel under Reduce Motion on a coarse pointer', async () => {
370
+ media['(prefers-reduced-motion: reduce)'] = true;
371
+ media['(pointer: coarse)'] = true;
372
+ await changeOnce();
373
+ expect(played).toHaveLength(2);
374
+ for (const entry of played) {
375
+ expect(entry.keyframes[0].translate).toBeUndefined();
376
+ expect(entry.keyframes[0].opacity).toBe(0);
377
+ expect(Number(entry.options.duration)).toBeLessThanOrEqual(200);
378
+ }
379
+ });
380
+
381
+ it('changes at once under Reduce Motion on a fine pointer', async () => {
382
+ media['(prefers-reduced-motion: reduce)'] = true;
383
+ await changeOnce();
384
+ expect(played).toEqual([]);
385
+ });
386
+
387
+ it('retargets an element already gliding: one glide, started from where it is on screen', async () => {
388
+ const {area, changed, phase} = setUp(
389
+ '<div id="area"><div id="changed"></div><div id="a"></div></div>',
390
+ );
391
+ const a = document.getElementById('a') as HTMLElement;
392
+ let top = 0;
393
+ vi.spyOn(a, 'getBoundingClientRect').mockImplementation(
394
+ () => new DOMRect(0, top, 400, 40),
395
+ );
396
+ const layout = createAnimatedLayout(() => area);
397
+ // First change: the row's layout moves 0 -> 80.
398
+ let report = reportLayoutChange(layout, () => changed);
399
+ report.measureBefore();
400
+ top = 80;
401
+ report.animate();
402
+ await flushMicrotasks();
403
+ const first = played.find(p => p.element === a);
404
+ expect(translateOf(first as Played).y).toBeCloseTo(-80);
405
+ // Mid-glide it shows at 50 on screen; the second change moves its layout
406
+ // 80 -> 120.
407
+ played = [];
408
+ phase.current = 'before';
409
+ top = 50;
410
+ report = reportLayoutChange(layout, () => changed);
411
+ report.measureBefore();
412
+ top = 120;
413
+ report.animate();
414
+ await flushMicrotasks();
415
+ expect(first?.cancel).toHaveBeenCalledTimes(1);
416
+ const second = played.filter(p => p.element === a);
417
+ expect(second).toHaveLength(1);
418
+ // From 50 on screen to 120: it starts 70 px above its new place.
419
+ expect(translateOf(second[0]).y).toBeCloseTo(-70);
420
+ // And it keeps the first glide's speed 100 ms in (about 6 px a frame);
421
+ // a new spring from rest moves about 1.4 px in its first frame.
422
+ const next = translateOf({
423
+ ...second[0],
424
+ keyframes: second[0].keyframes.slice(1),
425
+ });
426
+ expect(next.y - -70).toBeGreaterThan(3);
427
+ });
428
+
429
+ it('drops a measurement no commit claims by the next frame', async () => {
430
+ const {area, changed, phase} = setUp(
431
+ '<div id="area"><div id="changed"></div><div id="a"></div></div>',
432
+ );
433
+ const a = document.getElementById('a') as HTMLElement;
434
+ let top = 200;
435
+ vi.spyOn(a, 'getBoundingClientRect').mockImplementation(
436
+ () => new DOMRect(0, top, 400, 40),
437
+ );
438
+ const layout = createAnimatedLayout(() => area);
439
+ // A refused toggle: measured, never committed.
440
+ reportLayoutChange(layout, () => changed).measureBefore();
441
+ await new Promise(resolve => {
442
+ requestAnimationFrame(resolve);
443
+ });
444
+ await new Promise(resolve => {
445
+ requestAnimationFrame(resolve);
446
+ });
447
+ // The area scrolls 150 px; then a real change moves the row 80 px.
448
+ top = 50;
449
+ phase.current = 'before';
450
+ const report = reportLayoutChange(layout, () => changed);
451
+ report.measureBefore();
452
+ top = 130;
453
+ expect(report.animate()).toBe(true);
454
+ await flushMicrotasks();
455
+ const moves = played.filter(p => p.element === a);
456
+ expect(moves).toHaveLength(1);
457
+ expect(translateOf(moves[0]).y).toBeCloseTo(-80);
458
+ });
459
+
460
+ it('reports an unmeasured change, which moves nothing', async () => {
461
+ const {area, changed} = setUp(
462
+ '<div id="area"><div id="changed"></div><div id="a"></div></div>',
463
+ );
464
+ const report = reportLayoutChange(
465
+ createAnimatedLayout(() => area),
466
+ () => changed,
467
+ );
468
+ expect(report.animate()).toBe(false);
469
+ await flushMicrotasks();
470
+ expect(played).toEqual([]);
471
+ });
472
+ });
473
+
474
+ describe('the changed element exits (spec:AST-105 FR4)', () => {
475
+ function exitSetUp() {
476
+ document.body.innerHTML =
477
+ '<div id="area"><div id="content">Details</div><p id="after">Next</p></div>';
478
+ const area = document.getElementById('area') as HTMLElement;
479
+ const content = document.getElementById('content') as HTMLElement;
480
+ vi.spyOn(area, 'getBoundingClientRect').mockReturnValue(
481
+ new DOMRect(0, 0, 400, 600),
482
+ );
483
+ vi.spyOn(content, 'getBoundingClientRect').mockReturnValue(
484
+ new DOMRect(0, 40, 400, 80),
485
+ );
486
+ Object.defineProperty(content, 'offsetHeight', {value: 80});
487
+ // The row after it: 8 px of gap below the 80 px content, which a hidden
488
+ // content gives back too, and its end margin pulls the row up.
489
+ const after = document.getElementById('after') as HTMLElement;
490
+ vi.spyOn(after, 'getBoundingClientRect').mockImplementation(() => {
491
+ if (
492
+ content.style.position === 'absolute' ||
493
+ content.style.display === 'none'
494
+ ) {
495
+ return new DOMRect(0, 40, 400, 20);
496
+ }
497
+ const margin =
498
+ Number.parseFloat(content.style.getPropertyValue('margin-block-end')) ||
499
+ 0;
500
+ return new DOMRect(0, 40 + 80 + 8 + margin, 400, 20);
501
+ });
502
+ const layout = createAnimatedLayout(() => area);
503
+ // The close is measured: only a measured close exits.
504
+ const change = reportLayoutChange(layout, () => content);
505
+ change.measureBefore();
506
+ change.animate();
507
+ return {area, content, after, layout};
508
+ }
509
+
510
+ it('holds nothing for a close no change measured', () => {
511
+ const {area, content} = exitSetUp();
512
+ const unmeasured = createAnimatedLayout(() => area);
513
+ const other = document.createElement('div');
514
+ area.append(other);
515
+ expect(holdLayoutExit(unmeasured, other, vi.fn())).toBe(false);
516
+ expect(other).not.toHaveAttribute('inert');
517
+ expect(content).not.toHaveAttribute('inert');
518
+ });
519
+
520
+ it('puts back an inert and inline values the element had before its exit', () => {
521
+ const {content, layout} = exitSetUp();
522
+ content.setAttribute('inert', '');
523
+ content.style.setProperty('pointer-events', 'auto');
524
+ expect(holdLayoutExit(layout, content, vi.fn())).toBe(true);
525
+ expect(content.style.pointerEvents).toBe('none');
526
+ releaseLayoutExit(content);
527
+ expect(content).toHaveAttribute('inert');
528
+ expect(content.style.pointerEvents).toBe('auto');
529
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('');
530
+ });
531
+
532
+ it('keeps the content where it is while it gives up its space, conceals it on the spring, then hands it back', () => {
533
+ const {content, layout} = exitSetUp();
534
+ const done = vi.fn();
535
+ const written = vi.spyOn(content.style, 'setProperty');
536
+ expect(holdLayoutExit(layout, content, done)).toBe(true);
537
+ // Measured out of flow, never with `display: none` (which would restart
538
+ // the CSS animations inside it).
539
+ expect(
540
+ written.mock.calls.some(([property]) => property === 'display'),
541
+ ).toBe(false);
542
+ expect(content.style.position).toBe('');
543
+ // In flow (it scrolls and clips with its container), taking exactly the
544
+ // space it frees when hidden, gap included; out of reach.
545
+ expect(content.style.position).toBe('');
546
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('-88px');
547
+ expect(content.style.display).toBe('');
548
+ expect(content).toHaveAttribute('inert');
549
+ expect(content.style.pointerEvents).toBe('none');
550
+ const exit = played.find(p => p.element === content);
551
+ expect(exit?.keyframes[0].opacity).toBe(1);
552
+ expect(String(exit?.keyframes.at(-1)?.clipPath)).toBe('inset(0 0 100% 0)');
553
+ expect(exit?.options.fill).toBe('forwards');
554
+ expect(done).not.toHaveBeenCalled();
555
+ exit?.finish?.();
556
+ expect(done).toHaveBeenCalledTimes(1);
557
+ releaseLayoutExit(content);
558
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('');
559
+ expect(content).not.toHaveAttribute('inert');
560
+ expect(content.style.pointerEvents).toBe('');
561
+ });
562
+
563
+ it('guesses, then corrects, where a negative margin would collapse with its end margin', () => {
564
+ const {content, after, layout} = exitSetUp();
565
+ after.style.marginTop = '-4px';
566
+ const reads = vi.mocked(after.getBoundingClientRect);
567
+ reads.mockClear();
568
+ expect(holdLayoutExit(layout, content, vi.fn())).toBe(true);
569
+ expect(reads.mock.calls.length).toBeGreaterThan(2);
570
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('-88px');
571
+ });
572
+
573
+ it('stops an exit when the content opens again', () => {
574
+ const {content, layout} = exitSetUp();
575
+ const done = vi.fn();
576
+ holdLayoutExit(layout, content, done);
577
+ const exit = played.find(p => p.element === content);
578
+ releaseLayoutExit(content);
579
+ expect(exit?.cancel).toHaveBeenCalledTimes(1);
580
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('');
581
+ exit?.finish?.();
582
+ expect(done).not.toHaveBeenCalled();
583
+ });
584
+
585
+ it('lands at once without a handle, and under Reduce Motion with a fine pointer', () => {
586
+ const {content, layout} = exitSetUp();
587
+ expect(holdLayoutExit(null, content, vi.fn())).toBe(false);
588
+ media['(prefers-reduced-motion: reduce)'] = true;
589
+ expect(holdLayoutExit(layout, content, vi.fn())).toBe(false);
590
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('');
591
+ expect(played).toEqual([]);
592
+ });
593
+
594
+ it('lands at once where no end margin frees its space (a grid track)', () => {
595
+ const {area, content, after, layout} = exitSetUp();
596
+ area.style.display = 'grid';
597
+ // The row after it ignores the margin: it moves only when the content
598
+ // is hidden.
599
+ vi.spyOn(after, 'getBoundingClientRect').mockImplementation(
600
+ () =>
601
+ new DOMRect(
602
+ 0,
603
+ content.style.position === 'absolute' ||
604
+ content.style.display === 'none'
605
+ ? 40
606
+ : 128,
607
+ 400,
608
+ 20,
609
+ ),
610
+ );
611
+ expect(holdLayoutExit(layout, content, vi.fn())).toBe(false);
612
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('');
613
+ expect(content).not.toHaveAttribute('inert');
614
+ expect(played).toEqual([]);
615
+ });
616
+
617
+ it("a refused hold keeps the element's own end margin and lets the content after it take its place at once", async () => {
618
+ const {area, content, after, layout} = exitSetUp();
619
+ // A grid track, which no end margin frees.
620
+ area.style.display = 'grid';
621
+ content.style.setProperty('margin-block-end', '12px');
622
+ vi.spyOn(after, 'getBoundingClientRect').mockImplementation(
623
+ () =>
624
+ new DOMRect(
625
+ 0,
626
+ content.style.position === 'absolute' ||
627
+ content.style.display === 'none'
628
+ ? 40
629
+ : 128,
630
+ 400,
631
+ 20,
632
+ ),
633
+ );
634
+ expect(holdLayoutExit(layout, content, vi.fn())).toBe(false);
635
+ expect(content.style.getPropertyValue('margin-block-end')).toBe('12px');
636
+ // The component hides it; the flush glides nothing.
637
+ content.style.display = 'none';
638
+ await flushMicrotasks();
639
+ expect(played).toEqual([]);
640
+ });
641
+
642
+ it('fades under Reduce Motion with a coarse pointer', () => {
643
+ const {content, layout} = exitSetUp();
644
+ media['(prefers-reduced-motion: reduce)'] = true;
645
+ media['(pointer: coarse)'] = true;
646
+ expect(holdLayoutExit(layout, content, vi.fn())).toBe(true);
647
+ const exit = played.find(p => p.element === content);
648
+ expect(exit?.keyframes.map(k => k.opacity)).toEqual([1, 0]);
649
+ expect(exit?.keyframes[0].clipPath).toBeUndefined();
650
+ });
651
+ });
652
+
653
+ describe('two changes in one frame (spec:AST-105 FR3)', () => {
654
+ it('moves a changed element an earlier change displaced with its row, by its total change', async () => {
655
+ document.body.innerHTML =
656
+ '<div id="area"><div id="g1"></div><div id="g2"></div><div id="after"></div></div>';
657
+ const area = document.getElementById('area') as HTMLElement;
658
+ const phase: {current: 'before' | 'after'} = {current: 'before'};
659
+ placeAt(area, {before: [0, 0, 400, 600]}, phase);
660
+ // The second group opens and is pushed down 80 px by the first.
661
+ placeAt(
662
+ document.getElementById('g2') as HTMLElement,
663
+ {before: [0, 0, 400, 40], after: [0, 80, 400, 120]},
664
+ phase,
665
+ );
666
+ const layout = createAnimatedLayout(() => area);
667
+ const one = reportLayoutChange(layout, () => document.getElementById('g1'));
668
+ const two = reportLayoutChange(layout, () => document.getElementById('g2'));
669
+ one.measureBefore();
670
+ two.measureBefore();
671
+ phase.current = 'after';
672
+ one.animate();
673
+ two.animate();
674
+ await flushMicrotasks();
675
+ const moves = played.filter(p => (p.element as HTMLElement).id === 'g2');
676
+ expect(moves).toHaveLength(1);
677
+ expect(translateOf(moves[0]).y).toBeCloseTo(-80);
678
+ });
679
+
680
+ it('does not move an element that was not rendered before the change', async () => {
681
+ document.body.innerHTML =
682
+ '<div id="area"><div id="g1"></div><div id="shown"></div></div>';
683
+ const area = document.getElementById('area') as HTMLElement;
684
+ const phase: {current: 'before' | 'after'} = {current: 'before'};
685
+ placeAt(area, {before: [0, 0, 400, 600]}, phase);
686
+ placeAt(
687
+ document.getElementById('shown') as HTMLElement,
688
+ {before: [0, 0, 0, 0], after: [0, 80, 400, 40]},
689
+ phase,
690
+ );
691
+ const report = reportLayoutChange(
692
+ createAnimatedLayout(() => area),
693
+ () => document.getElementById('g1'),
694
+ );
695
+ report.measureBefore();
696
+ phase.current = 'after';
697
+ report.animate();
698
+ await flushMicrotasks();
699
+ expect(played).toEqual([]);
700
+ });
701
+ });
702
+
703
+ describe('the indicator transition', () => {
704
+ it('takes the spring as a linear() easing with a handle, and clears without one', () => {
705
+ document.body.innerHTML = '<div id="area"><svg id="chevron"></svg></div>';
706
+ const area = document.getElementById('area') as HTMLElement;
707
+ const chevron = document.getElementById(
708
+ 'chevron',
709
+ ) as unknown as SVGSVGElement;
710
+ applyLayoutChangeTransition(
711
+ createAnimatedLayout(() => area),
712
+ chevron,
713
+ );
714
+ expect(
715
+ chevron.style.getPropertyValue('transition-timing-function'),
716
+ ).toMatch(/^linear\(0 0%, .*1 100%\)$/);
717
+ expect(chevron.style.getPropertyValue('transition-duration')).toMatch(
718
+ /^\d+ms$/,
719
+ );
720
+ applyLayoutChangeTransition(null, chevron);
721
+ expect(chevron.style.getPropertyValue('transition-duration')).toBe('');
722
+ });
723
+
724
+ it('is immediate under Reduce Motion', () => {
725
+ media['(prefers-reduced-motion: reduce)'] = true;
726
+ document.body.innerHTML = '<div id="area"><svg id="chevron"></svg></div>';
727
+ const area = document.getElementById('area') as HTMLElement;
728
+ const chevron = document.getElementById(
729
+ 'chevron',
730
+ ) as unknown as SVGSVGElement;
731
+ applyLayoutChangeTransition(
732
+ createAnimatedLayout(() => area),
733
+ chevron,
734
+ );
735
+ expect(chevron.style.getPropertyValue('transition-duration')).toBe('0s');
736
+ });
737
+ });
738
+
739
+ describe('elements the app moves itself (spec:AST-105 Coverage)', () => {
740
+ it('leaves a follower with its own transform or translate to take its place at once', async () => {
741
+ const {area, changed, phase} = setUp(
742
+ `<div id="area"><div id="changed"></div>
743
+ <div id="transformed" style="transform: rotate(2deg)"></div>
744
+ <div id="translated" style="translate: 4px 0"></div>
745
+ <div id="plain"></div></div>`,
746
+ );
747
+ for (const id of ['transformed', 'translated', 'plain']) {
748
+ placeAt(
749
+ document.getElementById(id) as HTMLElement,
750
+ {before: [0, 10, 400, 40], after: [0, 90, 400, 40]},
751
+ phase,
752
+ );
753
+ }
754
+ await runChange(
755
+ createAnimatedLayout(() => area),
756
+ changed,
757
+ phase,
758
+ );
759
+ const moved = played
760
+ .filter(p => p.keyframes[0].translate != null)
761
+ .map(p => (p.element as HTMLElement).id);
762
+ expect(moved).toEqual(['plain']);
763
+ });
764
+
765
+ it('glides a follower whose transform leaves it in place: a swipe row at rest, a resting or pressed button', async () => {
766
+ const {area, changed, phase} = setUp(
767
+ `<div id="area"><div id="changed"></div>
768
+ <div id="swipeRow" style="transform: translate3d(0px, 0px, 0px)"></div>
769
+ <div id="button" style="transform: matrix(1, 0, 0, 1, 0, 0)"></div>
770
+ <div id="pressed" style="transform: scale(0.98)"></div>
771
+ <div id="pressedMatrix" style="transform: matrix(0.98, 0, 0, 0.98, 0, 0)"></div>
772
+ <div id="scaled" style="scale: 0.98"></div>
773
+ <div id="zero" style="translate: 0px; rotate: 0deg"></div>
774
+ <div id="swiped" style="transform: translate3d(-120px, 0px, 0px)"></div>
775
+ <div id="pressedAndMoved" style="transform: matrix(0.98, 0, 0, 0.98, 0, 12)"></div></div>`,
776
+ );
777
+ const ids = [
778
+ 'swipeRow',
779
+ 'button',
780
+ 'pressed',
781
+ 'pressedMatrix',
782
+ 'scaled',
783
+ 'zero',
784
+ 'swiped',
785
+ 'pressedAndMoved',
786
+ ];
787
+ for (const id of ids) {
788
+ placeAt(
789
+ document.getElementById(id) as HTMLElement,
790
+ {before: [0, 10, 400, 40], after: [0, 90, 400, 40]},
791
+ phase,
792
+ );
793
+ }
794
+ await runChange(
795
+ createAnimatedLayout(() => area),
796
+ changed,
797
+ phase,
798
+ );
799
+ const moved = played
800
+ .filter(p => p.keyframes[0].translate != null)
801
+ .map(p => (p.element as HTMLElement).id);
802
+ // A row a swipe holds open, or anything translated, is still the app's.
803
+ expect(moved.sort()).toEqual([
804
+ 'button',
805
+ 'pressed',
806
+ 'pressedMatrix',
807
+ 'scaled',
808
+ 'swipeRow',
809
+ 'zero',
810
+ ]);
811
+ });
812
+
813
+ it('glides a follower whose own transition runs from no transform to a scale (a press starting)', async () => {
814
+ const {area, changed, phase} = setUp(
815
+ `<div id="area"><div id="changed"></div><div id="pressing"></div><div id="sliding"></div></div>`,
816
+ );
817
+ for (const id of ['pressing', 'sliding']) {
818
+ placeAt(
819
+ document.getElementById(id) as HTMLElement,
820
+ {before: [0, 10, 400, 40], after: [0, 90, 400, 40]},
821
+ phase,
822
+ );
823
+ }
824
+ class StubKeyframeEffect {
825
+ constructor(readonly frames: Keyframe[]) {}
826
+ getKeyframes() {
827
+ return this.frames;
828
+ }
829
+ }
830
+ vi.stubGlobal('KeyframeEffect', StubKeyframeEffect);
831
+ const runs = (frames: Keyframe[]) => () =>
832
+ [{effect: new StubKeyframeEffect(frames)}] as unknown as Animation[];
833
+ // A press's transition: from no transform toward a scale, in place.
834
+ (document.getElementById('pressing') as HTMLElement).getAnimations = runs([
835
+ {transform: 'none'},
836
+ {transform: 'matrix(0.98, 0, 0, 0.98, 0, 0)'},
837
+ ]);
838
+ // The app sliding the element itself stays the app's.
839
+ (document.getElementById('sliding') as HTMLElement).getAnimations = runs([
840
+ {transform: 'none'},
841
+ {transform: 'translateX(120px)'},
842
+ ]);
843
+ try {
844
+ await runChange(
845
+ createAnimatedLayout(() => area),
846
+ changed,
847
+ phase,
848
+ );
849
+ } finally {
850
+ vi.unstubAllGlobals();
851
+ }
852
+ const moved = played
853
+ .filter(p => p.keyframes[0].translate != null)
854
+ .map(p => (p.element as HTMLElement).id);
855
+ expect(moved).toEqual(['pressing']);
856
+ });
857
+
858
+ it('leaves a follower whose own keyframes hold an unresolved var() to the app: its value is unknown', async () => {
859
+ const {area, changed, phase} = setUp(
860
+ `<div id="area"><div id="changed"></div><div id="slide"></div><div id="slideY"></div><div id="spin"></div><div id="grow"></div></div>`,
861
+ );
862
+ for (const id of ['slide', 'slideY', 'spin', 'grow']) {
863
+ placeAt(
864
+ document.getElementById(id) as HTMLElement,
865
+ {before: [0, 10, 400, 40], after: [0, 90, 400, 40]},
866
+ phase,
867
+ );
868
+ }
869
+ class StubKeyframeEffect {
870
+ constructor(readonly frames: Keyframe[]) {}
871
+ getKeyframes() {
872
+ return this.frames;
873
+ }
874
+ }
875
+ vi.stubGlobal('KeyframeEffect', StubKeyframeEffect);
876
+ const runs = (id: string, frames: Keyframe[]) => {
877
+ (document.getElementById(id) as HTMLElement).getAnimations = () =>
878
+ [{effect: new StubKeyframeEffect(frames)}] as unknown as Animation[];
879
+ };
880
+ // An app's own slide-ins and spin, from values a custom property holds.
881
+ runs('slide', [{translate: 'var(--from)'}, {translate: '0px'}]);
882
+ runs('slideY', [
883
+ {transform: 'translateY(var(--from))'},
884
+ {transform: 'none'},
885
+ ]);
886
+ runs('spin', [{transform: 'rotate(var(--angle))'}, {transform: 'none'}]);
887
+ // A scale stays in place whatever its value.
888
+ runs('grow', [{scale: 'var(--from)'}, {scale: '1'}]);
889
+ try {
890
+ await runChange(
891
+ createAnimatedLayout(() => area),
892
+ changed,
893
+ phase,
894
+ );
895
+ } finally {
896
+ vi.unstubAllGlobals();
897
+ }
898
+ const moved = played
899
+ .filter(p => p.keyframes[0].translate != null)
900
+ .map(p => (p.element as HTMLElement).id);
901
+ expect(moved).toEqual(['grow']);
902
+ });
903
+ });
904
+
905
+ describe('siblings before the change (spec:AST-105 FR3, Coverage)', () => {
906
+ it('moves an earlier sibling a centered row shifts when a later item grows', async () => {
907
+ const {area, changed, phase} = setUp(
908
+ '<div id="area"><div id="row"><div id="first"></div><div id="changed"></div></div></div>',
909
+ );
910
+ // A centered row: the item before the growing one moves left by half.
911
+ placeAt(
912
+ document.getElementById('first') as HTMLElement,
913
+ {before: [160, 0, 40, 24], after: [120, 0, 40, 24]},
914
+ phase,
915
+ );
916
+ await runChange(
917
+ createAnimatedLayout(() => area),
918
+ changed,
919
+ phase,
920
+ );
921
+ const moves = played.filter(
922
+ p =>
923
+ (p.element as HTMLElement).id === 'first' &&
924
+ p.keyframes[0].translate != null,
925
+ );
926
+ expect(moves).toHaveLength(1);
927
+ expect(translateOf(moves[0]).x).toBeCloseTo(40);
928
+ });
929
+
930
+ it('leaves an earlier sibling whose rectangle did not change', async () => {
931
+ const {area, changed, phase} = setUp(
932
+ '<div id="area"><div id="first"></div><div id="changed"></div></div>',
933
+ );
934
+ placeAt(
935
+ document.getElementById('first') as HTMLElement,
936
+ {before: [0, 0, 400, 40]},
937
+ phase,
938
+ );
939
+ await runChange(
940
+ createAnimatedLayout(() => area),
941
+ changed,
942
+ phase,
943
+ );
944
+ expect(
945
+ played.filter(p => (p.element as HTMLElement).id === 'first'),
946
+ ).toEqual([]);
947
+ });
948
+ });
949
+
950
+ describe('the walk stops at the band a change can bring into view', () => {
951
+ it('reads no sibling past the band, after or before the change', async () => {
952
+ // A 600 px area: the band runs a viewport above and below it.
953
+ const rows = Array.from({length: 40}, (_, i) => `<div id="r${i}"></div>`);
954
+ const {area, changed, phase} = setUp(
955
+ `<div id="area">${rows.slice(0, 20).join('')}<div id="changed"></div>${rows.slice(20).join('')}</div>`,
956
+ );
957
+ const reads = new Map<string, number>();
958
+ rows.forEach((_, i) => {
959
+ const row = document.getElementById(`r${i}`) as HTMLElement;
960
+ // Rows 100 px apart, the changed element between rows 19 and 20 at
961
+ // 1000 px: 20 rows above it reach -1000 px, 20 below reach 3000 px.
962
+ const top = i < 20 ? (i - 20) * 100 + 1000 : (i - 20) * 100 + 1100;
963
+ vi.spyOn(row, 'getBoundingClientRect').mockImplementation(() => {
964
+ reads.set(row.id, (reads.get(row.id) ?? 0) + 1);
965
+ const shift = phase.current === 'after' && i >= 20 ? 80 : 0;
966
+ return new DOMRect(0, top - 1000 + shift, 400, 100);
967
+ });
968
+ });
969
+ await runChange(
970
+ createAnimatedLayout(() => area),
971
+ changed,
972
+ phase,
973
+ );
974
+ // The band is -600..1200 px: rows past it are never read.
975
+ expect(reads.get('r39')).toBeUndefined();
976
+ expect(reads.get('r0')).toBeUndefined();
977
+ expect(reads.get('r20')).toBeGreaterThan(0);
978
+ expect(reads.get('r19')).toBeGreaterThan(0);
979
+ });
980
+ });
981
+
982
+ describe('the walk reaches what the changes can move (spec:AST-105 FR3)', () => {
983
+ it("glides the change's ancestor that a centered column moves, and the content inside it moves only with it", async () => {
984
+ const {area, changed, phase} = setUp(
985
+ '<div id="area"><div id="column"><div id="above"></div><div id="card"><div id="title"></div><div id="changed"></div></div></div></div>',
986
+ );
987
+ // The column centers its content: opening the change moves the card and
988
+ // the content above it up by half the growth.
989
+ placeAt(
990
+ document.getElementById('above') as HTMLElement,
991
+ {before: [0, 100, 400, 40], after: [0, 60, 400, 40]},
992
+ phase,
993
+ );
994
+ placeAt(
995
+ document.getElementById('card') as HTMLElement,
996
+ {before: [0, 140, 400, 60], after: [0, 100, 400, 140]},
997
+ phase,
998
+ );
999
+ placeAt(
1000
+ document.getElementById('title') as HTMLElement,
1001
+ {before: [0, 140, 400, 20], after: [0, 100, 400, 20]},
1002
+ phase,
1003
+ );
1004
+ await runChange(
1005
+ createAnimatedLayout(() => area),
1006
+ changed,
1007
+ phase,
1008
+ );
1009
+ const glides = new Map(
1010
+ played
1011
+ .filter(p => p.keyframes[0].translate != null)
1012
+ .map(p => [(p.element as HTMLElement).id, translateOf(p).y]),
1013
+ );
1014
+ expect(glides.get('card')).toBeCloseTo(40);
1015
+ expect(glides.get('above')).toBeCloseTo(40);
1016
+ // The title rides with its card: it moved by nothing of its own.
1017
+ expect(glides.has('title')).toBe(false);
1018
+ });
1019
+
1020
+ it('reaches the band that all the changes in one frame can pull into view', () => {
1021
+ const rows = Array.from({length: 30}, (_, i) => `<div id="r${i}"></div>`);
1022
+ document.body.innerHTML = `<div id="area"><div id="a"></div><div id="b"></div>${rows.join('')}</div>`;
1023
+ const area = document.getElementById('area') as HTMLElement;
1024
+ vi.spyOn(area, 'getBoundingClientRect').mockReturnValue(
1025
+ new DOMRect(0, 0, 400, 560),
1026
+ );
1027
+ // Two 500 px groups closing at once: the rows below them come up 1,000 px.
1028
+ for (const [id, y] of [
1029
+ ['a', 0],
1030
+ ['b', 500],
1031
+ ] as const) {
1032
+ vi.spyOn(
1033
+ document.getElementById(id) as HTMLElement,
1034
+ 'getBoundingClientRect',
1035
+ ).mockReturnValue(new DOMRect(0, y, 400, 500));
1036
+ }
1037
+ const reads = new Set<string>();
1038
+ rows.forEach((_, i) => {
1039
+ const row = document.getElementById(`r${i}`) as HTMLElement;
1040
+ vi.spyOn(row, 'getBoundingClientRect').mockImplementation(() => {
1041
+ reads.add(row.id);
1042
+ return new DOMRect(0, 1000 + i * 100, 400, 100);
1043
+ });
1044
+ });
1045
+ const layout = createAnimatedLayout(() => area);
1046
+ reportLayoutChange(layout, () =>
1047
+ document.getElementById('a'),
1048
+ ).measureBefore();
1049
+ reportLayoutChange(layout, () =>
1050
+ document.getElementById('b'),
1051
+ ).measureBefore();
1052
+ // One group's band ends at 560 + 560; both together reach 560 + 1,000.
1053
+ expect(reads.has('r5')).toBe(true);
1054
+ expect(reads.has('r20')).toBe(false);
1055
+ });
1056
+
1057
+ it('reads each element once however many changes report in one frame', () => {
1058
+ const rows = Array.from({length: 200}, (_, i) => `<div id="r${i}"></div>`);
1059
+ document.body.innerHTML = `<div id="area">${rows.join('')}</div>`;
1060
+ const area = document.getElementById('area') as HTMLElement;
1061
+ vi.spyOn(area, 'getBoundingClientRect').mockReturnValue(
1062
+ new DOMRect(0, 0, 400, 6000),
1063
+ );
1064
+ let reads = 0;
1065
+ rows.forEach((_, i) => {
1066
+ vi.spyOn(
1067
+ document.getElementById(`r${i}`) as HTMLElement,
1068
+ 'getBoundingClientRect',
1069
+ ).mockImplementation(() => {
1070
+ reads += 1;
1071
+ return new DOMRect(0, i * 30, 400, 30);
1072
+ });
1073
+ });
1074
+ const layout = createAnimatedLayout(() => area);
1075
+ // A tree collapsing 100 rows in one update reports 100 changes.
1076
+ for (let i = 0; i < 100; i += 1) {
1077
+ reportLayoutChange(layout, () =>
1078
+ document.getElementById(`r${i}`),
1079
+ ).measureBefore();
1080
+ }
1081
+ expect(reads).toBeLessThanOrEqual(rows.length);
1082
+ });
1083
+
1084
+ it('walks no further than the first sibling outside the band from a change outside it', () => {
1085
+ const rows = Array.from({length: 1000}, (_, i) => `<div id="r${i}"></div>`);
1086
+ document.body.innerHTML = `<div id="area">${rows.join('')}</div>`;
1087
+ const area = document.getElementById('area') as HTMLElement;
1088
+ vi.spyOn(area, 'getBoundingClientRect').mockReturnValue(
1089
+ new DOMRect(0, 0, 400, 600),
1090
+ );
1091
+ const reads = new Set<string>();
1092
+ rows.forEach((_, i) => {
1093
+ const row = document.getElementById(`r${i}`) as HTMLElement;
1094
+ vi.spyOn(row, 'getBoundingClientRect').mockImplementation(() => {
1095
+ reads.add(row.id);
1096
+ return new DOMRect(0, i * 100, 400, 100);
1097
+ });
1098
+ });
1099
+ reportLayoutChange(
1100
+ createAnimatedLayout(() => area),
1101
+ () => document.getElementById('r900'),
1102
+ ).measureBefore();
1103
+ // The change itself, and one sibling on each side, which lie outside.
1104
+ expect(reads.size).toBeLessThanOrEqual(3);
1105
+ });
1106
+
1107
+ it('stops inside a display: contents wrapper at the band too', () => {
1108
+ const rows = Array.from({length: 40}, (_, i) => `<div id="c${i}"></div>`);
1109
+ const {area, changed} = setUp(
1110
+ `<div id="area"><div id="changed"></div><div style="display: contents">${rows.join('')}</div></div>`,
1111
+ );
1112
+ void area;
1113
+ const reads = new Set<string>();
1114
+ rows.forEach((_, i) => {
1115
+ const row = document.getElementById(`c${i}`) as HTMLElement;
1116
+ vi.spyOn(row, 'getBoundingClientRect').mockImplementation(() => {
1117
+ reads.add(row.id);
1118
+ return new DOMRect(0, i * 100, 400, 100);
1119
+ });
1120
+ });
1121
+ reportLayoutChange(
1122
+ createAnimatedLayout(() => area),
1123
+ () => changed,
1124
+ ).measureBefore();
1125
+ // The band ends a viewport below the 600 px area.
1126
+ expect(reads.has('c12')).toBe(true);
1127
+ expect(reads.has('c30')).toBe(false);
1128
+ });
1129
+
1130
+ it('moves an earlier sibling that order places after the change, near the visible part', async () => {
1131
+ const {area, changed, phase} = setUp(
1132
+ '<div id="area"><div id="ordered" style="order: 1"></div><div id="changed"></div></div>',
1133
+ );
1134
+ // First in the DOM, laid out after the change: it moves down when the
1135
+ // change grows.
1136
+ placeAt(
1137
+ document.getElementById('ordered') as HTMLElement,
1138
+ {before: [0, 0, 400, 40], after: [0, 80, 400, 40]},
1139
+ phase,
1140
+ );
1141
+ await runChange(
1142
+ createAnimatedLayout(() => area),
1143
+ changed,
1144
+ phase,
1145
+ );
1146
+ const glide = played.find(
1147
+ p =>
1148
+ (p.element as HTMLElement).id === 'ordered' &&
1149
+ p.keyframes[0].translate != null,
1150
+ );
1151
+ expect(glide).toBeDefined();
1152
+ expect(translateOf(glide!).y).toBeCloseTo(-80);
1153
+ });
1154
+ });