@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3

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 (730) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +49 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +62 -20
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +7 -3
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +21 -23
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +12 -12
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +17 -9
  49. package/dist/Card/index.d.ts +35 -1
  50. package/dist/Card/index.d.ts.map +1 -1
  51. package/dist/Card/index.js +21 -1
  52. package/dist/Carousel/Carousel.d.ts.map +1 -1
  53. package/dist/Carousel/Carousel.js +3 -3
  54. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  55. package/dist/Chat/ChatComposerInput.js +2 -3
  56. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  57. package/dist/Chat/ChatLayout.js +3 -3
  58. package/dist/Chat/ChatMessageList.d.ts +22 -3
  59. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  60. package/dist/Chat/ChatMessageList.js +6 -3
  61. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  62. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  63. package/dist/Chat/ChatTokenizedText.js +11 -6
  64. package/dist/Chat/useChatComposerTokens.js +1 -1
  65. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  66. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  67. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  68. package/dist/ClickableCard/ClickableCard.js +3 -3
  69. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  70. package/dist/CodeBlock/CodeBlock.js +15 -4
  71. package/dist/CodeBlock/highlightRanges.js +1 -1
  72. package/dist/CodeBlock/highlightStyles.js +13 -13
  73. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  74. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  75. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  76. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  77. package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
  78. package/dist/ComplexSelector/ComplexSelector.js +1 -3
  79. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  80. package/dist/ContextMenu/ContextMenu.js +4 -3
  81. package/dist/DateInput/DateInput.d.ts +43 -0
  82. package/dist/DateInput/DateInput.d.ts.map +1 -1
  83. package/dist/DateInput/DateInput.js +22 -2
  84. package/dist/DateInput/NativeDateField.d.ts +10 -0
  85. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  86. package/dist/DateInput/NativeDateField.js +494 -0
  87. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  88. package/dist/DateInput/TouchDateField.js +82 -23
  89. package/dist/DateInput/index.d.ts +1 -1
  90. package/dist/DateInput/index.d.ts.map +1 -1
  91. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  92. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  93. package/dist/DateInput/nativeDateSegments.js +111 -0
  94. package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
  95. package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  96. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  97. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  98. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  99. package/dist/DateTimeInput/index.d.ts +1 -1
  100. package/dist/DateTimeInput/index.d.ts.map +1 -1
  101. package/dist/Dialog/Dialog.d.ts +21 -1
  102. package/dist/Dialog/Dialog.d.ts.map +1 -1
  103. package/dist/Dialog/Dialog.js +110 -58
  104. package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  105. package/dist/DropdownMenu/DropdownMenu.js +4 -13
  106. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  107. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  108. package/dist/Field/FieldLabel.d.ts.map +1 -1
  109. package/dist/Field/FieldLabel.js +9 -1
  110. package/dist/Field/InputClearButton.d.ts +9 -3
  111. package/dist/Field/InputClearButton.d.ts.map +1 -1
  112. package/dist/Field/InputClearButton.js +14 -3
  113. package/dist/FileInput/FileInput.d.ts.map +1 -1
  114. package/dist/FileInput/FileInput.js +3 -2
  115. package/dist/Heading/Heading.d.ts.map +1 -1
  116. package/dist/Heading/Heading.js +6 -3
  117. package/dist/HoverCard/HoverCard.d.ts +6 -0
  118. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  119. package/dist/HoverCard/HoverCard.js +104 -3
  120. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  121. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  122. package/dist/HoverCard/useHoverCard.js +74 -26
  123. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  124. package/dist/Indicator/CheckboxIndicator.js +6 -2
  125. package/dist/Item/Item.d.ts.map +1 -1
  126. package/dist/Item/Item.js +4 -2
  127. package/dist/Kbd/Kbd.d.ts.map +1 -1
  128. package/dist/Kbd/Kbd.js +2 -19
  129. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  130. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  131. package/dist/Layer/LayerDepthContext.js +66 -0
  132. package/dist/Layer/gestureCounter.d.ts +8 -0
  133. package/dist/Layer/gestureCounter.d.ts.map +1 -0
  134. package/dist/Layer/gestureCounter.js +53 -0
  135. package/dist/Layer/index.d.ts +3 -0
  136. package/dist/Layer/index.d.ts.map +1 -1
  137. package/dist/Layer/index.js +4 -0
  138. package/dist/Layer/layerStack.d.ts +98 -0
  139. package/dist/Layer/layerStack.d.ts.map +1 -0
  140. package/dist/Layer/layerStack.js +306 -0
  141. package/dist/Layer/useLayer.d.ts +23 -13
  142. package/dist/Layer/useLayer.d.ts.map +1 -1
  143. package/dist/Layer/useLayer.js +128 -8
  144. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  145. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  146. package/dist/Layer/useLayerDismissal.js +91 -0
  147. package/dist/Lightbox/Lightbox.d.ts +1 -0
  148. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  149. package/dist/Lightbox/Lightbox.js +103 -81
  150. package/dist/List/List.d.ts +1 -1
  151. package/dist/List/List.d.ts.map +1 -1
  152. package/dist/List/List.js +15 -4
  153. package/dist/Markdown/Markdown.d.ts +1 -1
  154. package/dist/Markdown/Markdown.d.ts.map +1 -1
  155. package/dist/Markdown/Markdown.js +20 -7
  156. package/dist/Markdown/index.d.ts +1 -1
  157. package/dist/Markdown/index.d.ts.map +1 -1
  158. package/dist/Markdown/parser.d.ts +38 -1
  159. package/dist/Markdown/parser.d.ts.map +1 -1
  160. package/dist/Markdown/parser.js +182 -32
  161. package/dist/MetadataList/MetadataListItem.d.ts +1 -1
  162. package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
  163. package/dist/MetadataList/MetadataListItem.js +4 -1
  164. package/dist/MobileNav/MobileNav.d.ts +6 -1
  165. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  166. package/dist/MobileNav/MobileNav.js +61 -36
  167. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  168. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  169. package/dist/MultiSelector/MultiSelector.js +73 -15
  170. package/dist/MultiSelector/hooks.d.ts +7 -1
  171. package/dist/MultiSelector/hooks.d.ts.map +1 -1
  172. package/dist/MultiSelector/hooks.js +3 -2
  173. package/dist/MultiSelector/index.d.ts +1 -1
  174. package/dist/MultiSelector/index.d.ts.map +1 -1
  175. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  176. package/dist/NavIcon/NavIcon.js +5 -1
  177. package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
  178. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  179. package/dist/NavMenu/NavHeadingMenu.js +9 -5
  180. package/dist/NumberInput/NumberInput.d.ts +6 -1
  181. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  182. package/dist/NumberInput/NumberInput.js +54 -104
  183. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  184. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  185. package/dist/NumberInput/numberInputCommit.js +71 -0
  186. package/dist/NumberInput/numberParser.d.ts +64 -0
  187. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  188. package/dist/NumberInput/numberParser.js +350 -0
  189. package/dist/Outline/Outline.d.ts.map +1 -1
  190. package/dist/Outline/Outline.js +3 -2
  191. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  192. package/dist/OverflowList/OverflowList.js +3 -2
  193. package/dist/Overlay/Overlay.d.ts.map +1 -1
  194. package/dist/Overlay/Overlay.js +3 -2
  195. package/dist/Popover/Popover.d.ts.map +1 -1
  196. package/dist/Popover/Popover.js +1 -9
  197. package/dist/Popover/usePopover.d.ts +7 -41
  198. package/dist/Popover/usePopover.d.ts.map +1 -1
  199. package/dist/Popover/usePopover.js +40 -21
  200. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  201. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  202. package/dist/PowerSearch/PowerSearch.js +19 -6
  203. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  204. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  205. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  206. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  207. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  208. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  209. package/dist/PowerSearch/types.d.ts +2 -0
  210. package/dist/PowerSearch/types.d.ts.map +1 -1
  211. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  212. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  213. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  214. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  215. package/dist/ProgressBar/ProgressBar.js +18 -5
  216. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  217. package/dist/Resizable/ResizeHandle.js +3 -2
  218. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  219. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  220. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  221. package/dist/SelectableCard/SelectableCard.js +12 -3
  222. package/dist/Selector/Selector.d.ts +18 -1
  223. package/dist/Selector/Selector.d.ts.map +1 -1
  224. package/dist/Selector/Selector.js +91 -18
  225. package/dist/Selector/hooks.d.ts +7 -1
  226. package/dist/Selector/hooks.d.ts.map +1 -1
  227. package/dist/Selector/hooks.js +3 -2
  228. package/dist/SideNav/SideNav.d.ts.map +1 -1
  229. package/dist/SideNav/SideNav.js +4 -3
  230. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavHeading.js +8 -7
  232. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  233. package/dist/SideNav/SideNavItem.js +4 -3
  234. package/dist/Slider/Slider.d.ts.map +1 -1
  235. package/dist/Slider/Slider.js +37 -5
  236. package/dist/Spinner/Spinner.d.ts +3 -3
  237. package/dist/Spinner/Spinner.d.ts.map +1 -1
  238. package/dist/Spinner/Spinner.js +130 -78
  239. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  240. package/dist/StatusDot/StatusDot.js +6 -1
  241. package/dist/Stepper/Step.d.ts +140 -0
  242. package/dist/Stepper/Step.d.ts.map +1 -0
  243. package/dist/Stepper/Step.js +1045 -0
  244. package/dist/Stepper/StepStatus.d.ts +24 -0
  245. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  246. package/dist/Stepper/StepStatus.js +1 -0
  247. package/dist/Stepper/Stepper.d.ts +93 -0
  248. package/dist/Stepper/Stepper.d.ts.map +1 -0
  249. package/dist/Stepper/Stepper.js +184 -0
  250. package/dist/Stepper/StepperContext.d.ts +41 -0
  251. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  252. package/dist/Stepper/StepperContext.js +34 -0
  253. package/dist/Stepper/index.d.ts +8 -0
  254. package/dist/Stepper/index.d.ts.map +1 -0
  255. package/dist/Stepper/index.js +7 -0
  256. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  257. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  258. package/dist/Stepper/stepper.stylex.js +20 -0
  259. package/dist/Switch/Switch.d.ts.map +1 -1
  260. package/dist/Switch/Switch.js +8 -3
  261. package/dist/TabList/Tab.d.ts +15 -2
  262. package/dist/TabList/Tab.d.ts.map +1 -1
  263. package/dist/TabList/Tab.js +32 -7
  264. package/dist/TabList/TabList.d.ts +46 -7
  265. package/dist/TabList/TabList.d.ts.map +1 -1
  266. package/dist/TabList/TabList.js +353 -23
  267. package/dist/TabList/TabListContext.d.ts +11 -1
  268. package/dist/TabList/TabListContext.d.ts.map +1 -1
  269. package/dist/TabList/TabListContext.js +11 -2
  270. package/dist/TabList/TabMenu.d.ts.map +1 -1
  271. package/dist/TabList/TabMenu.js +3 -2
  272. package/dist/TabList/index.d.ts +2 -2
  273. package/dist/TabList/index.d.ts.map +1 -1
  274. package/dist/Table/BaseTable.d.ts.map +1 -1
  275. package/dist/Table/BaseTable.js +10 -2
  276. package/dist/Table/Table.d.ts.map +1 -1
  277. package/dist/Table/Table.js +3 -6
  278. package/dist/Table/TableRow.d.ts +16 -5
  279. package/dist/Table/TableRow.d.ts.map +1 -1
  280. package/dist/Table/TableRow.js +16 -5
  281. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  282. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  283. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
  284. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  285. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
  286. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  287. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  288. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  289. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  290. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  291. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  292. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  293. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  294. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  295. package/dist/Table/plugins/selection/useTableSelection.js +43 -5
  296. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  297. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  298. package/dist/Table/types.d.ts +22 -4
  299. package/dist/Table/types.d.ts.map +1 -1
  300. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  301. package/dist/Table/useBaseTablePlugins.js +5 -0
  302. package/dist/Text/Text.d.ts.map +1 -1
  303. package/dist/Text/Text.js +6 -3
  304. package/dist/TextArea/TextArea.d.ts.map +1 -1
  305. package/dist/TextArea/TextArea.js +16 -10
  306. package/dist/TextInput/TextInput.d.ts.map +1 -1
  307. package/dist/TextInput/TextInput.js +3 -2
  308. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  309. package/dist/TimeInput/TimeInput.js +3 -2
  310. package/dist/Timestamp/Timestamp.d.ts +1 -1
  311. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  312. package/dist/Timestamp/Timestamp.js +15 -21
  313. package/dist/Toast/Toast.d.ts.map +1 -1
  314. package/dist/Toast/Toast.js +22 -7
  315. package/dist/Toast/ToastViewport.d.ts +1 -0
  316. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  317. package/dist/Toast/ToastViewport.js +71 -18
  318. package/dist/Token/Token.d.ts +1 -1
  319. package/dist/Token/Token.d.ts.map +1 -1
  320. package/dist/Token/Token.js +20 -9
  321. package/dist/Token/TokenLink.d.ts +1 -1
  322. package/dist/Token/TokenLink.d.ts.map +1 -1
  323. package/dist/Token/TokenLink.js +7 -4
  324. package/dist/Tokenizer/Tokenizer.d.ts +14 -1
  325. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  326. package/dist/Tokenizer/Tokenizer.js +33 -21
  327. package/dist/Tooltip/Tooltip.d.ts +5 -0
  328. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  329. package/dist/Tooltip/useTooltip.d.ts +5 -0
  330. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  331. package/dist/Tooltip/useTooltip.js +39 -24
  332. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  333. package/dist/TopNav/TopNavHeading.js +5 -4
  334. package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
  335. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  336. package/dist/TopNav/TopNavMegaMenu.js +31 -11
  337. package/dist/TopNav/TopNavMenu.d.ts +1 -1
  338. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  339. package/dist/TopNav/TopNavMenu.js +22 -7
  340. package/dist/TreeList/TreeList.d.ts +1 -1
  341. package/dist/TreeList/TreeList.d.ts.map +1 -1
  342. package/dist/TreeList/TreeList.js +7 -2
  343. package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
  344. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  345. package/dist/Typeahead/BaseTypeahead.js +119 -37
  346. package/dist/Typeahead/Typeahead.d.ts +8 -1
  347. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  348. package/dist/Typeahead/Typeahead.js +5 -2
  349. package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
  350. package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
  351. package/dist/Typeahead/TypeaheadItem.js +7 -2
  352. package/dist/astryx.css +113 -11
  353. package/dist/hooks/index.d.ts +1 -0
  354. package/dist/hooks/index.d.ts.map +1 -1
  355. package/dist/hooks/index.js +1 -0
  356. package/dist/hooks/useFocusTrap.d.ts +7 -4
  357. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  358. package/dist/hooks/useFocusTrap.js +60 -95
  359. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  360. package/dist/hooks/useHotkeys.js +3 -18
  361. package/dist/hooks/useMergedRefs.d.ts +18 -0
  362. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  363. package/dist/hooks/useMergedRefs.js +25 -0
  364. package/dist/index.d.ts +1 -0
  365. package/dist/index.d.ts.map +1 -1
  366. package/dist/index.js +1 -0
  367. package/dist/theme/Theme.d.ts.map +1 -1
  368. package/dist/theme/Theme.js +46 -10
  369. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  370. package/dist/theme/derivedVarRegistry.js +24 -4
  371. package/dist/theme/generateThemeRules.d.ts +21 -0
  372. package/dist/theme/generateThemeRules.d.ts.map +1 -1
  373. package/dist/theme/generateThemeRules.js +26 -0
  374. package/dist/theme/syntax/tokens.d.ts +1 -1
  375. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  376. package/dist/theme/syntax/tokens.js +5 -2
  377. package/dist/utils/groupItems.d.ts +5 -1
  378. package/dist/utils/groupItems.d.ts.map +1 -1
  379. package/dist/utils/groupItems.js +9 -9
  380. package/dist/utils/index.d.ts +1 -1
  381. package/dist/utils/index.d.ts.map +1 -1
  382. package/dist/utils/isApplePlatform.d.ts +18 -0
  383. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  384. package/dist/utils/isApplePlatform.js +37 -0
  385. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  386. package/dist/utils/sharedResizeObserver.js +10 -1
  387. package/dist/utils/timeParser.d.ts +1 -1
  388. package/dist/utils/timeParser.d.ts.map +1 -1
  389. package/dist/utils/timeParser.js +26 -12
  390. package/locales/af-ZA.json +6 -6
  391. package/locales/ar-SA.json +6 -6
  392. package/locales/ca-ES.json +5 -5
  393. package/locales/cs-CZ.json +6 -6
  394. package/locales/da-DK.json +6 -6
  395. package/locales/de-DE.json +6 -6
  396. package/locales/el-GR.json +6 -6
  397. package/locales/en.json +163 -11
  398. package/locales/es-ES.json +5 -5
  399. package/locales/fi-FI.json +6 -6
  400. package/locales/fr-FR.json +6 -6
  401. package/locales/he-IL.json +6 -6
  402. package/locales/hu-HU.json +6 -6
  403. package/locales/it-IT.json +6 -6
  404. package/locales/ja-JP.json +6 -6
  405. package/locales/ko-KR.json +6 -6
  406. package/locales/nl-NL.json +6 -6
  407. package/locales/no-NO.json +6 -6
  408. package/locales/pl-PL.json +6 -6
  409. package/locales/pseudo.json +114 -0
  410. package/locales/pt-BR.json +6 -6
  411. package/locales/pt-PT.json +6 -6
  412. package/locales/ro-RO.json +6 -6
  413. package/locales/ru-RU.json +6 -6
  414. package/locales/sr-SP.json +6 -6
  415. package/locales/sv-SE.json +6 -6
  416. package/locales/tr-TR.json +6 -6
  417. package/locales/uk-UA.json +6 -6
  418. package/locales/vi-VN.json +6 -6
  419. package/locales/zh-CN.json +6 -6
  420. package/locales/zh-TW.json +6 -6
  421. package/package.json +8 -3
  422. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  423. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  424. package/src/AlertDialog/AlertDialog.tsx +62 -20
  425. package/src/AppShell/AppShell.tsx +3 -2
  426. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  427. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  428. package/src/AspectRatio/AspectRatio.tsx +40 -1
  429. package/src/Avatar/Avatar.doc.mjs +14 -3
  430. package/src/Avatar/Avatar.test.tsx +97 -0
  431. package/src/Avatar/Avatar.tsx +125 -52
  432. package/src/Avatar/index.ts +2 -2
  433. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  434. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  435. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  436. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  437. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  438. package/src/Banner/Banner.doc.mjs +22 -11
  439. package/src/Banner/Banner.test.tsx +177 -25
  440. package/src/Banner/Banner.tsx +93 -27
  441. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  442. package/src/BottomSheet/BottomSheet.tsx +17 -4
  443. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  444. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  445. package/src/Button/Button.doc.mjs +24 -1
  446. package/src/Button/Button.test.tsx +32 -4
  447. package/src/Button/Button.tsx +12 -5
  448. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  449. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  450. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  451. package/src/Calendar/Calendar.doc.mjs +7 -6
  452. package/src/Calendar/Calendar.test.tsx +143 -0
  453. package/src/Calendar/Calendar.tsx +30 -26
  454. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  455. package/src/Calendar/getInitialFocusDate.ts +93 -0
  456. package/src/Calendar/styles.ts +49 -31
  457. package/src/Card/Card.doc.mjs +10 -7
  458. package/src/Card/Card.test.tsx +113 -19
  459. package/src/Card/Card.tsx +67 -89
  460. package/src/Card/index.ts +36 -1
  461. package/src/Carousel/Carousel.tsx +3 -2
  462. package/src/Chat/ChatComposerInput.tsx +5 -1
  463. package/src/Chat/ChatLayout.tsx +3 -2
  464. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  465. package/src/Chat/ChatMessageList.test.tsx +46 -0
  466. package/src/Chat/ChatMessageList.tsx +28 -4
  467. package/src/Chat/ChatTokenizedText.tsx +17 -10
  468. package/src/Chat/useChatComposerTokens.ts +1 -1
  469. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  470. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  471. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  472. package/src/ClickableCard/ClickableCard.tsx +3 -2
  473. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  474. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  475. package/src/CodeBlock/CodeBlock.tsx +20 -4
  476. package/src/CodeBlock/highlightRanges.ts +1 -1
  477. package/src/CodeBlock/highlightStyles.ts +13 -13
  478. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  479. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  480. package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
  481. package/src/ComplexSelector/ComplexSelector.tsx +1 -3
  482. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  483. package/src/ContextMenu/ContextMenu.tsx +4 -3
  484. package/src/DateInput/DateInput.doc.mjs +16 -0
  485. package/src/DateInput/DateInput.tsx +55 -2
  486. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  487. package/src/DateInput/NativeDateField.test.tsx +635 -0
  488. package/src/DateInput/NativeDateField.tsx +641 -0
  489. package/src/DateInput/TouchDateField.tsx +108 -24
  490. package/src/DateInput/index.ts +1 -0
  491. package/src/DateInput/nativeDateSegments.ts +127 -0
  492. package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
  493. package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
  494. package/src/DateRangeInput/DateRangeInput.tsx +4 -2
  495. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  496. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  497. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  498. package/src/DateTimeInput/index.ts +1 -0
  499. package/src/Dialog/Dialog.doc.mjs +8 -3
  500. package/src/Dialog/Dialog.test.tsx +429 -2
  501. package/src/Dialog/Dialog.tsx +133 -58
  502. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  503. package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
  504. package/src/DropdownMenu/DropdownMenu.tsx +4 -13
  505. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  506. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  507. package/src/Field/Field.doc.mjs +13 -2
  508. package/src/Field/FieldLabel.test.tsx +29 -0
  509. package/src/Field/FieldLabel.tsx +7 -0
  510. package/src/Field/InputClearButton.test.tsx +15 -1
  511. package/src/Field/InputClearButton.tsx +28 -4
  512. package/src/FileInput/FileInput.tsx +3 -2
  513. package/src/Heading/Heading.test.tsx +23 -1
  514. package/src/Heading/Heading.tsx +6 -3
  515. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  516. package/src/HoverCard/HoverCard.test.tsx +154 -4
  517. package/src/HoverCard/HoverCard.tsx +143 -3
  518. package/src/HoverCard/useHoverCard.tsx +104 -33
  519. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  520. package/src/Indicator/Indicator.doc.mjs +2 -0
  521. package/src/Item/Item.tsx +5 -4
  522. package/src/Kbd/Kbd.tsx +2 -19
  523. package/src/Layer/LayerDepthContext.tsx +62 -0
  524. package/src/Layer/gestureCounter.ts +57 -0
  525. package/src/Layer/index.ts +9 -0
  526. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  527. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  528. package/src/Layer/layerStack.ts +362 -0
  529. package/src/Layer/useLayer.test.tsx +324 -15
  530. package/src/Layer/useLayer.tsx +164 -8
  531. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  532. package/src/Layer/useLayerDismissal.ts +173 -0
  533. package/src/Layout/Layout.doc.mjs +2 -2
  534. package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
  535. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  536. package/src/Lightbox/Lightbox.tsx +124 -102
  537. package/src/Link/Link.doc.mjs +39 -0
  538. package/src/List/List.test.tsx +38 -0
  539. package/src/List/List.tsx +8 -1
  540. package/src/Markdown/Markdown.doc.mjs +5 -0
  541. package/src/Markdown/Markdown.test.tsx +37 -0
  542. package/src/Markdown/Markdown.tsx +16 -5
  543. package/src/Markdown/incremental.test.ts +16 -2
  544. package/src/Markdown/index.ts +1 -0
  545. package/src/Markdown/parser.perf.test.ts +96 -1
  546. package/src/Markdown/parser.test.ts +178 -2
  547. package/src/Markdown/parser.ts +253 -32
  548. package/src/MetadataList/MetadataList.test.tsx +75 -2
  549. package/src/MetadataList/MetadataListItem.tsx +5 -2
  550. package/src/MobileNav/MobileNav.tsx +62 -36
  551. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  552. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  553. package/src/MultiSelector/MultiSelector.test.tsx +311 -0
  554. package/src/MultiSelector/MultiSelector.tsx +151 -15
  555. package/src/MultiSelector/hooks.ts +9 -2
  556. package/src/MultiSelector/index.ts +1 -0
  557. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  558. package/src/NavIcon/NavIcon.test.tsx +9 -0
  559. package/src/NavIcon/NavIcon.tsx +5 -1
  560. package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
  561. package/src/NavMenu/NavHeadingMenu.tsx +9 -5
  562. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  563. package/src/NumberInput/NumberInput.test.tsx +436 -8
  564. package/src/NumberInput/NumberInput.tsx +62 -114
  565. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  566. package/src/NumberInput/numberInputCommit.ts +103 -0
  567. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  568. package/src/NumberInput/numberParser.test.ts +222 -0
  569. package/src/NumberInput/numberParser.ts +403 -0
  570. package/src/Outline/Outline.tsx +3 -2
  571. package/src/OverflowList/OverflowList.tsx +3 -2
  572. package/src/Overlay/Overlay.tsx +3 -2
  573. package/src/Pagination/Pagination.test.tsx +3 -2
  574. package/src/Popover/Popover.test.tsx +14 -0
  575. package/src/Popover/Popover.tsx +1 -9
  576. package/src/Popover/usePopover.tsx +57 -32
  577. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  578. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  579. package/src/PowerSearch/PowerSearch.tsx +34 -5
  580. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  581. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  582. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  583. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  584. package/src/PowerSearch/types.ts +2 -0
  585. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  586. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  587. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  588. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  589. package/src/ProgressBar/ProgressBar.tsx +28 -8
  590. package/src/Resizable/ResizeHandle.tsx +3 -2
  591. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  592. package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
  593. package/src/SelectableCard/SelectableCard.tsx +19 -2
  594. package/src/Selector/Selector.doc.mjs +26 -1
  595. package/src/Selector/Selector.test.tsx +346 -1
  596. package/src/Selector/Selector.tsx +148 -21
  597. package/src/Selector/hooks.ts +17 -2
  598. package/src/SideNav/SideNav.doc.mjs +6 -6
  599. package/src/SideNav/SideNav.tsx +4 -2
  600. package/src/SideNav/SideNavHeading.tsx +12 -12
  601. package/src/SideNav/SideNavItem.tsx +4 -2
  602. package/src/Slider/Slider.test.tsx +106 -1
  603. package/src/Slider/Slider.tsx +55 -3
  604. package/src/Spinner/Spinner.test.tsx +147 -1
  605. package/src/Spinner/Spinner.tsx +120 -101
  606. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  607. package/src/StatusDot/StatusDot.test.tsx +9 -0
  608. package/src/StatusDot/StatusDot.tsx +7 -1
  609. package/src/Stepper/Step.doc.mjs +98 -0
  610. package/src/Stepper/Step.tsx +1638 -0
  611. package/src/Stepper/StepStatus.ts +26 -0
  612. package/src/Stepper/Stepper.doc.mjs +370 -0
  613. package/src/Stepper/Stepper.test.tsx +1024 -0
  614. package/src/Stepper/Stepper.tsx +258 -0
  615. package/src/Stepper/StepperContext.ts +71 -0
  616. package/src/Stepper/index.ts +18 -0
  617. package/src/Stepper/stepper.stylex.ts +19 -0
  618. package/src/Switch/Switch.doc.mjs +2 -0
  619. package/src/Switch/Switch.test.tsx +10 -0
  620. package/src/Switch/Switch.tsx +6 -2
  621. package/src/TabList/Tab.doc.mjs +13 -1
  622. package/src/TabList/Tab.tsx +67 -7
  623. package/src/TabList/TabList.doc.mjs +22 -6
  624. package/src/TabList/TabList.test.tsx +559 -0
  625. package/src/TabList/TabList.tsx +490 -22
  626. package/src/TabList/TabListContext.ts +13 -2
  627. package/src/TabList/TabMenu.tsx +3 -2
  628. package/src/TabList/index.ts +6 -2
  629. package/src/Table/BaseTable.tsx +12 -4
  630. package/src/Table/Table.doc.mjs +9 -2
  631. package/src/Table/Table.test.tsx +132 -14
  632. package/src/Table/Table.tsx +3 -8
  633. package/src/Table/TableBody.doc.mjs +40 -0
  634. package/src/Table/TableFooter.doc.mjs +40 -0
  635. package/src/Table/TableHeader.doc.mjs +40 -0
  636. package/src/Table/TableRow.tsx +16 -5
  637. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  638. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  639. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  640. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  641. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
  642. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  643. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  644. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  645. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  646. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  647. package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
  648. package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
  649. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  650. package/src/Table/types.ts +22 -4
  651. package/src/Table/useBaseTablePlugins.ts +5 -0
  652. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  653. package/src/Table/useTablePagination.doc.mjs +7 -0
  654. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  655. package/src/Table/useTableSelection.doc.mjs +31 -0
  656. package/src/Text/Text.test.tsx +67 -1
  657. package/src/Text/Text.tsx +6 -3
  658. package/src/TextArea/TextArea.doc.mjs +12 -2
  659. package/src/TextArea/TextArea.test.tsx +11 -0
  660. package/src/TextArea/TextArea.tsx +37 -24
  661. package/src/TextInput/TextInput.doc.mjs +10 -0
  662. package/src/TextInput/TextInput.tsx +3 -2
  663. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  664. package/src/TimeInput/TimeInput.tsx +2 -2
  665. package/src/Timestamp/Timestamp.test.tsx +58 -0
  666. package/src/Timestamp/Timestamp.tsx +12 -10
  667. package/src/Toast/Toast.doc.mjs +26 -12
  668. package/src/Toast/Toast.tsx +28 -4
  669. package/src/Toast/ToastViewport.test.tsx +536 -8
  670. package/src/Toast/ToastViewport.tsx +81 -12
  671. package/src/Token/Token.test.tsx +95 -0
  672. package/src/Token/Token.tsx +15 -10
  673. package/src/Token/TokenLink.tsx +14 -5
  674. package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
  675. package/src/Tokenizer/Tokenizer.test.tsx +161 -0
  676. package/src/Tokenizer/Tokenizer.tsx +53 -24
  677. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  678. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  679. package/src/Tooltip/Tooltip.test.tsx +32 -0
  680. package/src/Tooltip/Tooltip.tsx +5 -0
  681. package/src/Tooltip/useTooltip.tsx +47 -24
  682. package/src/TopNav/TopNavHeading.tsx +5 -4
  683. package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
  684. package/src/TopNav/TopNavMegaMenu.tsx +47 -5
  685. package/src/TopNav/TopNavMenu.test.tsx +133 -1
  686. package/src/TopNav/TopNavMenu.tsx +38 -7
  687. package/src/TreeList/TreeList.test.tsx +49 -0
  688. package/src/TreeList/TreeList.tsx +7 -2
  689. package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
  690. package/src/Typeahead/BaseTypeahead.tsx +181 -39
  691. package/src/Typeahead/Typeahead.doc.mjs +11 -0
  692. package/src/Typeahead/Typeahead.test.tsx +203 -0
  693. package/src/Typeahead/Typeahead.tsx +12 -2
  694. package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
  695. package/src/Typeahead/TypeaheadItem.tsx +8 -1
  696. package/src/hooks/index.ts +2 -0
  697. package/src/hooks/useAnnounce.doc.mjs +96 -0
  698. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  699. package/src/hooks/useDevWarning.doc.mjs +96 -0
  700. package/src/hooks/useFocusTrap.test.tsx +14 -0
  701. package/src/hooks/useFocusTrap.ts +62 -111
  702. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  703. package/src/hooks/useHotkeys.ts +3 -18
  704. package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
  705. package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
  706. package/src/hooks/useInteractiveRole.doc.mjs +119 -0
  707. package/src/hooks/useLongPress.doc.mjs +123 -0
  708. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  709. package/src/hooks/useMergedRefs.test.tsx +62 -0
  710. package/src/hooks/useMergedRefs.ts +36 -0
  711. package/src/hooks/useTypeahead.doc.mjs +153 -0
  712. package/src/index.ts +1 -0
  713. package/src/raw-import.d.ts +14 -0
  714. package/src/theme/MediaTheme.doc.mjs +5 -5
  715. package/src/theme/Theme.test.tsx +104 -2
  716. package/src/theme/Theme.tsx +49 -14
  717. package/src/theme/defineTheme.test.ts +23 -0
  718. package/src/theme/derivedVarRegistry.test.ts +26 -3
  719. package/src/theme/derivedVarRegistry.ts +23 -4
  720. package/src/theme/generateThemeRules.test.ts +99 -1
  721. package/src/theme/generateThemeRules.ts +28 -0
  722. package/src/theme/syntax/tokens.ts +5 -2
  723. package/src/utils/groupItems.ts +12 -6
  724. package/src/utils/index.ts +1 -1
  725. package/src/utils/isApplePlatform.test.ts +61 -0
  726. package/src/utils/isApplePlatform.ts +37 -0
  727. package/src/utils/sharedResizeObserver.ts +10 -2
  728. package/src/utils/timeParser.test.ts +6 -1
  729. package/src/utils/timeParser.ts +35 -13
  730. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -15,6 +15,7 @@ import {render, screen} from '@testing-library/react';
15
15
  import userEvent from '@testing-library/user-event';
16
16
  import {Banner} from './Banner';
17
17
  import {registerIcons, resetIcons} from '../Icon';
18
+ import {InternationalizationProvider} from '../i18n';
18
19
 
19
20
  describe('Banner', () => {
20
21
  afterEach(() => {
@@ -97,7 +98,9 @@ describe('Banner', () => {
97
98
 
98
99
  it('renders dismiss button when isDismissable', () => {
99
100
  render(<Banner status="info" title="Dismissable" isDismissable />);
100
- expect(screen.getByRole('button', {name: 'Dismiss'})).toBeInTheDocument();
101
+ expect(
102
+ screen.getByRole('button', {name: 'Dismiss Dismissable'}),
103
+ ).toBeInTheDocument();
101
104
  });
102
105
 
103
106
  it('calls onDismiss when dismiss button is clicked', async () => {
@@ -111,7 +114,7 @@ describe('Banner', () => {
111
114
  onDismiss={onDismiss}
112
115
  />,
113
116
  );
114
- await user.click(screen.getByRole('button', {name: 'Dismiss'}));
117
+ await user.click(screen.getByRole('button', {name: 'Dismiss Dismissable'}));
115
118
  expect(onDismiss).toHaveBeenCalledTimes(1);
116
119
  });
117
120
 
@@ -126,7 +129,9 @@ describe('Banner', () => {
126
129
  />,
127
130
  );
128
131
  expect(screen.getByTestId('banner')).toBeInTheDocument();
129
- await user.click(screen.getByRole('button', {name: 'Dismiss'}));
132
+ await user.click(
133
+ screen.getByRole('button', {name: 'Dismiss Self Dismissing'}),
134
+ );
130
135
  expect(screen.queryByTestId('banner')).not.toBeInTheDocument();
131
136
  });
132
137
 
@@ -142,16 +147,14 @@ describe('Banner', () => {
142
147
  data-testid="banner"
143
148
  />,
144
149
  );
145
- await user.click(screen.getByRole('button', {name: 'Dismiss'}));
150
+ await user.click(screen.getByRole('button', {name: 'Dismiss Dismissable'}));
146
151
  expect(screen.queryByTestId('banner')).not.toBeInTheDocument();
147
152
  expect(onDismiss).toHaveBeenCalledTimes(1);
148
153
  });
149
154
 
150
155
  it('does not render dismiss button when isDismissable is false', () => {
151
156
  render(<Banner status="info" title="Not Dismissable" />);
152
- expect(
153
- screen.queryByRole('button', {name: 'Dismiss'}),
154
- ).not.toBeInTheDocument();
157
+ expect(screen.queryByRole('button', {name: /^Dismiss/})).toBeNull();
155
158
  });
156
159
 
157
160
  it('renders endContent', () => {
@@ -184,33 +187,86 @@ describe('Banner', () => {
184
187
  });
185
188
 
186
189
  // =========================================================================
187
- // Collapsible content area
190
+ // Content area — collapsible by default, `collapsible={false}` opts out
188
191
  // =========================================================================
189
192
 
190
- it('hides children by default (collapsed)', () => {
193
+ it('hides children behind a toggle by default', () => {
191
194
  render(
192
195
  <Banner status="info" title="Collapsible">
193
196
  <div data-testid="child-content">Extra content</div>
194
197
  </Banner>,
195
198
  );
199
+ // The historical default, unchanged: chevron present, content collapsed.
196
200
  expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
201
+ expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
197
202
  });
198
203
 
199
- it('shows children when defaultIsExpanded is true', () => {
204
+ it('treats an explicit collapsible={true} as the default', () => {
200
205
  render(
201
- <Banner status="info" title="Expanded" defaultIsExpanded>
206
+ <Banner status="info" title="Explicit" collapsible>
207
+ <div data-testid="child-content">Extra content</div>
208
+ </Banner>,
209
+ );
210
+ expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
211
+ expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
212
+ });
213
+
214
+ it('shows children with no toggle for collapsible={false}', () => {
215
+ render(
216
+ <Banner status="info" title="Opted out" collapsible={false}>
202
217
  <div data-testid="child-content">Extra content</div>
203
218
  </Banner>,
204
219
  );
205
220
  expect(screen.getByTestId('child-content')).toBeInTheDocument();
221
+ expect(
222
+ screen.queryByRole('button', {name: 'Expand'}),
223
+ ).not.toBeInTheDocument();
224
+ expect(
225
+ screen.queryByRole('button', {name: 'Collapse'}),
226
+ ).not.toBeInTheDocument();
206
227
  });
207
228
 
208
- it('shows expand button when children are provided', () => {
229
+ it('leaves non-collapsible content out of the disclosure wiring', () => {
209
230
  render(
210
- <Banner status="info" title="With Toggle">
211
- <div>Content</div>
231
+ <Banner
232
+ status="info"
233
+ title="Plain content"
234
+ isDismissable
235
+ collapsible={false}>
236
+ <div data-testid="child-content">Extra content</div>
237
+ </Banner>,
238
+ );
239
+ // No toggle exists, so nothing should carry disclosure state, and the
240
+ // region needs no id for a button to point at.
241
+ const dismiss = screen.getByRole('button', {
242
+ name: 'Dismiss Plain content',
243
+ });
244
+ expect(dismiss).not.toHaveAttribute('aria-expanded');
245
+ expect(dismiss).not.toHaveAttribute('aria-controls');
246
+ expect(
247
+ screen.getByTestId('child-content').parentElement,
248
+ ).not.toHaveAttribute('id');
249
+ });
250
+
251
+ it('starts open for collapsible={{defaultIsOpen: true}}', () => {
252
+ render(
253
+ <Banner status="info" title="Open" collapsible={{defaultIsOpen: true}}>
254
+ <div data-testid="child-content">Content</div>
255
+ </Banner>,
256
+ );
257
+ expect(screen.getByTestId('child-content')).toBeInTheDocument();
258
+ expect(screen.getByRole('button', {name: 'Collapse'})).toBeInTheDocument();
259
+ });
260
+
261
+ it('treats a null collapsible as the default', () => {
262
+ render(
263
+ // @ts-expect-error null is outside the prop's type, but JS callers and a
264
+ // value widened to `| null` still reach this.
265
+ <Banner status="info" title="Nullish" collapsible={null}>
266
+ <div data-testid="child-content">Content</div>
212
267
  </Banner>,
213
268
  );
269
+ expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
214
270
  expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
215
271
  });
216
272
 
@@ -247,13 +303,38 @@ describe('Banner', () => {
247
303
  expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
248
304
  });
249
305
 
250
- it('shows collapse button when defaultIsExpanded', () => {
306
+ it('reports open-state changes through onOpenChange', async () => {
307
+ const user = userEvent.setup();
308
+ const onOpenChange = vi.fn();
251
309
  render(
252
- <Banner status="info" title="Expanded" defaultIsExpanded>
253
- <div>Content</div>
310
+ <Banner status="info" title="Notify" collapsible={{onOpenChange}}>
311
+ <div data-testid="child-content">Extra content</div>
254
312
  </Banner>,
255
313
  );
256
- expect(screen.getByRole('button', {name: 'Collapse'})).toBeInTheDocument();
314
+
315
+ await user.click(screen.getByRole('button', {name: 'Expand'}));
316
+ expect(onOpenChange).toHaveBeenCalledWith(true);
317
+ await user.click(screen.getByRole('button', {name: 'Collapse'}));
318
+ expect(onOpenChange).toHaveBeenLastCalledWith(false);
319
+ });
320
+
321
+ it('defers to the consumer when collapsible is controlled', async () => {
322
+ const user = userEvent.setup();
323
+ const onOpenChange = vi.fn();
324
+ render(
325
+ <Banner
326
+ status="info"
327
+ title="Controlled"
328
+ collapsible={{isOpen: false, onOpenChange}}>
329
+ <div data-testid="child-content">Extra content</div>
330
+ </Banner>,
331
+ );
332
+
333
+ // A controlled banner must not move on its own: the click reports, the
334
+ // content stays hidden until the consumer re-renders with isOpen.
335
+ await user.click(screen.getByRole('button', {name: 'Expand'}));
336
+ expect(onOpenChange).toHaveBeenCalledWith(true);
337
+ expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
257
338
  });
258
339
 
259
340
  it('renders expand button to the left of dismiss button', () => {
@@ -267,13 +348,16 @@ describe('Banner', () => {
267
348
  b => b.getAttribute('aria-label') || b.textContent,
268
349
  );
269
350
  const expandIndex = buttonNames.indexOf('Expand');
270
- const dismissIndex = buttonNames.indexOf('Dismiss');
351
+ const dismissIndex = buttonNames.indexOf('Dismiss Order Test');
271
352
  expect(expandIndex).toBeLessThan(dismissIndex);
272
353
  });
273
354
 
274
355
  it('links the expand toggle to its content region via aria-controls', () => {
275
356
  render(
276
- <Banner status="info" title="Controls Test" defaultIsExpanded>
357
+ <Banner
358
+ status="info"
359
+ title="Controls Test"
360
+ collapsible={{defaultIsOpen: true}}>
277
361
  <div data-testid="region-content">Region content</div>
278
362
  </Banner>,
279
363
  );
@@ -469,7 +553,9 @@ describe('Banner', () => {
469
553
  before.focus();
470
554
 
471
555
  await user.tab();
472
- expect(screen.getByRole('button', {name: 'Dismiss'})).toHaveFocus();
556
+ expect(
557
+ screen.getByRole('button', {name: 'Dismiss Heads up'}),
558
+ ).toHaveFocus();
473
559
 
474
560
  await user.keyboard('{Enter}');
475
561
 
@@ -486,7 +572,7 @@ describe('Banner', () => {
486
572
  <Banner status="info" title="Heads up" isDismissable />
487
573
  </>,
488
574
  );
489
- await user.click(screen.getByRole('button', {name: 'Dismiss'}));
575
+ await user.click(screen.getByRole('button', {name: 'Dismiss Heads up'}));
490
576
  expect(screen.queryByRole('status')).not.toBeInTheDocument();
491
577
  });
492
578
  });
@@ -509,9 +595,17 @@ describe('Banner', () => {
509
595
  <p>Detail</p>
510
596
  </Banner>,
511
597
  );
512
- expect(
513
- screen.getByRole('button', {name: 'Expand'}),
514
- ).toBeInTheDocument();
598
+ expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
599
+ });
600
+
601
+ it('renders no content area for children that render nothing', () => {
602
+ const {container} = render(
603
+ <Banner status="info" title="Heads up" collapsible={false}>
604
+ {false}
605
+ </Banner>,
606
+ );
607
+ // Header only — an empty slot must not draw the card-background area.
608
+ expect(container.firstElementChild?.children).toHaveLength(1);
515
609
  });
516
610
 
517
611
  it('renders no description node for a description that renders nothing', () => {
@@ -563,4 +657,62 @@ describe('Banner', () => {
563
657
  expect(getComputedStyle(textColumn).flexBasis).not.toBe('8rem');
564
658
  });
565
659
  });
660
+
661
+ describe('dismiss control naming', () => {
662
+ it('names stacked string-title banners distinctly', () => {
663
+ render(
664
+ <>
665
+ <Banner status="error" title="Upload invoice failed" isDismissable />
666
+ <Banner status="error" title="Delete report failed" isDismissable />
667
+ </>,
668
+ );
669
+ const buttons = screen.getAllByRole('button');
670
+ expect(buttons.map(button => button.getAttribute('aria-label'))).toEqual([
671
+ 'Dismiss Upload invoice failed',
672
+ 'Dismiss Delete report failed',
673
+ ]);
674
+ for (const button of buttons) {
675
+ expect(button).toHaveAccessibleDescription('Dismiss');
676
+ }
677
+ });
678
+
679
+ it('keeps the bare name and tooltip for a rich title', () => {
680
+ render(
681
+ <Banner status="info" title={<span>Rich title</span>} isDismissable />,
682
+ );
683
+ const button = screen.getByRole('button', {name: 'Dismiss'});
684
+ expect(button).toHaveAccessibleDescription('Dismiss');
685
+ });
686
+
687
+ it('uses a translated dismissLabel for a rich title and its tooltip', () => {
688
+ render(
689
+ <Banner
690
+ status="info"
691
+ title={<span>Wartungshinweis</span>}
692
+ isDismissable
693
+ dismissLabel="Wartungshinweis schließen"
694
+ />,
695
+ );
696
+ const button = screen.getByRole('button', {
697
+ name: 'Wartungshinweis schließen',
698
+ });
699
+ expect(button).toHaveAccessibleDescription('Wartungshinweis schließen');
700
+ });
701
+
702
+ it('keeps a translated verb when the titled message falls back to English', () => {
703
+ render(
704
+ <InternationalizationProvider
705
+ locale="de-DE"
706
+ overrides={{
707
+ 'de-DE': {'@astryx.banner.dismiss': 'Schließen'},
708
+ }}>
709
+ <Banner status="info" title="Wartungshinweis" isDismissable />
710
+ </InternationalizationProvider>,
711
+ );
712
+ const button = screen.getByRole('button', {
713
+ name: 'Schließen Wartungshinweis',
714
+ });
715
+ expect(button).toHaveAccessibleDescription('Schließen');
716
+ });
717
+ });
566
718
  });
@@ -4,20 +4,24 @@
4
4
 
5
5
  /**
6
6
  * @file Banner.tsx
7
- * @input Uses React useState/useRef/useId, Button, Icon (with registry string names), StyleX
7
+ * @input Uses React useState/useRef/useId, useCollapsible, Button, Icon (with registry string names), StyleX
8
8
  * @output Exports Banner component, BannerProps, BannerStatus, BannerContainer types
9
9
  * @position Core implementation; consumed by index.ts, tested by Banner.test.tsx
10
10
  *
11
11
  * Visual structure:
12
12
  * - Root container: layout-only wrapper (flex column), no visual styling, no theme target
13
13
  * - Header area (themeProps 'banner'): colored status background with icon, title, description, actions, dismiss
14
- * - Content area (themeProps 'banner-content'): collapsible card background for additional content (children)
14
+ * - Content area (themeProps 'banner-content'): card background for additional content (children)
15
15
  * - Status icon (themeProps 'banner-icon'): the target rides on the default
16
16
  * <Icon> itself — the element that paints — so 'status:X' overrides reach
17
17
  * the glyph (#4166); for a custom `icon` node it stays on the layout wrapper
18
18
  * - No left border accent — color is expressed through the full header background
19
19
  * - Each visual area owns its own border-radius (no overflow:clip on the container)
20
- * - When children are provided, a collapse/expand toggle button appears in the end area
20
+ * - Children are collapsible by default: a toggle appears in the header end
21
+ * area and the content starts closed. `collapsible={false}` opts out and
22
+ * pins the content open with no toggle. The whole collapse axis (enabled /
23
+ * default / controlled) lives on that one prop and is driven by the shared
24
+ * `useCollapsible` hook rather than local state.
21
25
  *
22
26
  * A status added through `BannerStatusMap` augmentation has no entry in the
23
27
  * status lookups, so it renders with no status fill, no default glyph and the
@@ -55,6 +59,8 @@ import {
55
59
  easeVars,
56
60
  shadowVars,
57
61
  } from '../theme/tokens.stylex';
62
+ import {useCollapsible} from '../Collapsible/useCollapsible';
63
+ import type {CollapsibleConfig} from '../Collapsible/useCollapsible';
58
64
  import {composeEventHandlers, isRenderable, mergeProps} from '../utils';
59
65
  import type {Elevation} from '../utils/types';
60
66
  import {edgeCompSlot} from '../Layout/edgeCompensation.stylex';
@@ -112,6 +118,15 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
112
118
  * The banner will hide itself regardless of whether this callback is provided.
113
119
  */
114
120
  onDismiss?: () => void;
121
+ /**
122
+ * Accessible name and visible tooltip for the dismiss button, replacing the default.
123
+ * Pass an already-translated string.
124
+ *
125
+ * The default is "Dismiss {title}" when `title` is a string, so stacked
126
+ * banners are told apart by a screen reader; a non-string `title` falls back
127
+ * to "Dismiss" and should set this.
128
+ */
129
+ dismissLabel?: string;
115
130
  /**
116
131
  * Action button rendered in the header area (end-aligned).
117
132
  * Typically an Button with a secondary or ghost variant.
@@ -140,15 +155,29 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
140
155
  */
141
156
  elevation?: Elevation;
142
157
  /**
143
- * Whether the content area (children) starts expanded.
144
- * Only relevant when children are provided.
145
- * @default false
158
+ * Whether the content area (children) sits behind an expand/collapse toggle
159
+ * in the header. On by default, so a banner with children behaves as it
160
+ * always has.
161
+ *
162
+ * - omitted / `true` — collapsible, starts collapsed
163
+ * - `{defaultIsOpen: true}` — collapsible, starts open
164
+ * - `{isOpen, onOpenChange}` — controlled by the consumer
165
+ * - `false` — not collapsible: children are always visible, with no toggle,
166
+ * no `aria-expanded`, and a content region that stays mounted
167
+ *
168
+ * Takes the shared `CollapsibleConfig` so a banner's disclosure is
169
+ * configured exactly like `Collapsible`'s, rather than through a
170
+ * Banner-only vocabulary. Banner's default differs from the hook's on one
171
+ * point — it starts closed, not open — because a banner's message lives in
172
+ * its header and the content is supplementary.
173
+ *
174
+ * @default true
146
175
  */
147
- defaultIsExpanded?: boolean;
176
+ collapsible?: boolean | CollapsibleConfig;
148
177
  /**
149
- * Extra content rendered below the header in a collapsible card-background area.
178
+ * Extra content rendered below the header in a card-background area.
150
179
  * Use for rich content like lists, links, or detailed information.
151
- * When provided, a collapse/expand toggle button appears in the header.
180
+ * Collapsed behind a toggle unless `collapsible={false}`.
152
181
  */
153
182
  children?: ReactNode;
154
183
  }
@@ -367,11 +396,12 @@ const elevationStyles = stylex.create({
367
396
  *
368
397
  * Two-part visual structure:
369
398
  * - Header: colored status background with icon, title, description, and actions
370
- * - Content (optional): collapsible card background area for additional rich content
399
+ * - Content (optional): card background area for additional rich content
371
400
  *
372
- * When children are provided, a collapse/expand chevron button appears in the
373
- * header end area (to the left of the dismiss button if present). Clicking it
374
- * toggles the visibility of the content area.
401
+ * When children are provided, a chevron toggle appears in the header end area
402
+ * (to the left of the dismiss button if present) and the content starts
403
+ * collapsed. Pass `collapsible={false}` for content that is always visible,
404
+ * or a config object to change the initial state or control it.
375
405
  *
376
406
  * Manages its own dismissed state internally — the banner hides on dismiss
377
407
  * even if `onDismiss` is not provided, so product teams don't need to wire
@@ -402,9 +432,14 @@ const elevationStyles = stylex.create({
402
432
  * <Banner
403
433
  * status="warning"
404
434
  * title="Configuration changes"
405
- * defaultIsExpanded>
435
+ * collapsible={{defaultIsOpen: true}}>
406
436
  * <p>Details here...</p>
407
437
  * </Banner>
438
+ * <Banner status="error" title="3 fields need attention" collapsible={false}>
439
+ * <ul>
440
+ * <li>Email address is invalid</li>
441
+ * </ul>
442
+ * </Banner>
408
443
  * ```
409
444
  */
410
445
  export function Banner({
@@ -414,10 +449,11 @@ export function Banner({
414
449
  icon,
415
450
  isDismissable = false,
416
451
  onDismiss,
452
+ dismissLabel,
417
453
  endContent,
418
454
  container = 'card',
419
455
  elevation = 'none',
420
- defaultIsExpanded = false,
456
+ collapsible = true,
421
457
  children,
422
458
  xstyle,
423
459
  className,
@@ -429,7 +465,26 @@ export function Banner({
429
465
  }: BannerProps) {
430
466
  const t = useTranslator();
431
467
  const [isDismissed, setIsDismissed] = useState(false);
432
- const [isExpanded, setIsExpanded] = useState(defaultIsExpanded);
468
+ // The disclosure state machine is the shared one — Banner owns no collapse
469
+ // state of its own. `collapsible={false}` disables it, and that is what
470
+ // makes the content permanently visible.
471
+ //
472
+ // The one place Banner departs from the hook's defaults: `useCollapsible`
473
+ // opens by default, a banner starts closed. Its header already carries the
474
+ // message, so the content is supplementary — and this is the behaviour
475
+ // Banner has always had.
476
+ const collapsibleConfig =
477
+ collapsible != null && typeof collapsible === 'object' ? collapsible : {};
478
+ const {
479
+ isEnabled: isCollapsible,
480
+ isOpen: isExpanded,
481
+ toggle: handleToggleExpand,
482
+ } = useCollapsible({
483
+ isCollapsible: collapsible !== false && {
484
+ ...collapsibleConfig,
485
+ defaultIsOpen: collapsibleConfig.defaultIsOpen ?? false,
486
+ },
487
+ });
433
488
  // The element focus came from before it entered the banner. Dismissing
434
489
  // unmounts the whole banner, dismiss button included, so without a handoff
435
490
  // the browser drops focus to <body> and a keyboard user loses their place.
@@ -438,12 +493,22 @@ export function Banner({
438
493
  // Links the expand/collapse toggle to the content region it shows/hides so
439
494
  // assistive tech can move from the button to its controlled content
440
495
  // (disclosure pattern). The region is conditionally rendered, so aria-controls
441
- // below is set only while it's mounted to avoid a dangling reference.
496
+ // below is set only while it's mounted to avoid a dangling reference. A
497
+ // non-collapsible banner has no toggle, so neither end of the link is used.
442
498
  const contentId = useId();
443
499
  const defaultIconName = defaultIconNames[status];
444
500
  const role = statusRole[status] ?? FALLBACK_ROLE;
445
501
  const iconColor = statusIconColor[status];
446
502
  const hasChildren = isRenderable(children);
503
+ // Keep the default tooltip concise while the accessible name identifies
504
+ // the banner; an explicit translated override names both surfaces.
505
+ const dismiss = t('@astryx.banner.dismiss');
506
+ const dismissTooltip = dismissLabel ?? dismiss;
507
+ const dismissName =
508
+ dismissLabel ??
509
+ (typeof title === 'string'
510
+ ? t('@astryx.banner.dismissTitled', {dismiss, title})
511
+ : dismiss);
447
512
 
448
513
  if (isDismissed) {
449
514
  return null;
@@ -482,18 +547,19 @@ export function Banner({
482
547
  }
483
548
  };
484
549
 
485
- const handleToggleExpand = () => {
486
- setIsExpanded(prev => !prev);
487
- };
488
-
550
+ // The toggle exists only for a collapsible banner that actually has content
551
+ // to disclose.
552
+ const hasToggle = isCollapsible && hasChildren;
489
553
  // Show the end area if there are actions, dismiss, or a collapsible toggle
490
- const showEndArea = isRenderable(endContent) || isDismissable || hasChildren;
554
+ const showEndArea = isRenderable(endContent) || isDismissable || hasToggle;
491
555
  // Center items vertically when there's only a title (no description)
492
556
  // and the banner has action buttons
493
557
  const hasActions = isRenderable(endContent) || isDismissable;
494
558
  const isSingleLine = !isRenderable(description) && hasActions;
495
559
 
496
- const showContent = hasChildren && isExpanded;
560
+ // Non-collapsible children are always shown; collapsible ones follow the
561
+ // hook's open state.
562
+ const showContent = hasChildren && (!isCollapsible || isExpanded);
497
563
  const isCard = container === 'card';
498
564
 
499
565
  return (
@@ -575,7 +641,7 @@ export function Banner({
575
641
  edgeCompSlot.inset(spacingVars['--spacing-2']),
576
642
  )}>
577
643
  {endContent}
578
- {hasChildren && (
644
+ {hasToggle && (
579
645
  <Button
580
646
  variant="ghost"
581
647
  size="sm"
@@ -610,8 +676,8 @@ export function Banner({
610
676
  <Button
611
677
  variant="ghost"
612
678
  size="sm"
613
- label={t('@astryx.banner.dismiss')}
614
- tooltip={t('@astryx.banner.dismiss')}
679
+ label={dismissName}
680
+ tooltip={dismissTooltip}
615
681
  icon={<Icon icon="close" size="sm" color="inherit" />}
616
682
  onClick={handleDismiss}
617
683
  isIconOnly
@@ -623,7 +689,7 @@ export function Banner({
623
689
  {/* Content area: collapsible card background — theme target ('banner-content') */}
624
690
  {showContent && (
625
691
  <div
626
- id={contentId}
692
+ id={hasToggle ? contentId : undefined}
627
693
  {...mergeProps(
628
694
  themeProps('banner-content', {container, status}),
629
695
  stylex.props(styles.contentArea, isCard && styles.contentAreaCard),