@soroush.tech/design-system 2.0.0-rc.1 → 2.0.0-rc.2

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 (299) hide show
  1. package/README.md +17 -1
  2. package/dist/AppBar.d.cts +1 -3
  3. package/dist/AppBar.d.mts +1 -3
  4. package/dist/Avatar.cjs +1 -1
  5. package/dist/Avatar.d.cts +1 -3
  6. package/dist/Avatar.d.mts +1 -3
  7. package/dist/Avatar.mjs +1 -1
  8. package/dist/Backdrop.d.cts +1 -1
  9. package/dist/Backdrop.d.mts +1 -1
  10. package/dist/Breadcrumbs.cjs +132 -0
  11. package/dist/Breadcrumbs.d.cts +40 -0
  12. package/dist/Breadcrumbs.d.mts +40 -0
  13. package/dist/Breadcrumbs.mjs +131 -0
  14. package/dist/Button.cjs +1 -1
  15. package/dist/Button.d.cts +1 -1
  16. package/dist/Button.d.mts +1 -1
  17. package/dist/Button.mjs +1 -1
  18. package/dist/ButtonGroup.d.cts +1 -1
  19. package/dist/ButtonGroup.d.mts +1 -1
  20. package/dist/Card.cjs +3 -3
  21. package/dist/Card.d.cts +4 -3
  22. package/dist/Card.d.mts +4 -3
  23. package/dist/Card.mjs +3 -3
  24. package/dist/Checkbox.d.cts +1 -2
  25. package/dist/Checkbox.d.mts +1 -2
  26. package/dist/CircularProgress.d.cts +2 -3
  27. package/dist/CircularProgress.d.mts +2 -3
  28. package/dist/Drawer.d.cts +3 -2
  29. package/dist/Drawer.d.mts +3 -2
  30. package/dist/Flex.d.cts +1 -1
  31. package/dist/Flex.d.mts +1 -1
  32. package/dist/Form.d.cts +1 -1
  33. package/dist/Form.d.mts +1 -1
  34. package/dist/FormControl.cjs +1 -1
  35. package/dist/FormControl.d.cts +1 -2
  36. package/dist/FormControl.d.mts +1 -2
  37. package/dist/FormControl.mjs +1 -1
  38. package/dist/FormHelperText.d.cts +1 -1
  39. package/dist/FormHelperText.d.mts +1 -1
  40. package/dist/FormLabel.d.cts +1 -1
  41. package/dist/FormLabel.d.mts +1 -1
  42. package/dist/Grid.d.cts +1 -3
  43. package/dist/Grid.d.mts +1 -3
  44. package/dist/{Icon-CI6q2Eyi.cjs → Icon-Cvuhp9ek.cjs} +12 -2
  45. package/dist/{Icon-CH3asUJu.mjs → Icon-DlheCTJb.mjs} +12 -2
  46. package/dist/Icon.cjs +1 -1
  47. package/dist/Icon.d.cts +1 -1
  48. package/dist/Icon.d.mts +1 -1
  49. package/dist/Icon.mjs +1 -1
  50. package/dist/Image.d.cts +1 -2
  51. package/dist/Image.d.mts +1 -2
  52. package/dist/LinearProgress.d.cts +2 -3
  53. package/dist/LinearProgress.d.mts +2 -3
  54. package/dist/Link.cjs +1 -1
  55. package/dist/Link.d.cts +1 -1
  56. package/dist/Link.d.mts +1 -1
  57. package/dist/Link.mjs +1 -1
  58. package/dist/Menu/ContextMenu.cjs +146 -0
  59. package/dist/Menu/ContextMenu.d.cts +52 -0
  60. package/dist/Menu/ContextMenu.d.mts +52 -0
  61. package/dist/Menu/ContextMenu.mjs +145 -0
  62. package/dist/Menu/Menu.cjs +3 -0
  63. package/dist/Menu/Menu.d.cts +2 -0
  64. package/dist/Menu/Menu.d.mts +2 -0
  65. package/dist/Menu/Menu.mjs +2 -0
  66. package/dist/Menu/MenuDivider.cjs +29 -0
  67. package/dist/Menu/MenuDivider.d.cts +12 -0
  68. package/dist/Menu/MenuDivider.d.mts +12 -0
  69. package/dist/Menu/MenuDivider.mjs +28 -0
  70. package/dist/Menu/MenuItems.cjs +29 -0
  71. package/dist/Menu/MenuItems.d.cts +2 -0
  72. package/dist/Menu/MenuItems.d.mts +2 -0
  73. package/dist/Menu/MenuItems.mjs +28 -0
  74. package/dist/Menu/MenuList.cjs +3 -0
  75. package/dist/Menu/MenuList.d.cts +38 -0
  76. package/dist/Menu/MenuList.d.mts +38 -0
  77. package/dist/Menu/MenuList.mjs +2 -0
  78. package/dist/Menu-BkKPTOfh.cjs +172 -0
  79. package/dist/Menu-tECbAEFj.mjs +167 -0
  80. package/dist/Menu.cjs +13 -0
  81. package/dist/Menu.d.cts +7 -0
  82. package/dist/Menu.d.mts +7 -0
  83. package/dist/Menu.mjs +6 -0
  84. package/dist/MenuItem-BR7ingQx.mjs +654 -0
  85. package/dist/MenuItem-CfdN4axw.cjs +684 -0
  86. package/dist/MenuItem.cjs +2 -148
  87. package/dist/MenuItem.d.cts +2 -52
  88. package/dist/MenuItem.d.mts +2 -52
  89. package/dist/MenuItem.mjs +1 -147
  90. package/dist/MenuList-B7msJ1IG.mjs +187 -0
  91. package/dist/MenuList-D4imLXAa.cjs +223 -0
  92. package/dist/MenuListContext-Dml16k0X.d.mts +21 -0
  93. package/dist/MenuListContext-vujGcRk9.d.cts +21 -0
  94. package/dist/Modal.d.cts +1 -1
  95. package/dist/Modal.d.mts +1 -1
  96. package/dist/NativeSelect.cjs +2 -2
  97. package/dist/NativeSelect.d.cts +2 -3
  98. package/dist/NativeSelect.d.mts +2 -3
  99. package/dist/NativeSelect.mjs +2 -2
  100. package/dist/Pagination/PaginationItem.cjs +1 -1
  101. package/dist/Pagination/PaginationItem.d.cts +1 -1
  102. package/dist/Pagination/PaginationItem.d.mts +1 -1
  103. package/dist/Pagination/PaginationItem.mjs +1 -1
  104. package/dist/Pagination.d.cts +2 -2
  105. package/dist/Pagination.d.mts +2 -2
  106. package/dist/Paper.cjs +1 -1
  107. package/dist/Paper.d.cts +2 -1
  108. package/dist/Paper.d.mts +2 -1
  109. package/dist/Paper.mjs +1 -1
  110. package/dist/{Popover-TpwRSORC.cjs → Popover-CiZfgiKE.cjs} +5 -125
  111. package/dist/Popover-QjM5Z1CR.mjs +133 -0
  112. package/dist/Popover.cjs +1 -1
  113. package/dist/Popover.d.cts +6 -7
  114. package/dist/Popover.d.mts +6 -7
  115. package/dist/Popover.mjs +1 -1
  116. package/dist/Pressable.cjs +1 -1
  117. package/dist/Pressable.d.cts +1 -1
  118. package/dist/Pressable.d.mts +1 -1
  119. package/dist/Pressable.mjs +1 -1
  120. package/dist/Quote.d.cts +2 -3
  121. package/dist/Quote.d.mts +2 -3
  122. package/dist/Radio.d.cts +1 -2
  123. package/dist/Radio.d.mts +1 -2
  124. package/dist/Select.cjs +3 -3
  125. package/dist/Select.d.cts +2 -3
  126. package/dist/Select.d.mts +2 -3
  127. package/dist/Select.mjs +3 -3
  128. package/dist/Sidebar/Sidebar.d.cts +1 -1
  129. package/dist/Sidebar/Sidebar.d.mts +1 -1
  130. package/dist/Sidebar/SidebarItem.cjs +1 -1
  131. package/dist/Sidebar/SidebarItem.d.cts +3 -4
  132. package/dist/Sidebar/SidebarItem.d.mts +3 -4
  133. package/dist/Sidebar/SidebarItem.mjs +1 -1
  134. package/dist/Skeleton.d.cts +1 -2
  135. package/dist/Skeleton.d.mts +1 -2
  136. package/dist/Switch.cjs +1 -1
  137. package/dist/Switch.d.cts +1 -2
  138. package/dist/Switch.d.mts +1 -2
  139. package/dist/Switch.mjs +1 -1
  140. package/dist/Table/Table.d.cts +2 -3
  141. package/dist/Table/Table.d.mts +2 -3
  142. package/dist/Table/TableBody.d.cts +1 -2
  143. package/dist/Table/TableBody.d.mts +1 -2
  144. package/dist/Table/TableCell.d.cts +1 -1
  145. package/dist/Table/TableCell.d.mts +1 -1
  146. package/dist/Table/TableContainer.d.cts +1 -3
  147. package/dist/Table/TableContainer.d.mts +1 -3
  148. package/dist/Table/TableControl.d.cts +1 -1
  149. package/dist/Table/TableControl.d.mts +1 -1
  150. package/dist/Table/TableFooter.d.cts +1 -2
  151. package/dist/Table/TableFooter.d.mts +1 -2
  152. package/dist/Table/TableHead.d.cts +1 -2
  153. package/dist/Table/TableHead.d.mts +1 -2
  154. package/dist/Table/TablePagination.d.cts +2 -2
  155. package/dist/Table/TablePagination.d.mts +2 -2
  156. package/dist/Table/TablePaginationActions.cjs +1 -1
  157. package/dist/Table/TablePaginationActions.d.cts +1 -1
  158. package/dist/Table/TablePaginationActions.d.mts +1 -1
  159. package/dist/Table/TablePaginationActions.mjs +1 -1
  160. package/dist/Table/TableRow.d.cts +1 -2
  161. package/dist/Table/TableRow.d.mts +1 -2
  162. package/dist/Table/TableSortLabel.cjs +1 -1
  163. package/dist/Table/TableSortLabel.d.cts +1 -1
  164. package/dist/Table/TableSortLabel.d.mts +1 -1
  165. package/dist/Table/TableSortLabel.mjs +1 -1
  166. package/dist/Table/hooks.d.cts +1 -1
  167. package/dist/Table/hooks.d.mts +1 -1
  168. package/dist/Table.d.cts +5 -5
  169. package/dist/Table.d.mts +5 -5
  170. package/dist/{TableContext-BeCxbtHH.d.cts → TableContext-6PgGpUzM.d.mts} +1 -1
  171. package/dist/{TableContext-BiRiYkVZ.d.mts → TableContext-CBGk-Lh8.d.cts} +1 -1
  172. package/dist/Tabs/Tab.cjs +306 -0
  173. package/dist/Tabs/Tab.d.cts +62 -0
  174. package/dist/Tabs/Tab.d.mts +62 -0
  175. package/dist/Tabs/Tab.mjs +305 -0
  176. package/dist/Tabs/TabContext.cjs +34 -0
  177. package/dist/Tabs/TabContext.d.cts +20 -0
  178. package/dist/Tabs/TabContext.d.mts +20 -0
  179. package/dist/Tabs/TabContext.mjs +33 -0
  180. package/dist/Tabs/TabList.cjs +31 -0
  181. package/dist/Tabs/TabList.d.cts +11 -0
  182. package/dist/Tabs/TabList.d.mts +11 -0
  183. package/dist/Tabs/TabList.mjs +30 -0
  184. package/dist/Tabs/TabPanel.cjs +40 -0
  185. package/dist/Tabs/TabPanel.d.cts +27 -0
  186. package/dist/Tabs/TabPanel.d.mts +27 -0
  187. package/dist/Tabs/TabPanel.mjs +38 -0
  188. package/dist/Tabs/TabScrollButton.cjs +93 -0
  189. package/dist/Tabs/TabScrollButton.d.cts +2 -0
  190. package/dist/Tabs/TabScrollButton.d.mts +2 -0
  191. package/dist/Tabs/TabScrollButton.mjs +91 -0
  192. package/dist/Tabs/Tabs.cjs +3 -0
  193. package/dist/Tabs/Tabs.d.cts +3 -0
  194. package/dist/Tabs/Tabs.d.mts +3 -0
  195. package/dist/Tabs/Tabs.mjs +2 -0
  196. package/dist/Tabs-D_wkX-Jb.cjs +645 -0
  197. package/dist/Tabs-YfCUbkQV.mjs +633 -0
  198. package/dist/Tabs.cjs +13 -0
  199. package/dist/Tabs.d.cts +8 -0
  200. package/dist/Tabs.d.mts +8 -0
  201. package/dist/Tabs.mjs +7 -0
  202. package/dist/TabsContext-C2agsLBN.d.cts +6 -0
  203. package/dist/TabsContext-DqyxdmGW.d.mts +6 -0
  204. package/dist/TabsValueContext-D40zGCpE.cjs +19 -0
  205. package/dist/TabsValueContext-DvL3inf7.mjs +8 -0
  206. package/dist/TextInput.cjs +1 -1
  207. package/dist/TextInput.d.cts +1 -2
  208. package/dist/TextInput.d.mts +1 -2
  209. package/dist/TextInput.mjs +1 -1
  210. package/dist/ToggleButton/ToggleButton.cjs +1 -1
  211. package/dist/ToggleButton/ToggleButton.d.cts +1 -1
  212. package/dist/ToggleButton/ToggleButton.d.mts +1 -1
  213. package/dist/ToggleButton/ToggleButton.mjs +1 -1
  214. package/dist/ToggleButton/ToggleButtonGroup.cjs +1 -1
  215. package/dist/ToggleButton/ToggleButtonGroup.d.cts +1 -1
  216. package/dist/ToggleButton/ToggleButtonGroup.d.mts +1 -1
  217. package/dist/ToggleButton/ToggleButtonGroup.mjs +1 -1
  218. package/dist/Typography.cjs +1 -1
  219. package/dist/Typography.d.cts +2 -2
  220. package/dist/Typography.d.mts +2 -2
  221. package/dist/Typography.mjs +1 -1
  222. package/dist/View.d.cts +1 -1
  223. package/dist/View.d.mts +1 -1
  224. package/dist/catalog.cjs +4110 -0
  225. package/dist/catalog.d.cts +90 -0
  226. package/dist/catalog.d.mts +90 -0
  227. package/dist/catalog.mjs +4109 -0
  228. package/dist/computePopoverPosition-BIprs_xo.mjs +123 -0
  229. package/dist/computePopoverPosition-DiyEOHnU.cjs +128 -0
  230. package/dist/dividerLine-BNljcGlv.cjs +66 -0
  231. package/dist/dividerLine-FahY-M6_.mjs +31 -0
  232. package/dist/engine.d.cts +1 -1
  233. package/dist/engine.d.mts +1 -1
  234. package/dist/index-B3LIhqHR.d.cts +98 -0
  235. package/dist/{index-DbEnSf2m.d.cts → index-B8DNxyEw.d.mts} +3 -4
  236. package/dist/{index-CxUsrlg1.d.cts → index-BCnKYNlZ.d.cts} +1 -2
  237. package/dist/{index-BUoVTCqX.d.mts → index-BFruxTHv.d.cts} +2 -3
  238. package/dist/{index-BSqet8aO.d.cts → index-BSA6SKao.d.mts} +2 -3
  239. package/dist/{index-CrN4MSUF.d.cts → index-BVPrG1L0.d.mts} +1 -1
  240. package/dist/{index-Celm-8iN.d.cts → index-BbgFYfX_.d.mts} +3 -4
  241. package/dist/{index-B78VkB0-.d.cts → index-Bhdn4KTy.d.cts} +2 -3
  242. package/dist/{index-Chg6pSrr.d.mts → index-BiVvxOvj.d.cts} +3 -4
  243. package/dist/index-BjPX49XA.d.mts +34 -0
  244. package/dist/{index-BB-dLv5V.d.mts → index-BjfPEP_5.d.cts} +3 -4
  245. package/dist/{index-Bid71KeF.d.cts → index-BlLH6rlE.d.cts} +2 -2
  246. package/dist/{index-Ctqajtac.d.cts → index-BqpS_Huq.d.mts} +12 -4
  247. package/dist/{index-BhibLnZ0.d.cts → index-Bxd9NOWb.d.mts} +2 -3
  248. package/dist/index-C3KrFPCj.d.mts +35 -0
  249. package/dist/{themes-RX2UX5gD.d.mts → index-CVNJEUwJ.d.mts} +217 -8
  250. package/dist/index-CWnbCxgw.d.cts +72 -0
  251. package/dist/index-Cj5Rhh_9.d.mts +72 -0
  252. package/dist/index-CoEqjFYn.d.mts +98 -0
  253. package/dist/{index-S-ClM6WM.d.mts → index-CrIxI8Na.d.mts} +2 -2
  254. package/dist/index-DBteSahY.d.cts +1 -0
  255. package/dist/index-DCmH5f9I.d.cts +72 -0
  256. package/dist/{index-VOsBSWEu.d.mts → index-DDJuUfL5.d.cts} +1 -1
  257. package/dist/{index-DdqdSOct.d.cts → index-DIC7HKpP.d.mts} +2 -3
  258. package/dist/{index-BfZuh9c2.d.mts → index-DJCpnTH3.d.mts} +2 -3
  259. package/dist/index-DQcnJ5H4.d.cts +35 -0
  260. package/dist/{index-DNwF3DUX.d.cts → index-DXhMkjQ6.d.cts} +2 -3
  261. package/dist/index-DckSub2J.d.mts +72 -0
  262. package/dist/{index-nc4Sxiy9.d.mts → index-DeDxYlSQ.d.mts} +2 -3
  263. package/dist/{themes-Kbk9h5cN.d.cts → index-DmJ7yWWi.d.cts} +214 -5
  264. package/dist/{index-Wnv6jCR3.d.mts → index-DqjXDutI.d.mts} +1 -2
  265. package/dist/{index-GpnmW6vu.d.mts → index-DrVYWt-X.d.mts} +1 -2
  266. package/dist/{index-Belxmt1X.d.cts → index-DuVNRXP4.d.cts} +1 -2
  267. package/dist/{index-smqjMLAZ.d.mts → index-IdMqR82e.d.cts} +2 -3
  268. package/dist/{index-DXvQ-JVZ.d.mts → index-XxydXX8l.d.cts} +2 -3
  269. package/dist/index-_G1osn09.d.mts +1 -0
  270. package/dist/index-gnh-Oe0n.d.cts +34 -0
  271. package/dist/{index-DO9J-Fla.d.mts → index-qlfNErNd.d.cts} +12 -4
  272. package/dist/index.d.cts +1 -2
  273. package/dist/index.d.mts +1 -2
  274. package/dist/style.cjs +1 -1
  275. package/dist/style.d.cts +2 -2
  276. package/dist/style.d.mts +2 -2
  277. package/dist/style.mjs +1 -1
  278. package/dist/surfaceSystem-BGQBoXv_.cjs +38 -0
  279. package/dist/surfaceSystem-D8TbmKy3.mjs +21 -0
  280. package/dist/theme-BxXuXRgQ.cjs +137 -0
  281. package/dist/theme-Z9_QludW.mjs +102 -0
  282. package/dist/theme.cjs +25 -24
  283. package/dist/theme.d.cts +3 -3
  284. package/dist/theme.d.mts +3 -3
  285. package/dist/theme.mjs +2 -1
  286. package/dist/{theme-CDVxig_g.mjs → themes-L-dE7_ck.mjs} +10 -110
  287. package/dist/{theme-BXlAP3xf.cjs → themes-gd6tcmqS.cjs} +0 -136
  288. package/dist/{useTablePagination-COTiNH_8.d.mts → useTablePagination-C5VKtqDp.d.cts} +1 -1
  289. package/dist/{useTablePagination-WFkaUZu8.d.cts → useTablePagination-C6LSlt3w.d.mts} +1 -1
  290. package/package.json +43 -2
  291. package/dist/Popover-DwnSLpp1.mjs +0 -253
  292. package/dist/index-B_dKjEDR.d.mts +0 -23
  293. package/dist/index-C1WqEDtQ.d.mts +0 -69
  294. package/dist/index-CA7HnbtH.d.cts +0 -21
  295. package/dist/index-CKZaErxJ.d.mts +0 -21
  296. package/dist/index-DBUwu65Z.d.cts +0 -69
  297. package/dist/index-DzQJSYIh.d.cts +0 -23
  298. package/dist/index-cuv3o-L7.d.mts +0 -34
  299. package/dist/index-nB94D7UM.d.cts +0 -34
@@ -0,0 +1,654 @@
1
+ import { a as src_exports, o as styled, t as createShouldForwardProp } from "./src-DLGYOJMh.mjs";
2
+ import { t as themeDefault } from "./themeDefault-Z3KmyIbm.mjs";
3
+ import { n as useDefaultProps, r as useTheme } from "./theme-Z9_QludW.mjs";
4
+ import { t as Icon } from "./Icon-DlheCTJb.mjs";
5
+ import { a as useMenuListContext, n as getNextRow, r as getOwnRows, t as MenuList } from "./MenuList-B7msJ1IG.mjs";
6
+ import { t as computePopoverPosition } from "./computePopoverPosition-BIprs_xo.mjs";
7
+ import { Children, createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ //#region src/Menu/MenuPaper.ts
10
+ const elevationSystem = (0, src_exports.system)({ elevation: {
11
+ property: "boxShadow",
12
+ scale: "shadows"
13
+ } });
14
+ const MenuPaper = styled("div", {
15
+ name: "Menu",
16
+ slot: "paper",
17
+ label: "MenuPaper",
18
+ shouldForwardProp: (prop) => ![
19
+ "elevation",
20
+ "layer",
21
+ "margin"
22
+ ].includes(prop)
23
+ })(({ theme, layer, margin }) => ({
24
+ position: "fixed",
25
+ top: 0,
26
+ left: 0,
27
+ zIndex: theme.zOrder[layer],
28
+ minWidth: "10rem",
29
+ maxHeight: `calc(100vh - ${2 * margin}px)`,
30
+ overflowY: "auto",
31
+ backgroundColor: (0, src_exports.get)(theme, `background.${themeDefault(theme, "surfaceBg", "paper")}`),
32
+ borderRadius: theme.radii.sm,
33
+ visibility: "hidden"
34
+ }), elevationSystem);
35
+ //#endregion
36
+ //#region src/Menu/MenuContext.ts
37
+ /** Set by a `Menu`. */
38
+ const MenuContext = createContext(null);
39
+ /** The surrounding menu's settings - or, for a `MenuList` on its own, `Menu`'s defaults. */
40
+ function useMenuContext() {
41
+ const theme = useTheme();
42
+ return useContext(MenuContext) ?? {
43
+ align: "start",
44
+ margin: Number.parseFloat(String(theme.space[2])),
45
+ elevation: 8,
46
+ layer: "modal"
47
+ };
48
+ }
49
+ //#endregion
50
+ //#region src/Menu/utils/getMenuOrigins.ts
51
+ /**
52
+ * The anchor and transform origins `computePopoverPosition` places a list with. `align`
53
+ * is logical - in a right-to-left page `start` is the right edge. Below its trigger, the
54
+ * list lines up with that edge; beside its row, it opens past the row's other edge (to
55
+ * the right for a start-aligned menu in a left-to-right page). The placement flips to the
56
+ * other side on its own where the window has no room.
57
+ */
58
+ function getMenuOrigins(placement, align, isRtl) {
59
+ const isStartLeft = align === "start" !== isRtl;
60
+ const edge = isStartLeft ? "left" : "right";
61
+ if (placement === "below") return {
62
+ anchorOrigin: {
63
+ vertical: "bottom",
64
+ horizontal: edge
65
+ },
66
+ transformOrigin: {
67
+ vertical: "top",
68
+ horizontal: edge
69
+ }
70
+ };
71
+ return {
72
+ anchorOrigin: {
73
+ vertical: "top",
74
+ horizontal: isStartLeft ? "right" : "left"
75
+ },
76
+ transformOrigin: {
77
+ vertical: "top",
78
+ horizontal: edge
79
+ }
80
+ };
81
+ }
82
+ //#endregion
83
+ //#region src/Menu/utils/hasRoomBeside.ts
84
+ /**
85
+ * Whether a list `width` wide fits on either side of its row and still keeps `margin` from
86
+ * the window's edges - so a submenu can open beside the row at all.
87
+ */
88
+ function hasRoomBeside(anchorRect, width, viewportWidth, margin) {
89
+ const roomBefore = anchorRect.left - margin;
90
+ const roomAfter = viewportWidth - margin - (anchorRect.left + anchorRect.width);
91
+ return width <= Math.max(roomBefore, roomAfter);
92
+ }
93
+ //#endregion
94
+ //#region src/utils/isRtl.ts
95
+ /** Whether an element sits in a right-to-left context - its nearest `dir` says so. */
96
+ function isRtl(element) {
97
+ return element.closest("[dir]")?.getAttribute("dir") === "rtl";
98
+ }
99
+ //#endregion
100
+ //#region src/Menu/hooks/useMenuPlacement.ts
101
+ /**
102
+ * Places a menu's `position: fixed` surface in the window, next to its anchor - so a
103
+ * scrolling panel's overflow never clips it, while it stays in the menu's own box in the
104
+ * DOM. Placed before paint on every render while open, and again on resize and on any
105
+ * scroll. The surface starts `visibility: hidden` and is shown here, as it is placed - in
106
+ * the same layout pass, so it is visible by the time anything inside it takes focus.
107
+ * Returns whether a list beside its row opened on the other side for want of room.
108
+ */
109
+ function useMenuPlacement({ isOpen, anchorRef, surfaceRef, placement, align, margin, anchorPosition = null }) {
110
+ const [isFlipped, setIsFlipped] = useState(false);
111
+ const pointTop = anchorPosition?.top;
112
+ const pointLeft = anchorPosition?.left ?? 0;
113
+ const place = useCallback(() => {
114
+ const anchor = anchorRef.current;
115
+ const surface = surfaceRef.current;
116
+ if (!anchor || !surface) return;
117
+ const isPoint = pointTop !== void 0;
118
+ const anchorRect = anchor.getBoundingClientRect();
119
+ const paperRect = {
120
+ width: surface.offsetWidth,
121
+ height: surface.offsetHeight
122
+ };
123
+ const viewport = {
124
+ width: window.innerWidth,
125
+ height: window.innerHeight
126
+ };
127
+ const isCramped = placement === "beside" && !hasRoomBeside(anchorRect, paperRect.width, viewport.width, margin);
128
+ const { top, left } = computePopoverPosition({
129
+ anchorReference: isPoint ? "anchorPosition" : "anchorEl",
130
+ anchorPosition: isPoint ? {
131
+ top: pointTop,
132
+ left: pointLeft
133
+ } : void 0,
134
+ anchorRect,
135
+ paperRect,
136
+ ...getMenuOrigins(isCramped ? "below" : placement, align, isRtl(anchor)),
137
+ viewport,
138
+ marginThreshold: margin
139
+ });
140
+ surface.style.top = `${top}px`;
141
+ surface.style.left = `${left}px`;
142
+ const landed = surface.getBoundingClientRect();
143
+ const isOwnBox = paperRect.width > 0 && Math.round(landed.width) === paperRect.width;
144
+ const shiftTop = Math.round(landed.top - top);
145
+ const shiftLeft = Math.round(landed.left - left);
146
+ if (isOwnBox && (shiftTop !== 0 || shiftLeft !== 0)) {
147
+ surface.style.top = `${top - shiftTop}px`;
148
+ surface.style.left = `${left - shiftLeft}px`;
149
+ }
150
+ surface.style.visibility = "visible";
151
+ if (placement === "beside") {
152
+ const isOpeningRight = left + paperRect.width / 2 > anchorRect.left + anchorRect.width / 2;
153
+ const isRightPreferred = align === "start" !== isRtl(anchor);
154
+ setIsFlipped(!isCramped && isOpeningRight !== isRightPreferred);
155
+ }
156
+ }, [
157
+ anchorRef,
158
+ surfaceRef,
159
+ placement,
160
+ align,
161
+ margin,
162
+ pointTop,
163
+ pointLeft
164
+ ]);
165
+ useLayoutEffect(() => {
166
+ if (isOpen) place();
167
+ });
168
+ useEffect(() => {
169
+ if (!isOpen) return void 0;
170
+ window.addEventListener("resize", place);
171
+ window.addEventListener("scroll", place, true);
172
+ return () => {
173
+ window.removeEventListener("resize", place);
174
+ window.removeEventListener("scroll", place, true);
175
+ };
176
+ }, [isOpen, place]);
177
+ return isFlipped;
178
+ }
179
+ //#endregion
180
+ //#region src/MenuItem/Submenu.tsx
181
+ /**
182
+ * A row's submenu: a `MenuList` on its own surface, placed beside the row the way its menu
183
+ * places its list (`align`, the window margin), and drawn on the menu's layer.
184
+ */
185
+ function Submenu({ anchorRef, listId, labelledBy, children }) {
186
+ const menu = useMenuContext();
187
+ const { align, margin, elevation, layer } = menu;
188
+ const surfaceRef = useRef(null);
189
+ const isFlipped = useMenuPlacement({
190
+ isOpen: true,
191
+ anchorRef,
192
+ surfaceRef,
193
+ placement: "beside",
194
+ align,
195
+ margin
196
+ });
197
+ const flippedAlign = align === "start" ? "end" : "start";
198
+ const context = useMemo(() => ({
199
+ ...menu,
200
+ align: isFlipped ? flippedAlign : align
201
+ }), [
202
+ menu,
203
+ isFlipped,
204
+ flippedAlign,
205
+ align
206
+ ]);
207
+ return /* @__PURE__ */ jsx(MenuPaper, {
208
+ ref: surfaceRef,
209
+ elevation,
210
+ layer,
211
+ margin,
212
+ children: /* @__PURE__ */ jsx(MenuContext.Provider, {
213
+ value: context,
214
+ children: /* @__PURE__ */ jsx(MenuList, {
215
+ id: listId,
216
+ "aria-labelledby": labelledBy,
217
+ width: "100%",
218
+ children
219
+ })
220
+ })
221
+ });
222
+ }
223
+ //#endregion
224
+ //#region src/MenuItem/useSubmenu.ts
225
+ /**
226
+ * A row's submenu, opened while the row or anything in its submenu has focus. The pointer
227
+ * moves focus as it goes, so hovering a row opens its submenu and hovering a sibling closes
228
+ * it - the pointer and the keys never disagree. Right goes in and Left comes back, swapped
229
+ * in a right-to-left page.
230
+ */
231
+ function useSubmenu(rowRef, isEnabled) {
232
+ const [isOpen, setIsOpen] = useState(false);
233
+ const entryRef = useRef(null);
234
+ const listId = useId();
235
+ const isEnteringRef = useRef(false);
236
+ const focusFirstRow = () => {
237
+ const list = document.getElementById(listId);
238
+ getNextRow(getOwnRows(list), null, "first", false)?.focus();
239
+ };
240
+ useEffect(() => {
241
+ if (isOpen && isEnteringRef.current) {
242
+ isEnteringRef.current = false;
243
+ focusFirstRow();
244
+ }
245
+ });
246
+ const handleRowFocus = () => {
247
+ if (isEnabled) setIsOpen(true);
248
+ };
249
+ const handleRowKeyDown = (event) => {
250
+ const inward = isRtl(event.currentTarget) ? "ArrowLeft" : "ArrowRight";
251
+ if (!isEnabled || ![
252
+ inward,
253
+ "Enter",
254
+ " "
255
+ ].includes(event.key)) return false;
256
+ event.preventDefault();
257
+ event.stopPropagation();
258
+ if (isOpen) focusFirstRow();
259
+ else {
260
+ isEnteringRef.current = true;
261
+ setIsOpen(true);
262
+ }
263
+ return true;
264
+ };
265
+ const handleEntryKeyDown = (event) => {
266
+ const list = document.getElementById(listId);
267
+ if (event.target.closest("[role=\"menu\"]") !== list) return;
268
+ const outward = isRtl(event.currentTarget) ? "ArrowRight" : "ArrowLeft";
269
+ if (event.key !== outward && event.key !== "Escape") return;
270
+ event.preventDefault();
271
+ event.stopPropagation();
272
+ rowRef.current.focus();
273
+ setIsOpen(false);
274
+ };
275
+ const handleEntryBlur = (event) => {
276
+ if (!event.currentTarget.contains(event.relatedTarget)) setIsOpen(false);
277
+ };
278
+ return {
279
+ isOpen,
280
+ entryRef,
281
+ listId,
282
+ handleRowFocus,
283
+ handleRowKeyDown,
284
+ handleEntryKeyDown,
285
+ handleEntryBlur
286
+ };
287
+ }
288
+ //#endregion
289
+ //#region src/MenuItem/MenuItem.tsx
290
+ const shouldForwardProp = createShouldForwardProp([
291
+ "color",
292
+ "textColor",
293
+ "sizeToken",
294
+ "selected",
295
+ "highlighted",
296
+ "disabled",
297
+ "dense",
298
+ "disableGutters",
299
+ "divider",
300
+ "isMenu"
301
+ ]);
302
+ const baseStyle = ({ theme }) => ({
303
+ display: "flex",
304
+ alignItems: "center",
305
+ gap: theme.space[1],
306
+ cursor: "pointer",
307
+ fontFamily: theme.fonts.body,
308
+ lineHeight: theme.lineHeights.base,
309
+ listStyle: "none",
310
+ userSelect: "none",
311
+ whiteSpace: "nowrap",
312
+ transition: "background-color 0.12s ease",
313
+ outline: "none"
314
+ });
315
+ const sizeVariants = ({ theme, sizeToken, dense, disableGutters }) => {
316
+ const s = theme.sizes[sizeToken];
317
+ const verticalPadding = dense ? theme.space[.5] : void 0;
318
+ return {
319
+ paddingTop: verticalPadding ?? theme.space[s.paddingTop],
320
+ paddingBottom: verticalPadding ?? theme.space[s.paddingBottom],
321
+ paddingLeft: disableGutters ? 0 : theme.space[s.paddingLeft],
322
+ paddingRight: disableGutters ? 0 : theme.space[s.paddingRight],
323
+ fontSize: theme.fontSizes[s.fontSize]
324
+ };
325
+ };
326
+ const dividerStyle = ({ theme, divider }) => divider ? {
327
+ borderBottomWidth: theme.borderWidths.thin,
328
+ borderBottomStyle: "solid",
329
+ borderBottomColor: (0, src_exports.get)(theme, "border.light")
330
+ } : {};
331
+ const menuStyles = ({ theme, color, textColor, disabled }) => {
332
+ if (disabled) return {
333
+ color: (0, src_exports.get)(theme, "text.disabled"),
334
+ cursor: "default"
335
+ };
336
+ const main = (0, src_exports.get)(theme, `palette.${color}.main`);
337
+ const highlight = { backgroundColor: `${main}1F` };
338
+ return {
339
+ color: textColor ? (0, src_exports.get)(theme, `text.${textColor}`) : main,
340
+ "&:focus": highlight,
341
+ "&:focus-visible": {
342
+ outline: `${theme.borderWidths.base} solid ${main}`,
343
+ outlineOffset: `-${theme.borderWidths.base}`
344
+ },
345
+ "&[aria-expanded=\"true\"]": highlight
346
+ };
347
+ };
348
+ const interactionStyles = (props) => {
349
+ const { theme, color, textColor, selected, highlighted, disabled, isMenu } = props;
350
+ if (isMenu) return menuStyles(props);
351
+ const main = (0, src_exports.get)(theme, `palette.${color}.main`);
352
+ const hoverBg = `${main}1F`;
353
+ const selectedBg = `${main}29`;
354
+ const activeSelectedBg = `${main}3D`;
355
+ if (disabled) return {
356
+ color: (0, src_exports.get)(theme, "text.disabled"),
357
+ cursor: "not-allowed",
358
+ pointerEvents: "none"
359
+ };
360
+ const baseColor = textColor ? (0, src_exports.get)(theme, `text.${textColor}`) : main;
361
+ return {
362
+ color: selected ? main : baseColor,
363
+ backgroundColor: selected ? highlighted ? activeSelectedBg : selectedBg : highlighted ? hoverBg : "transparent",
364
+ "&:hover": { backgroundColor: selected ? activeSelectedBg : hoverBg }
365
+ };
366
+ };
367
+ const MenuItemRoot = styled("li", {
368
+ name: "MenuItem",
369
+ label: "MenuItem",
370
+ shouldForwardProp
371
+ })(baseStyle, sizeVariants, dividerStyle, interactionStyles);
372
+ const CheckSlot = styled("span", {
373
+ name: "MenuItem",
374
+ slot: "check",
375
+ label: "MenuItemCheck"
376
+ })({
377
+ display: "inline-flex",
378
+ width: "1.125rem",
379
+ flexShrink: 0
380
+ });
381
+ const StartIconSlot = styled("span", {
382
+ name: "MenuItem",
383
+ slot: "startIcon",
384
+ label: "MenuItemStartIcon"
385
+ })(({ theme }) => ({
386
+ display: "inline-flex",
387
+ alignItems: "center",
388
+ justifyContent: "center",
389
+ width: theme.icon.sm,
390
+ height: theme.icon.sm,
391
+ flexShrink: 0
392
+ }));
393
+ const LabelSlot = styled("span", {
394
+ name: "MenuItem",
395
+ slot: "label",
396
+ label: "MenuItemLabel"
397
+ })({
398
+ flex: 1,
399
+ minWidth: 0
400
+ });
401
+ const ShortcutSlot = styled("span", {
402
+ name: "MenuItem",
403
+ slot: "shortcut",
404
+ label: "MenuItemShortcut"
405
+ })(({ theme }) => ({
406
+ marginLeft: theme.space[3],
407
+ color: (0, src_exports.get)(theme, "text.secondary"),
408
+ fontSize: "0.875em"
409
+ }));
410
+ const SubmenuIconSlot = styled("span", {
411
+ name: "MenuItem",
412
+ slot: "submenuIcon",
413
+ label: "MenuItemSubmenuIcon"
414
+ })(({ theme }) => ({
415
+ display: "inline-flex",
416
+ marginLeft: theme.space[2],
417
+ "[dir=\"rtl\"] &": { transform: "scaleX(-1)" }
418
+ }));
419
+ const EntrySlot = styled("li", {
420
+ name: "MenuItem",
421
+ slot: "entry",
422
+ label: "MenuItemEntry",
423
+ shouldForwardProp: createShouldForwardProp(["hasSecondaryAction"])
424
+ })(({ hasSecondaryAction }) => ({
425
+ listStyle: "none",
426
+ ...hasSecondaryAction && {
427
+ display: "flex",
428
+ alignItems: "center",
429
+ "& > [role^=\"menuitem\"]": {
430
+ flex: "1 1 auto",
431
+ minWidth: 0
432
+ }
433
+ }
434
+ }));
435
+ const SecondaryActionSlot = styled("span", {
436
+ name: "MenuItem",
437
+ slot: "secondaryAction",
438
+ label: "MenuItemSecondaryAction"
439
+ })(({ theme }) => ({
440
+ display: "inline-flex",
441
+ alignItems: "center",
442
+ flexShrink: 0,
443
+ paddingInlineEnd: theme.space[1]
444
+ }));
445
+ function isKeyboardFocus(element) {
446
+ try {
447
+ return element.matches(":focus-visible");
448
+ } catch {
449
+ return false;
450
+ }
451
+ }
452
+ function useRowLook(own, menu) {
453
+ const theme = useTheme();
454
+ const dp = useDefaultProps("MenuItem");
455
+ return {
456
+ color: own.color ?? menu?.color ?? dp.color ?? themeDefault(theme, "color", "primary"),
457
+ size: own.size ?? menu?.size ?? dp.size ?? themeDefault(theme, "size", "md"),
458
+ textColor: own.textColor ?? menu?.textColor ?? dp.textColor,
459
+ dense: own.dense ?? menu?.dense ?? dp.dense ?? false
460
+ };
461
+ }
462
+ const getRowAria = (state) => ({
463
+ "aria-haspopup": state.hasSubmenu ? "menu" : void 0,
464
+ "aria-expanded": state.hasSubmenu ? state.isSubmenuOpen : void 0,
465
+ "aria-controls": state.isSubmenuOpen ? state.submenuId : void 0,
466
+ "aria-checked": state.role === "menuitem" ? void 0 : state.selected,
467
+ "aria-keyshortcuts": typeof state.shortcut === "string" ? state.shortcut : void 0,
468
+ "aria-describedby": state.note ? state.noteId : void 0
469
+ });
470
+ const joinClassNames = (...names) => names.filter(Boolean).join(" ") || void 0;
471
+ /**
472
+ * @description A row of a list. Inside a `MenuList` it is a menu row - a `menuitem`
473
+ * (or `menuitemradio` / `menuitemcheckbox`) with a leading icon column, its label and a
474
+ * trailing shortcut, chosen by a click, Enter or Space. Anywhere else it is `Select`'s
475
+ * `<li role="option">` (override via `as`), whose selection, highlight and density props
476
+ * `Select` injects; used on its own it renders a static, styled row.
477
+ */
478
+ function MenuItem({ value, children, as, disabled = false, selected = false, highlighted = false, multiple = false, color: colorProp, textColor: textColorProp, size: sizeProp, dense: denseProp, disableGutters = false, divider = false, autoFocus = false, focusVisibleClassName, onSelect, role = "menuitem", startIcon, shortcut, note, onClick, submenu, emptyLabel, secondaryAction, id, className, "data-testid": dataTestid }) {
479
+ const menu = useMenuListContext();
480
+ const isMenu = menu !== null;
481
+ const { color, size, textColor, dense } = useRowLook({
482
+ color: colorProp,
483
+ size: sizeProp,
484
+ textColor: textColorProp,
485
+ dense: denseProp
486
+ }, menu);
487
+ const rootRef = useRef(null);
488
+ const [isFocusVisible, setIsFocusVisible] = useState(false);
489
+ const noteId = useId();
490
+ const fallbackId = useId();
491
+ const hasSubmenu = isMenu && submenu !== void 0;
492
+ const { isOpen: isSubmenuOpen, entryRef, listId: submenuId, handleRowFocus, handleRowKeyDown, handleEntryKeyDown, handleEntryBlur } = useSubmenu(rootRef, hasSubmenu && !disabled);
493
+ useEffect(() => {
494
+ if (autoFocus) rootRef.current?.focus();
495
+ }, [autoFocus]);
496
+ const choose = (event) => {
497
+ if (disabled || hasSubmenu) return;
498
+ if (menu) {
499
+ onClick?.(event);
500
+ menu.onActivate(value, event);
501
+ } else if (value !== void 0) onSelect?.(value);
502
+ };
503
+ const handleMouseDown = (event) => {
504
+ if (!isMenu) event.preventDefault();
505
+ };
506
+ const handleKeyDown = (event) => {
507
+ if (handleRowKeyDown(event)) return;
508
+ if (event.key === "Enter") {
509
+ event.preventDefault();
510
+ choose(event);
511
+ } else if (event.key === " ") event.preventDefault();
512
+ };
513
+ const handleKeyUp = (event) => {
514
+ if (event.key === " ") choose(event);
515
+ };
516
+ const handlePointerMove = (event) => {
517
+ const row = event.currentTarget;
518
+ if (!disabled && row.ownerDocument.activeElement !== row) row.focus();
519
+ };
520
+ const handleFocus = (event) => {
521
+ handleRowFocus();
522
+ if (focusVisibleClassName && isKeyboardFocus(event.currentTarget)) setIsFocusVisible(true);
523
+ };
524
+ const handleBlur = () => {
525
+ setIsFocusVisible(false);
526
+ };
527
+ const rootClassName = joinClassNames(className, isFocusVisible && focusVisibleClassName);
528
+ const rootProps = {
529
+ as,
530
+ ref: rootRef,
531
+ id,
532
+ tabIndex: -1,
533
+ "aria-disabled": disabled || void 0,
534
+ "data-value": value,
535
+ color,
536
+ textColor,
537
+ sizeToken: size,
538
+ selected,
539
+ highlighted,
540
+ disabled,
541
+ dense,
542
+ disableGutters,
543
+ divider,
544
+ isMenu,
545
+ className: rootClassName,
546
+ "data-testid": dataTestid,
547
+ onMouseDown: handleMouseDown,
548
+ onClick: choose,
549
+ onFocus: handleFocus,
550
+ onBlur: handleBlur
551
+ };
552
+ if (!isMenu) return /* @__PURE__ */ jsxs(MenuItemRoot, {
553
+ ...rootProps,
554
+ role: "option",
555
+ "aria-selected": selected,
556
+ children: [multiple && /* @__PURE__ */ jsx(CheckSlot, {
557
+ "aria-hidden": true,
558
+ children: selected && /* @__PURE__ */ jsx(Icon, {
559
+ name: "check",
560
+ size: "1.125rem",
561
+ color: "inherit"
562
+ })
563
+ }), children]
564
+ });
565
+ const tick = role !== "menuitem" && selected ? /* @__PURE__ */ jsx(Icon, {
566
+ name: "check",
567
+ size: "sm",
568
+ color: "inherit"
569
+ }) : null;
570
+ const rowId = id ?? fallbackId;
571
+ const hasSecondaryAction = secondaryAction != null;
572
+ const row = /* @__PURE__ */ jsxs(MenuItemRoot, {
573
+ ...rootProps,
574
+ as: hasSubmenu || hasSecondaryAction ? "div" : as,
575
+ id: rowId,
576
+ role,
577
+ ...getRowAria({
578
+ role,
579
+ selected,
580
+ hasSubmenu,
581
+ isSubmenuOpen,
582
+ submenuId,
583
+ shortcut,
584
+ note,
585
+ noteId
586
+ }),
587
+ title: note,
588
+ onKeyDown: handleKeyDown,
589
+ onKeyUp: handleKeyUp,
590
+ onPointerMove: handlePointerMove,
591
+ children: [
592
+ /* @__PURE__ */ jsx(StartIconSlot, {
593
+ "aria-hidden": true,
594
+ children: startIcon ?? tick
595
+ }),
596
+ /* @__PURE__ */ jsx(LabelSlot, {
597
+ "data-menu-label": true,
598
+ children
599
+ }),
600
+ shortcut != null && /* @__PURE__ */ jsx(ShortcutSlot, {
601
+ "aria-hidden": true,
602
+ children: shortcut
603
+ }),
604
+ hasSubmenu && /* @__PURE__ */ jsx(SubmenuIconSlot, {
605
+ "aria-hidden": true,
606
+ children: /* @__PURE__ */ jsx(Icon, {
607
+ name: "chevron_right",
608
+ size: "sm",
609
+ color: "inherit"
610
+ })
611
+ }),
612
+ note && /* @__PURE__ */ jsx("span", {
613
+ id: noteId,
614
+ hidden: true,
615
+ children: note
616
+ })
617
+ ]
618
+ });
619
+ if (!hasSubmenu && !hasSecondaryAction) return row;
620
+ if (!hasSubmenu) return /* @__PURE__ */ jsxs(EntrySlot, {
621
+ role: "none",
622
+ hasSecondaryAction: true,
623
+ children: [row, /* @__PURE__ */ jsx(SecondaryActionSlot, {
624
+ "aria-hidden": true,
625
+ children: secondaryAction
626
+ })]
627
+ });
628
+ const hasRows = Children.toArray(submenu).length > 0;
629
+ return /* @__PURE__ */ jsxs(EntrySlot, {
630
+ ref: entryRef,
631
+ role: "none",
632
+ hasSecondaryAction,
633
+ onKeyDown: handleEntryKeyDown,
634
+ onBlur: handleEntryBlur,
635
+ children: [
636
+ row,
637
+ hasSecondaryAction && /* @__PURE__ */ jsx(SecondaryActionSlot, {
638
+ "aria-hidden": true,
639
+ children: secondaryAction
640
+ }),
641
+ isSubmenuOpen && /* @__PURE__ */ jsx(Submenu, {
642
+ anchorRef: entryRef,
643
+ listId: submenuId,
644
+ labelledBy: rowId,
645
+ children: hasRows ? submenu : emptyLabel != null && /* @__PURE__ */ jsx(MenuItem, {
646
+ disabled: true,
647
+ children: emptyLabel
648
+ })
649
+ })
650
+ ]
651
+ });
652
+ }
653
+ //#endregion
654
+ export { MenuPaper as a, MenuContext as i, useMenuPlacement as n, isRtl as r, MenuItem as t };