@astryxdesign/core 0.4.7 → 0.5.0-canary.07f6c33

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 (464) hide show
  1. package/CHANGELOG.md +161 -1
  2. package/dist/AppShell/AppShell.d.ts.map +1 -1
  3. package/dist/AppShell/AppShell.js +3 -2
  4. package/dist/AspectRatio/AspectRatio.d.ts +24 -0
  5. package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
  6. package/dist/AspectRatio/AspectRatio.js +23 -4
  7. package/dist/Avatar/Avatar.d.ts.map +1 -1
  8. package/dist/Avatar/Avatar.js +15 -10
  9. package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
  10. package/dist/AvatarGroup/AvatarGroup.js +3 -2
  11. package/dist/Banner/Banner.d.ts +40 -15
  12. package/dist/Banner/Banner.d.ts.map +1 -1
  13. package/dist/Banner/Banner.js +51 -18
  14. package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
  15. package/dist/BottomSheet/BottomSheet.js +17 -4
  16. package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
  17. package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
  18. package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
  19. package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
  20. package/dist/Button/Button.d.ts.map +1 -1
  21. package/dist/Button/Button.js +5 -4
  22. package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
  23. package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
  24. package/dist/ButtonGroup/ButtonGroup.js +26 -7
  25. package/dist/Calendar/Calendar.d.ts +3 -1
  26. package/dist/Calendar/Calendar.d.ts.map +1 -1
  27. package/dist/Calendar/Calendar.js +13 -14
  28. package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
  29. package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
  30. package/dist/Calendar/getInitialFocusDate.js +62 -0
  31. package/dist/Carousel/Carousel.d.ts.map +1 -1
  32. package/dist/Carousel/Carousel.js +3 -3
  33. package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
  34. package/dist/Chat/ChatComposerInput.js +2 -3
  35. package/dist/Chat/ChatLayout.d.ts.map +1 -1
  36. package/dist/Chat/ChatLayout.js +3 -3
  37. package/dist/Chat/ChatMessageList.d.ts +22 -3
  38. package/dist/Chat/ChatMessageList.d.ts.map +1 -1
  39. package/dist/Chat/ChatMessageList.js +6 -3
  40. package/dist/Chat/ChatTokenizedText.d.ts +2 -0
  41. package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
  42. package/dist/Chat/ChatTokenizedText.js +11 -6
  43. package/dist/Chat/useChatComposerTokens.js +1 -1
  44. package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  45. package/dist/CheckboxInput/CheckboxInput.js +3 -2
  46. package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
  47. package/dist/ClickableCard/ClickableCard.js +3 -3
  48. package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
  49. package/dist/CommandPalette/CommandPaletteInput.js +3 -2
  50. package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
  51. package/dist/CommandPalette/CommandPaletteItem.js +3 -2
  52. package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
  53. package/dist/ContextMenu/ContextMenu.js +4 -3
  54. package/dist/DateInput/DateInput.d.ts.map +1 -1
  55. package/dist/DateInput/DateInput.js +3 -2
  56. package/dist/DateInput/TouchDateField.d.ts.map +1 -1
  57. package/dist/DateInput/TouchDateField.js +38 -4
  58. package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
  59. package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
  60. package/dist/DateTimeInput/DateTimeInput.js +406 -12
  61. package/dist/DateTimeInput/index.d.ts +1 -1
  62. package/dist/DateTimeInput/index.d.ts.map +1 -1
  63. package/dist/Dialog/Dialog.d.ts +7 -1
  64. package/dist/Dialog/Dialog.d.ts.map +1 -1
  65. package/dist/Dialog/Dialog.js +89 -58
  66. package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
  67. package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
  68. package/dist/FileInput/FileInput.d.ts.map +1 -1
  69. package/dist/FileInput/FileInput.js +3 -2
  70. package/dist/Heading/Heading.d.ts.map +1 -1
  71. package/dist/Heading/Heading.js +6 -2
  72. package/dist/HoverCard/HoverCard.d.ts +6 -0
  73. package/dist/HoverCard/HoverCard.d.ts.map +1 -1
  74. package/dist/HoverCard/useHoverCard.d.ts +5 -0
  75. package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
  76. package/dist/HoverCard/useHoverCard.js +67 -25
  77. package/dist/Item/Item.d.ts.map +1 -1
  78. package/dist/Item/Item.js +4 -2
  79. package/dist/Kbd/Kbd.d.ts.map +1 -1
  80. package/dist/Kbd/Kbd.js +10 -3
  81. package/dist/Layer/LayerDepthContext.d.ts +52 -0
  82. package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
  83. package/dist/Layer/LayerDepthContext.js +66 -0
  84. package/dist/Layer/index.d.ts +3 -0
  85. package/dist/Layer/index.d.ts.map +1 -1
  86. package/dist/Layer/index.js +4 -0
  87. package/dist/Layer/layerStack.d.ts +98 -0
  88. package/dist/Layer/layerStack.d.ts.map +1 -0
  89. package/dist/Layer/layerStack.js +306 -0
  90. package/dist/Layer/useLayerDismissal.d.ts +93 -0
  91. package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
  92. package/dist/Layer/useLayerDismissal.js +91 -0
  93. package/dist/Lightbox/Lightbox.d.ts +1 -0
  94. package/dist/Lightbox/Lightbox.d.ts.map +1 -1
  95. package/dist/Lightbox/Lightbox.js +103 -81
  96. package/dist/Markdown/index.d.ts +1 -1
  97. package/dist/Markdown/index.d.ts.map +1 -1
  98. package/dist/Markdown/parser.d.ts +38 -1
  99. package/dist/Markdown/parser.d.ts.map +1 -1
  100. package/dist/Markdown/parser.js +177 -29
  101. package/dist/MobileNav/MobileNav.d.ts +6 -1
  102. package/dist/MobileNav/MobileNav.d.ts.map +1 -1
  103. package/dist/MobileNav/MobileNav.js +61 -36
  104. package/dist/MultiSelector/MultiSelector.d.ts +15 -1
  105. package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
  106. package/dist/MultiSelector/MultiSelector.js +17 -6
  107. package/dist/MultiSelector/index.d.ts +1 -1
  108. package/dist/MultiSelector/index.d.ts.map +1 -1
  109. package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
  110. package/dist/NavMenu/NavHeadingMenu.js +3 -2
  111. package/dist/Outline/Outline.d.ts.map +1 -1
  112. package/dist/Outline/Outline.js +3 -2
  113. package/dist/OverflowList/OverflowList.d.ts.map +1 -1
  114. package/dist/OverflowList/OverflowList.js +3 -2
  115. package/dist/Overlay/Overlay.d.ts.map +1 -1
  116. package/dist/Overlay/Overlay.js +3 -2
  117. package/dist/Popover/usePopover.d.ts.map +1 -1
  118. package/dist/Popover/usePopover.js +20 -17
  119. package/dist/PowerSearch/PowerSearch.d.ts +8 -2
  120. package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
  121. package/dist/PowerSearch/PowerSearch.js +19 -6
  122. package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
  123. package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
  124. package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
  125. package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
  126. package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
  127. package/dist/PowerSearch/PowerSearchValueEditor.js +19 -9
  128. package/dist/PowerSearch/types.d.ts +2 -0
  129. package/dist/PowerSearch/types.d.ts.map +1 -1
  130. package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
  131. package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
  132. package/dist/PowerSearch/usePowerSearchSource.js +14 -5
  133. package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
  134. package/dist/Resizable/ResizeHandle.js +3 -2
  135. package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  136. package/dist/SegmentedControl/SegmentedControl.js +3 -2
  137. package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
  138. package/dist/SelectableCard/SelectableCard.js +3 -3
  139. package/dist/Selector/Selector.d.ts.map +1 -1
  140. package/dist/Selector/Selector.js +5 -0
  141. package/dist/SideNav/SideNav.d.ts.map +1 -1
  142. package/dist/SideNav/SideNav.js +4 -3
  143. package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
  144. package/dist/SideNav/SideNavHeading.js +6 -5
  145. package/dist/SideNav/SideNavItem.d.ts.map +1 -1
  146. package/dist/SideNav/SideNavItem.js +4 -3
  147. package/dist/Slider/Slider.d.ts.map +1 -1
  148. package/dist/Slider/Slider.js +3 -3
  149. package/dist/Spinner/Spinner.d.ts +3 -3
  150. package/dist/Spinner/Spinner.d.ts.map +1 -1
  151. package/dist/Spinner/Spinner.js +130 -78
  152. package/dist/Stepper/Step.d.ts +140 -0
  153. package/dist/Stepper/Step.d.ts.map +1 -0
  154. package/dist/Stepper/Step.js +1045 -0
  155. package/dist/Stepper/StepStatus.d.ts +24 -0
  156. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  157. package/dist/Stepper/StepStatus.js +1 -0
  158. package/dist/Stepper/Stepper.d.ts +93 -0
  159. package/dist/Stepper/Stepper.d.ts.map +1 -0
  160. package/dist/Stepper/Stepper.js +184 -0
  161. package/dist/Stepper/StepperContext.d.ts +41 -0
  162. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  163. package/dist/Stepper/StepperContext.js +34 -0
  164. package/dist/Stepper/index.d.ts +8 -0
  165. package/dist/Stepper/index.d.ts.map +1 -0
  166. package/dist/Stepper/index.js +7 -0
  167. package/dist/Stepper/stepper.stylex.d.ts +15 -0
  168. package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
  169. package/dist/Stepper/stepper.stylex.js +20 -0
  170. package/dist/Switch/Switch.d.ts.map +1 -1
  171. package/dist/Switch/Switch.js +3 -2
  172. package/dist/TabList/Tab.d.ts +15 -2
  173. package/dist/TabList/Tab.d.ts.map +1 -1
  174. package/dist/TabList/Tab.js +32 -7
  175. package/dist/TabList/TabList.d.ts +46 -7
  176. package/dist/TabList/TabList.d.ts.map +1 -1
  177. package/dist/TabList/TabList.js +353 -23
  178. package/dist/TabList/TabListContext.d.ts +11 -1
  179. package/dist/TabList/TabListContext.d.ts.map +1 -1
  180. package/dist/TabList/TabListContext.js +11 -2
  181. package/dist/TabList/TabMenu.d.ts.map +1 -1
  182. package/dist/TabList/TabMenu.js +3 -2
  183. package/dist/TabList/index.d.ts +2 -2
  184. package/dist/TabList/index.d.ts.map +1 -1
  185. package/dist/Table/BaseTable.d.ts.map +1 -1
  186. package/dist/Table/BaseTable.js +4 -1
  187. package/dist/Table/TableRow.d.ts +16 -5
  188. package/dist/Table/TableRow.d.ts.map +1 -1
  189. package/dist/Table/TableRow.js +16 -5
  190. package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
  191. package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
  192. package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
  193. package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
  194. package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
  195. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
  196. package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
  197. package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
  198. package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
  199. package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
  200. package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
  201. package/dist/Table/plugins/selection/useTableSelection.js +19 -5
  202. package/dist/Table/types.d.ts +22 -4
  203. package/dist/Table/types.d.ts.map +1 -1
  204. package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
  205. package/dist/Table/useBaseTablePlugins.js +5 -0
  206. package/dist/Text/Text.d.ts.map +1 -1
  207. package/dist/Text/Text.js +6 -2
  208. package/dist/TextArea/TextArea.d.ts.map +1 -1
  209. package/dist/TextArea/TextArea.js +3 -2
  210. package/dist/TextInput/TextInput.d.ts.map +1 -1
  211. package/dist/TextInput/TextInput.js +3 -2
  212. package/dist/TimeInput/TimeInput.d.ts.map +1 -1
  213. package/dist/TimeInput/TimeInput.js +3 -2
  214. package/dist/Timestamp/Timestamp.d.ts.map +1 -1
  215. package/dist/Timestamp/Timestamp.js +5 -3
  216. package/dist/Token/TokenLink.d.ts.map +1 -1
  217. package/dist/Token/TokenLink.js +2 -2
  218. package/dist/Tokenizer/Tokenizer.d.ts +3 -1
  219. package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
  220. package/dist/Tokenizer/Tokenizer.js +2 -0
  221. package/dist/Tooltip/Tooltip.d.ts +5 -0
  222. package/dist/Tooltip/Tooltip.d.ts.map +1 -1
  223. package/dist/Tooltip/useTooltip.d.ts +5 -0
  224. package/dist/Tooltip/useTooltip.d.ts.map +1 -1
  225. package/dist/Tooltip/useTooltip.js +39 -24
  226. package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
  227. package/dist/TopNav/TopNavHeading.js +3 -2
  228. package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
  229. package/dist/TopNav/TopNavMegaMenu.js +3 -3
  230. package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
  231. package/dist/TopNav/TopNavMenu.js +4 -3
  232. package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
  233. package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
  234. package/dist/Typeahead/BaseTypeahead.js +68 -29
  235. package/dist/Typeahead/Typeahead.d.ts.map +1 -1
  236. package/dist/Typeahead/Typeahead.js +3 -2
  237. package/dist/astryx.css +68 -2
  238. package/dist/hooks/index.d.ts +1 -0
  239. package/dist/hooks/index.d.ts.map +1 -1
  240. package/dist/hooks/index.js +1 -0
  241. package/dist/hooks/useFocusTrap.d.ts +7 -4
  242. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  243. package/dist/hooks/useFocusTrap.js +60 -95
  244. package/dist/hooks/useHotkeys.d.ts.map +1 -1
  245. package/dist/hooks/useHotkeys.js +10 -3
  246. package/dist/hooks/useMergedRefs.d.ts +18 -0
  247. package/dist/hooks/useMergedRefs.d.ts.map +1 -0
  248. package/dist/hooks/useMergedRefs.js +25 -0
  249. package/dist/index.d.ts +1 -0
  250. package/dist/index.d.ts.map +1 -1
  251. package/dist/index.js +1 -0
  252. package/dist/utils/groupItems.d.ts +5 -1
  253. package/dist/utils/groupItems.d.ts.map +1 -1
  254. package/dist/utils/groupItems.js +9 -9
  255. package/dist/utils/index.d.ts +1 -1
  256. package/dist/utils/index.d.ts.map +1 -1
  257. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  258. package/dist/utils/sharedResizeObserver.js +10 -1
  259. package/dist/utils/timeParser.d.ts +1 -1
  260. package/dist/utils/timeParser.d.ts.map +1 -1
  261. package/dist/utils/timeParser.js +26 -12
  262. package/locales/en.json +31 -7
  263. package/locales/pseudo.json +18 -0
  264. package/package.json +8 -3
  265. package/src/AppShell/AppShell.tsx +3 -2
  266. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  267. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  268. package/src/AspectRatio/AspectRatio.tsx +40 -1
  269. package/src/Avatar/Avatar.doc.mjs +2 -1
  270. package/src/Avatar/Avatar.test.tsx +17 -0
  271. package/src/Avatar/Avatar.tsx +61 -38
  272. package/src/AvatarGroup/AvatarGroup.tsx +3 -2
  273. package/src/Banner/Banner.doc.mjs +13 -11
  274. package/src/Banner/Banner.test.tsx +102 -15
  275. package/src/Banner/Banner.tsx +72 -25
  276. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  277. package/src/BottomSheet/BottomSheet.tsx +17 -4
  278. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  279. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  280. package/src/Button/Button.doc.mjs +22 -0
  281. package/src/Button/Button.test.tsx +13 -0
  282. package/src/Button/Button.tsx +5 -4
  283. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  284. package/src/ButtonGroup/ButtonGroup.test.tsx +391 -1
  285. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  286. package/src/Calendar/Calendar.doc.mjs +4 -3
  287. package/src/Calendar/Calendar.test.tsx +52 -0
  288. package/src/Calendar/Calendar.tsx +18 -15
  289. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  290. package/src/Calendar/getInitialFocusDate.ts +93 -0
  291. package/src/Carousel/Carousel.tsx +3 -2
  292. package/src/Chat/ChatComposerInput.tsx +5 -1
  293. package/src/Chat/ChatLayout.tsx +3 -2
  294. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  295. package/src/Chat/ChatMessageList.test.tsx +46 -0
  296. package/src/Chat/ChatMessageList.tsx +28 -4
  297. package/src/Chat/ChatTokenizedText.tsx +17 -10
  298. package/src/Chat/useChatComposerTokens.ts +1 -1
  299. package/src/CheckboxInput/CheckboxInput.tsx +3 -2
  300. package/src/ClickableCard/ClickableCard.tsx +3 -2
  301. package/src/CodeBlock/CodeBlock.doc.mjs +6 -0
  302. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  303. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  304. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  305. package/src/ContextMenu/ContextMenu.tsx +4 -3
  306. package/src/DateInput/DateInput.tsx +3 -2
  307. package/src/DateInput/DateInputTouch.test.tsx +36 -0
  308. package/src/DateInput/TouchDateField.tsx +38 -4
  309. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  310. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  311. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  312. package/src/DateTimeInput/index.ts +1 -0
  313. package/src/Dialog/Dialog.doc.mjs +8 -3
  314. package/src/Dialog/Dialog.test.tsx +261 -1
  315. package/src/Dialog/Dialog.tsx +109 -58
  316. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  317. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  318. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  319. package/src/Field/Field.doc.mjs +13 -2
  320. package/src/FileInput/FileInput.tsx +3 -2
  321. package/src/Heading/Heading.test.tsx +23 -1
  322. package/src/Heading/Heading.tsx +6 -2
  323. package/src/HoverCard/HoverCard.doc.mjs +5 -0
  324. package/src/HoverCard/HoverCard.tsx +6 -0
  325. package/src/HoverCard/useHoverCard.tsx +81 -30
  326. package/src/Item/Item.tsx +5 -4
  327. package/src/Kbd/Kbd.test.tsx +17 -0
  328. package/src/Kbd/Kbd.tsx +10 -3
  329. package/src/Layer/LayerDepthContext.tsx +62 -0
  330. package/src/Layer/index.ts +9 -0
  331. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  332. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  333. package/src/Layer/layerStack.ts +362 -0
  334. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  335. package/src/Layer/useLayerDismissal.ts +173 -0
  336. package/src/Layout/Layout.doc.mjs +2 -2
  337. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  338. package/src/Lightbox/Lightbox.tsx +124 -102
  339. package/src/Link/Link.doc.mjs +39 -0
  340. package/src/Markdown/Markdown.doc.mjs +5 -0
  341. package/src/Markdown/incremental.test.ts +16 -2
  342. package/src/Markdown/index.ts +1 -0
  343. package/src/Markdown/parser.perf.test.ts +96 -1
  344. package/src/Markdown/parser.test.ts +145 -2
  345. package/src/Markdown/parser.ts +244 -29
  346. package/src/MobileNav/MobileNav.tsx +62 -36
  347. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  348. package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
  349. package/src/MultiSelector/MultiSelector.test.tsx +106 -0
  350. package/src/MultiSelector/MultiSelector.tsx +50 -6
  351. package/src/MultiSelector/index.ts +1 -0
  352. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  353. package/src/NumberInput/NumberInput.doc.mjs +5 -0
  354. package/src/Outline/Outline.tsx +3 -2
  355. package/src/OverflowList/OverflowList.tsx +3 -2
  356. package/src/Overlay/Overlay.tsx +3 -2
  357. package/src/Popover/usePopover.tsx +31 -28
  358. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  359. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  360. package/src/PowerSearch/PowerSearch.tsx +34 -5
  361. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +201 -0
  362. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  363. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +47 -1
  364. package/src/PowerSearch/PowerSearchValueEditor.tsx +15 -0
  365. package/src/PowerSearch/types.ts +2 -0
  366. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  367. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  368. package/src/Resizable/ResizeHandle.tsx +3 -2
  369. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  370. package/src/SelectableCard/SelectableCard.tsx +3 -2
  371. package/src/Selector/Selector.doc.mjs +12 -1
  372. package/src/Selector/Selector.test.tsx +45 -1
  373. package/src/Selector/Selector.tsx +11 -1
  374. package/src/SideNav/SideNav.doc.mjs +6 -6
  375. package/src/SideNav/SideNav.tsx +4 -2
  376. package/src/SideNav/SideNavHeading.tsx +10 -10
  377. package/src/SideNav/SideNavItem.tsx +4 -2
  378. package/src/Slider/Slider.tsx +3 -2
  379. package/src/Spinner/Spinner.test.tsx +147 -1
  380. package/src/Spinner/Spinner.tsx +120 -101
  381. package/src/Stepper/Step.doc.mjs +98 -0
  382. package/src/Stepper/Step.tsx +1638 -0
  383. package/src/Stepper/StepStatus.ts +26 -0
  384. package/src/Stepper/Stepper.doc.mjs +370 -0
  385. package/src/Stepper/Stepper.test.tsx +1024 -0
  386. package/src/Stepper/Stepper.tsx +258 -0
  387. package/src/Stepper/StepperContext.ts +71 -0
  388. package/src/Stepper/index.ts +18 -0
  389. package/src/Stepper/stepper.stylex.ts +19 -0
  390. package/src/Switch/Switch.tsx +3 -2
  391. package/src/TabList/Tab.doc.mjs +13 -1
  392. package/src/TabList/Tab.tsx +67 -7
  393. package/src/TabList/TabList.doc.mjs +22 -6
  394. package/src/TabList/TabList.test.tsx +559 -0
  395. package/src/TabList/TabList.tsx +490 -22
  396. package/src/TabList/TabListContext.ts +13 -2
  397. package/src/TabList/TabMenu.tsx +3 -2
  398. package/src/TabList/index.ts +6 -2
  399. package/src/Table/BaseTable.tsx +6 -3
  400. package/src/Table/Table.doc.mjs +6 -1
  401. package/src/Table/Table.test.tsx +132 -14
  402. package/src/Table/TableBody.doc.mjs +40 -0
  403. package/src/Table/TableFooter.doc.mjs +40 -0
  404. package/src/Table/TableHeader.doc.mjs +40 -0
  405. package/src/Table/TableRow.tsx +16 -5
  406. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  407. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  408. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  409. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  410. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  411. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  412. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  413. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  414. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  415. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  416. package/src/Table/types.ts +22 -4
  417. package/src/Table/useBaseTablePlugins.ts +5 -0
  418. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  419. package/src/Table/useTablePagination.doc.mjs +7 -0
  420. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  421. package/src/Table/useTableSelection.doc.mjs +31 -0
  422. package/src/Text/Text.test.tsx +23 -1
  423. package/src/Text/Text.tsx +6 -2
  424. package/src/TextArea/TextArea.tsx +3 -2
  425. package/src/TextInput/TextInput.doc.mjs +10 -0
  426. package/src/TextInput/TextInput.tsx +3 -2
  427. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  428. package/src/TimeInput/TimeInput.tsx +2 -2
  429. package/src/Timestamp/Timestamp.tsx +4 -2
  430. package/src/Toast/Toast.doc.mjs +6 -0
  431. package/src/Token/TokenLink.tsx +2 -2
  432. package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
  433. package/src/Tokenizer/Tokenizer.tsx +4 -0
  434. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  435. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  436. package/src/Tooltip/Tooltip.test.tsx +32 -0
  437. package/src/Tooltip/Tooltip.tsx +5 -0
  438. package/src/Tooltip/useTooltip.tsx +47 -24
  439. package/src/TopNav/TopNavHeading.tsx +3 -2
  440. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  441. package/src/TopNav/TopNavMenu.tsx +4 -3
  442. package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
  443. package/src/Typeahead/BaseTypeahead.tsx +85 -33
  444. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  445. package/src/Typeahead/Typeahead.test.tsx +49 -0
  446. package/src/Typeahead/Typeahead.tsx +3 -2
  447. package/src/hooks/index.ts +2 -0
  448. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  449. package/src/hooks/useFocusTrap.test.tsx +14 -0
  450. package/src/hooks/useFocusTrap.ts +62 -111
  451. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  452. package/src/hooks/useHotkeys.test.ts +18 -0
  453. package/src/hooks/useHotkeys.ts +10 -3
  454. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  455. package/src/hooks/useMergedRefs.test.tsx +62 -0
  456. package/src/hooks/useMergedRefs.ts +36 -0
  457. package/src/index.ts +1 -0
  458. package/src/theme/MediaTheme.doc.mjs +5 -5
  459. package/src/utils/groupItems.ts +12 -6
  460. package/src/utils/index.ts +1 -1
  461. package/src/utils/sharedResizeObserver.ts +10 -2
  462. package/src/utils/timeParser.test.ts +6 -1
  463. package/src/utils/timeParser.ts +35 -13
  464. package/src/__tests__/inputWidthContract.test.tsx +0 -69
@@ -17,69 +17,26 @@
17
17
  */
18
18
  import { useCallback, useEffect, useRef } from 'react';
19
19
  import { FOCUSABLE_SELECTOR } from "./focusableSelector.js";
20
- import { isImeKeyEvent } from "../utils/ime.js";
20
+ import { useLayerDismissal } from "../Layer/useLayerDismissal.js";
21
21
 
22
- /**
23
- * Module-level stack of active focus-trap Escape handlers.
24
- *
25
- * Every active `useFocusTrap` used to attach its own document-level `keydown`
26
- * listener with no coordination, so a single Escape press closed *every* open
27
- * layer at once (e.g. a popover nested inside a Dialog closed both). Tracking
28
- * traps in a shared stack lets only the top-most trap respond to Escape.
29
- *
30
- * "Top-most" is resolved by DOM containment first, push order second. Push
31
- * order alone is not reliable: React runs child effects before parent
32
- * effects, so when an outer and an inner (DOM-nested) trap mount in the SAME
33
- * commit, the inner trap pushes first and the outer trap would wrongly win a
34
- * pure last-pushed comparison.
35
- */
36
-
37
- const escapeStack = [];
38
- function pushEscapeHandler(entry) {
39
- escapeStack.push(entry);
40
- }
41
- function removeEscapeHandler(handler) {
42
- for (let i = escapeStack.length - 1; i >= 0; i--) {
43
- if (escapeStack[i].handler === handler) {
44
- escapeStack.splice(i, 1);
45
- return;
46
- }
47
- }
48
- }
22
+ // Escape-dismissible focus traps currently mounted. This is the whole state
23
+ // behind `hasActiveFocusTrapEscape`, which predates the shared stack and must
24
+ // keep answering about focus traps alone — the stack now carries families that
25
+ // never trapped focus (tooltips, hover cards), and counting those would tell
26
+ // callers a trap is above them when none is.
27
+ let activeEscapeTrapCount = 0;
49
28
 
50
29
  /**
51
- * Resolve the top-most trap: walk the stack in push order, keeping the
52
- * deepest container by DOM containment. When a later entry's container
53
- * contains the current candidate's container, the candidate is nested inside
54
- * it and stays on top; otherwise the later push wins (containment for nested
55
- * traps, push order as the tiebreaker for unrelated ones).
56
- */
57
- function isTopEscapeHandler(handler) {
58
- if (escapeStack.length === 0) {
59
- return false;
60
- }
61
- let top = escapeStack[0];
62
- for (let i = 1; i < escapeStack.length; i++) {
63
- const entry = escapeStack[i];
64
- const topContainer = top.getContainer();
65
- const entryContainer = entry.getContainer();
66
- if (topContainer != null && entryContainer != null && entryContainer !== topContainer && entryContainer.contains(topContainer)) {
67
- // The current top is nested inside this entry — it stays on top.
68
- continue;
69
- }
70
- top = entry;
71
- }
72
- return top.handler === handler;
73
- }
74
-
75
- /**
76
- * Whether any focus-trap Escape handler is currently active (i.e. a popover
77
- * layer is open). Other overlay primitives that manage their own Escape (e.g.
78
- * Dialog) can consult this to defer to a popover layered on top of them,
79
- * giving topmost-only dismissal until a full layer stack exists.
30
+ * Whether an Escape-dismissible focus trap is currently active — a Popover,
31
+ * menu or other trapped layer that would take an Escape press.
32
+ *
33
+ * @deprecated The focus trap no longer owns Escape coordination — every overlay
34
+ * family shares one stack (`useLayerDismissal`), which routes each press to
35
+ * the top-most layer. A layer that wants the same ordering should join the
36
+ * stack rather than ask whether a trap exists.
80
37
  */
81
38
  export function hasActiveFocusTrapEscape() {
82
- return escapeStack.length > 0;
39
+ return activeEscapeTrapCount > 0;
83
40
  }
84
41
 
85
42
  /**
@@ -206,6 +163,36 @@ export function useFocusTrap(options) {
206
163
  // Track if focus change was triggered by keyboard (Tab key)
207
164
  const isKeyboardNavigationRef = useRef(false);
208
165
 
166
+ // Join the shared layer dismissal stack. The trap no longer listens for
167
+ // Escape itself: the stack owns one listener and routes each press to the
168
+ // top-most layer, so a popover inside a Dialog, a submenu inside a menu, and
169
+ // a modal inside a modal all peel off one at a time. A trap with no
170
+ // `onEscape` is not dismissible and stays off the stack, so a press flows
171
+ // past it to whatever is underneath.
172
+ // One expression drives both the stack registration and the deprecated
173
+ // `hasActiveFocusTrapEscape` count, so the two can never disagree about
174
+ // whether this trap is active.
175
+ const isEscapeTrap = isActive && onEscape != null;
176
+ useLayerDismissal({
177
+ isActive: isEscapeTrap,
178
+ onDismiss: () => {
179
+ onEscape?.();
180
+ },
181
+ // The trap renders nothing, so it cannot push a depth provider around its
182
+ // content; hand the stack the container instead so two DOM-nested traps
183
+ // still resolve in the right order.
184
+ getContainer: () => containerRef.current
185
+ });
186
+ useEffect(() => {
187
+ if (!isEscapeTrap) {
188
+ return;
189
+ }
190
+ activeEscapeTrapCount += 1;
191
+ return () => {
192
+ activeEscapeTrapCount -= 1;
193
+ };
194
+ }, [isEscapeTrap]);
195
+
209
196
  /**
210
197
  * Focus the first focusable element.
211
198
  */
@@ -295,59 +282,40 @@ export function useFocusTrap(options) {
295
282
  }, [isActive]);
296
283
 
297
284
  /**
298
- * Handle Tab key to wrap focus at boundaries, and Escape to close.
299
- * Also tracks that keyboard navigation is occurring.
285
+ * Handle Tab key to wrap focus at boundaries. Also tracks that keyboard
286
+ * navigation is occurring.
287
+ *
288
+ * No Escape here, and no IME guard: the shared stack owns the press, claims
289
+ * a composing Escape so no close request follows, and dismisses the trap
290
+ * through `onEscape` above. The trap renders no element of its own, so it
291
+ * has no `cancel` to answer either.
300
292
  */
301
293
  useEffect(() => {
302
294
  if (!isActive) {
303
295
  return;
304
296
  }
305
-
306
- // Register this trap on the shared Escape stack so only the top-most
307
- // active trap responds to Escape. A stable identity per active period is
308
- // enough — we push on activate and remove on cleanup. The container is
309
- // read lazily: the ref may not be attached yet at effect time, and the
310
- // stack resolves top-most by DOM containment at keydown time.
311
- const escapeHandler = () => {
312
- onEscape?.();
313
- };
314
- if (onEscape) {
315
- pushEscapeHandler({
316
- handler: escapeHandler,
317
- getContainer: () => containerRef.current
318
- });
319
- }
320
297
  const handleKeyDown = event => {
321
298
  const container = containerRef.current;
322
299
  if (!container) {
323
300
  return;
324
301
  }
325
- if (event.key === 'Escape' && onEscape) {
326
- // Ignore Escape that is cancelling an IME composition, already handled
327
- // by a nested handler, or not targeting the top-most trap.
328
- if (event.defaultPrevented || isImeKeyEvent(event) || !isTopEscapeHandler(escapeHandler)) {
329
- return;
330
- }
331
- // Mark handled and stop propagation so an outer layer (e.g. a Dialog
332
- // hosting this popover) does not also dismiss on the same press.
333
- event.preventDefault();
334
- event.stopPropagation();
335
- onEscape();
336
- return;
337
- }
338
302
  if (event.key === 'Tab') {
339
303
  // Mark that keyboard navigation is happening
340
304
  isKeyboardNavigationRef.current = true;
341
305
  const focusable = getFocusableElements(container);
342
306
  if (focusable.length === 0) {
307
+ const active = document.activeElement;
308
+ if (!(active instanceof HTMLElement) || !container.contains(active)) {
309
+ // A layer can be open while focus legitimately sits outside it —
310
+ // a listbox popup anchored to its own input. Cancelling there
311
+ // would take Tab away from the whole page.
312
+ return;
313
+ }
343
314
  // There is nowhere to advance to. Keep focus on the current
344
315
  // programmatic target (for example a dialog panel with tabIndex=-1)
345
316
  // rather than allowing the browser to move into background content.
346
317
  event.preventDefault();
347
- const active = document.activeElement;
348
- if (active instanceof HTMLElement && container.contains(active)) {
349
- lastFocusRef.current = active;
350
- }
318
+ lastFocusRef.current = active;
351
319
  isKeyboardNavigationRef.current = false;
352
320
  return;
353
321
  }
@@ -371,9 +339,6 @@ export function useFocusTrap(options) {
371
339
  document.addEventListener('keydown', handleKeyDown);
372
340
  return () => {
373
341
  document.removeEventListener('keydown', handleKeyDown);
374
- if (onEscape) {
375
- removeEscapeHandler(escapeHandler);
376
- }
377
342
  };
378
343
  }, [isActive, onEscape]);
379
344
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"useHotkeys.d.ts","sourceRoot":"","sources":["../../src/hooks/useHotkeys.ts"],"names":[],"mappings":"AA6BA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;;;;;;;;;;;OAeG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA2FD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAkClD"}
1
+ {"version":3,"file":"useHotkeys.d.ts","sourceRoot":"","sources":["../../src/hooks/useHotkeys.ts"],"names":[],"mappings":"AA6BA;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB;;;;;;;;;;;;;;;OAeG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAkGD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAkClD"}
@@ -44,8 +44,9 @@ const KEY_ALIASES = {
44
44
 
45
45
  /**
46
46
  * Detects whether the current platform is macOS/iOS.
47
- * Prefers the User-Agent Client Hints API when available (modern Chrome/Edge),
48
- * falls back to navigator.platform (deprecated but universally supported).
47
+ * Prefers the User-Agent Client Hints API when it names a platform (modern
48
+ * Chrome/Edge), falls back to navigator.platform (deprecated but universally
49
+ * supported) when it is absent or blank.
49
50
  * Mirrors the detection used by Kbd so displayed and handled shortcuts agree.
50
51
  */
51
52
  function isApplePlatform() {
@@ -54,7 +55,13 @@ function isApplePlatform() {
54
55
  }
55
56
  const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
56
57
  if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
57
- return /mac/i.test(uaData.platform ?? '');
58
+ const uaPlatform = uaData.platform;
59
+ // A blank platform is no answer, not a negative one. Builds that rewrite
60
+ // their client-hints identity ship '', so fall through rather than
61
+ // reading it as "not Apple".
62
+ if (typeof uaPlatform === 'string' && uaPlatform.trim() !== '') {
63
+ return /mac/i.test(uaPlatform);
64
+ }
58
65
  }
59
66
  return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
60
67
  }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @file useMergedRefs.ts
3
+ * @input React refs to combine into one stable callback ref
4
+ * @output Exports useMergedRefs
5
+ * @position Core hook; use when one element must receive multiple refs
6
+ *
7
+ * SYNC: When modified, update:
8
+ * - /packages/core/src/hooks/index.ts
9
+ * - /packages/core/src/hooks/useMergedRefs.doc.mjs
10
+ * - /packages/core/src/hooks/useMergedRefs.test.tsx
11
+ */
12
+ import { type Ref, type RefCallback } from 'react';
13
+ /**
14
+ * Combine up to six refs into a callback ref whose identity changes only when
15
+ * one of the input refs changes.
16
+ */
17
+ export declare function useMergedRefs<T>(refA?: Ref<T>, refB?: Ref<T>, refC?: Ref<T>, refD?: Ref<T>, refE?: Ref<T>, refF?: Ref<T>): RefCallback<T>;
18
+ //# sourceMappingURL=useMergedRefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMergedRefs.d.ts","sourceRoot":"","sources":["../../src/hooks/useMergedRefs.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAAU,KAAK,GAAG,EAAE,KAAK,WAAW,EAAC,MAAM,OAAO,CAAC;AAG1D;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAC7B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACb,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GACZ,WAAW,CAAC,CAAC,CAAC,CAKhB"}
@@ -0,0 +1,25 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file useMergedRefs.ts
7
+ * @input React refs to combine into one stable callback ref
8
+ * @output Exports useMergedRefs
9
+ * @position Core hook; use when one element must receive multiple refs
10
+ *
11
+ * SYNC: When modified, update:
12
+ * - /packages/core/src/hooks/index.ts
13
+ * - /packages/core/src/hooks/useMergedRefs.doc.mjs
14
+ * - /packages/core/src/hooks/useMergedRefs.test.tsx
15
+ */
16
+ import { useMemo } from 'react';
17
+ import { mergeRefs } from "../utils/mergeRefs.js";
18
+
19
+ /**
20
+ * Combine up to six refs into a callback ref whose identity changes only when
21
+ * one of the input refs changes.
22
+ */
23
+ export function useMergedRefs(refA, refB, refC, refD, refE, refF) {
24
+ return useMemo(() => mergeRefs(refA, refB, refC, refD, refE, refF), [refA, refB, refC, refD, refE, refF]);
25
+ }
package/dist/index.d.ts CHANGED
@@ -46,6 +46,7 @@ export * from './NavIcon';
46
46
  export * from './NavMenu';
47
47
  export * from './Slider';
48
48
  export * from './Stack';
49
+ export * from './Stepper';
49
50
  export * from './Switch';
50
51
  export * from './DateInput';
51
52
  export * from './DateTimeInput';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -53,6 +53,7 @@ export * from "./NavIcon/index.js";
53
53
  export * from "./NavMenu/index.js";
54
54
  export * from "./Slider/index.js";
55
55
  export * from "./Stack/index.js";
56
+ export * from "./Stepper/index.js";
56
57
  export * from "./Switch/index.js";
57
58
  export * from "./DateInput/index.js";
58
59
  export * from "./DateTimeInput/index.js";
@@ -14,6 +14,10 @@ export interface ItemGroup<T extends SearchableItem = SearchableItem> {
14
14
  heading: string | null;
15
15
  items: T[];
16
16
  }
17
+ export interface GroupItemsOptions {
18
+ /** Place ungrouped items before named groups instead of after them. */
19
+ ungroupedFirst?: boolean;
20
+ }
17
21
  /**
18
22
  * Extract the group string from an item's auxiliaryData.
19
23
  */
@@ -41,5 +45,5 @@ export declare function getItemGroup(item: SearchableItem): string | undefined;
41
45
  * // ]
42
46
  * ```
43
47
  */
44
- export declare function groupItems<T extends SearchableItem>(items: T[]): ItemGroup<T>[];
48
+ export declare function groupItems<T extends SearchableItem>(items: T[], { ungroupedFirst }?: GroupItemsOptions): ItemGroup<T>[];
45
49
  //# sourceMappingURL=groupItems.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"groupItems.d.ts","sourceRoot":"","sources":["../../src/utils/groupItems.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAClE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,CAAC,EAAE,CAAC;CACZ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,cAAc,EACjD,KAAK,EAAE,CAAC,EAAE,GACT,SAAS,CAAC,CAAC,CAAC,EAAE,CAkChB"}
1
+ {"version":3,"file":"groupItems.d.ts","sourceRoot":"","sources":["../../src/utils/groupItems.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAClE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,CAAC,EAAE,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,cAAc,EACjD,KAAK,EAAE,CAAC,EAAE,EACV,EAAC,cAAsB,EAAC,GAAE,iBAAsB,GAC/C,SAAS,CAAC,CAAC,CAAC,EAAE,CAkChB"}
@@ -44,7 +44,9 @@ export function getItemGroup(item) {
44
44
  * // ]
45
45
  * ```
46
46
  */
47
- export function groupItems(items) {
47
+ export function groupItems(items, {
48
+ ungroupedFirst = false
49
+ } = {}) {
48
50
  const hasGroups = items.some(item => getItemGroup(item) != null);
49
51
  if (!hasGroups) {
50
52
  return [{
@@ -67,15 +69,13 @@ export function groupItems(items) {
67
69
  ungrouped.push(item);
68
70
  }
69
71
  }
70
- const result = groupOrder.map(heading => ({
72
+ const namedGroups = groupOrder.map(heading => ({
71
73
  heading,
72
74
  items: groups.get(heading) ?? []
73
75
  }));
74
- if (ungrouped.length > 0) {
75
- result.push({
76
- heading: null,
77
- items: ungrouped
78
- });
79
- }
80
- return result;
76
+ const ungroupedGroup = ungrouped.length > 0 ? [{
77
+ heading: null,
78
+ items: ungrouped
79
+ }] : [];
80
+ return ungroupedFirst ? [...ungroupedGroup, ...namedGroups] : [...namedGroups, ...ungroupedGroup];
81
81
  }
@@ -21,7 +21,7 @@ export { composeEventHandlers } from './composeEventHandlers';
21
21
  export { themeProps, themeDataAttributes } from './themeProps';
22
22
  export type { ClassValue, ClassProps, ThemeDataAttributes, ThemeProps, } from './themeProps';
23
23
  export { groupItems, getItemGroup } from './groupItems';
24
- export type { ItemGroup } from './groupItems';
24
+ export type { ItemGroup, GroupItemsOptions } from './groupItems';
25
25
  export { observeResize, unobserveResize } from './sharedResizeObserver';
26
26
  export { isRenderable } from './isRenderable';
27
27
  export { getInputARIA } from './inputAria';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,YAAY,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAEvC,YAAY,EAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,MAAM,aAAa,CAAC;AAEhF,OAAO,EACL,cAAc,EACd,SAAS,EACT,QAAQ,EACR,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,8BAA8B,EAC9B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,EACjB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAElD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,EACV,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,MAAM,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAC,MAAM,UAAU,CAAC;AAE5D,OAAO,EAAC,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAEhF,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAC7D,YAAY,EACV,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AACtD,YAAY,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,YAAY,EAAC,SAAS,EAAE,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAElC,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAE3E,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAItC,OAAO,EAAC,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAE5E,OAAO,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,YAAY,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAEvC,YAAY,EAAC,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAC,MAAM,aAAa,CAAC;AAEhF,OAAO,EACL,cAAc,EACd,SAAS,EACT,QAAQ,EACR,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,wBAAwB,EACxB,8BAA8B,EAC9B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,EACjB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAElD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,EACV,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAC,aAAa,EAAE,UAAU,EAAC,MAAM,cAAc,CAAC;AAE5D,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,MAAM,EAAE,KAAK,GAAG,EAAE,KAAK,WAAW,EAAC,MAAM,UAAU,CAAC;AAE5D,OAAO,EAAC,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAC,MAAM,cAAc,CAAC;AAEhF,OAAO,EAAC,UAAU,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AACtC,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAC7D,YAAY,EACV,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,UAAU,GACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,cAAc,CAAC;AACtD,YAAY,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAC,aAAa,EAAE,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,YAAY,EAAC,SAAS,EAAE,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAEhE,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,IAAI,EAAC,MAAM,SAAS,CAAC;AAElC,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAE3E,OAAO,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAItC,OAAO,EAAC,kBAAkB,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AAE5E,OAAO,EAAC,aAAa,EAAC,MAAM,OAAO,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sharedResizeObserver.d.ts","sourceRoot":"","sources":["../../src/utils/sharedResizeObserver.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAmB3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAStD"}
1
+ {"version":3,"file":"sharedResizeObserver.d.ts","sourceRoot":"","sources":["../../src/utils/sharedResizeObserver.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,KAAK,cAAc,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;AA2B3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,cAAc,GACvB,IAAI,CAQN;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAStD"}
@@ -20,7 +20,16 @@
20
20
  */
21
21
  let observer = null;
22
22
  const callbacks = new Map();
23
+
24
+ /**
25
+ * The shared observer, or null where the API does not exist (jsdom, an old
26
+ * browser). Callers still get the one-shot measurement `observeResize` fires
27
+ * on registration; live resize updates are the part that needs the API.
28
+ */
23
29
  function getObserver() {
30
+ if (typeof ResizeObserver === 'undefined') {
31
+ return null;
32
+ }
24
33
  if (!observer) {
25
34
  observer = new ResizeObserver(entries => {
26
35
  for (const entry of entries) {
@@ -57,7 +66,7 @@ function getObserver() {
57
66
  */
58
67
  export function observeResize(element, callback) {
59
68
  callbacks.set(element, callback);
60
- getObserver().observe(element);
69
+ getObserver()?.observe(element);
61
70
 
62
71
  // Fire once immediately so callers get an initial measurement
63
72
  // without duplicating their logic outside the observer path.
@@ -2,7 +2,7 @@
2
2
  * @file timeParser.ts
3
3
  * @input Uses string parsing
4
4
  * @output Exports time parsing and formatting utilities
5
- * @position Shared utility; used by TimePicker
5
+ * @position Shared utility; used by TimeInput and DateTimeInput
6
6
  *
7
7
  * SYNC: When modified, update this header
8
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"timeParser.d.ts","sourceRoot":"","sources":["../../src/utils/timeParser.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAMvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA6B5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,cAAc,GAAE,OAAe,GAC9B,aAAa,CAUf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,cAAc,GAAE,OAAe,GAC9B,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,cAAc,GAAE,OAAe,GAC9B,MAAM,CAmBR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,OAAe,GAC9B,aAAa,GAAG,IAAI,CAuGtB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,aAAa,GAAG,SAAS,EAC5B,CAAC,EAAE,aAAa,GAAG,SAAS,GAC3B,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,EACnB,cAAc,GAAE,OAAe,GAC9B,aAAa,CAoBf;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,aAAa,EACnB,YAAY,EAAE,MAAM,EACpB,cAAc,GAAE,OAAe,GAC9B,aAAa,CAwBf"}
1
+ {"version":3,"file":"timeParser.d.ts","sourceRoot":"","sources":["../../src/utils/timeParser.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAMvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA6B5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,cAAc,GAAE,OAAe,GAC9B,aAAa,CAUf;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,cAAc,GAAE,OAAe,GAC9B,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,cAAc,GAAE,OAAe,GAC9B,MAAM,CAmBR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,cAAc,GAAE,OAAe,GAC9B,aAAa,GAAG,IAAI,CA6HtB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,aAAa,GAAG,SAAS,EAC5B,CAAC,EAAE,aAAa,GAAG,SAAS,GAC3B,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,GAClB,OAAO,CAQT;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,EACnB,GAAG,CAAC,EAAE,aAAa,EACnB,cAAc,GAAE,OAAe,GAC9B,aAAa,CAoBf;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,aAAa,EACnB,YAAY,EAAE,MAAM,EACpB,cAAc,GAAE,OAAe,GAC9B,aAAa,CAwBf"}
@@ -4,7 +4,7 @@
4
4
  * @file timeParser.ts
5
5
  * @input Uses string parsing
6
6
  * @output Exports time parsing and formatting utilities
7
- * @position Shared utility; used by TimePicker
7
+ * @position Shared utility; used by TimeInput and DateTimeInput
8
8
  *
9
9
  * SYNC: When modified, update this header
10
10
  */
@@ -134,17 +134,29 @@ export function parseTimeInput(input, includeSeconds = false) {
134
134
 
135
135
  // Remove AM/PM suffix
136
136
  const timeStr = trimmed.replace(/\s*[ap]\.?m?\.?\s*$/i, '').trim();
137
+ const convertHourTo24Hour = hour => {
138
+ if (!hasMeridiem) {
139
+ return hour;
140
+ }
141
+ if (hour < 1 || hour > 12) {
142
+ return null;
143
+ }
144
+ if (isPM && hour !== 12) {
145
+ return hour + 12;
146
+ }
147
+ if (isAM && hour === 12) {
148
+ return 0;
149
+ }
150
+ return hour;
151
+ };
137
152
 
138
153
  // Handle formats like "2pm" -> "2"
139
154
  if (/^\d{1,2}$/.test(timeStr)) {
140
155
  const hour = parseInt(timeStr, 10);
141
- if (hour >= 1 && hour <= 12 && hasMeridiem) {
142
- let hour24 = hour;
143
- if (isPM && hour !== 12) {
144
- hour24 = hour + 12;
145
- }
146
- if (isAM && hour === 12) {
147
- hour24 = 0;
156
+ if (hasMeridiem) {
157
+ const hour24 = convertHourTo24Hour(hour);
158
+ if (hour24 === null) {
159
+ return null;
148
160
  }
149
161
  return formatISOTime({
150
162
  hour: hour24,
@@ -166,9 +178,10 @@ export function parseTimeInput(input, includeSeconds = false) {
166
178
  if (/^\d{4}$/.test(timeStr)) {
167
179
  const hour = parseInt(timeStr.slice(0, 2), 10);
168
180
  const minute = parseInt(timeStr.slice(2, 4), 10);
169
- if (hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59) {
181
+ const hour24 = convertHourTo24Hour(hour);
182
+ if (hour24 !== null && hour24 >= 0 && hour24 <= 23 && minute >= 0 && minute <= 59) {
170
183
  return formatISOTime({
171
- hour,
184
+ hour: hour24,
172
185
  minute,
173
186
  second: 0
174
187
  }, includeSeconds);
@@ -181,9 +194,10 @@ export function parseTimeInput(input, includeSeconds = false) {
181
194
  const hour = parseInt(timeStr.slice(0, 2), 10);
182
195
  const minute = parseInt(timeStr.slice(2, 4), 10);
183
196
  const second = parseInt(timeStr.slice(4, 6), 10);
184
- if (hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59 && second >= 0 && second <= 59) {
197
+ const hour24 = convertHourTo24Hour(hour);
198
+ if (hour24 !== null && hour24 >= 0 && hour24 <= 23 && minute >= 0 && minute <= 59 && second >= 0 && second <= 59) {
185
199
  return formatISOTime({
186
- hour,
200
+ hour: hour24,
187
201
  minute,
188
202
  second
189
203
  }, includeSeconds);
package/locales/en.json CHANGED
@@ -563,6 +563,10 @@
563
563
  "defaultMessage": "Apply",
564
564
  "description": "Primary button label inside a table's filter panel/popover; commits pending filter values. Imperative verb; pairs with `Reset`."
565
565
  },
566
+ "@astryx.table.rowStatus.columnHeader": {
567
+ "defaultMessage": "Row status",
568
+ "description": "Screen-reader-only column header for the narrow status-indicator gutter a Table gains from useTableRowStatus. Sighted users see a blank gutter; assistive tech announces this as the column name."
569
+ },
566
570
  "@astryx.table.selection.selectAllRows": {
567
571
  "defaultMessage": "Select all rows",
568
572
  "description": "Aria label for the \"select all rows\" checkbox in a Table header."
@@ -747,6 +751,10 @@
747
751
  "defaultMessage": "{label} time",
748
752
  "description": "Screen-reader-only accessible name for the time-of-day slot in a DateTimeInput. Example: `Start date time`; reorder freely (e.g. \"time of {label}\")."
749
753
  },
754
+ "@astryx.dateTimeInput.timeOptionsLabel": {
755
+ "defaultMessage": "{label} options",
756
+ "description": "Screen-reader-only accessible name for the list of preset times that drops down from a DateTimeInput's time slot. `{label}` is the accessible name of the time field itself, already ending in the word for time — example: `Meeting time options`. Plural: the list holds every selectable time."
757
+ },
750
758
  "@astryx.dateRangeInput.placeholder": {
751
759
  "defaultMessage": "Select date range",
752
760
  "description": "Grey placeholder inside an empty DateRangeInput field. Represents picking a start–end date pair. Imperative verb."
@@ -809,7 +817,15 @@
809
817
  },
810
818
  "@astryx.table.pagination.label": {
811
819
  "defaultMessage": "Table pagination",
812
- "description": "Screen-reader-only accessible name for the pagination `<nav>` appended below a data table. Kept separate from `@astryx.pagination.label` so translations may diverge."
820
+ "description": "Screen-reader-only accessible name for a table's pagination `<nav>` (rendered below and/or above the table per the plugin's position config). Kept separate from `@astryx.pagination.label` so translations may diverge. When position='both', this string is interpolated as the {label} value into `@astryx.table.pagination.labelAbove`/`labelBelow` — keep it compatible with those suffix templates."
821
+ },
822
+ "@astryx.table.pagination.labelAbove": {
823
+ "defaultMessage": "{label} (top)",
824
+ "description": "Accessible name for the pagination `<nav>` rendered above the table when position='both' renders two navs. `label` is the resolved base label (default \"Table pagination\" or consumer-supplied); the suffix keeps the two same-type landmarks distinguishable."
825
+ },
826
+ "@astryx.table.pagination.labelBelow": {
827
+ "defaultMessage": "{label} (bottom)",
828
+ "description": "Accessible name for the pagination `<nav>` rendered below the table when position='both' renders two navs. `label` is the resolved base label (default \"Table pagination\" or consumer-supplied); the suffix keeps the two same-type landmarks distinguishable."
813
829
  },
814
830
  "@astryx.timeInput.placeholder": {
815
831
  "defaultMessage": "Select a time",
@@ -1059,6 +1075,10 @@
1059
1075
  "defaultMessage": "Expand row",
1060
1076
  "description": "Screen-reader-only label on the row-expand chevron when the row is currently collapsed. Part of a four-way set with `collapseRow`, `expandAllRows`, `collapseAllRows`."
1061
1077
  },
1078
+ "@astryx.tableRowExpansion.columnHeader": {
1079
+ "defaultMessage": "Row expansion",
1080
+ "description": "Screen-reader-only header for the leading column that holds the per-row expand/collapse chevrons. The column shows no visible label."
1081
+ },
1062
1082
  "@astryx.tableRowExpansion.collapseAllRows": {
1063
1083
  "defaultMessage": "Collapse all rows",
1064
1084
  "description": "Screen-reader-only label on the same header button when every row is expanded. Part of the four-way set."
@@ -1067,29 +1087,33 @@
1067
1087
  "defaultMessage": "Expand all rows",
1068
1088
  "description": "Screen-reader-only label on the header expand-all/collapse-all button when at least one row is collapsed (clicking expands every expandable row). Part of the four-way set."
1069
1089
  },
1090
+ "@astryx.stepper.label": {
1091
+ "defaultMessage": "Progress",
1092
+ "description": "Screen-reader-only fallback name for the Stepper's ordered list of steps, describing the sequence as a whole (e.g. `Progress`). Used as the aria-label when the consumer does not pass a `label`. Singular per ARIA convention."
1093
+ },
1070
1094
  "@astryx.step.goToStep": {
1071
1095
  "defaultMessage": "Go to step {stepNumber, number}: {label}",
1072
- "description": "Accessible name for a clickable step in the lab Stepper. {stepNumber} is the 1-based position, {label} is the step's visible label."
1096
+ "description": "Accessible name for a clickable step in the Stepper. {stepNumber} is the 1-based position, {label} is the step's visible label."
1073
1097
  },
1074
1098
  "@astryx.step.goToStepWithStatus": {
1075
1099
  "defaultMessage": "Go to step {stepNumber, number}: {label}, {status}",
1076
- "description": "Accessible name for a clickable lab Stepper step that also carries a status. {status} is one of the translated `step.status.*` words (completed/warning/error). Keep the pattern parallel to `step.goToStep`."
1100
+ "description": "Accessible name for a clickable Stepper step that also carries a status. {status} is one of the translated `step.status.*` words (completed/warning/error). Keep the pattern parallel to `step.goToStep`."
1077
1101
  },
1078
1102
  "@astryx.step.optional": {
1079
1103
  "defaultMessage": "Optional",
1080
- "description": "Visible indicator appended after a lab Stepper step's label when the step is optional (isOptional). Very short; appears inline after the label text."
1104
+ "description": "Visible indicator appended after a Stepper step's label when the step is optional (isOptional). Very short; appears inline after the label text."
1081
1105
  },
1082
1106
  "@astryx.step.status.completed": {
1083
1107
  "defaultMessage": "completed",
1084
- "description": "Screen-reader-only status word rendered next to a lab Stepper step label when the step is done (either progress-completed or status=success). Lowercase adjective; it is read mid-sentence after the step label."
1108
+ "description": "Screen-reader-only status word rendered next to a Stepper step label when the step is done (either progress-completed or status=success). Lowercase adjective; it is read mid-sentence after the step label."
1085
1109
  },
1086
1110
  "@astryx.step.status.warning": {
1087
1111
  "defaultMessage": "warning",
1088
- "description": "Screen-reader-only status word rendered next to a lab Stepper step label when status=warning. Lowercase noun/adjective; read mid-sentence after the step label."
1112
+ "description": "Screen-reader-only status word rendered next to a Stepper step label when status=warning. Lowercase noun/adjective; read mid-sentence after the step label."
1089
1113
  },
1090
1114
  "@astryx.step.status.error": {
1091
1115
  "defaultMessage": "error",
1092
- "description": "Screen-reader-only status word rendered next to a lab Stepper step label when status=error. Lowercase noun; read mid-sentence after the step label."
1116
+ "description": "Screen-reader-only status word rendered next to a Stepper step label when status=error. Lowercase noun; read mid-sentence after the step label."
1093
1117
  },
1094
1118
  "@astryx.tableTree.collapseRow": {
1095
1119
  "defaultMessage": "Collapse row",