@ultraviolet/ui 3.0.0-beta.27 → 3.0.0-beta.29

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 (323) hide show
  1. package/README.md +47 -18
  2. package/dist/components/ActionBar/index.js +19 -7
  3. package/dist/components/Alert/index.d.ts +2 -1
  4. package/dist/components/Alert/index.js +98 -20
  5. package/dist/components/Alert/styles.css.d.ts +10 -1
  6. package/dist/components/Alert/styles.css.js +7 -5
  7. package/dist/components/Avatar/index.d.ts +1 -1
  8. package/dist/components/Avatar/index.js +46 -36
  9. package/dist/components/Avatar/styles.css.js +0 -1
  10. package/dist/components/Avatar/variables.css.js +1 -0
  11. package/dist/components/Badge/index.d.ts +1 -1
  12. package/dist/components/Badge/index.js +19 -8
  13. package/dist/components/Banner/index.d.ts +1 -1
  14. package/dist/components/Banner/index.js +87 -28
  15. package/dist/components/BarChart/Tooltip.d.ts +1 -1
  16. package/dist/components/BarChart/Tooltip.js +23 -10
  17. package/dist/components/BarChart/index.d.ts +1 -1
  18. package/dist/components/BarChart/index.js +51 -31
  19. package/dist/components/BarStack/index.d.ts +1 -1
  20. package/dist/components/BarStack/index.js +64 -19
  21. package/dist/components/Breadcrumbs/components/Item.d.ts +1 -1
  22. package/dist/components/Breadcrumbs/components/Item.js +48 -12
  23. package/dist/components/Breadcrumbs/index.js +11 -2
  24. package/dist/components/Bullet/index.d.ts +1 -1
  25. package/dist/components/Bullet/index.js +10 -7
  26. package/dist/components/Button/index.js +122 -72
  27. package/dist/components/Card/index.js +80 -20
  28. package/dist/components/Carousel/index.d.ts +3 -3
  29. package/dist/components/Carousel/index.js +72 -26
  30. package/dist/components/Checkbox/index.js +139 -43
  31. package/dist/components/CheckboxGroup/index.d.ts +3 -3
  32. package/dist/components/CheckboxGroup/index.js +77 -24
  33. package/dist/components/Chip/ChipIcon.d.ts +1 -1
  34. package/dist/components/Chip/ChipIcon.js +46 -12
  35. package/dist/components/Chip/index.d.ts +3 -3
  36. package/dist/components/Chip/index.js +36 -11
  37. package/dist/components/CopyButton/index.d.ts +1 -1
  38. package/dist/components/CopyButton/index.js +23 -8
  39. package/dist/components/DateInput/components/CalendarContent.d.ts +1 -1
  40. package/dist/components/DateInput/components/CalendarContent.js +61 -26
  41. package/dist/components/DateInput/components/CalendarDaily.d.ts +1 -1
  42. package/dist/components/DateInput/components/CalendarDaily.js +105 -62
  43. package/dist/components/DateInput/components/CalendarMonthly.d.ts +1 -1
  44. package/dist/components/DateInput/components/CalendarMonthly.js +62 -39
  45. package/dist/components/DateInput/components/Popup.d.ts +1 -1
  46. package/dist/components/DateInput/components/Popup.js +29 -6
  47. package/dist/components/DateInput/helpers.js +9 -2
  48. package/dist/components/DateInput/helpersLocale.js +3 -9
  49. package/dist/components/DateInput/index.d.ts +1 -1
  50. package/dist/components/DateInput/index.js +193 -62
  51. package/dist/components/Dialog/Context.js +3 -1
  52. package/dist/components/Dialog/components/Button.d.ts +1 -1
  53. package/dist/components/Dialog/components/Button.js +12 -2
  54. package/dist/components/Dialog/components/Buttons.d.ts +1 -1
  55. package/dist/components/Dialog/components/Buttons.js +1 -1
  56. package/dist/components/Dialog/components/CancelButton.d.ts +1 -1
  57. package/dist/components/Dialog/components/CancelButton.js +12 -2
  58. package/dist/components/Dialog/components/Stack.d.ts +1 -1
  59. package/dist/components/Dialog/components/Stack.js +2 -5
  60. package/dist/components/Dialog/components/Text.d.ts +1 -1
  61. package/dist/components/Dialog/components/Text.js +2 -5
  62. package/dist/components/Dialog/index.d.ts +7 -7
  63. package/dist/components/Dialog/index.js +43 -12
  64. package/dist/components/Drawer/index.d.ts +4 -4
  65. package/dist/components/Drawer/index.js +53 -15
  66. package/dist/components/EmptyState/index.d.ts +1 -1
  67. package/dist/components/EmptyState/index.js +63 -21
  68. package/dist/components/Expandable/index.d.ts +2 -2
  69. package/dist/components/Expandable/index.js +52 -15
  70. package/dist/components/ExpandableCard/components/Title.d.ts +1 -1
  71. package/dist/components/ExpandableCard/components/Title.js +12 -2
  72. package/dist/components/ExpandableCard/index.d.ts +1 -1
  73. package/dist/components/ExpandableCard/index.js +197 -96
  74. package/dist/components/GlobalAlert/GlobalAlertLink.d.ts +1 -1
  75. package/dist/components/GlobalAlert/GlobalAlertLink.js +21 -5
  76. package/dist/components/GlobalAlert/index.d.ts +2 -2
  77. package/dist/components/GlobalAlert/index.js +51 -11
  78. package/dist/components/InfiniteScroll/index.d.ts +1 -1
  79. package/dist/components/InfiniteScroll/index.js +40 -33
  80. package/dist/components/Key/index.d.ts +1 -1
  81. package/dist/components/Key/index.js +29 -8
  82. package/dist/components/Label/index.d.ts +1 -1
  83. package/dist/components/Label/index.js +67 -6
  84. package/dist/components/LineChart/CustomLegend.d.ts +1 -1
  85. package/dist/components/LineChart/CustomLegend.js +69 -45
  86. package/dist/components/LineChart/Tooltip.d.ts +1 -1
  87. package/dist/components/LineChart/Tooltip.js +31 -9
  88. package/dist/components/LineChart/helpers.js +13 -12
  89. package/dist/components/LineChart/index.d.ts +1 -1
  90. package/dist/components/LineChart/index.js +56 -40
  91. package/dist/components/Link/index.js +74 -57
  92. package/dist/components/List/Cell.js +24 -22
  93. package/dist/components/List/ColumnProvider.d.ts +1 -1
  94. package/dist/components/List/ColumnProvider.js +12 -6
  95. package/dist/components/List/HeaderCell.d.ts +1 -1
  96. package/dist/components/List/HeaderCell.js +36 -19
  97. package/dist/components/List/HeaderRow.d.ts +1 -1
  98. package/dist/components/List/HeaderRow.js +14 -12
  99. package/dist/components/List/ListContext.d.ts +1 -1
  100. package/dist/components/List/ListContext.js +128 -78
  101. package/dist/components/List/Row.js +166 -90
  102. package/dist/components/List/SelectBar.d.ts +1 -1
  103. package/dist/components/List/SelectBar.js +20 -10
  104. package/dist/components/List/SkeletonRows.d.ts +1 -1
  105. package/dist/components/List/SkeletonRows.js +26 -16
  106. package/dist/components/List/index.d.ts +1 -1
  107. package/dist/components/List/index.js +60 -22
  108. package/dist/components/Loader/index.d.ts +1 -1
  109. package/dist/components/Loader/index.js +47 -23
  110. package/dist/components/Menu/MenuContent.d.ts +1 -1
  111. package/dist/components/Menu/MenuContent.js +216 -162
  112. package/dist/components/Menu/MenuProvider.d.ts +1 -1
  113. package/dist/components/Menu/MenuProvider.js +26 -13
  114. package/dist/components/Menu/components/Group.d.ts +1 -1
  115. package/dist/components/Menu/components/Group.js +11 -2
  116. package/dist/components/Menu/components/Item.js +144 -82
  117. package/dist/components/Menu/helpers.js +3 -1
  118. package/dist/components/Menu/index.d.ts +2 -2
  119. package/dist/components/Menu/index.js +5 -11
  120. package/dist/components/Menu/types.d.ts +2 -2
  121. package/dist/components/Meter/index.d.ts +1 -1
  122. package/dist/components/Meter/index.js +43 -12
  123. package/dist/components/Modal/ModalContent.d.ts +1 -1
  124. package/dist/components/Modal/ModalContent.js +41 -11
  125. package/dist/components/Modal/ModalProvider.d.ts +1 -1
  126. package/dist/components/Modal/ModalProvider.js +14 -11
  127. package/dist/components/Modal/components/Dialog.js +91 -47
  128. package/dist/components/Modal/index.d.ts +1 -1
  129. package/dist/components/Modal/index.js +60 -3
  130. package/dist/components/Notice/index.d.ts +1 -1
  131. package/dist/components/Notice/index.js +24 -5
  132. package/dist/components/Notification/Notification.js +12 -2
  133. package/dist/components/Notification/NotificationContainer.d.ts +1 -1
  134. package/dist/components/Notification/NotificationContainer.js +18 -2
  135. package/dist/components/NumberInput/index.d.ts +1 -1
  136. package/dist/components/NumberInput/index.js +239 -130
  137. package/dist/components/Pagination/PaginationButtons.d.ts +1 -1
  138. package/dist/components/Pagination/PaginationButtons.js +75 -10
  139. package/dist/components/Pagination/PerPage.d.ts +1 -1
  140. package/dist/components/Pagination/PerPage.js +32 -17
  141. package/dist/components/Pagination/getPageNumbers.js +12 -13
  142. package/dist/components/Pagination/index.d.ts +1 -1
  143. package/dist/components/Pagination/index.js +26 -3
  144. package/dist/components/PasswordCheck/index.d.ts +1 -1
  145. package/dist/components/PasswordCheck/index.js +27 -5
  146. package/dist/components/PieChart/Legends.d.ts +1 -1
  147. package/dist/components/PieChart/Legends.js +52 -20
  148. package/dist/components/PieChart/Tooltip.d.ts +1 -1
  149. package/dist/components/PieChart/Tooltip.js +2 -4
  150. package/dist/components/PieChart/index.d.ts +1 -1
  151. package/dist/components/PieChart/index.js +80 -40
  152. package/dist/components/Popover/index.js +104 -46
  153. package/dist/components/Popup/helpers.d.ts +5 -1
  154. package/dist/components/Popup/helpers.js +49 -35
  155. package/dist/components/Popup/index.d.ts +2 -1
  156. package/dist/components/Popup/index.js +373 -255
  157. package/dist/components/Popup/styles.css.js +0 -1
  158. package/dist/components/Popup/variables.css.js +1 -0
  159. package/dist/components/ProgressBar/index.d.ts +1 -1
  160. package/dist/components/ProgressBar/index.js +74 -20
  161. package/dist/components/Radio/index.js +83 -51
  162. package/dist/components/RadioGroup/index.d.ts +2 -2
  163. package/dist/components/RadioGroup/index.js +74 -20
  164. package/dist/components/Row/index.d.ts +1 -1
  165. package/dist/components/Row/index.js +38 -27
  166. package/dist/components/Row/styles.css.d.ts +11 -0
  167. package/dist/components/Row/styles.css.js +2 -2
  168. package/dist/components/SearchInput/KeyGroup.d.ts +1 -1
  169. package/dist/components/SearchInput/KeyGroup.js +2 -6
  170. package/dist/components/SearchInput/index.js +232 -164
  171. package/dist/components/SelectInput/SelectInputProvider.d.ts +1 -1
  172. package/dist/components/SelectInput/SelectInputProvider.js +91 -55
  173. package/dist/components/SelectInput/components/Dropdown.d.ts +1 -1
  174. package/dist/components/SelectInput/components/Dropdown.js +442 -101
  175. package/dist/components/SelectInput/components/DropdownOption.d.ts +1 -1
  176. package/dist/components/SelectInput/components/DropdownOption.js +176 -27
  177. package/dist/components/SelectInput/components/SearchBarDropdown.d.ts +1 -1
  178. package/dist/components/SelectInput/components/SearchBarDropdown.js +40 -14
  179. package/dist/components/SelectInput/components/SelectBar.d.ts +1 -1
  180. package/dist/components/SelectInput/components/SelectBar.js +252 -97
  181. package/dist/components/SelectInput/index.d.ts +1 -1
  182. package/dist/components/SelectInput/index.js +102 -10
  183. package/dist/components/SelectableCard/index.js +200 -114
  184. package/dist/components/SelectableCardGroup/index.d.ts +2 -2
  185. package/dist/components/SelectableCardGroup/index.js +67 -25
  186. package/dist/components/SelectableCardOptionGroup/Provider.js +3 -1
  187. package/dist/components/SelectableCardOptionGroup/components/Image.d.ts +1 -1
  188. package/dist/components/SelectableCardOptionGroup/components/Image.js +12 -8
  189. package/dist/components/SelectableCardOptionGroup/components/Option.d.ts +1 -1
  190. package/dist/components/SelectableCardOptionGroup/components/Option.js +96 -19
  191. package/dist/components/SelectableCardOptionGroup/index.d.ts +2 -2
  192. package/dist/components/SelectableCardOptionGroup/index.js +53 -17
  193. package/dist/components/Separator/index.d.ts +1 -1
  194. package/dist/components/Separator/index.js +43 -26
  195. package/dist/components/Skeleton/Block.d.ts +1 -1
  196. package/dist/components/Skeleton/Block.js +2 -6
  197. package/dist/components/Skeleton/Blocks.d.ts +1 -1
  198. package/dist/components/Skeleton/Blocks.js +14 -9
  199. package/dist/components/Skeleton/BoxWithIcon.d.ts +1 -1
  200. package/dist/components/Skeleton/BoxWithIcon.js +14 -9
  201. package/dist/components/Skeleton/Donut.d.ts +1 -1
  202. package/dist/components/Skeleton/Donut.js +10 -2
  203. package/dist/components/Skeleton/IconSkeleton.d.ts +1 -1
  204. package/dist/components/Skeleton/IconSkeleton.js +1 -1
  205. package/dist/components/Skeleton/Line.d.ts +1 -1
  206. package/dist/components/Skeleton/Line.js +10 -4
  207. package/dist/components/Skeleton/List.d.ts +1 -1
  208. package/dist/components/Skeleton/List.js +3 -9
  209. package/dist/components/Skeleton/Slider.d.ts +1 -1
  210. package/dist/components/Skeleton/Slider.js +11 -8
  211. package/dist/components/Skeleton/Square.d.ts +1 -1
  212. package/dist/components/Skeleton/Square.js +1 -1
  213. package/dist/components/Skeleton/index.d.ts +9 -9
  214. package/dist/components/Skeleton/index.js +16 -5
  215. package/dist/components/Slider/components/DoubleSlider.d.ts +1 -1
  216. package/dist/components/Slider/components/DoubleSlider.js +191 -88
  217. package/dist/components/Slider/components/Options.d.ts +1 -1
  218. package/dist/components/Slider/components/Options.js +44 -28
  219. package/dist/components/Slider/components/SingleSlider.d.ts +1 -1
  220. package/dist/components/Slider/components/SingleSlider.js +133 -53
  221. package/dist/components/Slider/index.d.ts +1 -1
  222. package/dist/components/Slider/index.js +82 -12
  223. package/dist/components/Snippet/index.d.ts +1 -1
  224. package/dist/components/Snippet/index.js +103 -19
  225. package/dist/components/Stack/index.d.ts +1 -1
  226. package/dist/components/Stack/index.js +20 -24
  227. package/dist/components/Stack/styles.css.js +2 -2
  228. package/dist/components/Status/index.d.ts +1 -1
  229. package/dist/components/Status/index.js +13 -11
  230. package/dist/components/StepList/index.d.ts +2 -2
  231. package/dist/components/StepList/index.js +31 -10
  232. package/dist/components/Stepper/Step.d.ts +1 -1
  233. package/dist/components/Stepper/Step.js +65 -30
  234. package/dist/components/Stepper/StepperProvider.d.ts +1 -1
  235. package/dist/components/Stepper/StepperProvider.js +13 -10
  236. package/dist/components/Stepper/index.d.ts +2 -2
  237. package/dist/components/Stepper/index.js +46 -26
  238. package/dist/components/SwitchButton/FocusOverlay.d.ts +1 -1
  239. package/dist/components/SwitchButton/FocusOverlay.js +11 -5
  240. package/dist/components/SwitchButton/Option.d.ts +1 -1
  241. package/dist/components/SwitchButton/Option.js +20 -2
  242. package/dist/components/SwitchButton/index.d.ts +2 -2
  243. package/dist/components/SwitchButton/index.js +95 -48
  244. package/dist/components/Table/Body.d.ts +1 -1
  245. package/dist/components/Table/Body.js +2 -4
  246. package/dist/components/Table/Cell.d.ts +1 -1
  247. package/dist/components/Table/Cell.js +20 -17
  248. package/dist/components/Table/Header.d.ts +1 -1
  249. package/dist/components/Table/Header.js +2 -4
  250. package/dist/components/Table/HeaderCell.d.ts +1 -1
  251. package/dist/components/Table/HeaderCell.js +46 -22
  252. package/dist/components/Table/HeaderRow.d.ts +1 -1
  253. package/dist/components/Table/HeaderRow.js +21 -12
  254. package/dist/components/Table/Row.d.ts +1 -1
  255. package/dist/components/Table/Row.js +70 -14
  256. package/dist/components/Table/SelectBar.d.ts +1 -1
  257. package/dist/components/Table/SelectBar.js +20 -10
  258. package/dist/components/Table/SkeletonRows.d.ts +1 -1
  259. package/dist/components/Table/SkeletonRows.js +17 -16
  260. package/dist/components/Table/TableContext.d.ts +1 -1
  261. package/dist/components/Table/TableContext.js +22 -13
  262. package/dist/components/Table/index.d.ts +6 -6
  263. package/dist/components/Table/index.js +64 -23
  264. package/dist/components/Tabs/Tab.js +79 -41
  265. package/dist/components/Tabs/TabMenu.js +39 -23
  266. package/dist/components/Tabs/TabMenuItem.d.ts +1 -1
  267. package/dist/components/Tabs/TabMenuItem.js +20 -11
  268. package/dist/components/Tabs/TabsContext.js +3 -1
  269. package/dist/components/Tabs/index.d.ts +3 -3
  270. package/dist/components/Tabs/index.js +34 -14
  271. package/dist/components/Tag/index.d.ts +1 -1
  272. package/dist/components/Tag/index.js +45 -12
  273. package/dist/components/TagInput/index.d.ts +1 -1
  274. package/dist/components/TagInput/index.js +131 -52
  275. package/dist/components/TagInput/styles.css.d.ts +3 -0
  276. package/dist/components/TagList/index.d.ts +1 -1
  277. package/dist/components/TagList/index.js +132 -59
  278. package/dist/components/Text/index.d.ts +1 -1
  279. package/dist/components/Text/index.js +21 -17
  280. package/dist/components/TextArea/index.js +178 -103
  281. package/dist/components/TextInput/index.d.ts +1 -1
  282. package/dist/components/TextInput/index.js +286 -106
  283. package/dist/components/TimeInput/constants.js +1 -5
  284. package/dist/components/TimeInput/index.d.ts +1 -1
  285. package/dist/components/TimeInput/index.js +207 -118
  286. package/dist/components/Toaster/Toaster.js +1 -1
  287. package/dist/components/Toaster/ToasterContainer.d.ts +1 -1
  288. package/dist/components/Toaster/ToasterContainer.js +21 -2
  289. package/dist/components/Toaster/components/Button.d.ts +1 -1
  290. package/dist/components/Toaster/components/CloseButton.d.ts +1 -1
  291. package/dist/components/Toaster/components/CloseButton.js +12 -2
  292. package/dist/components/Toaster/components/Content.d.ts +1 -1
  293. package/dist/components/Toaster/components/Content.js +2 -4
  294. package/dist/components/Toaster/components/Link.d.ts +1 -1
  295. package/dist/components/Toaster/index.d.ts +2 -2
  296. package/dist/components/Toggle/index.js +101 -40
  297. package/dist/components/ToggleGroup/index.d.ts +3 -3
  298. package/dist/components/ToggleGroup/index.js +61 -22
  299. package/dist/components/Tooltip/index.d.ts +1 -1
  300. package/dist/components/Tooltip/index.js +42 -19
  301. package/dist/components/TreeMapChart/Tooltip.d.ts +1 -1
  302. package/dist/components/TreeMapChart/Tooltip.js +1 -1
  303. package/dist/components/TreeMapChart/index.d.ts +1 -1
  304. package/dist/components/TreeMapChart/index.js +33 -27
  305. package/dist/components/UnitInput/index.d.ts +1 -1
  306. package/dist/components/UnitInput/index.js +110 -29
  307. package/dist/components/VerificationCode/index.d.ts +1 -1
  308. package/dist/components/VerificationCode/index.js +80 -21
  309. package/dist/helpers/legend.js +4 -4
  310. package/dist/helpers/treeMap.d.ts +2 -1
  311. package/dist/index.d.ts +1 -1
  312. package/dist/index.js +2 -4
  313. package/dist/theme/ThemeProvider.d.ts +1 -1
  314. package/dist/theme/ThemeProvider.js +4 -2
  315. package/dist/theme/index.js +1 -8
  316. package/dist/ui.css +1 -1
  317. package/dist/utils/ids.js +1 -3
  318. package/dist/utils/index.d.ts +1 -1
  319. package/dist/utils/responsive/index.d.ts +0 -1
  320. package/dist/utils/responsive/style.css.d.ts +3 -0
  321. package/package.json +5 -10
  322. package/dist/utils/responsive/Breakpoint.d.ts +0 -9
  323. package/dist/utils/responsive/Breakpoint.js +0 -14
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "@emotion/react/jsx-runtime";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { assignInlineVars } from "@vanilla-extract/dynamic";
4
4
  import { forwardRef, useRef, useState, useId, isValidElement, useImperativeHandle, cloneElement, useCallback, useEffect, useMemo } from "react";
5
5
  import { Popup } from "../Popup/index.js";
@@ -9,175 +9,229 @@ import { searchChildren, getListItem } from "./helpers.js";
9
9
  import { useMenu, DisclosureContext } from "./MenuProvider.js";
10
10
  import { menu, menuList, menuContent, menuSearchInput, menuFooter, heightAvailableSpace, heightMenu } from "./styles.css.js";
11
11
  const SPACE_DISCLOSURE_POPUP = 24;
12
- const Menu = forwardRef(({
13
- id,
14
- ariaLabel = "Menu",
15
- children,
16
- disclosure,
17
- hasArrow = false,
18
- placement = "bottom",
19
- className,
20
- "data-testid": dataTestId,
21
- maxHeight,
22
- portalTarget = document.body,
23
- triggerMethod = "click",
24
- dynamicDomRendering,
25
- align,
26
- searchable = false,
27
- footer,
28
- noShrink = false,
29
- style
30
- }, ref) => {
31
- const {
32
- isVisible,
33
- setIsVisible,
34
- isNested,
35
- disclosureRef,
36
- menuRef,
37
- setShouldBeVisible,
38
- shouldBeVisible
39
- } = useMenu();
40
- const searchInputRef = useRef(null);
41
- const [localChild, setLocalChild] = useState(null);
42
- const [popupMaxHeight, setPopupMaxHeight] = useState(maxHeight ?? "30rem");
43
- const contentRef = useRef(null);
44
- const tempId = useId();
45
- const finalId = `menu-${id ?? tempId}`;
46
- const target = isValidElement(disclosure) ? disclosure : disclosure({
47
- visible: isVisible
48
- });
49
- const innerRef = useRef(target);
50
- useImperativeHandle(ref, () => innerRef.current);
51
- const finalDisclosure = cloneElement(target, {
52
- "aria-expanded": isVisible,
53
- "aria-haspopup": "dialog",
54
- onClick: (event) => {
55
- target.props.onClick?.(event);
56
- setIsVisible(!isVisible);
57
- },
58
- // @ts-expect-error not sure how to fix this
59
- ref: disclosureRef
60
- });
61
- const onSearch = useCallback((value) => {
62
- if (typeof children === "object") {
63
- setLocalChild(searchChildren(children, value));
64
- }
65
- }, [children]);
66
- useEffect(() => {
67
- let timeout;
68
- if (isVisible && searchable) {
69
- timeout = setTimeout(() => {
70
- searchInputRef.current?.focus();
71
- }, 50);
72
- }
73
- return () => {
74
- if (timeout) {
75
- clearTimeout(timeout);
76
- }
77
- };
78
- }, [isVisible, searchable]);
79
- useEffect(() => {
80
- if (disclosureRef.current && triggerMethod === "hover") {
81
- const handler = (value) => {
82
- setShouldBeVisible(value);
83
- };
84
- disclosureRef.current.addEventListener("focus", () => handler(true));
85
- disclosureRef.current.addEventListener("mouseenter", () => handler(true));
86
- disclosureRef.current.addEventListener("mouseleave", () => handler(false));
87
- disclosureRef.current.addEventListener("keydown", (event) => {
88
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
89
- handler(false);
12
+ const Menu = forwardRef(
13
+ ({
14
+ id,
15
+ ariaLabel = "Menu",
16
+ children,
17
+ disclosure,
18
+ hasArrow = false,
19
+ placement = "auto-bottom",
20
+ className,
21
+ "data-testid": dataTestId,
22
+ maxHeight,
23
+ portalTarget = document.body,
24
+ triggerMethod = "click",
25
+ dynamicDomRendering,
26
+ align,
27
+ searchable = false,
28
+ footer,
29
+ shrink,
30
+ style
31
+ }, ref) => {
32
+ const {
33
+ isVisible,
34
+ setIsVisible,
35
+ isNested,
36
+ disclosureRef,
37
+ menuRef,
38
+ setShouldBeVisible,
39
+ shouldBeVisible
40
+ } = useMenu();
41
+ const searchInputRef = useRef(null);
42
+ const [localChild, setLocalChild] = useState(null);
43
+ const [popupMaxHeight, setPopupMaxHeight] = useState(
44
+ maxHeight ?? "30rem"
45
+ );
46
+ const contentRef = useRef(null);
47
+ const tempId = useId();
48
+ const finalId = `menu-${id ?? tempId}`;
49
+ const target = isValidElement(
50
+ disclosure
51
+ ) ? disclosure : disclosure({ visible: isVisible });
52
+ const innerRef = useRef(target);
53
+ useImperativeHandle(ref, () => innerRef.current);
54
+ const finalDisclosure = cloneElement(target, {
55
+ "aria-expanded": isVisible,
56
+ "aria-haspopup": "dialog",
57
+ onClick: (event) => {
58
+ target.props.onClick?.(event);
59
+ setIsVisible(!isVisible);
60
+ },
61
+ // @ts-expect-error not sure how to fix this
62
+ ref: disclosureRef
63
+ });
64
+ const onSearch = useCallback(
65
+ (value) => {
66
+ if (typeof children === "object") {
67
+ setLocalChild(searchChildren(children, value));
90
68
  }
91
- });
69
+ },
70
+ [children]
71
+ );
72
+ useEffect(() => {
73
+ let timeout;
74
+ if (isVisible && searchable) {
75
+ timeout = setTimeout(() => {
76
+ searchInputRef.current?.focus();
77
+ }, 50);
78
+ }
92
79
  return () => {
93
- window.removeEventListener("focus", () => handler(void 0));
94
- window.removeEventListener("mouseenter", () => handler(void 0));
95
- window.removeEventListener("mouseleave", () => handler(void 0));
96
- window.removeEventListener("keydown", () => handler(void 0));
80
+ if (timeout) {
81
+ clearTimeout(timeout);
82
+ }
97
83
  };
98
- }
99
- return void 0;
100
- }, [setShouldBeVisible, disclosureRef, triggerMethod]);
101
- const finalChild = useMemo(() => {
102
- if (typeof children === "function") {
103
- return children({
104
- toggle: () => setIsVisible(!isVisible)
105
- });
106
- }
107
- if (searchable && localChild) {
108
- return localChild;
109
- }
110
- return children;
111
- }, [children, isVisible, localChild, searchable, setIsVisible]);
112
- const handleTabOpen = (event) => {
113
- if (contentRef.current) {
114
- const listItem = getListItem([...contentRef.current.children]);
115
- if (listItem && isVisible && ["Tab", "ArrowDown"].includes(event.key)) {
116
- event?.preventDefault();
117
- listItem[0]?.focus();
84
+ }, [isVisible, searchable]);
85
+ useEffect(() => {
86
+ if (disclosureRef.current && triggerMethod === "hover") {
87
+ const handler = (value) => {
88
+ setShouldBeVisible(value);
89
+ };
90
+ disclosureRef.current.addEventListener("focus", () => handler(true));
91
+ disclosureRef.current.addEventListener(
92
+ "mouseenter",
93
+ () => handler(true)
94
+ );
95
+ disclosureRef.current.addEventListener(
96
+ "mouseleave",
97
+ () => handler(false)
98
+ );
99
+ disclosureRef.current.addEventListener("keydown", (event) => {
100
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
101
+ handler(false);
102
+ }
103
+ });
104
+ return () => {
105
+ window.removeEventListener("focus", () => handler(void 0));
106
+ window.removeEventListener("mouseenter", () => handler(void 0));
107
+ window.removeEventListener("mouseleave", () => handler(void 0));
108
+ window.removeEventListener("keydown", () => handler(void 0));
109
+ };
118
110
  }
119
- }
120
- };
121
- const handleKeyDown = (event) => {
122
- if (contentRef.current) {
123
- const listItem = getListItem([...contentRef.current.children]);
124
- if (listItem) {
125
- const currentElement = listItem.find((item) => item === document.activeElement);
126
- if (currentElement) {
127
- if (event.key === "ArrowDown") {
128
- event.preventDefault();
129
- const indexOfCurrent = listItem.indexOf(currentElement);
130
- if (indexOfCurrent < listItem.length - 1) {
131
- listItem[indexOfCurrent + 1].focus();
132
- } else {
133
- listItem[0].focus();
134
- }
135
- } else if (event.key === "ArrowUp") {
136
- event.preventDefault();
137
- const indexOfCurrent = listItem.indexOf(currentElement);
138
- if (indexOfCurrent > 0) {
139
- listItem[indexOfCurrent - 1].focus();
140
- } else {
141
- listItem[listItem.length - 1].focus();
111
+ return void 0;
112
+ }, [setShouldBeVisible, disclosureRef, triggerMethod]);
113
+ const finalChild = useMemo(() => {
114
+ if (typeof children === "function") {
115
+ return children({ toggle: () => setIsVisible(!isVisible) });
116
+ }
117
+ if (searchable && localChild) {
118
+ return localChild;
119
+ }
120
+ return children;
121
+ }, [children, isVisible, localChild, searchable, setIsVisible]);
122
+ const handleTabOpen = (event) => {
123
+ if (contentRef.current) {
124
+ const listItem = getListItem([...contentRef.current.children]);
125
+ if (listItem && isVisible && ["Tab", "ArrowDown"].includes(event.key)) {
126
+ event?.preventDefault();
127
+ listItem[0]?.focus();
128
+ }
129
+ }
130
+ };
131
+ const handleKeyDown = (event) => {
132
+ if (contentRef.current) {
133
+ const listItem = getListItem([...contentRef.current.children]);
134
+ if (listItem) {
135
+ const currentElement = listItem.find(
136
+ (item) => item === document.activeElement
137
+ );
138
+ if (currentElement) {
139
+ if (event.key === "ArrowDown") {
140
+ event.preventDefault();
141
+ const indexOfCurrent = listItem.indexOf(currentElement);
142
+ if (indexOfCurrent < listItem.length - 1) {
143
+ listItem[indexOfCurrent + 1].focus();
144
+ } else {
145
+ listItem[0].focus();
146
+ }
147
+ } else if (event.key === "ArrowUp") {
148
+ event.preventDefault();
149
+ const indexOfCurrent = listItem.indexOf(currentElement);
150
+ if (indexOfCurrent > 0) {
151
+ listItem[indexOfCurrent - 1].focus();
152
+ } else {
153
+ listItem.at(-1)?.focus();
154
+ }
155
+ } else if (event.key === "ArrowLeft" && triggerMethod === "hover") {
156
+ disclosureRef.current?.focus();
157
+ setShouldBeVisible(void 0);
142
158
  }
143
- } else if (event.key === "ArrowLeft" && triggerMethod === "hover") {
144
- disclosureRef.current?.focus();
145
- setShouldBeVisible(void 0);
146
159
  }
147
160
  }
148
161
  }
149
- }
150
- };
151
- useEffect(() => {
152
- if (disclosureRef.current && placement === "bottom" && !noShrink) {
153
- const disclosureRect = disclosureRef.current.getBoundingClientRect();
154
- const disclosureBottom = disclosureRect.bottom;
155
- const targetSize = portalTarget.getBoundingClientRect().bottom;
156
- const availableSpace = targetSize - disclosureBottom - SPACE_DISCLOSURE_POPUP;
157
- setPopupMaxHeight(`${availableSpace}px`);
158
- }
159
- }, [isVisible, portalTarget, disclosureRef, placement, noShrink]);
160
- return /* @__PURE__ */ jsx(Popup, { align, "aria-label": ariaLabel, className: `${className ? `${className} ` : ""}${menu({
161
- arrow: hasArrow,
162
- searchable
163
- })}`, debounceDelay: triggerMethod === "hover" ? 250 : 0, dynamicDomRendering, hasArrow, hideOnClickOutside: true, id: finalId, maxHeight: maxHeight ?? "fit-content", onClose: () => {
164
- setIsVisible(false);
165
- setLocalChild(null);
166
- if (triggerMethod === "click") {
167
- disclosureRef.current?.focus();
168
- }
169
- setShouldBeVisible(void 0);
170
- }, onKeyDown: handleTabOpen, placement: isNested ? "nested-menu" : placement, portalTarget, ref: menuRef, role: "dialog", style, tabIndex: -1, text: /* @__PURE__ */ jsxs(Stack, { className: `${className ? `${className} ` : ""}${menuList}`, "data-testid": dataTestId, onKeyDown: handleKeyDown, onMouseEnter: () => setShouldBeVisible(true), onMouseLeave: () => setShouldBeVisible(false), role: "menu", style: assignInlineVars({
171
- [heightMenu]: maxHeight ?? "30rem",
172
- [heightAvailableSpace]: popupMaxHeight
173
- }), children: [
174
- /* @__PURE__ */ jsxs(Stack, { className: menuContent, ref: contentRef, children: [
175
- searchable && typeof children !== "function" ? /* @__PURE__ */ jsx(SearchInput, { className: menuSearchInput, onSearch, ref: searchInputRef, size: "small" }) : null,
176
- finalChild
177
- ] }),
178
- footer ? /* @__PURE__ */ jsx(Stack, { className: menuFooter, children: footer }) : null
179
- ] }), visible: triggerMethod === "click" ? isVisible : shouldBeVisible, children: /* @__PURE__ */ jsx(DisclosureContext.Provider, { value: true, children: finalDisclosure }) });
180
- });
162
+ };
163
+ useEffect(() => {
164
+ if (disclosureRef.current && placement === "bottom" && shrink) {
165
+ const disclosureRect = disclosureRef.current.getBoundingClientRect();
166
+ const disclosureBottom = disclosureRect.bottom;
167
+ const targetSize = portalTarget.getBoundingClientRect().bottom;
168
+ const availableSpace = targetSize - disclosureBottom - SPACE_DISCLOSURE_POPUP;
169
+ setPopupMaxHeight(`${availableSpace}px`);
170
+ }
171
+ }, [isVisible, portalTarget, disclosureRef, placement, shrink]);
172
+ return /* @__PURE__ */ jsx(
173
+ Popup,
174
+ {
175
+ align,
176
+ "aria-label": ariaLabel,
177
+ className: `${className ? `${className} ` : ""}${menu({ arrow: hasArrow, searchable })}`,
178
+ debounceDelay: triggerMethod === "hover" ? 250 : 0,
179
+ dynamicDomRendering,
180
+ hasArrow,
181
+ hideOnClickOutside: true,
182
+ id: finalId,
183
+ maxHeight: maxHeight ?? "fit-content",
184
+ onClose: () => {
185
+ setIsVisible(false);
186
+ setLocalChild(null);
187
+ if (triggerMethod === "click") {
188
+ disclosureRef.current?.focus();
189
+ }
190
+ setShouldBeVisible(void 0);
191
+ },
192
+ onKeyDown: handleTabOpen,
193
+ placement: isNested ? "nested-menu" : placement,
194
+ portalTarget,
195
+ ref: menuRef,
196
+ role: "dialog",
197
+ style,
198
+ tabIndex: -1,
199
+ text: /* @__PURE__ */ jsxs(
200
+ Stack,
201
+ {
202
+ className: `${className ? `${className} ` : ""}${menuList}`,
203
+ "data-testid": dataTestId,
204
+ onKeyDown: handleKeyDown,
205
+ onMouseEnter: () => setShouldBeVisible(true),
206
+ onMouseLeave: () => setShouldBeVisible(false),
207
+ role: "menu",
208
+ style: assignInlineVars({
209
+ [heightMenu]: maxHeight ?? "30rem",
210
+ [heightAvailableSpace]: popupMaxHeight
211
+ }),
212
+ children: [
213
+ /* @__PURE__ */ jsxs(Stack, { className: menuContent, ref: contentRef, children: [
214
+ searchable && typeof children !== "function" ? /* @__PURE__ */ jsx(
215
+ SearchInput,
216
+ {
217
+ className: menuSearchInput,
218
+ onSearch,
219
+ ref: searchInputRef,
220
+ size: "small"
221
+ }
222
+ ) : null,
223
+ finalChild
224
+ ] }),
225
+ footer ? /* @__PURE__ */ jsx(Stack, { className: menuFooter, children: footer }) : null
226
+ ]
227
+ }
228
+ ),
229
+ visible: triggerMethod === "click" ? isVisible : shouldBeVisible,
230
+ children: /* @__PURE__ */ jsx(DisclosureContext.Provider, { value: true, children: finalDisclosure })
231
+ }
232
+ );
233
+ }
234
+ );
181
235
  export {
182
236
  Menu
183
237
  };
@@ -18,7 +18,7 @@ type MenuProviderProps = {
18
18
  parentDisclosureRef?: RefObject<HTMLButtonElement | null>;
19
19
  triggerMethod?: 'hover' | 'click';
20
20
  };
21
- export declare const MenuProvider: ({ hideOnClickItem, children, visible, parentDisclosureRef, }: MenuProviderProps) => import("@emotion/react/jsx-runtime").JSX.Element;
21
+ export declare const MenuProvider: ({ hideOnClickItem, children, visible, parentDisclosureRef, }: MenuProviderProps) => import("react/jsx-runtime").JSX.Element;
22
22
  export declare const DisclosureContext: import("react").Context<boolean>;
23
23
  export declare const useDisclosureContext: () => boolean;
24
24
  export {};
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx } from "@emotion/react/jsx-runtime";
2
+ import { jsx } from "react/jsx-runtime";
3
3
  import { useContext, useState, useRef, createContext, useMemo } from "react";
4
4
  const MenuContext = createContext(void 0);
5
5
  const useMenu = () => {
@@ -16,22 +16,35 @@ const MenuProvider = ({
16
16
  parentDisclosureRef
17
17
  }) => {
18
18
  const [isVisible, setIsVisible] = useState(visible);
19
- const [shouldBeVisible, setShouldBeVisible] = useState(void 0);
19
+ const [shouldBeVisible, setShouldBeVisible] = useState(
20
+ void 0
21
+ );
20
22
  const disclosureRef = useRef(null);
21
23
  const menuRef = useRef(null);
22
24
  const parentMenu = useContext(MenuContext);
23
25
  const isNested = !!parentMenu;
24
- const values = useMemo(() => ({
25
- disclosureRef,
26
- hideOnClickItem,
27
- isNested,
28
- isVisible,
29
- menuRef,
30
- parentDisclosureRef: parentDisclosureRef ?? parentMenu?.disclosureRef,
31
- setIsVisible,
32
- setShouldBeVisible,
33
- shouldBeVisible
34
- }), [hideOnClickItem, isVisible, isNested, parentDisclosureRef, parentMenu?.disclosureRef, shouldBeVisible, setShouldBeVisible]);
26
+ const values = useMemo(
27
+ () => ({
28
+ disclosureRef,
29
+ hideOnClickItem,
30
+ isNested,
31
+ isVisible,
32
+ menuRef,
33
+ parentDisclosureRef: parentDisclosureRef ?? parentMenu?.disclosureRef,
34
+ setIsVisible,
35
+ setShouldBeVisible,
36
+ shouldBeVisible
37
+ }),
38
+ [
39
+ hideOnClickItem,
40
+ isVisible,
41
+ isNested,
42
+ parentDisclosureRef,
43
+ parentMenu?.disclosureRef,
44
+ shouldBeVisible,
45
+ setShouldBeVisible
46
+ ]
47
+ );
35
48
  return /* @__PURE__ */ jsx(MenuContext.Provider, { value: values, children });
36
49
  };
37
50
  const DisclosureContext = createContext(false);
@@ -9,5 +9,5 @@ type GroupProps = {
9
9
  emptyState?: ReactNode;
10
10
  style?: CSSProperties;
11
11
  };
12
- export declare const Group: ({ label, children, labelDescription, emptyState, style, }: GroupProps) => import("@emotion/react/jsx-runtime").JSX.Element;
12
+ export declare const Group: ({ label, children, labelDescription, emptyState, style, }: GroupProps) => import("react/jsx-runtime").JSX.Element;
13
13
  export {};
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsxs, Fragment, jsx } from "@emotion/react/jsx-runtime";
2
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
3
  import { Children } from "react";
4
4
  import { Stack } from "../../Stack/index.js";
5
5
  import { Text } from "../../Text/index.js";
@@ -14,7 +14,16 @@ const Group = ({
14
14
  const isChildrenEmpty = Children.count(children) === 0;
15
15
  return /* @__PURE__ */ jsxs(Fragment, { children: [
16
16
  /* @__PURE__ */ jsx("span", { className: menuGroup, style, children: /* @__PURE__ */ jsxs(Stack, { alignItems: "center", direction: "row", gap: 1, children: [
17
- /* @__PURE__ */ jsx(Text, { as: "span", prominence: "weak", sentiment: "neutral", variant: "captionStrong", children: label }),
17
+ /* @__PURE__ */ jsx(
18
+ Text,
19
+ {
20
+ as: "span",
21
+ prominence: "weak",
22
+ sentiment: "neutral",
23
+ variant: "captionStrong",
24
+ children: label
25
+ }
26
+ ),
18
27
  labelDescription || null
19
28
  ] }) }),
20
29
  isChildrenEmpty && emptyState ? emptyState : children