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

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 (912) hide show
  1. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  3. package/dist/AlertDialog/AlertDialog.js +5 -5
  4. package/dist/AppShell/AppShell.d.ts.map +1 -1
  5. package/dist/AppShell/AppShell.js +183 -5
  6. package/dist/AppShell/observeMainOverflow.d.ts +9 -0
  7. package/dist/AppShell/observeMainOverflow.d.ts.map +1 -0
  8. package/dist/AppShell/observeMainOverflow.js +125 -0
  9. package/dist/Avatar/Avatar.d.ts.map +1 -1
  10. package/dist/Avatar/Avatar.js +12 -3
  11. package/dist/Badge/Badge.d.ts.map +1 -1
  12. package/dist/Badge/Badge.js +7 -1
  13. package/dist/BottomSheet/BottomSheet.js +1 -1
  14. package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheetPanel.js +2 -1
  16. package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
  17. package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
  18. package/dist/BottomSheet/useSheetGestures.js +30 -3
  19. package/dist/Button/Button.js +4 -4
  20. package/dist/Carousel/Carousel.d.ts +3 -1
  21. package/dist/Carousel/Carousel.d.ts.map +1 -1
  22. package/dist/Carousel/Carousel.js +12 -3
  23. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  24. package/dist/CheckboxInput/CheckboxInput.js +6 -5
  25. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  26. package/dist/ClickableCard/ClickableCard.js +37 -4
  27. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  28. package/dist/ComplexSelector/ComplexSelector.js +41 -4
  29. package/dist/DateInput/DateInput.d.ts.map +1 -1
  30. package/dist/DateInput/DateInput.js +12 -4
  31. package/dist/DateInput/MonthScroller.d.ts.map +1 -1
  32. package/dist/DateInput/MonthScroller.js +101 -15
  33. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  34. package/dist/DateInput/TouchDateField.js +8 -3
  35. package/dist/DateInput/Wheel.d.ts.map +1 -1
  36. package/dist/DateInput/Wheel.js +11 -7
  37. package/dist/DateInput/usePointerDragScroll.d.ts +10 -1
  38. package/dist/DateInput/usePointerDragScroll.d.ts.map +1 -1
  39. package/dist/DateInput/usePointerDragScroll.js +25 -9
  40. package/dist/DateInput/useScrollSettle.d.ts +3 -1
  41. package/dist/DateInput/useScrollSettle.d.ts.map +1 -1
  42. package/dist/DateInput/useScrollSettle.js +37 -8
  43. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  44. package/dist/DateRangeInput/DateRangeInput.js +1 -1
  45. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
  46. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  47. package/dist/DateTimeInput/DateTimeInput.js +23 -12
  48. package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
  49. package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
  50. package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
  51. package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
  52. package/dist/Dialog/Dialog.d.ts.map +1 -1
  53. package/dist/Dialog/Dialog.js +34 -9
  54. package/dist/Dialog/DialogHeader.d.ts.map +1 -1
  55. package/dist/Dialog/DialogHeader.js +5 -4
  56. package/dist/Divider/Divider.d.ts.map +1 -1
  57. package/dist/Divider/Divider.js +2 -1
  58. package/dist/Drawer/Drawer.d.ts +1 -0
  59. package/dist/Drawer/Drawer.d.ts.map +1 -1
  60. package/dist/Drawer/Drawer.js +7 -2
  61. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  62. package/dist/DropdownMenu/DropdownMenu.js +35 -22
  63. package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
  64. package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
  65. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +20 -2
  66. package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
  67. package/dist/DropdownMenu/lazyMenuBottomSheet.js +31 -3
  68. package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
  69. package/dist/DropdownMenu/renderDropdownItems.js +21 -16
  70. package/dist/EmptyState/EmptyState.d.ts.map +1 -1
  71. package/dist/EmptyState/EmptyState.js +2 -1
  72. package/dist/Field/FieldLabel.d.ts +1 -1
  73. package/dist/Field/FieldLabel.d.ts.map +1 -1
  74. package/dist/Field/FieldLabel.js +4 -4
  75. package/dist/Field/InputClearButton.js +3 -3
  76. package/dist/Field/PanelSearchInput.js +2 -2
  77. package/dist/FieldStatus/FieldStatus.d.ts +3 -0
  78. package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
  79. package/dist/FieldStatus/FieldStatus.js +3 -2
  80. package/dist/FileInput/FileInput.d.ts +3 -0
  81. package/dist/FileInput/FileInput.d.ts.map +1 -1
  82. package/dist/FileInput/FileInput.js +34 -13
  83. package/dist/Heading/Heading.js +1 -1
  84. package/dist/Icon/Icon.js +1 -1
  85. package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
  86. package/dist/Indicator/CheckIndicator.js +2 -1
  87. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  88. package/dist/Indicator/CheckboxIndicator.js +3 -1
  89. package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
  90. package/dist/Indicator/RadioIndicator.js +3 -1
  91. package/dist/Item/Item.d.ts.map +1 -1
  92. package/dist/Item/Item.js +21 -7
  93. package/dist/Item/ItemSwipeLayer.js +1 -1
  94. package/dist/Layer/popoverOperations.d.ts +27 -0
  95. package/dist/Layer/popoverOperations.d.ts.map +1 -0
  96. package/dist/Layer/popoverOperations.js +159 -0
  97. package/dist/Layer/useLayer.d.ts +1 -1
  98. package/dist/Layer/useLayer.d.ts.map +1 -1
  99. package/dist/Layer/useLayer.js +120 -65
  100. package/dist/Layout/Layout.js +1 -1
  101. package/dist/Layout/LayoutContent.js +1 -1
  102. package/dist/Layout/LayoutFooter.js +1 -1
  103. package/dist/Layout/LayoutHeader.js +1 -1
  104. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  105. package/dist/Lightbox/Lightbox.js +5 -0
  106. package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
  107. package/dist/Link/Link.d.ts.map +1 -1
  108. package/dist/Link/Link.js +8 -3
  109. package/dist/List/List.js +1 -1
  110. package/dist/List/ListItem.js +3 -3
  111. package/dist/Markdown/plugins/headingLinks.a11y.chromium.spec.js +1 -1
  112. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  113. package/dist/MobileNav/MobileNav.js +7 -2
  114. package/dist/MultiSelector/CreateRow.a11y.chromium.spec.js +7 -6
  115. package/dist/MultiSelector/MultiSelector.d.ts +1 -1
  116. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  117. package/dist/MultiSelector/MultiSelector.js +26 -10
  118. package/dist/NavMenu/NavHeadingMenuItem.d.ts.map +1 -1
  119. package/dist/NavMenu/NavHeadingMenuItem.js +5 -29
  120. package/dist/NumberInput/NumberInput.d.ts +3 -1
  121. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  122. package/dist/NumberInput/NumberInput.js +26 -5
  123. package/dist/NumberInput/numberParser.d.ts +3 -0
  124. package/dist/NumberInput/numberParser.d.ts.map +1 -1
  125. package/dist/NumberInput/numberParser.js +7 -44
  126. package/dist/Outline/Outline.d.ts.map +1 -1
  127. package/dist/Outline/Outline.js +27 -0
  128. package/dist/Popover/Popover.d.ts.map +1 -1
  129. package/dist/Popover/Popover.js +32 -12
  130. package/dist/Popover/usePopover.d.ts.map +1 -1
  131. package/dist/Popover/usePopover.js +10 -3
  132. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  133. package/dist/PowerSearch/PowerSearch.js +37 -30
  134. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  135. package/dist/ProgressBar/ProgressBar.js +16 -12
  136. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  137. package/dist/RadioList/RadioListItem.js +11 -3
  138. package/dist/Resizable/useResizable.d.ts.map +1 -1
  139. package/dist/Resizable/useResizable.js +28 -2
  140. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  141. package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
  142. package/dist/Selector/useSelectorPresentation.d.ts +8 -1
  143. package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
  144. package/dist/Selector/useSelectorPresentation.js +20 -4
  145. package/dist/SideNav/SideNavItem.d.ts +2 -2
  146. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  147. package/dist/SideNav/SideNavItem.js +18 -7
  148. package/dist/Skeleton/Skeleton.d.ts.map +1 -1
  149. package/dist/Skeleton/Skeleton.js +1 -1
  150. package/dist/Slider/Slider.d.ts.map +1 -1
  151. package/dist/Slider/Slider.js +10 -2
  152. package/dist/Spinner/Spinner.d.ts.map +1 -1
  153. package/dist/Spinner/Spinner.js +3 -3
  154. package/dist/Stack/Stack.js +1 -1
  155. package/dist/Stack/StackItem.js +1 -1
  156. package/dist/Stepper/Step.d.ts.map +1 -1
  157. package/dist/Stepper/Step.js +26 -6
  158. package/dist/Switch/Switch.d.ts.map +1 -1
  159. package/dist/Switch/Switch.js +10 -3
  160. package/dist/TabList/TabList.d.ts.map +1 -1
  161. package/dist/TabList/TabList.js +16 -1
  162. package/dist/Table/Table.d.ts.map +1 -1
  163. package/dist/Table/Table.js +36 -10
  164. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  165. package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
  166. package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
  167. package/dist/Table/plugins/sortable/useTableSortable.js +46 -58
  168. package/dist/Text/Text.js +1 -1
  169. package/dist/Text/useTruncation.d.ts.map +1 -1
  170. package/dist/Text/useTruncation.js +23 -5
  171. package/dist/TextArea/TextArea.d.ts +1 -1
  172. package/dist/TextArea/TextArea.d.ts.map +1 -1
  173. package/dist/TextArea/TextArea.js +13 -2
  174. package/dist/TextInput/TextInput.d.ts.map +1 -1
  175. package/dist/TextInput/TextInput.js +3 -3
  176. package/dist/TimeInput/TimeInput.d.ts +6 -2
  177. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  178. package/dist/TimeInput/TimeInput.js +21 -14
  179. package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
  180. package/dist/TimeInput/TouchTimeField.js +5 -4
  181. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  182. package/dist/Timestamp/Timestamp.js +2 -2
  183. package/dist/Timestamp/TimestampHoverCard.js +4 -4
  184. package/dist/Toast/Toast.d.ts.map +1 -1
  185. package/dist/Toast/Toast.js +60 -20
  186. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  187. package/dist/Toast/ToastViewport.js +101 -54
  188. package/dist/ToggleButton/ToggleButtonGroup.d.ts +7 -1
  189. package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
  190. package/dist/ToggleButton/ToggleButtonGroup.js +16 -2
  191. package/dist/Token/Token.d.ts +1 -1
  192. package/dist/Token/Token.d.ts.map +1 -1
  193. package/dist/Token/Token.js +52 -5
  194. package/dist/Token/TokenLink.d.ts.map +1 -1
  195. package/dist/Token/TokenLink.js +14 -2
  196. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  197. package/dist/Tokenizer/Tokenizer.js +44 -7
  198. package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
  199. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts +2 -0
  200. package/dist/Tokenizer/TokenizerClearAllMessageContext.d.ts.map +1 -0
  201. package/dist/Tokenizer/TokenizerClearAllMessageContext.js +17 -0
  202. package/dist/Toolbar/Toolbar.d.ts.map +1 -1
  203. package/dist/Toolbar/Toolbar.js +2 -1
  204. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  205. package/dist/TopNav/TopNavMegaMenu.js +3 -0
  206. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  207. package/dist/TopNav/TopNavMenu.js +1 -0
  208. package/dist/TreeList/TreeListItem.d.ts.map +1 -1
  209. package/dist/TreeList/TreeListItem.js +27 -4
  210. package/dist/Typeahead/BaseTypeahead.d.ts +4 -4
  211. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  212. package/dist/Typeahead/BaseTypeahead.js +43 -7
  213. package/dist/Typeahead/Typeahead.d.ts +1 -1
  214. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  215. package/dist/Typeahead/Typeahead.js +43 -9
  216. package/dist/astryx.css +25 -4
  217. package/dist/gestures/GestureArena.d.ts +32 -1
  218. package/dist/gestures/GestureArena.d.ts.map +1 -1
  219. package/dist/gestures/GestureArena.js +110 -9
  220. package/dist/gestures/GestureHost.d.ts +351 -0
  221. package/dist/gestures/GestureHost.d.ts.map +1 -0
  222. package/dist/gestures/GestureHost.js +1773 -0
  223. package/dist/gestures/GestureRecognizer.d.ts +13 -1
  224. package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
  225. package/dist/gestures/GestureRecognizer.js +19 -1
  226. package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
  227. package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
  228. package/dist/gestures/LongPressGestureRecognizer.js +3 -0
  229. package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
  230. package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
  231. package/dist/gestures/PanGestureRecognizer.js +3 -0
  232. package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
  233. package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
  234. package/dist/gestures/PinchGestureRecognizer.js +128 -0
  235. package/dist/gestures/PressTracker.d.ts +112 -0
  236. package/dist/gestures/PressTracker.d.ts.map +1 -0
  237. package/dist/gestures/PressTracker.js +267 -0
  238. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
  239. package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
  240. package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
  241. package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
  242. package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
  243. package/dist/gestures/SwipeGestureRecognizer.js +148 -0
  244. package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
  245. package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
  246. package/dist/gestures/TapGestureRecognizer.js +3 -0
  247. package/dist/gestures/VelocityTracker.d.ts +6 -2
  248. package/dist/gestures/VelocityTracker.d.ts.map +1 -1
  249. package/dist/gestures/VelocityTracker.js +7 -3
  250. package/dist/gestures/haptics.d.ts +65 -0
  251. package/dist/gestures/haptics.d.ts.map +1 -0
  252. package/dist/gestures/haptics.js +182 -0
  253. package/dist/gestures/index.d.ts +37 -0
  254. package/dist/gestures/index.d.ts.map +1 -0
  255. package/dist/gestures/index.js +25 -0
  256. package/dist/gestures/nativeScroll.d.ts +42 -0
  257. package/dist/gestures/nativeScroll.d.ts.map +1 -0
  258. package/dist/gestures/nativeScroll.js +228 -0
  259. package/dist/gestures/touchAction.d.ts +60 -0
  260. package/dist/gestures/touchAction.d.ts.map +1 -0
  261. package/dist/gestures/touchAction.js +157 -0
  262. package/dist/gestures/touchActionRule.d.ts +34 -0
  263. package/dist/gestures/touchActionRule.d.ts.map +1 -0
  264. package/dist/gestures/touchActionRule.js +140 -0
  265. package/dist/gestures/types.d.ts +18 -7
  266. package/dist/gestures/types.d.ts.map +1 -1
  267. package/dist/gestures/types.js +22 -2
  268. package/dist/gestures/useGestureRecognizer.d.ts +56 -0
  269. package/dist/gestures/useGestureRecognizer.d.ts.map +1 -0
  270. package/dist/gestures/useGestureRecognizer.js +226 -0
  271. package/dist/hooks/index.d.ts +1 -1
  272. package/dist/hooks/index.d.ts.map +1 -1
  273. package/dist/hooks/modalAnnounce.d.ts.map +1 -1
  274. package/dist/hooks/modalAnnounce.js +107 -61
  275. package/dist/hooks/scrollKeyboardDelegation.d.ts.map +1 -1
  276. package/dist/hooks/scrollKeyboardDelegation.js +7 -3
  277. package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
  278. package/dist/hooks/useAdaptivePresentation.js +4 -1
  279. package/dist/hooks/useAnnounce.d.ts +101 -42
  280. package/dist/hooks/useAnnounce.d.ts.map +1 -1
  281. package/dist/hooks/useAnnounce.js +161 -75
  282. package/dist/hooks/useAnnounceRenderedText.d.ts +11 -3
  283. package/dist/hooks/useAnnounceRenderedText.d.ts.map +1 -1
  284. package/dist/hooks/useAnnounceRenderedText.js +5 -3
  285. package/dist/hooks/useBusyAnnouncement.d.ts.map +1 -1
  286. package/dist/hooks/useBusyAnnouncement.js +6 -12
  287. package/dist/hooks/useMenuHover.d.ts.map +1 -1
  288. package/dist/hooks/useMenuHover.js +12 -1
  289. package/dist/hooks/useScrollOverflow.d.ts +2 -1
  290. package/dist/hooks/useScrollOverflow.d.ts.map +1 -1
  291. package/dist/hooks/useScrollOverflow.js +56 -10
  292. package/dist/i18n/generated-locales/af-ZA.generated.d.ts.map +1 -1
  293. package/dist/i18n/generated-locales/af-ZA.generated.js +0 -5
  294. package/dist/i18n/generated-locales/ar-SA.generated.d.ts.map +1 -1
  295. package/dist/i18n/generated-locales/ar-SA.generated.js +0 -5
  296. package/dist/i18n/generated-locales/ca-ES.generated.d.ts.map +1 -1
  297. package/dist/i18n/generated-locales/ca-ES.generated.js +0 -5
  298. package/dist/i18n/generated-locales/cs-CZ.generated.d.ts.map +1 -1
  299. package/dist/i18n/generated-locales/cs-CZ.generated.js +0 -5
  300. package/dist/i18n/generated-locales/da-DK.generated.d.ts.map +1 -1
  301. package/dist/i18n/generated-locales/da-DK.generated.js +0 -5
  302. package/dist/i18n/generated-locales/de-DE.generated.d.ts.map +1 -1
  303. package/dist/i18n/generated-locales/de-DE.generated.js +0 -5
  304. package/dist/i18n/generated-locales/el-GR.generated.d.ts.map +1 -1
  305. package/dist/i18n/generated-locales/el-GR.generated.js +0 -5
  306. package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
  307. package/dist/i18n/generated-locales/en.generated.js +8 -5
  308. package/dist/i18n/generated-locales/es-ES.generated.d.ts.map +1 -1
  309. package/dist/i18n/generated-locales/es-ES.generated.js +0 -5
  310. package/dist/i18n/generated-locales/fi-FI.generated.d.ts.map +1 -1
  311. package/dist/i18n/generated-locales/fi-FI.generated.js +0 -5
  312. package/dist/i18n/generated-locales/fr-FR.generated.d.ts.map +1 -1
  313. package/dist/i18n/generated-locales/fr-FR.generated.js +0 -5
  314. package/dist/i18n/generated-locales/he-IL.generated.d.ts.map +1 -1
  315. package/dist/i18n/generated-locales/he-IL.generated.js +0 -5
  316. package/dist/i18n/generated-locales/hu-HU.generated.d.ts.map +1 -1
  317. package/dist/i18n/generated-locales/hu-HU.generated.js +0 -5
  318. package/dist/i18n/generated-locales/it-IT.generated.d.ts.map +1 -1
  319. package/dist/i18n/generated-locales/it-IT.generated.js +0 -5
  320. package/dist/i18n/generated-locales/ja-JP.generated.d.ts.map +1 -1
  321. package/dist/i18n/generated-locales/ja-JP.generated.js +0 -5
  322. package/dist/i18n/generated-locales/ko-KR.generated.d.ts.map +1 -1
  323. package/dist/i18n/generated-locales/ko-KR.generated.js +0 -5
  324. package/dist/i18n/generated-locales/nl-NL.generated.d.ts.map +1 -1
  325. package/dist/i18n/generated-locales/nl-NL.generated.js +0 -5
  326. package/dist/i18n/generated-locales/no-NO.generated.d.ts.map +1 -1
  327. package/dist/i18n/generated-locales/no-NO.generated.js +0 -5
  328. package/dist/i18n/generated-locales/pl-PL.generated.d.ts.map +1 -1
  329. package/dist/i18n/generated-locales/pl-PL.generated.js +0 -5
  330. package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
  331. package/dist/i18n/generated-locales/pseudo.generated.js +8 -5
  332. package/dist/i18n/generated-locales/pt-BR.generated.d.ts.map +1 -1
  333. package/dist/i18n/generated-locales/pt-BR.generated.js +0 -5
  334. package/dist/i18n/generated-locales/pt-PT.generated.d.ts.map +1 -1
  335. package/dist/i18n/generated-locales/pt-PT.generated.js +0 -5
  336. package/dist/i18n/generated-locales/ro-RO.generated.d.ts.map +1 -1
  337. package/dist/i18n/generated-locales/ro-RO.generated.js +0 -5
  338. package/dist/i18n/generated-locales/ru-RU.generated.d.ts.map +1 -1
  339. package/dist/i18n/generated-locales/ru-RU.generated.js +0 -5
  340. package/dist/i18n/generated-locales/sr-SP.generated.d.ts.map +1 -1
  341. package/dist/i18n/generated-locales/sr-SP.generated.js +0 -5
  342. package/dist/i18n/generated-locales/sv-SE.generated.d.ts.map +1 -1
  343. package/dist/i18n/generated-locales/sv-SE.generated.js +0 -5
  344. package/dist/i18n/generated-locales/tr-TR.generated.d.ts.map +1 -1
  345. package/dist/i18n/generated-locales/tr-TR.generated.js +0 -5
  346. package/dist/i18n/generated-locales/uk-UA.generated.d.ts.map +1 -1
  347. package/dist/i18n/generated-locales/uk-UA.generated.js +0 -5
  348. package/dist/i18n/generated-locales/vi-VN.generated.d.ts.map +1 -1
  349. package/dist/i18n/generated-locales/vi-VN.generated.js +0 -5
  350. package/dist/i18n/generated-locales/zh-CN.generated.d.ts.map +1 -1
  351. package/dist/i18n/generated-locales/zh-CN.generated.js +0 -5
  352. package/dist/i18n/generated-locales/zh-TW.generated.d.ts.map +1 -1
  353. package/dist/i18n/generated-locales/zh-TW.generated.js +0 -5
  354. package/dist/i18n/useListFormatter.d.ts +9 -0
  355. package/dist/i18n/useListFormatter.d.ts.map +1 -0
  356. package/dist/i18n/useListFormatter.js +41 -0
  357. package/dist/motion/animator.d.ts +83 -8
  358. package/dist/motion/animator.d.ts.map +1 -1
  359. package/dist/motion/animator.js +701 -119
  360. package/dist/motion/coast.d.ts +4 -1
  361. package/dist/motion/coast.d.ts.map +1 -1
  362. package/dist/motion/coast.js +4 -2
  363. package/dist/motion/reducedMotion.d.ts.map +1 -1
  364. package/dist/motion/reducedMotion.js +6 -2
  365. package/dist/motion/reducedMotionPlan.d.ts +7 -0
  366. package/dist/motion/reducedMotionPlan.d.ts.map +1 -1
  367. package/dist/motion/reducedMotionPlan.js +14 -1
  368. package/dist/motion/resolveMotion.d.ts +42 -0
  369. package/dist/motion/resolveMotion.d.ts.map +1 -0
  370. package/dist/motion/resolveMotion.js +43 -0
  371. package/dist/motion/roleValue.d.ts +2 -1
  372. package/dist/motion/roleValue.d.ts.map +1 -1
  373. package/dist/motion/roleValue.js +2 -1
  374. package/dist/motion/uikit/timing.d.ts +7 -1
  375. package/dist/motion/uikit/timing.d.ts.map +1 -1
  376. package/dist/motion/uikit/timing.js +19 -1
  377. package/dist/theme/defineTheme.d.ts +19 -5
  378. package/dist/theme/defineTheme.d.ts.map +1 -1
  379. package/dist/theme/defineTheme.js +64 -4
  380. package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
  381. package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
  382. package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
  383. package/dist/theme/domainTokens/index.d.ts +5 -4
  384. package/dist/theme/domainTokens/index.d.ts.map +1 -1
  385. package/dist/theme/domainTokens/index.js +5 -9
  386. package/dist/theme/index.d.ts +1 -0
  387. package/dist/theme/index.d.ts.map +1 -1
  388. package/dist/theme/motionKnobs.d.ts +56 -0
  389. package/dist/theme/motionKnobs.d.ts.map +1 -0
  390. package/dist/theme/motionKnobs.js +48 -0
  391. package/dist/theme/resolveThemeValues.d.ts +11 -4
  392. package/dist/theme/resolveThemeValues.d.ts.map +1 -1
  393. package/dist/theme/resolveThemeValues.js +40 -4
  394. package/dist/theme/themeAdaptations.d.ts +7 -3
  395. package/dist/theme/themeAdaptations.d.ts.map +1 -1
  396. package/dist/theme/themeAdaptations.js +36 -7
  397. package/dist/theme/themeMotion.d.ts +96 -0
  398. package/dist/theme/themeMotion.d.ts.map +1 -0
  399. package/dist/theme/themeMotion.js +177 -0
  400. package/dist/theme/tokenReferences.d.ts +31 -0
  401. package/dist/theme/tokenReferences.d.ts.map +1 -0
  402. package/dist/theme/tokenReferences.js +132 -0
  403. package/dist/theme/tokens.d.ts +1 -0
  404. package/dist/theme/tokens.d.ts.map +1 -1
  405. package/dist/theme/tokens.js +9 -129
  406. package/dist/theme/tokens.stylex.d.ts +12 -0
  407. package/dist/theme/tokens.stylex.d.ts.map +1 -1
  408. package/dist/theme/tokens.stylex.js +12 -0
  409. package/dist/utils/focusOutline.stylex.d.ts +6 -0
  410. package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
  411. package/dist/utils/focusOutline.stylex.js +7 -0
  412. package/dist/utils/focusReturn.d.ts +17 -1
  413. package/dist/utils/focusReturn.d.ts.map +1 -1
  414. package/dist/utils/focusReturn.js +11 -4
  415. package/dist/utils/getNodeText.d.ts +8 -0
  416. package/dist/utils/getNodeText.d.ts.map +1 -0
  417. package/dist/utils/getNodeText.js +37 -0
  418. package/dist/utils/interactionModality.d.ts +11 -2
  419. package/dist/utils/interactionModality.d.ts.map +1 -1
  420. package/dist/utils/interactionModality.js +58 -5
  421. package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -1
  422. package/dist/utils/interactionOverlay.stylex.js +17 -8
  423. package/dist/utils/plainDate.d.ts +2 -0
  424. package/dist/utils/plainDate.d.ts.map +1 -1
  425. package/dist/utils/plainDate.js +46 -3
  426. package/dist/utils/presentation.d.ts +50 -0
  427. package/dist/utils/presentation.d.ts.map +1 -0
  428. package/dist/utils/presentation.js +125 -0
  429. package/dist/utils/pressFeedback.d.ts.map +1 -1
  430. package/dist/utils/pressFeedback.js +20 -1
  431. package/dist/utils/primaryClick.d.ts +11 -0
  432. package/dist/utils/primaryClick.d.ts.map +1 -0
  433. package/dist/utils/primaryClick.js +25 -0
  434. package/dist/utils/sharedMutationObserver.d.ts +19 -11
  435. package/dist/utils/sharedMutationObserver.d.ts.map +1 -1
  436. package/dist/utils/sharedMutationObserver.js +66 -26
  437. package/dist/utils/timeFormat.d.ts +47 -0
  438. package/dist/utils/timeFormat.d.ts.map +1 -0
  439. package/dist/utils/timeFormat.js +240 -0
  440. package/dist/utils/touchPresentation.d.ts +2 -2
  441. package/dist/utils/touchPresentation.d.ts.map +1 -1
  442. package/dist/utils/touchPresentation.js +13 -8
  443. package/dist/utils/touchPresentation.stylex.d.ts +15 -0
  444. package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
  445. package/dist/utils/touchPresentation.stylex.js +33 -0
  446. package/dist/utils/touchQueries.d.ts +13 -0
  447. package/dist/utils/touchQueries.d.ts.map +1 -0
  448. package/dist/utils/touchQueries.js +15 -0
  449. package/dist/utils/unicodeDigits.d.ts +20 -0
  450. package/dist/utils/unicodeDigits.d.ts.map +1 -0
  451. package/dist/utils/unicodeDigits.js +70 -0
  452. package/dist/utils/useFocusAcrossSwap.d.ts +19 -0
  453. package/dist/utils/useFocusAcrossSwap.d.ts.map +1 -0
  454. package/dist/utils/useFocusAcrossSwap.js +41 -0
  455. package/locales/af-ZA.json +0 -21
  456. package/locales/ar-SA.json +0 -21
  457. package/locales/ca-ES.json +0 -21
  458. package/locales/cs-CZ.json +0 -21
  459. package/locales/da-DK.json +0 -21
  460. package/locales/de-DE.json +0 -21
  461. package/locales/el-GR.json +0 -21
  462. package/locales/en.json +35 -23
  463. package/locales/es-ES.json +0 -21
  464. package/locales/fi-FI.json +0 -21
  465. package/locales/fr-FR.json +0 -21
  466. package/locales/he-IL.json +0 -21
  467. package/locales/hu-HU.json +0 -21
  468. package/locales/it-IT.json +0 -21
  469. package/locales/ja-JP.json +0 -21
  470. package/locales/ko-KR.json +0 -21
  471. package/locales/nl-NL.json +0 -21
  472. package/locales/no-NO.json +0 -21
  473. package/locales/pl-PL.json +0 -21
  474. package/locales/pseudo.json +23 -14
  475. package/locales/pt-BR.json +0 -21
  476. package/locales/pt-PT.json +0 -21
  477. package/locales/ro-RO.json +0 -21
  478. package/locales/ru-RU.json +0 -21
  479. package/locales/sr-SP.json +0 -21
  480. package/locales/sv-SE.json +0 -21
  481. package/locales/tr-TR.json +0 -21
  482. package/locales/uk-UA.json +0 -21
  483. package/locales/vi-VN.json +0 -21
  484. package/locales/zh-CN.json +0 -21
  485. package/locales/zh-TW.json +0 -21
  486. package/package.json +5 -4
  487. package/src/AlertDialog/AlertDialog.tsx +6 -5
  488. package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
  489. package/src/AppShell/AppShell.doc.mjs +1 -1
  490. package/src/AppShell/AppShell.spec.md +9 -12
  491. package/src/AppShell/AppShell.test.tsx +164 -2
  492. package/src/AppShell/AppShell.tsx +225 -5
  493. package/src/AppShell/__tests__/AppShellMainKeyboard.a11y.browser.spec.ts +534 -0
  494. package/src/AppShell/observeMainOverflow.test.ts +173 -0
  495. package/src/AppShell/observeMainOverflow.ts +143 -0
  496. package/src/Avatar/Avatar.spec.md +22 -22
  497. package/src/Avatar/Avatar.tsx +18 -1
  498. package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
  499. package/src/Badge/Badge.doc.mjs +1 -1
  500. package/src/Badge/Badge.tsx +19 -2
  501. package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
  502. package/src/BottomSheet/BottomSheet.test.tsx +46 -0
  503. package/src/BottomSheet/BottomSheet.tsx +1 -1
  504. package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
  505. package/src/BottomSheet/useSheetGestures.test.ts +52 -0
  506. package/src/BottomSheet/useSheetGestures.ts +37 -6
  507. package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
  508. package/src/Button/Button.tsx +4 -4
  509. package/src/Calendar/Calendar.spec.md +87 -48
  510. package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
  511. package/src/Carousel/Carousel.doc.mjs +1 -1
  512. package/src/Carousel/Carousel.spec.md +9 -9
  513. package/src/Carousel/Carousel.test.tsx +124 -3
  514. package/src/Carousel/Carousel.tsx +10 -2
  515. package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
  516. package/src/Carousel/__tests__/Carousel.a11y.known-failures.ts +1 -16
  517. package/src/Chat/ChatComposer.spec.md +75 -59
  518. package/src/Chat/ChatComposerTokenElement.spec.md +45 -33
  519. package/src/Chat/ChatDictationButton.spec.md +126 -81
  520. package/src/Chat/ChatLayout.spec.md +41 -36
  521. package/src/Chat/ChatLayoutScrollButton.spec.md +87 -103
  522. package/src/Chat/ChatMessage.spec.md +64 -65
  523. package/src/Chat/ChatSendButton.spec.md +78 -67
  524. package/src/CheckboxInput/CheckboxInput.tsx +6 -5
  525. package/src/Citation/Citation.spec.md +60 -47
  526. package/src/ClickableCard/ClickableCard.test.tsx +96 -0
  527. package/src/ClickableCard/ClickableCard.tsx +48 -4
  528. package/src/CodeBlock/__tests__/CodeBlockCopyClearance.a11y.chromium.spec.ts +38 -3
  529. package/src/Collapsible/Collapsible.spec.md +2 -0
  530. package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
  531. package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
  532. package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
  533. package/src/ComplexSelector/ComplexSelector.test.tsx +148 -0
  534. package/src/ComplexSelector/ComplexSelector.tsx +41 -4
  535. package/src/ContextMenu/ContextMenu.spec.md +84 -56
  536. package/src/ContextMenu/ContextMenu.test.tsx +35 -0
  537. package/src/ContextMenu/ContextMenuItem.spec.md +132 -0
  538. package/src/DateInput/DateInput.spec.md +74 -57
  539. package/src/DateInput/DateInput.test.tsx +115 -3
  540. package/src/DateInput/DateInput.tsx +29 -14
  541. package/src/DateInput/DateInputTouch.test.tsx +120 -0
  542. package/src/DateInput/MonthScroller.tsx +106 -20
  543. package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
  544. package/src/DateInput/TouchDateField.tsx +14 -3
  545. package/src/DateInput/Wheel.tsx +9 -6
  546. package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
  547. package/src/DateInput/usePointerDragScroll.ts +34 -10
  548. package/src/DateInput/useScrollSettle.ts +38 -7
  549. package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
  550. package/src/DateRangeInput/DateRangeInput.tsx +16 -12
  551. package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
  552. package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
  553. package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
  554. package/src/DateTimeInput/DateTimeInput.tsx +46 -24
  555. package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
  556. package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
  557. package/src/Dialog/Dialog.test.tsx +216 -2
  558. package/src/Dialog/Dialog.tsx +42 -9
  559. package/src/Dialog/DialogHeader.tsx +5 -4
  560. package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
  561. package/src/Divider/Divider.tsx +2 -1
  562. package/src/Drawer/Drawer.spec.md +111 -80
  563. package/src/Drawer/Drawer.test.tsx +35 -0
  564. package/src/Drawer/Drawer.tsx +13 -2
  565. package/src/Drawer/DrawerHeader.spec.md +181 -0
  566. package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
  567. package/src/DropdownMenu/DropdownMenu.spec.md +198 -218
  568. package/src/DropdownMenu/DropdownMenu.test.tsx +158 -0
  569. package/src/DropdownMenu/DropdownMenu.tsx +43 -21
  570. package/src/DropdownMenu/DropdownMenuCheckboxItem.spec.md +192 -0
  571. package/src/DropdownMenu/DropdownMenuDivider.spec.md +25 -31
  572. package/src/DropdownMenu/DropdownMenuGroup.spec.md +145 -0
  573. package/src/DropdownMenu/DropdownMenuItem.spec.md +48 -42
  574. package/src/DropdownMenu/DropdownMenuRadioGroup.spec.md +34 -37
  575. package/src/DropdownMenu/DropdownMenuRadioItem.spec.md +54 -53
  576. package/src/DropdownMenu/DropdownMenuSubMenu.spec.md +47 -41
  577. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
  578. package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
  579. package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
  580. package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
  581. package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +60 -0
  582. package/src/DropdownMenu/lazyMenuBottomSheet.ts +36 -7
  583. package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
  584. package/src/EmptyState/EmptyState.spec.md +35 -29
  585. package/src/EmptyState/EmptyState.tsx +2 -1
  586. package/src/Field/FieldLabel.tsx +5 -4
  587. package/src/Field/InputClearButton.tsx +3 -3
  588. package/src/Field/PanelSearchInput.tsx +2 -2
  589. package/src/FieldStatus/FieldStatus.tsx +9 -2
  590. package/src/FieldStatus/__tests__/FieldStatusAudit.a11y.chromium.spec.ts +477 -0
  591. package/src/FileInput/FileInput.test.tsx +159 -0
  592. package/src/FileInput/FileInput.tsx +34 -6
  593. package/src/FileInput/__tests__/FileInputAudit.a11y.chromium.spec.ts +796 -0
  594. package/src/FormLayout/FormLayout.spec.md +11 -20
  595. package/src/Heading/Heading.tsx +1 -1
  596. package/src/Icon/Icon.tsx +1 -1
  597. package/src/Indicator/CheckIndicator.spec.md +47 -42
  598. package/src/Indicator/CheckIndicator.tsx +2 -1
  599. package/src/Indicator/CheckboxIndicator.spec.md +40 -37
  600. package/src/Indicator/CheckboxIndicator.tsx +3 -1
  601. package/src/Indicator/Indicator.spec.md +188 -0
  602. package/src/Indicator/RadioIndicator.tsx +3 -1
  603. package/src/Item/Item.test.tsx +60 -0
  604. package/src/Item/Item.tsx +16 -8
  605. package/src/Item/ItemSwipeLayer.tsx +1 -1
  606. package/src/Kbd/Kbd.spec.md +81 -38
  607. package/src/Layer/__tests__/LayerBrowserHide.a11y.chromium.spec.ts +126 -0
  608. package/src/Layer/popoverOperations.test.ts +205 -0
  609. package/src/Layer/popoverOperations.ts +172 -0
  610. package/src/Layer/useLayer.test.tsx +426 -4
  611. package/src/Layer/useLayer.tsx +145 -77
  612. package/src/Layout/Layout.spec.md +127 -131
  613. package/src/Layout/Layout.tsx +1 -1
  614. package/src/Layout/LayoutContent.spec.md +205 -0
  615. package/src/Layout/LayoutContent.tsx +1 -1
  616. package/src/Layout/LayoutFooter.spec.md +190 -0
  617. package/src/Layout/LayoutFooter.tsx +1 -1
  618. package/src/Layout/LayoutHeader.spec.md +193 -0
  619. package/src/Layout/LayoutHeader.tsx +1 -1
  620. package/src/Layout/LayoutPanel.spec.md +194 -0
  621. package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
  622. package/src/Lightbox/Lightbox.test.tsx +18 -0
  623. package/src/Lightbox/Lightbox.tsx +5 -0
  624. package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
  625. package/src/Link/Link.spec.md +3 -2
  626. package/src/Link/Link.tsx +11 -0
  627. package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
  628. package/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts +58 -0
  629. package/src/List/List.tsx +1 -1
  630. package/src/List/ListItem.spec.md +205 -0
  631. package/src/List/ListItem.tsx +3 -3
  632. package/src/Markdown/plugins/headingLinks.a11y.chromium.spec.ts +1 -1
  633. package/src/MetadataList/MetadataList.spec.md +187 -0
  634. package/src/MetadataList/MetadataListItem.spec.md +165 -0
  635. package/src/MobileNav/MobileNav.test.tsx +15 -0
  636. package/src/MobileNav/MobileNav.tsx +9 -1
  637. package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
  638. package/src/MoreMenu/MoreMenu.test.tsx +11 -0
  639. package/src/MultiSelector/CreateRow.a11y.chromium.spec.ts +7 -8
  640. package/src/MultiSelector/MultiSelector.spec.md +7 -4
  641. package/src/MultiSelector/MultiSelector.test.tsx +270 -1
  642. package/src/MultiSelector/MultiSelector.tsx +25 -10
  643. package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
  644. package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
  645. package/src/NavMenu/NavHeadingMenuItem.tsx +5 -39
  646. package/src/NumberInput/NumberInput.doc.mjs +13 -7
  647. package/src/NumberInput/NumberInput.spec.md +59 -37
  648. package/src/NumberInput/NumberInput.test.tsx +68 -7
  649. package/src/NumberInput/NumberInput.tsx +44 -4
  650. package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
  651. package/src/NumberInput/numberParser.ts +7 -45
  652. package/src/Outline/Outline.spec.md +165 -69
  653. package/src/Outline/Outline.test.tsx +67 -2
  654. package/src/Outline/Outline.tsx +23 -0
  655. package/src/Outline/modules/parseOutlineFromMarkdown.spec.md +3 -4
  656. package/src/OverflowList/OverflowList.spec.md +102 -55
  657. package/src/Pagination/Pagination.spec.md +158 -84
  658. package/src/Popover/Popover.test.tsx +84 -0
  659. package/src/Popover/Popover.tsx +34 -14
  660. package/src/Popover/__tests__/PopoverSecondDocument.a11y.chromium.spec.ts +70 -8
  661. package/src/Popover/usePopover.tsx +10 -3
  662. package/src/PowerSearch/PowerSearch.test.tsx +24 -0
  663. package/src/PowerSearch/PowerSearch.tsx +42 -31
  664. package/src/ProgressBar/ProgressBar.spec.md +143 -119
  665. package/src/ProgressBar/ProgressBar.test.tsx +108 -32
  666. package/src/ProgressBar/ProgressBar.tsx +58 -10
  667. package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
  668. package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
  669. package/src/RadioList/RadioList.spec.md +1 -1
  670. package/src/RadioList/RadioList.test.tsx +84 -0
  671. package/src/RadioList/RadioListItem.tsx +11 -2
  672. package/src/Resizable/Resizable.spec.md +144 -124
  673. package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
  674. package/src/Resizable/useResizable.test.ts +43 -0
  675. package/src/Resizable/useResizable.ts +32 -9
  676. package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
  677. package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
  678. package/src/Selector/Selector.test.tsx +90 -1
  679. package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
  680. package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
  681. package/src/Selector/useSelectorPresentation.ts +31 -3
  682. package/src/SideNav/SideNav.test.tsx +151 -4
  683. package/src/SideNav/SideNavItem.spec.md +14 -24
  684. package/src/SideNav/SideNavItem.tsx +27 -10
  685. package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
  686. package/src/Skeleton/Skeleton.tsx +3 -1
  687. package/src/Slider/Slider.test.tsx +31 -0
  688. package/src/Slider/Slider.tsx +8 -3
  689. package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
  690. package/src/Spinner/Spinner.tsx +5 -3
  691. package/src/Stack/Stack.tsx +1 -1
  692. package/src/Stack/StackItem.tsx +1 -1
  693. package/src/Stepper/Step.spec.md +36 -42
  694. package/src/Stepper/Step.tsx +33 -6
  695. package/src/Stepper/Stepper.doc.mjs +1 -1
  696. package/src/Stepper/Stepper.test.tsx +69 -7
  697. package/src/Switch/Switch.spec.md +1 -1
  698. package/src/Switch/Switch.test.tsx +66 -1
  699. package/src/Switch/Switch.tsx +11 -3
  700. package/src/TabList/TabList.test.tsx +58 -4
  701. package/src/TabList/TabList.tsx +16 -1
  702. package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
  703. package/src/Table/Table.spec.md +1 -1
  704. package/src/Table/Table.test.tsx +32 -0
  705. package/src/Table/Table.tsx +43 -11
  706. package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
  707. package/src/Table/__tests__/Table.a11y.states.ts +1 -5
  708. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
  709. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
  710. package/src/Table/plugins/sortable/useTableSortable.test.tsx +73 -144
  711. package/src/Table/plugins/sortable/useTableSortable.tsx +44 -73
  712. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +9 -21
  713. package/src/Text/Text.tsx +1 -1
  714. package/src/Text/useTruncation.test.tsx +128 -1
  715. package/src/Text/useTruncation.ts +23 -5
  716. package/src/TextArea/TextArea.spec.md +10 -13
  717. package/src/TextArea/TextArea.test.tsx +60 -0
  718. package/src/TextArea/TextArea.tsx +15 -1
  719. package/src/TextInput/TextInput.test.tsx +21 -0
  720. package/src/TextInput/TextInput.tsx +3 -1
  721. package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
  722. package/src/TimeInput/Presentation.test.tsx +21 -0
  723. package/src/TimeInput/TimeInput.doc.mjs +8 -8
  724. package/src/TimeInput/TimeInput.spec.md +58 -61
  725. package/src/TimeInput/TimeInput.test.tsx +76 -0
  726. package/src/TimeInput/TimeInput.tsx +36 -18
  727. package/src/TimeInput/TouchTimeField.tsx +4 -6
  728. package/src/Timestamp/Timestamp.spec.md +6 -12
  729. package/src/Timestamp/Timestamp.test.tsx +30 -5
  730. package/src/Timestamp/Timestamp.tsx +6 -2
  731. package/src/Timestamp/TimestampHoverCard.tsx +4 -4
  732. package/src/Toast/Toast.spec.md +15 -24
  733. package/src/Toast/Toast.tsx +104 -36
  734. package/src/Toast/ToastViewport.test.tsx +798 -1
  735. package/src/Toast/ToastViewport.tsx +121 -53
  736. package/src/ToggleButton/ToggleButton.test.tsx +27 -0
  737. package/src/ToggleButton/ToggleButtonGroup.tsx +20 -1
  738. package/src/Token/Token.doc.mjs +2 -2
  739. package/src/Token/Token.spec.md +52 -61
  740. package/src/Token/Token.test.tsx +104 -0
  741. package/src/Token/Token.tsx +75 -5
  742. package/src/Token/TokenLink.tsx +21 -7
  743. package/src/Tokenizer/Tokenizer.spec.md +18 -4
  744. package/src/Tokenizer/Tokenizer.test.tsx +176 -0
  745. package/src/Tokenizer/Tokenizer.tsx +48 -12
  746. package/src/Tokenizer/TokenizerBottomSheet.test.tsx +23 -4
  747. package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
  748. package/src/Tokenizer/TokenizerClearAllMessageContext.ts +21 -0
  749. package/src/Toolbar/Toolbar.spec.md +5 -6
  750. package/src/Toolbar/Toolbar.test.tsx +30 -0
  751. package/src/Toolbar/Toolbar.tsx +2 -1
  752. package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
  753. package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
  754. package/src/TopNav/TopNav.test.tsx +27 -0
  755. package/src/TopNav/TopNavMegaMenu.test.tsx +21 -0
  756. package/src/TopNav/TopNavMegaMenu.tsx +4 -1
  757. package/src/TopNav/TopNavMenu.test.tsx +17 -0
  758. package/src/TopNav/TopNavMenu.tsx +1 -0
  759. package/src/TreeList/TreeList.test.tsx +26 -0
  760. package/src/TreeList/TreeListItem.tsx +26 -4
  761. package/src/Typeahead/BaseTypeahead.doc.mjs +3 -3
  762. package/src/Typeahead/BaseTypeahead.spec.md +45 -45
  763. package/src/Typeahead/BaseTypeahead.tsx +48 -9
  764. package/src/Typeahead/Typeahead.test.tsx +294 -11
  765. package/src/Typeahead/Typeahead.tsx +51 -9
  766. package/src/__tests__/internalModulesNotExperimental.test.ts +88 -0
  767. package/src/__tests__/pressState.ts +8 -4
  768. package/src/gestures/GestureArena.ts +111 -11
  769. package/src/gestures/GestureHost.ts +2064 -0
  770. package/src/gestures/GestureRecognizer.ts +21 -1
  771. package/src/gestures/LongPressGestureRecognizer.ts +4 -0
  772. package/src/gestures/PanGestureRecognizer.ts +4 -0
  773. package/src/gestures/PinchGestureRecognizer.ts +148 -0
  774. package/src/gestures/PressTracker.ts +386 -0
  775. package/src/gestures/README.md +420 -0
  776. package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
  777. package/src/gestures/SwipeGestureRecognizer.ts +197 -0
  778. package/src/gestures/TapGestureRecognizer.ts +4 -0
  779. package/src/gestures/VelocityTracker.ts +10 -3
  780. package/src/gestures/__tests__/GestureHost.test.ts +2136 -0
  781. package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
  782. package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
  783. package/src/gestures/__tests__/PressTracker.test.ts +275 -0
  784. package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
  785. package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
  786. package/src/gestures/__tests__/arena.test.ts +40 -0
  787. package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
  788. package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
  789. package/src/gestures/__tests__/browser/fixture.ts +307 -0
  790. package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
  791. package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
  792. package/src/gestures/__tests__/haptics.test.ts +187 -0
  793. package/src/gestures/__tests__/harness.ts +52 -4
  794. package/src/gestures/__tests__/pressTrackerFactory.test.ts +59 -0
  795. package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
  796. package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
  797. package/src/gestures/__tests__/useGestureRecognizer.test.tsx +570 -0
  798. package/src/gestures/haptics.ts +203 -0
  799. package/src/gestures/index.ts +79 -0
  800. package/src/gestures/nativeScroll.ts +277 -0
  801. package/src/gestures/touchAction.ts +191 -0
  802. package/src/gestures/touchActionRule.ts +157 -0
  803. package/src/gestures/types.ts +30 -9
  804. package/src/gestures/useGestureRecognizer.ts +305 -0
  805. package/src/hooks/index.ts +5 -1
  806. package/src/hooks/modalAnnounce.ts +129 -72
  807. package/src/hooks/scrollKeyboardDelegation.test.ts +33 -0
  808. package/src/hooks/scrollKeyboardDelegation.ts +9 -3
  809. package/src/hooks/useAdaptivePresentation.ts +4 -1
  810. package/src/hooks/useAnnounce.doc.mjs +35 -3
  811. package/src/hooks/useAnnounce.replace.test.tsx +516 -0
  812. package/src/hooks/useAnnounce.ts +209 -102
  813. package/src/hooks/useAnnounceRenderedText.adopters.test.tsx +10 -1
  814. package/src/hooks/useAnnounceRenderedText.ts +17 -3
  815. package/src/hooks/useBusyAnnouncement.ts +7 -10
  816. package/src/hooks/useMenuHover.ts +15 -1
  817. package/src/hooks/useScrollOverflow.doc.mjs +1 -1
  818. package/src/hooks/useScrollOverflow.test.tsx +102 -1
  819. package/src/hooks/useScrollOverflow.ts +59 -10
  820. package/src/i18n/__tests__/useListFormatter.test.tsx +58 -0
  821. package/src/i18n/generated-locales/af-ZA.generated.ts +0 -7
  822. package/src/i18n/generated-locales/ar-SA.generated.ts +0 -6
  823. package/src/i18n/generated-locales/ca-ES.generated.ts +0 -7
  824. package/src/i18n/generated-locales/cs-CZ.generated.ts +0 -6
  825. package/src/i18n/generated-locales/da-DK.generated.ts +0 -6
  826. package/src/i18n/generated-locales/de-DE.generated.ts +0 -6
  827. package/src/i18n/generated-locales/el-GR.generated.ts +0 -7
  828. package/src/i18n/generated-locales/en.generated.ts +9 -6
  829. package/src/i18n/generated-locales/es-ES.generated.ts +0 -7
  830. package/src/i18n/generated-locales/fi-FI.generated.ts +0 -6
  831. package/src/i18n/generated-locales/fr-FR.generated.ts +0 -7
  832. package/src/i18n/generated-locales/he-IL.generated.ts +0 -6
  833. package/src/i18n/generated-locales/hu-HU.generated.ts +0 -6
  834. package/src/i18n/generated-locales/it-IT.generated.ts +0 -7
  835. package/src/i18n/generated-locales/ja-JP.generated.ts +0 -6
  836. package/src/i18n/generated-locales/ko-KR.generated.ts +0 -6
  837. package/src/i18n/generated-locales/nl-NL.generated.ts +0 -6
  838. package/src/i18n/generated-locales/no-NO.generated.ts +0 -6
  839. package/src/i18n/generated-locales/pl-PL.generated.ts +0 -7
  840. package/src/i18n/generated-locales/pseudo.generated.ts +9 -6
  841. package/src/i18n/generated-locales/pt-BR.generated.ts +0 -7
  842. package/src/i18n/generated-locales/pt-PT.generated.ts +0 -7
  843. package/src/i18n/generated-locales/ro-RO.generated.ts +0 -6
  844. package/src/i18n/generated-locales/ru-RU.generated.ts +0 -7
  845. package/src/i18n/generated-locales/sr-SP.generated.ts +0 -6
  846. package/src/i18n/generated-locales/sv-SE.generated.ts +0 -6
  847. package/src/i18n/generated-locales/tr-TR.generated.ts +0 -7
  848. package/src/i18n/generated-locales/uk-UA.generated.ts +0 -7
  849. package/src/i18n/generated-locales/vi-VN.generated.ts +0 -6
  850. package/src/i18n/generated-locales/zh-CN.generated.ts +0 -6
  851. package/src/i18n/generated-locales/zh-TW.generated.ts +0 -6
  852. package/src/i18n/useListFormatter.ts +42 -0
  853. package/src/motion/MEASUREMENTS.md +2 -1
  854. package/src/motion/README.md +113 -33
  855. package/src/motion/__tests__/animator.interaction.browser.spec.ts +843 -0
  856. package/src/motion/__tests__/motionBundle.ts +14 -0
  857. package/src/motion/animator.test.ts +1125 -32
  858. package/src/motion/animator.ts +932 -130
  859. package/src/motion/coast.ts +10 -3
  860. package/src/motion/reducedMotion.ts +12 -2
  861. package/src/motion/reducedMotionPlan.test.ts +26 -0
  862. package/src/motion/reducedMotionPlan.ts +20 -1
  863. package/src/motion/resolveMotion.test.ts +123 -0
  864. package/src/motion/resolveMotion.ts +68 -0
  865. package/src/motion/roleValue.ts +2 -1
  866. package/src/motion/roles.test.ts +21 -4
  867. package/src/motion/uikit/tableImports.test.ts +293 -0
  868. package/src/motion/uikit/timing.ts +15 -1
  869. package/src/motion/uikit/values.test.ts +23 -12
  870. package/src/theme/Theme.doc.mjs +1 -1
  871. package/src/theme/defineTheme.ts +117 -8
  872. package/src/theme/derivedVarRegistry.test.ts +4 -0
  873. package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
  874. package/src/theme/domainTokens/index.ts +6 -10
  875. package/src/theme/expandMotionScale.test.ts +1 -1
  876. package/src/theme/index.ts +5 -0
  877. package/src/theme/motionKnobs.ts +82 -0
  878. package/src/theme/resolveThemeValues.ts +68 -6
  879. package/src/theme/themeAdaptations.ts +52 -12
  880. package/src/theme/themeMotion.test.ts +620 -0
  881. package/src/theme/themeMotion.ts +221 -0
  882. package/src/theme/tokenReferences.ts +149 -0
  883. package/src/theme/tokens.stylex.ts +10 -0
  884. package/src/theme/tokens.ts +15 -158
  885. package/src/utils/focusOutline.stylex.ts +28 -0
  886. package/src/utils/focusReturn.ts +17 -6
  887. package/src/utils/getNodeText.test.ts +24 -0
  888. package/src/utils/getNodeText.ts +37 -0
  889. package/src/utils/interactionModality.test.ts +45 -1
  890. package/src/utils/interactionModality.ts +64 -5
  891. package/src/utils/interactionOverlay.stylex.ts +12 -3
  892. package/src/utils/plainDate.test.ts +90 -0
  893. package/src/utils/plainDate.ts +58 -3
  894. package/src/utils/presentation.test.ts +380 -0
  895. package/src/utils/presentation.ts +180 -0
  896. package/src/utils/pressFeedback.test.ts +138 -0
  897. package/src/utils/pressFeedback.ts +34 -11
  898. package/src/utils/pressGesture.test.ts +9 -0
  899. package/src/utils/pressPaintPriority.test.ts +80 -0
  900. package/src/utils/primaryClick.test.ts +38 -0
  901. package/src/utils/primaryClick.ts +28 -0
  902. package/src/utils/sharedMutationObserver.test.ts +54 -1
  903. package/src/utils/sharedMutationObserver.ts +87 -29
  904. package/src/utils/timeFormat.test.ts +204 -0
  905. package/src/utils/timeFormat.ts +314 -0
  906. package/src/utils/touchPresentation.stylex.ts +43 -0
  907. package/src/utils/touchPresentation.test.ts +140 -1
  908. package/src/utils/touchPresentation.ts +13 -8
  909. package/src/utils/touchQueries.ts +15 -0
  910. package/src/utils/unicodeDigits.test.ts +44 -0
  911. package/src/utils/unicodeDigits.ts +71 -0
  912. package/src/utils/useFocusAcrossSwap.ts +55 -0
@@ -0,0 +1,193 @@
1
+ ---
2
+ schema_version: 3
3
+ template_version: 7
4
+ kind: component
5
+ id: component:LayoutHeader
6
+ authority: current
7
+ archive_reason: null
8
+ superseded_by: null
9
+ approved_by: cixzhang
10
+ approved_at: 2026-10-30
11
+ owners: [cixzhang]
12
+ review_triggers: [public-api, behavior, layout, theming, accessibility]
13
+ verified_by:
14
+ [
15
+ packages/core/src/Layout/LayoutSlots.test.tsx,
16
+ packages/core/src/Layout/Layout.test.tsx,
17
+ packages/core/src/Layout/__tests__/contentWidth.test.tsx,
18
+ packages/core/src/Layout/__tests__/Layout.a11y.test.tsx,
19
+ packages/core/src/Layout/__tests__/Layout.a11y.chromium.spec.ts,
20
+ scripts/check-knowledge.mjs,
21
+ ]
22
+ modules: []
23
+ families: [family:layout-regions]
24
+ design_specs: []
25
+ architecture:
26
+ [
27
+ architecture:container-padding,
28
+ architecture:component-theming-surface,
29
+ architecture:public-component-api,
30
+ ]
31
+ contributing: []
32
+ system_specs: [spec:AST-038]
33
+ ---
34
+
35
+ # LayoutHeader component contract
36
+
37
+ ## Contract at a glance
38
+
39
+ | Area | Contract |
40
+ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
41
+ | Public contract | `children`, `hasDivider`, `height`, `padding`, `paddingBlockEnd`, `label`, `role`, root `BaseProps`, and a root `ref`. |
42
+ | Behavior | A non-shrinking header region whose inner wrapper applies and publishes the Layout inset and aligns to the Layout's content width. |
43
+ | End-user impact | People see a header that keeps its height above scrolling content, with content aligned to the page's readable width. |
44
+ | Builder impact | None; the record describes shipped behavior. |
45
+ | Compatibility/readiness | Released behavior recorded as current; no API, default, or output changes. Two implementation gaps are listed under Current-state impact. |
46
+ | Review checks | Reject a header that shrinks, a published inset that differs from the applied padding, an inferred landmark, or a lost divider default. |
47
+ | Governing rules | `family:layout-regions` FR1, FR4–FR6, FR8; `architecture:container-padding`; `architecture:public-component-api` INV5–INV8. |
48
+
49
+ This table is a review projection; the body below is authoritative.
50
+
51
+ ## Intent
52
+
53
+ LayoutHeader is the optional header region a caller places in a Layout's
54
+ `header` slot. It owns the header's size, inset, divider, and caller-supplied
55
+ landmark semantics; the caller owns its content.
56
+
57
+ Consumer syntax and examples belong in `LayoutHeader.doc.mjs`.
58
+
59
+ ## Compatibility and migration
60
+
61
+ - Released default preserved: `yes` — no divider unless a Layout default says
62
+ so, automatic inset, no landmark role.
63
+ - Compatibility class: records shipped behavior; no public prop, default, DOM,
64
+ target, or styling output changes.
65
+ - Controlled/uncontrolled behavior: not applicable
66
+ - Migration decision: none
67
+
68
+ Consumer migration instructions belong in consumer docs and release notes.
69
+
70
+ ## Current-state impact
71
+
72
+ - **Caller `data-divider` overrides the reflected divider (FR5).** Caller
73
+ props spread after the component's `data-divider`, so a caller value replaces
74
+ it: `data-divider="false"` draws no line yet stops the middle row below
75
+ from collapsing its spacing, where `architecture:public-component-api` INV5
76
+ keeps component-owned behavior from being overwritten.
77
+ - **Nested Layouts inherit the collapse (FR3).** When this header has no
78
+ divider, Layouts nested in the middle row, including inside a Dialog,
79
+ Drawer, or BottomSheet opened from it, inherit its spacing collapse and sit
80
+ flush against their own dividers (`family:layout-regions` FR6;
81
+ `spec:AST-038` FR7).
82
+
83
+ ## Ownership boundary
84
+
85
+ **Owns**
86
+
87
+ - The header root, which carries the `layout-header` target that
88
+ `component:Layout` maps, and its inner padding wrapper.
89
+ - Header height, divider, inset, and caller-supplied role and label.
90
+
91
+ **Does not own / non-goals**
92
+
93
+ - Slot placement, the Layout-edge inset, content width, and the divider
94
+ default — owned by `component:Layout`.
95
+ - Header content and its meaning — owned by the caller.
96
+
97
+ ## Public concepts
98
+
99
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
100
+ | --------------- | ------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------- | ------------------------- | ------------------------ | --------- | -------------------------------- |
101
+ | Divider | `true`, `false`, unset | Draws a line on the header's block-end edge. | Always | Layout default, else none | `component:LayoutHeader` | Stable | — |
102
+ | Height | number (px); CSS length string; unset | Fixes the header's block size. | Always | content height | `component:LayoutHeader` | Stable | — |
103
+ | Inset | spacing step; `0`; unset | Uniform padding that replaces the automatic inset; `0` is full bleed. | Always | automatic | `component:LayoutHeader` | Stable | Closed union; rejected by types. |
104
+ | Block-end inset | spacing step; unset | Replaces the block-end padding alone. | Always | automatic | `component:LayoutHeader` | Stable | Closed union; rejected by types. |
105
+ | Landmark | caller `role` and `label` | Exposes the header as the role the caller names, with that accessible name. | Always | none | caller | Stable | — |
106
+
107
+ ## Behavioral and layout contract
108
+
109
+ | ID | Invariant | Basis |
110
+ | --- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
111
+ | FR1 | LayoutHeader renders a root `div` carrying the `layout-header` target that does not shrink, around an inner `div` that holds the children, has the Layout's content width as its maximum width, and centers within the root. `height` fixes the root's block size, with numbers as pixels. | Current source and tests |
112
+ | FR2 | Without `padding`, the inner wrapper's inline and block-start padding is the Layout-edge inset and its block-end padding is the inner inset, where the Layout-edge inset comes from the Layout's `padding`, else the nearest padding container, and the inner inset from the nearest padding container (Card, Section, Dialog, Drawer, or BottomSheet), each spacing step 4 otherwise. A `padding` step replaces all four edges, and `0` removes them. `paddingBlockEnd` replaces the block-end edge alone. The wrapper publishes container-padding values equal to the padding it applies. | Current source and tests; `family:layout-regions` FR4; `architecture:container-padding` |
113
+ | FR3 | A divider draws a 1px solid `--color-border` line on the root's block-end edge and reflects `data-divider="true"`. `hasDivider` decides; when unset, the nearest Layout `defaultHasDividers` in the same layer decides (the default stops at a layer boundary, `spec:AST-038` FR7); otherwise there is no divider. A header without a divider lets the middle row below it collapse its block-start spacing. Implementation gap: Layouts nested in that middle row, including inside a Dialog, Drawer, or BottomSheet opened from it, inherit the collapse (`component:LayoutContent` Current-state impact; `spec:AST-038` FR7). | Current source and tests; `family:layout-regions` FR6 |
114
+ | FR4 | `role` and `label` set the root's `role` and `aria-label`; LayoutHeader adds no role of its own. | Current source and tests; `family:layout-regions` FR8 |
115
+ | FR5 | `ref` reaches the root. Supported DOM, data, ARIA, and event props reach the root, `xstyle`, `className`, and `style` compose after component styles, and the reflected `data-divider` stays component-owned (`architecture:public-component-api` INV5). Implementation gap: caller props spread after `data-divider`, so a caller `data-divider` replaces the reflected value and changes the neighbouring spacing collapse (Current-state impact). | Current source and tests; `architecture:public-component-api` INV5–INV8 |
116
+
117
+ ### Allowed variation
118
+
119
+ - **AV1 — Content.** Any caller content may fill the header.
120
+ - **AV2 — Landmark.** The caller chooses whether the header is a landmark and
121
+ which one.
122
+
123
+ ### Representative states
124
+
125
+ | State | Required invariant | Allowed variation |
126
+ | ----------------- | -------------------------------------------------- | ----------------- |
127
+ | Default in Layout | Automatic inset, no divider, no role. | Content. |
128
+ | With divider | Block-end line and `data-divider="true"`. | — |
129
+ | Explicit padding | Uniform padding, published to children. | Step. |
130
+ | `paddingBlockEnd` | Only the block-end edge changes. | Step. |
131
+ | Banner landmark | `role="banner"` and the caller's name on the root. | Name. |
132
+
133
+ ### Transformation and precedence order
134
+
135
+ - **ORD1 — Divider.** `hasDivider` → Layout `defaultHasDividers` → none.
136
+ - **ORD2 — Padding.** `paddingBlockEnd` for block-end → `padding` → the
137
+ automatic inset.
138
+
139
+ ### Performance and resources
140
+
141
+ - **PR1 — No external lifecycle.** LayoutHeader reads the divider default from
142
+ its Layout and adds no listener, observer, timer, or measurement.
143
+
144
+ ## Accessibility contract
145
+
146
+ - **AR1 — Explicit landmarks only.** The header is a landmark only when the
147
+ caller supplies `role`, and it is named only by the caller's `label`
148
+ (`family:layout-regions` FR8).
149
+
150
+ ## Design relationships
151
+
152
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
153
+ | ---------------- | ------------------------------------------------------- | ------------------------ | -------------- | ------------------ |
154
+ | Header | A fixed header band with an optional block-end divider. | Current source and docs | Supporting | FR1–FR3 |
155
+
156
+ Theming: the root carries the `layout-header` target, which `Layout.doc.mjs`
157
+ declares and `component:Layout` maps. `LayoutHeader.doc.mjs` declares no anatomy
158
+ of its own, so no anatomy-theming block is declared here.
159
+
160
+ ## Family and system relationships
161
+
162
+ - `family:layout-regions` owns region boundaries, padding replacement, divider
163
+ spacing, and landmark rules; FR2–FR4 and AR1 apply them.
164
+ - `architecture:container-padding` owns inset publication; FR2 applies it.
165
+ - `component:Layout` owns slot placement, the Layout-edge inset, content
166
+ width, the divider default, and the `layout-header` target mapping.
167
+ - `architecture:public-component-api` owns caller-input routing; FR5 applies
168
+ it.
169
+
170
+ ## Verification map
171
+
172
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
173
+ | --------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
174
+ | FR1 | `LayoutSlots.test.tsx` class, height, and inner-wrapper tests; `contentWidth.test.tsx` LayoutHeader inner-wrapper and divider tests | Default; numeric height | A lost `layout-header` class, a missing pixel height, children placed directly on the root, or a divider off the outer element fails. Gap: the non-shrinking root, the content-width maximum, and centering have no check. | `audit:LayoutHeader/layout` |
175
+ | FR2, ORD2 | `Layout.test.tsx` `paddingBlockEnd` tests | `paddingBlockEnd` alone and with `padding` | A `paddingBlockEnd` that adds no class, changes more than the block-end edge, or leaves the shared per-edge family fails. Gap: the automatic inset, the `padding` replacement, full bleed, and the published values have no check. | `audit:LayoutHeader/layout` |
176
+ | FR3, ORD1 | `LayoutSlots.test.tsx` and `Layout.test.tsx` divider tests | Default; `hasDivider`; Layout default; explicit `false` | A missing or unexpected `data-divider`, an ignored Layout default, or an explicit `false` that loses fails. Gap: the line's paint and the collapsed spacing below a header without a divider have no check. No test covers the default stopping at a layer boundary or the inherited nested collapse. | `audit:LayoutHeader/layout` |
177
+ | FR4, AR1 | `LayoutSlots.test.tsx` landmark test; `Layout.a11y.test.tsx` and `Layout.a11y.chromium.spec.ts` `header-banner` state | Caller `banner` role and label | A lost role or name fails, including at the accessibility tree. Gap: no test asserts that a header without `role` exposes none. | `audit:LayoutHeader/accessibility` |
178
+ | FR5 | `LayoutSlots.test.tsx` ref and className tests | Ref; caller class | A ref on another element or a dropped class fails. Gap: no test covers DOM, data, or event props, `style`, or the `xstyle` merge order. No test covers a caller `data-divider`. | `audit:LayoutHeader/api` |
179
+ | PR1 | Source review | Every state | Gap: no automated check fails if LayoutHeader adds a listener, timer, or measurement. | `audit:LayoutHeader/behavior` |
180
+
181
+ ## Decision log
182
+
183
+ None recorded. The record describes shipped behavior.
184
+
185
+ ## Open questions
186
+
187
+ None.
188
+
189
+ ## Content boundary
190
+
191
+ This file does not duplicate consumer prop tables/examples, current audit
192
+ results, implementation steps, Layout slot rules, or container-padding
193
+ mechanics. It links to their owners.
@@ -23,7 +23,7 @@ import * as stylex from '@stylexjs/stylex';
23
23
  import {layoutHeaderMarker} from './layoutEdges.stylex';
24
24
  import {LayoutDividerContext} from './LayoutDividerContext';
25
25
  import {colorVars, spacingVars} from '../theme/tokens.stylex';
26
- import {mergeProps} from '../utils';
26
+ import {mergeProps} from '../utils/mergeProps';
27
27
  import type {SizeValue, SpacingStep} from '../utils/types';
28
28
  import {themeProps} from '../utils/themeProps';
29
29
  import {
@@ -0,0 +1,194 @@
1
+ ---
2
+ schema_version: 3
3
+ template_version: 7
4
+ kind: component
5
+ id: component:LayoutPanel
6
+ authority: current
7
+ archive_reason: null
8
+ superseded_by: null
9
+ approved_by: cixzhang
10
+ approved_at: 2026-10-30
11
+ owners: [cixzhang]
12
+ review_triggers: [public-api, behavior, layout, theming, accessibility]
13
+ verified_by:
14
+ [
15
+ packages/core/src/Layout/LayoutSlots.test.tsx,
16
+ packages/core/src/Layout/__tests__/Layout.a11y.test.tsx,
17
+ packages/core/src/Layout/__tests__/Layout.a11y.chromium.spec.ts,
18
+ scripts/check-knowledge.mjs,
19
+ ]
20
+ modules: []
21
+ families: [family:layout-regions]
22
+ design_specs: []
23
+ architecture:
24
+ [
25
+ architecture:container-padding,
26
+ architecture:component-theming-surface,
27
+ architecture:public-component-api,
28
+ ]
29
+ contributing: []
30
+ system_specs: []
31
+ ---
32
+
33
+ # LayoutPanel component contract
34
+
35
+ ## Contract at a glance
36
+
37
+ | Area | Contract |
38
+ | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
39
+ | Public contract | `children`, `width`, `resizable`, `hasDivider`, `isScrollable`, `padding`, `label`, `role`, root `BaseProps`, and a root `ref`. |
40
+ | Behavior | A fixed-width side region at logical start or end that scrolls by default, with an optional divider on its content-facing edge. |
41
+ | End-user impact | People see a side panel that keeps its width, scrolls on its own, and mirrors to the other side in right-to-left. |
42
+ | Builder impact | None; the record describes shipped behavior. |
43
+ | Compatibility/readiness | Released behavior recorded as current; no API, default, or output changes. Two implementation gaps are listed under Current-state impact. |
44
+ | Review checks | Reject a divider on the outer edge, a panel that shrinks, an inferred landmark, `width` beating `resizable`, or a further publication mismatch. |
45
+ | Governing rules | `family:layout-regions` FR1, FR2, FR4–FR8, FR10; `architecture:container-padding`; `architecture:public-component-api` INV5–INV8. |
46
+
47
+ This table is a review projection; the body below is authoritative.
48
+
49
+ ## Intent
50
+
51
+ LayoutPanel is the side region a caller places in a Layout's `start` or `end`
52
+ slot. It owns the panel's width, inset, scrolling, divider, and
53
+ caller-supplied landmark semantics; the caller owns its content.
54
+
55
+ Consumer syntax and examples belong in `LayoutPanel.doc.mjs`.
56
+
57
+ ## Compatibility and migration
58
+
59
+ - Released default preserved: `yes` — no divider, scrollable, automatic
60
+ inset, content width.
61
+ - Compatibility class: records shipped behavior; no public prop, default, DOM,
62
+ target, or styling output changes.
63
+ - Controlled/uncontrolled behavior: not applicable
64
+ - Migration decision: none
65
+
66
+ Consumer migration instructions belong in consumer docs and release notes.
67
+
68
+ ## Current-state impact
69
+
70
+ - **Published inset differs from applied padding (FR3).** On the automatic
71
+ path a panel applies the Layout-edge inset on its outer inline edge and on
72
+ a block edge with no header or footer, but publishes the inner inset on
73
+ every edge. A full-bleed child then lines up against a value that differs
74
+ from the padding the panel applies, where `architecture:container-padding`
75
+ has a region publish its applied padding.
76
+ - **Two divider owners can paint one boundary (FR4).** A panel with
77
+ `hasDivider` beside a ResizeHandle that draws the same line paints the
78
+ boundary twice; nothing prevents it, so callers keep `hasDivider={false}`
79
+ when the ResizeHandle owns the line (`family:layout-regions` FR5).
80
+
81
+ ## Ownership boundary
82
+
83
+ **Owns**
84
+
85
+ - The panel root, which carries the `layout-panel` target that
86
+ `component:Layout` maps.
87
+ - Panel width, inset, scrolling, divider, and caller-supplied role and label.
88
+
89
+ **Does not own / non-goals**
90
+
91
+ - Slot placement and the Layout-edge inset — owned by `component:Layout`.
92
+ - Resize interaction and the resize handle — owned by useResizable and
93
+ ResizeHandle (`family:layout-regions` FR10).
94
+ - Panel content and its meaning — owned by the caller.
95
+
96
+ ## Public concepts
97
+
98
+ | Concept | Closed values or states | Meaning | Availability by variant/orientation/state | Default | Owner | Stability | Invalid-value behavior |
99
+ | --------- | ------------------------------------- | -------------------------------------------------------------------------- | ----------------------------------------- | ------------- | ----------------------- | --------- | -------------------------------- |
100
+ | Width | number (px); CSS length string; unset | The panel's inline size. | Always | content width | `component:LayoutPanel` | Stable | — |
101
+ | Resizable | the value from useResizable | Supplies a resizable width that wins over `width`. | Always | none | `component:LayoutPanel` | Stable | — |
102
+ | Divider | `true`, `false` | Draws a line on the panel's content-facing edge. | Start or end slot | `false` | `component:LayoutPanel` | Stable | — |
103
+ | Scrolling | `true`, `false` | Scrolls overflow, or clips it. | Always | `true` | `component:LayoutPanel` | Stable | — |
104
+ | Inset | spacing step; `0`; unset | Uniform padding that replaces the automatic inset; `0` is full bleed. | Always | automatic | `component:LayoutPanel` | Stable | Closed union; rejected by types. |
105
+ | Landmark | caller `role` and `label` | Exposes the panel as the role the caller names, with that accessible name. | Always | none | caller | Stable | — |
106
+
107
+ ## Behavioral and layout contract
108
+
109
+ | ID | Invariant | Basis |
110
+ | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
111
+ | FR1 | LayoutPanel renders one `div` carrying the `layout-panel` target that does not shrink and holds the children directly. `width` sets its inline size, with numbers as pixels; a `resizable` value's size wins over `width`. It scrolls overflow by default; `isScrollable={false}` clips it. | Current source and tests; `family:layout-regions` FR7, FR10 |
112
+ | FR2 | In the `start` slot the panel's content-facing edge is its inline end; in the `end` slot it is its inline start; both follow writing direction. | Current source and tests; `family:layout-regions` FR2 |
113
+ | FR3 | Without `padding`, the panel's outer inline edge has the Layout-edge inset, a block edge with no header or footer beside it has the Layout-edge inset, and other edges have the inner inset, where the Layout-edge inset comes from the Layout's `padding`, else the nearest padding container, and the inner inset from the nearest padding container (Card, Section, Dialog, Drawer, or BottomSheet), each spacing step 4 otherwise. A `padding` step replaces all four edges, and `0` removes them. The panel publishes container-padding values equal to the padding it applies. Implementation gap: on the automatic path it publishes the inner inset on every edge (Current-state impact). | Current source; `family:layout-regions` FR4; `architecture:container-padding` |
114
+ | FR4 | `hasDivider` draws a 1px solid `--color-border` line on the content-facing edge; LayoutPanel does not read a Layout divider default. Without a divider and with the automatic inset, the panel overlaps the content area by the inner inset so the two share one gap. One boundary has one divider owner (`family:layout-regions` FR5). Implementation gap: nothing prevents a panel divider and an adjacent ResizeHandle line from both painting (Current-state impact). | Current source and docs; `family:layout-regions` FR5, FR6 |
115
+ | FR5 | `role` and `label` set the root's `role` and `aria-label`; LayoutPanel adds no role of its own. | Current source and tests; `family:layout-regions` FR8 |
116
+ | FR6 | `ref` reaches the root. Supported DOM, data, ARIA, and event props reach the root after the component's own attributes; `xstyle`, `className`, and `style` compose after component styles. | Current source and tests; `architecture:public-component-api` INV5–INV8 |
117
+
118
+ ### Allowed variation
119
+
120
+ - **AV1 — Content.** Any caller content may fill the panel.
121
+ - **AV2 — Position.** The caller places the panel at start, end, or both.
122
+
123
+ ### Representative states
124
+
125
+ | State | Required invariant | Allowed variation |
126
+ | ------------------- | ------------------------------------------------------ | ----------------- |
127
+ | Start panel | Divider and shared gap on the inline-end edge. | Width. |
128
+ | End panel | Divider and shared gap on the inline-start edge. | Width. |
129
+ | Right-to-left | Start and end mirror. | — |
130
+ | Resizable | The resizable size sets the width. | Size. |
131
+ | Navigation landmark | `role="navigation"` and the caller's name on the root. | Name. |
132
+
133
+ ### Transformation and precedence order
134
+
135
+ - **ORD1 — Width.** `resizable` size → `width` → content width.
136
+ - **ORD2 — Padding.** `padding` → automatic inset per edge.
137
+
138
+ ### Performance and resources
139
+
140
+ - **PR1 — No external lifecycle.** LayoutPanel reads its slot and which slots
141
+ its Layout fills, and adds no listener, observer, timer, or measurement of
142
+ its own.
143
+
144
+ ## Accessibility contract
145
+
146
+ - **AR1 — Explicit landmarks only.** The panel is a landmark only when the
147
+ caller supplies `role`, named only by the caller's `label`
148
+ (`family:layout-regions` FR8).
149
+
150
+ ## Design relationships
151
+
152
+ | Anatomy or state | Design requirement | Representation authority | Hierarchy role | Component contract |
153
+ | ---------------- | ------------------------------------------------------------ | ------------------------ | -------------- | ------------------ |
154
+ | Panel | A fixed side region with an optional content-facing divider. | Current source and docs | Supporting | FR1–FR4 |
155
+
156
+ Theming: the root carries the `layout-panel` target, which `Layout.doc.mjs`
157
+ declares and `component:Layout` maps. `LayoutPanel.doc.mjs` declares no anatomy
158
+ of its own, so no anatomy-theming block is declared here.
159
+
160
+ ## Family and system relationships
161
+
162
+ - `family:layout-regions` owns region direction, padding replacement,
163
+ boundary ownership, divider spacing, scrolling, landmarks, and resize
164
+ delegation; FR1–FR5 and AR1 apply them.
165
+ - `architecture:container-padding` owns inset publication; FR3 applies it and
166
+ records the gap.
167
+ - `component:Layout` owns slot placement, the Layout-edge inset, and the
168
+ `layout-panel` target mapping.
169
+
170
+ ## Verification map
171
+
172
+ | Contract | Verification | Representative states | Mutation or failure expectation | Audit section |
173
+ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- |
174
+ | FR1, ORD1 | `LayoutSlots.test.tsx` class, width, and resizable tests | Numeric and string width; resizable | A lost `layout-panel` class, a missing width, or `width` beating `resizable` fails. Gap: the non-shrinking root, scrolling, and `isScrollable={false}` have no check. No requirement or check covers how a keyboard user reaches a scrolling panel's overflow when the panel holds no focusable content. | `audit:LayoutPanel/layout` |
175
+ | FR2 | `LayoutSlots.test.tsx` start- and end-slot tests; `Layout.a11y.chromium.spec.ts` `start-end-navigation-rtl` state | Start and end panels; right-to-left | A panel that fails to render in either slot fails. Gap: no check asserts which edge carries the divider or the shared gap, or the mirrored placement. | `audit:LayoutPanel/layout` |
176
+ | FR3, ORD2 | Source review | Automatic, explicit, and zero padding | Gap: no test covers the automatic per-edge inset, the `padding` replacement, full bleed, or the published values. | `audit:LayoutPanel/layout` |
177
+ | FR4 | Source review | `hasDivider`; no divider | Gap: no test covers the divider line, the shared gap, or a panel divider beside a ResizeHandle. | `audit:LayoutPanel/layout` |
178
+ | FR5, AR1 | `LayoutSlots.test.tsx` landmark test; `Layout.a11y.test.tsx` and `Layout.a11y.chromium.spec.ts` `start-end-navigation-rtl` and `nested-panel-region` states | Caller `navigation` and `region` roles and labels | A lost role or name fails, including at the accessibility tree. Gap: no test asserts that a panel without `role` exposes none. | `audit:LayoutPanel/accessibility` |
179
+ | FR6 | `LayoutSlots.test.tsx` ref and className tests | Ref; caller class | A ref on another element or a dropped class fails. Gap: no test covers `style`, DOM, data, or event props, or the `xstyle` merge order. | `audit:LayoutPanel/api` |
180
+ | PR1 | Source review | Every state | Gap: no automated check fails if LayoutPanel adds a listener, timer, or measurement. | `audit:LayoutPanel/behavior` |
181
+
182
+ ## Decision log
183
+
184
+ None recorded. The record describes shipped behavior.
185
+
186
+ ## Open questions
187
+
188
+ None.
189
+
190
+ ## Content boundary
191
+
192
+ This file does not duplicate consumer prop tables/examples, current audit
193
+ results, implementation steps, Layout slot rules, resize interaction, or
194
+ container-padding mechanics. It links to their owners.
@@ -93,15 +93,27 @@ async function runState(
93
93
  });
94
94
  }
95
95
 
96
- test('every Landmark expectation is exercised by at least one Layout state', async ({
97
- page,
98
- }) => {
99
- const cdp = await page.context().newCDPSession(page);
96
+ // Checking coverage runs every state again, which on a loaded runner nears
97
+ // the per-test timeout as one test. It runs as one serial part per state,
98
+ // sharing their results, then one check over all of them.
99
+ test.describe('every Landmark expectation is exercised by at least one Layout state', () => {
100
+ test.describe.configure({mode: 'serial'});
100
101
  const results: BindingResult[] = [];
102
+
101
103
  for (const state of LAYOUT_LANDMARK_A11Y_STATES) {
102
- results.push(await runState(page, cdp, state));
104
+ test(`runs ${state.id}`, async ({page}) => {
105
+ const cdp = await page.context().newCDPSession(page);
106
+ results.push(await runState(page, cdp, state));
107
+ });
103
108
  }
104
- expect(neverExercised(results)).toEqual([]);
109
+
110
+ test('no expectation is left unexercised', () => {
111
+ // Every part ran in this worker; this test alone proves nothing.
112
+ expect(results.map(result => result.state).sort()).toEqual(
113
+ LAYOUT_LANDMARK_A11Y_STATES.map(state => state.id).sort(),
114
+ );
115
+ expect(neverExercised(results)).toEqual([]);
116
+ });
105
117
  });
106
118
 
107
119
  for (const state of LAYOUT_LANDMARK_A11Y_STATES) {
@@ -132,6 +132,24 @@ describe('Lightbox', () => {
132
132
  expect(onOpenChange).toHaveBeenCalledWith(false);
133
133
  });
134
134
 
135
+ it('ignores a cancel that bubbles up from inside it', () => {
136
+ const onOpenChange = vi.fn();
137
+ render(
138
+ <Lightbox
139
+ isOpen={true}
140
+ onOpenChange={onOpenChange}
141
+ media={{src: '/photo.jpg', alt: 'Photo'}}
142
+ />,
143
+ );
144
+ // Only a close request fired at the <dialog> itself dismisses; a bubbling
145
+ // `cancel` from a control inside (a dismissed file picker) does not.
146
+ const inside = document.querySelector('dialog button')!;
147
+ const fromInside = new Event('cancel', {bubbles: true, cancelable: true});
148
+ inside.dispatchEvent(fromInside);
149
+ expect(onOpenChange).not.toHaveBeenCalled();
150
+ expect(fromInside.defaultPrevented).toBe(false);
151
+ });
152
+
135
153
  it('calls onOpenChange(false) on Escape via cancel event', () => {
136
154
  const onOpenChange = vi.fn();
137
155
  render(
@@ -459,6 +459,11 @@ export function Lightbox({
459
459
  // only, and never while an IME composition is in progress.
460
460
  const handleCancel = useCallback(
461
461
  (e: React.SyntheticEvent) => {
462
+ // A cancel that bubbles up from inside (a dismissed file picker) is not
463
+ // a close request; the platform's is fired at the dialog itself.
464
+ if (e.target !== e.currentTarget) {
465
+ return;
466
+ }
462
467
  e.preventDefault();
463
468
  if (!shouldDismissOnCloseRequest()) {
464
469
  return;
@@ -57,11 +57,15 @@ test('the viewer is as tall as the dynamic viewport, so a toolbar never covers i
57
57
  }
58
58
  };
59
59
  for (const sheet of Array.from(document.styleSheets)) {
60
- try {
61
- walk(sheet.cssRules);
62
- } catch {
63
- // A cross-origin stylesheet's rules are unreadable and not ours.
60
+ // A cross-origin stylesheet's rules are unreadable, and not ours: skip
61
+ // only such a sheet, so any other error still fails the proof.
62
+ if (
63
+ sheet.href != null &&
64
+ new URL(sheet.href, document.baseURI).origin !== location.origin
65
+ ) {
66
+ continue;
64
67
  }
68
+ walk(sheet.cssRules);
65
69
  }
66
70
  return {heights, supported: CSS.supports('height', '100dvh')};
67
71
  });
@@ -16,6 +16,7 @@ verified_by:
16
16
  packages/core/src/Link/__tests__/Link.a11y.test.tsx,
17
17
  packages/core/src/Link/__tests__/Link.a11y.chromium.spec.ts,
18
18
  packages/core/src/Link/__tests__/Link.navigation.a11y.chromium.spec.ts,
19
+ packages/core/src/Link/__tests__/Link.truncation.a11y.chromium.spec.ts,
19
20
  ]
20
21
  modules: []
21
22
  families: [family:navigation-destinations]
@@ -107,7 +108,7 @@ Consumer migration instructions belong in consumer docs and release notes.
107
108
  | FR3 | An external Link that is not rendered as a button shows a trailing extra-small external-link icon that inherits the root's color, followed by visually hidden new-tab text: `newTabLabel`, else the localized default. | Current source and tests |
108
109
  | FR4 | A destination reaches the link component only through the shared navigation rule; a rejected destination renders an inert anchor and never invokes a router. | `family:navigation-destinations` FR1–FR6; `spec:AST-005` |
109
110
  | FR5 | A disabled Link stays focusable with `aria-disabled="true"`, never navigates, and never runs `onClick`. The disabled anchor form omits `href`, `target`, and `rel`, takes a Tab stop, and skips the custom link component. In every form, clicks are cancelled and stopped, Enter and Space are suppressed, other keys reach the caller's `onKeyDown`, and the Link paints at half opacity with no pointer events and no press paint. A focused Link that becomes disabled MUST keep focus and expose the change on that element (`spec:AST-085` FR4, FR5), and a caller `aria-disabled`, `role`, or `tabIndex` MUST NOT replace the disabled exposure (`architecture:public-component-api` INV5). Implementation gap: caller props spread after Link's own, so a caller `aria-disabled`, `role`, or `tabIndex` overrides them. Implementation gap: an enabled link renders through the safe link component and a disabled one as a plain anchor (or a `<button>` when it has `onClick`), so a focused link that becomes disabled (or re-enabled) is replaced and focus falls to the page. | `spec:AST-085` FR1, FR2, FR4, FR5; `family:navigation-destinations` FR7; current tests |
110
- | FR6 | Children render inside Text with `type` (default `body`), `size`, `weight`, `color` (default `accent`), `display` (default `inline`), and `maxLines` (default `0`). The root inherits font family, size, weight, and line height and lays content out with a small gap; `isStandalone` sets the body size and leading on the root. A Link inside a Text with `maxLines` MUST truncate with that text. Implementation gap: the root is `inline-flex`, so an ancestor Text clamp does not truncate it. | Current source and tests |
111
+ | FR6 | Children render inside Text with `type` (default `body`), `size`, `weight`, `color` (default `accent`), `display` (default `inline`), and `maxLines` (default `0`). The root inherits font family, size, weight, and line height and lays content out with a small gap; with `maxLines` above 0 it stops at its container, so its Text truncates inside a constrained line; `isStandalone` sets the body size and leading on the root. A Link inside a Text with `maxLines` MUST truncate with that text. Implementation gap: the root is `inline-flex`, so an ancestor Text clamp does not truncate it. | Current source and tests |
111
112
  | FR7 | The root paints the chosen color for the six built-in colors, which the underline and the external icon take; the label's color comes from Text (FR6). On hover-capable pointers an enabled Link underlines on hover, and for `primary`, `secondary`, and `accent` the root color mixes in the hover tint. `hasUnderline` underlines at rest. | Current source and tests |
112
113
  | FR8 | Press feedback follows `design:user-states` DR1 and DR2 for Link's text surface: an enabled link or button form paints the pressed overlay, and a disabled Link does not. | `design:user-states` DR1, DR2; current tests |
113
114
  | FR9 | `label`, when non-empty, becomes `aria-label` and replaces the content as the accessible name; a caller `aria-label` overrides it; otherwise the content is the name. | Current tests |
@@ -191,7 +192,7 @@ carries no anatomy-theming map.
191
192
  | FR2, FR3, AR3 | `Link.test.tsx` external, target, rel, and new-tab cases; `Link.a11y.chromium.spec.ts` external state | External; explicit `_blank`; custom label | A missing safety token, icon, or new-tab text fails. Evidence gap: no test checks the accessible name of an external link with `label`. Evidence gap: no test sets `referrerPolicy` or asserts the external icon's size or color. | `audit:Link/accessibility` |
192
193
  | FR4 | `Link.navigation.a11y.chromium.spec.ts` | Rejected and ordinary schemes; native, router, downloads | A rejected destination that navigates or reaches a router fails. | `audit:Link/behavior` |
193
194
  | FR5, AR2 | `Link.test.tsx` disabled cases | Disabled anchor; disabled button form; with `onClick` | Navigation, a consumer `onClick`, a lost Tab stop, or a custom component on a disabled link fails. Evidence gap: no test disables a focused link or passes a caller `aria-disabled`, `role`, or `tabIndex`. Evidence gap: no test asserts that other keys reach the caller's `onKeyDown`, or the half-opacity, no-pointer-events paint. | `audit:Link/accessibility` |
194
- | FR6 (type) | `Link.test.tsx` text-type cases | Default `body`; `type="inherit"` | A dropped Text `type` fails. Evidence gap: no test asserts that `size`, `weight`, `color`, `display`, or `maxLines` reach Text, or the `isStandalone` root size. | `audit:Link/visual` |
195
+ | FR6 (type) | `Link.test.tsx` text-type cases | Default `body`; `type="inherit"` | A dropped Text `type` fails. `Link.truncation.a11y.chromium.spec.ts`: an anchor and a button Link with `maxLines={1}` in a fixed-width line stop at the line and draw an ellipsis. Evidence gap: no test asserts that `size`, `weight`, `color`, or `display` reach Text, or the `isStandalone` root size. | `audit:Link/visual` |
195
196
  | FR6, FR7 (paint) | Evidence gap: the color, underline, and standalone cases assert only that a link renders; hover paint is untested | Each color; `hasUnderline`; `isStandalone` | — | `audit:Link/visual` |
196
197
  | FR8 | `Link.test.tsx` pressed-state suite | Link, button form, disabled | No press paint, or press paint on a disabled Link, fails. | `audit:Link/behavior` |
197
198
  | FR9, FR11, AR4 | `Link.test.tsx` label, ref, and theme-class cases | With and without `label`; `data-color` | A missing or extra `aria-label`, target, `data-color`, or ref fails. The accessibility suites assert a passed `data-*` attribute and `aria-current` on the root, and the navigation suite asserts `download`. Evidence gap: no test passes both `label` and `aria-label`, or passes `className`, `style`, or `xstyle`. | `audit:Link/theming` |
package/src/Link/Link.tsx CHANGED
@@ -76,6 +76,14 @@ const styles = stylex.create({
76
76
  transitionDuration: durationVars['--duration-fast'],
77
77
  transitionTimingFunction: easeVars['--ease-standard'],
78
78
  },
79
+ // A truncating label needs a box that stops at its container: an
80
+ // inline-flex root otherwise grows to its whole text, so its Text never
81
+ // overflows and draws no ellipsis (`component:Link` FR6, `component:Text`
82
+ // FR4).
83
+ truncating: {
84
+ maxWidth: '100%',
85
+ minWidth: 0,
86
+ },
79
87
  /**
80
88
  * Reset styles for rendering as a <button> when href is undefined.
81
89
  * Strips all native button chrome so it looks identical to a link.
@@ -370,6 +378,7 @@ export function Link({
370
378
  hasUnderline && styles.hasUnderline,
371
379
  isStandalone && styles.standalone,
372
380
  isDisabled && styles.disabled,
381
+ maxLines > 0 && styles.truncating,
373
382
  xstyle,
374
383
  ),
375
384
  className,
@@ -403,6 +412,7 @@ export function Link({
403
412
  hasUnderline && styles.hasUnderline,
404
413
  isStandalone && styles.standalone,
405
414
  styles.disabled,
415
+ maxLines > 0 && styles.truncating,
406
416
  xstyle,
407
417
  ),
408
418
  className,
@@ -434,6 +444,7 @@ export function Link({
434
444
  hasUnderline && styles.hasUnderline,
435
445
  isStandalone && styles.standalone,
436
446
  isDisabled && styles.disabled,
447
+ maxLines > 0 && styles.truncating,
437
448
  xstyle,
438
449
  ),
439
450
  className,