@astryxdesign/core 0.7.4 → 0.7.5-canary.0418c47

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 (1568) hide show
  1. package/README.md +12 -9
  2. package/dist/AlertDialog/AlertDialog.d.ts +2 -2
  3. package/dist/AlertDialog/AlertDialog.js +1 -1
  4. package/dist/AlertDialog/index.d.ts +4 -4
  5. package/dist/AlertDialog/useImperativeAlertDialog.d.ts +1 -1
  6. package/dist/AppShell/AppShell.d.ts +4 -4
  7. package/dist/AppShell/index.d.ts +4 -4
  8. package/dist/AspectRatio/AspectRatio.d.ts +1 -1
  9. package/dist/AspectRatio/index.d.ts +2 -2
  10. package/dist/Avatar/Avatar.d.ts +2 -2
  11. package/dist/Avatar/AvatarStatusDot.d.ts +2 -2
  12. package/dist/Avatar/AvatarStatusDot.js +2 -2
  13. package/dist/Avatar/index.d.ts +4 -4
  14. package/dist/AvatarGroup/AvatarGroup.d.ts +2 -2
  15. package/dist/AvatarGroup/AvatarGroupContext.d.ts +1 -1
  16. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
  17. package/dist/AvatarGroup/index.d.ts +6 -6
  18. package/dist/Badge/Badge.d.ts +2 -2
  19. package/dist/Badge/Badge.d.ts.map +1 -1
  20. package/dist/Badge/Badge.js +18 -2
  21. package/dist/Badge/index.d.ts +2 -2
  22. package/dist/Banner/Banner.d.ts +5 -4
  23. package/dist/Banner/Banner.d.ts.map +1 -1
  24. package/dist/Banner/Banner.js +64 -9
  25. package/dist/Banner/index.d.ts +2 -2
  26. package/dist/Blockquote/Blockquote.d.ts +1 -1
  27. package/dist/Blockquote/index.d.ts +2 -2
  28. package/dist/BottomSheet/BottomSheet.d.ts +58 -10
  29. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  30. package/dist/BottomSheet/BottomSheet.js +435 -198
  31. package/dist/BottomSheet/BottomSheetHostContext.d.ts +8 -0
  32. package/dist/BottomSheet/BottomSheetHostContext.d.ts.map +1 -0
  33. package/dist/BottomSheet/BottomSheetHostContext.js +35 -0
  34. package/dist/BottomSheet/BottomSheetPanel.d.ts +12 -4
  35. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  36. package/dist/BottomSheet/BottomSheetPanel.js +76 -22
  37. package/dist/BottomSheet/BottomSheetSwitcher.d.ts +54 -15
  38. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  39. package/dist/BottomSheet/BottomSheetSwitcher.js +229 -27
  40. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts +8 -2
  41. package/dist/BottomSheet/BottomSheetSwitcherContext.d.ts.map +1 -1
  42. package/dist/BottomSheet/bottomSheetEscape.d.ts +3 -0
  43. package/dist/BottomSheet/bottomSheetEscape.d.ts.map +1 -0
  44. package/dist/BottomSheet/bottomSheetEscape.js +20 -0
  45. package/dist/BottomSheet/bottomSheetStack.d.ts +262 -0
  46. package/dist/BottomSheet/bottomSheetStack.d.ts.map +1 -0
  47. package/dist/BottomSheet/bottomSheetStack.js +1652 -0
  48. package/dist/BottomSheet/index.d.ts +4 -4
  49. package/dist/BottomSheet/useSheetGestures.d.ts +19 -3
  50. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  51. package/dist/BottomSheet/useSheetGestures.js +43 -14
  52. package/dist/Breadcrumbs/BreadcrumbItem.d.ts +4 -4
  53. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  54. package/dist/Breadcrumbs/BreadcrumbItem.js +5 -0
  55. package/dist/Breadcrumbs/Breadcrumbs.d.ts +2 -2
  56. package/dist/Breadcrumbs/index.d.ts +12 -12
  57. package/dist/Button/Button.d.ts +4 -4
  58. package/dist/Button/Button.d.ts.map +1 -1
  59. package/dist/Button/Button.js +18 -7
  60. package/dist/Button/index.d.ts +2 -2
  61. package/dist/ButtonGroup/ButtonGroup.d.ts +4 -4
  62. package/dist/ButtonGroup/index.d.ts +4 -4
  63. package/dist/Calendar/Calendar.d.ts +3 -3
  64. package/dist/Calendar/dayCellUtils.d.ts +1 -1
  65. package/dist/Calendar/getInitialFocusDate.d.ts +2 -2
  66. package/dist/Calendar/getStandaloneShortWeekdayNames.d.ts +1 -1
  67. package/dist/Calendar/hooks/index.d.ts +6 -6
  68. package/dist/Calendar/hooks/useCalendarConstraints.d.ts +2 -2
  69. package/dist/Calendar/hooks/useCalendarDays.d.ts +2 -2
  70. package/dist/Calendar/hooks/useCalendarNavigation.d.ts +2 -2
  71. package/dist/Calendar/index.d.ts +5 -5
  72. package/dist/Calendar/utils.d.ts +1 -1
  73. package/dist/Card/Card.d.ts +4 -4
  74. package/dist/Card/index.d.ts +2 -2
  75. package/dist/Carousel/Carousel.d.ts +2 -2
  76. package/dist/Carousel/index.d.ts +2 -2
  77. package/dist/Center/Center.d.ts +2 -2
  78. package/dist/Center/index.d.ts +2 -2
  79. package/dist/Chat/ChatComposer.d.ts +1 -1
  80. package/dist/Chat/ChatComposer.d.ts.map +1 -1
  81. package/dist/Chat/ChatComposer.js +25 -32
  82. package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
  83. package/dist/Chat/ChatComposerInput.d.ts +4 -4
  84. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  85. package/dist/Chat/ChatComposerInput.js +55 -16
  86. package/dist/Chat/ChatDictationButton.d.ts +2 -2
  87. package/dist/Chat/ChatLayout.d.ts +1 -1
  88. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  89. package/dist/Chat/ChatMessage.d.ts +2 -2
  90. package/dist/Chat/ChatMessageBubble.d.ts +2 -2
  91. package/dist/Chat/ChatMessageList.d.ts +3 -3
  92. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  93. package/dist/Chat/ChatMessageMetadata.js +2 -2
  94. package/dist/Chat/ChatPastedTextToken.d.ts.map +1 -1
  95. package/dist/Chat/ChatPastedTextToken.js +7 -6
  96. package/dist/Chat/ChatSendButton.d.ts +1 -1
  97. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  98. package/dist/Chat/ChatTokenizedText.d.ts +2 -2
  99. package/dist/Chat/ChatToolCalls.d.ts +1 -1
  100. package/dist/Chat/ChatToolCalls.js +4 -4
  101. package/dist/Chat/index.d.ts +43 -43
  102. package/dist/Chat/useChatComposerTokens.d.ts +1 -1
  103. package/dist/Chat/useChatDictation.d.ts +1 -1
  104. package/dist/Chat/useChatPasteAsToken.d.ts +1 -1
  105. package/dist/Chat/useTriggerMenu.d.ts +2 -2
  106. package/dist/CheckboxInput/CheckboxInput.d.ts +4 -4
  107. package/dist/CheckboxInput/index.d.ts +2 -2
  108. package/dist/CheckboxList/CheckboxList.d.ts +4 -4
  109. package/dist/CheckboxList/CheckboxListItem.d.ts +2 -2
  110. package/dist/CheckboxList/index.d.ts +4 -4
  111. package/dist/Citation/Citation.d.ts +1 -1
  112. package/dist/Citation/index.d.ts +2 -2
  113. package/dist/ClickableCard/ClickableCard.d.ts +3 -3
  114. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  115. package/dist/ClickableCard/ClickableCard.js +10 -6
  116. package/dist/ClickableCard/index.d.ts +2 -2
  117. package/dist/Code/Code.d.ts +1 -1
  118. package/dist/Code/index.d.ts +1 -1
  119. package/dist/CodeBlock/CodeBlock.d.ts +27 -4
  120. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  121. package/dist/CodeBlock/CodeBlock.js +58 -19
  122. package/dist/CodeBlock/grammar.d.ts +134 -0
  123. package/dist/CodeBlock/grammar.d.ts.map +1 -0
  124. package/dist/CodeBlock/grammar.js +219 -0
  125. package/dist/CodeBlock/highlightRanges.d.ts +1 -1
  126. package/dist/CodeBlock/index.d.ts +10 -8
  127. package/dist/CodeBlock/index.d.ts.map +1 -1
  128. package/dist/CodeBlock/index.js +1 -0
  129. package/dist/CodeBlock/languages/dockerfile.d.ts +3 -0
  130. package/dist/CodeBlock/languages/dockerfile.d.ts.map +1 -0
  131. package/dist/CodeBlock/languages/dockerfile.js +45 -0
  132. package/dist/CodeBlock/languages/graphql.d.ts +3 -0
  133. package/dist/CodeBlock/languages/graphql.d.ts.map +1 -0
  134. package/dist/CodeBlock/languages/graphql.js +27 -0
  135. package/dist/CodeBlock/languages/java.d.ts +3 -0
  136. package/dist/CodeBlock/languages/java.d.ts.map +1 -0
  137. package/dist/CodeBlock/languages/java.js +24 -0
  138. package/dist/CodeBlock/languages/lua.d.ts +3 -0
  139. package/dist/CodeBlock/languages/lua.d.ts.map +1 -0
  140. package/dist/CodeBlock/languages/lua.js +21 -0
  141. package/dist/CodeBlock/languages/objective-c.d.ts +3 -0
  142. package/dist/CodeBlock/languages/objective-c.d.ts.map +1 -0
  143. package/dist/CodeBlock/languages/objective-c.js +27 -0
  144. package/dist/CodeBlock/languages/powershell.d.ts +3 -0
  145. package/dist/CodeBlock/languages/powershell.d.ts.map +1 -0
  146. package/dist/CodeBlock/languages/powershell.js +30 -0
  147. package/dist/CodeBlock/languages/ruby.d.ts +3 -0
  148. package/dist/CodeBlock/languages/ruby.d.ts.map +1 -0
  149. package/dist/CodeBlock/languages/ruby.js +24 -0
  150. package/dist/CodeBlock/languages/thrift.d.ts +3 -0
  151. package/dist/CodeBlock/languages/thrift.d.ts.map +1 -0
  152. package/dist/CodeBlock/languages/thrift.js +18 -0
  153. package/dist/CodeBlock/languages/toml.d.ts +3 -0
  154. package/dist/CodeBlock/languages/toml.d.ts.map +1 -0
  155. package/dist/CodeBlock/languages/toml.js +53 -0
  156. package/dist/CodeBlock/tokenizer.d.ts +8 -4
  157. package/dist/CodeBlock/tokenizer.d.ts.map +1 -1
  158. package/dist/CodeBlock/tokenizer.js +158 -8
  159. package/dist/Collapsible/Collapsible.d.ts +10 -3
  160. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  161. package/dist/Collapsible/Collapsible.js +84 -2
  162. package/dist/Collapsible/CollapsibleGroup.d.ts +2 -2
  163. package/dist/Collapsible/index.d.ts +7 -7
  164. package/dist/CommandPalette/CommandPalette.d.ts +2 -2
  165. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  166. package/dist/CommandPalette/CommandPalette.js +15 -1
  167. package/dist/CommandPalette/CommandPaletteContext.d.ts +1 -1
  168. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  169. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  170. package/dist/CommandPalette/CommandPaletteEmpty.js +1 -0
  171. package/dist/CommandPalette/CommandPaletteFooter.d.ts +1 -1
  172. package/dist/CommandPalette/CommandPaletteGroup.d.ts +1 -1
  173. package/dist/CommandPalette/CommandPaletteInput.d.ts +1 -1
  174. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  175. package/dist/CommandPalette/CommandPaletteInput.js +14 -2
  176. package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
  177. package/dist/CommandPalette/CommandPaletteList.d.ts +1 -1
  178. package/dist/CommandPalette/busyStartSettle.d.ts +4 -0
  179. package/dist/CommandPalette/busyStartSettle.d.ts.map +1 -0
  180. package/dist/CommandPalette/busyStartSettle.js +23 -0
  181. package/dist/CommandPalette/index.d.ts +16 -16
  182. package/dist/ComplexSelector/ComplexSelector.d.ts +25 -7
  183. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  184. package/dist/ComplexSelector/ComplexSelector.js +42 -7
  185. package/dist/ComplexSelector/index.d.ts +1 -1
  186. package/dist/ContextMenu/ContextMenu.d.ts +4 -4
  187. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  188. package/dist/ContextMenu/ContextMenu.js +48 -13
  189. package/dist/ContextMenu/index.d.ts +9 -9
  190. package/dist/DateInput/DateInput.d.ts +7 -7
  191. package/dist/DateInput/DateInput.d.ts.map +1 -1
  192. package/dist/DateInput/DateInput.js +12 -5
  193. package/dist/DateInput/MonthScroller.d.ts +1 -1
  194. package/dist/DateInput/NativeDateField.d.ts +1 -1
  195. package/dist/DateInput/NativeDateField.d.ts.map +1 -1
  196. package/dist/DateInput/NativeDateField.js +2 -1
  197. package/dist/DateInput/TouchDateField.d.ts +1 -1
  198. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  199. package/dist/DateInput/TouchDateField.js +2 -1
  200. package/dist/DateInput/Wheel.d.ts.map +1 -1
  201. package/dist/DateInput/Wheel.js +1 -1
  202. package/dist/DateInput/index.d.ts +2 -2
  203. package/dist/DateInput/monthGeometry.d.ts +1 -1
  204. package/dist/DateRangeInput/DateRangeInput.d.ts +6 -6
  205. package/dist/DateRangeInput/index.d.ts +2 -2
  206. package/dist/DateTimeInput/DateTimeInput.d.ts +6 -6
  207. package/dist/DateTimeInput/NativeDateSegment.d.ts +3 -3
  208. package/dist/DateTimeInput/NativeTimeSegment.d.ts +4 -4
  209. package/dist/DateTimeInput/TouchDateTimeField.d.ts +1 -1
  210. package/dist/DateTimeInput/index.d.ts +2 -2
  211. package/dist/Dialog/Dialog.d.ts +7 -3
  212. package/dist/Dialog/Dialog.d.ts.map +1 -1
  213. package/dist/Dialog/Dialog.js +20 -8
  214. package/dist/Dialog/DialogHeader.d.ts +1 -1
  215. package/dist/Dialog/index.d.ts +6 -6
  216. package/dist/Dialog/useImperativeDialog.d.ts +1 -1
  217. package/dist/Divider/Divider.d.ts +2 -2
  218. package/dist/Divider/index.d.ts +2 -2
  219. package/dist/Drawer/Drawer.d.ts +3 -3
  220. package/dist/Drawer/Drawer.d.ts.map +1 -1
  221. package/dist/Drawer/Drawer.js +18 -13
  222. package/dist/Drawer/DrawerHeader.d.ts +1 -1
  223. package/dist/Drawer/index.d.ts +4 -4
  224. package/dist/DropdownMenu/DropdownMenu.d.ts +5 -5
  225. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  226. package/dist/DropdownMenu/DropdownMenu.js +32 -20
  227. package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +2 -2
  228. package/dist/DropdownMenu/DropdownMenuDivider.d.ts +1 -1
  229. package/dist/DropdownMenu/DropdownMenuGroup.d.ts +1 -1
  230. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -2
  231. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  232. package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
  233. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +12 -7
  234. package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
  235. package/dist/DropdownMenu/DropdownMenuRadioItem.js +13 -5
  236. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +8 -8
  237. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  238. package/dist/DropdownMenu/DropdownMenuSubMenu.js +0 -3
  239. package/dist/DropdownMenu/MenuBottomSheet.d.ts +11 -4
  240. package/dist/DropdownMenu/MenuBottomSheet.d.ts.map +1 -1
  241. package/dist/DropdownMenu/MenuBottomSheet.js +35 -9
  242. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts +1 -1
  243. package/dist/DropdownMenu/MenuBottomSheetActionList.js +3 -3
  244. package/dist/DropdownMenu/index.d.ts +10 -10
  245. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +4 -2
  246. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  247. package/dist/DropdownMenu/lazyMenuBottomSheet.js +25 -3
  248. package/dist/DropdownMenu/menuBottomSheet.stylex.d.ts +23 -0
  249. package/dist/DropdownMenu/menuBottomSheet.stylex.d.ts.map +1 -0
  250. package/dist/DropdownMenu/menuBottomSheet.stylex.js +29 -0
  251. package/dist/DropdownMenu/menuItemHover.d.ts +3 -0
  252. package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -1
  253. package/dist/DropdownMenu/menuItemHover.js +14 -1
  254. package/dist/DropdownMenu/renderDropdownItems.d.ts +1 -1
  255. package/dist/DropdownMenu/useMenuDrillIn.d.ts +1 -1
  256. package/dist/DropdownMenu/useMenuDrillIn.d.ts.map +1 -1
  257. package/dist/DropdownMenu/useMenuDrillIn.js +7 -5
  258. package/dist/EmptyState/EmptyState.d.ts +5 -3
  259. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  260. package/dist/EmptyState/EmptyState.js +6 -4
  261. package/dist/EmptyState/index.d.ts +2 -2
  262. package/dist/Field/Field.d.ts +5 -5
  263. package/dist/Field/Field.js +1 -1
  264. package/dist/Field/FieldLabel.d.ts +2 -2
  265. package/dist/Field/FieldLabel.js +1 -1
  266. package/dist/Field/PanelSearchInput.d.ts +10 -2
  267. package/dist/Field/PanelSearchInput.d.ts.map +1 -1
  268. package/dist/Field/PanelSearchInput.js +31 -22
  269. package/dist/Field/fieldInputFamily.testing.d.ts +1 -1
  270. package/dist/Field/fieldParts.d.ts +1 -1
  271. package/dist/Field/index.d.ts +10 -10
  272. package/dist/Field/inputDisabledFocus.d.ts +14 -0
  273. package/dist/Field/inputDisabledFocus.d.ts.map +1 -0
  274. package/dist/Field/inputDisabledFocus.js +19 -0
  275. package/dist/Field/inputStyles.stylex.d.ts +9 -9
  276. package/dist/Field/inputStyles.stylex.js +9 -9
  277. package/dist/FieldStatus/FieldStatus.d.ts +3 -3
  278. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  279. package/dist/FieldStatus/FieldStatus.js +7 -3
  280. package/dist/FieldStatus/index.d.ts +2 -2
  281. package/dist/FieldStatus/useFieldStatusAnnouncement.d.ts +1 -1
  282. package/dist/FileInput/FileInput.d.ts +4 -4
  283. package/dist/FileInput/FileInput.d.ts.map +1 -1
  284. package/dist/FileInput/FileInput.js +15 -9
  285. package/dist/FileInput/index.d.ts +2 -2
  286. package/dist/FormLayout/FormLayout.d.ts +2 -2
  287. package/dist/FormLayout/index.d.ts +4 -4
  288. package/dist/Grid/Grid.d.ts +3 -3
  289. package/dist/Grid/GridSpan.d.ts +1 -1
  290. package/dist/Grid/index.d.ts +4 -4
  291. package/dist/HStack/HStack.d.ts +2 -2
  292. package/dist/HStack/index.d.ts +1 -1
  293. package/dist/Heading/Heading.d.ts +4 -4
  294. package/dist/Heading/index.d.ts +1 -1
  295. package/dist/HoverCard/HoverCard.d.ts +4 -4
  296. package/dist/HoverCard/index.d.ts +4 -4
  297. package/dist/HoverCard/useHoverCard.d.ts +2 -2
  298. package/dist/Icon/Icon.d.ts +18 -6
  299. package/dist/Icon/Icon.d.ts.map +1 -1
  300. package/dist/Icon/Icon.js +55 -9
  301. package/dist/Icon/IconDefaultSizeContext.d.ts +1 -1
  302. package/dist/Icon/IconSize.stylex.d.ts +16 -11
  303. package/dist/Icon/IconSize.stylex.d.ts.map +1 -1
  304. package/dist/Icon/IconSize.stylex.js +27 -11
  305. package/dist/Icon/defaultIcons.d.ts +1 -1
  306. package/dist/Icon/globalIconRegistry.d.ts +69 -5
  307. package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
  308. package/dist/Icon/globalIconRegistry.js +108 -24
  309. package/dist/Icon/index.d.ts +30 -6
  310. package/dist/Icon/index.d.ts.map +1 -1
  311. package/dist/Icon/index.js +24 -1
  312. package/dist/Icon/useIcon.d.ts +6 -2
  313. package/dist/Icon/useIcon.d.ts.map +1 -1
  314. package/dist/Icon/useIcon.js +5 -1
  315. package/dist/IconButton/IconButton.d.ts +1 -1
  316. package/dist/IconButton/index.d.ts +2 -2
  317. package/dist/Indicator/CheckIndicator.d.ts +1 -1
  318. package/dist/Indicator/CheckboxIndicator.d.ts +1 -1
  319. package/dist/Indicator/RadioIndicator.d.ts +1 -1
  320. package/dist/Indicator/index.d.ts +8 -8
  321. package/dist/Indicator/indicatorRegistry.d.ts +2 -2
  322. package/dist/Indicator/types.d.ts +1 -1
  323. package/dist/Indicator/useIndicator.d.ts +2 -2
  324. package/dist/InputGroup/InputGroup.d.ts +3 -3
  325. package/dist/InputGroup/InputGroup.d.ts.map +1 -1
  326. package/dist/InputGroup/InputGroup.js +46 -36
  327. package/dist/InputGroup/InputGroupInternalContext.d.ts +4 -0
  328. package/dist/InputGroup/InputGroupInternalContext.d.ts.map +1 -0
  329. package/dist/InputGroup/InputGroupInternalContext.js +15 -0
  330. package/dist/InputGroup/InputGroupText.d.ts +1 -1
  331. package/dist/InputGroup/InputGroupText.d.ts.map +1 -1
  332. package/dist/InputGroup/InputGroupText.js +2 -0
  333. package/dist/InputGroup/groupStyles.d.ts +9 -0
  334. package/dist/InputGroup/groupStyles.d.ts.map +1 -1
  335. package/dist/InputGroup/groupStyles.js +28 -14
  336. package/dist/InputGroup/index.d.ts +6 -6
  337. package/dist/InteractiveRoleContext/InteractiveRoleContext.d.ts +1 -1
  338. package/dist/InteractiveRoleContext/index.d.ts +1 -1
  339. package/dist/Item/Item.d.ts +1 -1
  340. package/dist/Item/Item.d.ts.map +1 -1
  341. package/dist/Item/Item.js +1 -1
  342. package/dist/Item/ItemSwipeLayer.d.ts +2 -2
  343. package/dist/Item/ItemSwipeLayer.d.ts.map +1 -1
  344. package/dist/Item/ItemSwipeLayer.js +3 -0
  345. package/dist/Item/index.d.ts +2 -2
  346. package/dist/Item/useSwipeAction.d.ts.map +1 -1
  347. package/dist/Item/useSwipeAction.js +60 -5
  348. package/dist/Kbd/Kbd.d.ts +3 -3
  349. package/dist/Kbd/Kbd.d.ts.map +1 -1
  350. package/dist/Kbd/Kbd.js +18 -11
  351. package/dist/Kbd/index.d.ts +2 -2
  352. package/dist/Layer/LayerProvider.d.ts +1 -1
  353. package/dist/Layer/index.d.ts +18 -18
  354. package/dist/Layer/layerAnimations.stylex.d.ts +9 -5
  355. package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
  356. package/dist/Layer/layerAnimations.stylex.js +23 -10
  357. package/dist/Layer/layerInset.d.ts +1 -1
  358. package/dist/Layer/layerSlideRules.d.ts +63 -3
  359. package/dist/Layer/layerSlideRules.d.ts.map +1 -1
  360. package/dist/Layer/layerSlideRules.js +124 -3
  361. package/dist/Layer/layerStack.d.ts +12 -9
  362. package/dist/Layer/layerStack.d.ts.map +1 -1
  363. package/dist/Layer/layerStack.js +116 -53
  364. package/dist/Layer/modalOutlet.d.ts +44 -6
  365. package/dist/Layer/modalOutlet.d.ts.map +1 -1
  366. package/dist/Layer/modalOutlet.js +150 -14
  367. package/dist/Layer/preserveAnimations.d.ts +11 -0
  368. package/dist/Layer/preserveAnimations.d.ts.map +1 -0
  369. package/dist/Layer/preserveAnimations.js +245 -0
  370. package/dist/Layer/useLayer.d.ts +19 -2
  371. package/dist/Layer/useLayer.d.ts.map +1 -1
  372. package/dist/Layer/useLayer.js +500 -43
  373. package/dist/Layer/useLayerDismissal.d.ts +11 -8
  374. package/dist/Layer/useLayerDismissal.d.ts.map +1 -1
  375. package/dist/Layer/useLayerDismissal.js +8 -8
  376. package/dist/Layer/useTouchTrigger.d.ts +14 -1
  377. package/dist/Layer/useTouchTrigger.d.ts.map +1 -1
  378. package/dist/Layer/useTouchTrigger.js +72 -17
  379. package/dist/Layout/Layout.d.ts +2 -2
  380. package/dist/Layout/Layout.d.ts.map +1 -1
  381. package/dist/Layout/Layout.js +4 -0
  382. package/dist/Layout/LayoutContent.d.ts +2 -2
  383. package/dist/Layout/LayoutContent.d.ts.map +1 -1
  384. package/dist/Layout/LayoutContent.js +2 -2
  385. package/dist/Layout/LayoutFooter.d.ts +2 -2
  386. package/dist/Layout/LayoutFooter.d.ts.map +1 -1
  387. package/dist/Layout/LayoutFooter.js +2 -1
  388. package/dist/Layout/LayoutHeader.d.ts +2 -2
  389. package/dist/Layout/LayoutHeader.d.ts.map +1 -1
  390. package/dist/Layout/LayoutHeader.js +2 -1
  391. package/dist/Layout/LayoutPanel.d.ts +3 -3
  392. package/dist/Layout/index.d.ts +29 -29
  393. package/dist/Layout/layoutEdges.stylex.d.ts +20 -0
  394. package/dist/Layout/layoutEdges.stylex.d.ts.map +1 -0
  395. package/dist/Layout/layoutEdges.stylex.js +28 -0
  396. package/dist/Layout/padding.stylex.d.ts +1 -1
  397. package/dist/Lightbox/Lightbox.d.ts +6 -3
  398. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  399. package/dist/Lightbox/Lightbox.js +111 -89
  400. package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts +2 -0
  401. package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.d.ts.map +1 -0
  402. package/dist/Lightbox/LightboxKeyboard.a11y.browser.spec.js +78 -0
  403. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts +2 -0
  404. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.d.ts.map +1 -0
  405. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +65 -0
  406. package/dist/Lightbox/index.d.ts +4 -4
  407. package/dist/Lightbox/useLightbox.d.ts +1 -1
  408. package/dist/Link/Link.d.ts +3 -3
  409. package/dist/Link/LinkContext.d.ts +1 -1
  410. package/dist/Link/LinkProvider.d.ts +1 -1
  411. package/dist/Link/index.d.ts +8 -8
  412. package/dist/Link/useLinkComponent.d.ts +1 -1
  413. package/dist/List/List.d.ts +3 -3
  414. package/dist/List/ListItem.d.ts +2 -2
  415. package/dist/List/index.d.ts +4 -4
  416. package/dist/Markdown/Markdown.d.ts +15 -5
  417. package/dist/Markdown/Markdown.d.ts.map +1 -1
  418. package/dist/Markdown/Markdown.fr23.bench.js +3 -1
  419. package/dist/Markdown/Markdown.fr23.sampling.d.ts +16 -0
  420. package/dist/Markdown/Markdown.fr23.sampling.d.ts.map +1 -1
  421. package/dist/Markdown/Markdown.fr23.sampling.js +13 -4
  422. package/dist/Markdown/Markdown.js +23 -9
  423. package/dist/Markdown/MarkdownTable.a11y.chromium.spec.js +1 -0
  424. package/dist/Markdown/headingProjection.d.ts +3 -3
  425. package/dist/Markdown/index.d.ts +7 -7
  426. package/dist/Markdown/parser/index.d.ts +3 -3
  427. package/dist/Markdown/parser.d.ts +3 -3
  428. package/dist/Markdown/plugin-renderer/MarkdownPluginNodeRenderer.d.ts +1 -1
  429. package/dist/Markdown/plugin-renderer/index.d.ts +2 -2
  430. package/dist/Markdown/plugins/frontmatter.d.ts +2 -2
  431. package/dist/Markdown/plugins/headingLinks.d.ts +2 -2
  432. package/dist/Markdown/plugins/index.d.ts +14 -14
  433. package/dist/Markdown/plugins/protocol.d.ts +1 -1
  434. package/dist/Markdown/plugins/semanticFence.d.ts +2 -2
  435. package/dist/Markdown/plugins/softBreaks.d.ts +1 -1
  436. package/dist/Markdown/plugins/sourceDecoration.d.ts +2 -2
  437. package/dist/Markdown/plugins/sourceLines.d.ts +1 -1
  438. package/dist/Markdown/plugins/textTransform.d.ts +2 -2
  439. package/dist/Markdown/remark.d.ts +1 -1
  440. package/dist/Markdown/utils.d.ts +4 -4
  441. package/dist/MetadataList/MetadataList.d.ts +2 -2
  442. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  443. package/dist/MetadataList/index.d.ts +5 -5
  444. package/dist/MobileNav/MobileNav.d.ts +3 -2
  445. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  446. package/dist/MobileNav/MobileNav.js +46 -37
  447. package/dist/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.js +1 -0
  448. package/dist/MobileNav/MobileNavToggle.d.ts +1 -1
  449. package/dist/MobileNav/index.d.ts +4 -4
  450. package/dist/MoreMenu/MoreMenu.d.ts +4 -4
  451. package/dist/MoreMenu/index.d.ts +1 -1
  452. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +1 -0
  453. package/dist/MultiSelector/MultiSelector.d.ts +8 -8
  454. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  455. package/dist/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.js +1 -0
  456. package/dist/MultiSelector/MultiSelector.js +21 -5
  457. package/dist/MultiSelector/OptionActions.a11y.chromium.spec.js +1 -0
  458. package/dist/MultiSelector/hooks.d.ts +1 -1
  459. package/dist/MultiSelector/index.d.ts +3 -3
  460. package/dist/MultiSelector/types.d.ts +1 -1
  461. package/dist/NavIcon/NavIcon.d.ts +1 -1
  462. package/dist/NavIcon/index.d.ts +2 -2
  463. package/dist/NavMenu/NavHeadingMenu.d.ts +2 -2
  464. package/dist/NavMenu/NavHeadingMenuItem.d.ts +2 -2
  465. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  466. package/dist/NavMenu/NavHeadingMenuItem.js +46 -7
  467. package/dist/NavMenu/index.d.ts +6 -6
  468. package/dist/NumberInput/NumberInput.d.ts +9 -9
  469. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  470. package/dist/NumberInput/NumberInput.js +61 -24
  471. package/dist/NumberInput/index.d.ts +2 -2
  472. package/dist/NumberInput/numberInputCommit.d.ts +1 -1
  473. package/dist/NumberInput/numberParser.d.ts +1 -1
  474. package/dist/Outline/Outline.d.ts +3 -3
  475. package/dist/Outline/index.d.ts +7 -7
  476. package/dist/Outline/parseOutlineFromMarkdown.d.ts +2 -2
  477. package/dist/Outline/useOutlineFromDOM.d.ts +1 -1
  478. package/dist/Outline/useOutlineFromMarkdown.d.ts +3 -3
  479. package/dist/Outline/useScrollSpy.d.ts +1 -1
  480. package/dist/OverflowList/OverflowList.d.ts +2 -2
  481. package/dist/OverflowList/index.d.ts +2 -2
  482. package/dist/Overlay/Overlay.d.ts +2 -2
  483. package/dist/Overlay/index.d.ts +5 -5
  484. package/dist/Overlay/useOverlay.d.ts +1 -1
  485. package/dist/Pagination/Pagination.d.ts +2 -2
  486. package/dist/Pagination/index.d.ts +2 -2
  487. package/dist/Popover/Popover.d.ts +44 -5
  488. package/dist/Popover/Popover.d.ts.map +1 -1
  489. package/dist/Popover/Popover.js +276 -44
  490. package/dist/Popover/index.d.ts +4 -4
  491. package/dist/Popover/index.d.ts.map +1 -1
  492. package/dist/Popover/lazyPopoverBottomSheet.d.ts +23 -0
  493. package/dist/Popover/lazyPopoverBottomSheet.d.ts.map +1 -0
  494. package/dist/Popover/lazyPopoverBottomSheet.js +40 -0
  495. package/dist/Popover/usePopover.d.ts +2 -2
  496. package/dist/Popover/usePopover.d.ts.map +1 -1
  497. package/dist/Popover/usePopover.js +11 -5
  498. package/dist/PowerSearch/PowerSearch.d.ts +5 -5
  499. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  500. package/dist/PowerSearch/PowerSearch.js +7 -5
  501. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +2 -2
  502. package/dist/PowerSearch/PowerSearchFilterEditor.d.ts +1 -1
  503. package/dist/PowerSearch/PowerSearchToken.d.ts +1 -1
  504. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +2 -2
  505. package/dist/PowerSearch/formatFilterValue.d.ts +3 -3
  506. package/dist/PowerSearch/index.d.ts +8 -8
  507. package/dist/PowerSearch/resolveDateTimeRangePart.d.ts +1 -1
  508. package/dist/PowerSearch/resolveOperatorLabel.d.ts +2 -2
  509. package/dist/PowerSearch/types.d.ts +1 -1
  510. package/dist/PowerSearch/useInternalConfig.d.ts +1 -1
  511. package/dist/PowerSearch/usePowerSearchConfig.d.ts +1 -1
  512. package/dist/PowerSearch/usePowerSearchSource.d.ts +3 -3
  513. package/dist/PowerSearch/utils.d.ts +3 -3
  514. package/dist/ProgressBar/ProgressBar.d.ts +2 -2
  515. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  516. package/dist/ProgressBar/ProgressBar.js +8 -0
  517. package/dist/ProgressBar/index.d.ts +2 -2
  518. package/dist/RadioList/RadioList.d.ts +3 -3
  519. package/dist/RadioList/RadioListItem.d.ts +2 -2
  520. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  521. package/dist/RadioList/RadioListItem.js +10 -2
  522. package/dist/RadioList/index.d.ts +4 -4
  523. package/dist/Resizable/ResizeHandle.d.ts +2 -2
  524. package/dist/Resizable/index.d.ts +6 -6
  525. package/dist/Resizable/useResizable.d.ts +2 -2
  526. package/dist/Resizable/utils.d.ts +3 -3
  527. package/dist/ScrollableArea/ScrollableArea.d.ts +3 -3
  528. package/dist/ScrollableArea/ScrollableArea.d.ts.map +1 -1
  529. package/dist/ScrollableArea/ScrollableArea.js +1 -1
  530. package/dist/ScrollableArea/index.d.ts +4 -4
  531. package/dist/Section/Section.d.ts +3 -3
  532. package/dist/Section/index.d.ts +2 -2
  533. package/dist/SegmentedControl/SegmentedControl.d.ts +2 -2
  534. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  535. package/dist/SegmentedControl/index.d.ts +5 -5
  536. package/dist/SelectableCard/SelectableCard.d.ts +8 -8
  537. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  538. package/dist/SelectableCard/SelectableCard.js +15 -11
  539. package/dist/SelectableCard/index.d.ts +2 -2
  540. package/dist/Selector/Selector.d.ts +8 -8
  541. package/dist/Selector/Selector.d.ts.map +1 -1
  542. package/dist/Selector/Selector.js +16 -5
  543. package/dist/Selector/SelectorOption.d.ts +1 -1
  544. package/dist/Selector/hooks.d.ts +1 -1
  545. package/dist/Selector/index.d.ts +4 -4
  546. package/dist/Selector/types.d.ts +1 -1
  547. package/dist/Selector/useSelectorPresentation.d.ts +2 -2
  548. package/dist/Selector/utils.d.ts +1 -1
  549. package/dist/SideNav/SideNav.d.ts +3 -3
  550. package/dist/SideNav/SideNavCollapseButton.d.ts +3 -3
  551. package/dist/SideNav/SideNavHeading.d.ts +2 -2
  552. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  553. package/dist/SideNav/SideNavHeading.js +34 -0
  554. package/dist/SideNav/SideNavItem.d.ts +9 -5
  555. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  556. package/dist/SideNav/SideNavItem.js +36 -13
  557. package/dist/SideNav/SideNavSection.d.ts +1 -1
  558. package/dist/SideNav/index.d.ts +14 -14
  559. package/dist/SizeContext/index.d.ts +1 -1
  560. package/dist/Skeleton/Skeleton.d.ts +1 -1
  561. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  562. package/dist/Skeleton/Skeleton.js +12 -3
  563. package/dist/Skeleton/index.d.ts +2 -2
  564. package/dist/Slider/Slider.d.ts +3 -3
  565. package/dist/Slider/Slider.d.ts.map +1 -1
  566. package/dist/Slider/Slider.js +45 -12
  567. package/dist/Slider/index.d.ts +2 -2
  568. package/dist/Spinner/Spinner.d.ts +1 -1
  569. package/dist/Spinner/index.d.ts +2 -2
  570. package/dist/Stack/Stack.d.ts +3 -3
  571. package/dist/Stack/StackItem.d.ts +2 -2
  572. package/dist/Stack/index.d.ts +6 -6
  573. package/dist/Stack/stack.stylex.d.ts +1 -1
  574. package/dist/StatusDot/StatusDot.d.ts +2 -2
  575. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  576. package/dist/StatusDot/StatusDot.js +12 -0
  577. package/dist/StatusDot/index.d.ts +2 -2
  578. package/dist/Stepper/Step.d.ts +2 -2
  579. package/dist/Stepper/Step.d.ts.map +1 -1
  580. package/dist/Stepper/Step.js +10 -6
  581. package/dist/Stepper/Stepper.d.ts +2 -2
  582. package/dist/Stepper/index.d.ts +7 -7
  583. package/dist/Switch/Switch.d.ts +4 -4
  584. package/dist/Switch/Switch.d.ts.map +1 -1
  585. package/dist/Switch/Switch.js +5 -5
  586. package/dist/Switch/index.d.ts +2 -2
  587. package/dist/Switch/switch.markers.stylex.d.ts +7 -2
  588. package/dist/Switch/switch.markers.stylex.d.ts.map +1 -1
  589. package/dist/Switch/switch.markers.stylex.js +8 -3
  590. package/dist/TabList/Tab.d.ts +2 -2
  591. package/dist/TabList/Tab.d.ts.map +1 -1
  592. package/dist/TabList/Tab.js +5 -1
  593. package/dist/TabList/TabList.d.ts +3 -3
  594. package/dist/TabList/TabMenu.d.ts +2 -2
  595. package/dist/TabList/TabMenu.d.ts.map +1 -1
  596. package/dist/TabList/TabMenu.js +1 -0
  597. package/dist/TabList/index.d.ts +8 -8
  598. package/dist/Table/BaseTable.d.ts +1 -1
  599. package/dist/Table/Table.d.ts +1 -1
  600. package/dist/Table/TableBody.d.ts +1 -1
  601. package/dist/Table/TableCell.d.ts +3 -3
  602. package/dist/Table/TableCell.d.ts.map +1 -1
  603. package/dist/Table/TableCell.js +1 -0
  604. package/dist/Table/TableContext.d.ts +1 -1
  605. package/dist/Table/TableFooter.d.ts +1 -1
  606. package/dist/Table/TableHeader.d.ts +1 -1
  607. package/dist/Table/TableHeaderCell.d.ts +3 -3
  608. package/dist/Table/TableHeaderCell.d.ts.map +1 -1
  609. package/dist/Table/TableHeaderCell.js +1 -0
  610. package/dist/Table/TableRow.d.ts +2 -2
  611. package/dist/Table/TableSelectionToolbar.d.ts +2 -2
  612. package/dist/Table/columnUtils.d.ts +1 -1
  613. package/dist/Table/index.d.ts +54 -54
  614. package/dist/Table/plugins/columnResize/index.d.ts +2 -2
  615. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts +1 -1
  616. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  617. package/dist/Table/plugins/columnResize/useTableColumnResize.js +11 -2
  618. package/dist/Table/plugins/columnSettings/index.d.ts +4 -4
  619. package/dist/Table/plugins/columnSettings/useTableColumnSettings.d.ts +2 -2
  620. package/dist/Table/plugins/columnSettings/useTableColumnSettingsState.d.ts +1 -1
  621. package/dist/Table/plugins/filtering/index.d.ts +4 -4
  622. package/dist/Table/plugins/filtering/useTableFilterState.d.ts +1 -1
  623. package/dist/Table/plugins/filtering/useTableFiltering.d.ts +2 -2
  624. package/dist/Table/plugins/groupedRows/index.d.ts +2 -2
  625. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
  626. package/dist/Table/plugins/pagination/index.d.ts +3 -3
  627. package/dist/Table/plugins/pagination/useTablePagination.d.ts +1 -1
  628. package/dist/Table/plugins/rowExpansion/index.d.ts +2 -2
  629. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +1 -1
  630. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  631. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +103 -4
  632. package/dist/Table/plugins/rowIndex/index.d.ts +2 -2
  633. package/dist/Table/plugins/rowIndex/useTableRowIndex.d.ts +1 -1
  634. package/dist/Table/plugins/rowStatus/index.d.ts +2 -2
  635. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +2 -2
  636. package/dist/Table/plugins/selection/index.d.ts +4 -4
  637. package/dist/Table/plugins/selection/useTableSelection.d.ts +1 -1
  638. package/dist/Table/plugins/selection/useTableSelectionState.d.ts +1 -1
  639. package/dist/Table/plugins/sortable/index.d.ts +4 -4
  640. package/dist/Table/plugins/sortable/useTableSortable.d.ts +1 -1
  641. package/dist/Table/plugins/sortable/useTableSortableState.d.ts +1 -1
  642. package/dist/Table/plugins/stickyColumns/index.d.ts +2 -2
  643. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +1 -1
  644. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  645. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +233 -6
  646. package/dist/Table/plugins/tree/index.d.ts +4 -4
  647. package/dist/Table/plugins/tree/useTableTreeData.d.ts +1 -1
  648. package/dist/Table/plugins/tree/useTableTreeState.d.ts +1 -1
  649. package/dist/Table/rowDivider.d.ts +34 -0
  650. package/dist/Table/rowDivider.d.ts.map +1 -0
  651. package/dist/Table/rowDivider.js +118 -0
  652. package/dist/Table/tableContextMenu.d.ts +2 -2
  653. package/dist/Table/types.d.ts +3 -3
  654. package/dist/Table/useBaseTablePlugins.d.ts +1 -1
  655. package/dist/Table/useTableCellStyles.d.ts +2 -2
  656. package/dist/Table/utils.d.ts +2 -2
  657. package/dist/Text/Text.d.ts +3 -3
  658. package/dist/Text/index.d.ts +4 -4
  659. package/dist/TextArea/TextArea.d.ts +10 -8
  660. package/dist/TextArea/TextArea.d.ts.map +1 -1
  661. package/dist/TextArea/TextArea.js +15 -12
  662. package/dist/TextArea/index.d.ts +2 -2
  663. package/dist/TextInput/TextInput.d.ts +12 -10
  664. package/dist/TextInput/TextInput.d.ts.map +1 -1
  665. package/dist/TextInput/TextInput.js +35 -21
  666. package/dist/TextInput/index.d.ts +2 -2
  667. package/dist/Thumbnail/Thumbnail.d.ts +1 -1
  668. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  669. package/dist/Thumbnail/Thumbnail.js +45 -11
  670. package/dist/Thumbnail/index.d.ts +2 -2
  671. package/dist/TimeInput/TimeInput.d.ts +6 -6
  672. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  673. package/dist/TimeInput/TimeInput.js +12 -4
  674. package/dist/TimeInput/TouchTimeField.d.ts +1 -1
  675. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  676. package/dist/TimeInput/TouchTimeField.js +2 -1
  677. package/dist/TimeInput/index.d.ts +3 -3
  678. package/dist/Timer/Timer.d.ts +2 -2
  679. package/dist/Timer/index.d.ts +2 -2
  680. package/dist/Timestamp/Timestamp.d.ts +3 -3
  681. package/dist/Timestamp/TimestampHoverCard.d.ts +1 -1
  682. package/dist/Timestamp/formatInstant.d.ts +2 -2
  683. package/dist/Timestamp/formatRelativeTime.d.ts +1 -1
  684. package/dist/Timestamp/index.d.ts +3 -3
  685. package/dist/Timestamp/tooltipEntries.d.ts +2 -2
  686. package/dist/Toast/Toast.d.ts +2 -2
  687. package/dist/Toast/ToastContext.d.ts +1 -1
  688. package/dist/Toast/ToastViewport.d.ts +2 -2
  689. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  690. package/dist/Toast/ToastViewport.js +28 -2
  691. package/dist/Toast/index.d.ts +6 -6
  692. package/dist/Toast/useToast.d.ts +1 -1
  693. package/dist/ToggleButton/ToggleButton.d.ts +3 -3
  694. package/dist/ToggleButton/ToggleButtonGroup.d.ts +1 -1
  695. package/dist/ToggleButton/index.d.ts +4 -4
  696. package/dist/Token/Token.d.ts +2 -2
  697. package/dist/Token/TokenLink.d.ts +1 -1
  698. package/dist/Token/index.d.ts +2 -2
  699. package/dist/Tokenizer/Tokenizer.d.ts +77 -10
  700. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  701. package/dist/Tokenizer/Tokenizer.js +474 -85
  702. package/dist/Tokenizer/TokenizerBottomSheet.d.ts +98 -0
  703. package/dist/Tokenizer/TokenizerBottomSheet.d.ts.map +1 -0
  704. package/dist/Tokenizer/TokenizerBottomSheet.js +721 -0
  705. package/dist/Tokenizer/index.d.ts +2 -2
  706. package/dist/Tokenizer/useEndLaneReserve.d.ts +3 -2
  707. package/dist/Tokenizer/useEndLaneReserve.d.ts.map +1 -1
  708. package/dist/Tokenizer/useEndLaneReserve.js +3 -2
  709. package/dist/Toolbar/Toolbar.d.ts +4 -4
  710. package/dist/Toolbar/index.d.ts +2 -2
  711. package/dist/Tooltip/Tooltip.d.ts +3 -3
  712. package/dist/Tooltip/index.d.ts +4 -4
  713. package/dist/Tooltip/useTooltip.d.ts +2 -2
  714. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  715. package/dist/Tooltip/useTooltip.js +9 -3
  716. package/dist/TopNav/TopNav.d.ts +1 -1
  717. package/dist/TopNav/TopNavHeading.d.ts +2 -2
  718. package/dist/TopNav/TopNavItem.d.ts +3 -3
  719. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  720. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  721. package/dist/TopNav/TopNavMegaMenu.js +4 -4
  722. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  723. package/dist/TopNav/TopNavMegaMenuItem.d.ts +2 -2
  724. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  725. package/dist/TopNav/index.d.ts +16 -16
  726. package/dist/TreeList/TreeList.d.ts +11 -26
  727. package/dist/TreeList/TreeList.d.ts.map +1 -1
  728. package/dist/TreeList/TreeList.js +175 -3
  729. package/dist/TreeList/TreeListItem.d.ts +8 -2
  730. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  731. package/dist/TreeList/TreeListItem.js +3 -1
  732. package/dist/TreeList/TreeListTypes.d.ts +1 -1
  733. package/dist/TreeList/index.d.ts +3 -3
  734. package/dist/Typeahead/BaseTypeahead.d.ts +2 -2
  735. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  736. package/dist/Typeahead/BaseTypeahead.js +16 -4
  737. package/dist/Typeahead/Typeahead.d.ts +7 -7
  738. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  739. package/dist/Typeahead/Typeahead.js +31 -14
  740. package/dist/Typeahead/TypeaheadItem.d.ts +2 -2
  741. package/dist/Typeahead/createStaticSource.d.ts +1 -1
  742. package/dist/Typeahead/index.d.ts +9 -9
  743. package/dist/Typeahead/utils.d.ts +3 -3
  744. package/dist/VStack/VStack.d.ts +2 -2
  745. package/dist/VStack/index.d.ts +1 -1
  746. package/dist/VisuallyHidden/VisuallyHidden.d.ts +24 -6
  747. package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -1
  748. package/dist/VisuallyHidden/VisuallyHidden.js +24 -5
  749. package/dist/VisuallyHidden/index.d.ts +2 -2
  750. package/dist/astryx.css +138 -51
  751. package/dist/gestures/GestureArena.d.ts +175 -0
  752. package/dist/gestures/GestureArena.d.ts.map +1 -0
  753. package/dist/gestures/GestureArena.js +816 -0
  754. package/dist/gestures/GestureRecognizer.d.ts +239 -0
  755. package/dist/gestures/GestureRecognizer.d.ts.map +1 -0
  756. package/dist/gestures/GestureRecognizer.js +487 -0
  757. package/dist/gestures/LongPressGestureRecognizer.d.ts +32 -0
  758. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -0
  759. package/dist/gestures/LongPressGestureRecognizer.js +135 -0
  760. package/dist/gestures/PanGestureRecognizer.d.ts +117 -0
  761. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -0
  762. package/dist/gestures/PanGestureRecognizer.js +349 -0
  763. package/dist/gestures/TapGestureRecognizer.d.ts +39 -0
  764. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -0
  765. package/dist/gestures/TapGestureRecognizer.js +151 -0
  766. package/dist/gestures/VelocityTracker.d.ts +51 -0
  767. package/dist/gestures/VelocityTracker.d.ts.map +1 -0
  768. package/dist/gestures/VelocityTracker.js +186 -0
  769. package/dist/gestures/geometry.d.ts +17 -0
  770. package/dist/gestures/geometry.d.ts.map +1 -0
  771. package/dist/gestures/geometry.js +55 -0
  772. package/dist/gestures/types.d.ts +139 -0
  773. package/dist/gestures/types.d.ts.map +1 -0
  774. package/dist/gestures/types.js +67 -0
  775. package/dist/hooks/AnnounceRenderedText.d.ts +17 -0
  776. package/dist/hooks/AnnounceRenderedText.d.ts.map +1 -0
  777. package/dist/hooks/AnnounceRenderedText.js +32 -0
  778. package/dist/hooks/ModalAnnounceProvider.d.ts +41 -0
  779. package/dist/hooks/ModalAnnounceProvider.d.ts.map +1 -0
  780. package/dist/hooks/ModalAnnounceProvider.js +133 -0
  781. package/dist/hooks/actionGroupTracker.d.ts +98 -0
  782. package/dist/hooks/actionGroupTracker.d.ts.map +1 -0
  783. package/dist/hooks/actionGroupTracker.js +338 -0
  784. package/dist/hooks/index.d.ts +54 -52
  785. package/dist/hooks/index.d.ts.map +1 -1
  786. package/dist/hooks/index.js +1 -0
  787. package/dist/hooks/modalAnnounce.d.ts +18 -0
  788. package/dist/hooks/modalAnnounce.d.ts.map +1 -0
  789. package/dist/hooks/modalAnnounce.js +382 -0
  790. package/dist/hooks/useAdaptivePresentation.d.ts +9 -1
  791. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  792. package/dist/hooks/useAdaptivePresentation.js +33 -8
  793. package/dist/hooks/useAnimatedLayout.d.ts +42 -0
  794. package/dist/hooks/useAnimatedLayout.d.ts.map +1 -0
  795. package/dist/hooks/useAnimatedLayout.js +46 -0
  796. package/dist/hooks/useAnnounce.d.ts +132 -1
  797. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  798. package/dist/hooks/useAnnounce.js +356 -27
  799. package/dist/hooks/useAnnounceRenderedText.d.ts +19 -2
  800. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  801. package/dist/hooks/useAnnounceRenderedText.js +52 -11
  802. package/dist/hooks/useAutoMediaMode.d.ts +1 -1
  803. package/dist/hooks/useBusyAnnouncement.d.ts +9 -5
  804. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  805. package/dist/hooks/useBusyAnnouncement.js +58 -46
  806. package/dist/hooks/useFocusTrap.d.ts +1 -1
  807. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  808. package/dist/hooks/useFocusTrap.js +57 -26
  809. package/dist/hooks/useInputContainer.d.ts +1 -1
  810. package/dist/hooks/useInputStatusIcon.d.ts +3 -3
  811. package/dist/hooks/useMenuPress.d.ts +5 -3
  812. package/dist/hooks/useMenuPress.d.ts.map +1 -1
  813. package/dist/hooks/useMenuPress.js +58 -33
  814. package/dist/hooks/usePressFeedback.d.ts +1 -1
  815. package/dist/hooks/useScrollableArea.d.ts +1 -1
  816. package/dist/hooks/useScrollableArea.d.ts.map +1 -1
  817. package/dist/hooks/useScrollableArea.js +37 -5
  818. package/dist/i18n/InternationalizationContext.d.ts +2 -2
  819. package/dist/i18n/InternationalizationProvider.d.ts +1 -1
  820. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  821. package/dist/i18n/generated-locales/en.generated.js +33 -0
  822. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  823. package/dist/i18n/generated-locales/pseudo.generated.js +33 -0
  824. package/dist/i18n/index.d.ts +12 -12
  825. package/dist/i18n/resolve.d.ts +1 -1
  826. package/dist/i18n/useLocale.d.ts +1 -1
  827. package/dist/index.d.ts +111 -111
  828. package/dist/internal/tokenizer-presentation.d.ts +21 -0
  829. package/dist/internal/tokenizer-presentation.d.ts.map +1 -0
  830. package/dist/internal/tokenizer-presentation.js +21 -0
  831. package/dist/internal/touch.d.ts +26 -0
  832. package/dist/internal/touch.d.ts.map +1 -0
  833. package/dist/internal/touch.js +28 -0
  834. package/dist/motion/LayoutChangeSnapshot.d.ts +33 -0
  835. package/dist/motion/LayoutChangeSnapshot.d.ts.map +1 -0
  836. package/dist/motion/LayoutChangeSnapshot.js +37 -0
  837. package/dist/motion/animatedLayout.d.ts +94 -0
  838. package/dist/motion/animatedLayout.d.ts.map +1 -0
  839. package/dist/motion/animatedLayout.js +1096 -0
  840. package/dist/motion/animator.d.ts +240 -0
  841. package/dist/motion/animator.d.ts.map +1 -0
  842. package/dist/motion/animator.js +2203 -0
  843. package/dist/motion/bezier.d.ts +18 -0
  844. package/dist/motion/bezier.d.ts.map +1 -0
  845. package/dist/motion/bezier.js +60 -0
  846. package/dist/motion/coast.d.ts +61 -0
  847. package/dist/motion/coast.d.ts.map +1 -0
  848. package/dist/motion/coast.js +107 -0
  849. package/dist/motion/decay.d.ts +41 -0
  850. package/dist/motion/decay.d.ts.map +1 -0
  851. package/dist/motion/decay.js +90 -0
  852. package/dist/motion/projection.d.ts +36 -0
  853. package/dist/motion/projection.d.ts.map +1 -0
  854. package/dist/motion/projection.js +92 -0
  855. package/dist/motion/reducedMotion.d.ts +25 -0
  856. package/dist/motion/reducedMotion.d.ts.map +1 -0
  857. package/dist/motion/reducedMotion.js +85 -0
  858. package/dist/motion/reducedMotion.stylex.d.ts +19 -0
  859. package/dist/motion/reducedMotion.stylex.d.ts.map +1 -0
  860. package/dist/motion/reducedMotion.stylex.js +37 -0
  861. package/dist/motion/reducedMotionPlan.d.ts +89 -0
  862. package/dist/motion/reducedMotionPlan.d.ts.map +1 -0
  863. package/dist/motion/reducedMotionPlan.js +194 -0
  864. package/dist/motion/resolveSnapPoint.d.ts +52 -0
  865. package/dist/motion/resolveSnapPoint.d.ts.map +1 -0
  866. package/dist/motion/resolveSnapPoint.js +135 -0
  867. package/dist/motion/roleValue.d.ts +33 -0
  868. package/dist/motion/roleValue.d.ts.map +1 -0
  869. package/dist/motion/roleValue.js +84 -0
  870. package/dist/motion/roles.d.ts +79 -0
  871. package/dist/motion/roles.d.ts.map +1 -0
  872. package/dist/motion/roles.js +199 -0
  873. package/dist/motion/rubberBand.d.ts +20 -0
  874. package/dist/motion/rubberBand.d.ts.map +1 -0
  875. package/dist/motion/rubberBand.js +91 -0
  876. package/dist/motion/selectPage.d.ts +26 -0
  877. package/dist/motion/selectPage.d.ts.map +1 -0
  878. package/dist/motion/selectPage.js +55 -0
  879. package/dist/motion/spring.d.ts +193 -0
  880. package/dist/motion/spring.d.ts.map +1 -0
  881. package/dist/motion/spring.js +442 -0
  882. package/dist/motion/uikit/gestures.d.ts +642 -0
  883. package/dist/motion/uikit/gestures.d.ts.map +1 -0
  884. package/dist/motion/uikit/gestures.js +428 -0
  885. package/dist/motion/uikit/index.d.ts +24 -0
  886. package/dist/motion/uikit/index.d.ts.map +1 -0
  887. package/dist/motion/uikit/index.js +26 -0
  888. package/dist/motion/uikit/navigation.d.ts +54 -0
  889. package/dist/motion/uikit/navigation.d.ts.map +1 -0
  890. package/dist/motion/uikit/navigation.js +83 -0
  891. package/dist/motion/uikit/scroll.d.ts +116 -0
  892. package/dist/motion/uikit/scroll.d.ts.map +1 -0
  893. package/dist/motion/uikit/scroll.js +146 -0
  894. package/dist/motion/uikit/springs.d.ts +545 -0
  895. package/dist/motion/uikit/springs.d.ts.map +1 -0
  896. package/dist/motion/uikit/springs.js +548 -0
  897. package/dist/motion/uikit/timing.d.ts +202 -0
  898. package/dist/motion/uikit/timing.d.ts.map +1 -0
  899. package/dist/motion/uikit/timing.js +201 -0
  900. package/dist/reset.a11y.chromium.spec.js +1 -0
  901. package/dist/reset.until-found.a11y.browser.spec.js +1 -0
  902. package/dist/theme/Theme.d.ts +2 -2
  903. package/dist/theme/contrast.d.ts +1 -1
  904. package/dist/theme/declarationBoundary.d.ts +13 -0
  905. package/dist/theme/declarationBoundary.d.ts.map +1 -1
  906. package/dist/theme/declarationBoundary.js +264 -1
  907. package/dist/theme/defineTheme.d.ts +113 -22
  908. package/dist/theme/defineTheme.d.ts.map +1 -1
  909. package/dist/theme/defineTheme.js +66 -7
  910. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  911. package/dist/theme/derivedVarRegistry.js +9 -0
  912. package/dist/theme/domainTokens/index.d.ts +6 -6
  913. package/dist/theme/generateThemeRules.d.ts +7 -3
  914. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  915. package/dist/theme/generateThemeRules.js +468 -24
  916. package/dist/theme/index.d.ts +31 -31
  917. package/dist/theme/index.d.ts.map +1 -1
  918. package/dist/theme/index.js +1 -1
  919. package/dist/theme/localTokens.d.ts +1 -1
  920. package/dist/theme/mergeComponents.d.ts +1 -1
  921. package/dist/theme/onMediaTokens.d.ts +1 -1
  922. package/dist/theme/resolveThemeValues.d.ts +7 -7
  923. package/dist/theme/statusColor.d.ts +48 -0
  924. package/dist/theme/statusColor.d.ts.map +1 -0
  925. package/dist/theme/statusColor.js +203 -0
  926. package/dist/theme/statusRoleDerivation.d.ts +11 -0
  927. package/dist/theme/statusRoleDerivation.d.ts.map +1 -0
  928. package/dist/theme/statusRoleDerivation.js +236 -0
  929. package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
  930. package/dist/theme/syntax/index.d.ts +7 -7
  931. package/dist/theme/syntax/presets.d.ts +1 -1
  932. package/dist/theme/themeAdaptations.d.ts +30 -6
  933. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  934. package/dist/theme/themeAdaptations.js +30 -1
  935. package/dist/theme/themeRegistry.d.ts +1 -1
  936. package/dist/theme/tokens.d.ts +1 -1
  937. package/dist/theme/tokens.d.ts.map +1 -1
  938. package/dist/theme/tokens.js +16 -1
  939. package/dist/theme/tokens.stylex.d.ts +40 -2
  940. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  941. package/dist/theme/tokens.stylex.js +47 -2
  942. package/dist/theme/types.d.ts +1 -1
  943. package/dist/theme/useTheme.d.ts +6 -4
  944. package/dist/theme/useTheme.d.ts.map +1 -1
  945. package/dist/theme/useTheme.js +10 -4
  946. package/dist/utils/dateParser.d.ts +3 -3
  947. package/dist/utils/edgeAutoscroll.d.ts +53 -0
  948. package/dist/utils/edgeAutoscroll.d.ts.map +1 -0
  949. package/dist/utils/edgeAutoscroll.js +81 -0
  950. package/dist/utils/groupItems.d.ts +1 -1
  951. package/dist/utils/hitArea.d.ts +72 -0
  952. package/dist/utils/hitArea.d.ts.map +1 -0
  953. package/dist/utils/hitArea.js +681 -0
  954. package/dist/utils/index.d.ts +29 -29
  955. package/dist/utils/plainDate.d.ts +3 -3
  956. package/dist/utils/touchPresentation.d.ts +48 -0
  957. package/dist/utils/touchPresentation.d.ts.map +1 -0
  958. package/dist/utils/touchPresentation.js +133 -0
  959. package/locales/af-ZA.json +1 -1
  960. package/locales/ar-SA.json +1 -1
  961. package/locales/ca-ES.json +1 -1
  962. package/locales/cs-CZ.json +1 -1
  963. package/locales/da-DK.json +1 -1
  964. package/locales/de-DE.json +1 -1
  965. package/locales/el-GR.json +1 -1
  966. package/locales/en.json +132 -0
  967. package/locales/es-ES.json +1 -1
  968. package/locales/fi-FI.json +1 -1
  969. package/locales/fr-FR.json +1 -1
  970. package/locales/he-IL.json +1 -1
  971. package/locales/hu-HU.json +1 -1
  972. package/locales/it-IT.json +1 -1
  973. package/locales/ja-JP.json +1 -1
  974. package/locales/ko-KR.json +1 -1
  975. package/locales/nl-NL.json +1 -1
  976. package/locales/no-NO.json +1 -1
  977. package/locales/pl-PL.json +1 -1
  978. package/locales/pseudo.json +99 -0
  979. package/locales/pt-BR.json +1 -1
  980. package/locales/pt-PT.json +1 -1
  981. package/locales/ro-RO.json +1 -1
  982. package/locales/ru-RU.json +1 -1
  983. package/locales/sr-SP.json +1 -1
  984. package/locales/sv-SE.json +1 -1
  985. package/locales/tr-TR.json +1 -1
  986. package/locales/uk-UA.json +1 -1
  987. package/locales/vi-VN.json +1 -1
  988. package/locales/zh-CN.json +1 -1
  989. package/locales/zh-TW.json +1 -1
  990. package/package.json +61 -6
  991. package/src/AlertDialog/AlertDialog.tsx +1 -1
  992. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +1 -0
  993. package/src/AppShell/AppShell.spec.md +337 -0
  994. package/src/AspectRatio/AspectRatio.spec.md +179 -0
  995. package/src/AspectRatio/__tests__/AspectRatioFitLayers.a11y.browser.spec.ts +1 -0
  996. package/src/Avatar/Avatar.spec.md +253 -0
  997. package/src/Avatar/AvatarStatusDot.spec.md +93 -79
  998. package/src/Avatar/AvatarStatusDot.test.tsx +22 -0
  999. package/src/Avatar/AvatarStatusDot.tsx +2 -2
  1000. package/src/AvatarGroup/AvatarGroup.spec.md +205 -0
  1001. package/src/AvatarGroup/AvatarGroupOverflow.spec.md +123 -120
  1002. package/src/Badge/Badge.doc.mjs +2 -1
  1003. package/src/Badge/Badge.spec.md +207 -0
  1004. package/src/Badge/Badge.test.tsx +13 -0
  1005. package/src/Badge/Badge.tsx +38 -2
  1006. package/src/Banner/Banner.spec.md +38 -27
  1007. package/src/Banner/Banner.test.tsx +118 -16
  1008. package/src/Banner/Banner.tsx +94 -7
  1009. package/src/Blockquote/Blockquote.spec.md +171 -0
  1010. package/src/BottomSheet/BottomSheet.doc.mjs +106 -24
  1011. package/src/BottomSheet/BottomSheet.spec.md +269 -40
  1012. package/src/BottomSheet/BottomSheet.test.tsx +491 -5
  1013. package/src/BottomSheet/BottomSheet.tsx +544 -145
  1014. package/src/BottomSheet/BottomSheetHostContext.ts +44 -0
  1015. package/src/BottomSheet/BottomSheetPanel.test.tsx +21 -10
  1016. package/src/BottomSheet/BottomSheetPanel.tsx +166 -57
  1017. package/src/BottomSheet/BottomSheetReplace.test.tsx +1526 -0
  1018. package/src/BottomSheet/BottomSheetStacking.announce.test.tsx +246 -0
  1019. package/src/BottomSheet/BottomSheetStacking.test.tsx +3184 -0
  1020. package/src/BottomSheet/BottomSheetSwitcher.doc.mjs +27 -31
  1021. package/src/BottomSheet/BottomSheetSwitcher.spec.md +138 -43
  1022. package/src/BottomSheet/BottomSheetSwitcher.tsx +275 -26
  1023. package/src/BottomSheet/BottomSheetSwitcherContext.ts +6 -0
  1024. package/src/BottomSheet/__tests__/BottomSheetDrag.a11y.chromium.spec.ts +1 -0
  1025. package/src/BottomSheet/__tests__/BottomSheetFocusReturn.a11y.browser.spec.ts +1 -0
  1026. package/src/BottomSheet/__tests__/BottomSheetKeyboard.a11y.browser.spec.ts +1 -0
  1027. package/src/BottomSheet/__tests__/BottomSheetNativeModal.a11y.browser.spec.ts +1 -0
  1028. package/src/BottomSheet/__tests__/BottomSheetPinchZoom.a11y.chromium.spec.ts +1 -0
  1029. package/src/BottomSheet/__tests__/BottomSheetToastOutlet.a11y.chromium.spec.ts +83 -0
  1030. package/src/BottomSheet/bottomSheetEscape.ts +21 -0
  1031. package/src/BottomSheet/bottomSheetStack.ts +2031 -0
  1032. package/src/BottomSheet/useSheetGestures.ts +68 -12
  1033. package/src/Breadcrumbs/BreadcrumbItem.spec.md +96 -59
  1034. package/src/Breadcrumbs/BreadcrumbItem.tsx +5 -0
  1035. package/src/Breadcrumbs/Breadcrumbs.spec.md +165 -0
  1036. package/src/Breadcrumbs/Breadcrumbs.test.tsx +22 -0
  1037. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +1 -0
  1038. package/src/Button/Button.spec.md +322 -0
  1039. package/src/Button/Button.test.tsx +8 -1
  1040. package/src/Button/Button.tsx +36 -7
  1041. package/src/Button/__tests__/Button.a11y.chromium.spec.ts +1 -0
  1042. package/src/ButtonGroup/ButtonGroup.spec.md +218 -0
  1043. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +1 -0
  1044. package/src/Card/Card.spec.md +205 -0
  1045. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +1 -0
  1046. package/src/Chat/ChatComposer.test.tsx +54 -0
  1047. package/src/Chat/ChatComposer.tsx +41 -27
  1048. package/src/Chat/ChatComposerInput.test.tsx +165 -21
  1049. package/src/Chat/ChatComposerInput.tsx +73 -16
  1050. package/src/Chat/ChatMessageMetadata.tsx +1 -1
  1051. package/src/Chat/ChatPastedTextToken.test.tsx +71 -0
  1052. package/src/Chat/ChatPastedTextToken.tsx +8 -7
  1053. package/src/Chat/ChatToolCalls.tsx +5 -5
  1054. package/src/Chat/__tests__/ChatLayoutScrollButton.a11y.chromium.spec.ts +1 -0
  1055. package/src/Chat/__tests__/ChatLayoutScrollButtonSurface.a11y.chromium.spec.ts +1 -0
  1056. package/src/Chat/__tests__/ChatMessageList.a11y.chromium.spec.ts +1 -0
  1057. package/src/Chat/__tests__/ChatMessageMetadata.a11y.chromium.spec.ts +1 -0
  1058. package/src/Chat/__tests__/ChatSendButton.a11y.chromium.spec.ts +1 -0
  1059. package/src/Chat/__tests__/ChatSystemMessage.a11y.chromium.spec.ts +1 -0
  1060. package/src/Chat/__tests__/ChatTokenizedText.a11y.chromium.spec.ts +1 -0
  1061. package/src/Chat/__tests__/useChatStreamScroll.a11y.chromium.spec.ts +1 -0
  1062. package/src/CheckboxInput/CheckboxInput.spec.md +97 -66
  1063. package/src/CheckboxInput/__tests__/Checkbox.a11y.chromium.spec.ts +1 -0
  1064. package/src/CheckboxList/CheckboxList.spec.md +92 -78
  1065. package/src/CheckboxList/CheckboxListItem.spec.md +86 -60
  1066. package/src/CheckboxList/__tests__/CheckboxList.a11y.chromium.spec.ts +1 -0
  1067. package/src/ClickableCard/ClickableCard.doc.mjs +1 -2
  1068. package/src/ClickableCard/ClickableCard.test.tsx +14 -3
  1069. package/src/ClickableCard/ClickableCard.tsx +44 -28
  1070. package/src/Code/Code.spec.md +30 -32
  1071. package/src/CodeBlock/CodeBlock.doc.mjs +21 -4
  1072. package/src/CodeBlock/CodeBlock.spec.md +96 -61
  1073. package/src/CodeBlock/CodeBlock.test.tsx +97 -1
  1074. package/src/CodeBlock/CodeBlock.tsx +132 -22
  1075. package/src/CodeBlock/CodeLanguage.test.tsx +173 -0
  1076. package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +290 -0
  1077. package/src/CodeBlock/__tests__/CodeBlockLanguages.a11y.chromium.spec.ts +64 -0
  1078. package/src/CodeBlock/__tests__/CodeBlockOverflowStop.a11y.chromium.spec.ts +1 -0
  1079. package/src/CodeBlock/__tests__/DiffRowPaint.a11y.chromium.spec.ts +1 -0
  1080. package/src/CodeBlock/grammar.ts +291 -0
  1081. package/src/CodeBlock/index.ts +7 -0
  1082. package/src/CodeBlock/languages/dockerfile.ts +43 -0
  1083. package/src/CodeBlock/languages/graphql.ts +30 -0
  1084. package/src/CodeBlock/languages/java.ts +28 -0
  1085. package/src/CodeBlock/languages/lua.ts +21 -0
  1086. package/src/CodeBlock/languages/objective-c.ts +26 -0
  1087. package/src/CodeBlock/languages/powershell.ts +31 -0
  1088. package/src/CodeBlock/languages/ruby.ts +29 -0
  1089. package/src/CodeBlock/languages/thrift.ts +32 -0
  1090. package/src/CodeBlock/languages/toml.ts +36 -0
  1091. package/src/CodeBlock/languages.test.ts +402 -0
  1092. package/src/CodeBlock/tokenizer.ts +176 -16
  1093. package/src/CodeBlock/tokenizerBudget.test.ts +112 -0
  1094. package/src/Collapsible/Collapsible.doc.mjs +6 -0
  1095. package/src/Collapsible/Collapsible.spec.md +26 -23
  1096. package/src/Collapsible/Collapsible.tsx +121 -2
  1097. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +1 -0
  1098. package/src/Collapsible/__tests__/CollapsibleGroup.a11y.chromium.spec.ts +1 -0
  1099. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +1 -0
  1100. package/src/CommandPalette/CommandPalette.perf.test.ts +8 -4
  1101. package/src/CommandPalette/CommandPalette.tsx +17 -1
  1102. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +6 -3
  1103. package/src/CommandPalette/CommandPaletteEmpty.spec.md +190 -0
  1104. package/src/CommandPalette/CommandPaletteEmpty.tsx +4 -0
  1105. package/src/CommandPalette/CommandPaletteInput.tsx +21 -2
  1106. package/src/CommandPalette/__tests__/CommandPalette.a11y.chromium.spec.ts +1 -0
  1107. package/src/CommandPalette/__tests__/CommandPaletteEmptyAudit.a11y.chromium.spec.ts +715 -0
  1108. package/src/CommandPalette/__tests__/CommandPaletteFooter.a11y.chromium.spec.ts +1 -0
  1109. package/src/CommandPalette/__tests__/CommandPaletteInputAudit.a11y.chromium.spec.ts +1 -0
  1110. package/src/CommandPalette/__tests__/CommandPaletteItemAudit.a11y.chromium.spec.ts +1 -0
  1111. package/src/CommandPalette/busyStartSettle.ts +26 -0
  1112. package/src/ComplexSelector/ComplexSelector.doc.mjs +1 -1
  1113. package/src/ComplexSelector/ComplexSelector.focusableDisabled.test.tsx +1 -1
  1114. package/src/ComplexSelector/ComplexSelector.fr10.test.tsx +9 -9
  1115. package/src/ComplexSelector/ComplexSelector.spec.md +161 -107
  1116. package/src/ComplexSelector/ComplexSelector.test.tsx +236 -17
  1117. package/src/ComplexSelector/ComplexSelector.tsx +69 -4
  1118. package/src/ComplexSelector/__tests__/ComplexSelector.a11y.chromium.spec.ts +965 -0
  1119. package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
  1120. package/src/ContextMenu/ContextMenu.spec.md +38 -30
  1121. package/src/ContextMenu/ContextMenu.test.tsx +189 -11
  1122. package/src/ContextMenu/ContextMenu.tsx +75 -17
  1123. package/src/ContextMenu/__tests__/ContextMenuAudit.a11y.chromium.spec.ts +1 -0
  1124. package/src/ContextMenu/__tests__/ContextMenuCursorAnchor.a11y.browser.spec.ts +1 -0
  1125. package/src/ContextMenu/__tests__/ContextMenuLongPress.a11y.chromium.spec.ts +117 -0
  1126. package/src/DateInput/DateInput.tsx +9 -4
  1127. package/src/DateInput/DateInputTouch.test.tsx +10 -1
  1128. package/src/DateInput/NativeDateField.tsx +2 -1
  1129. package/src/DateInput/TouchDateField.tsx +2 -1
  1130. package/src/DateInput/Wheel.tsx +4 -1
  1131. package/src/DateInput/__tests__/DateInputAudit.a11y.chromium.spec.ts +1 -0
  1132. package/src/DateInput/__tests__/WheelPinchZoom.a11y.chromium.spec.ts +171 -0
  1133. package/src/Dialog/Dialog.doc.mjs +201 -47
  1134. package/src/Dialog/Dialog.tsx +37 -10
  1135. package/src/Dialog/__tests__/Dialog.a11y.browser.spec.ts +1 -0
  1136. package/src/Dialog/__tests__/Dialog.a11y.chromium.spec.ts +1 -0
  1137. package/src/Dialog/__tests__/Dialog.reduced-motion.a11y.browser.spec.ts +191 -0
  1138. package/src/Divider/Divider.spec.md +79 -70
  1139. package/src/Drawer/Drawer.tsx +38 -35
  1140. package/src/Drawer/__tests__/DrawerAudit.a11y.chromium.spec.ts +1 -0
  1141. package/src/Drawer/__tests__/DrawerHeaderAudit.a11y.chromium.spec.ts +1 -0
  1142. package/src/DropdownMenu/DropdownMenu.spec.md +14 -6
  1143. package/src/DropdownMenu/DropdownMenu.ssr.test.tsx +44 -8
  1144. package/src/DropdownMenu/DropdownMenu.test.tsx +64 -5
  1145. package/src/DropdownMenu/DropdownMenu.tsx +47 -21
  1146. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -5
  1147. package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +5 -2
  1148. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +226 -0
  1149. package/src/DropdownMenu/DropdownMenuRadioItem.tsx +32 -16
  1150. package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +158 -0
  1151. package/src/DropdownMenu/DropdownMenuSheetFirstOpen.test.tsx +72 -0
  1152. package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +9 -0
  1153. package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +225 -0
  1154. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +105 -0
  1155. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +6 -6
  1156. package/src/DropdownMenu/MenuBottomSheet.tsx +42 -7
  1157. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +3 -3
  1158. package/src/DropdownMenu/__tests__/DropdownMenuDividerAudit.a11y.chromium.spec.ts +1 -0
  1159. package/src/DropdownMenu/__tests__/DropdownMenuDrillIn.a11y.chromium.spec.ts +1 -0
  1160. package/src/DropdownMenu/__tests__/DropdownMenuFocusReturn.a11y.browser.spec.ts +1 -0
  1161. package/src/DropdownMenu/__tests__/DropdownMenuGroupAudit.a11y.chromium.spec.ts +1 -0
  1162. package/src/DropdownMenu/__tests__/DropdownMenuItemAudit.a11y.chromium.spec.ts +1 -0
  1163. package/src/DropdownMenu/__tests__/DropdownMenuRadioGroupAudit.a11y.chromium.spec.ts +1 -0
  1164. package/src/DropdownMenu/__tests__/DropdownMenuRadioItemAudit.a11y.chromium.spec.ts +540 -0
  1165. package/src/DropdownMenu/__tests__/DropdownMenuSubMenuAudit.a11y.chromium.spec.ts +671 -0
  1166. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +1 -0
  1167. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +1 -0
  1168. package/src/DropdownMenu/__tests__/MenuHeaderFooter.a11y.chromium.spec.ts +1 -0
  1169. package/src/DropdownMenu/__tests__/MenuHoverFocus.a11y.chromium.spec.ts +238 -0
  1170. package/src/DropdownMenu/__tests__/MenuPinchZoom.a11y.chromium.spec.ts +1 -0
  1171. package/src/DropdownMenu/__tests__/MenuPress.a11y.chromium.spec.ts +1 -0
  1172. package/src/DropdownMenu/__tests__/SubMenuHeaderFooter.a11y.chromium.spec.ts +1 -0
  1173. package/src/DropdownMenu/lazyMenuBottomSheet.ts +28 -2
  1174. package/src/DropdownMenu/menuBottomSheet.stylex.ts +33 -0
  1175. package/src/DropdownMenu/menuItemHover.ts +13 -1
  1176. package/src/DropdownMenu/modules/useMenuPress.spec.md +90 -62
  1177. package/src/DropdownMenu/useMenuDrillIn.tsx +7 -5
  1178. package/src/EmptyState/EmptyState.announce.test.tsx +227 -0
  1179. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  1180. package/src/EmptyState/EmptyState.spec.md +22 -14
  1181. package/src/EmptyState/EmptyState.test.tsx +8 -8
  1182. package/src/EmptyState/EmptyState.tsx +7 -5
  1183. package/src/Field/Field.tsx +1 -1
  1184. package/src/Field/FieldLabel.tsx +1 -1
  1185. package/src/Field/PanelSearchInput.tsx +23 -13
  1186. package/src/Field/__tests__/FieldLabelAudit.a11y.chromium.spec.ts +1 -0
  1187. package/src/Field/inputDisabledFocus.ts +28 -0
  1188. package/src/Field/inputStyles.stylex.ts +15 -15
  1189. package/src/FieldStatus/FieldStatus.test.tsx +12 -0
  1190. package/src/FieldStatus/FieldStatus.tsx +12 -3
  1191. package/src/FieldStatus/__tests__/StatusMessage.a11y.chromium.spec.ts +1 -0
  1192. package/src/FileInput/FileInput.test.tsx +78 -0
  1193. package/src/FileInput/FileInput.tsx +11 -9
  1194. package/src/Heading/Heading.spec.md +198 -0
  1195. package/src/HoverCard/HoverCard.test.tsx +93 -3
  1196. package/src/Icon/Icon.doc.mjs +53 -5
  1197. package/src/Icon/Icon.spec.md +40 -29
  1198. package/src/Icon/Icon.test.tsx +266 -9
  1199. package/src/Icon/Icon.tsx +51 -13
  1200. package/src/Icon/IconSize.stylex.ts +27 -11
  1201. package/src/Icon/globalIconRegistry.test.tsx +326 -3
  1202. package/src/Icon/globalIconRegistry.tsx +137 -36
  1203. package/src/Icon/index.ts +29 -1
  1204. package/src/Icon/useIcon.ts +5 -1
  1205. package/src/IconButton/IconButton.spec.md +197 -0
  1206. package/src/IconButton/IconButton.test.tsx +5 -2
  1207. package/src/InputGroup/InputGroup.spec.md +199 -0
  1208. package/src/InputGroup/InputGroup.test.tsx +120 -0
  1209. package/src/InputGroup/InputGroup.tsx +59 -52
  1210. package/src/InputGroup/InputGroupInternalContext.ts +15 -0
  1211. package/src/InputGroup/InputGroupText.spec.md +139 -0
  1212. package/src/InputGroup/InputGroupText.tsx +2 -0
  1213. package/src/InputGroup/groupStyles.ts +22 -11
  1214. package/src/Item/Item.test.tsx +118 -0
  1215. package/src/Item/Item.tsx +5 -3
  1216. package/src/Item/ItemSwipeLayer.tsx +9 -0
  1217. package/src/Item/__tests__/ItemSwipeActions.a11y.chromium.spec.ts +1 -0
  1218. package/src/Item/__tests__/ItemSwipePinchZoom.a11y.chromium.spec.ts +186 -0
  1219. package/src/Item/useSwipeAction.ts +71 -5
  1220. package/src/Kbd/Kbd.test.tsx +95 -0
  1221. package/src/Kbd/Kbd.tsx +30 -23
  1222. package/src/Layer/__tests__/LayerReducedMotion.a11y.chromium.spec.ts +176 -0
  1223. package/src/Layer/__tests__/TouchTrigger.a11y.chromium.spec.ts +200 -0
  1224. package/src/Layer/layerAnimations.stylex.ts +22 -2
  1225. package/src/Layer/layerDismissalInvariants.test.tsx +9 -0
  1226. package/src/Layer/layerSlideRules.ts +141 -8
  1227. package/src/Layer/layerStack.ts +129 -62
  1228. package/src/Layer/modalOutlet.ts +156 -15
  1229. package/src/Layer/preserveAnimations.ts +304 -0
  1230. package/src/Layer/useLayer.doc.mjs +1 -1
  1231. package/src/Layer/useLayer.test.tsx +743 -0
  1232. package/src/Layer/useLayer.tsx +592 -53
  1233. package/src/Layer/useLayerDismissal.test.tsx +85 -2
  1234. package/src/Layer/useLayerDismissal.ts +12 -9
  1235. package/src/Layer/useTouchTrigger.ts +95 -41
  1236. package/src/Layout/Layout.tsx +18 -0
  1237. package/src/Layout/LayoutContent.tsx +5 -14
  1238. package/src/Layout/LayoutFooter.tsx +2 -0
  1239. package/src/Layout/LayoutHeader.tsx +2 -0
  1240. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +1 -0
  1241. package/src/Layout/layoutEdges.stylex.ts +25 -0
  1242. package/src/Lightbox/Lightbox.test.tsx +83 -0
  1243. package/src/Lightbox/Lightbox.tsx +149 -125
  1244. package/src/Lightbox/LightboxKeyboard.a11y.browser.spec.ts +78 -0
  1245. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +70 -0
  1246. package/src/Link/Link.spec.md +229 -0
  1247. package/src/Link/LinkProvider.spec.md +167 -0
  1248. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +1 -0
  1249. package/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts +1 -0
  1250. package/src/List/List.spec.md +90 -33
  1251. package/src/List/ListItem.doc.mjs +3 -3
  1252. package/src/Markdown/Markdown.codeLanguages.test.tsx +137 -0
  1253. package/src/Markdown/Markdown.doc.mjs +12 -0
  1254. package/src/Markdown/Markdown.fr23.bench.ts +3 -1
  1255. package/src/Markdown/Markdown.fr23.perf.test.ts +45 -3
  1256. package/src/Markdown/Markdown.fr23.sampling.ts +13 -4
  1257. package/src/Markdown/Markdown.spec.md +71 -59
  1258. package/src/Markdown/Markdown.tsx +32 -2
  1259. package/src/Markdown/MarkdownTable.a11y.chromium.spec.ts +1 -0
  1260. package/src/Markdown/__tests__/MarkdownNesting.a11y.chromium.spec.ts +1 -0
  1261. package/src/MobileNav/MobileNav.spec.md +161 -64
  1262. package/src/MobileNav/MobileNav.test.tsx +27 -10
  1263. package/src/MobileNav/MobileNav.tsx +51 -38
  1264. package/src/MobileNav/MobileNavPinchZoom.a11y.chromium.spec.ts +1 -0
  1265. package/src/MobileNav/__tests__/MobileNavWidth.a11y.chromium.spec.ts +103 -0
  1266. package/src/MoreMenu/MoreMenu.doc.mjs +2 -2
  1267. package/src/MoreMenu/MoreMenu.spec.md +88 -53
  1268. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +1 -0
  1269. package/src/MultiSelector/MultiSelector.disabledFocus.a11y.chromium.spec.ts +1 -0
  1270. package/src/MultiSelector/MultiSelector.test.tsx +122 -10
  1271. package/src/MultiSelector/MultiSelector.tsx +24 -4
  1272. package/src/MultiSelector/OptionActions.a11y.chromium.spec.ts +1 -0
  1273. package/src/MultiSelector/__tests__/MultiSelector.a11y.chromium.spec.ts +1 -0
  1274. package/src/NavIcon/NavIcon.spec.md +66 -38
  1275. package/src/NavMenu/NavHeadingMenu.spec.md +100 -44
  1276. package/src/NavMenu/NavHeadingMenu.test.tsx +199 -1
  1277. package/src/NavMenu/NavHeadingMenuItem.tsx +54 -6
  1278. package/src/NumberInput/NumberInput.doc.mjs +6 -6
  1279. package/src/NumberInput/NumberInput.spec.md +248 -0
  1280. package/src/NumberInput/NumberInput.test.tsx +187 -14
  1281. package/src/NumberInput/NumberInput.tsx +86 -24
  1282. package/src/NumberInput/__tests__/NumberInput.a11y.chromium.spec.ts +1 -0
  1283. package/src/Pagination/Pagination.test.tsx +2 -2
  1284. package/src/Popover/Popover.doc.mjs +38 -2
  1285. package/src/Popover/Popover.spec.md +89 -10
  1286. package/src/Popover/Popover.test.tsx +340 -2
  1287. package/src/Popover/Popover.tsx +401 -35
  1288. package/src/Popover/PopoverPresentation.test.tsx +952 -0
  1289. package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +205 -0
  1290. package/src/Popover/index.ts +5 -1
  1291. package/src/Popover/lazyPopoverBottomSheet.ts +57 -0
  1292. package/src/Popover/usePopover.tsx +11 -5
  1293. package/src/PowerSearch/PowerSearch.spec.md +423 -53
  1294. package/src/PowerSearch/PowerSearch.test.tsx +77 -1
  1295. package/src/PowerSearch/PowerSearch.tsx +7 -5
  1296. package/src/ProgressBar/ProgressBar.test.tsx +12 -0
  1297. package/src/ProgressBar/ProgressBar.tsx +18 -0
  1298. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +1 -0
  1299. package/src/RadioList/RadioList.test.tsx +34 -7
  1300. package/src/RadioList/RadioListItem.press.source-build.test.mjs +80 -0
  1301. package/src/RadioList/RadioListItem.tsx +26 -12
  1302. package/src/RadioList/__tests__/RadioGroup.a11y.chromium.spec.ts +1 -0
  1303. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +1 -0
  1304. package/src/ScrollableArea/ScrollableArea.spec.md +6 -5
  1305. package/src/ScrollableArea/ScrollableArea.test.tsx +5 -0
  1306. package/src/ScrollableArea/ScrollableArea.tsx +4 -0
  1307. package/src/SelectableCard/SelectableCard.doc.mjs +7 -6
  1308. package/src/SelectableCard/SelectableCard.test.tsx +11 -1
  1309. package/src/SelectableCard/SelectableCard.tsx +49 -33
  1310. package/src/Selector/Selector.spec.md +12 -4
  1311. package/src/Selector/Selector.test.tsx +114 -8
  1312. package/src/Selector/Selector.tsx +19 -4
  1313. package/src/Selector/__tests__/EmptyStateAnnouncement.a11y.chromium.spec.ts +1 -0
  1314. package/src/Selector/__tests__/Listbox.a11y.chromium.spec.ts +1 -0
  1315. package/src/Selector/__tests__/Selector.a11y.chromium.spec.ts +1 -0
  1316. package/src/Selector/__tests__/Selector.combobox.a11y.chromium.spec.ts +1 -0
  1317. package/src/SideNav/SideNav.spec.md +51 -30
  1318. package/src/SideNav/SideNav.test.tsx +290 -25
  1319. package/src/SideNav/SideNavCollapseButton.spec.md +161 -0
  1320. package/src/SideNav/SideNavHeading.spec.md +219 -0
  1321. package/src/SideNav/SideNavHeading.tsx +41 -0
  1322. package/src/SideNav/SideNavItem.spec.md +246 -0
  1323. package/src/SideNav/SideNavItem.tsx +40 -9
  1324. package/src/SideNav/SideNavSection.spec.md +153 -0
  1325. package/src/Skeleton/Skeleton.spec.md +99 -42
  1326. package/src/Skeleton/Skeleton.test.tsx +108 -1
  1327. package/src/Skeleton/Skeleton.tsx +30 -2
  1328. package/src/Slider/Slider.test.tsx +172 -0
  1329. package/src/Slider/Slider.tsx +60 -12
  1330. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +1 -0
  1331. package/src/Spinner/Spinner.spec.md +231 -0
  1332. package/src/StatusDot/StatusDot.spec.md +139 -51
  1333. package/src/StatusDot/StatusDot.test.tsx +13 -0
  1334. package/src/StatusDot/StatusDot.tsx +27 -0
  1335. package/src/Stepper/Step.spec.md +206 -0
  1336. package/src/Stepper/Step.tsx +19 -3
  1337. package/src/Stepper/Stepper.test.tsx +50 -0
  1338. package/src/Switch/Switch.focusRing.source-build.test.mjs +81 -0
  1339. package/src/Switch/Switch.tsx +11 -9
  1340. package/src/Switch/__tests__/Switch.a11y.chromium.spec.ts +1 -0
  1341. package/src/Switch/switch.markers.stylex.ts +7 -2
  1342. package/src/TabList/Tab.spec.md +201 -0
  1343. package/src/TabList/Tab.tsx +7 -1
  1344. package/src/TabList/TabList.doc.mjs +3 -3
  1345. package/src/TabList/TabMenu.spec.md +196 -0
  1346. package/src/TabList/TabMenu.tsx +2 -0
  1347. package/src/TabList/__tests__/TabListOverflow.interaction.browser.spec.ts +99 -0
  1348. package/src/TabList/__tests__/Tabs.a11y.chromium.spec.ts +1 -0
  1349. package/src/Table/Table.spec.md +54 -30
  1350. package/src/Table/TableCell.tsx +6 -0
  1351. package/src/Table/TableHeaderCell.tsx +2 -0
  1352. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +129 -0
  1353. package/src/Table/__tests__/Table.a11y.contracts.ts +35 -0
  1354. package/src/Table/__tests__/Table.a11y.renders.tsx +112 -0
  1355. package/src/Table/__tests__/Table.a11y.states.ts +140 -0
  1356. package/src/Table/__tests__/Table.a11y.test.tsx +198 -0
  1357. package/src/Table/__tests__/TableMinWidth.a11y.chromium.spec.ts +1 -0
  1358. package/src/Table/__tests__/TableScroll.a11y.chromium.spec.ts +1 -0
  1359. package/src/Table/__tests__/TableStickyDividers.a11y.browser.spec.ts +560 -0
  1360. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +23 -8
  1361. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +91 -9
  1362. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +120 -5
  1363. package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.test.tsx +174 -0
  1364. package/src/Table/plugins/sortable/__tests__/useTableSortable.a11y.ts +86 -0
  1365. package/src/Table/plugins/sortable/useTableSortable.test.tsx +0 -12
  1366. package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +51 -1
  1367. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +291 -12
  1368. package/src/Table/rowDivider.ts +154 -0
  1369. package/src/Text/Text.spec.md +114 -127
  1370. package/src/TextArea/TextArea.doc.mjs +6 -6
  1371. package/src/TextArea/TextArea.spec.md +164 -64
  1372. package/src/TextArea/TextArea.test.tsx +65 -6
  1373. package/src/TextArea/TextArea.tsx +27 -15
  1374. package/src/TextInput/TextInput.doc.mjs +8 -8
  1375. package/src/TextInput/TextInput.spec.md +258 -0
  1376. package/src/TextInput/TextInput.test.tsx +83 -10
  1377. package/src/TextInput/TextInput.tsx +46 -22
  1378. package/src/TextInput/__tests__/TextInput.a11y.chromium.spec.ts +1 -0
  1379. package/src/Thumbnail/Thumbnail.doc.mjs +1 -2
  1380. package/src/Thumbnail/Thumbnail.spec.md +244 -0
  1381. package/src/Thumbnail/Thumbnail.test.tsx +120 -7
  1382. package/src/Thumbnail/Thumbnail.tsx +77 -31
  1383. package/src/TimeInput/TimeInput.spec.md +273 -0
  1384. package/src/TimeInput/TimeInput.tsx +12 -4
  1385. package/src/TimeInput/TouchTimeField.tsx +2 -1
  1386. package/src/Timestamp/Timestamp.spec.md +252 -0
  1387. package/src/Toast/ToastViewport.modalHost.test.tsx +630 -5
  1388. package/src/Toast/ToastViewport.tsx +27 -2
  1389. package/src/ToggleButton/ToggleButton.spec.md +256 -0
  1390. package/src/ToggleButton/ToggleButtonGroup.spec.md +194 -0
  1391. package/src/ToggleButton/__tests__/ToggleButton.a11y.chromium.spec.ts +1 -0
  1392. package/src/Token/Token.spec.md +271 -0
  1393. package/src/Token/__tests__/TokenRemoveTarget.a11y.chromium.spec.ts +1 -0
  1394. package/src/Tokenizer/Tokenizer.props-type.test.tsx +126 -0
  1395. package/src/Tokenizer/Tokenizer.spec.md +312 -71
  1396. package/src/Tokenizer/Tokenizer.ssr.test.tsx +196 -0
  1397. package/src/Tokenizer/Tokenizer.test.tsx +70 -16
  1398. package/src/Tokenizer/Tokenizer.tsx +651 -113
  1399. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +2719 -0
  1400. package/src/Tokenizer/TokenizerBottomSheet.tsx +957 -0
  1401. package/src/Tokenizer/__tests__/TokenizerEndLane.a11y.chromium.spec.ts +505 -0
  1402. package/src/Tokenizer/useEndLaneReserve.ts +3 -2
  1403. package/src/Toolbar/Toolbar.spec.md +101 -48
  1404. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +1 -0
  1405. package/src/Tooltip/Tooltip.test.tsx +171 -3
  1406. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +1 -0
  1407. package/src/Tooltip/__tests__/Tooltip.a11y.states.ts +2 -2
  1408. package/src/Tooltip/__tests__/TooltipFocusReturn.a11y.chromium.spec.ts +1 -0
  1409. package/src/Tooltip/__tests__/TooltipHoverBridge.a11y.chromium.spec.ts +1 -0
  1410. package/src/Tooltip/__tests__/TooltipTallContent.a11y.browser.spec.ts +646 -0
  1411. package/src/Tooltip/__tests__/TooltipTallContentTracking.a11y.browser.spec.ts +1162 -0
  1412. package/src/Tooltip/useTooltip.tsx +7 -2
  1413. package/src/TopNav/TopNav.spec.md +190 -0
  1414. package/src/TopNav/TopNavHeading.spec.md +204 -0
  1415. package/src/TopNav/TopNavItem.spec.md +189 -0
  1416. package/src/TopNav/TopNavMegaMenu.reduced-motion.source-build.test.mjs +83 -0
  1417. package/src/TopNav/TopNavMegaMenu.spec.md +190 -0
  1418. package/src/TopNav/TopNavMegaMenu.tsx +21 -4
  1419. package/src/TopNav/TopNavMegaMenuFeaturedCard.spec.md +150 -0
  1420. package/src/TopNav/TopNavMegaMenuItem.spec.md +155 -0
  1421. package/src/TopNav/TopNavMenu.spec.md +195 -0
  1422. package/src/TopNav/__tests__/TopNavMobileLongHeading.a11y.chromium.spec.ts +1 -0
  1423. package/src/TreeList/TreeList.doc.mjs +13 -0
  1424. package/src/TreeList/TreeList.spec.md +51 -35
  1425. package/src/TreeList/TreeList.tsx +234 -2
  1426. package/src/TreeList/TreeListItem.tsx +12 -2
  1427. package/src/TreeList/__tests__/TreeList.a11y.chromium.spec.ts +1 -0
  1428. package/src/TreeList/__tests__/TreeListRowNames.a11y.chromium.spec.ts +1 -0
  1429. package/src/Typeahead/BaseTypeahead.tsx +14 -2
  1430. package/src/Typeahead/Typeahead.test.tsx +114 -1
  1431. package/src/Typeahead/Typeahead.tsx +34 -16
  1432. package/src/VisuallyHidden/VisuallyHidden.doc.mjs +1 -1
  1433. package/src/VisuallyHidden/VisuallyHidden.spec.md +170 -0
  1434. package/src/VisuallyHidden/VisuallyHidden.test.tsx +39 -0
  1435. package/src/VisuallyHidden/VisuallyHidden.tsx +38 -5
  1436. package/src/__tests__/BusyOwnerAnnouncement.test.tsx +66 -5
  1437. package/src/__tests__/CardPress.a11y.chromium.spec.ts +353 -0
  1438. package/src/__tests__/DisabledTriggerFocus.a11y.chromium.spec.ts +2 -1
  1439. package/src/__tests__/PressedState.a11y.chromium.spec.ts +1 -0
  1440. package/src/__tests__/pressState.ts +43 -1
  1441. package/src/__tests__/unthemedLength.ts +34 -0
  1442. package/src/gestures/GestureArena.ts +966 -0
  1443. package/src/gestures/GestureRecognizer.ts +626 -0
  1444. package/src/gestures/LongPressGestureRecognizer.ts +186 -0
  1445. package/src/gestures/PanGestureRecognizer.ts +410 -0
  1446. package/src/gestures/TapGestureRecognizer.ts +192 -0
  1447. package/src/gestures/VelocityTracker.ts +194 -0
  1448. package/src/gestures/__tests__/LongPressGestureRecognizer.test.ts +141 -0
  1449. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +327 -0
  1450. package/src/gestures/__tests__/TapGestureRecognizer.test.ts +154 -0
  1451. package/src/gestures/__tests__/VelocityTracker.test.ts +261 -0
  1452. package/src/gestures/__tests__/arena.test.ts +824 -0
  1453. package/src/gestures/__tests__/arenaContinuous.test.ts +207 -0
  1454. package/src/gestures/__tests__/arenaTapLongPress.test.ts +211 -0
  1455. package/src/gestures/__tests__/harness.ts +204 -0
  1456. package/src/gestures/geometry.ts +55 -0
  1457. package/src/gestures/types.ts +161 -0
  1458. package/src/hooks/AnnounceRenderedText.tsx +27 -0
  1459. package/src/hooks/ModalAnnounceProvider.tsx +155 -0
  1460. package/src/hooks/__tests__/MenuPressShadowRoot.a11y.chromium.spec.ts +98 -4
  1461. package/src/hooks/actionGroupTracker.exports.test.ts +28 -0
  1462. package/src/hooks/actionGroupTracker.test.ts +510 -0
  1463. package/src/hooks/actionGroupTracker.ts +449 -0
  1464. package/src/hooks/index.ts +6 -0
  1465. package/src/hooks/modalAnnounce.ts +439 -0
  1466. package/src/hooks/useAdaptivePresentation.ts +46 -9
  1467. package/src/hooks/useAnimatedLayout.doc.mjs +101 -0
  1468. package/src/hooks/useAnimatedLayout.ts +61 -0
  1469. package/src/hooks/useAnnounce.doc.mjs +4 -4
  1470. package/src/hooks/useAnnounce.modal.test.tsx +1291 -0
  1471. package/src/hooks/useAnnounce.test.tsx +64 -4
  1472. package/src/hooks/useAnnounce.ts +452 -28
  1473. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +226 -0
  1474. package/src/hooks/useAnnounceRenderedText.ts +81 -11
  1475. package/src/hooks/useBusyAnnouncement.adopters.test.tsx +69 -0
  1476. package/src/hooks/useBusyAnnouncement.test.tsx +112 -0
  1477. package/src/hooks/useBusyAnnouncement.ts +64 -54
  1478. package/src/hooks/useFocusTrap.doc.mjs +3 -3
  1479. package/src/hooks/useFocusTrap.test.tsx +135 -2
  1480. package/src/hooks/useFocusTrap.ts +59 -27
  1481. package/src/hooks/useMenuPress.doc.mjs +2 -2
  1482. package/src/hooks/useMenuPress.test.tsx +5 -2
  1483. package/src/hooks/useMenuPress.ts +72 -37
  1484. package/src/hooks/useScrollableArea.test.tsx +159 -0
  1485. package/src/hooks/useScrollableArea.ts +39 -5
  1486. package/src/i18n/generated-locales/en.generated.ts +35 -0
  1487. package/src/i18n/generated-locales/pseudo.generated.ts +37 -0
  1488. package/src/internal/tokenizer-presentation.test.ts +29 -0
  1489. package/src/internal/tokenizer-presentation.ts +25 -0
  1490. package/src/internal/touch.test.ts +44 -0
  1491. package/src/internal/touch.ts +41 -0
  1492. package/src/motion/LayoutChangeSnapshot.tsx +50 -0
  1493. package/src/motion/MEASUREMENTS.md +271 -0
  1494. package/src/motion/README.md +218 -0
  1495. package/src/motion/__tests__/animatedLayout.interaction.browser.spec.ts +1507 -0
  1496. package/src/motion/__tests__/animatedLayoutAdopters.interaction.browser.spec.ts +217 -0
  1497. package/src/motion/__tests__/animatedLayoutBundle.ts +17 -0
  1498. package/src/motion/animatedLayout.boundary.test.ts +139 -0
  1499. package/src/motion/animatedLayout.test.ts +965 -0
  1500. package/src/motion/animatedLayout.ts +1322 -0
  1501. package/src/motion/animatedLayoutAdopters.test.tsx +500 -0
  1502. package/src/motion/animator.test.ts +2653 -0
  1503. package/src/motion/animator.ts +2794 -0
  1504. package/src/motion/bezier.test.ts +52 -0
  1505. package/src/motion/bezier.ts +64 -0
  1506. package/src/motion/coast.test.ts +99 -0
  1507. package/src/motion/coast.ts +150 -0
  1508. package/src/motion/decay.test.ts +120 -0
  1509. package/src/motion/decay.ts +126 -0
  1510. package/src/motion/projection.test.ts +107 -0
  1511. package/src/motion/projection.ts +116 -0
  1512. package/src/motion/reducedMotion.stylex.ts +41 -0
  1513. package/src/motion/reducedMotion.test.ts +129 -0
  1514. package/src/motion/reducedMotion.ts +94 -0
  1515. package/src/motion/reducedMotionPlan.test.ts +182 -0
  1516. package/src/motion/reducedMotionPlan.ts +263 -0
  1517. package/src/motion/resolveSnapPoint.test.ts +189 -0
  1518. package/src/motion/resolveSnapPoint.ts +169 -0
  1519. package/src/motion/roleValue.ts +105 -0
  1520. package/src/motion/roles.test.ts +256 -0
  1521. package/src/motion/roles.ts +262 -0
  1522. package/src/motion/rubberBand.test.ts +88 -0
  1523. package/src/motion/rubberBand.ts +115 -0
  1524. package/src/motion/selectPage.test.ts +31 -0
  1525. package/src/motion/selectPage.ts +55 -0
  1526. package/src/motion/spring.test.ts +650 -0
  1527. package/src/motion/spring.ts +551 -0
  1528. package/src/motion/uikit/gestures.test.ts +89 -0
  1529. package/src/motion/uikit/gestures.ts +359 -0
  1530. package/src/motion/uikit/index.ts +80 -0
  1531. package/src/motion/uikit/navigation.ts +83 -0
  1532. package/src/motion/uikit/scroll.ts +141 -0
  1533. package/src/motion/uikit/springRows.test.ts +71 -0
  1534. package/src/motion/uikit/springs.ts +514 -0
  1535. package/src/motion/uikit/timing.ts +210 -0
  1536. package/src/motion/uikit/uikit.test.ts +364 -0
  1537. package/src/motion/uikit/values.test.ts +110 -0
  1538. package/src/reset.a11y.chromium.spec.ts +1 -0
  1539. package/src/reset.until-found.a11y.browser.spec.ts +1 -0
  1540. package/src/serverSafeComponents.test.ts +10 -0
  1541. package/src/tailwind-theme.css +51 -1
  1542. package/src/tailwind-theme.test.ts +51 -0
  1543. package/src/theme/Theme.test.tsx +28 -0
  1544. package/src/theme/__tests__/SpacingRootFontSize.a11y.chromium.spec.ts +1 -0
  1545. package/src/theme/declarationBoundary.ts +282 -1
  1546. package/src/theme/defineTheme.test.ts +529 -12
  1547. package/src/theme/defineTheme.ts +175 -19
  1548. package/src/theme/derivedVarRegistry.test.ts +28 -5
  1549. package/src/theme/derivedVarRegistry.ts +4 -0
  1550. package/src/theme/expandMotionScale.test.ts +17 -0
  1551. package/src/theme/generateThemeRules.ts +772 -35
  1552. package/src/theme/index.ts +3 -0
  1553. package/src/theme/onMediaTokens.test.ts +186 -0
  1554. package/src/theme/statusColor.ts +189 -0
  1555. package/src/theme/statusRoleDerivation.ts +289 -0
  1556. package/src/theme/themeAdaptations.test.ts +412 -0
  1557. package/src/theme/themeAdaptations.ts +43 -1
  1558. package/src/theme/tokens.stylex.ts +31 -2
  1559. package/src/theme/tokens.test.ts +96 -1
  1560. package/src/theme/tokens.ts +23 -1
  1561. package/src/theme/useTheme.ts +10 -4
  1562. package/src/utils/customPropertyArmLayering.test.ts +131 -0
  1563. package/src/utils/edgeAutoscroll.test.ts +192 -0
  1564. package/src/utils/edgeAutoscroll.ts +111 -0
  1565. package/src/utils/hitArea.test.ts +628 -0
  1566. package/src/utils/hitArea.ts +770 -0
  1567. package/src/utils/touchPresentation.test.ts +323 -0
  1568. package/src/utils/touchPresentation.ts +153 -0
@@ -0,0 +1,1526 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file BottomSheetReplace.test.tsx
5
+ * @input Uses vitest, @testing-library/react, BottomSheet, BottomSheetSwitcher
6
+ * and the private bottom-sheet stack registry
7
+ * @output Tests for the replace handoff between standalone sheets: when a
8
+ * close and an open in one update are a replace and when they are not, the
9
+ * retained sheet's motion (covered, aligning, fading), one steady scrim,
10
+ * inertness and dismissal order, focus and the inherited opener, rapid
11
+ * reversal and dismissal during a handoff, non-modal sheets, and that
12
+ * switcher flows and lone sheets are untouched
13
+ * @position Core testing; validates the replace path of bottomSheetStack.ts
14
+ * and BottomSheet.tsx
15
+ *
16
+ * SYNC: When bottomSheetStack.ts or BottomSheet.tsx change the replace
17
+ * handoff, update these tests to match.
18
+ */
19
+
20
+ import {act, fireEvent, render, screen} from '@testing-library/react';
21
+ import {useEffect, useRef, useState} from 'react';
22
+ import {afterEach, beforeEach, describe, expect, it, vi} from 'vitest';
23
+ import {BottomSheet} from './BottomSheet';
24
+ import {REDUCED_MOTION_COARSE_QUERY} from './BottomSheetPanel';
25
+ import {BottomSheetSwitcher} from './BottomSheetSwitcher';
26
+ import {
27
+ getBottomSheetStackForTests,
28
+ resetBottomSheetStackForTests,
29
+ } from './bottomSheetStack';
30
+ import {__resetInteractionModalityForTest} from '../utils/interactionModality';
31
+
32
+ let nativeLog: {
33
+ call: 'showModal' | 'show' | 'close' | 'showPopover' | 'hidePopover';
34
+ dialog: HTMLElement;
35
+ }[] = [];
36
+
37
+ beforeEach(() => {
38
+ nativeLog = [];
39
+ resetBottomSheetStackForTests();
40
+ __resetInteractionModalityForTest();
41
+ HTMLDialogElement.prototype.showModal = vi.fn(function (
42
+ this: HTMLDialogElement,
43
+ ) {
44
+ nativeLog.push({call: 'showModal', dialog: this});
45
+ this.setAttribute('open', '');
46
+ });
47
+ HTMLDialogElement.prototype.show = vi.fn(function (this: HTMLDialogElement) {
48
+ nativeLog.push({call: 'show', dialog: this});
49
+ this.setAttribute('open', '');
50
+ });
51
+ // A non-modal sheet is a manual popover; jsdom's stand-ins keep the same
52
+ // `open` marker the dialog paths use (the Drawer tests do the same).
53
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
54
+ nativeLog.push({call: 'showPopover', dialog: this});
55
+ this.setAttribute('open', '');
56
+ });
57
+ HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
58
+ nativeLog.push({call: 'hidePopover', dialog: this});
59
+ this.removeAttribute('open');
60
+ });
61
+ HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
62
+ nativeLog.push({call: 'close', dialog: this});
63
+ this.removeAttribute('open');
64
+ });
65
+ if (!Element.prototype.setPointerCapture) {
66
+ Element.prototype.setPointerCapture = vi.fn();
67
+ Element.prototype.releasePointerCapture = vi.fn();
68
+ }
69
+ window.scrollTo = vi.fn();
70
+ vi.stubGlobal(
71
+ 'matchMedia',
72
+ vi.fn().mockReturnValue({
73
+ matches: false,
74
+ media: '',
75
+ onchange: null,
76
+ addEventListener: vi.fn(),
77
+ removeEventListener: vi.fn(),
78
+ addListener: vi.fn(),
79
+ removeListener: vi.fn(),
80
+ dispatchEvent: vi.fn(),
81
+ }),
82
+ );
83
+ vi.stubGlobal(
84
+ 'requestAnimationFrame',
85
+ vi.fn((callback: FrameRequestCallback) => {
86
+ callback(0);
87
+ return 1;
88
+ }),
89
+ );
90
+ vi.stubGlobal('cancelAnimationFrame', vi.fn());
91
+ });
92
+
93
+ afterEach(() => {
94
+ vi.unstubAllGlobals();
95
+ });
96
+
97
+ // ---------------------------------------------------------------------------
98
+ // Helpers
99
+ // ---------------------------------------------------------------------------
100
+
101
+ function getDialog(label: string): HTMLDialogElement {
102
+ const dialog = document.querySelector<HTMLDialogElement>(
103
+ `dialog[aria-label="${label}"]`,
104
+ );
105
+ if (dialog == null) {
106
+ throw new Error(`dialog "${label}" not found`);
107
+ }
108
+ return dialog;
109
+ }
110
+
111
+ function getPanel(dialog: HTMLElement): HTMLElement {
112
+ const panel = Array.from(
113
+ dialog.querySelectorAll<HTMLElement>('.astryx-bottom-sheet'),
114
+ ).find(candidate => candidate.closest('dialog') === dialog);
115
+ if (panel == null) {
116
+ throw new Error('sheet panel not found');
117
+ }
118
+ return panel;
119
+ }
120
+
121
+ function scrim(dialog: HTMLElement): string {
122
+ return dialog.style.getPropertyValue('--_sheet-scrim-opacity');
123
+ }
124
+
125
+ function calls(): string[] {
126
+ return nativeLog.map(
127
+ entry => `${entry.call}:${entry.dialog.getAttribute('aria-label') ?? '?'}`,
128
+ );
129
+ }
130
+
131
+ function openDialogs(): string[] {
132
+ return Array.from(document.querySelectorAll('dialog[open]')).map(
133
+ dialog => dialog.getAttribute('aria-label') ?? '?',
134
+ );
135
+ }
136
+
137
+ /** `label:state` for every registered sheet, bottom to top. */
138
+ function summary(): string[] {
139
+ return getBottomSheetStackForTests().map(({element, isOpen, view}) => {
140
+ const label = element?.getAttribute('aria-label') ?? '?';
141
+ const state = isOpen
142
+ ? view.isReplacing
143
+ ? 'replacing'
144
+ : view.isTop
145
+ ? 'top'
146
+ : 'covered'
147
+ : view.replacedMotion != null
148
+ ? `replaced-${view.replacedMotion}`
149
+ : 'exiting';
150
+ return `${label}:${state}:${view.depth}`;
151
+ });
152
+ }
153
+
154
+ function endMotion(dialog: HTMLElement, propertyName: 'transform' | 'opacity') {
155
+ fireEvent.transitionEnd(getPanel(dialog), {propertyName});
156
+ }
157
+
158
+ function pressEscape(): void {
159
+ document.dispatchEvent(
160
+ new KeyboardEvent('keydown', {
161
+ key: 'Escape',
162
+ bubbles: true,
163
+ cancelable: true,
164
+ }),
165
+ );
166
+ }
167
+
168
+ /** Give an element a fixed box, the way the browser would lay it out. */
169
+ function layout(element: HTMLElement, top: number, height: number) {
170
+ element.getBoundingClientRect = () => new DOMRect(0, top, 390, height);
171
+ }
172
+
173
+ type Step = 'one' | 'two' | 'three' | null;
174
+
175
+ /**
176
+ * A three-step flow of standalone sheets: one state value names the open
177
+ * step, so moving on closes one sheet and opens the next in one update.
178
+ */
179
+ function Flow({
180
+ hasScrim = true,
181
+ initialStep = null,
182
+ withBystander = false,
183
+ reversed = false,
184
+ twoHasAutofocusField = false,
185
+ }: {
186
+ hasScrim?: boolean;
187
+ initialStep?: Step;
188
+ withBystander?: boolean;
189
+ /** Write the steps in reverse order in the tree (three, two, one). */
190
+ reversed?: boolean;
191
+ /** Step two carries a `data-autofocus` field. */
192
+ twoHasAutofocusField?: boolean;
193
+ }) {
194
+ const [step, setStep] = useState<Step>(initialStep);
195
+ const [isBystanderOpen, setIsBystanderOpen] = useState(false);
196
+ const stepProps = (own: Step) => ({
197
+ isOpen: step === own,
198
+ onOpenChange: (isOpen: boolean) => {
199
+ if (!isOpen) {
200
+ setStep(current => (current === own ? null : current));
201
+ }
202
+ },
203
+ hasScrim,
204
+ });
205
+ const steps = [
206
+ <BottomSheet key="one" {...stepProps('one')} label="One">
207
+ <button type="button" onClick={() => setStep('two')}>
208
+ Continue to two
209
+ </button>
210
+ <button type="button" onClick={() => setIsBystanderOpen(true)}>
211
+ Open bystander
212
+ </button>
213
+ </BottomSheet>,
214
+ <BottomSheet key="two" {...stepProps('two')} label="Two">
215
+ {twoHasAutofocusField ? <input aria-label="Name" data-autofocus /> : null}
216
+ <button type="button" onClick={() => setStep('one')}>
217
+ Back to one
218
+ </button>
219
+ <button type="button" onClick={() => setStep('three')}>
220
+ Continue to three
221
+ </button>
222
+ <button type="button" onClick={() => setStep(null)}>
223
+ Finish
224
+ </button>
225
+ </BottomSheet>,
226
+ <BottomSheet key="three" {...stepProps('three')} label="Three">
227
+ <button type="button" onClick={() => setStep('two')}>
228
+ Back to two
229
+ </button>
230
+ </BottomSheet>,
231
+ ];
232
+ return (
233
+ <>
234
+ <button type="button" onClick={() => setStep('one')}>
235
+ Open flow
236
+ </button>
237
+ {withBystander ? (
238
+ <BottomSheet
239
+ isOpen={isBystanderOpen}
240
+ onOpenChange={setIsBystanderOpen}
241
+ label="Bystander">
242
+ bystander
243
+ </BottomSheet>
244
+ ) : null}
245
+ {reversed ? [...steps].reverse() : steps}
246
+ </>
247
+ );
248
+ }
249
+
250
+ /**
251
+ * A real tap: the press that a browser delivers before the click, and that
252
+ * the registry reads to know where the person acted from. A non-modal sheet
253
+ * never takes focus, so `activeElement` says nothing there; the press does.
254
+ */
255
+ function tap(element: HTMLElement) {
256
+ fireEvent.pointerDown(element, {pointerId: 1, button: 0, isPrimary: true});
257
+ fireEvent.click(element);
258
+ }
259
+
260
+ function openFlow() {
261
+ const opener = screen.getByRole('button', {name: 'Open flow'});
262
+ opener.focus();
263
+ fireEvent.click(opener);
264
+ return opener;
265
+ }
266
+
267
+ // ---------------------------------------------------------------------------
268
+ // R1: what is, and is not, a replace
269
+ // ---------------------------------------------------------------------------
270
+
271
+ describe('BottomSheet replace: recognising a replace', () => {
272
+ it('a top sheet closing while another opens in the same update is replaced', () => {
273
+ render(<Flow />);
274
+ openFlow();
275
+ expect(summary()).toEqual(['One:top:0']);
276
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
277
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
278
+ expect(openDialogs()).toEqual(['One', 'Two']);
279
+ expect(getDialog('One')).toHaveAttribute('data-sheet-stack', 'replaced');
280
+ expect(getDialog('Two')).toHaveAttribute('data-sheet-stack', 'top');
281
+ expect(calls()).toEqual(['showModal:One', 'showModal:Two']);
282
+ });
283
+
284
+ it('a sheet opening over an open sheet is a push, not a replace', () => {
285
+ render(<Flow withBystander />);
286
+ openFlow();
287
+ fireEvent.click(screen.getByRole('button', {name: 'Open bystander'}));
288
+ expect(summary()).toEqual(['One:covered:1', 'Bystander:top:0']);
289
+ expect(getDialog('One')).toHaveAttribute('data-sheet-stack', 'covered');
290
+ });
291
+
292
+ it('a sheet closing on its own is a pop, not a replace', () => {
293
+ render(<Flow initialStep="two" />);
294
+ fireEvent.click(screen.getByRole('button', {name: 'Finish'}));
295
+ expect(summary()).toEqual(['Two:exiting:0']);
296
+ expect(getDialog('Two')).not.toHaveAttribute('data-sheet-stack');
297
+ });
298
+
299
+ it('a close and an open in different updates are a pop and a push', () => {
300
+ render(<Flow initialStep="two" />);
301
+ fireEvent.click(screen.getByRole('button', {name: 'Finish'}));
302
+ fireEvent.click(screen.getByRole('button', {name: 'Open flow'}));
303
+ expect(summary()).toEqual(['Two:exiting:1', 'One:top:0']);
304
+ });
305
+
306
+ it('a covered sheet closing while a sheet opens is not a replace', () => {
307
+ // Bystander is open over step one; one update closes the covered step
308
+ // one (not the top) and opens step two: two pushes over the bystander
309
+ // and one slides out beneath it.
310
+ function Harness() {
311
+ const [isOneOpen, setIsOneOpen] = useState(true);
312
+ const [isBystanderOpen, setIsBystanderOpen] = useState(false);
313
+ const [isTwoOpen, setIsTwoOpen] = useState(false);
314
+ return (
315
+ <>
316
+ <button
317
+ type="button"
318
+ onClick={() => {
319
+ setIsOneOpen(false);
320
+ setIsTwoOpen(true);
321
+ }}>
322
+ Swap beneath
323
+ </button>
324
+ <BottomSheet
325
+ isOpen={isOneOpen}
326
+ onOpenChange={setIsOneOpen}
327
+ label="One">
328
+ <button type="button" onClick={() => setIsBystanderOpen(true)}>
329
+ Open bystander
330
+ </button>
331
+ </BottomSheet>
332
+ <BottomSheet
333
+ isOpen={isBystanderOpen}
334
+ onOpenChange={setIsBystanderOpen}
335
+ label="Bystander">
336
+ x
337
+ </BottomSheet>
338
+ <BottomSheet
339
+ isOpen={isTwoOpen}
340
+ onOpenChange={setIsTwoOpen}
341
+ label="Two">
342
+ x
343
+ </BottomSheet>
344
+ </>
345
+ );
346
+ }
347
+ render(<Harness />);
348
+ fireEvent.click(screen.getByRole('button', {name: 'Open bystander'}));
349
+ expect(summary()).toEqual(['One:covered:1', 'Bystander:top:0']);
350
+ fireEvent.click(screen.getByRole('button', {name: 'Swap beneath'}));
351
+ expect(summary()).toEqual([
352
+ 'One:exiting:2',
353
+ 'Bystander:covered:1',
354
+ 'Two:top:0',
355
+ ]);
356
+ });
357
+
358
+ it('a switcher flow closing while a standalone sheet opens is never paired', () => {
359
+ function Harness() {
360
+ const [active, setActive] = useState<string | null>('step');
361
+ const [isSheetOpen, setIsSheetOpen] = useState(false);
362
+ return (
363
+ <>
364
+ <button
365
+ type="button"
366
+ onClick={() => {
367
+ setActive(null);
368
+ setIsSheetOpen(true);
369
+ }}>
370
+ Leave flow for sheet
371
+ </button>
372
+ <BottomSheetSwitcher
373
+ activeSheet={active}
374
+ onActiveSheetChange={setActive}
375
+ aria-label="Flow">
376
+ <BottomSheet sheetId="step" label="Step">
377
+ x
378
+ </BottomSheet>
379
+ </BottomSheetSwitcher>
380
+ <BottomSheet
381
+ isOpen={isSheetOpen}
382
+ onOpenChange={setIsSheetOpen}
383
+ label="Sheet">
384
+ x
385
+ </BottomSheet>
386
+ </>
387
+ );
388
+ }
389
+ render(<Harness />);
390
+ fireEvent.click(screen.getByRole('button', {name: 'Leave flow for sheet'}));
391
+ expect(summary()).toEqual(['Flow:exiting:1', 'Sheet:top:0']);
392
+ });
393
+
394
+ it('a sheet on its own carries no replace state', () => {
395
+ render(<Flow />);
396
+ openFlow();
397
+ const [one] = getBottomSheetStackForTests();
398
+ expect(one.view).toMatchObject({
399
+ replacedMotion: null,
400
+ alignmentOffset: 0,
401
+ isReplacing: false,
402
+ isStacked: false,
403
+ });
404
+ expect(getDialog('One')).not.toHaveAttribute('data-sheet-stack');
405
+ expect(calls()).toEqual(['showModal:One']);
406
+ });
407
+ });
408
+
409
+ // ---------------------------------------------------------------------------
410
+ // R2: the handoff
411
+ // ---------------------------------------------------------------------------
412
+
413
+ describe('BottomSheet replace: the handoff', () => {
414
+ it('keeps the replaced sheet in place, inert and hidden, while the new sheet enters', () => {
415
+ render(<Flow />);
416
+ openFlow();
417
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
418
+ const one = getDialog('One');
419
+ const two = getDialog('Two');
420
+ expect(one.open).toBe(true);
421
+ expect(one).toHaveAttribute('inert');
422
+ expect(one).toHaveAttribute('aria-hidden', 'true');
423
+ expect(one).not.toHaveAttribute('aria-modal');
424
+ expect(two).toHaveAttribute('aria-modal', 'true');
425
+ expect(two).not.toHaveAttribute('inert');
426
+ // Not receded: a replaced sheet is at the new sheet's level, not under it.
427
+ expect(one).not.toHaveAttribute('data-sheet-stack-depth');
428
+ // The retained panel stays put (no exit transform) and takes no pointer.
429
+ expect(getPanel(one).style.transform).toBe('');
430
+ expect(getComputedStyle(getPanel(one)).pointerEvents).toBe('none');
431
+ });
432
+
433
+ it('fades the replaced sheet only after the entering motion completes, then closes its dialog', () => {
434
+ render(<Flow />);
435
+ openFlow();
436
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
437
+ const one = getDialog('One');
438
+ const two = getDialog('Two');
439
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
440
+ endMotion(two, 'transform');
441
+ expect(summary()).toEqual(['One:replaced-fading:0', 'Two:replacing:0']);
442
+ expect(one.open).toBe(true);
443
+ endMotion(one, 'opacity');
444
+ expect(summary()).toEqual(['Two:top:0']);
445
+ expect(openDialogs()).toEqual(['Two']);
446
+ expect(calls()).toEqual(['showModal:One', 'showModal:Two', 'close:One']);
447
+ expect(two).not.toHaveAttribute('data-sheet-stack');
448
+ });
449
+
450
+ it('moves a taller replaced sheet down to the entering sheet, concurrently, and fades after both finish', () => {
451
+ render(<Flow />);
452
+ openFlow();
453
+ const one = getDialog('One');
454
+ const two = getDialog('Two');
455
+ // Step one is 400px tall; step two will rest 160px lower. The panels are
456
+ // mounted already, so lay them out before the switch: the alignment is
457
+ // measured when the entering motion starts.
458
+ layout(getPanel(one), 444, 400);
459
+ layout(getPanel(two).parentElement as HTMLElement, 604, 240);
460
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
461
+ expect(summary()).toEqual(['One:replaced-aligning:0', 'Two:replacing:0']);
462
+ expect(getPanel(one).style.transform).toBe('translateY(160px)');
463
+ // Entering finished first: wait for the alignment.
464
+ endMotion(two, 'transform');
465
+ expect(summary()).toEqual(['One:replaced-aligning:0', 'Two:replacing:0']);
466
+ endMotion(one, 'transform');
467
+ expect(summary()).toEqual(['One:replaced-fading:0', 'Two:replacing:0']);
468
+ endMotion(one, 'opacity');
469
+ expect(summary()).toEqual(['Two:top:0']);
470
+ });
471
+
472
+ it('waits for the entering motion when the alignment finishes first', () => {
473
+ render(<Flow />);
474
+ openFlow();
475
+ const one = getDialog('One');
476
+ const two = getDialog('Two');
477
+ layout(getPanel(one), 444, 400);
478
+ layout(getPanel(two).parentElement as HTMLElement, 604, 240);
479
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
480
+ endMotion(one, 'transform');
481
+ expect(summary()).toEqual(['One:replaced-aligning:0', 'Two:replacing:0']);
482
+ endMotion(two, 'transform');
483
+ expect(summary()).toEqual(['One:replaced-fading:0', 'Two:replacing:0']);
484
+ });
485
+
486
+ it('leaves a shorter replaced sheet where it is', () => {
487
+ render(<Flow />);
488
+ openFlow();
489
+ const one = getDialog('One');
490
+ const two = getDialog('Two');
491
+ layout(getPanel(one), 604, 240);
492
+ layout(getPanel(two).parentElement as HTMLElement, 444, 400);
493
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
494
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
495
+ expect(getPanel(one).style.transform).toBe('');
496
+ });
497
+
498
+ it('keeps the scrim on the replaced sheet and hands it to the new sheet with no fade', () => {
499
+ render(<Flow />);
500
+ openFlow();
501
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
502
+ const one = getDialog('One');
503
+ const two = getDialog('Two');
504
+ expect(scrim(one)).toBe('1');
505
+ expect(scrim(two)).toBe('0');
506
+ // The flip to 1 lands with the transition pinned to 0s (rAF is
507
+ // synchronous here, so the pin is lifted again by the time we look).
508
+ const pins: string[] = [];
509
+ const setProperty = CSSStyleDeclaration.prototype.setProperty;
510
+ CSSStyleDeclaration.prototype.setProperty = function (name, value) {
511
+ if (
512
+ this === two.style &&
513
+ name === '--_sheet-scrim-opacity' &&
514
+ value === '1'
515
+ ) {
516
+ pins.push(this.getPropertyValue('--_sheet-scrim-duration'));
517
+ }
518
+ return setProperty.call(this, name, value);
519
+ };
520
+ endMotion(two, 'transform');
521
+ endMotion(one, 'opacity');
522
+ CSSStyleDeclaration.prototype.setProperty = setProperty;
523
+ expect(scrim(two)).toBe('1');
524
+ expect(pins[0]).toBe('0s');
525
+ expect(two.style.getPropertyValue('--_sheet-scrim-duration')).toBe('');
526
+ expect(one.open).toBe(false);
527
+ });
528
+
529
+ it('runs the replace one level up a stack and leaves the sheet beneath covered', () => {
530
+ function Harness() {
531
+ const [isBaseOpen, setIsBaseOpen] = useState(true);
532
+ const [step, setStep] = useState<'a' | 'b' | null>('a');
533
+ return (
534
+ <>
535
+ <BottomSheet
536
+ isOpen={isBaseOpen}
537
+ onOpenChange={setIsBaseOpen}
538
+ label="Base">
539
+ x
540
+ </BottomSheet>
541
+ <BottomSheet
542
+ isOpen={step === 'a'}
543
+ onOpenChange={o => !o && setStep(null)}
544
+ label="A">
545
+ <button type="button" onClick={() => setStep('b')}>
546
+ Next
547
+ </button>
548
+ </BottomSheet>
549
+ <BottomSheet
550
+ isOpen={step === 'b'}
551
+ onOpenChange={o => !o && setStep(null)}
552
+ label="B">
553
+ x
554
+ </BottomSheet>
555
+ </>
556
+ );
557
+ }
558
+ render(<Harness />);
559
+ expect(summary()).toEqual(['Base:covered:1', 'A:top:0']);
560
+ fireEvent.click(screen.getByRole('button', {name: 'Next'}));
561
+ expect(summary()).toEqual([
562
+ 'Base:covered:1',
563
+ 'A:replaced-covered:0',
564
+ 'B:replacing:0',
565
+ ]);
566
+ expect(scrim(getDialog('Base'))).toBe('1');
567
+ expect(scrim(getDialog('A'))).toBe('0');
568
+ expect(scrim(getDialog('B'))).toBe('0');
569
+ endMotion(getDialog('B'), 'transform');
570
+ endMotion(getDialog('A'), 'opacity');
571
+ expect(summary()).toEqual(['Base:covered:1', 'B:top:0']);
572
+ expect(scrim(getDialog('Base'))).toBe('1');
573
+ expect(scrim(getDialog('B'))).toBe('0');
574
+ });
575
+ });
576
+
577
+ // ---------------------------------------------------------------------------
578
+ // R3: focus, dismissal, and interruptions
579
+ // ---------------------------------------------------------------------------
580
+
581
+ describe('BottomSheet replace: focus and dismissal', () => {
582
+ it('moves focus into the entering sheet and keeps it there when the replaced dialog closes', () => {
583
+ render(<Flow />);
584
+ openFlow();
585
+ const one = getDialog('One');
586
+ const two = getDialog('Two');
587
+ const next = screen.getByRole('button', {name: 'Continue to two'});
588
+ next.focus();
589
+ fireEvent.click(next);
590
+ expect(document.activeElement).toBe(getPanel(two));
591
+ endMotion(two, 'transform');
592
+ endMotion(one, 'opacity');
593
+ expect(document.activeElement).toBe(getPanel(two));
594
+ });
595
+
596
+ it.each([
597
+ ['modal', true],
598
+ ['non-modal', false],
599
+ ] as const)(
600
+ 'a %s step entering by a replace focuses its data-autofocus field, even though the native focusing steps already put focus on its panel',
601
+ (_name, hasScrim) => {
602
+ // What a browser does: showModal() (or the panel focus of a non-modal
603
+ // host) moves focus to the entering panel before the registry places
604
+ // it. The stubs here reproduce that instead of leaving focus on the
605
+ // pressed button, so the placement has to run after the native steps
606
+ // and must not stop at "focus is already inside".
607
+ const focusPanelOnShow = function (this: HTMLElement) {
608
+ this.setAttribute('open', '');
609
+ this.querySelector<HTMLElement>('.astryx-bottom-sheet')?.focus();
610
+ };
611
+ HTMLDialogElement.prototype.showModal = vi.fn(focusPanelOnShow);
612
+ HTMLElement.prototype.showPopover = vi.fn(focusPanelOnShow);
613
+ render(<Flow hasScrim={hasScrim} twoHasAutofocusField />);
614
+ openFlow();
615
+ const two = getDialog('Two');
616
+ const next = screen.getByRole('button', {name: 'Continue to two'});
617
+ next.focus();
618
+ fireEvent.click(next);
619
+ const field = screen.getByRole('textbox', {name: 'Name'});
620
+ expect(two.contains(field)).toBe(true);
621
+ expect(document.activeElement).toBe(field);
622
+ endMotion(two, 'transform');
623
+ endMotion(getDialog('One'), 'opacity');
624
+ expect(document.activeElement).toBe(field);
625
+ },
626
+ );
627
+
628
+ it('a step entering by a replace without a data-autofocus field keeps the focus the native steps put on its panel', () => {
629
+ HTMLDialogElement.prototype.showModal = vi.fn(function (this: HTMLElement) {
630
+ this.setAttribute('open', '');
631
+ this.querySelector<HTMLElement>('.astryx-bottom-sheet')?.focus();
632
+ });
633
+ render(<Flow />);
634
+ openFlow();
635
+ const two = getDialog('Two');
636
+ const next = screen.getByRole('button', {name: 'Continue to two'});
637
+ next.focus();
638
+ fireEvent.click(next);
639
+ expect(document.activeElement).toBe(getPanel(two));
640
+ });
641
+
642
+ it('returns focus to the element that opened the flow when the replacing sheet closes it', () => {
643
+ render(<Flow />);
644
+ const opener = openFlow();
645
+ const next = screen.getByRole('button', {name: 'Continue to two'});
646
+ next.focus();
647
+ fireEvent.click(next);
648
+ const one = getDialog('One');
649
+ const two = getDialog('Two');
650
+ endMotion(two, 'transform');
651
+ endMotion(one, 'opacity');
652
+ fireEvent.click(screen.getByRole('button', {name: 'Finish'}));
653
+ endMotion(two, 'transform');
654
+ expect(openDialogs()).toEqual([]);
655
+ expect(document.activeElement).toBe(opener);
656
+ });
657
+
658
+ it('routes Escape to the replacing sheet, not the replaced one, during the handoff', () => {
659
+ render(<Flow />);
660
+ openFlow();
661
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
662
+ act(() => {
663
+ pressEscape();
664
+ });
665
+ // Two closed the flow; one was dropped at once; both leave.
666
+ expect(summary()).toEqual(['Two:exiting:0']);
667
+ expect(getDialog('One').open).toBe(false);
668
+ expect(getDialog('Two').open).toBe(true);
669
+ });
670
+
671
+ it('routes Escape to the sheet that came back, during a reversal', () => {
672
+ render(<Flow initialStep="two" />);
673
+ fireEvent.click(screen.getByRole('button', {name: 'Back to one'}));
674
+ expect(summary()).toEqual(['Two:replaced-covered:0', 'One:replacing:0']);
675
+ act(() => {
676
+ pressEscape();
677
+ });
678
+ expect(summary()).toEqual(['One:exiting:0']);
679
+ });
680
+
681
+ it('drops the replaced sheet at once when the replacing sheet is dismissed mid-handoff', () => {
682
+ render(<Flow />);
683
+ openFlow();
684
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
685
+ const one = getDialog('One');
686
+ const two = getDialog('Two');
687
+ fireEvent.click(screen.getByRole('button', {name: 'Finish'}));
688
+ expect(one.open).toBe(false);
689
+ expect(two.open).toBe(true);
690
+ expect(scrim(two)).toBe('0');
691
+ endMotion(two, 'transform');
692
+ expect(openDialogs()).toEqual([]);
693
+ });
694
+
695
+ it('a reversal mid-handoff replaces the replacing sheet with the one coming back, on top', () => {
696
+ render(<Flow />);
697
+ openFlow();
698
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
699
+ fireEvent.click(screen.getByRole('button', {name: 'Back to one'}));
700
+ // One was already in place: its entrance completes at once and two
701
+ // fades straight away, as a switcher step coming back does.
702
+ expect(summary()).toEqual(['Two:replaced-fading:0', 'One:replacing:0']);
703
+ const one = getDialog('One');
704
+ const two = getDialog('Two');
705
+ expect(one.open).toBe(true);
706
+ expect(two.open).toBe(true);
707
+ // Only one is re-shown, above two; two keeps its place, its backdrop
708
+ // (the scrim stays with the retained sheet) and its motion in flight.
709
+ expect(calls()).toEqual([
710
+ 'showModal:One',
711
+ 'showModal:Two',
712
+ 'close:One',
713
+ 'showModal:One',
714
+ ]);
715
+ expect(scrim(two)).toBe('1');
716
+ expect(scrim(one)).toBe('0');
717
+ expect(getPanel(one).style.transform).toBe('');
718
+ expect(document.activeElement).toBe(getPanel(one));
719
+ endMotion(two, 'opacity');
720
+ expect(summary()).toEqual(['One:top:0']);
721
+ expect(scrim(one)).toBe('1');
722
+ });
723
+
724
+ describe.each([
725
+ {order: 'flow order', reversed: false},
726
+ {order: 'reverse order', reversed: true},
727
+ ])('reversals with the steps written in $order', ({reversed}) => {
728
+ it('Back during a Continue handoff: the returning step takes over at once and the entering step fades', () => {
729
+ render(<Flow reversed={reversed} />);
730
+ openFlow();
731
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
732
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
733
+ fireEvent.click(screen.getByRole('button', {name: 'Back to one'}));
734
+ // One was in place: the fade starts in this very update.
735
+ expect(summary()).toEqual(['Two:replaced-fading:0', 'One:replacing:0']);
736
+ expect(getDialog('One').open).toBe(true);
737
+ expect(getDialog('Two').open).toBe(true);
738
+ endMotion(getDialog('Two'), 'opacity');
739
+ expect(summary()).toEqual(['One:top:0']);
740
+ expect(openDialogs()).toEqual(['One']);
741
+ });
742
+
743
+ it('Continue during a Back handoff: the returning step takes over at once and the entering step fades', () => {
744
+ render(<Flow reversed={reversed} initialStep="two" />);
745
+ fireEvent.click(screen.getByRole('button', {name: 'Back to one'}));
746
+ expect(summary()).toEqual(['Two:replaced-covered:0', 'One:replacing:0']);
747
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
748
+ // Two was in place: it is not dropped by One's close, it comes back
749
+ // and One fades in this very update.
750
+ expect(summary()).toEqual(['One:replaced-fading:0', 'Two:replacing:0']);
751
+ expect(getDialog('One').open).toBe(true);
752
+ expect(getDialog('Two').open).toBe(true);
753
+ expect(document.activeElement).toBe(getPanel(getDialog('Two')));
754
+ endMotion(getDialog('One'), 'opacity');
755
+ expect(summary()).toEqual(['Two:top:0']);
756
+ expect(openDialogs()).toEqual(['Two']);
757
+ });
758
+
759
+ it('a double reversal lands on the step last chosen, with one retained sheet fading', () => {
760
+ render(<Flow reversed={reversed} />);
761
+ openFlow();
762
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
763
+ fireEvent.click(screen.getByRole('button', {name: 'Back to one'}));
764
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
765
+ expect(summary()).toEqual(['One:replaced-fading:0', 'Two:replacing:0']);
766
+ endMotion(getDialog('One'), 'opacity');
767
+ expect(summary()).toEqual(['Two:top:0']);
768
+ });
769
+ });
770
+
771
+ it('after a reversal, closing the flow still returns focus to the flow’s opener', () => {
772
+ render(<Flow />);
773
+ const opener = openFlow();
774
+ tap(screen.getByRole('button', {name: 'Continue to two'}));
775
+ tap(screen.getByRole('button', {name: 'Back to one'}));
776
+ endMotion(getDialog('Two'), 'opacity');
777
+ expect(summary()).toEqual(['One:top:0']);
778
+ act(() => {
779
+ fireEvent.keyDown(getDialog('One'), {key: 'Escape'});
780
+ });
781
+ endMotion(getDialog('One'), 'transform');
782
+ expect(openDialogs()).toEqual([]);
783
+ expect(document.activeElement).toBe(opener);
784
+ });
785
+
786
+ it('a third step mid-handoff drops the first step at once', () => {
787
+ render(<Flow />);
788
+ openFlow();
789
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
790
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to three'}));
791
+ expect(getDialog('One').open).toBe(false);
792
+ expect(summary()).toEqual(['Two:replaced-covered:0', 'Three:replacing:0']);
793
+ });
794
+
795
+ it('a purpose on the replacing sheet governs dismissal', () => {
796
+ function Harness() {
797
+ const [step, setStep] = useState<'a' | 'b' | null>('a');
798
+ return (
799
+ <>
800
+ <BottomSheet
801
+ isOpen={step === 'a'}
802
+ onOpenChange={o => !o && setStep(null)}
803
+ label="A">
804
+ <button type="button" onClick={() => setStep('b')}>
805
+ Next
806
+ </button>
807
+ </BottomSheet>
808
+ <BottomSheet
809
+ isOpen={step === 'b'}
810
+ onOpenChange={o => !o && setStep(null)}
811
+ purpose="required"
812
+ label="B">
813
+ x
814
+ </BottomSheet>
815
+ </>
816
+ );
817
+ }
818
+ render(<Harness />);
819
+ fireEvent.click(screen.getByRole('button', {name: 'Next'}));
820
+ act(() => {
821
+ pressEscape();
822
+ });
823
+ expect(summary()).toEqual(['A:replaced-covered:0', 'B:replacing:0']);
824
+ expect(getDialog('B')).toHaveAttribute('role', 'alertdialog');
825
+ });
826
+ });
827
+
828
+ // ---------------------------------------------------------------------------
829
+ // R4: the boundary — who acted, from where
830
+ // ---------------------------------------------------------------------------
831
+
832
+ /** A step flow whose step change comes from code, after a delay. */
833
+ function Timed() {
834
+ const [step, setStep] = useState<Step>('one');
835
+ return (
836
+ <>
837
+ <BottomSheet
838
+ isOpen={step === 'one'}
839
+ onOpenChange={open => !open && setStep(null)}
840
+ label="One">
841
+ <button
842
+ type="button"
843
+ onClick={() => {
844
+ setTimeout(() => setStep('two'), 500);
845
+ }}>
846
+ Save and continue
847
+ </button>
848
+ </BottomSheet>
849
+ <BottomSheet
850
+ isOpen={step === 'two'}
851
+ onOpenChange={open => !open && setStep(null)}
852
+ label="Two">
853
+ two
854
+ </BottomSheet>
855
+ </>
856
+ );
857
+ }
858
+
859
+ /**
860
+ * A flow whose middle step is an interstitial advanced by code: Submit in
861
+ * Form opens Processing by press; Processing moves on to Done 300 ms later
862
+ * on its own, well inside the press's freshness window.
863
+ */
864
+ function Interstitial({onDone}: {onDone?: () => void}) {
865
+ const [step, setStep] = useState<'form' | 'processing' | 'done' | null>(null);
866
+ return (
867
+ <>
868
+ <button type="button" onClick={() => setStep('form')}>
869
+ Open form
870
+ </button>
871
+ <BottomSheet
872
+ isOpen={step === 'form'}
873
+ onOpenChange={open => !open && setStep(null)}
874
+ label="Form">
875
+ <button type="button" onClick={() => setStep('processing')}>
876
+ Submit
877
+ </button>
878
+ </BottomSheet>
879
+ <BottomSheet
880
+ isOpen={step === 'processing'}
881
+ onOpenChange={open => !open && setStep(null)}
882
+ label="Processing">
883
+ <Advance onElapsed={() => setStep('done')} />
884
+ </BottomSheet>
885
+ <BottomSheet
886
+ isOpen={step === 'done'}
887
+ onOpenChange={open => !open && setStep(null)}
888
+ label="Done">
889
+ <button
890
+ type="button"
891
+ onClick={() => {
892
+ setStep(null);
893
+ onDone?.();
894
+ }}>
895
+ Close
896
+ </button>
897
+ </BottomSheet>
898
+ </>
899
+ );
900
+ }
901
+
902
+ function Advance({onElapsed}: {onElapsed: () => void}) {
903
+ const onElapsedRef = useRef(onElapsed);
904
+ onElapsedRef.current = onElapsed;
905
+ useEffect(() => {
906
+ const id = setTimeout(() => onElapsedRef.current(), 300);
907
+ return () => clearTimeout(id);
908
+ }, []);
909
+ return <span>Processing…</span>;
910
+ }
911
+
912
+ /**
913
+ * `matchMedia` answering true for exactly the queries given; the rest of the
914
+ * stub shape matches the file-level one.
915
+ */
916
+ function stubMedia(matching: ReadonlyArray<string>): void {
917
+ vi.stubGlobal(
918
+ 'matchMedia',
919
+ vi.fn((query: string) => ({
920
+ matches: matching.includes(query),
921
+ media: query,
922
+ onchange: null,
923
+ addEventListener: vi.fn(),
924
+ removeEventListener: vi.fn(),
925
+ addListener: vi.fn(),
926
+ removeListener: vi.fn(),
927
+ dispatchEvent: vi.fn(),
928
+ })),
929
+ );
930
+ }
931
+
932
+ describe('BottomSheet replace: reduced motion (design:reduced-motion)', () => {
933
+ // The CSS itself (no transform travel, an opacity-only cross-fade of at
934
+ // most 200 ms on a coarse pointer, an immediate change on a fine one) is
935
+ // real-browser evidence; here is what ends each motion in each class.
936
+ it('coarse pointer (DR2): an exit ends on its opacity fade, not a transform, and a handoff still closes the retained step after its fade', () => {
937
+ stubMedia([REDUCED_MOTION_COARSE_QUERY]);
938
+ render(<Flow />);
939
+ openFlow();
940
+ const one = getDialog('One');
941
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
942
+ const two = getDialog('Two');
943
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
944
+ // The entering transform is instant; the retained step then fades.
945
+ endMotion(two, 'transform');
946
+ expect(one).toHaveAttribute('open');
947
+ endMotion(one, 'opacity');
948
+ expect(one).not.toHaveAttribute('open');
949
+ expect(summary()).toEqual(['Two:top:0']);
950
+ // A lone exit fades out where it is: a transform end does not close it.
951
+ fireEvent.click(screen.getByRole('button', {name: 'Finish'}));
952
+ endMotion(two, 'transform');
953
+ expect(two).toHaveAttribute('open');
954
+ endMotion(two, 'opacity');
955
+ expect(two).not.toHaveAttribute('open');
956
+ expect(openDialogs()).toEqual([]);
957
+ });
958
+
959
+ it('fine pointer (DR3): an exit ends on its (collapsed) transform, as without the preference', () => {
960
+ stubMedia(['(prefers-reduced-motion: reduce)']);
961
+ render(<Flow />);
962
+ openFlow();
963
+ const one = getDialog('One');
964
+ fireEvent.click(screen.getByRole('button', {name: 'Continue to two'}));
965
+ const two = getDialog('Two');
966
+ endMotion(two, 'transform');
967
+ endMotion(one, 'opacity');
968
+ expect(summary()).toEqual(['Two:top:0']);
969
+ fireEvent.click(screen.getByRole('button', {name: 'Finish'}));
970
+ endMotion(two, 'transform');
971
+ expect(two).not.toHaveAttribute('open');
972
+ expect(openDialogs()).toEqual([]);
973
+ });
974
+ });
975
+
976
+ describe('BottomSheet replace: a press is spent by the replace it made', () => {
977
+ it('a step advanced by code shortly after a Submit press replaces the interstitial, and the final close returns to the opener', () => {
978
+ vi.useFakeTimers();
979
+ try {
980
+ render(<Interstitial />);
981
+ const opener = screen.getByRole('button', {name: 'Open form'});
982
+ opener.focus();
983
+ fireEvent.click(opener);
984
+ const submit = screen.getByRole('button', {name: 'Submit'});
985
+ submit.focus();
986
+ fireEvent.click(submit);
987
+ // Submit's press made Form → Processing a replace…
988
+ expect(summary()).toEqual([
989
+ 'Form:replaced-covered:0',
990
+ 'Processing:replacing:0',
991
+ ]);
992
+ endMotion(getDialog('Processing'), 'transform');
993
+ endMotion(getDialog('Form'), 'opacity');
994
+ // …and is consumed by it: 300 ms later, still inside the press window,
995
+ // the code-driven advance is judged by focus, which is in Processing.
996
+ act(() => {
997
+ vi.advanceTimersByTime(300);
998
+ });
999
+ expect(summary()).toEqual([
1000
+ 'Processing:replaced-covered:0',
1001
+ 'Done:replacing:0',
1002
+ ]);
1003
+ endMotion(getDialog('Done'), 'transform');
1004
+ endMotion(getDialog('Processing'), 'opacity');
1005
+ fireEvent.click(screen.getByRole('button', {name: 'Close'}));
1006
+ endMotion(getDialog('Done'), 'transform');
1007
+ expect(openDialogs()).toEqual([]);
1008
+ expect(opener).toHaveFocus();
1009
+ } finally {
1010
+ vi.useRealTimers();
1011
+ }
1012
+ });
1013
+ });
1014
+
1015
+ describe('BottomSheet replace: unrelated owners', () => {
1016
+ /**
1017
+ * Two owners that know nothing of each other, in one tree: X owns sheet A
1018
+ * and its opener, Y owns sheet B and its opener. A page control closes A
1019
+ * and opens B in one update.
1020
+ */
1021
+ function TwoOwners() {
1022
+ const [isAOpen, setIsAOpen] = useState(false);
1023
+ const [isBOpen, setIsBOpen] = useState(false);
1024
+ return (
1025
+ <>
1026
+ <button type="button" onClick={() => setIsAOpen(true)}>
1027
+ Open A
1028
+ </button>
1029
+ <button type="button" onClick={() => setIsBOpen(true)}>
1030
+ Open B
1031
+ </button>
1032
+ <button
1033
+ type="button"
1034
+ onClick={() => {
1035
+ setIsAOpen(false);
1036
+ setIsBOpen(true);
1037
+ }}>
1038
+ Swap from page
1039
+ </button>
1040
+ <BottomSheet isOpen={isAOpen} onOpenChange={setIsAOpen} label="A">
1041
+ <button
1042
+ type="button"
1043
+ onClick={() => {
1044
+ setIsAOpen(false);
1045
+ setIsBOpen(true);
1046
+ }}>
1047
+ Swap from A
1048
+ </button>
1049
+ </BottomSheet>
1050
+ <BottomSheet isOpen={isBOpen} onOpenChange={setIsBOpen} label="B">
1051
+ <button type="button" onClick={() => setIsBOpen(false)}>
1052
+ Close B
1053
+ </button>
1054
+ </BottomSheet>
1055
+ </>
1056
+ );
1057
+ }
1058
+
1059
+ it('a close and an open driven from a control outside the closing sheet are a pop and a push, each with its own opener', () => {
1060
+ render(<TwoOwners />);
1061
+ const openA = screen.getByRole('button', {name: 'Open A'});
1062
+ openA.focus();
1063
+ fireEvent.click(openA);
1064
+ const swap = screen.getByRole('button', {name: 'Swap from page'});
1065
+ swap.focus();
1066
+ fireEvent.click(swap);
1067
+ // Not a replace: A slides out beneath B, B is a fresh push.
1068
+ expect(summary()).toEqual(['A:exiting:1', 'B:top:0']);
1069
+ expect(getDialog('A')).toHaveAttribute('data-sheet-stack', 'exiting');
1070
+ expect(getDialog('A')).not.toHaveAttribute('data-sheet-stack', 'replaced');
1071
+ endMotion(getDialog('A'), 'transform');
1072
+ expect(summary()).toEqual(['B:top:0']);
1073
+ // B's opener is its own (the control that opened it), not A's.
1074
+ fireEvent.click(screen.getByRole('button', {name: 'Close B'}));
1075
+ endMotion(getDialog('B'), 'transform');
1076
+ expect(swap).toHaveFocus();
1077
+ expect(openA).not.toHaveFocus();
1078
+ });
1079
+
1080
+ it('the same close and open driven from inside the closing sheet are a replace', () => {
1081
+ render(<TwoOwners />);
1082
+ const openA = screen.getByRole('button', {name: 'Open A'});
1083
+ openA.focus();
1084
+ fireEvent.click(openA);
1085
+ // Focus is in A (its panel took it on open).
1086
+ fireEvent.click(screen.getByRole('button', {name: 'Swap from A'}));
1087
+ expect(summary()).toEqual(['A:replaced-covered:0', 'B:replacing:0']);
1088
+ endMotion(getDialog('B'), 'transform');
1089
+ endMotion(getDialog('A'), 'opacity');
1090
+ fireEvent.click(screen.getByRole('button', {name: 'Close B'}));
1091
+ endMotion(getDialog('B'), 'transform');
1092
+ // The flow began at A's opener, so that is where it returns.
1093
+ expect(openA).toHaveFocus();
1094
+ });
1095
+
1096
+ it('reads the press, not focus: a tap inside the closing sheet replaces even when nothing in it is focused', () => {
1097
+ render(<TwoOwners />);
1098
+ const openA = screen.getByRole('button', {name: 'Open A'});
1099
+ openA.focus();
1100
+ fireEvent.click(openA);
1101
+ // Focus leaves the sheet (a browser that does not focus clicked buttons,
1102
+ // or the person tabbed out); the tap still comes from inside A.
1103
+ document.body.focus();
1104
+ tap(screen.getByRole('button', {name: 'Swap from A'}));
1105
+ expect(summary()).toEqual(['A:replaced-covered:0', 'B:replacing:0']);
1106
+ });
1107
+
1108
+ it('reads the press, not focus: a tap outside the closing sheet is not a replace even with focus still inside it', () => {
1109
+ render(<TwoOwners />);
1110
+ fireEvent.click(screen.getByRole('button', {name: 'Open A'}));
1111
+ expect(document.activeElement).toBe(getPanel(getDialog('A')));
1112
+ // Focus is in A's panel (it took it on open); the press is on the page.
1113
+ tap(screen.getByRole('button', {name: 'Swap from page'}));
1114
+ expect(summary()).toEqual(['A:exiting:1', 'B:top:0']);
1115
+ });
1116
+
1117
+ it('a step flow whose steps are wrapped in their own components still replaces', () => {
1118
+ function Step({
1119
+ name,
1120
+ step,
1121
+ setStep,
1122
+ next,
1123
+ }: {
1124
+ name: Step;
1125
+ step: Step;
1126
+ setStep: (step: Step) => void;
1127
+ next: Step;
1128
+ }) {
1129
+ return (
1130
+ <div>
1131
+ <BottomSheet
1132
+ isOpen={step === name}
1133
+ onOpenChange={open => !open && setStep(null)}
1134
+ label={String(name)}>
1135
+ <button type="button" onClick={() => setStep(next)}>
1136
+ Go to {next}
1137
+ </button>
1138
+ </BottomSheet>
1139
+ </div>
1140
+ );
1141
+ }
1142
+ function Wizard() {
1143
+ const [step, setStep] = useState<Step>(null);
1144
+ return (
1145
+ <>
1146
+ <button type="button" onClick={() => setStep('one')}>
1147
+ Start
1148
+ </button>
1149
+ <Step name="one" step={step} setStep={setStep} next="two" />
1150
+ <Step name="two" step={step} setStep={setStep} next="three" />
1151
+ <Step name="three" step={step} setStep={setStep} next={null} />
1152
+ </>
1153
+ );
1154
+ }
1155
+ render(<Wizard />);
1156
+ const start = screen.getByRole('button', {name: 'Start'});
1157
+ start.focus();
1158
+ fireEvent.click(start);
1159
+ fireEvent.click(screen.getByRole('button', {name: 'Go to two'}));
1160
+ expect(summary()).toEqual(['one:replaced-covered:0', 'two:replacing:0']);
1161
+ endMotion(getDialog('two'), 'transform');
1162
+ endMotion(getDialog('one'), 'opacity');
1163
+ fireEvent.click(screen.getByRole('button', {name: 'Go to three'}));
1164
+ expect(summary()).toEqual(['two:replaced-covered:0', 'three:replacing:0']);
1165
+ endMotion(getDialog('three'), 'transform');
1166
+ endMotion(getDialog('two'), 'opacity');
1167
+ fireEvent.click(screen.getByRole('button', {name: 'Go to'}));
1168
+ endMotion(getDialog('three'), 'transform');
1169
+ expect(openDialogs()).toEqual([]);
1170
+ expect(start).toHaveFocus();
1171
+ });
1172
+
1173
+ it('a step change made by code while focus is in the step is a replace (focus cannot be anywhere else under a modal sheet)', () => {
1174
+ vi.useFakeTimers();
1175
+ try {
1176
+ render(<Timed />);
1177
+ fireEvent.click(screen.getByRole('button', {name: 'Save and continue'}));
1178
+ act(() => {
1179
+ vi.advanceTimersByTime(500);
1180
+ });
1181
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
1182
+ } finally {
1183
+ vi.useRealTimers();
1184
+ }
1185
+ });
1186
+
1187
+ it('a press only counts while fresh: an old key press elsewhere does not veto a later replace', () => {
1188
+ vi.useFakeTimers();
1189
+ try {
1190
+ render(<Timed />);
1191
+ // A key pressed on the page a while ago (its target is outside the
1192
+ // sheet); then the sheet's own control, by code, moves the flow on.
1193
+ fireEvent.keyDown(document.body, {key: 'Shift'});
1194
+ act(() => {
1195
+ vi.advanceTimersByTime(1500);
1196
+ });
1197
+ fireEvent.click(screen.getByRole('button', {name: 'Save and continue'}));
1198
+ act(() => {
1199
+ vi.advanceTimersByTime(500);
1200
+ });
1201
+ expect(summary()).toEqual(['One:replaced-covered:0', 'Two:replacing:0']);
1202
+ } finally {
1203
+ vi.useRealTimers();
1204
+ }
1205
+ });
1206
+ });
1207
+
1208
+ // ---------------------------------------------------------------------------
1209
+ // R5: non-modal sheets take no part
1210
+ // ---------------------------------------------------------------------------
1211
+
1212
+ describe('BottomSheet replace: several sheets changing in one update', () => {
1213
+ // A open; B opened from A; a control in B closes A and B and opens C in one
1214
+ // handler. Two closes and one open is not a replace, whichever order the
1215
+ // sheets are written in — the pairing is decided by the commit's final
1216
+ // tally, not by which flips the registry heard first.
1217
+ function ThreeSheets({order}: {order: 'ABC' | 'CBA'}) {
1218
+ const [isAOpen, setIsAOpen] = useState(false);
1219
+ const [isBOpen, setIsBOpen] = useState(false);
1220
+ const [isCOpen, setIsCOpen] = useState(false);
1221
+ const a = (
1222
+ <BottomSheet key="A" isOpen={isAOpen} onOpenChange={setIsAOpen} label="A">
1223
+ <button type="button" onClick={() => setIsBOpen(true)}>
1224
+ Open B
1225
+ </button>
1226
+ </BottomSheet>
1227
+ );
1228
+ const b = (
1229
+ <BottomSheet key="B" isOpen={isBOpen} onOpenChange={setIsBOpen} label="B">
1230
+ <button
1231
+ type="button"
1232
+ onClick={() => {
1233
+ setIsAOpen(false);
1234
+ setIsBOpen(false);
1235
+ setIsCOpen(true);
1236
+ }}>
1237
+ Finish to C
1238
+ </button>
1239
+ </BottomSheet>
1240
+ );
1241
+ const c = (
1242
+ <BottomSheet key="C" isOpen={isCOpen} onOpenChange={setIsCOpen} label="C">
1243
+ <button type="button" onClick={() => setIsCOpen(false)}>
1244
+ Close C
1245
+ </button>
1246
+ </BottomSheet>
1247
+ );
1248
+ return (
1249
+ <>
1250
+ <button type="button" onClick={() => setIsAOpen(true)}>
1251
+ Open A
1252
+ </button>
1253
+ {order === 'ABC' ? [a, b, c] : [c, b, a]}
1254
+ </>
1255
+ );
1256
+ }
1257
+
1258
+ for (const order of ['ABC', 'CBA'] as const) {
1259
+ it(`two closes and one open from inside the top sheet are a pop, a pop and a push, written ${order}`, () => {
1260
+ render(<ThreeSheets order={order} />);
1261
+ const openA = screen.getByRole('button', {name: 'Open A'});
1262
+ openA.focus();
1263
+ fireEvent.click(openA);
1264
+ fireEvent.click(screen.getByRole('button', {name: 'Open B'}));
1265
+ expect(summary()).toEqual(['A:covered:1', 'B:top:0']);
1266
+ fireEvent.click(screen.getByRole('button', {name: 'Finish to C'}));
1267
+ // Neither A nor B is replaced; C is a fresh push above the two exits.
1268
+ expect(getDialog('A')).toHaveAttribute('data-sheet-stack', 'exiting');
1269
+ expect(getDialog('B')).toHaveAttribute('data-sheet-stack', 'exiting');
1270
+ expect(getDialog('C')).toHaveAttribute('data-sheet-stack', 'top');
1271
+ expect(getDialog('A')).not.toHaveAttribute(
1272
+ 'data-sheet-stack',
1273
+ 'replaced',
1274
+ );
1275
+ expect(getDialog('B')).not.toHaveAttribute(
1276
+ 'data-sheet-stack',
1277
+ 'replaced',
1278
+ );
1279
+ endMotion(getDialog('B'), 'transform');
1280
+ endMotion(getDialog('A'), 'transform');
1281
+ expect(summary()).toEqual(['C:top:0']);
1282
+ // C's opener is its own (the control in B that opened it is gone with
1283
+ // B), so closing C does not land on A's opener as a replace would.
1284
+ fireEvent.click(screen.getByRole('button', {name: 'Close C'}));
1285
+ endMotion(getDialog('C'), 'transform');
1286
+ expect(openA).not.toHaveFocus();
1287
+ });
1288
+ }
1289
+
1290
+ it('a pair made early in a commit is undone by a third flip in the same commit', () => {
1291
+ // Same scenario, driven so the registry hears B's close and C's open
1292
+ // before A's close: the pair is made and then undone before paint.
1293
+ render(<ThreeSheets order="CBA" />);
1294
+ fireEvent.click(screen.getByRole('button', {name: 'Open A'}));
1295
+ fireEvent.click(screen.getByRole('button', {name: 'Open B'}));
1296
+ fireEvent.click(screen.getByRole('button', {name: 'Finish to C'}));
1297
+ expect(getDialog('B')).not.toHaveAttribute('data-sheet-stack', 'replaced');
1298
+ expect(getDialog('C')).not.toHaveAttribute('data-sheet-stack', 'replacing');
1299
+ const state = getBottomSheetStackForTests();
1300
+ expect(state.filter(entry => entry.view.isReplacing)).toHaveLength(0);
1301
+ expect(
1302
+ state.filter(entry => entry.view.replacedMotion != null),
1303
+ ).toHaveLength(0);
1304
+ });
1305
+ });
1306
+
1307
+ describe('BottomSheet replace: non-modal sheets', () => {
1308
+ it('non-modal sheets are manual popovers that replace each other without stacking', () => {
1309
+ render(<Flow hasScrim={false} />);
1310
+ openFlow();
1311
+ expect(calls()).toEqual(['showPopover:One']);
1312
+ expect(getDialog('One')).toHaveAttribute('popover', 'manual');
1313
+ // Not a stack level: no modal group entry, no stack attributes, no scrim.
1314
+ expect(getBottomSheetStackForTests()).toEqual([]);
1315
+ expect(getDialog('One')).not.toHaveAttribute('data-sheet-stack');
1316
+ expect(scrim(getDialog('One'))).toBe('');
1317
+ tap(screen.getByRole('button', {name: 'Continue to two'}));
1318
+ // The same handoff as a modal replace, on the non-modal group.
1319
+ expect(
1320
+ getBottomSheetStackForTests(document, false).map(({element, view}) =>
1321
+ [
1322
+ element?.getAttribute('aria-label'),
1323
+ view.replacedMotion ?? (view.isReplacing ? 'replacing' : 'idle'),
1324
+ ].join(':'),
1325
+ ),
1326
+ ).toEqual(['One:covered', 'Two:replacing']);
1327
+ expect(calls()).toEqual(['showPopover:One', 'showPopover:Two']);
1328
+ const one = getDialog('One');
1329
+ const two = getDialog('Two');
1330
+ expect(one).toHaveAttribute('inert');
1331
+ expect(one).toHaveAttribute('aria-hidden', 'true');
1332
+ expect(two).not.toHaveAttribute('aria-modal');
1333
+ expect(getPanel(one).className).not.toContain('sheetClosing');
1334
+ // No stack attributes and no z-index band on either dialog.
1335
+ expect(one).not.toHaveAttribute('data-sheet-stack');
1336
+ expect(two).not.toHaveAttribute('data-sheet-stack');
1337
+ endMotion(two, 'transform');
1338
+ endMotion(one, 'opacity');
1339
+ expect(openDialogs()).toEqual(['Two']);
1340
+ expect(calls()).toEqual([
1341
+ 'showPopover:One',
1342
+ 'showPopover:Two',
1343
+ 'hidePopover:One',
1344
+ ]);
1345
+ // The page stayed interactive: no scroll lock, no focus steal.
1346
+ expect(document.body.style.position).not.toBe('fixed');
1347
+ });
1348
+
1349
+ it('a non-modal reversal re-shows the returning sheet above the other', () => {
1350
+ render(<Flow hasScrim={false} initialStep="two" />);
1351
+ tap(screen.getByRole('button', {name: 'Back to one'}));
1352
+ tap(screen.getByRole('button', {name: 'Continue to two'}));
1353
+ expect(
1354
+ getBottomSheetStackForTests(document, false).map(({element, view}) =>
1355
+ [
1356
+ element?.getAttribute('aria-label'),
1357
+ view.replacedMotion ?? (view.isReplacing ? 'replacing' : 'idle'),
1358
+ ].join(':'),
1359
+ ),
1360
+ ).toEqual(['One:fading', 'Two:replacing']);
1361
+ expect(calls().slice(-2)).toEqual(['hidePopover:Two', 'showPopover:Two']);
1362
+ });
1363
+
1364
+ it('a non-modal flow returns focus to its opener when its last step closes', () => {
1365
+ render(<Flow hasScrim={false} />);
1366
+ const opener = openFlow();
1367
+ const next = screen.getByRole('button', {name: 'Continue to two'});
1368
+ next.focus();
1369
+ tap(next);
1370
+ const one = getDialog('One');
1371
+ const two = getDialog('Two');
1372
+ endMotion(two, 'transform');
1373
+ endMotion(one, 'opacity');
1374
+ const finish = screen.getByRole('button', {name: 'Finish'});
1375
+ finish.focus();
1376
+ fireEvent.click(finish);
1377
+ endMotion(two, 'transform');
1378
+ expect(openDialogs()).toEqual([]);
1379
+ expect(document.activeElement).toBe(opener);
1380
+ });
1381
+
1382
+ describe('with a showPopover() that does not move focus (Safari)', () => {
1383
+ let showPopover: typeof HTMLElement.prototype.showPopover;
1384
+ beforeEach(() => {
1385
+ showPopover = HTMLElement.prototype.showPopover;
1386
+ HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
1387
+ nativeLog.push({call: 'showPopover', dialog: this});
1388
+ this.setAttribute('open', '');
1389
+ });
1390
+ });
1391
+ afterEach(() => {
1392
+ HTMLElement.prototype.showPopover = showPopover;
1393
+ });
1394
+
1395
+ it('a non-modal replace moves focus into the entering step and the final close returns it to the opener', () => {
1396
+ render(<Flow hasScrim={false} />);
1397
+ const opener = openFlow();
1398
+ // A lone non-modal sheet takes no focus on open.
1399
+ expect(document.activeElement).toBe(opener);
1400
+ const next = screen.getByRole('button', {name: 'Continue to two'});
1401
+ next.focus();
1402
+ tap(next);
1403
+ const one = getDialog('One');
1404
+ const two = getDialog('Two');
1405
+ // The person was in step one; the entering step takes focus even
1406
+ // though the browser moved nothing.
1407
+ expect(document.activeElement).toBe(getPanel(two));
1408
+ endMotion(two, 'transform');
1409
+ endMotion(one, 'opacity');
1410
+ expect(document.activeElement).toBe(getPanel(two));
1411
+ const finish = screen.getByRole('button', {name: 'Finish'});
1412
+ finish.focus();
1413
+ fireEvent.click(finish);
1414
+ endMotion(two, 'transform');
1415
+ expect(openDialogs()).toEqual([]);
1416
+ expect(document.activeElement).toBe(opener);
1417
+ });
1418
+
1419
+ it('a non-modal reversal moves focus into the returning step', () => {
1420
+ render(<Flow hasScrim={false} initialStep="two" />);
1421
+ const back = screen.getByRole('button', {name: 'Back to one'});
1422
+ back.focus();
1423
+ tap(back);
1424
+ expect(document.activeElement).toBe(getPanel(getDialog('One')));
1425
+ const forward = screen.getByRole('button', {name: 'Continue to two'});
1426
+ forward.focus();
1427
+ tap(forward);
1428
+ expect(document.activeElement).toBe(getPanel(getDialog('Two')));
1429
+ });
1430
+
1431
+ it('two non-modal owners swapped from a page control keep focus on the page (not a replace)', () => {
1432
+ function TwoNonModalOwners() {
1433
+ const [isAOpen, setIsAOpen] = useState(true);
1434
+ const [isBOpen, setIsBOpen] = useState(false);
1435
+ return (
1436
+ <>
1437
+ <button
1438
+ type="button"
1439
+ onClick={() => {
1440
+ setIsAOpen(false);
1441
+ setIsBOpen(true);
1442
+ }}>
1443
+ Swap from page
1444
+ </button>
1445
+ <BottomSheet
1446
+ isOpen={isAOpen}
1447
+ onOpenChange={setIsAOpen}
1448
+ hasScrim={false}
1449
+ label="A">
1450
+ a
1451
+ </BottomSheet>
1452
+ <BottomSheet
1453
+ isOpen={isBOpen}
1454
+ onOpenChange={setIsBOpen}
1455
+ hasScrim={false}
1456
+ label="B">
1457
+ b
1458
+ </BottomSheet>
1459
+ </>
1460
+ );
1461
+ }
1462
+ render(<TwoNonModalOwners />);
1463
+ const swap = screen.getByRole('button', {name: 'Swap from page'});
1464
+ swap.focus();
1465
+ tap(swap);
1466
+ // Pop and push, not a replace: B is a lone non-modal sheet opening and
1467
+ // takes no focus; the person stays on the page control.
1468
+ expect(
1469
+ getBottomSheetStackForTests(document, false).some(
1470
+ ({view}) => view.isReplacing || view.replacedMotion != null,
1471
+ ),
1472
+ ).toBe(false);
1473
+ expect(document.activeElement).toBe(swap);
1474
+ });
1475
+ });
1476
+
1477
+ it('a non-modal sheet never pairs with a modal one', () => {
1478
+ function Harness() {
1479
+ const [step, setStep] = useState<'a' | 'b'>('a');
1480
+ return (
1481
+ <>
1482
+ <BottomSheet
1483
+ isOpen={step === 'a'}
1484
+ onOpenChange={() => {}}
1485
+ hasScrim={false}
1486
+ label="A">
1487
+ <button type="button" onClick={() => setStep('b')}>
1488
+ Next
1489
+ </button>
1490
+ </BottomSheet>
1491
+ <BottomSheet isOpen={step === 'b'} onOpenChange={() => {}} label="B">
1492
+ x
1493
+ </BottomSheet>
1494
+ </>
1495
+ );
1496
+ }
1497
+ render(<Harness />);
1498
+ tap(screen.getByRole('button', {name: 'Next'}));
1499
+ expect(summary()).toEqual(['B:top:0']);
1500
+ expect(getDialog('A')).not.toHaveAttribute('data-sheet-stack');
1501
+ expect(getPanel(getDialog('A')).className).toContain('sheetClosing');
1502
+ expect(calls()).toEqual(['showPopover:A', 'showModal:B']);
1503
+ });
1504
+
1505
+ it('falls back to show() and still replaces below the Popover API support floor', () => {
1506
+ const showPopover = HTMLElement.prototype.showPopover;
1507
+ const hidePopover = HTMLElement.prototype.hidePopover;
1508
+ // @ts-expect-error -- emulate a browser without the Popover API
1509
+ delete HTMLElement.prototype.showPopover;
1510
+ // @ts-expect-error -- emulate a browser without the Popover API
1511
+ delete HTMLElement.prototype.hidePopover;
1512
+ try {
1513
+ render(<Flow hasScrim={false} />);
1514
+ openFlow();
1515
+ tap(screen.getByRole('button', {name: 'Continue to two'}));
1516
+ expect(calls()).toEqual(['show:One', 'show:Two']);
1517
+ endMotion(getDialog('Two'), 'transform');
1518
+ endMotion(getDialog('One'), 'opacity');
1519
+ expect(calls()).toEqual(['show:One', 'show:Two', 'close:One']);
1520
+ expect(openDialogs()).toEqual(['Two']);
1521
+ } finally {
1522
+ HTMLElement.prototype.showPopover = showPopover;
1523
+ HTMLElement.prototype.hidePopover = hidePopover;
1524
+ }
1525
+ });
1526
+ });