@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f

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 (597) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/dist/AlertDialog/AlertDialog.d.ts +1 -1
  3. package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
  4. package/dist/AlertDialog/AlertDialog.js +45 -20
  5. package/dist/AppShell/AppShell.d.ts.map +1 -1
  6. package/dist/AppShell/AppShell.js +3 -2
  7. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  8. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  9. package/dist/AspectRatio/AspectRatio.js +23 -4
  10. package/dist/Avatar/Avatar.d.ts +25 -1
  11. package/dist/Avatar/Avatar.d.ts.map +1 -1
  12. package/dist/Avatar/Avatar.js +58 -19
  13. package/dist/Avatar/index.d.ts +2 -2
  14. package/dist/Avatar/index.d.ts.map +1 -1
  15. package/dist/Avatar/index.js +1 -1
  16. package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
  17. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  18. package/dist/AvatarGroup/AvatarGroup.js +8 -4
  19. package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
  20. package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
  21. package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
  22. package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
  23. package/dist/Banner/Banner.d.ts +40 -15
  24. package/dist/Banner/Banner.d.ts.map +1 -1
  25. package/dist/Banner/Banner.js +51 -18
  26. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  27. package/dist/BottomSheet/BottomSheet.js +17 -4
  28. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  29. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  30. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  31. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  32. package/dist/Button/Button.d.ts.map +1 -1
  33. package/dist/Button/Button.js +11 -6
  34. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  35. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  36. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  37. package/dist/Calendar/Calendar.d.ts +3 -1
  38. package/dist/Calendar/Calendar.d.ts.map +1 -1
  39. package/dist/Calendar/Calendar.js +14 -15
  40. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  41. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  42. package/dist/Calendar/getInitialFocusDate.js +62 -0
  43. package/dist/Calendar/styles.d.ts +5 -14
  44. package/dist/Calendar/styles.d.ts.map +1 -1
  45. package/dist/Calendar/styles.js +15 -15
  46. package/dist/Card/Card.d.ts +6 -9
  47. package/dist/Card/Card.d.ts.map +1 -1
  48. package/dist/Card/Card.js +6 -6
  49. package/dist/Carousel/Carousel.d.ts.map +1 -1
  50. package/dist/Carousel/Carousel.js +3 -3
  51. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  52. package/dist/Chat/ChatComposerInput.js +2 -3
  53. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  54. package/dist/Chat/ChatLayout.js +3 -3
  55. package/dist/Chat/ChatMessageList.d.ts +22 -3
  56. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  57. package/dist/Chat/ChatMessageList.js +6 -3
  58. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  59. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  60. package/dist/Chat/ChatTokenizedText.js +11 -6
  61. package/dist/Chat/useChatComposerTokens.js +1 -1
  62. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  63. package/dist/CheckboxInput/CheckboxInput.js +10 -3
  64. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  65. package/dist/ClickableCard/ClickableCard.js +3 -3
  66. package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
  67. package/dist/CodeBlock/CodeBlock.js +15 -4
  68. package/dist/CodeBlock/highlightRanges.js +1 -1
  69. package/dist/CodeBlock/highlightStyles.js +13 -13
  70. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  71. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  72. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  73. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  74. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  75. package/dist/ContextMenu/ContextMenu.js +4 -3
  76. package/dist/DateInput/DateInput.d.ts +43 -0
  77. package/dist/DateInput/DateInput.d.ts.map +1 -1
  78. package/dist/DateInput/DateInput.js +22 -2
  79. package/dist/DateInput/NativeDateField.d.ts +10 -0
  80. package/dist/DateInput/NativeDateField.d.ts.map +1 -0
  81. package/dist/DateInput/NativeDateField.js +494 -0
  82. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  83. package/dist/DateInput/TouchDateField.js +82 -23
  84. package/dist/DateInput/index.d.ts +1 -1
  85. package/dist/DateInput/index.d.ts.map +1 -1
  86. package/dist/DateInput/nativeDateSegments.d.ts +22 -0
  87. package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
  88. package/dist/DateInput/nativeDateSegments.js +111 -0
  89. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  90. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  91. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  92. package/dist/DateTimeInput/index.d.ts +1 -1
  93. package/dist/DateTimeInput/index.d.ts.map +1 -1
  94. package/dist/Dialog/Dialog.d.ts +21 -1
  95. package/dist/Dialog/Dialog.d.ts.map +1 -1
  96. package/dist/Dialog/Dialog.js +110 -58
  97. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  98. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  99. package/dist/Field/FieldLabel.d.ts.map +1 -1
  100. package/dist/Field/FieldLabel.js +9 -1
  101. package/dist/FileInput/FileInput.d.ts.map +1 -1
  102. package/dist/FileInput/FileInput.js +3 -2
  103. package/dist/Heading/Heading.d.ts.map +1 -1
  104. package/dist/Heading/Heading.js +6 -2
  105. package/dist/HoverCard/HoverCard.d.ts +6 -0
  106. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  107. package/dist/HoverCard/HoverCard.js +104 -3
  108. package/dist/HoverCard/useHoverCard.d.ts +19 -2
  109. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  110. package/dist/HoverCard/useHoverCard.js +74 -26
  111. package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
  112. package/dist/Indicator/CheckboxIndicator.js +6 -2
  113. package/dist/Item/Item.d.ts.map +1 -1
  114. package/dist/Item/Item.js +4 -2
  115. package/dist/Kbd/Kbd.d.ts.map +1 -1
  116. package/dist/Kbd/Kbd.js +2 -19
  117. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  118. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  119. package/dist/Layer/LayerDepthContext.js +66 -0
  120. package/dist/Layer/index.d.ts +3 -0
  121. package/dist/Layer/index.d.ts.map +1 -1
  122. package/dist/Layer/index.js +4 -0
  123. package/dist/Layer/layerStack.d.ts +98 -0
  124. package/dist/Layer/layerStack.d.ts.map +1 -0
  125. package/dist/Layer/layerStack.js +306 -0
  126. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  127. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  128. package/dist/Layer/useLayerDismissal.js +91 -0
  129. package/dist/Lightbox/Lightbox.d.ts +1 -0
  130. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  131. package/dist/Lightbox/Lightbox.js +103 -81
  132. package/dist/Markdown/Markdown.d.ts.map +1 -1
  133. package/dist/Markdown/Markdown.js +9 -4
  134. package/dist/Markdown/index.d.ts +1 -1
  135. package/dist/Markdown/index.d.ts.map +1 -1
  136. package/dist/Markdown/parser.d.ts +38 -1
  137. package/dist/Markdown/parser.d.ts.map +1 -1
  138. package/dist/Markdown/parser.js +182 -32
  139. package/dist/MobileNav/MobileNav.d.ts +6 -1
  140. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  141. package/dist/MobileNav/MobileNav.js +61 -36
  142. package/dist/MultiSelector/MultiSelector.d.ts +32 -1
  143. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  144. package/dist/MultiSelector/MultiSelector.js +63 -11
  145. package/dist/MultiSelector/index.d.ts +1 -1
  146. package/dist/MultiSelector/index.d.ts.map +1 -1
  147. package/dist/NavIcon/NavIcon.d.ts.map +1 -1
  148. package/dist/NavIcon/NavIcon.js +5 -1
  149. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  150. package/dist/NavMenu/NavHeadingMenu.js +3 -2
  151. package/dist/NumberInput/NumberInput.d.ts +6 -1
  152. package/dist/NumberInput/NumberInput.d.ts.map +1 -1
  153. package/dist/NumberInput/NumberInput.js +54 -104
  154. package/dist/NumberInput/numberInputCommit.d.ts +34 -0
  155. package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
  156. package/dist/NumberInput/numberInputCommit.js +71 -0
  157. package/dist/NumberInput/numberParser.d.ts +64 -0
  158. package/dist/NumberInput/numberParser.d.ts.map +1 -0
  159. package/dist/NumberInput/numberParser.js +350 -0
  160. package/dist/Outline/Outline.d.ts.map +1 -1
  161. package/dist/Outline/Outline.js +3 -2
  162. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  163. package/dist/OverflowList/OverflowList.js +3 -2
  164. package/dist/Overlay/Overlay.d.ts.map +1 -1
  165. package/dist/Overlay/Overlay.js +3 -2
  166. package/dist/Popover/usePopover.d.ts.map +1 -1
  167. package/dist/Popover/usePopover.js +20 -17
  168. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  169. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  170. package/dist/PowerSearch/PowerSearch.js +19 -6
  171. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  172. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  173. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  174. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  175. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  176. package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
  177. package/dist/PowerSearch/types.d.ts +2 -0
  178. package/dist/PowerSearch/types.d.ts.map +1 -1
  179. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  180. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  181. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  182. package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
  183. package/dist/ProgressBar/ProgressBar.js +18 -5
  184. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  185. package/dist/Resizable/ResizeHandle.js +3 -2
  186. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  187. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  188. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  189. package/dist/SelectableCard/SelectableCard.js +3 -3
  190. package/dist/Selector/Selector.d.ts +17 -0
  191. package/dist/Selector/Selector.d.ts.map +1 -1
  192. package/dist/Selector/Selector.js +81 -14
  193. package/dist/SideNav/SideNav.d.ts.map +1 -1
  194. package/dist/SideNav/SideNav.js +4 -3
  195. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  196. package/dist/SideNav/SideNavHeading.js +8 -7
  197. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  198. package/dist/SideNav/SideNavItem.js +4 -3
  199. package/dist/Slider/Slider.d.ts.map +1 -1
  200. package/dist/Slider/Slider.js +37 -5
  201. package/dist/Spinner/Spinner.d.ts +3 -3
  202. package/dist/Spinner/Spinner.d.ts.map +1 -1
  203. package/dist/Spinner/Spinner.js +130 -78
  204. package/dist/StatusDot/StatusDot.d.ts.map +1 -1
  205. package/dist/StatusDot/StatusDot.js +6 -1
  206. package/dist/Stepper/Step.d.ts +140 -0
  207. package/dist/Stepper/Step.d.ts.map +1 -0
  208. package/dist/Stepper/Step.js +1045 -0
  209. package/dist/Stepper/StepStatus.d.ts +24 -0
  210. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  211. package/dist/Stepper/StepStatus.js +1 -0
  212. package/dist/Stepper/Stepper.d.ts +93 -0
  213. package/dist/Stepper/Stepper.d.ts.map +1 -0
  214. package/dist/Stepper/Stepper.js +184 -0
  215. package/dist/Stepper/StepperContext.d.ts +41 -0
  216. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  217. package/dist/Stepper/StepperContext.js +34 -0
  218. package/dist/Stepper/index.d.ts +8 -0
  219. package/dist/Stepper/index.d.ts.map +1 -0
  220. package/dist/Stepper/index.js +7 -0
  221. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  222. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  223. package/dist/Stepper/stepper.stylex.js +20 -0
  224. package/dist/Switch/Switch.d.ts.map +1 -1
  225. package/dist/Switch/Switch.js +8 -3
  226. package/dist/TabList/Tab.d.ts +15 -2
  227. package/dist/TabList/Tab.d.ts.map +1 -1
  228. package/dist/TabList/Tab.js +32 -7
  229. package/dist/TabList/TabList.d.ts +46 -7
  230. package/dist/TabList/TabList.d.ts.map +1 -1
  231. package/dist/TabList/TabList.js +353 -23
  232. package/dist/TabList/TabListContext.d.ts +11 -1
  233. package/dist/TabList/TabListContext.d.ts.map +1 -1
  234. package/dist/TabList/TabListContext.js +11 -2
  235. package/dist/TabList/TabMenu.d.ts.map +1 -1
  236. package/dist/TabList/TabMenu.js +3 -2
  237. package/dist/TabList/index.d.ts +2 -2
  238. package/dist/TabList/index.d.ts.map +1 -1
  239. package/dist/Table/BaseTable.d.ts.map +1 -1
  240. package/dist/Table/BaseTable.js +10 -2
  241. package/dist/Table/Table.d.ts.map +1 -1
  242. package/dist/Table/Table.js +3 -6
  243. package/dist/Table/TableRow.d.ts +16 -5
  244. package/dist/Table/TableRow.d.ts.map +1 -1
  245. package/dist/Table/TableRow.js +16 -5
  246. package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
  247. package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
  248. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  249. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
  250. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  251. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  252. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  253. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  254. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  255. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  256. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  257. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  258. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  259. package/dist/Table/plugins/selection/useTableSelection.js +19 -5
  260. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
  261. package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
  262. package/dist/Table/types.d.ts +22 -4
  263. package/dist/Table/types.d.ts.map +1 -1
  264. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  265. package/dist/Table/useBaseTablePlugins.js +5 -0
  266. package/dist/Text/Text.d.ts.map +1 -1
  267. package/dist/Text/Text.js +6 -2
  268. package/dist/TextArea/TextArea.d.ts.map +1 -1
  269. package/dist/TextArea/TextArea.js +9 -3
  270. package/dist/TextInput/TextInput.d.ts.map +1 -1
  271. package/dist/TextInput/TextInput.js +3 -2
  272. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  273. package/dist/TimeInput/TimeInput.js +3 -2
  274. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  275. package/dist/Timestamp/Timestamp.js +5 -3
  276. package/dist/Toast/ToastViewport.d.ts.map +1 -1
  277. package/dist/Toast/ToastViewport.js +27 -8
  278. package/dist/Token/TokenLink.d.ts.map +1 -1
  279. package/dist/Token/TokenLink.js +2 -2
  280. package/dist/Tokenizer/Tokenizer.d.ts +3 -1
  281. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  282. package/dist/Tokenizer/Tokenizer.js +2 -0
  283. package/dist/Tooltip/Tooltip.d.ts +5 -0
  284. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  285. package/dist/Tooltip/useTooltip.d.ts +5 -0
  286. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  287. package/dist/Tooltip/useTooltip.js +39 -24
  288. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  289. package/dist/TopNav/TopNavHeading.js +5 -4
  290. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  291. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  292. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  293. package/dist/TopNav/TopNavMenu.js +4 -3
  294. package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
  295. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  296. package/dist/Typeahead/BaseTypeahead.js +68 -29
  297. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  298. package/dist/Typeahead/Typeahead.js +3 -2
  299. package/dist/astryx.css +98 -7
  300. package/dist/hooks/index.d.ts +1 -0
  301. package/dist/hooks/index.d.ts.map +1 -1
  302. package/dist/hooks/index.js +1 -0
  303. package/dist/hooks/useFocusTrap.d.ts +7 -4
  304. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  305. package/dist/hooks/useFocusTrap.js +60 -95
  306. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  307. package/dist/hooks/useHotkeys.js +3 -18
  308. package/dist/hooks/useMergedRefs.d.ts +18 -0
  309. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  310. package/dist/hooks/useMergedRefs.js +25 -0
  311. package/dist/index.d.ts +1 -0
  312. package/dist/index.d.ts.map +1 -1
  313. package/dist/index.js +1 -0
  314. package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
  315. package/dist/theme/derivedVarRegistry.js +24 -4
  316. package/dist/theme/syntax/tokens.d.ts +1 -1
  317. package/dist/theme/syntax/tokens.d.ts.map +1 -1
  318. package/dist/theme/syntax/tokens.js +5 -2
  319. package/dist/utils/groupItems.d.ts +5 -1
  320. package/dist/utils/groupItems.d.ts.map +1 -1
  321. package/dist/utils/groupItems.js +9 -9
  322. package/dist/utils/index.d.ts +1 -1
  323. package/dist/utils/index.d.ts.map +1 -1
  324. package/dist/utils/isApplePlatform.d.ts +18 -0
  325. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  326. package/dist/utils/isApplePlatform.js +37 -0
  327. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  328. package/dist/utils/sharedResizeObserver.js +10 -1
  329. package/dist/utils/timeParser.d.ts +1 -1
  330. package/dist/utils/timeParser.d.ts.map +1 -1
  331. package/dist/utils/timeParser.js +26 -12
  332. package/locales/en.json +154 -10
  333. package/locales/pseudo.json +108 -0
  334. package/package.json +8 -3
  335. package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
  336. package/src/AlertDialog/AlertDialog.test.tsx +211 -2
  337. package/src/AlertDialog/AlertDialog.tsx +62 -20
  338. package/src/AppShell/AppShell.tsx +3 -2
  339. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  340. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  341. package/src/AspectRatio/AspectRatio.tsx +40 -1
  342. package/src/Avatar/Avatar.doc.mjs +14 -3
  343. package/src/Avatar/Avatar.test.tsx +97 -0
  344. package/src/Avatar/Avatar.tsx +125 -52
  345. package/src/Avatar/index.ts +2 -2
  346. package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
  347. package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
  348. package/src/AvatarGroup/AvatarGroup.tsx +15 -6
  349. package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
  350. package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
  351. package/src/Banner/Banner.doc.mjs +13 -11
  352. package/src/Banner/Banner.test.tsx +102 -15
  353. package/src/Banner/Banner.tsx +72 -25
  354. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  355. package/src/BottomSheet/BottomSheet.tsx +17 -4
  356. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  357. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  358. package/src/Button/Button.doc.mjs +24 -1
  359. package/src/Button/Button.test.tsx +32 -4
  360. package/src/Button/Button.tsx +12 -5
  361. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  362. package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
  363. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  364. package/src/Calendar/Calendar.doc.mjs +4 -3
  365. package/src/Calendar/Calendar.test.tsx +103 -0
  366. package/src/Calendar/Calendar.tsx +19 -16
  367. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  368. package/src/Calendar/getInitialFocusDate.ts +93 -0
  369. package/src/Calendar/styles.ts +49 -31
  370. package/src/Card/Card.doc.mjs +10 -7
  371. package/src/Card/Card.test.tsx +44 -19
  372. package/src/Card/Card.tsx +12 -32
  373. package/src/Carousel/Carousel.tsx +3 -2
  374. package/src/Chat/ChatComposerInput.tsx +5 -1
  375. package/src/Chat/ChatLayout.tsx +3 -2
  376. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  377. package/src/Chat/ChatMessageList.test.tsx +46 -0
  378. package/src/Chat/ChatMessageList.tsx +28 -4
  379. package/src/Chat/ChatTokenizedText.tsx +17 -10
  380. package/src/Chat/useChatComposerTokens.ts +1 -1
  381. package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
  382. package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
  383. package/src/CheckboxInput/CheckboxInput.tsx +8 -2
  384. package/src/ClickableCard/ClickableCard.tsx +3 -2
  385. package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
  386. package/src/CodeBlock/CodeBlock.test.tsx +37 -0
  387. package/src/CodeBlock/CodeBlock.tsx +20 -4
  388. package/src/CodeBlock/highlightRanges.ts +1 -1
  389. package/src/CodeBlock/highlightStyles.ts +13 -13
  390. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  391. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  392. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  393. package/src/ContextMenu/ContextMenu.tsx +4 -3
  394. package/src/DateInput/DateInput.doc.mjs +16 -0
  395. package/src/DateInput/DateInput.tsx +55 -2
  396. package/src/DateInput/DateInputTouch.test.tsx +146 -32
  397. package/src/DateInput/NativeDateField.test.tsx +635 -0
  398. package/src/DateInput/NativeDateField.tsx +641 -0
  399. package/src/DateInput/TouchDateField.tsx +108 -24
  400. package/src/DateInput/index.ts +1 -0
  401. package/src/DateInput/nativeDateSegments.ts +127 -0
  402. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  403. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  404. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  405. package/src/DateTimeInput/index.ts +1 -0
  406. package/src/Dialog/Dialog.doc.mjs +8 -3
  407. package/src/Dialog/Dialog.test.tsx +429 -2
  408. package/src/Dialog/Dialog.tsx +133 -58
  409. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  410. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  411. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  412. package/src/Field/Field.doc.mjs +13 -2
  413. package/src/Field/FieldLabel.test.tsx +29 -0
  414. package/src/Field/FieldLabel.tsx +7 -0
  415. package/src/FileInput/FileInput.tsx +3 -2
  416. package/src/Heading/Heading.test.tsx +23 -1
  417. package/src/Heading/Heading.tsx +6 -2
  418. package/src/HoverCard/HoverCard.doc.mjs +13 -2
  419. package/src/HoverCard/HoverCard.test.tsx +154 -4
  420. package/src/HoverCard/HoverCard.tsx +143 -3
  421. package/src/HoverCard/useHoverCard.tsx +104 -33
  422. package/src/Indicator/CheckboxIndicator.tsx +14 -8
  423. package/src/Indicator/Indicator.doc.mjs +2 -0
  424. package/src/Item/Item.tsx +5 -4
  425. package/src/Kbd/Kbd.tsx +2 -19
  426. package/src/Layer/LayerDepthContext.tsx +62 -0
  427. package/src/Layer/index.ts +9 -0
  428. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  429. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  430. package/src/Layer/layerStack.ts +362 -0
  431. package/src/Layer/useLayer.test.tsx +62 -14
  432. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  433. package/src/Layer/useLayerDismissal.ts +173 -0
  434. package/src/Layout/Layout.doc.mjs +2 -2
  435. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  436. package/src/Lightbox/Lightbox.tsx +124 -102
  437. package/src/Link/Link.doc.mjs +39 -0
  438. package/src/Markdown/Markdown.doc.mjs +5 -0
  439. package/src/Markdown/Markdown.tsx +9 -4
  440. package/src/Markdown/incremental.test.ts +16 -2
  441. package/src/Markdown/index.ts +1 -0
  442. package/src/Markdown/parser.perf.test.ts +96 -1
  443. package/src/Markdown/parser.test.ts +178 -2
  444. package/src/Markdown/parser.ts +253 -32
  445. package/src/MobileNav/MobileNav.tsx +62 -36
  446. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  447. package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
  448. package/src/MultiSelector/MultiSelector.test.tsx +277 -0
  449. package/src/MultiSelector/MultiSelector.tsx +142 -11
  450. package/src/MultiSelector/index.ts +1 -0
  451. package/src/NavIcon/NavIcon.doc.mjs +8 -2
  452. package/src/NavIcon/NavIcon.test.tsx +9 -0
  453. package/src/NavIcon/NavIcon.tsx +5 -1
  454. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  455. package/src/NumberInput/NumberInput.doc.mjs +31 -7
  456. package/src/NumberInput/NumberInput.test.tsx +436 -8
  457. package/src/NumberInput/NumberInput.tsx +62 -114
  458. package/src/NumberInput/numberInputCommit.test.ts +72 -0
  459. package/src/NumberInput/numberInputCommit.ts +103 -0
  460. package/src/NumberInput/numberParser.docblock.test.ts +234 -0
  461. package/src/NumberInput/numberParser.test.ts +222 -0
  462. package/src/NumberInput/numberParser.ts +403 -0
  463. package/src/Outline/Outline.tsx +3 -2
  464. package/src/OverflowList/OverflowList.tsx +3 -2
  465. package/src/Overlay/Overlay.tsx +3 -2
  466. package/src/Pagination/Pagination.test.tsx +3 -2
  467. package/src/Popover/usePopover.tsx +31 -28
  468. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  469. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  470. package/src/PowerSearch/PowerSearch.tsx +34 -5
  471. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
  472. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  473. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
  474. package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
  475. package/src/PowerSearch/types.ts +2 -0
  476. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  477. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  478. package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
  479. package/src/ProgressBar/ProgressBar.test.tsx +24 -0
  480. package/src/ProgressBar/ProgressBar.tsx +28 -8
  481. package/src/Resizable/ResizeHandle.tsx +3 -2
  482. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  483. package/src/SelectableCard/SelectableCard.tsx +3 -2
  484. package/src/Selector/Selector.doc.mjs +26 -1
  485. package/src/Selector/Selector.test.tsx +311 -1
  486. package/src/Selector/Selector.tsx +139 -16
  487. package/src/SideNav/SideNav.doc.mjs +6 -6
  488. package/src/SideNav/SideNav.tsx +4 -2
  489. package/src/SideNav/SideNavHeading.tsx +12 -12
  490. package/src/SideNav/SideNavItem.tsx +4 -2
  491. package/src/Slider/Slider.test.tsx +106 -1
  492. package/src/Slider/Slider.tsx +55 -3
  493. package/src/Spinner/Spinner.test.tsx +147 -1
  494. package/src/Spinner/Spinner.tsx +120 -101
  495. package/src/StatusDot/StatusDot.doc.mjs +8 -2
  496. package/src/StatusDot/StatusDot.test.tsx +9 -0
  497. package/src/StatusDot/StatusDot.tsx +7 -1
  498. package/src/Stepper/Step.doc.mjs +98 -0
  499. package/src/Stepper/Step.tsx +1638 -0
  500. package/src/Stepper/StepStatus.ts +26 -0
  501. package/src/Stepper/Stepper.doc.mjs +370 -0
  502. package/src/Stepper/Stepper.test.tsx +1024 -0
  503. package/src/Stepper/Stepper.tsx +258 -0
  504. package/src/Stepper/StepperContext.ts +71 -0
  505. package/src/Stepper/index.ts +18 -0
  506. package/src/Stepper/stepper.stylex.ts +19 -0
  507. package/src/Switch/Switch.doc.mjs +2 -0
  508. package/src/Switch/Switch.test.tsx +10 -0
  509. package/src/Switch/Switch.tsx +6 -2
  510. package/src/TabList/Tab.doc.mjs +13 -1
  511. package/src/TabList/Tab.tsx +67 -7
  512. package/src/TabList/TabList.doc.mjs +22 -6
  513. package/src/TabList/TabList.test.tsx +559 -0
  514. package/src/TabList/TabList.tsx +490 -22
  515. package/src/TabList/TabListContext.ts +13 -2
  516. package/src/TabList/TabMenu.tsx +3 -2
  517. package/src/TabList/index.ts +6 -2
  518. package/src/Table/BaseTable.tsx +12 -4
  519. package/src/Table/Table.doc.mjs +9 -2
  520. package/src/Table/Table.test.tsx +132 -14
  521. package/src/Table/Table.tsx +3 -8
  522. package/src/Table/TableBody.doc.mjs +40 -0
  523. package/src/Table/TableFooter.doc.mjs +40 -0
  524. package/src/Table/TableHeader.doc.mjs +40 -0
  525. package/src/Table/TableRow.tsx +16 -5
  526. package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
  527. package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
  528. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  529. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  530. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  531. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  532. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  533. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  534. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  535. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  536. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  537. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  538. package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
  539. package/src/Table/types.ts +22 -4
  540. package/src/Table/useBaseTablePlugins.ts +5 -0
  541. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  542. package/src/Table/useTablePagination.doc.mjs +7 -0
  543. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  544. package/src/Table/useTableSelection.doc.mjs +31 -0
  545. package/src/Text/Text.test.tsx +23 -1
  546. package/src/Text/Text.tsx +6 -2
  547. package/src/TextArea/TextArea.doc.mjs +8 -2
  548. package/src/TextArea/TextArea.test.tsx +11 -0
  549. package/src/TextArea/TextArea.tsx +15 -8
  550. package/src/TextInput/TextInput.doc.mjs +10 -0
  551. package/src/TextInput/TextInput.tsx +3 -2
  552. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  553. package/src/TimeInput/TimeInput.tsx +2 -2
  554. package/src/Timestamp/Timestamp.test.tsx +18 -0
  555. package/src/Timestamp/Timestamp.tsx +4 -2
  556. package/src/Toast/Toast.doc.mjs +6 -0
  557. package/src/Toast/ToastViewport.tsx +17 -1
  558. package/src/Token/TokenLink.tsx +2 -2
  559. package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
  560. package/src/Tokenizer/Tokenizer.tsx +4 -0
  561. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  562. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  563. package/src/Tooltip/Tooltip.test.tsx +32 -0
  564. package/src/Tooltip/Tooltip.tsx +5 -0
  565. package/src/Tooltip/useTooltip.tsx +47 -24
  566. package/src/TopNav/TopNavHeading.tsx +5 -4
  567. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  568. package/src/TopNav/TopNavMenu.tsx +4 -3
  569. package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
  570. package/src/Typeahead/BaseTypeahead.tsx +85 -33
  571. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  572. package/src/Typeahead/Typeahead.test.tsx +49 -0
  573. package/src/Typeahead/Typeahead.tsx +3 -2
  574. package/src/hooks/index.ts +2 -0
  575. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  576. package/src/hooks/useFocusTrap.test.tsx +14 -0
  577. package/src/hooks/useFocusTrap.ts +62 -111
  578. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  579. package/src/hooks/useHotkeys.ts +3 -18
  580. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  581. package/src/hooks/useMergedRefs.test.tsx +62 -0
  582. package/src/hooks/useMergedRefs.ts +36 -0
  583. package/src/index.ts +1 -0
  584. package/src/raw-import.d.ts +14 -0
  585. package/src/theme/MediaTheme.doc.mjs +5 -5
  586. package/src/theme/derivedVarRegistry.test.ts +19 -3
  587. package/src/theme/derivedVarRegistry.ts +23 -4
  588. package/src/theme/generateThemeRules.test.ts +37 -0
  589. package/src/theme/syntax/tokens.ts +5 -2
  590. package/src/utils/groupItems.ts +12 -6
  591. package/src/utils/index.ts +1 -1
  592. package/src/utils/isApplePlatform.test.ts +61 -0
  593. package/src/utils/isApplePlatform.ts +37 -0
  594. package/src/utils/sharedResizeObserver.ts +10 -2
  595. package/src/utils/timeParser.test.ts +6 -1
  596. package/src/utils/timeParser.ts +35 -13
  597. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -13,6 +13,16 @@
13
13
  // Types
14
14
  // ---------------------------------------------------------------------------
15
15
 
16
+ /**
17
+ * Where a block sits in the source string handed to `parseMarkdown`:
18
+ * `source.slice(start, end)` is the block, and `end` excludes the block's
19
+ * trailing blank lines.
20
+ *
21
+ * An object rather than a `[start, end]` tuple so a second way of addressing
22
+ * the same block — line numbers, once a consumer needs them — can be added as
23
+ * optional fields without breaking anyone.
24
+ */
25
+
16
26
  // ---------------------------------------------------------------------------
17
27
  // Parse options
18
28
  // ---------------------------------------------------------------------------
@@ -47,7 +57,8 @@ function resolveOptions(arg) {
47
57
  const opts = arg;
48
58
  return {
49
59
  sourceIds: opts.sourceIds,
50
- autolink: opts.autolink
60
+ autolink: opts.autolink,
61
+ sourceRanges: opts.sourceRanges
51
62
  };
52
63
  }
53
64
 
@@ -168,10 +179,17 @@ function extractLinkDefinitions(input) {
168
179
  cleaned: input
169
180
  };
170
181
  }
171
- const cleaned = lines.filter((_, index) => keep[index]).join('\n');
182
+ const lineMap = [];
183
+ for (let index = 0; index < lines.length; index++) {
184
+ if (keep[index]) {
185
+ lineMap.push(index);
186
+ }
187
+ }
188
+ const cleaned = lineMap.map(index => lines[index]).join('\n');
172
189
  return {
173
190
  defs,
174
- cleaned
191
+ cleaned,
192
+ lineMap
175
193
  };
176
194
  }
177
195
 
@@ -250,7 +268,7 @@ function matchReferenceImage(text, start, linkDefs) {
250
268
  const rawLabel = text.slice(altClose + 2, labelClose);
251
269
  const label = rawLabel === '' ? alt : rawLabel;
252
270
  const src = linkDefs.get(normalizeLinkLabel(label));
253
- if (src != null) {
271
+ if (src != null && isSafeUrl(src)) {
254
272
  return {
255
273
  node: {
256
274
  type: 'image',
@@ -267,7 +285,7 @@ function matchReferenceImage(text, start, linkDefs) {
267
285
  return null;
268
286
  }
269
287
  const src = linkDefs.get(normalizeLinkLabel(alt));
270
- if (src == null) {
288
+ if (src == null || !isSafeUrl(src)) {
271
289
  return null;
272
290
  }
273
291
  return {
@@ -965,6 +983,19 @@ function isTableSeparator(line) {
965
983
  return nonEmpty.length > 0 && nonEmpty.every(cell => /^:?-+:?$/.test(cell));
966
984
  }
967
985
 
986
+ /**
987
+ * The same options for content parsed out of an enclosing block. Ranges are a
988
+ * top-level contract: a list item's or a blockquote's children are parsed from
989
+ * text the caller reassembled (markers and `>` prefixes stripped), so an
990
+ * offset into it would not address the document.
991
+ */
992
+ function nested(opts) {
993
+ return opts.sourceRanges ? {
994
+ ...opts,
995
+ sourceRanges: false
996
+ } : opts;
997
+ }
998
+
968
999
  /**
969
1000
  * Returns true when a line could start a new block — used to stop paragraph
970
1001
  * continuation. Every regex here uses bounded or single-class quantifiers
@@ -1095,7 +1126,7 @@ function parseList(lines, startIndex, ordered, opts) {
1095
1126
  }
1096
1127
  items.push({
1097
1128
  checked,
1098
- children: parseMarkdownImpl(itemText, opts)
1129
+ children: parseMarkdownImpl(itemText, nested(opts))
1099
1130
  });
1100
1131
 
1101
1132
  // CommonMark loose list: blank line(s) between items of the same style
@@ -1140,7 +1171,8 @@ function parseMarkdownImpl(input, baseOpts) {
1140
1171
  // parse.
1141
1172
  const {
1142
1173
  defs,
1143
- cleaned
1174
+ cleaned,
1175
+ lineMap
1144
1176
  } = extractLinkDefinitions(input);
1145
1177
  const inherited = baseOpts.linkDefs;
1146
1178
  let linkDefs;
@@ -1157,8 +1189,22 @@ function parseMarkdownImpl(input, baseOpts) {
1157
1189
  } : baseOpts;
1158
1190
  const lines = cleaned.split('\n');
1159
1191
  const blocks = [];
1192
+ // The line each block started on, parallel to `blocks`. Only collected when
1193
+ // ranges were asked for; a block's end is resolved after the loop, since the
1194
+ // branch that produced it has already moved `index` past whatever it read.
1195
+ const blockStartLines = opts.sourceRanges ? [] : null;
1196
+ // Set only by a block that consumes blank lines as content, where the
1197
+ // positional end derivation would trim them away.
1198
+ const blockEndLines = opts.sourceRanges ? [] : null;
1199
+ let blockStartLine = 0;
1200
+ const pushBlock = (node, endLine) => {
1201
+ blocks.push(node);
1202
+ blockStartLines?.push(blockStartLine);
1203
+ blockEndLines?.push(endLine);
1204
+ };
1160
1205
  let index = 0;
1161
1206
  while (index < lines.length) {
1207
+ blockStartLine = index;
1162
1208
  const line = lines[index];
1163
1209
  if (line.trim() === '') {
1164
1210
  index++;
@@ -1177,18 +1223,21 @@ function parseMarkdownImpl(input, baseOpts) {
1177
1223
  index++;
1178
1224
  }
1179
1225
  index++; // skip closing fence
1180
- blocks.push({
1226
+ // A fence owns its blank lines, and an unterminated one (mid-stream)
1227
+ // can end on them, so it states its own end rather than letting the
1228
+ // positional derivation trim them off.
1229
+ pushBlock({
1181
1230
  type: 'codeblock',
1182
1231
  language,
1183
1232
  content: codeLines.join('\n')
1184
- });
1233
+ }, Math.min(index, lines.length) - 1);
1185
1234
  continue;
1186
1235
  }
1187
1236
 
1188
1237
  // --- Heading ---
1189
1238
  const headingMatch = line.match(/^(#{1,6}) +(.*)/);
1190
1239
  if (headingMatch) {
1191
- blocks.push({
1240
+ pushBlock({
1192
1241
  type: 'heading',
1193
1242
  level: headingMatch[1].length,
1194
1243
  children: parseInlineEntry(headingMatch[2], opts)
@@ -1199,7 +1248,7 @@ function parseMarkdownImpl(input, baseOpts) {
1199
1248
 
1200
1249
  // --- HR (must precede list check to handle `- - -`, `* * *`, `_ _ _`) ---
1201
1250
  if (isHorizontalRule(line)) {
1202
- blocks.push({
1251
+ pushBlock({
1203
1252
  type: 'hr'
1204
1253
  });
1205
1254
  index++;
@@ -1207,9 +1256,11 @@ function parseMarkdownImpl(input, baseOpts) {
1207
1256
  }
1208
1257
 
1209
1258
  // --- Standalone image ---
1259
+ // An unsafe src falls through to the paragraph path and renders as
1260
+ // literal text, the same rule the inline image path applies.
1210
1261
  const imageMatch = line.match(/^!\[([^\]]*)\]\(([^)]+)\)/);
1211
- if (imageMatch && line.trim() === imageMatch[0]) {
1212
- blocks.push({
1262
+ if (imageMatch && line.trim() === imageMatch[0] && isSafeUrl(imageMatch[2])) {
1263
+ pushBlock({
1213
1264
  type: 'image',
1214
1265
  alt: imageMatch[1],
1215
1266
  src: imageMatch[2]
@@ -1221,7 +1272,7 @@ function parseMarkdownImpl(input, baseOpts) {
1221
1272
  // --- Table (with or without leading pipe) ---
1222
1273
  if (index + 1 < lines.length && line.includes('|') && isTableSeparator(lines[index + 1])) {
1223
1274
  const tableResult = parseTable(lines, index, opts);
1224
- blocks.push(tableResult.node);
1275
+ pushBlock(tableResult.node);
1225
1276
  index = tableResult.nextIndex;
1226
1277
  continue;
1227
1278
  }
@@ -1233,9 +1284,9 @@ function parseMarkdownImpl(input, baseOpts) {
1233
1284
  quoteLines.push(lines[index].replace(/^> ?/, ''));
1234
1285
  index++;
1235
1286
  }
1236
- blocks.push({
1287
+ pushBlock({
1237
1288
  type: 'blockquote',
1238
- children: parseMarkdownImpl(quoteLines.join('\n'), opts)
1289
+ children: parseMarkdownImpl(quoteLines.join('\n'), nested(opts))
1239
1290
  });
1240
1291
  continue;
1241
1292
  }
@@ -1243,7 +1294,7 @@ function parseMarkdownImpl(input, baseOpts) {
1243
1294
  // --- Unordered list ---
1244
1295
  if (/^ {0,9}[-*+] /.test(line)) {
1245
1296
  const listResult = parseList(lines, index, false, opts);
1246
- blocks.push(listResult.node);
1297
+ pushBlock(listResult.node);
1247
1298
  index = listResult.nextIndex;
1248
1299
  continue;
1249
1300
  }
@@ -1251,7 +1302,7 @@ function parseMarkdownImpl(input, baseOpts) {
1251
1302
  // --- Ordered list ---
1252
1303
  if (/^ {0,9}\d+[.)] /.test(line)) {
1253
1304
  const listResult = parseList(lines, index, true, opts);
1254
- blocks.push(listResult.node);
1305
+ pushBlock(listResult.node);
1255
1306
  index = listResult.nextIndex;
1256
1307
  continue;
1257
1308
  }
@@ -1263,14 +1314,63 @@ function parseMarkdownImpl(input, baseOpts) {
1263
1314
  paraLines.push(lines[index]);
1264
1315
  index++;
1265
1316
  }
1266
- blocks.push({
1317
+ pushBlock({
1267
1318
  type: 'paragraph',
1268
1319
  children: parseInlineEntry(paraLines.join('\n'), opts)
1269
1320
  });
1270
1321
  }
1322
+ if (blockStartLines != null) {
1323
+ stampSourceRanges(blocks, blockStartLines, blockEndLines ?? [], lines, lineMap, input, opts);
1324
+ }
1271
1325
  return blocks;
1272
1326
  }
1273
1327
 
1328
+ /**
1329
+ * Give each block the offsets it occupies in the original input.
1330
+ *
1331
+ * Blocks are contiguous and in source order, so a block runs from its own
1332
+ * first line to the line before the next block starts, minus the blank lines
1333
+ * between them. Offsets are computed against the *input*, not the text the
1334
+ * block loop saw: link reference definitions are stripped before parsing, and
1335
+ * `lineMap` says which input line each surviving line came from.
1336
+ */
1337
+ function stampSourceRanges(blocks, blockStartLines, blockEndLines, lines, lineMap, input, opts) {
1338
+ const base = opts.baseOffset ?? 0;
1339
+ // Offset of the first character of every line of the input.
1340
+ const inputLineStarts = [0];
1341
+ for (let i = 0; i < input.length; i++) {
1342
+ if (input[i] === '\n') {
1343
+ inputLineStarts.push(i + 1);
1344
+ }
1345
+ }
1346
+ // Stripping removes whole lines and never edits one, so a parsed line's
1347
+ // length is its input line's length.
1348
+ const lineStart = line => base + inputLineStarts[lineMap != null ? lineMap[line] : line];
1349
+ for (let i = 0; i < blocks.length; i++) {
1350
+ const startLine = blockStartLines[i];
1351
+ let endLine = blockEndLines[i];
1352
+ if (endLine == null) {
1353
+ const nextStart = i + 1 < blocks.length ? blockStartLines[i + 1] : lines.length;
1354
+ endLine = nextStart - 1;
1355
+ while (endLine > startLine && lines[endLine].trim() === '') {
1356
+ endLine--;
1357
+ }
1358
+ }
1359
+ // Exactly the block's own lines, verbatim — a CRLF document's trailing
1360
+ // `\r` included, since the parser reads it as part of the line too and a
1361
+ // range that dropped it would slice to something that re-parses
1362
+ // differently.
1363
+ const end = lineStart(endLine) + lines[endLine].length;
1364
+ blocks[i] = {
1365
+ ...blocks[i],
1366
+ range: {
1367
+ start: lineStart(startLine),
1368
+ end
1369
+ }
1370
+ };
1371
+ }
1372
+ }
1373
+
1274
1374
  // ---------------------------------------------------------------------------
1275
1375
  // Incremental parsing
1276
1376
  // ---------------------------------------------------------------------------
@@ -1286,12 +1386,23 @@ export function createIncrementalState() {
1286
1386
 
1287
1387
  /**
1288
1388
  * Find the line-index of the last blank line that is NOT inside a fenced code
1289
- * block. Returns -1 when nothing is settled (unclosed fence or no blank line).
1389
+ * block, and report whether a fence is still open at the end of the input.
1390
+ * Returns -1 when nothing is settled.
1391
+ *
1392
+ * This index must never move backwards as more of the document arrives. The
1393
+ * caller's cache is keyed on the settled text staying a prefix of what it was,
1394
+ * so a boundary that retracts by one line costs a re-parse of every block in
1395
+ * the document. Two things used to retract it: a blank last line, which is
1396
+ * just the newline the stream has written so far and stops being blank as soon
1397
+ * as the next chunk appends to it; and an open fence, which used to collapse
1398
+ * the boundary to -1 even though the content before the fence opened cannot be
1399
+ * changed by anything typed inside it.
1290
1400
  */
1291
1401
  function findSettledBoundary(lines) {
1292
1402
  let inFence = false;
1293
1403
  let fenceMarker = '';
1294
1404
  let lastBoundary = -1;
1405
+ let boundaryBeforeFence = -1;
1295
1406
  for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
1296
1407
  const line = lines[lineIndex];
1297
1408
 
@@ -1301,16 +1412,20 @@ function findSettledBoundary(lines) {
1301
1412
  if (!inFence) {
1302
1413
  inFence = true;
1303
1414
  fenceMarker = fenceMatch[1];
1415
+ boundaryBeforeFence = lastBoundary;
1304
1416
  } else if (fenceMatch[1].startsWith(fenceMarker[0]) && fenceMatch[1].length >= fenceMarker.length) {
1305
1417
  inFence = false;
1306
1418
  fenceMarker = '';
1307
1419
  }
1308
1420
  }
1309
- if (!inFence && line.trim() === '' && lineIndex > 0) {
1421
+ if (!inFence && line.trim() === '' && lineIndex > 0 && lineIndex < lines.length - 1) {
1310
1422
  lastBoundary = lineIndex;
1311
1423
  }
1312
1424
  }
1313
- return inFence ? -1 : lastBoundary;
1425
+ return {
1426
+ boundary: inFence ? boundaryBeforeFence : lastBoundary,
1427
+ openFence: inFence
1428
+ };
1314
1429
  }
1315
1430
 
1316
1431
  /**
@@ -1532,6 +1647,18 @@ function trimUnsettledStructural(text) {
1532
1647
  return lines.join('\n');
1533
1648
  }
1534
1649
 
1650
+ /**
1651
+ * The same options, for parsing a slice that starts at `offset` of the
1652
+ * document — so the slice's blocks report ranges into the whole document
1653
+ * rather than into the slice.
1654
+ */
1655
+ function atOffset(opts, offset) {
1656
+ return opts.sourceRanges ? {
1657
+ ...opts,
1658
+ baseOffset: offset
1659
+ } : opts;
1660
+ }
1661
+
1535
1662
  /**
1536
1663
  * Concatenate freshly-parsed delta blocks with previously-settled blocks,
1537
1664
  * merging adjacent same-style lists into a single loose list. The boundary
@@ -1552,7 +1679,15 @@ function mergeSettledBlocks(prev, delta) {
1552
1679
  start: prevLast.start,
1553
1680
  delimiter: prevLast.delimiter,
1554
1681
  loose: true,
1555
- items: [...prevLast.items, ...deltaFirst.items]
1682
+ items: [...prevLast.items, ...deltaFirst.items],
1683
+ // One list now, so one range: from where the first half started to
1684
+ // where the second half ended.
1685
+ ...(prevLast.range != null && deltaFirst.range != null ? {
1686
+ range: {
1687
+ start: prevLast.range.start,
1688
+ end: deltaFirst.range.end
1689
+ }
1690
+ } : null)
1556
1691
  };
1557
1692
  return [...prev.slice(0, -1), merged, ...delta.slice(1)];
1558
1693
  }
@@ -1560,15 +1695,16 @@ function mergeSettledBlocks(prev, delta) {
1560
1695
  }
1561
1696
  export function parseMarkdownIncremental(input, state, arg) {
1562
1697
  const opts = resolveOptions(arg);
1563
- // Invalidate cache when the autolink option flips — cached settled blocks
1564
- // were parsed with the previous setting and would otherwise be reused
1565
- // unchanged.
1566
- if (state.autolink !== opts.autolink) {
1698
+ // Invalidate cache when the autolink or sourceRanges option flips — cached
1699
+ // settled blocks were parsed with the previous setting and would otherwise
1700
+ // be reused unchanged.
1701
+ if (state.autolink !== opts.autolink || Boolean(state.sourceRanges) !== Boolean(opts.sourceRanges)) {
1567
1702
  state.prevInput = '';
1568
1703
  state.settledText = '';
1569
1704
  state.settledBlocks = [];
1570
1705
  state.settledUpTo = 0;
1571
1706
  state.autolink = opts.autolink;
1707
+ state.sourceRanges = opts.sourceRanges;
1572
1708
  }
1573
1709
  if (input === '') {
1574
1710
  state.prevInput = '';
@@ -1599,15 +1735,22 @@ export function parseMarkdownIncremental(input, state, arg) {
1599
1735
  linkDefs
1600
1736
  } : opts;
1601
1737
  const lines = input.split('\n');
1602
- const boundary = findSettledBoundary(lines);
1738
+ const {
1739
+ boundary,
1740
+ openFence
1741
+ } = findSettledBoundary(lines);
1603
1742
  if (boundary < 0) {
1604
- // Inside an unclosed fence or no blank-line boundary — full re-parse
1743
+ // Nothing settled yet — no blank line, or a fence opened before the first
1744
+ // one — so there is no prefix to keep and the whole input is re-parsed.
1605
1745
  state.prevInput = input;
1606
1746
  return parseMarkdownImpl(input, parseOpts);
1607
1747
  }
1608
1748
  const settledText = lines.slice(0, boundary).join('\n');
1609
1749
  const unsettledRaw = lines.slice(boundary).join('\n').trim();
1610
- const unsettledText = trimUnsettledStructural(unsettledRaw);
1750
+ // Structural trimming holds back lines that look like an incomplete list or
1751
+ // table, which inside a fence is ordinary code: a TypeScript union or a `- `
1752
+ // would disappear from the code block as it streams.
1753
+ const unsettledText = openFence ? unsettledRaw : trimUnsettledStructural(unsettledRaw);
1611
1754
  let settledBlocks;
1612
1755
  if (settledText === state.settledText) {
1613
1756
  // Settled portion unchanged — reuse cached blocks
@@ -1615,13 +1758,20 @@ export function parseMarkdownIncremental(input, state, arg) {
1615
1758
  } else if (state.settledText.length > 0 && settledText.startsWith(state.settledText)) {
1616
1759
  // Settled portion grew — parse only the new delta
1617
1760
  const delta = settledText.slice(state.settledText.length);
1618
- const deltaBlocks = parseMarkdownImpl(delta, parseOpts);
1761
+ const deltaBlocks = parseMarkdownImpl(delta, atOffset(parseOpts, state.settledText.length));
1619
1762
  settledBlocks = mergeSettledBlocks(state.settledBlocks, deltaBlocks);
1620
1763
  } else {
1621
1764
  // Content before the boundary changed — full re-parse of settled portion
1622
1765
  settledBlocks = parseMarkdownImpl(settledText, parseOpts);
1623
1766
  }
1624
- const unsettledBlocks = unsettledText ? parseMarkdownImpl(unsettledText, parseOpts) : [];
1767
+
1768
+ // The unsettled tail is trimmed before parsing, so its offset in the
1769
+ // document is where that trimmed text actually starts — not the boundary,
1770
+ // which is a line index. If it somehow can't be located, parse it without
1771
+ // ranges rather than report wrong ones. Only worth searching for when
1772
+ // ranges were asked for: this runs on every streamed chunk.
1773
+ const unsettledStart = unsettledText && opts.sourceRanges ? input.indexOf(unsettledText, settledText.length) : -1;
1774
+ const unsettledBlocks = unsettledText ? parseMarkdownImpl(unsettledText, unsettledStart >= 0 ? atOffset(parseOpts, unsettledStart) : nested(parseOpts)) : [];
1625
1775
  state.settledText = settledText;
1626
1776
  state.settledBlocks = settledBlocks;
1627
1777
  state.settledUpTo = boundary;
@@ -15,10 +15,15 @@
15
15
  * - `::backdrop` pseudo-element
16
16
  * - Body scroll lock
17
17
  * - Focus trapping
18
- * - Escape key handling via `cancel` event
18
+ *
19
+ * Escape is owned by the shared dismissal stack (`useLayerDismissal`), so a
20
+ * drawer opened over another layer takes the press and nothing behind it
21
+ * closes. The native `cancel` event still handles the dismissals the browser
22
+ * starts itself, such as the Android back gesture.
19
23
  *
20
24
  * SYNC: When modified, update these files to stay in sync:
21
25
  * - /packages/core/src/MobileNav/index.ts (exports if types change)
26
+ * - /packages/core/src/Layer/useLayerDismissal.ts (dismissal stack)
22
27
  * - /packages/core/src/hooks/scrollbarGutter.ts (shared scroll-lock gutter)
23
28
  * - /packages/cli/assets/templates/blocks/components/MobileNav/ (showcase blocks)
24
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MobileNav.d.ts","sourceRoot":"","sources":["../../src/MobileNav/MobileNav.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAmBf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA6L5C;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBpE;AAmCD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC9D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EACR,MAAM,EACN,KAAW,EACX,IAAa,EACb,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAiNhB;yBAhOe,SAAS"}
1
+ {"version":3,"file":"MobileNav.d.ts","sourceRoot":"","sources":["../../src/MobileNav/MobileNav.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAqBf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AA8L5C;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBpE;AAmCD,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;IAC9D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACnC;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IAEhC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,SAAS,CAAC,EACxB,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,gBAAgB,EAC9B,QAAQ,EACR,MAAM,EACN,KAAW,EACX,IAAa,EACb,KAAK,EACL,aAAa,EAAE,MAAM,EACrB,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EAAE,WAAW,EACpB,GAAG,EACH,GAAG,IAAI,EACR,EAAE,cAAc,+BAmOhB;yBAlPe,SAAS"}
@@ -19,10 +19,15 @@
19
19
  * - `::backdrop` pseudo-element
20
20
  * - Body scroll lock
21
21
  * - Focus trapping
22
- * - Escape key handling via `cancel` event
22
+ *
23
+ * Escape is owned by the shared dismissal stack (`useLayerDismissal`), so a
24
+ * drawer opened over another layer takes the press and nothing behind it
25
+ * closes. The native `cancel` event still handles the dismissals the browser
26
+ * starts itself, such as the Android back gesture.
23
27
  *
24
28
  * SYNC: When modified, update these files to stay in sync:
25
29
  * - /packages/core/src/MobileNav/index.ts (exports if types change)
30
+ * - /packages/core/src/Layer/useLayerDismissal.ts (dismissal stack)
26
31
  * - /packages/core/src/hooks/scrollbarGutter.ts (shared scroll-lock gutter)
27
32
  * - /packages/cli/assets/templates/blocks/components/MobileNav/ (showcase blocks)
28
33
  */
@@ -35,11 +40,13 @@ import { Icon } from "../Icon/index.js";
35
40
  import { Heading } from "../Heading/Heading.js";
36
41
  import { useAppShellMobile } from "../AppShell/AppShellMobileContext.js";
37
42
  import { holdScrollbarGutter } from "../hooks/scrollbarGutter.js";
38
- import { mergeProps, mergeRefs, composeEventHandlers } from "../utils/index.js";
43
+ import { mergeProps, composeEventHandlers } from "../utils/index.js";
39
44
  import { overlayPaddingReset } from "../Layout/padding.stylex.js";
45
+ import { LayerDepthProvider } from "../Layer/LayerDepthContext.js";
46
+ import { useLayerDismissal } from "../Layer/useLayerDismissal.js";
40
47
  import { themeProps } from "../utils/themeProps.js";
41
48
  import { useTranslator } from "../i18n/index.js";
42
-
49
+ import { useMergedRefs } from "../hooks/useMergedRefs.js";
43
50
  // =============================================================================
44
51
  // Styles
45
52
  // =============================================================================
@@ -352,12 +359,28 @@ export function MobileNav({
352
359
  }
353
360
  };
354
361
  }, []);
362
+ const {
363
+ shouldDismissOnCloseRequest
364
+ } = useLayerDismissal({
365
+ isActive: isOpen,
366
+ onDismiss: () => onOpenChange(false)
367
+ });
355
368
 
356
- // Handle native cancel event (Escape key) — prevent default and route through onOpenChange
369
+ // The native `cancel` event is the browser's own close-watcher firing: an
370
+ // Android back gesture, or a close request the stack never saw a press for.
371
+ // Escape presses the stack owns never arrive here — it preventDefault()s
372
+ // those, which suppresses the close watcher.
373
+ //
374
+ // Always preventDefault so the browser cannot close a controlled <dialog>
375
+ // behind React's back, then answer with the stack's own rules: top-most
376
+ // only, and never while an IME composition is in progress.
357
377
  const handleCancel = useCallback(event => {
358
378
  event.preventDefault();
379
+ if (!shouldDismissOnCloseRequest()) {
380
+ return;
381
+ }
359
382
  onOpenChange(false);
360
- }, [onOpenChange]);
383
+ }, [onOpenChange, shouldDismissOnCloseRequest]);
361
384
 
362
385
  // Handle clicks on the dialog backdrop area (outside the drawer)
363
386
  const handleDialogClick = useCallback(event => {
@@ -369,7 +392,7 @@ export function MobileNav({
369
392
  }, [onOpenChange]);
370
393
  const isStart = resolvedSide === 'start';
371
394
  return /*#__PURE__*/_jsx("dialog", {
372
- ref: mergeRefs(ref, dialogRef),
395
+ ref: useMergedRefs(ref, dialogRef),
373
396
  id: dialogId,
374
397
  ...mergeProps(themeProps('mobile-nav', {
375
398
  side: resolvedSide
@@ -379,38 +402,40 @@ export function MobileNav({
379
402
  "aria-label": label ?? (typeof header === 'string' ? header : t('@astryx.mobileNav.navigation')),
380
403
  onClick: composeEventHandlers(onClickProp, handleDialogClick),
381
404
  onCancel: handleCancel,
382
- children: /*#__PURE__*/_jsxs("div", {
383
- tabIndex: -1,
384
- ...stylex.props(styles.drawer, dynamicStyles.width(width), isStart && styles.drawerStart, isStart && isOpen && styles.drawerStartOpen, !isStart && styles.drawerEnd, !isStart && isOpen && styles.drawerEndOpen),
385
- children: [/*#__PURE__*/_jsxs("div", {
386
- ...{
387
- 0: {
388
- className: "x78zum5 x6s0dn4 x1qughib x1k15mir xf314gf x2lah0s x92x3c3 x1q0q8m5 xw8gpjh"
405
+ children: /*#__PURE__*/_jsx(LayerDepthProvider, {
406
+ children: /*#__PURE__*/_jsxs("div", {
407
+ tabIndex: -1,
408
+ ...stylex.props(styles.drawer, dynamicStyles.width(width), isStart && styles.drawerStart, isStart && isOpen && styles.drawerStartOpen, !isStart && styles.drawerEnd, !isStart && isOpen && styles.drawerEndOpen),
409
+ children: [/*#__PURE__*/_jsxs("div", {
410
+ ...{
411
+ 0: {
412
+ className: "x78zum5 x6s0dn4 x1qughib x1k15mir xf314gf x2lah0s x92x3c3 x1q0q8m5 xw8gpjh"
413
+ },
414
+ 1: {
415
+ className: "x78zum5 x6s0dn4 x1k15mir xf314gf x2lah0s x92x3c3 x1q0q8m5 xw8gpjh x13a6bvl"
416
+ }
417
+ }[!!!header << 0],
418
+ children: [typeof header === 'string' ? /*#__PURE__*/_jsx(Heading, {
419
+ level: 2,
420
+ xstyle: styles.headerText,
421
+ children: header
422
+ }) : header ?? null, /*#__PURE__*/_jsx(Button, {
423
+ variant: "ghost",
424
+ label: t('@astryx.mobileNav.closeNavigation'),
425
+ icon: /*#__PURE__*/_jsx(Icon, {
426
+ icon: "close",
427
+ color: "inherit"
428
+ }),
429
+ onClick: () => onOpenChange(false),
430
+ isIconOnly: true
431
+ })]
432
+ }), /*#__PURE__*/_jsx("div", {
433
+ ...{
434
+ className: "x98rzlu x1odjw0f x6ikm8r xish69e xx69xxh xf314gf xce4md1"
389
435
  },
390
- 1: {
391
- className: "x78zum5 x6s0dn4 x1k15mir xf314gf x2lah0s x92x3c3 x1q0q8m5 xw8gpjh x13a6bvl"
392
- }
393
- }[!!!header << 0],
394
- children: [typeof header === 'string' ? /*#__PURE__*/_jsx(Heading, {
395
- level: 2,
396
- xstyle: styles.headerText,
397
- children: header
398
- }) : header ?? null, /*#__PURE__*/_jsx(Button, {
399
- variant: "ghost",
400
- label: t('@astryx.mobileNav.closeNavigation'),
401
- icon: /*#__PURE__*/_jsx(Icon, {
402
- icon: "close",
403
- color: "inherit"
404
- }),
405
- onClick: () => onOpenChange(false),
406
- isIconOnly: true
436
+ children: children
407
437
  })]
408
- }), /*#__PURE__*/_jsx("div", {
409
- ...{
410
- className: "x98rzlu x1odjw0f x6ikm8r xish69e xx69xxh xf314gf xce4md1"
411
- },
412
- children: children
413
- })]
438
+ })
414
439
  })
415
440
  });
416
441
  }
@@ -22,6 +22,10 @@ export type MultiSelectorSize = 'sm' | 'md' | 'lg';
22
22
  export type MultiSelectorVariant = 'input' | 'ghost';
23
23
  export type MultiSelectorStatusType = 'warning' | 'error' | 'success';
24
24
  export type { MultiSelectorStatus };
25
+ export interface MultiSelectorSelectedItem {
26
+ value: string;
27
+ label: string;
28
+ }
25
29
  export interface MultiSelectorProps<T extends MultiSelectorOptionType = MultiSelectorOptionType> extends Omit<BaseProps, 'onChange' | 'defaultValue'> {
26
30
  /**
27
31
  * Label text for the multi-selector (always rendered for accessibility).
@@ -171,6 +175,23 @@ export interface MultiSelectorProps<T extends MultiSelectorOptionType = MultiSel
171
175
  * @default 'Search...'
172
176
  */
173
177
  searchPlaceholder?: string;
178
+ /**
179
+ * Content shown in the panel when there are no options to show, and
180
+ * announced in a polite live region when the panel opens. Not shown while
181
+ * `isLoading` — the options have not arrived yet.
182
+ * @default 'No options'
183
+ */
184
+ emptyText?: ReactNode;
185
+ /**
186
+ * Content shown in the panel when a search query matches no options, and
187
+ * announced in a polite live region at the same time.
188
+ *
189
+ * The panel message is `role="presentation"`, so the live region is the only
190
+ * route to assistive tech: a string is announced verbatim, a richer node
191
+ * falls back to the default text since it cannot be spoken.
192
+ * @default 'No results found'
193
+ */
194
+ emptySearchText?: ReactNode;
174
195
  /**
175
196
  * How to display selected items in the trigger.
176
197
  * - 'count': "3 selected"
@@ -179,6 +200,16 @@ export interface MultiSelectorProps<T extends MultiSelectorOptionType = MultiSel
179
200
  * @default 'count'
180
201
  */
181
202
  triggerDisplay?: 'count' | 'labels' | 'badges';
203
+ /**
204
+ * Formats the trigger text when triggerDisplay is 'count' or 'labels'.
205
+ * Receives the selected items (value plus resolved label, in selection
206
+ * order) and returns the full trigger text; the count is `items.length`.
207
+ * Not called when nothing is selected — the placeholder shows instead — and
208
+ * not called for triggerDisplay 'badges', which renders Badge elements
209
+ * rather than text.
210
+ * @default items => `${items.length} selected` for 'count', "A, B, C, +N" for 'labels'
211
+ */
212
+ formatValue?: (items: MultiSelectorSelectedItem[]) => string;
182
213
  /**
183
214
  * Maximum number of badges to show before showing "+N".
184
215
  * Only used when triggerDisplay is 'badges'.
@@ -222,7 +253,7 @@ export interface MultiSelectorProps<T extends MultiSelectorOptionType = MultiSel
222
253
  * />
223
254
  * ```
224
255
  */
225
- export declare function MultiSelector<T extends MultiSelectorOptionType>({ label, isLabelHidden, description, isOptional, isRequired, isDisabled, disabledMessage, options, value, onChange, changeAction, isLoading, placeholder: placeholderFromProps, size: sizeProp, variant, status, statusVariant, labelTooltip, startIcon, hasClear, hasSelectAll, selectAllLabel: selectAllLabelFromProps, hasSearch, searchPlaceholder: searchPlaceholderFromProps, triggerDisplay, maxBadges, renderOption, indicatorPosition, isDefaultOpen, 'data-testid': testId, htmlName, width, xstyle, className, style, }: MultiSelectorProps<T>): React.JSX.Element;
256
+ export declare function MultiSelector<T extends MultiSelectorOptionType>({ label, isLabelHidden, description, isOptional, isRequired, isDisabled, disabledMessage, options, value, onChange, changeAction, isLoading, placeholder: placeholderFromProps, size: sizeProp, variant, status, statusVariant, labelTooltip, startIcon, hasClear, hasSelectAll, selectAllLabel: selectAllLabelFromProps, hasSearch, searchPlaceholder: searchPlaceholderFromProps, emptyText: emptyTextFromProps, emptySearchText: emptySearchTextFromProps, triggerDisplay, formatValue, maxBadges, renderOption, indicatorPosition, isDefaultOpen, 'data-testid': testId, htmlName, width, xstyle, className, style, }: MultiSelectorProps<T>): React.JSX.Element;
226
257
  export declare namespace MultiSelector {
227
258
  var displayName: string;
228
259
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MultiSelector.d.ts","sourceRoot":"","sources":["../../src/MultiSelector/MultiSelector.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultiSelector.d.ts","sourceRoot":"","sources":["../../src/MultiSelector/MultiSelector.tsx"],"names":[],"mappings":"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"}