@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
@@ -81,6 +81,13 @@ export type ParseOptions = {
81
81
  type ResolvedOptions = {
82
82
  readonly sourceIds: ReadonlySet<string> | undefined;
83
83
  readonly autolink: 'gfm' | undefined;
84
+ /**
85
+ * Link reference definitions (`[label]: url`) collected from the whole
86
+ * document, keyed by normalized label. Internal only — populated by the
87
+ * block parser, never by the public `ParseOptions`. Enables `parseInlineImpl`
88
+ * to resolve full/collapsed/shortcut reference links and images.
89
+ */
90
+ readonly linkDefs?: ReadonlyMap<string, string>;
84
91
  };
85
92
 
86
93
  const EMPTY_OPTS: ResolvedOptions = {sourceIds: undefined, autolink: undefined};
@@ -103,6 +110,228 @@ function resolveOptions(
103
110
  return {sourceIds: opts.sourceIds, autolink: opts.autolink};
104
111
  }
105
112
 
113
+ // ---------------------------------------------------------------------------
114
+ // Link reference definitions
115
+ // ---------------------------------------------------------------------------
116
+
117
+ // A CommonMark link reference definition line: up to 3 leading spaces, a
118
+ // bracketed label, `:`, a destination (bare or `<...>`), and an optional
119
+ // same-line title (captured as group 4 so a title-less definition can absorb a
120
+ // title on the following line). `^`-leading labels (`[^1]:`) are footnote
121
+ // definitions — a separate, unsupported feature — and are excluded so they
122
+ // pass through verbatim.
123
+ const LINK_DEFINITION_RE =
124
+ /^ {0,3}\[([^\]^](?:\\.|[^\]\\])*)\]:[ \t]*(?:<([^<>\n]*)>|(\S+))([ \t]+(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\)))?[ \t]*$/;
125
+
126
+ // A line that is nothing but a title — the continuation form allowed when a
127
+ // definition's destination is followed by its title on the next line.
128
+ const LINK_TITLE_ONLY_RE = /^ {0,3}(?:"[^"\n]*"|'[^'\n]*'|\([^()\n]*\))[ \t]*$/;
129
+
130
+ // CommonMark matches reference labels case-insensitively with leading/trailing
131
+ // whitespace stripped and internal whitespace runs collapsed to one space.
132
+ function normalizeLinkLabel(label: string): string {
133
+ return label.trim().replace(/\s+/g, ' ').toLowerCase();
134
+ }
135
+
136
+ function matchLinkDefinition(
137
+ line: string,
138
+ ): {label: string; destination: string; hasTitle: boolean} | null {
139
+ const match = LINK_DEFINITION_RE.exec(line);
140
+ if (match == null) {
141
+ return null;
142
+ }
143
+ const label = normalizeLinkLabel(match[1]);
144
+ // `match[2]` is the `<...>` destination (present but possibly empty, e.g.
145
+ // `<>` → empty href, valid per CommonMark); `match[3]` is the bare
146
+ // destination (always non-empty). One of the two always matches.
147
+ const destination = match[2] != null ? match[2] : match[3];
148
+ if (label === '' || destination == null) {
149
+ return null;
150
+ }
151
+ return {label, destination, hasTitle: match[4] != null};
152
+ }
153
+
154
+ /**
155
+ * Collect link reference definitions from the whole document and return the
156
+ * input with the definition lines removed. A definition is recognized at a
157
+ * block boundary — document start, after a blank line, after another
158
+ * definition, or after a self-contained block (heading / thematic break /
159
+ * closed fenced code) — but never inside a fenced code block or as a lazy
160
+ * continuation of a paragraph, honoring CommonMark's rule that a definition
161
+ * cannot interrupt a paragraph. First definition wins, and definitions produce
162
+ * no output so stripping unreferenced ones is correct.
163
+ *
164
+ * Scope limit: definitions are collected at the top level only, and a
165
+ * definition directly following a list, blockquote, or table (with no blank
166
+ * line between) is not recognized. A definition nested inside a blockquote or
167
+ * list item resolves within that container (via the recursive parse) but is
168
+ * not exposed to references elsewhere in the document, unlike full CommonMark
169
+ * where every definition is global. Separating a footer definition block with
170
+ * a blank line — the usual form — always works.
171
+ */
172
+ function extractLinkDefinitions(input: string): {
173
+ defs: ReadonlyMap<string, string>;
174
+ cleaned: string;
175
+ } {
176
+ const lines = input.split('\n');
177
+ const defs = new Map<string, string>();
178
+ const keep = new Array<boolean>(lines.length).fill(true);
179
+ let atBoundary = true;
180
+ let inFence = false;
181
+ let fenceMarker = '';
182
+
183
+ for (let index = 0; index < lines.length; index++) {
184
+ const line = lines[index];
185
+ if (inFence) {
186
+ if (line.startsWith(fenceMarker)) {
187
+ inFence = false;
188
+ fenceMarker = '';
189
+ // The line after a closed fence begins a new block.
190
+ atBoundary = true;
191
+ } else {
192
+ atBoundary = false;
193
+ }
194
+ continue;
195
+ }
196
+ const fenceMatch = line.match(/^(`{3,}|~{3,})/);
197
+ if (fenceMatch) {
198
+ inFence = true;
199
+ fenceMarker = fenceMatch[1];
200
+ atBoundary = false;
201
+ continue;
202
+ }
203
+ if (line.trim() === '') {
204
+ atBoundary = true;
205
+ continue;
206
+ }
207
+ if (atBoundary) {
208
+ const def = matchLinkDefinition(line);
209
+ if (def != null) {
210
+ if (!defs.has(def.label)) {
211
+ defs.set(def.label, def.destination);
212
+ }
213
+ keep[index] = false;
214
+ // A title-less definition absorbs a title on the following line
215
+ // (CommonMark), which then also produces no output.
216
+ if (
217
+ !def.hasTitle &&
218
+ index + 1 < lines.length &&
219
+ LINK_TITLE_ONLY_RE.test(lines[index + 1])
220
+ ) {
221
+ keep[index + 1] = false;
222
+ index++;
223
+ }
224
+ // Consecutive definitions stay at a block boundary.
225
+ continue;
226
+ }
227
+ }
228
+ // A heading or thematic break is a self-contained single-line block, so
229
+ // the next line begins a new block where a definition may appear.
230
+ atBoundary = /^ {0,3}#{1,6}(?: |\t|$)/.test(line) || isHorizontalRule(line);
231
+ }
232
+
233
+ if (defs.size === 0) {
234
+ return {defs, cleaned: input};
235
+ }
236
+ const cleaned = lines.filter((_, index) => keep[index]).join('\n');
237
+ return {defs, cleaned};
238
+ }
239
+
240
+ /** Order-independent signature of a link-definition set, for cache checks. */
241
+ function linkDefsSignature(defs: ReadonlyMap<string, string>): string {
242
+ if (defs.size === 0) {
243
+ return '';
244
+ }
245
+ return [...defs]
246
+ .sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))
247
+ .map(([label, dest]) => `${label}\u0000${dest}`)
248
+ .join('\u0001');
249
+ }
250
+
251
+ /**
252
+ * Resolve a full (`[text][label]`), collapsed (`[text][]`), or shortcut
253
+ * (`[text]`) reference at `start` (which points at `[`) against `linkDefs`.
254
+ * Returns the node plus the index just past the reference, or null when it is
255
+ * not a resolvable reference (caller falls through to literal handling).
256
+ */
257
+ function matchReferenceLink(
258
+ text: string,
259
+ start: number,
260
+ linkDefs: ReadonlyMap<string, string>,
261
+ opts: ResolvedOptions,
262
+ ): {node: InlineNode; end: number} | null {
263
+ const textClose = text.indexOf(']', start + 1);
264
+ if (textClose === -1) {
265
+ return null;
266
+ }
267
+ const linkText = text.slice(start + 1, textClose);
268
+ // Full `[text][label]` / collapsed `[text][]` — a matching definition wins.
269
+ if (text[textClose + 1] === '[') {
270
+ const labelClose = text.indexOf(']', textClose + 2);
271
+ if (labelClose !== -1) {
272
+ const rawLabel = text.slice(textClose + 2, labelClose);
273
+ // Only truly-empty brackets are the collapsed form; a whitespace-only
274
+ // label (`[ ]`) is a full reference whose normalized label is empty and
275
+ // matches nothing.
276
+ const label = rawLabel === '' ? linkText : rawLabel;
277
+ const href = linkDefs.get(normalizeLinkLabel(label));
278
+ if (href != null) {
279
+ return {
280
+ node: {type: 'link', href, children: parseInlineImpl(linkText, opts)},
281
+ end: labelClose + 1,
282
+ };
283
+ }
284
+ // No match — fall back to a shortcut `[text]` (CommonMark back-off),
285
+ // leaving the trailing `[label]` to be parsed separately.
286
+ }
287
+ }
288
+ // Shortcut: `[text]`.
289
+ if (linkText.trim() === '') {
290
+ return null;
291
+ }
292
+ const href = linkDefs.get(normalizeLinkLabel(linkText));
293
+ if (href == null) {
294
+ return null;
295
+ }
296
+ return {
297
+ node: {type: 'link', href, children: parseInlineImpl(linkText, opts)},
298
+ end: textClose + 1,
299
+ };
300
+ }
301
+
302
+ /** Reference-image equivalent of {@link matchReferenceLink} (`![alt][label]`). */
303
+ function matchReferenceImage(
304
+ text: string,
305
+ start: number,
306
+ linkDefs: ReadonlyMap<string, string>,
307
+ ): {node: InlineNode; end: number} | null {
308
+ const altClose = text.indexOf(']', start + 2);
309
+ if (altClose === -1) {
310
+ return null;
311
+ }
312
+ const alt = text.slice(start + 2, altClose);
313
+ if (text[altClose + 1] === '[') {
314
+ const labelClose = text.indexOf(']', altClose + 2);
315
+ if (labelClose !== -1) {
316
+ const rawLabel = text.slice(altClose + 2, labelClose);
317
+ const label = rawLabel === '' ? alt : rawLabel;
318
+ const src = linkDefs.get(normalizeLinkLabel(label));
319
+ if (src != null) {
320
+ return {node: {type: 'image', src, alt}, end: labelClose + 1};
321
+ }
322
+ // No match — fall back to a shortcut `![alt]`.
323
+ }
324
+ }
325
+ if (alt.trim() === '') {
326
+ return null;
327
+ }
328
+ const src = linkDefs.get(normalizeLinkLabel(alt));
329
+ if (src == null) {
330
+ return null;
331
+ }
332
+ return {node: {type: 'image', src, alt}, end: altClose + 1};
333
+ }
334
+
106
335
  // ---------------------------------------------------------------------------
107
336
  // Inline parser helpers
108
337
  // ---------------------------------------------------------------------------
@@ -260,6 +489,16 @@ function parseInlineImpl(text: string, opts: ResolvedOptions): InlineNode[] {
260
489
  }
261
490
  }
262
491
 
492
+ // --- Reference image ![alt][label] / ![alt][] / ![alt] ---
493
+ if (opts.linkDefs != null && text[i] === '!' && text[i + 1] === '[') {
494
+ const ref = matchReferenceImage(text, i, opts.linkDefs);
495
+ if (ref) {
496
+ nodes.push(ref.node);
497
+ i = ref.end;
498
+ continue;
499
+ }
500
+ }
501
+
263
502
  // --- Citation: bracket [id] (before link — link requires `(` after `]`) ---
264
503
  {
265
504
  const citation = matchBracketCitation(text, i, opts);
@@ -287,6 +526,16 @@ function parseInlineImpl(text: string, opts: ResolvedOptions): InlineNode[] {
287
526
  }
288
527
  }
289
528
 
529
+ // --- Reference link [text][label] / [text][] / [text] ---
530
+ if (opts.linkDefs != null && text[i] === '[') {
531
+ const ref = matchReferenceLink(text, i, opts.linkDefs, opts);
532
+ if (ref) {
533
+ nodes.push(ref.node);
534
+ i = ref.end;
535
+ continue;
536
+ }
537
+ }
538
+
290
539
  // --- Bold-italic: *** or ___ ---
291
540
  if (
292
541
  (text[i] === '*' && text[i + 1] === '*' && text[i + 2] === '*') ||
@@ -971,8 +1220,30 @@ export function parseMarkdown(
971
1220
  return parseMarkdownImpl(input, resolveOptions(arg));
972
1221
  }
973
1222
 
974
- function parseMarkdownImpl(input: string, opts: ResolvedOptions): BlockNode[] {
975
- const lines = input.split('\n');
1223
+ function parseMarkdownImpl(
1224
+ input: string,
1225
+ baseOpts: ResolvedOptions,
1226
+ ): BlockNode[] {
1227
+ // Collect this input's link reference definitions and strip their lines,
1228
+ // then merge them with any definitions inherited from an enclosing parse
1229
+ // (the incremental parser passes the whole document's definitions in; a
1230
+ // recursive blockquote/list parse inherits the outer definitions). Inherited
1231
+ // definitions win on conflict, matching CommonMark's first-definition-wins
1232
+ // in document order; locally-nested definitions still resolve within this
1233
+ // parse.
1234
+ const {defs, cleaned} = extractLinkDefinitions(input);
1235
+ const inherited = baseOpts.linkDefs;
1236
+ let linkDefs: ReadonlyMap<string, string> | undefined;
1237
+ if (defs.size === 0) {
1238
+ linkDefs = inherited;
1239
+ } else if (inherited == null) {
1240
+ linkDefs = defs;
1241
+ } else {
1242
+ linkDefs = new Map<string, string>([...defs, ...inherited]);
1243
+ }
1244
+ const opts: ResolvedOptions =
1245
+ linkDefs != null ? {...baseOpts, linkDefs} : baseOpts;
1246
+ const lines = cleaned.split('\n');
976
1247
  const blocks: BlockNode[] = [];
977
1248
  let index = 0;
978
1249
 
@@ -1106,6 +1377,13 @@ export interface IncrementalState {
1106
1377
  * with newly-arriving content.
1107
1378
  */
1108
1379
  autolink?: 'gfm';
1380
+ /**
1381
+ * Signature of the link reference definitions the cached `settledBlocks`
1382
+ * were parsed with. Definitions are document-global and typically arrive
1383
+ * (in a footer) after the references that use them, so when the set changes
1384
+ * the settled cache is invalidated to let earlier references resolve.
1385
+ */
1386
+ linkDefsKey?: string;
1109
1387
  }
1110
1388
 
1111
1389
  export function createIncrementalState(): IncrementalState {
@@ -1434,16 +1712,33 @@ export function parseMarkdownIncremental(
1434
1712
  state.settledText = '';
1435
1713
  state.settledBlocks = [];
1436
1714
  state.settledUpTo = 0;
1715
+ state.linkDefsKey = undefined;
1437
1716
  return [];
1438
1717
  }
1439
1718
 
1719
+ // Link reference definitions are document-global and usually stream in
1720
+ // (as a footer) after the references that use them, so collect them from the
1721
+ // whole input and pass them into every slice parse. When the set changes,
1722
+ // invalidate the settled cache so already-settled references re-resolve.
1723
+ const {defs: linkDefs} = extractLinkDefinitions(input);
1724
+ const linkDefsKey = linkDefsSignature(linkDefs);
1725
+ if (state.linkDefsKey !== linkDefsKey) {
1726
+ state.prevInput = '';
1727
+ state.settledText = '';
1728
+ state.settledBlocks = [];
1729
+ state.settledUpTo = 0;
1730
+ state.linkDefsKey = linkDefsKey;
1731
+ }
1732
+ const parseOpts: ResolvedOptions =
1733
+ linkDefs.size > 0 ? {...opts, linkDefs} : opts;
1734
+
1440
1735
  const lines = input.split('\n');
1441
1736
  const boundary = findSettledBoundary(lines);
1442
1737
 
1443
1738
  if (boundary < 0) {
1444
1739
  // Inside an unclosed fence or no blank-line boundary — full re-parse
1445
1740
  state.prevInput = input;
1446
- return parseMarkdownImpl(input, opts);
1741
+ return parseMarkdownImpl(input, parseOpts);
1447
1742
  }
1448
1743
 
1449
1744
  const settledText = lines.slice(0, boundary).join('\n');
@@ -1461,15 +1756,15 @@ export function parseMarkdownIncremental(
1461
1756
  ) {
1462
1757
  // Settled portion grew — parse only the new delta
1463
1758
  const delta = settledText.slice(state.settledText.length);
1464
- const deltaBlocks = parseMarkdownImpl(delta, opts);
1759
+ const deltaBlocks = parseMarkdownImpl(delta, parseOpts);
1465
1760
  settledBlocks = mergeSettledBlocks(state.settledBlocks, deltaBlocks);
1466
1761
  } else {
1467
1762
  // Content before the boundary changed — full re-parse of settled portion
1468
- settledBlocks = parseMarkdownImpl(settledText, opts);
1763
+ settledBlocks = parseMarkdownImpl(settledText, parseOpts);
1469
1764
  }
1470
1765
 
1471
1766
  const unsettledBlocks = unsettledText
1472
- ? parseMarkdownImpl(unsettledText, opts)
1767
+ ? parseMarkdownImpl(unsettledText, parseOpts)
1473
1768
  : [];
1474
1769
 
1475
1770
  state.settledText = settledText;
@@ -14,6 +14,26 @@ export const docs = {
14
14
  name: 'MobileNav',
15
15
  displayName: 'Mobile Nav',
16
16
  description: 'A slide-out drawer for mobile navigation. Accepts SideNav children.',
17
+ // The drawer opens via showModal() and renders nothing while closed —
18
+ // overlay mode gives the Properties preview an open trigger instead of
19
+ // an empty stage (#2706). Declared on this entry (not the directory
20
+ // doc) so MobileNavToggle does not inherit it.
21
+ playground: {
22
+ overlay: true,
23
+ defaults: {
24
+ isOpen: false,
25
+ header: 'Navigation',
26
+ children: {
27
+ __element: 'SideNavSection',
28
+ props: {title: 'Main'},
29
+ children: [
30
+ {__element: 'SideNavItem', props: {label: 'Dashboard', isSelected: true}},
31
+ {__element: 'SideNavItem', props: {label: 'Projects'}},
32
+ {__element: 'SideNavItem', props: {label: 'Settings'}},
33
+ ],
34
+ },
35
+ },
36
+ },
17
37
  props: [
18
38
  {
19
39
  name: 'isOpen',
@@ -112,11 +112,17 @@ export const docs = {
112
112
  type: 'boolean',
113
113
  description: 'Disables the selector.',
114
114
  },
115
+ {
116
+ name: 'htmlName',
117
+ type: 'string',
118
+ description:
119
+ 'The HTML name attribute for form submissions. Renders one hidden input per selected value, like a native multi-select.',
120
+ },
115
121
  {
116
122
  name: 'disabledMessage',
117
123
  type: 'string',
118
124
  description:
119
- 'Explains why the selector is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the trigger focusable via aria-disabled (activation stays blocked). Use this instead of wrapping a disabled MultiSelector in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
125
+ 'Explains why the selector is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the trigger focusable via aria-disabled (activation stays blocked). Use this instead of wrapping a disabled MultiSelector in Tooltip. Disabled controls swallow the hover events an external Tooltip needs.',
120
126
  },
121
127
  {
122
128
  name: 'isLabelHidden',
@@ -233,6 +239,7 @@ export const docsZh = {
233
239
  hasSearch: '是否显示用于过滤选项的搜索输入。',
234
240
  searchPlaceholder: '搜索输入的占位文本。',
235
241
  isDisabled: '禁用选择器。',
242
+ htmlName: '用于表单提交的 HTML name 属性。为每个已选值渲染一个隐藏输入,类似原生多选。',
236
243
  disabledMessage:
237
244
  '解释选择器被禁用的原因。与 isDisabled 一起使用时,悬停/键盘聚焦时显示工具提示,并通过 aria-disabled 保持触发器可聚焦(仍无法激活)。请使用此属性,而不是用 Tooltip 包裹被禁用的选择器。',
238
245
  isLabelHidden: '视觉上隐藏标签同时保持其可访问性。',
@@ -316,6 +323,11 @@ export const docsDense = {
316
323
  description:
317
324
  'Enable select-all when most users will want all or nearly all options selected.',
318
325
  },
326
+ {
327
+ guidance: true,
328
+ description:
329
+ 'Use inside InputGroup only for a short prefix or suffix addon; prefer count or labels trigger display so the group stays single-line.',
330
+ },
319
331
  {
320
332
  guidance: false,
321
333
  description: 'Use for single-value selection; use Selector instead.',
@@ -352,6 +364,7 @@ export const docsDense = {
352
364
  hasSearch: 'show search input',
353
365
  searchPlaceholder: 'search placeholder',
354
366
  isDisabled: 'disables selector',
367
+ htmlName: 'HTML name attr; one hidden input per selected value.',
355
368
  disabledMessage:
356
369
  'why disabled; w/ isDisabled shows tooltip on hover/focus, trigger stays focusable via aria-disabled; use instead of Tooltip wrapper',
357
370
  isLabelHidden: 'visually hides label',
@@ -1042,4 +1042,37 @@ describe('MultiSelector', () => {
1042
1042
  expect(trigger).toHaveAttribute('tabIndex', '-1');
1043
1043
  });
1044
1044
  });
1045
+ describe('form participation', () => {
1046
+ it('submits one entry per selected value under htmlName', () => {
1047
+ const {container} = render(
1048
+ <form>
1049
+ <MultiSelector
1050
+ label="Fruit"
1051
+ htmlName="fruit"
1052
+ options={['Apple', 'Banana', 'Orange']}
1053
+ value={['Apple', 'Orange']}
1054
+ onChange={() => {}}
1055
+ />
1056
+ </form>,
1057
+ );
1058
+ const data = new FormData(container.querySelector('form')!);
1059
+ expect(data.getAll('fruit')).toEqual(['Apple', 'Orange']);
1060
+ });
1061
+
1062
+ it('is excluded from form data when disabled', () => {
1063
+ const {container} = render(
1064
+ <form>
1065
+ <MultiSelector
1066
+ label="Fruit"
1067
+ htmlName="fruit"
1068
+ options={['Apple']}
1069
+ value={['Apple']}
1070
+ onChange={() => {}}
1071
+ isDisabled
1072
+ />
1073
+ </form>,
1074
+ );
1075
+ expect([...new FormData(container.querySelector('form')!).keys()]).toEqual([]);
1076
+ });
1077
+ });
1045
1078
  });
@@ -439,6 +439,13 @@ export interface MultiSelectorProps<
439
439
  */
440
440
  value: string[];
441
441
 
442
+ /**
443
+ * The HTML name attribute for form submissions. When set, hidden inputs
444
+ * carry one entry per selected value under this name, matching how a
445
+ * native multi-select serializes.
446
+ */
447
+ htmlName?: string;
448
+
442
449
  /**
443
450
  * Callback when selection changes.
444
451
  */
@@ -597,6 +604,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
597
604
  renderOption,
598
605
  isDefaultOpen = false,
599
606
  'data-testid': testId,
607
+ htmlName,
600
608
  width,
601
609
  xstyle,
602
610
  className,
@@ -1280,6 +1288,18 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
1280
1288
  {renderTriggerContent()}
1281
1289
  </span>
1282
1290
  </button>
1291
+ {htmlName != null &&
1292
+ value.map(v => (
1293
+ <input
1294
+ key={v}
1295
+ type="hidden"
1296
+ name={htmlName}
1297
+ value={v}
1298
+ // Disabled native controls are excluded from form submission;
1299
+ // mirror that for the hidden carriers.
1300
+ disabled={isDisabled}
1301
+ />
1302
+ ))}
1283
1303
  {isBusy && <Spinner size="sm" />}
1284
1304
  {hasClear && value.length > 0 && !isDisabled && (
1285
1305
  <button
@@ -17,12 +17,27 @@ export const docs = {
17
17
  'NavHeadingMenuItem renders individual selectable items. ' +
18
18
  'Pass as the menu prop of SideNavHeading or TopNavHeading.',
19
19
  },
20
+ playground: {
21
+ defaults: {
22
+ children: [
23
+ {__element: 'NavHeadingMenuItem', props: {label: 'Dashboard', href: '#'}},
24
+ {__element: 'NavHeadingMenuItem', props: {label: 'Analytics', href: '#'}},
25
+ {__element: 'NavHeadingMenuItem', props: {label: 'Settings', href: '#'}},
26
+ ],
27
+ },
28
+ },
20
29
  props: [
21
30
  {name: 'children', type: 'ReactNode', required: true, description: 'Menu items.'},
22
31
  {name: 'size', type: "'sm' | 'md' | 'lg'", default: "'md'", description: 'Controls min-width and item padding.'},
23
32
  {name: 'minWidth', type: 'number | string', description: 'Minimum width override.'},
24
33
  {name: 'xstyle', type: 'StyleXStyles', description: 'StyleX styles for layout customization (margins, positioning, sizing). Must be a stylex.create() value, not an inline style object like style={{}}.'},
25
34
  ],
35
+ theming: {
36
+ targets: [
37
+ {className: 'astryx-nav-heading-menu', visualProps: ['size']},
38
+ {className: 'astryx-nav-heading-menu-item', visualProps: ['size']},
39
+ ],
40
+ },
26
41
  };
27
42
 
28
43
  /** @type {import('../docs-types').TranslationDoc} */
@@ -12,7 +12,7 @@
12
12
  import {describe, it, expect, vi, beforeEach} from 'vitest';
13
13
  import {render, screen, fireEvent, waitFor} from '@testing-library/react';
14
14
  import userEvent from '@testing-library/user-event';
15
- import {HashtagIcon} from '@heroicons/react/24/outline';
15
+ import {TestIcon} from '../__tests__/TestIcon';
16
16
  import {NumberInput} from './NumberInput';
17
17
 
18
18
  // Mock showPopover/hidePopover since jsdom does not implement them. Used by the
@@ -174,7 +174,7 @@ describe('NumberInput', () => {
174
174
  label="Count"
175
175
  value={null}
176
176
  onChange={() => {}}
177
- startIcon={HashtagIcon}
177
+ startIcon={TestIcon}
178
178
  />,
179
179
  );
180
180
  expect(screen.getByRole('spinbutton')).toBeInTheDocument();
@@ -707,7 +707,7 @@ describe('NumberInput', () => {
707
707
  label="Qty"
708
708
  value={0}
709
709
  onChange={() => {}}
710
- startIcon={<HashtagIcon />}
710
+ startIcon={<TestIcon />}
711
711
  />,
712
712
  );
713
713
 
@@ -867,3 +867,48 @@ describe('NumberInput', () => {
867
867
  });
868
868
  });
869
869
  });
870
+
871
+ describe('keyboard clearing with hasClear (#3599)', () => {
872
+ it('commits null when the input is emptied and blurred', () => {
873
+ const onChange = vi.fn();
874
+ render(
875
+ <NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
876
+ );
877
+ const input = screen.getByLabelText('Qty');
878
+ fireEvent.change(input, {target: {value: ''}});
879
+ fireEvent.blur(input);
880
+ expect(onChange).toHaveBeenCalledWith(null);
881
+ });
882
+
883
+ it('commits null when the input is emptied and Enter is pressed', () => {
884
+ const onChange = vi.fn();
885
+ render(
886
+ <NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
887
+ );
888
+ const input = screen.getByLabelText('Qty');
889
+ fireEvent.change(input, {target: {value: ''}});
890
+ fireEvent.keyDown(input, {key: 'Enter'});
891
+ expect(onChange).toHaveBeenCalledWith(null);
892
+ });
893
+
894
+ it('does not fire when emptied and blurred with no prior value', () => {
895
+ const onChange = vi.fn();
896
+ render(
897
+ <NumberInput label="Qty" hasClear value={null} onChange={onChange} />,
898
+ );
899
+ const input = screen.getByLabelText('Qty');
900
+ fireEvent.change(input, {target: {value: ''}});
901
+ fireEvent.blur(input);
902
+ expect(onChange).not.toHaveBeenCalled();
903
+ });
904
+
905
+ it('still reverts on blur when hasClear is not set', () => {
906
+ const onChange = vi.fn();
907
+ render(<NumberInput label="Qty" value={42} onChange={onChange} />);
908
+ const input = screen.getByLabelText('Qty');
909
+ fireEvent.change(input, {target: {value: ''}});
910
+ fireEvent.blur(input);
911
+ expect(onChange).not.toHaveBeenCalled();
912
+ expect((input as HTMLInputElement).value).toBe('42');
913
+ });
914
+ });