@astryxdesign/core 0.4.7 → 0.5.0-canary.54bb922

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 (467) 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 +2 -19
  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 +3 -18
  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/isApplePlatform.d.ts +18 -0
  258. package/dist/utils/isApplePlatform.d.ts.map +1 -0
  259. package/dist/utils/isApplePlatform.js +37 -0
  260. package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
  261. package/dist/utils/sharedResizeObserver.js +10 -1
  262. package/dist/utils/timeParser.d.ts +1 -1
  263. package/dist/utils/timeParser.d.ts.map +1 -1
  264. package/dist/utils/timeParser.js +26 -12
  265. package/locales/en.json +31 -7
  266. package/locales/pseudo.json +18 -0
  267. package/package.json +8 -3
  268. package/src/AppShell/AppShell.tsx +3 -2
  269. package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
  270. package/src/AspectRatio/AspectRatio.test.tsx +57 -10
  271. package/src/AspectRatio/AspectRatio.tsx +40 -1
  272. package/src/Avatar/Avatar.doc.mjs +2 -1
  273. package/src/Avatar/Avatar.test.tsx +17 -0
  274. package/src/Avatar/Avatar.tsx +61 -38
  275. package/src/AvatarGroup/AvatarGroup.tsx +3 -2
  276. package/src/Banner/Banner.doc.mjs +13 -11
  277. package/src/Banner/Banner.test.tsx +102 -15
  278. package/src/Banner/Banner.tsx +72 -25
  279. package/src/BottomSheet/BottomSheet.test.tsx +123 -0
  280. package/src/BottomSheet/BottomSheet.tsx +17 -4
  281. package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
  282. package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
  283. package/src/Button/Button.doc.mjs +22 -0
  284. package/src/Button/Button.test.tsx +13 -0
  285. package/src/Button/Button.tsx +5 -4
  286. package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
  287. package/src/ButtonGroup/ButtonGroup.test.tsx +391 -1
  288. package/src/ButtonGroup/ButtonGroup.tsx +23 -5
  289. package/src/Calendar/Calendar.doc.mjs +4 -3
  290. package/src/Calendar/Calendar.test.tsx +52 -0
  291. package/src/Calendar/Calendar.tsx +18 -15
  292. package/src/Calendar/getInitialFocusDate.test.ts +94 -0
  293. package/src/Calendar/getInitialFocusDate.ts +93 -0
  294. package/src/Carousel/Carousel.tsx +3 -2
  295. package/src/Chat/ChatComposerInput.tsx +5 -1
  296. package/src/Chat/ChatLayout.tsx +3 -2
  297. package/src/Chat/ChatMessageList.doc.mjs +9 -1
  298. package/src/Chat/ChatMessageList.test.tsx +46 -0
  299. package/src/Chat/ChatMessageList.tsx +28 -4
  300. package/src/Chat/ChatTokenizedText.tsx +17 -10
  301. package/src/Chat/useChatComposerTokens.ts +1 -1
  302. package/src/CheckboxInput/CheckboxInput.tsx +3 -2
  303. package/src/ClickableCard/ClickableCard.tsx +3 -2
  304. package/src/CodeBlock/CodeBlock.doc.mjs +6 -0
  305. package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
  306. package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
  307. package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
  308. package/src/ContextMenu/ContextMenu.tsx +4 -3
  309. package/src/DateInput/DateInput.tsx +3 -2
  310. package/src/DateInput/DateInputTouch.test.tsx +36 -0
  311. package/src/DateInput/TouchDateField.tsx +38 -4
  312. package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
  313. package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
  314. package/src/DateTimeInput/DateTimeInput.tsx +556 -24
  315. package/src/DateTimeInput/index.ts +1 -0
  316. package/src/Dialog/Dialog.doc.mjs +8 -3
  317. package/src/Dialog/Dialog.test.tsx +261 -1
  318. package/src/Dialog/Dialog.tsx +109 -58
  319. package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
  320. package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
  321. package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
  322. package/src/Field/Field.doc.mjs +13 -2
  323. package/src/FileInput/FileInput.tsx +3 -2
  324. package/src/Heading/Heading.test.tsx +23 -1
  325. package/src/Heading/Heading.tsx +6 -2
  326. package/src/HoverCard/HoverCard.doc.mjs +5 -0
  327. package/src/HoverCard/HoverCard.tsx +6 -0
  328. package/src/HoverCard/useHoverCard.tsx +81 -30
  329. package/src/Item/Item.tsx +5 -4
  330. package/src/Kbd/Kbd.tsx +2 -19
  331. package/src/Layer/LayerDepthContext.tsx +62 -0
  332. package/src/Layer/index.ts +9 -0
  333. package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
  334. package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
  335. package/src/Layer/layerStack.ts +362 -0
  336. package/src/Layer/useLayerDismissal.test.tsx +469 -0
  337. package/src/Layer/useLayerDismissal.ts +173 -0
  338. package/src/Layout/Layout.doc.mjs +2 -2
  339. package/src/Lightbox/Lightbox.doc.mjs +12 -0
  340. package/src/Lightbox/Lightbox.tsx +124 -102
  341. package/src/Link/Link.doc.mjs +39 -0
  342. package/src/Markdown/Markdown.doc.mjs +5 -0
  343. package/src/Markdown/incremental.test.ts +16 -2
  344. package/src/Markdown/index.ts +1 -0
  345. package/src/Markdown/parser.perf.test.ts +96 -1
  346. package/src/Markdown/parser.test.ts +145 -2
  347. package/src/Markdown/parser.ts +244 -29
  348. package/src/MobileNav/MobileNav.tsx +62 -36
  349. package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
  350. package/src/MultiSelector/MultiSelector.doc.mjs +27 -0
  351. package/src/MultiSelector/MultiSelector.test.tsx +106 -0
  352. package/src/MultiSelector/MultiSelector.tsx +50 -6
  353. package/src/MultiSelector/index.ts +1 -0
  354. package/src/NavMenu/NavHeadingMenu.tsx +3 -2
  355. package/src/NumberInput/NumberInput.doc.mjs +5 -0
  356. package/src/Outline/Outline.tsx +3 -2
  357. package/src/OverflowList/OverflowList.tsx +3 -2
  358. package/src/Overlay/Overlay.tsx +3 -2
  359. package/src/Popover/usePopover.tsx +31 -28
  360. package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
  361. package/src/PowerSearch/PowerSearch.test.tsx +240 -1
  362. package/src/PowerSearch/PowerSearch.tsx +34 -5
  363. package/src/PowerSearch/PowerSearchEditPopover.test.tsx +201 -0
  364. package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
  365. package/src/PowerSearch/PowerSearchValueEditor.test.tsx +47 -1
  366. package/src/PowerSearch/PowerSearchValueEditor.tsx +15 -0
  367. package/src/PowerSearch/types.ts +2 -0
  368. package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
  369. package/src/PowerSearch/usePowerSearchSource.ts +13 -3
  370. package/src/Resizable/ResizeHandle.tsx +3 -2
  371. package/src/SegmentedControl/SegmentedControl.tsx +3 -2
  372. package/src/SelectableCard/SelectableCard.tsx +3 -2
  373. package/src/Selector/Selector.doc.mjs +12 -1
  374. package/src/Selector/Selector.test.tsx +45 -1
  375. package/src/Selector/Selector.tsx +11 -1
  376. package/src/SideNav/SideNav.doc.mjs +6 -6
  377. package/src/SideNav/SideNav.tsx +4 -2
  378. package/src/SideNav/SideNavHeading.tsx +10 -10
  379. package/src/SideNav/SideNavItem.tsx +4 -2
  380. package/src/Slider/Slider.tsx +3 -2
  381. package/src/Spinner/Spinner.test.tsx +147 -1
  382. package/src/Spinner/Spinner.tsx +120 -101
  383. package/src/Stepper/Step.doc.mjs +98 -0
  384. package/src/Stepper/Step.tsx +1638 -0
  385. package/src/Stepper/StepStatus.ts +26 -0
  386. package/src/Stepper/Stepper.doc.mjs +370 -0
  387. package/src/Stepper/Stepper.test.tsx +1024 -0
  388. package/src/Stepper/Stepper.tsx +258 -0
  389. package/src/Stepper/StepperContext.ts +71 -0
  390. package/src/Stepper/index.ts +18 -0
  391. package/src/Stepper/stepper.stylex.ts +19 -0
  392. package/src/Switch/Switch.tsx +3 -2
  393. package/src/TabList/Tab.doc.mjs +13 -1
  394. package/src/TabList/Tab.tsx +67 -7
  395. package/src/TabList/TabList.doc.mjs +22 -6
  396. package/src/TabList/TabList.test.tsx +559 -0
  397. package/src/TabList/TabList.tsx +490 -22
  398. package/src/TabList/TabListContext.ts +13 -2
  399. package/src/TabList/TabMenu.tsx +3 -2
  400. package/src/TabList/index.ts +6 -2
  401. package/src/Table/BaseTable.tsx +6 -3
  402. package/src/Table/Table.doc.mjs +6 -1
  403. package/src/Table/Table.test.tsx +132 -14
  404. package/src/Table/TableBody.doc.mjs +40 -0
  405. package/src/Table/TableFooter.doc.mjs +40 -0
  406. package/src/Table/TableHeader.doc.mjs +40 -0
  407. package/src/Table/TableRow.tsx +16 -5
  408. package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
  409. package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
  410. package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
  411. package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
  412. package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
  413. package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
  414. package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
  415. package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
  416. package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
  417. package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
  418. package/src/Table/types.ts +22 -4
  419. package/src/Table/useBaseTablePlugins.ts +5 -0
  420. package/src/Table/useTableGroupedRows.doc.mjs +5 -4
  421. package/src/Table/useTablePagination.doc.mjs +7 -0
  422. package/src/Table/useTableRowStatus.doc.mjs +1 -1
  423. package/src/Table/useTableSelection.doc.mjs +31 -0
  424. package/src/Text/Text.test.tsx +23 -1
  425. package/src/Text/Text.tsx +6 -2
  426. package/src/TextArea/TextArea.tsx +3 -2
  427. package/src/TextInput/TextInput.doc.mjs +10 -0
  428. package/src/TextInput/TextInput.tsx +3 -2
  429. package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
  430. package/src/TimeInput/TimeInput.tsx +2 -2
  431. package/src/Timestamp/Timestamp.tsx +4 -2
  432. package/src/Toast/Toast.doc.mjs +6 -0
  433. package/src/Token/TokenLink.tsx +2 -2
  434. package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
  435. package/src/Tokenizer/Tokenizer.tsx +4 -0
  436. package/src/Toolbar/Toolbar.doc.mjs +5 -0
  437. package/src/Tooltip/Tooltip.doc.mjs +5 -0
  438. package/src/Tooltip/Tooltip.test.tsx +32 -0
  439. package/src/Tooltip/Tooltip.tsx +5 -0
  440. package/src/Tooltip/useTooltip.tsx +47 -24
  441. package/src/TopNav/TopNavHeading.tsx +3 -2
  442. package/src/TopNav/TopNavMegaMenu.tsx +3 -2
  443. package/src/TopNav/TopNavMenu.tsx +4 -3
  444. package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
  445. package/src/Typeahead/BaseTypeahead.tsx +85 -33
  446. package/src/Typeahead/Typeahead.doc.mjs +5 -0
  447. package/src/Typeahead/Typeahead.test.tsx +49 -0
  448. package/src/Typeahead/Typeahead.tsx +3 -2
  449. package/src/hooks/index.ts +2 -0
  450. package/src/hooks/useContainerReveal.doc.mjs +2 -2
  451. package/src/hooks/useFocusTrap.test.tsx +14 -0
  452. package/src/hooks/useFocusTrap.ts +62 -111
  453. package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
  454. package/src/hooks/useHotkeys.ts +3 -18
  455. package/src/hooks/useMergedRefs.doc.mjs +79 -0
  456. package/src/hooks/useMergedRefs.test.tsx +62 -0
  457. package/src/hooks/useMergedRefs.ts +36 -0
  458. package/src/index.ts +1 -0
  459. package/src/theme/MediaTheme.doc.mjs +5 -5
  460. package/src/utils/groupItems.ts +12 -6
  461. package/src/utils/index.ts +1 -1
  462. package/src/utils/isApplePlatform.test.ts +61 -0
  463. package/src/utils/isApplePlatform.ts +37 -0
  464. package/src/utils/sharedResizeObserver.ts +10 -2
  465. package/src/utils/timeParser.test.ts +6 -1
  466. package/src/utils/timeParser.ts +35 -13
  467. 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":"AA+BA;;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;AA0ED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAkClD"}
@@ -18,13 +18,15 @@
18
18
  * unless a hotkey opts in via `allowInInputs`.
19
19
  *
20
20
  * Platform-aware: `mod` maps to metaKey (⌘) on Apple platforms and
21
- * ctrlKey elsewhere — mirrors the detection used by Kbd.
21
+ * ctrlKey elsewhere, through the same isApplePlatform util Kbd reads, so
22
+ * displayed and handled shortcuts cannot disagree.
22
23
  *
23
24
  * SYNC: When modified, update:
24
25
  * - /packages/core/src/hooks/index.ts
25
26
  * - /packages/core/src/hooks/useHotkeys.doc.mjs
26
27
  */
27
28
  import { useEffect, useRef } from 'react';
29
+ import { isApplePlatform } from "../utils/isApplePlatform.js";
28
30
 
29
31
  /**
30
32
  * A single keyboard shortcut registration.
@@ -42,23 +44,6 @@ const KEY_ALIASES = {
42
44
  plus: '+'
43
45
  };
44
46
 
45
- /**
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).
49
- * Mirrors the detection used by Kbd so displayed and handled shortcuts agree.
50
- */
51
- function isApplePlatform() {
52
- if (typeof navigator === 'undefined') {
53
- return false;
54
- }
55
- const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
56
- if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
57
- return /mac/i.test(uaData.platform ?? '');
58
- }
59
- return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
60
- }
61
-
62
47
  /**
63
48
  * Whether the event target is a typing surface where global shortcuts
64
49
  * should stay silent by default.
@@ -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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @file isApplePlatform.ts
3
+ * @input Reads navigator.userAgentData.platform and navigator.platform
4
+ * @output Exports isApplePlatform
5
+ * @position Internal util; the single platform detection behind useHotkeys and Kbd
6
+ *
7
+ * Deliberately absent from utils/index.ts: packages/core/src/index.ts does
8
+ * `export * from './utils'`, so naming it there would publish it as API.
9
+ * Import it by path, as interactionModality is imported.
10
+ */
11
+ /**
12
+ * Detects whether the current platform is macOS/iOS.
13
+ * Prefers the User-Agent Client Hints API when it names a platform (modern
14
+ * Chrome/Edge), falls back to navigator.platform (deprecated but universally
15
+ * supported) when it names none.
16
+ */
17
+ export declare function isApplePlatform(): boolean;
18
+ //# sourceMappingURL=isApplePlatform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isApplePlatform.d.ts","sourceRoot":"","sources":["../../src/utils/isApplePlatform.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAiBzC"}
@@ -0,0 +1,37 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * @file isApplePlatform.ts
5
+ * @input Reads navigator.userAgentData.platform and navigator.platform
6
+ * @output Exports isApplePlatform
7
+ * @position Internal util; the single platform detection behind useHotkeys and Kbd
8
+ *
9
+ * Deliberately absent from utils/index.ts: packages/core/src/index.ts does
10
+ * `export * from './utils'`, so naming it there would publish it as API.
11
+ * Import it by path, as interactionModality is imported.
12
+ */
13
+
14
+ /**
15
+ * Detects whether the current platform is macOS/iOS.
16
+ * Prefers the User-Agent Client Hints API when it names a platform (modern
17
+ * Chrome/Edge), falls back to navigator.platform (deprecated but universally
18
+ * supported) when it names none.
19
+ */
20
+ export function isApplePlatform() {
21
+ if (typeof navigator === 'undefined') {
22
+ return false;
23
+ }
24
+ const uaData = 'userAgentData' in navigator ? navigator.userAgentData : null;
25
+ if (uaData && typeof uaData === 'object' && 'platform' in uaData) {
26
+ const uaPlatform = uaData.platform;
27
+ const named = typeof uaPlatform === 'string' ? uaPlatform.trim() : '';
28
+ // A value that names nothing is no answer, not a negative one: builds that
29
+ // rewrite their client-hints identity ship '', and 'Unknown' is the spec's
30
+ // own sentinel for "cannot say". Both fall through rather than reading as
31
+ // "not Apple".
32
+ if (named !== '' && named.toLowerCase() !== 'unknown') {
33
+ return /mac/i.test(named);
34
+ }
35
+ }
36
+ return /Mac|iPhone|iPad|iPod/.test(navigator.platform ?? '');
37
+ }
@@ -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);