@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29

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 (642) hide show
  1. package/CHANGELOG.md +51 -0
  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 +20 -18
  5. package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
  6. package/dist/AppShell/AppShell.d.ts +1 -1
  7. package/dist/AppShell/AppShell.d.ts.map +1 -1
  8. package/dist/AppShell/AppShell.js +55 -53
  9. package/dist/AspectRatio/AspectRatio.js +5 -5
  10. package/dist/Avatar/Avatar.d.ts.map +1 -1
  11. package/dist/Avatar/Avatar.js +27 -25
  12. package/dist/Avatar/AvatarStatusDot.js +5 -5
  13. package/dist/AvatarGroup/AvatarGroup.js +5 -5
  14. package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
  15. package/dist/Badge/Badge.js +3 -3
  16. package/dist/Banner/Banner.d.ts.map +1 -1
  17. package/dist/Banner/Banner.js +32 -25
  18. package/dist/Blockquote/Blockquote.js +7 -7
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
  20. package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
  21. package/dist/Button/Button.d.ts.map +1 -1
  22. package/dist/Button/Button.js +47 -26
  23. package/dist/ButtonGroup/ButtonGroup.js +7 -7
  24. package/dist/Calendar/Calendar.d.ts.map +1 -1
  25. package/dist/Calendar/Calendar.js +108 -64
  26. package/dist/Calendar/dayCellUtils.d.ts +67 -5
  27. package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
  28. package/dist/Calendar/dayCellUtils.js +139 -18
  29. package/dist/Calendar/styles.d.ts +2 -2
  30. package/dist/Calendar/styles.d.ts.map +1 -1
  31. package/dist/Calendar/styles.js +2 -2
  32. package/dist/Card/Card.d.ts +4 -2
  33. package/dist/Card/Card.d.ts.map +1 -1
  34. package/dist/Card/Card.js +18 -10
  35. package/dist/Carousel/Carousel.d.ts.map +1 -1
  36. package/dist/Carousel/Carousel.js +20 -19
  37. package/dist/Center/Center.js +3 -3
  38. package/dist/Chat/ChatComposer.js +23 -23
  39. package/dist/Chat/ChatComposerDrawer.js +14 -14
  40. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  41. package/dist/Chat/ChatComposerInput.js +27 -15
  42. package/dist/Chat/ChatDictationButton.d.ts +1 -1
  43. package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
  44. package/dist/Chat/ChatDictationButton.js +13 -11
  45. package/dist/Chat/ChatLayout.js +17 -17
  46. package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
  47. package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
  48. package/dist/Chat/ChatLayoutScrollButton.js +12 -10
  49. package/dist/Chat/ChatMessage.js +12 -12
  50. package/dist/Chat/ChatMessageBubble.js +7 -7
  51. package/dist/Chat/ChatMessageList.js +14 -14
  52. package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
  53. package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
  54. package/dist/Chat/ChatMessageMetadata.js +14 -12
  55. package/dist/Chat/ChatPastedTextToken.js +13 -13
  56. package/dist/Chat/ChatSendButton.js +3 -3
  57. package/dist/Chat/ChatSystemMessage.d.ts +1 -1
  58. package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
  59. package/dist/Chat/ChatSystemMessage.js +17 -17
  60. package/dist/Chat/ChatTokenizedText.d.ts +1 -1
  61. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  62. package/dist/Chat/ChatTokenizedText.js +24 -15
  63. package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
  64. package/dist/Chat/ChatToolCalls.js +81 -74
  65. package/dist/Chat/index.d.ts +1 -1
  66. package/dist/Chat/index.d.ts.map +1 -1
  67. package/dist/Chat/useTriggerMenu.js +15 -15
  68. package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
  69. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  70. package/dist/CheckboxInput/CheckboxInput.js +32 -24
  71. package/dist/CheckboxList/CheckboxList.js +9 -9
  72. package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
  73. package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
  74. package/dist/CheckboxList/CheckboxListItem.js +8 -6
  75. package/dist/Citation/Citation.js +10 -10
  76. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  77. package/dist/ClickableCard/ClickableCard.js +32 -9
  78. package/dist/Code/Code.d.ts +15 -1
  79. package/dist/Code/Code.d.ts.map +1 -1
  80. package/dist/Code/Code.js +35 -5
  81. package/dist/Code/index.d.ts +1 -1
  82. package/dist/Code/index.d.ts.map +1 -1
  83. package/dist/CodeBlock/CodeBlock.d.ts +10 -1
  84. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  85. package/dist/CodeBlock/CodeBlock.js +88 -52
  86. package/dist/CodeBlock/index.d.ts +1 -1
  87. package/dist/CodeBlock/index.d.ts.map +1 -1
  88. package/dist/Collapsible/Collapsible.d.ts +9 -3
  89. package/dist/Collapsible/Collapsible.d.ts.map +1 -1
  90. package/dist/Collapsible/Collapsible.js +110 -22
  91. package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
  92. package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
  93. package/dist/Collapsible/CollapsibleGroup.js +73 -12
  94. package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
  95. package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
  96. package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
  97. package/dist/Collapsible/index.d.ts +1 -0
  98. package/dist/Collapsible/index.d.ts.map +1 -1
  99. package/dist/Collapsible/useCollapsible.d.ts +4 -1
  100. package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
  101. package/dist/Collapsible/useCollapsible.js +20 -6
  102. package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
  103. package/dist/CommandPalette/CommandPalette.js +36 -34
  104. package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
  105. package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
  106. package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
  107. package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
  108. package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
  109. package/dist/CommandPalette/CommandPaletteInput.js +13 -13
  110. package/dist/CommandPalette/CommandPaletteItem.js +3 -3
  111. package/dist/CommandPalette/CommandPaletteList.js +3 -3
  112. package/dist/ContextMenu/ContextMenu.d.ts +9 -1
  113. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  114. package/dist/ContextMenu/ContextMenu.js +16 -11
  115. package/dist/DateInput/DateInput.js +18 -18
  116. package/dist/DateRangeInput/DateRangeInput.js +23 -23
  117. package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
  118. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  119. package/dist/DateTimeInput/DateTimeInput.js +30 -26
  120. package/dist/DateTimeInput/index.d.ts +1 -1
  121. package/dist/DateTimeInput/index.d.ts.map +1 -1
  122. package/dist/Dialog/Dialog.js +9 -9
  123. package/dist/Dialog/DialogHeader.js +16 -16
  124. package/dist/Dialog/useImperativeDialog.js +3 -3
  125. package/dist/Divider/Divider.d.ts +0 -22
  126. package/dist/Divider/Divider.d.ts.map +1 -1
  127. package/dist/Divider/Divider.js +7 -7
  128. package/dist/DropdownMenu/DropdownMenu.js +10 -10
  129. package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
  130. package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
  131. package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
  132. package/dist/DropdownMenu/renderDropdownItems.js +10 -10
  133. package/dist/EmptyState/EmptyState.js +9 -9
  134. package/dist/Field/Field.js +17 -17
  135. package/dist/Field/FieldLabel.js +15 -15
  136. package/dist/Field/InputClearButton.js +5 -5
  137. package/dist/FieldStatus/FieldStatus.js +3 -3
  138. package/dist/FileInput/FileInput.js +29 -29
  139. package/dist/FormLayout/FormLayout.js +5 -5
  140. package/dist/Grid/Grid.d.ts +4 -3
  141. package/dist/Grid/Grid.d.ts.map +1 -1
  142. package/dist/Grid/Grid.js +29 -12
  143. package/dist/Grid/GridSpan.js +3 -3
  144. package/dist/HStack/HStack.js +3 -3
  145. package/dist/Heading/Heading.js +10 -10
  146. package/dist/HoverCard/HoverCard.js +9 -9
  147. package/dist/HoverCard/useHoverCard.js +3 -3
  148. package/dist/Icon/Icon.d.ts.map +1 -1
  149. package/dist/Icon/Icon.js +16 -12
  150. package/dist/Icon/defaultIcons.js +116 -116
  151. package/dist/IconButton/IconButton.js +3 -3
  152. package/dist/InputGroup/InputGroup.js +11 -11
  153. package/dist/InputGroup/InputGroupText.js +3 -3
  154. package/dist/Item/Item.js +18 -18
  155. package/dist/Kbd/Kbd.js +5 -5
  156. package/dist/Layer/LayerProvider.js +7 -7
  157. package/dist/Layer/useLayer.js +5 -5
  158. package/dist/Layout/Layout.js +21 -21
  159. package/dist/Layout/LayoutContent.js +3 -3
  160. package/dist/Layout/LayoutFooter.js +5 -5
  161. package/dist/Layout/LayoutHeader.js +5 -5
  162. package/dist/Layout/LayoutPanel.js +3 -3
  163. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  164. package/dist/Lightbox/Lightbox.js +55 -31
  165. package/dist/Lightbox/useLightbox.js +3 -3
  166. package/dist/Link/Link.js +15 -15
  167. package/dist/Link/LinkProvider.js +3 -3
  168. package/dist/Link/useLinkify.js +3 -3
  169. package/dist/List/List.js +11 -11
  170. package/dist/List/ListItem.js +11 -11
  171. package/dist/Markdown/Markdown.d.ts.map +1 -1
  172. package/dist/Markdown/Markdown.js +102 -102
  173. package/dist/Markdown/parser.d.ts +7 -0
  174. package/dist/Markdown/parser.d.ts.map +1 -1
  175. package/dist/Markdown/parser.js +300 -6
  176. package/dist/MetadataList/MetadataList.js +10 -10
  177. package/dist/MetadataList/MetadataListItem.js +15 -15
  178. package/dist/MobileNav/MobileNav.js +15 -15
  179. package/dist/MobileNav/MobileNavToggle.js +5 -5
  180. package/dist/MoreMenu/MoreMenu.js +3 -3
  181. package/dist/MultiSelector/MultiSelector.d.ts +7 -1
  182. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  183. package/dist/MultiSelector/MultiSelector.js +64 -55
  184. package/dist/NavIcon/NavIcon.js +3 -3
  185. package/dist/NavMenu/NavHeadingMenu.js +5 -5
  186. package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
  187. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  188. package/dist/NumberInput/NumberInput.js +48 -32
  189. package/dist/Outline/Outline.js +15 -15
  190. package/dist/OverflowList/OverflowList.js +8 -8
  191. package/dist/Overlay/Overlay.js +3 -3
  192. package/dist/Overlay/OverlayScrim.js +5 -5
  193. package/dist/Overlay/useOverlay.js +3 -3
  194. package/dist/Pagination/Pagination.d.ts +1 -1
  195. package/dist/Pagination/Pagination.d.ts.map +1 -1
  196. package/dist/Pagination/Pagination.js +125 -72
  197. package/dist/Popover/Popover.js +16 -16
  198. package/dist/Popover/usePopover.js +7 -7
  199. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  200. package/dist/PowerSearch/PowerSearch.js +110 -92
  201. package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
  202. package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
  203. package/dist/PowerSearch/PowerSearchToken.js +5 -5
  204. package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
  205. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  206. package/dist/ProgressBar/ProgressBar.js +25 -18
  207. package/dist/RadioList/RadioList.d.ts +7 -1
  208. package/dist/RadioList/RadioList.d.ts.map +1 -1
  209. package/dist/RadioList/RadioList.js +10 -8
  210. package/dist/RadioList/RadioListItem.d.ts +1 -1
  211. package/dist/RadioList/RadioListItem.d.ts.map +1 -1
  212. package/dist/RadioList/RadioListItem.js +30 -22
  213. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  214. package/dist/Resizable/ResizeHandle.js +28 -10
  215. package/dist/Section/Section.js +5 -5
  216. package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
  217. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  218. package/dist/SegmentedControl/SegmentedControl.js +32 -10
  219. package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
  220. package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
  221. package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
  222. package/dist/SelectableCard/SelectableCard.js +5 -5
  223. package/dist/Selector/Selector.d.ts +6 -0
  224. package/dist/Selector/Selector.d.ts.map +1 -1
  225. package/dist/Selector/Selector.js +54 -45
  226. package/dist/Selector/SelectorOption.js +3 -3
  227. package/dist/SideNav/SideNav.d.ts.map +1 -1
  228. package/dist/SideNav/SideNav.js +38 -34
  229. package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
  230. package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
  231. package/dist/SideNav/SideNavCollapseButton.js +8 -6
  232. package/dist/SideNav/SideNavHeading.js +87 -87
  233. package/dist/SideNav/SideNavItem.js +42 -42
  234. package/dist/SideNav/SideNavSection.d.ts +1 -1
  235. package/dist/SideNav/SideNavSection.d.ts.map +1 -1
  236. package/dist/SideNav/SideNavSection.js +18 -16
  237. package/dist/Skeleton/Skeleton.js +3 -3
  238. package/dist/Slider/Slider.d.ts +6 -0
  239. package/dist/Slider/Slider.d.ts.map +1 -1
  240. package/dist/Slider/Slider.js +31 -22
  241. package/dist/Spinner/Spinner.d.ts.map +1 -1
  242. package/dist/Spinner/Spinner.js +10 -10
  243. package/dist/StatusDot/StatusDot.js +5 -5
  244. package/dist/Switch/Switch.d.ts +13 -4
  245. package/dist/Switch/Switch.d.ts.map +1 -1
  246. package/dist/Switch/Switch.js +41 -30
  247. package/dist/TabList/Tab.js +18 -18
  248. package/dist/TabList/TabList.js +5 -5
  249. package/dist/TabList/TabMenu.d.ts.map +1 -1
  250. package/dist/TabList/TabMenu.js +57 -30
  251. package/dist/TabList/tab.markers.stylex.d.ts +1 -1
  252. package/dist/Table/BaseTable.d.ts.map +1 -1
  253. package/dist/Table/BaseTable.js +51 -39
  254. package/dist/Table/Table.js +7 -7
  255. package/dist/Table/TableBody.d.ts +1 -1
  256. package/dist/Table/TableBody.d.ts.map +1 -1
  257. package/dist/Table/TableBody.js +9 -5
  258. package/dist/Table/TableCell.d.ts.map +1 -1
  259. package/dist/Table/TableCell.js +76 -7
  260. package/dist/Table/TableFooter.d.ts +1 -1
  261. package/dist/Table/TableFooter.d.ts.map +1 -1
  262. package/dist/Table/TableFooter.js +9 -5
  263. package/dist/Table/TableHeader.d.ts +1 -1
  264. package/dist/Table/TableHeader.d.ts.map +1 -1
  265. package/dist/Table/TableHeader.js +9 -5
  266. package/dist/Table/TableHeaderCell.js +3 -3
  267. package/dist/Table/TableRow.js +5 -5
  268. package/dist/Table/index.d.ts +2 -0
  269. package/dist/Table/index.d.ts.map +1 -1
  270. package/dist/Table/index.js +1 -0
  271. package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
  272. package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
  273. package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
  274. package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
  275. package/dist/Table/plugins/pagination/paginateData.js +5 -1
  276. package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
  277. package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
  278. package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
  279. package/dist/Table/plugins/rowExpansion/index.js +3 -0
  280. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
  281. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
  282. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
  283. package/dist/Table/plugins/selection/useTableSelection.js +18 -18
  284. package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
  285. package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
  286. package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
  287. package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
  288. package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
  289. package/dist/Table/tableContextMenu.d.ts +5 -1
  290. package/dist/Table/tableContextMenu.d.ts.map +1 -1
  291. package/dist/Table/tableContextMenu.js +19 -12
  292. package/dist/Text/Text.d.ts +1 -1
  293. package/dist/Text/Text.d.ts.map +1 -1
  294. package/dist/Text/Text.js +14 -13
  295. package/dist/Text/text.stylex.d.ts +35 -0
  296. package/dist/Text/text.stylex.d.ts.map +1 -1
  297. package/dist/Text/text.stylex.js +52 -1
  298. package/dist/TextArea/TextArea.js +14 -14
  299. package/dist/TextInput/TextInput.js +15 -15
  300. package/dist/Thumbnail/Thumbnail.d.ts +3 -2
  301. package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
  302. package/dist/Thumbnail/Thumbnail.js +30 -29
  303. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  304. package/dist/TimeInput/TimeInput.js +26 -21
  305. package/dist/Timestamp/Timestamp.d.ts +1 -1
  306. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  307. package/dist/Timestamp/Timestamp.js +37 -26
  308. package/dist/Toast/Toast.d.ts.map +1 -1
  309. package/dist/Toast/Toast.js +25 -17
  310. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  311. package/dist/Toast/ToastViewport.js +23 -11
  312. package/dist/Toast/useToast.js +4 -4
  313. package/dist/ToggleButton/ToggleButton.js +12 -12
  314. package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
  315. package/dist/Token/Token.js +21 -21
  316. package/dist/Tokenizer/Tokenizer.d.ts +6 -1
  317. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  318. package/dist/Tokenizer/Tokenizer.js +38 -29
  319. package/dist/Toolbar/Toolbar.js +18 -18
  320. package/dist/Tooltip/Tooltip.js +11 -11
  321. package/dist/Tooltip/useTooltip.js +3 -3
  322. package/dist/TopNav/TopNav.js +32 -32
  323. package/dist/TopNav/TopNavHeading.js +67 -67
  324. package/dist/TopNav/TopNavItem.js +5 -5
  325. package/dist/TopNav/TopNavMegaMenu.js +30 -30
  326. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
  327. package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
  328. package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
  329. package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
  330. package/dist/TopNav/TopNavMenu.js +32 -32
  331. package/dist/TreeList/TreeList.js +8 -8
  332. package/dist/TreeList/TreeListBranches.js +11 -11
  333. package/dist/TreeList/TreeListItem.js +30 -30
  334. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  335. package/dist/Typeahead/BaseTypeahead.js +23 -20
  336. package/dist/Typeahead/Typeahead.js +12 -12
  337. package/dist/Typeahead/TypeaheadItem.js +10 -10
  338. package/dist/VStack/VStack.js +3 -3
  339. package/dist/astryx.css +23 -0
  340. package/dist/astryx.umd.js +60 -58
  341. package/dist/astryx.umd.js.map +4 -4
  342. package/dist/docs-types.d.ts +13 -1
  343. package/dist/docs-types.d.ts.map +1 -1
  344. package/dist/hooks/focusableSelector.d.ts +1 -1
  345. package/dist/hooks/focusableSelector.d.ts.map +1 -1
  346. package/dist/hooks/focusableSelector.js +1 -1
  347. package/dist/hooks/index.d.ts +2 -0
  348. package/dist/hooks/index.d.ts.map +1 -1
  349. package/dist/hooks/index.js +1 -0
  350. package/dist/hooks/useFocusTrap.d.ts +3 -0
  351. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  352. package/dist/hooks/useFocusTrap.js +38 -1
  353. package/dist/hooks/useHotkeys.d.ts +51 -0
  354. package/dist/hooks/useHotkeys.d.ts.map +1 -0
  355. package/dist/hooks/useHotkeys.js +160 -0
  356. package/dist/hooks/useInteractiveRole.d.ts +6 -2
  357. package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
  358. package/dist/hooks/useInteractiveRole.js +6 -2
  359. package/dist/hooks/useKeyboardHint.js +9 -9
  360. package/dist/hooks/useStreamingText.d.ts +3 -1
  361. package/dist/hooks/useStreamingText.d.ts.map +1 -1
  362. package/dist/hooks/useStreamingText.js +14 -5
  363. package/dist/theme/MediaTheme.js +3 -3
  364. package/dist/theme/Theme.js +7 -7
  365. package/dist/theme/defineTheme.d.ts +1 -1
  366. package/dist/theme/defineTheme.d.ts.map +1 -1
  367. package/dist/theme/expandColorScale.d.ts.map +1 -1
  368. package/dist/theme/expandColorScale.js +10 -3
  369. package/dist/theme/hct.d.ts +0 -15
  370. package/dist/theme/hct.d.ts.map +1 -1
  371. package/dist/theme/hct.js +9 -9
  372. package/dist/theme/syntax/SyntaxTheme.js +5 -5
  373. package/dist/theme/tokens.d.ts +10 -2
  374. package/dist/theme/tokens.d.ts.map +1 -1
  375. package/dist/theme/tokens.js +220 -4
  376. package/dist/utils/color.d.ts +42 -0
  377. package/dist/utils/color.d.ts.map +1 -0
  378. package/dist/utils/color.js +150 -0
  379. package/dist/utils/composeEventHandlers.d.ts +30 -0
  380. package/dist/utils/composeEventHandlers.d.ts.map +1 -0
  381. package/dist/utils/composeEventHandlers.js +40 -0
  382. package/dist/utils/index.d.ts +3 -0
  383. package/dist/utils/index.d.ts.map +1 -1
  384. package/dist/utils/index.js +3 -1
  385. package/dist/utils/timeParser.d.ts.map +1 -1
  386. package/dist/utils/timeParser.js +8 -5
  387. package/package.json +3 -3
  388. package/src/AlertDialog/AlertDialog.tsx +2 -0
  389. package/src/AppShell/AppShell.tsx +2 -0
  390. package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
  391. package/src/Avatar/Avatar.doc.mjs +13 -2
  392. package/src/Avatar/Avatar.test.tsx +32 -1
  393. package/src/Avatar/Avatar.tsx +12 -20
  394. package/src/Banner/Banner.doc.mjs +8 -0
  395. package/src/Banner/Banner.test.tsx +38 -0
  396. package/src/Banner/Banner.tsx +8 -1
  397. package/src/Button/Button.tsx +39 -6
  398. package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
  399. package/src/Calendar/Calendar.doc.mjs +1 -1
  400. package/src/Calendar/Calendar.test.tsx +201 -17
  401. package/src/Calendar/Calendar.tsx +79 -26
  402. package/src/Calendar/dayCellUtils.test.ts +306 -1
  403. package/src/Calendar/dayCellUtils.ts +206 -13
  404. package/src/Calendar/styles.ts +12 -2
  405. package/src/Card/Card.doc.mjs +1 -1
  406. package/src/Card/Card.tsx +16 -6
  407. package/src/Carousel/Carousel.doc.mjs +12 -12
  408. package/src/Carousel/Carousel.test.tsx +13 -0
  409. package/src/Carousel/Carousel.tsx +1 -0
  410. package/src/Chat/Chat.doc.mjs +1 -1
  411. package/src/Chat/ChatComposerInput.test.tsx +24 -0
  412. package/src/Chat/ChatComposerInput.tsx +17 -1
  413. package/src/Chat/ChatDictationButton.test.tsx +43 -0
  414. package/src/Chat/ChatDictationButton.tsx +4 -4
  415. package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
  416. package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
  417. package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
  418. package/src/Chat/ChatMessageMetadata.tsx +4 -6
  419. package/src/Chat/ChatSystemMessage.test.tsx +26 -11
  420. package/src/Chat/ChatSystemMessage.tsx +7 -7
  421. package/src/Chat/ChatTokenizedText.test.tsx +29 -16
  422. package/src/Chat/ChatTokenizedText.tsx +15 -8
  423. package/src/Chat/ChatToolCalls.test.tsx +55 -0
  424. package/src/Chat/ChatToolCalls.tsx +10 -12
  425. package/src/Chat/index.ts +1 -4
  426. package/src/Chat/useChatNewMessages.test.tsx +4 -4
  427. package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
  428. package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
  429. package/src/CheckboxInput/CheckboxInput.tsx +13 -0
  430. package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
  431. package/src/CheckboxList/CheckboxList.test.tsx +19 -0
  432. package/src/CheckboxList/CheckboxListItem.tsx +11 -2
  433. package/src/Citation/Citation.doc.mjs +5 -0
  434. package/src/ClickableCard/ClickableCard.tsx +45 -2
  435. package/src/Code/Code.test.tsx +54 -0
  436. package/src/Code/Code.tsx +48 -4
  437. package/src/Code/index.ts +1 -1
  438. package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
  439. package/src/CodeBlock/CodeBlock.test.tsx +122 -3
  440. package/src/CodeBlock/CodeBlock.tsx +62 -4
  441. package/src/CodeBlock/index.ts +1 -1
  442. package/src/Collapsible/Collapsible.doc.mjs +8 -4
  443. package/src/Collapsible/Collapsible.test.tsx +405 -0
  444. package/src/Collapsible/Collapsible.tsx +86 -10
  445. package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
  446. package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
  447. package/src/Collapsible/CollapsibleGroup.tsx +107 -9
  448. package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
  449. package/src/Collapsible/index.ts +4 -0
  450. package/src/Collapsible/useCollapsible.ts +20 -6
  451. package/src/CommandPalette/CommandPalette.tsx +5 -3
  452. package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
  453. package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
  454. package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
  455. package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
  456. package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
  457. package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
  458. package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
  459. package/src/ContextMenu/ContextMenu.test.tsx +15 -0
  460. package/src/ContextMenu/ContextMenu.tsx +19 -1
  461. package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
  462. package/src/DateInput/DateInput.doc.mjs +6 -1
  463. package/src/DateInput/DateInput.test.tsx +11 -20
  464. package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
  465. package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
  466. package/src/DateRangeInput/DateRangeInput.tsx +2 -2
  467. package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
  468. package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
  469. package/src/DateTimeInput/DateTimeInput.tsx +9 -8
  470. package/src/DateTimeInput/index.ts +1 -0
  471. package/src/Dialog/DialogHeader.doc.mjs +45 -0
  472. package/src/Divider/Divider.tsx +1 -23
  473. package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
  474. package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
  475. package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
  476. package/src/EmptyState/EmptyState.doc.mjs +1 -1
  477. package/src/Field/Field.doc.mjs +1 -1
  478. package/src/Field/FieldLabel.test.tsx +2 -2
  479. package/src/FieldStatus/FieldStatus.test.tsx +282 -0
  480. package/src/FileInput/FileInput.doc.mjs +1 -1
  481. package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
  482. package/src/Grid/Grid.doc.mjs +3 -3
  483. package/src/Grid/Grid.test.tsx +43 -18
  484. package/src/Grid/Grid.tsx +26 -9
  485. package/src/Icon/Icon.test.tsx +41 -29
  486. package/src/Icon/Icon.tsx +6 -2
  487. package/src/InputGroup/InputGroup.tsx +2 -2
  488. package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
  489. package/src/Item/Item.tsx +1 -1
  490. package/src/Layout/Layout.test.tsx +285 -0
  491. package/src/Layout/LayoutContent.doc.mjs +12 -0
  492. package/src/Layout/LayoutPanel.doc.mjs +40 -0
  493. package/src/Layout/LayoutSlots.test.tsx +364 -0
  494. package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
  495. package/src/Lightbox/Lightbox.doc.mjs +5 -0
  496. package/src/Lightbox/Lightbox.test.tsx +123 -2
  497. package/src/Lightbox/Lightbox.tsx +29 -1
  498. package/src/Markdown/Markdown.test.tsx +23 -0
  499. package/src/Markdown/Markdown.tsx +9 -7
  500. package/src/Markdown/incremental.test.ts +36 -0
  501. package/src/Markdown/parser.perf.test.ts +34 -12
  502. package/src/Markdown/parser.test.ts +210 -0
  503. package/src/Markdown/parser.ts +301 -6
  504. package/src/MobileNav/MobileNav.doc.mjs +20 -0
  505. package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
  506. package/src/MultiSelector/MultiSelector.test.tsx +33 -0
  507. package/src/MultiSelector/MultiSelector.tsx +20 -0
  508. package/src/NavMenu/NavMenu.doc.mjs +15 -0
  509. package/src/NumberInput/NumberInput.test.tsx +48 -3
  510. package/src/NumberInput/NumberInput.tsx +32 -15
  511. package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
  512. package/src/OverflowList/OverflowList.test.tsx +416 -0
  513. package/src/Overlay/Overlay.doc.mjs +6 -0
  514. package/src/Overlay/Overlay.test.tsx +356 -0
  515. package/src/Pagination/Pagination.test.tsx +162 -0
  516. package/src/Pagination/Pagination.tsx +80 -26
  517. package/src/Popover/Popover.test.tsx +65 -0
  518. package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
  519. package/src/PowerSearch/PowerSearch.test.tsx +109 -1
  520. package/src/PowerSearch/PowerSearch.tsx +37 -16
  521. package/src/ProgressBar/ProgressBar.test.tsx +30 -0
  522. package/src/ProgressBar/ProgressBar.tsx +12 -5
  523. package/src/RadioList/RadioList.doc.mjs +7 -1
  524. package/src/RadioList/RadioList.test.tsx +65 -0
  525. package/src/RadioList/RadioList.tsx +10 -1
  526. package/src/RadioList/RadioListItem.tsx +13 -4
  527. package/src/Resizable/ResizeHandle.test.tsx +218 -0
  528. package/src/Resizable/ResizeHandle.tsx +22 -4
  529. package/src/Section/Section.test.tsx +4 -10
  530. package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
  531. package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
  532. package/src/SegmentedControl/SegmentedControl.tsx +27 -5
  533. package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
  534. package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
  535. package/src/Selector/Selector.doc.mjs +12 -1
  536. package/src/Selector/Selector.test.tsx +30 -0
  537. package/src/Selector/Selector.tsx +18 -0
  538. package/src/SideNav/SideNav.doc.mjs +7 -1
  539. package/src/SideNav/SideNav.test.tsx +66 -0
  540. package/src/SideNav/SideNav.tsx +6 -2
  541. package/src/SideNav/SideNavCollapseButton.tsx +4 -3
  542. package/src/SideNav/SideNavSection.tsx +6 -4
  543. package/src/SizeContext/SizeContext.test.tsx +226 -0
  544. package/src/Slider/Slider.doc.mjs +14 -2
  545. package/src/Slider/Slider.test.tsx +30 -0
  546. package/src/Slider/Slider.tsx +20 -0
  547. package/src/Spinner/Spinner.tsx +1 -0
  548. package/src/Switch/Switch.doc.mjs +21 -9
  549. package/src/Switch/Switch.test.tsx +137 -0
  550. package/src/Switch/Switch.tsx +32 -7
  551. package/src/TabList/TabList.doc.mjs +3 -3
  552. package/src/TabList/TabList.test.tsx +185 -1
  553. package/src/TabList/TabMenu.tsx +45 -9
  554. package/src/Table/BaseTable.tsx +16 -3
  555. package/src/Table/Table.test.tsx +87 -0
  556. package/src/Table/TableBody.tsx +15 -2
  557. package/src/Table/TableCell.tsx +87 -8
  558. package/src/Table/TableFooter.tsx +15 -2
  559. package/src/Table/TableHeader.tsx +15 -2
  560. package/src/Table/index.ts +5 -0
  561. package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
  562. package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
  563. package/src/Table/plugins/pagination/paginateData.ts +5 -1
  564. package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
  565. package/src/Table/plugins/rowExpansion/index.ts +7 -0
  566. package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
  567. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
  568. package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
  569. package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
  570. package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
  571. package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
  572. package/src/Table/tableContextMenu.test.tsx +27 -3
  573. package/src/Table/tableContextMenu.tsx +20 -2
  574. package/src/Table/useTablePagination.doc.mjs +4 -1
  575. package/src/Table/useTableRowExpansion.doc.mjs +80 -0
  576. package/src/Table/useTableSortable.doc.mjs +4 -1
  577. package/src/Text/Text.doc.mjs +2 -2
  578. package/src/Text/Text.test.tsx +11 -0
  579. package/src/Text/Text.tsx +4 -2
  580. package/src/Text/text.stylex.ts +41 -0
  581. package/src/TextArea/TextArea.doc.mjs +1 -1
  582. package/src/TextArea/TextArea.test.tsx +3 -3
  583. package/src/TextInput/TextInput.doc.mjs +1 -1
  584. package/src/TextInput/TextInput.test.tsx +3 -3
  585. package/src/Thumbnail/Thumbnail.test.tsx +36 -2
  586. package/src/Thumbnail/Thumbnail.tsx +4 -2
  587. package/src/TimeInput/TimeInput.doc.mjs +11 -6
  588. package/src/TimeInput/TimeInput.test.tsx +37 -0
  589. package/src/TimeInput/TimeInput.tsx +11 -1
  590. package/src/Timestamp/Timestamp.doc.mjs +1 -1
  591. package/src/Timestamp/Timestamp.test.tsx +52 -0
  592. package/src/Timestamp/Timestamp.tsx +30 -16
  593. package/src/Toast/Toast.tsx +11 -3
  594. package/src/Toast/ToastViewport.test.tsx +64 -0
  595. package/src/Toast/ToastViewport.tsx +12 -0
  596. package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
  597. package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
  598. package/src/Tokenizer/Tokenizer.test.tsx +33 -0
  599. package/src/Tokenizer/Tokenizer.tsx +19 -0
  600. package/src/Toolbar/Toolbar.test.tsx +1 -1
  601. package/src/TopNav/TopNav.doc.mjs +1 -1
  602. package/src/TopNav/TopNav.test.tsx +18 -0
  603. package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
  604. package/src/TreeList/TreeList.doc.mjs +2 -2
  605. package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
  606. package/src/Typeahead/BaseTypeahead.tsx +5 -2
  607. package/src/Typeahead/Typeahead.doc.mjs +7 -2
  608. package/src/Typeahead/Typeahead.test.tsx +45 -1
  609. package/src/__tests__/TestIcon.tsx +26 -0
  610. package/src/__tests__/fastRoleQueries.ts +66 -0
  611. package/src/docPropReferences.test.ts +178 -0
  612. package/src/docs-types.ts +14 -0
  613. package/src/hooks/focusableSelector.ts +1 -1
  614. package/src/hooks/index.ts +3 -0
  615. package/src/hooks/useFocusTrap.doc.mjs +4 -2
  616. package/src/hooks/useFocusTrap.test.tsx +149 -1
  617. package/src/hooks/useFocusTrap.ts +50 -1
  618. package/src/hooks/useHotkeys.doc.mjs +52 -0
  619. package/src/hooks/useHotkeys.test.ts +245 -0
  620. package/src/hooks/useHotkeys.ts +203 -0
  621. package/src/hooks/useInteractiveRole.ts +12 -4
  622. package/src/hooks/useKeyboardHint.doc.mjs +6 -6
  623. package/src/hooks/useStreamingText.test.ts +54 -19
  624. package/src/hooks/useStreamingText.ts +16 -5
  625. package/src/theme/SyntaxTheme.doc.mjs +4 -4
  626. package/src/theme/defineTheme.ts +4 -13
  627. package/src/theme/derivedVarRegistry.test.ts +2 -2
  628. package/src/theme/expandColorScale.test.ts +29 -0
  629. package/src/theme/expandColorScale.ts +11 -6
  630. package/src/theme/hct.ts +9 -17
  631. package/src/theme/tokens.test.ts +182 -9
  632. package/src/theme/tokens.ts +239 -4
  633. package/src/theme/useTheme.test.tsx +20 -0
  634. package/src/utils/color.test.ts +133 -0
  635. package/src/utils/color.ts +148 -0
  636. package/src/utils/composeEventHandlers.test.ts +71 -0
  637. package/src/utils/composeEventHandlers.ts +44 -0
  638. package/src/utils/index.ts +4 -0
  639. package/src/utils/mergeProps.test.ts +166 -0
  640. package/src/utils/sharedResizeObserver.test.ts +2 -2
  641. package/src/utils/timeParser.test.ts +13 -0
  642. package/src/utils/timeParser.ts +8 -5
@@ -14,6 +14,12 @@ export const docs = {
14
14
  type: 'ReactNode',
15
15
  description: 'Content.',
16
16
  },
17
+ {
18
+ name: 'padding',
19
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
20
+ description:
21
+ 'Internal padding using the spacing scale. Overrides the default padding from the layout container.',
22
+ },
17
23
  {
18
24
  name: 'isScrollable',
19
25
  type: 'boolean',
@@ -44,6 +50,11 @@ export const docsZh = {
44
50
  type: 'ReactNode',
45
51
  description: '内容。',
46
52
  },
53
+ {
54
+ name: 'padding',
55
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
56
+ description: '使用间距比例的内边距。覆盖布局容器的默认内边距。',
57
+ },
47
58
  {
48
59
  name: 'isScrollable',
49
60
  type: 'boolean',
@@ -70,6 +81,7 @@ export const docsDense = {
70
81
  description: 'Scrollable main content area.',
71
82
  propDescriptions: {
72
83
  children: 'Content.',
84
+ padding: 'Internal padding on spacing scale. Overrides layout container default.',
73
85
  isScrollable: 'Enable scrollable overflow.',
74
86
  label: 'Accessible label for landmark element.',
75
87
  role: 'ARIA landmark role.',
@@ -20,6 +20,12 @@ export const docs = {
20
20
  description: 'Border on the appropriate edge.',
21
21
  default: 'false',
22
22
  },
23
+ {
24
+ name: 'padding',
25
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
26
+ description:
27
+ 'Internal padding using the spacing scale. Overrides the default padding from the layout container.',
28
+ },
23
29
  {
24
30
  name: 'isScrollable',
25
31
  type: 'boolean',
@@ -36,6 +42,18 @@ export const docs = {
36
42
  type: 'AriaRole',
37
43
  description: 'ARIA landmark role.',
38
44
  },
45
+ {
46
+ name: 'width',
47
+ type: 'number | string',
48
+ description:
49
+ 'Width of the panel. Numbers are treated as pixels, strings are used as-is. Ignored when resizable is provided; the hook controls width.',
50
+ },
51
+ {
52
+ name: 'resizable',
53
+ type: 'ResizableProps',
54
+ description:
55
+ 'Resize props from useResizable(). When provided, the hook drives the panel width and a ResizeHandle should be placed adjacent to the panel.',
56
+ },
39
57
  ],
40
58
  };
41
59
 
@@ -56,6 +74,11 @@ export const docsZh = {
56
74
  description: '相应边缘的边框。',
57
75
  default: 'false',
58
76
  },
77
+ {
78
+ name: 'padding',
79
+ type: '0 | 0.5 | 1 | 1.5 | 2 | 3 | 4 | 5 | 6 | 8 | 10',
80
+ description: '使用间距比例的内边距。覆盖布局容器的默认内边距。',
81
+ },
59
82
  {
60
83
  name: 'isScrollable',
61
84
  type: 'boolean',
@@ -72,6 +95,18 @@ export const docsZh = {
72
95
  type: 'AriaRole',
73
96
  description: 'ARIA 地标角色。',
74
97
  },
98
+ {
99
+ name: 'width',
100
+ type: 'number | string',
101
+ description:
102
+ '面板宽度。数字按像素处理,字符串按原样使用。提供 resizable 时忽略,宽度由 hook 控制。',
103
+ },
104
+ {
105
+ name: 'resizable',
106
+ type: 'ResizableProps',
107
+ description:
108
+ '来自 useResizable() 的调整大小属性。提供时面板宽度由 hook 驱动,应在面板旁放置 ResizeHandle。',
109
+ },
75
110
  ],
76
111
  };
77
112
 
@@ -83,8 +118,13 @@ export const docsDense = {
83
118
  propDescriptions: {
84
119
  children: 'Panel content.',
85
120
  hasDivider: 'Border on appropriate edge.',
121
+ padding: 'Internal padding on spacing scale. Overrides layout container default.',
86
122
  isScrollable: 'Enable scrollable overflow.',
87
123
  label: 'Accessible label for landmark element.',
88
124
  role: 'ARIA landmark role.',
125
+ width:
126
+ 'Panel width. Numbers = pixels, strings as-is. Ignored when resizable provided; hook controls width.',
127
+ resizable:
128
+ 'Resize props from useResizable(). Hook drives panel width; place ResizeHandle adjacent.',
89
129
  },
90
130
  };
@@ -0,0 +1,364 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file LayoutSlots.test.tsx
5
+ * @input Uses vitest, @testing-library/react, Layout slot components
6
+ * @output Characterization tests for LayoutHeader, LayoutFooter,
7
+ * LayoutContent and LayoutPanel
8
+ * @position Testing; validates the slot primitives' rendering, landmark roles,
9
+ * divider reflection, sizing and context-driven behavior
10
+ *
11
+ * SYNC: When LayoutHeader/LayoutFooter/LayoutContent/LayoutPanel change,
12
+ * update tests to match new behavior
13
+ */
14
+
15
+ import {describe, it, expect} from 'vitest';
16
+ import {render, screen} from '@testing-library/react';
17
+ import {createRef} from 'react';
18
+ import {Layout} from './Layout';
19
+ import {LayoutHeader} from './LayoutHeader';
20
+ import {LayoutFooter} from './LayoutFooter';
21
+ import {LayoutContent} from './LayoutContent';
22
+ import {LayoutPanel} from './LayoutPanel';
23
+ import {LayoutDividerContext} from './LayoutDividerContext';
24
+ import {useResizable} from '../Resizable/useResizable';
25
+
26
+ // =============================================================================
27
+ // LayoutHeader
28
+ // =============================================================================
29
+
30
+ describe('LayoutHeader', () => {
31
+ it('renders its children', () => {
32
+ render(<LayoutHeader>Page title</LayoutHeader>);
33
+ expect(screen.getByText('Page title')).toBeInTheDocument();
34
+ });
35
+
36
+ it('carries the astryx-layout-header class', () => {
37
+ const {container} = render(<LayoutHeader>H</LayoutHeader>);
38
+ expect(
39
+ container.querySelector('.astryx-layout-header'),
40
+ ).toBeInTheDocument();
41
+ });
42
+
43
+ it('exposes a landmark role and accessible name', () => {
44
+ render(
45
+ <LayoutHeader role="banner" label="Site header">
46
+ H
47
+ </LayoutHeader>,
48
+ );
49
+ expect(
50
+ screen.getByRole('banner', {name: 'Site header'}),
51
+ ).toBeInTheDocument();
52
+ });
53
+
54
+ it('omits data-divider by default', () => {
55
+ const {container} = render(<LayoutHeader>H</LayoutHeader>);
56
+ expect(
57
+ container
58
+ .querySelector('.astryx-layout-header')
59
+ ?.hasAttribute('data-divider'),
60
+ ).toBe(false);
61
+ });
62
+
63
+ it('reflects hasDivider as data-divider="true"', () => {
64
+ const {container} = render(<LayoutHeader hasDivider>H</LayoutHeader>);
65
+ expect(
66
+ container
67
+ .querySelector('.astryx-layout-header')
68
+ ?.getAttribute('data-divider'),
69
+ ).toBe('true');
70
+ });
71
+
72
+ it('inherits the divider default from LayoutDividerContext', () => {
73
+ const {container} = render(
74
+ <LayoutDividerContext value={{defaultHasDividers: true}}>
75
+ <LayoutHeader>H</LayoutHeader>
76
+ </LayoutDividerContext>,
77
+ );
78
+ expect(
79
+ container
80
+ .querySelector('.astryx-layout-header')
81
+ ?.getAttribute('data-divider'),
82
+ ).toBe('true');
83
+ });
84
+
85
+ it('an explicit hasDivider={false} overrides an inherited true default', () => {
86
+ const {container} = render(
87
+ <LayoutDividerContext value={{defaultHasDividers: true}}>
88
+ <LayoutHeader hasDivider={false}>H</LayoutHeader>
89
+ </LayoutDividerContext>,
90
+ );
91
+ expect(
92
+ container
93
+ .querySelector('.astryx-layout-header')
94
+ ?.hasAttribute('data-divider'),
95
+ ).toBe(false);
96
+ });
97
+
98
+ it('applies a numeric height to the element style', () => {
99
+ const {container} = render(<LayoutHeader height={64}>H</LayoutHeader>);
100
+ const el = container.querySelector('.astryx-layout-header') as HTMLElement;
101
+ expect(el.getAttribute('style') ?? '').toContain('64px');
102
+ });
103
+
104
+ it('forwards ref to the outer element', () => {
105
+ const ref = createRef<HTMLDivElement>();
106
+ render(<LayoutHeader ref={ref}>H</LayoutHeader>);
107
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
108
+ expect(ref.current?.className).toContain('astryx-layout-header');
109
+ });
110
+
111
+ it('merges a caller className', () => {
112
+ const {container} = render(
113
+ <LayoutHeader className="hdr-custom">H</LayoutHeader>,
114
+ );
115
+ const el = container.querySelector('.astryx-layout-header') as HTMLElement;
116
+ expect(el.className).toContain('hdr-custom');
117
+ });
118
+
119
+ it('renders children in an inner wrapper (padding owner), not directly on the root', () => {
120
+ const {container} = render(<LayoutHeader>Inner</LayoutHeader>);
121
+ const root = container.querySelector(
122
+ '.astryx-layout-header',
123
+ ) as HTMLElement;
124
+ // Children live in a nested inner wrapper (the padding owner), not on the
125
+ // divider-owning root itself.
126
+ const inner = screen.getByText('Inner');
127
+ expect(inner).not.toBe(root);
128
+ expect(inner.parentElement).toBe(root);
129
+ expect(root).toContainElement(inner);
130
+ });
131
+ });
132
+
133
+ // =============================================================================
134
+ // LayoutFooter
135
+ // =============================================================================
136
+
137
+ describe('LayoutFooter', () => {
138
+ it('renders its children', () => {
139
+ render(<LayoutFooter>Actions</LayoutFooter>);
140
+ expect(screen.getByText('Actions')).toBeInTheDocument();
141
+ });
142
+
143
+ it('carries the astryx-layout-footer class', () => {
144
+ const {container} = render(<LayoutFooter>F</LayoutFooter>);
145
+ expect(
146
+ container.querySelector('.astryx-layout-footer'),
147
+ ).toBeInTheDocument();
148
+ });
149
+
150
+ it('exposes a landmark role and accessible name', () => {
151
+ render(
152
+ <LayoutFooter role="contentinfo" label="Page footer">
153
+ F
154
+ </LayoutFooter>,
155
+ );
156
+ expect(
157
+ screen.getByRole('contentinfo', {name: 'Page footer'}),
158
+ ).toBeInTheDocument();
159
+ });
160
+
161
+ it('omits data-divider by default and reflects hasDivider when set', () => {
162
+ const {container, rerender} = render(<LayoutFooter>F</LayoutFooter>);
163
+ const sel = '.astryx-layout-footer';
164
+ expect(container.querySelector(sel)?.hasAttribute('data-divider')).toBe(
165
+ false,
166
+ );
167
+ rerender(<LayoutFooter hasDivider>F</LayoutFooter>);
168
+ expect(container.querySelector(sel)?.getAttribute('data-divider')).toBe(
169
+ 'true',
170
+ );
171
+ });
172
+
173
+ it('inherits the divider default from context', () => {
174
+ const {container} = render(
175
+ <LayoutDividerContext value={{defaultHasDividers: true}}>
176
+ <LayoutFooter>F</LayoutFooter>
177
+ </LayoutDividerContext>,
178
+ );
179
+ expect(
180
+ container
181
+ .querySelector('.astryx-layout-footer')
182
+ ?.getAttribute('data-divider'),
183
+ ).toBe('true');
184
+ });
185
+
186
+ it('forwards ref to the outer element', () => {
187
+ const ref = createRef<HTMLDivElement>();
188
+ render(<LayoutFooter ref={ref}>F</LayoutFooter>);
189
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
190
+ expect(ref.current?.className).toContain('astryx-layout-footer');
191
+ });
192
+ });
193
+
194
+ // =============================================================================
195
+ // LayoutContent
196
+ // =============================================================================
197
+
198
+ describe('LayoutContent', () => {
199
+ it('renders its children', () => {
200
+ render(<LayoutContent>Body</LayoutContent>);
201
+ expect(screen.getByText('Body')).toBeInTheDocument();
202
+ });
203
+
204
+ it('carries the astryx-layout-content class', () => {
205
+ const {container} = render(<LayoutContent>C</LayoutContent>);
206
+ expect(
207
+ container.querySelector('.astryx-layout-content'),
208
+ ).toBeInTheDocument();
209
+ });
210
+
211
+ it('exposes the main landmark role with an accessible name', () => {
212
+ render(
213
+ <LayoutContent role="main" label="Main content">
214
+ C
215
+ </LayoutContent>,
216
+ );
217
+ expect(
218
+ screen.getByRole('main', {name: 'Main content'}),
219
+ ).toBeInTheDocument();
220
+ });
221
+
222
+ it('forwards ref to the element', () => {
223
+ const ref = createRef<HTMLDivElement>();
224
+ render(<LayoutContent ref={ref}>C</LayoutContent>);
225
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
226
+ expect(ref.current?.className).toContain('astryx-layout-content');
227
+ });
228
+
229
+ it('merges caller className and inline style', () => {
230
+ const {container} = render(
231
+ <LayoutContent className="body-custom" style={{color: 'rgb(1, 2, 3)'}}>
232
+ C
233
+ </LayoutContent>,
234
+ );
235
+ const el = container.querySelector('.astryx-layout-content') as HTMLElement;
236
+ expect(el.className).toContain('body-custom');
237
+ expect(el.style.color).toBe('rgb(1, 2, 3)');
238
+ });
239
+
240
+ it('renders correctly as the content slot of a Layout (reads slot context)', () => {
241
+ render(
242
+ <Layout
243
+ header={<LayoutHeader>H</LayoutHeader>}
244
+ content={<LayoutContent role="main">Main</LayoutContent>}
245
+ />,
246
+ );
247
+ expect(screen.getByRole('main')).toHaveTextContent('Main');
248
+ });
249
+
250
+ it('accepts padding={0} (full bleed) and a numeric padding without crashing', () => {
251
+ const {rerender, container} = render(
252
+ <LayoutContent padding={0}>C</LayoutContent>,
253
+ );
254
+ expect(
255
+ container.querySelector('.astryx-layout-content'),
256
+ ).toBeInTheDocument();
257
+ rerender(<LayoutContent padding={6}>C</LayoutContent>);
258
+ expect(
259
+ container.querySelector('.astryx-layout-content'),
260
+ ).toBeInTheDocument();
261
+ });
262
+ });
263
+
264
+ // =============================================================================
265
+ // LayoutPanel
266
+ // =============================================================================
267
+
268
+ describe('LayoutPanel', () => {
269
+ it('renders its children', () => {
270
+ render(<LayoutPanel>Nav</LayoutPanel>);
271
+ expect(screen.getByText('Nav')).toBeInTheDocument();
272
+ });
273
+
274
+ it('carries the astryx-layout-panel class', () => {
275
+ const {container} = render(<LayoutPanel>P</LayoutPanel>);
276
+ expect(container.querySelector('.astryx-layout-panel')).toBeInTheDocument();
277
+ });
278
+
279
+ it('exposes a navigation landmark with an accessible name', () => {
280
+ render(
281
+ <LayoutPanel role="navigation" label="Primary">
282
+ P
283
+ </LayoutPanel>,
284
+ );
285
+ expect(
286
+ screen.getByRole('navigation', {name: 'Primary'}),
287
+ ).toBeInTheDocument();
288
+ });
289
+
290
+ it('applies a numeric width to the element style', () => {
291
+ const {container} = render(<LayoutPanel width={240}>P</LayoutPanel>);
292
+ const el = container.querySelector('.astryx-layout-panel') as HTMLElement;
293
+ expect(el.getAttribute('style') ?? '').toContain('240px');
294
+ });
295
+
296
+ it('applies a string width to the element style', () => {
297
+ const {container} = render(<LayoutPanel width="18rem">P</LayoutPanel>);
298
+ const el = container.querySelector('.astryx-layout-panel') as HTMLElement;
299
+ expect(el.getAttribute('style') ?? '').toContain('18rem');
300
+ });
301
+
302
+ it('resizable._size overrides the width prop', () => {
303
+ function Harness() {
304
+ const region = useResizable({defaultSize: 300});
305
+ return (
306
+ <LayoutPanel width={100} resizable={region.props}>
307
+ P
308
+ </LayoutPanel>
309
+ );
310
+ }
311
+ const {container} = render(<Harness />);
312
+ const el = container.querySelector('.astryx-layout-panel') as HTMLElement;
313
+ const style = el.getAttribute('style') ?? '';
314
+ expect(style).toContain('300px');
315
+ expect(style).not.toContain('100px');
316
+ });
317
+
318
+ it('forwards ref to the element', () => {
319
+ const ref = createRef<HTMLDivElement>();
320
+ render(<LayoutPanel ref={ref}>P</LayoutPanel>);
321
+ expect(ref.current).toBeInstanceOf(HTMLDivElement);
322
+ expect(ref.current?.className).toContain('astryx-layout-panel');
323
+ });
324
+
325
+ it('renders as a start-slot panel inside a Layout without crashing', () => {
326
+ render(
327
+ <Layout
328
+ start={
329
+ <LayoutPanel hasDivider role="navigation" label="Side">
330
+ Sidebar
331
+ </LayoutPanel>
332
+ }
333
+ content={<LayoutContent>Main</LayoutContent>}
334
+ />,
335
+ );
336
+ expect(screen.getByRole('navigation', {name: 'Side'})).toHaveTextContent(
337
+ 'Sidebar',
338
+ );
339
+ });
340
+
341
+ it('renders as an end-slot panel inside a Layout without crashing', () => {
342
+ render(
343
+ <Layout
344
+ end={
345
+ <LayoutPanel hasDivider role="complementary" label="Inspector">
346
+ Details
347
+ </LayoutPanel>
348
+ }
349
+ content={<LayoutContent>Main</LayoutContent>}
350
+ />,
351
+ );
352
+ expect(
353
+ screen.getByRole('complementary', {name: 'Inspector'}),
354
+ ).toHaveTextContent('Details');
355
+ });
356
+
357
+ it('merges a caller className', () => {
358
+ const {container} = render(
359
+ <LayoutPanel className="panel-custom">P</LayoutPanel>,
360
+ );
361
+ const el = container.querySelector('.astryx-layout-panel') as HTMLElement;
362
+ expect(el.className).toContain('panel-custom');
363
+ });
364
+ });
@@ -116,4 +116,76 @@ describe('Edge Compensation', () => {
116
116
  expect(dismissButton).toHaveAttribute(EDGE_COMP_ATTR);
117
117
  });
118
118
  });
119
+
120
+ // The container's compensation selector is a direct-child combinator:
121
+ // :has(> [data-astryx-edge-comp]:last-child)
122
+ // so an edge-comp marker only counts when it sits on a *direct* child of the
123
+ // slot. Attaching a tooltip must not bury the marker one level deeper — the
124
+ // Button uses the tooltip hook (no wrapper element) so the marker stays on the
125
+ // button itself (#2578).
126
+ describe('Tooltip attachment preserves marker discoverability', () => {
127
+ // Resolve the toolbar slot (the flex wrapper that carries the negative
128
+ // margin) — it is the direct child of the [role="toolbar"] row.
129
+ const findSlot = (
130
+ button: HTMLElement,
131
+ toolbar: HTMLElement,
132
+ ): HTMLElement => {
133
+ let node = button;
134
+ while (node.parentElement && node.parentElement !== toolbar) {
135
+ node = node.parentElement;
136
+ }
137
+ return node;
138
+ };
139
+
140
+ it('keeps the marker on a direct child of the slot without a tooltip', () => {
141
+ const {container} = render(
142
+ <Toolbar
143
+ label="Actions"
144
+ endContent={
145
+ <Button
146
+ label="Close"
147
+ variant="ghost"
148
+ isIconOnly
149
+ icon={<span>x</span>}
150
+ />
151
+ }
152
+ />,
153
+ );
154
+ const button = screen.getByRole('button', {name: 'Close'});
155
+ const toolbar = container.querySelector(
156
+ '[role="toolbar"]',
157
+ ) as HTMLElement;
158
+ const slot = findSlot(button, toolbar);
159
+ const directMarked = slot.querySelector(`:scope > [${EDGE_COMP_ATTR}]`);
160
+ expect(directMarked).not.toBeNull();
161
+ });
162
+
163
+ it('keeps the marker on a direct child of the slot when tooltip is set', () => {
164
+ const {container} = render(
165
+ <Toolbar
166
+ label="Actions"
167
+ endContent={
168
+ <Button
169
+ label="Close"
170
+ variant="ghost"
171
+ isIconOnly
172
+ icon={<span>x</span>}
173
+ tooltip="Close panel"
174
+ />
175
+ }
176
+ />,
177
+ );
178
+ const button = screen.getByRole('button', {name: 'Close'});
179
+ const toolbar = container.querySelector(
180
+ '[role="toolbar"]',
181
+ ) as HTMLElement;
182
+ const slot = findSlot(button, toolbar);
183
+ // The tooltip is attached via the hook (no wrapper element), so the
184
+ // marker stays on the button — a direct child of the container's slot —
185
+ // and the container's direct-child `:has(> [marker]:last-child)` selector
186
+ // still matches.
187
+ const directMarked = slot.querySelector(`:scope > [${EDGE_COMP_ATTR}]`);
188
+ expect(directMarked).not.toBeNull();
189
+ });
190
+ });
119
191
  });
@@ -64,8 +64,13 @@ export const docs = {
64
64
  { guidance: false, description: 'Nest interactive content inside captions; keep them plain text.' },
65
65
  ],
66
66
  },
67
+ // The lightbox opens via showModal() and renders nothing while closed —
68
+ // overlay mode gives the Properties preview an open trigger instead of an
69
+ // empty stage, mirroring MobileNav (#3616).
67
70
  playground: {
71
+ overlay: true,
68
72
  defaults: {
73
+ isOpen: false,
69
74
  media: {
70
75
  src: 'https://lookaside.facebook.com/assets/astryx/light-scene-horizontal-1.png',
71
76
  alt: 'Coastal shoreline with ocean waves',