@soroush.tech/design-system 2.0.0-rc.0 → 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.
- package/README.md +17 -1
- package/dist/AppBar.d.cts +1 -3
- package/dist/AppBar.d.mts +1 -3
- package/dist/Avatar.cjs +1 -1
- package/dist/Avatar.d.cts +1 -3
- package/dist/Avatar.d.mts +1 -3
- package/dist/Avatar.mjs +1 -1
- package/dist/Backdrop.d.cts +1 -1
- package/dist/Backdrop.d.mts +1 -1
- package/dist/Breadcrumbs.cjs +132 -0
- package/dist/Breadcrumbs.d.cts +40 -0
- package/dist/Breadcrumbs.d.mts +40 -0
- package/dist/Breadcrumbs.mjs +131 -0
- package/dist/Button.cjs +1 -1
- package/dist/Button.d.cts +1 -1
- package/dist/Button.d.mts +1 -1
- package/dist/Button.mjs +1 -1
- package/dist/ButtonGroup.d.cts +1 -1
- package/dist/ButtonGroup.d.mts +1 -1
- package/dist/Card.cjs +3 -3
- package/dist/Card.d.cts +4 -3
- package/dist/Card.d.mts +4 -3
- package/dist/Card.mjs +3 -3
- package/dist/Checkbox.d.cts +1 -2
- package/dist/Checkbox.d.mts +1 -2
- package/dist/CircularProgress.d.cts +2 -3
- package/dist/CircularProgress.d.mts +2 -3
- package/dist/Drawer.d.cts +3 -2
- package/dist/Drawer.d.mts +3 -2
- package/dist/Flex.d.cts +1 -1
- package/dist/Flex.d.mts +1 -1
- package/dist/Form.d.cts +1 -1
- package/dist/Form.d.mts +1 -1
- package/dist/FormControl.cjs +1 -1
- package/dist/FormControl.d.cts +1 -2
- package/dist/FormControl.d.mts +1 -2
- package/dist/FormControl.mjs +1 -1
- package/dist/FormHelperText.d.cts +1 -1
- package/dist/FormHelperText.d.mts +1 -1
- package/dist/FormLabel.d.cts +1 -1
- package/dist/FormLabel.d.mts +1 -1
- package/dist/Grid.d.cts +1 -3
- package/dist/Grid.d.mts +1 -3
- package/dist/{Icon-CI6q2Eyi.cjs → Icon-Cvuhp9ek.cjs} +12 -2
- package/dist/{Icon-CH3asUJu.mjs → Icon-DlheCTJb.mjs} +12 -2
- package/dist/Icon.cjs +1 -1
- package/dist/Icon.d.cts +1 -1
- package/dist/Icon.d.mts +1 -1
- package/dist/Icon.mjs +1 -1
- package/dist/Image.d.cts +1 -2
- package/dist/Image.d.mts +1 -2
- package/dist/LinearProgress.d.cts +2 -3
- package/dist/LinearProgress.d.mts +2 -3
- package/dist/Link.cjs +1 -1
- package/dist/Link.d.cts +1 -1
- package/dist/Link.d.mts +1 -1
- package/dist/Link.mjs +1 -1
- package/dist/Menu/ContextMenu.cjs +146 -0
- package/dist/Menu/ContextMenu.d.cts +52 -0
- package/dist/Menu/ContextMenu.d.mts +52 -0
- package/dist/Menu/ContextMenu.mjs +145 -0
- package/dist/Menu/Menu.cjs +3 -0
- package/dist/Menu/Menu.d.cts +2 -0
- package/dist/Menu/Menu.d.mts +2 -0
- package/dist/Menu/Menu.mjs +2 -0
- package/dist/Menu/MenuDivider.cjs +29 -0
- package/dist/Menu/MenuDivider.d.cts +12 -0
- package/dist/Menu/MenuDivider.d.mts +12 -0
- package/dist/Menu/MenuDivider.mjs +28 -0
- package/dist/Menu/MenuItems.cjs +29 -0
- package/dist/Menu/MenuItems.d.cts +2 -0
- package/dist/Menu/MenuItems.d.mts +2 -0
- package/dist/Menu/MenuItems.mjs +28 -0
- package/dist/Menu/MenuList.cjs +3 -0
- package/dist/Menu/MenuList.d.cts +38 -0
- package/dist/Menu/MenuList.d.mts +38 -0
- package/dist/Menu/MenuList.mjs +2 -0
- package/dist/Menu-BkKPTOfh.cjs +172 -0
- package/dist/Menu-tECbAEFj.mjs +167 -0
- package/dist/Menu.cjs +13 -0
- package/dist/Menu.d.cts +7 -0
- package/dist/Menu.d.mts +7 -0
- package/dist/Menu.mjs +6 -0
- package/dist/MenuItem-BR7ingQx.mjs +654 -0
- package/dist/MenuItem-CfdN4axw.cjs +684 -0
- package/dist/MenuItem.cjs +2 -148
- package/dist/MenuItem.d.cts +2 -52
- package/dist/MenuItem.d.mts +2 -52
- package/dist/MenuItem.mjs +1 -147
- package/dist/MenuList-B7msJ1IG.mjs +187 -0
- package/dist/MenuList-D4imLXAa.cjs +223 -0
- package/dist/MenuListContext-Dml16k0X.d.mts +21 -0
- package/dist/MenuListContext-vujGcRk9.d.cts +21 -0
- package/dist/Modal.d.cts +1 -1
- package/dist/Modal.d.mts +1 -1
- package/dist/NativeSelect.cjs +2 -2
- package/dist/NativeSelect.d.cts +2 -3
- package/dist/NativeSelect.d.mts +2 -3
- package/dist/NativeSelect.mjs +2 -2
- package/dist/Pagination/PaginationItem.cjs +1 -1
- package/dist/Pagination/PaginationItem.d.cts +1 -1
- package/dist/Pagination/PaginationItem.d.mts +1 -1
- package/dist/Pagination/PaginationItem.mjs +1 -1
- package/dist/Pagination.d.cts +2 -2
- package/dist/Pagination.d.mts +2 -2
- package/dist/Paper.cjs +1 -1
- package/dist/Paper.d.cts +2 -1
- package/dist/Paper.d.mts +2 -1
- package/dist/Paper.mjs +1 -1
- package/dist/{Popover-TpwRSORC.cjs → Popover-CiZfgiKE.cjs} +5 -125
- package/dist/Popover-QjM5Z1CR.mjs +133 -0
- package/dist/Popover.cjs +1 -1
- package/dist/Popover.d.cts +6 -7
- package/dist/Popover.d.mts +6 -7
- package/dist/Popover.mjs +1 -1
- package/dist/Pressable.cjs +1 -1
- package/dist/Pressable.d.cts +1 -1
- package/dist/Pressable.d.mts +1 -1
- package/dist/Pressable.mjs +1 -1
- package/dist/Quote.d.cts +2 -3
- package/dist/Quote.d.mts +2 -3
- package/dist/Radio.d.cts +1 -2
- package/dist/Radio.d.mts +1 -2
- package/dist/Select.cjs +3 -3
- package/dist/Select.d.cts +2 -3
- package/dist/Select.d.mts +2 -3
- package/dist/Select.mjs +3 -3
- package/dist/Sidebar/Sidebar.d.cts +1 -1
- package/dist/Sidebar/Sidebar.d.mts +1 -1
- package/dist/Sidebar/SidebarItem.cjs +1 -1
- package/dist/Sidebar/SidebarItem.d.cts +3 -4
- package/dist/Sidebar/SidebarItem.d.mts +3 -4
- package/dist/Sidebar/SidebarItem.mjs +1 -1
- package/dist/Skeleton.d.cts +1 -2
- package/dist/Skeleton.d.mts +1 -2
- package/dist/Switch.cjs +1 -1
- package/dist/Switch.d.cts +1 -2
- package/dist/Switch.d.mts +1 -2
- package/dist/Switch.mjs +1 -1
- package/dist/Table/Table.d.cts +2 -3
- package/dist/Table/Table.d.mts +2 -3
- package/dist/Table/TableBody.d.cts +1 -2
- package/dist/Table/TableBody.d.mts +1 -2
- package/dist/Table/TableCell.d.cts +1 -1
- package/dist/Table/TableCell.d.mts +1 -1
- package/dist/Table/TableContainer.d.cts +1 -3
- package/dist/Table/TableContainer.d.mts +1 -3
- package/dist/Table/TableControl.d.cts +1 -1
- package/dist/Table/TableControl.d.mts +1 -1
- package/dist/Table/TableFooter.d.cts +1 -2
- package/dist/Table/TableFooter.d.mts +1 -2
- package/dist/Table/TableHead.d.cts +1 -2
- package/dist/Table/TableHead.d.mts +1 -2
- package/dist/Table/TablePagination.d.cts +2 -2
- package/dist/Table/TablePagination.d.mts +2 -2
- package/dist/Table/TablePaginationActions.cjs +1 -1
- package/dist/Table/TablePaginationActions.d.cts +1 -1
- package/dist/Table/TablePaginationActions.d.mts +1 -1
- package/dist/Table/TablePaginationActions.mjs +1 -1
- package/dist/Table/TableRow.d.cts +1 -2
- package/dist/Table/TableRow.d.mts +1 -2
- package/dist/Table/TableSortLabel.cjs +1 -1
- package/dist/Table/TableSortLabel.d.cts +1 -1
- package/dist/Table/TableSortLabel.d.mts +1 -1
- package/dist/Table/TableSortLabel.mjs +1 -1
- package/dist/Table/hooks.d.cts +1 -1
- package/dist/Table/hooks.d.mts +1 -1
- package/dist/Table.d.cts +5 -5
- package/dist/Table.d.mts +5 -5
- package/dist/{TableContext-BeCxbtHH.d.cts → TableContext-6PgGpUzM.d.mts} +1 -1
- package/dist/{TableContext-BiRiYkVZ.d.mts → TableContext-CBGk-Lh8.d.cts} +1 -1
- package/dist/Tabs/Tab.cjs +306 -0
- package/dist/Tabs/Tab.d.cts +62 -0
- package/dist/Tabs/Tab.d.mts +62 -0
- package/dist/Tabs/Tab.mjs +305 -0
- package/dist/Tabs/TabContext.cjs +34 -0
- package/dist/Tabs/TabContext.d.cts +20 -0
- package/dist/Tabs/TabContext.d.mts +20 -0
- package/dist/Tabs/TabContext.mjs +33 -0
- package/dist/Tabs/TabList.cjs +31 -0
- package/dist/Tabs/TabList.d.cts +11 -0
- package/dist/Tabs/TabList.d.mts +11 -0
- package/dist/Tabs/TabList.mjs +30 -0
- package/dist/Tabs/TabPanel.cjs +40 -0
- package/dist/Tabs/TabPanel.d.cts +27 -0
- package/dist/Tabs/TabPanel.d.mts +27 -0
- package/dist/Tabs/TabPanel.mjs +38 -0
- package/dist/Tabs/TabScrollButton.cjs +93 -0
- package/dist/Tabs/TabScrollButton.d.cts +2 -0
- package/dist/Tabs/TabScrollButton.d.mts +2 -0
- package/dist/Tabs/TabScrollButton.mjs +91 -0
- package/dist/Tabs/Tabs.cjs +3 -0
- package/dist/Tabs/Tabs.d.cts +3 -0
- package/dist/Tabs/Tabs.d.mts +3 -0
- package/dist/Tabs/Tabs.mjs +2 -0
- package/dist/Tabs-D_wkX-Jb.cjs +645 -0
- package/dist/Tabs-YfCUbkQV.mjs +633 -0
- package/dist/Tabs.cjs +13 -0
- package/dist/Tabs.d.cts +8 -0
- package/dist/Tabs.d.mts +8 -0
- package/dist/Tabs.mjs +7 -0
- package/dist/TabsContext-C2agsLBN.d.cts +6 -0
- package/dist/TabsContext-DqyxdmGW.d.mts +6 -0
- package/dist/TabsValueContext-D40zGCpE.cjs +19 -0
- package/dist/TabsValueContext-DvL3inf7.mjs +8 -0
- package/dist/TextInput.cjs +1 -1
- package/dist/TextInput.d.cts +1 -2
- package/dist/TextInput.d.mts +1 -2
- package/dist/TextInput.mjs +1 -1
- package/dist/ToggleButton/ToggleButton.cjs +1 -1
- package/dist/ToggleButton/ToggleButton.d.cts +1 -1
- package/dist/ToggleButton/ToggleButton.d.mts +1 -1
- package/dist/ToggleButton/ToggleButton.mjs +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.cjs +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.cts +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.mts +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.mjs +1 -1
- package/dist/Typography.cjs +1 -1
- package/dist/Typography.d.cts +2 -2
- package/dist/Typography.d.mts +2 -2
- package/dist/Typography.mjs +1 -1
- package/dist/View.d.cts +1 -1
- package/dist/View.d.mts +1 -1
- package/dist/catalog.cjs +4110 -0
- package/dist/catalog.d.cts +90 -0
- package/dist/catalog.d.mts +90 -0
- package/dist/catalog.mjs +4109 -0
- package/dist/computePopoverPosition-BIprs_xo.mjs +123 -0
- package/dist/computePopoverPosition-DiyEOHnU.cjs +128 -0
- package/dist/dividerLine-BNljcGlv.cjs +66 -0
- package/dist/dividerLine-FahY-M6_.mjs +31 -0
- package/dist/engine.d.cts +1 -1
- package/dist/engine.d.mts +1 -1
- package/dist/index-B3LIhqHR.d.cts +98 -0
- package/dist/{index-DbEnSf2m.d.cts → index-B8DNxyEw.d.mts} +3 -4
- package/dist/{index-CxUsrlg1.d.cts → index-BCnKYNlZ.d.cts} +1 -2
- package/dist/{index-BUoVTCqX.d.mts → index-BFruxTHv.d.cts} +2 -3
- package/dist/{index-BSqet8aO.d.cts → index-BSA6SKao.d.mts} +2 -3
- package/dist/{index-CrN4MSUF.d.cts → index-BVPrG1L0.d.mts} +1 -1
- package/dist/{index-Celm-8iN.d.cts → index-BbgFYfX_.d.mts} +3 -4
- package/dist/{index-B78VkB0-.d.cts → index-Bhdn4KTy.d.cts} +2 -3
- package/dist/{index-Chg6pSrr.d.mts → index-BiVvxOvj.d.cts} +3 -4
- package/dist/index-BjPX49XA.d.mts +34 -0
- package/dist/{index-BB-dLv5V.d.mts → index-BjfPEP_5.d.cts} +3 -4
- package/dist/{index-Bid71KeF.d.cts → index-BlLH6rlE.d.cts} +2 -2
- package/dist/{index-Ctqajtac.d.cts → index-BqpS_Huq.d.mts} +12 -4
- package/dist/{index-BhibLnZ0.d.cts → index-Bxd9NOWb.d.mts} +2 -3
- package/dist/index-C3KrFPCj.d.mts +35 -0
- package/dist/{themes-RX2UX5gD.d.mts → index-CVNJEUwJ.d.mts} +217 -8
- package/dist/index-CWnbCxgw.d.cts +72 -0
- package/dist/index-Cj5Rhh_9.d.mts +72 -0
- package/dist/index-CoEqjFYn.d.mts +98 -0
- package/dist/{index-S-ClM6WM.d.mts → index-CrIxI8Na.d.mts} +2 -2
- package/dist/index-DBteSahY.d.cts +1 -0
- package/dist/index-DCmH5f9I.d.cts +72 -0
- package/dist/{index-VOsBSWEu.d.mts → index-DDJuUfL5.d.cts} +1 -1
- package/dist/{index-DdqdSOct.d.cts → index-DIC7HKpP.d.mts} +2 -3
- package/dist/{index-BfZuh9c2.d.mts → index-DJCpnTH3.d.mts} +2 -3
- package/dist/index-DQcnJ5H4.d.cts +35 -0
- package/dist/{index-DNwF3DUX.d.cts → index-DXhMkjQ6.d.cts} +2 -3
- package/dist/index-DckSub2J.d.mts +72 -0
- package/dist/{index-nc4Sxiy9.d.mts → index-DeDxYlSQ.d.mts} +2 -3
- package/dist/{themes-Kbk9h5cN.d.cts → index-DmJ7yWWi.d.cts} +214 -5
- package/dist/{index-Wnv6jCR3.d.mts → index-DqjXDutI.d.mts} +1 -2
- package/dist/{index-GpnmW6vu.d.mts → index-DrVYWt-X.d.mts} +1 -2
- package/dist/{index-Belxmt1X.d.cts → index-DuVNRXP4.d.cts} +1 -2
- package/dist/{index-smqjMLAZ.d.mts → index-IdMqR82e.d.cts} +2 -3
- package/dist/{index-DXvQ-JVZ.d.mts → index-XxydXX8l.d.cts} +2 -3
- package/dist/index-_G1osn09.d.mts +1 -0
- package/dist/index-gnh-Oe0n.d.cts +34 -0
- package/dist/{index-DO9J-Fla.d.mts → index-qlfNErNd.d.cts} +12 -4
- package/dist/index.d.cts +1 -2
- package/dist/index.d.mts +1 -2
- package/dist/style.cjs +1 -1
- package/dist/style.d.cts +2 -2
- package/dist/style.d.mts +2 -2
- package/dist/style.mjs +1 -1
- package/dist/surfaceSystem-BGQBoXv_.cjs +38 -0
- package/dist/surfaceSystem-D8TbmKy3.mjs +21 -0
- package/dist/theme-BxXuXRgQ.cjs +137 -0
- package/dist/theme-Z9_QludW.mjs +102 -0
- package/dist/theme.cjs +25 -24
- package/dist/theme.d.cts +3 -3
- package/dist/theme.d.mts +3 -3
- package/dist/theme.mjs +2 -1
- package/dist/{theme-CDVxig_g.mjs → themes-L-dE7_ck.mjs} +10 -110
- package/dist/{theme-BXlAP3xf.cjs → themes-gd6tcmqS.cjs} +0 -136
- package/dist/{useTablePagination-COTiNH_8.d.mts → useTablePagination-C5VKtqDp.d.cts} +1 -1
- package/dist/{useTablePagination-WFkaUZu8.d.cts → useTablePagination-C6LSlt3w.d.mts} +1 -1
- package/package.json +43 -2
- package/dist/Popover-DwnSLpp1.mjs +0 -253
- package/dist/index-B_dKjEDR.d.mts +0 -23
- package/dist/index-C1WqEDtQ.d.mts +0 -69
- package/dist/index-CA7HnbtH.d.cts +0 -21
- package/dist/index-CKZaErxJ.d.mts +0 -21
- package/dist/index-DBUwu65Z.d.cts +0 -69
- package/dist/index-DzQJSYIh.d.cts +0 -23
- package/dist/index-cuv3o-L7.d.mts +0 -34
- package/dist/index-nB94D7UM.d.cts +0 -34
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { o as styled } from "../src-DLGYOJMh.mjs";
|
|
2
|
+
import { n as useDefaultProps, r as useTheme } from "../theme-Z9_QludW.mjs";
|
|
3
|
+
import { o as MenuActivationContext, t as MenuList } from "../MenuList-B7msJ1IG.mjs";
|
|
4
|
+
import { a as MenuPaper, i as MenuContext, n as useMenuPlacement, t as MenuItem } from "../MenuItem-BR7ingQx.mjs";
|
|
5
|
+
import { MenuItems } from "./MenuItems.mjs";
|
|
6
|
+
import { Children, cloneElement, useCallback, useId, useMemo, useRef, useState } from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/Menu/ContextMenu/ContextMenu.tsx
|
|
9
|
+
const ContextMenuPaper = styled(MenuPaper, {
|
|
10
|
+
name: "ContextMenu",
|
|
11
|
+
slot: "paper",
|
|
12
|
+
label: "ContextMenuPaper"
|
|
13
|
+
})();
|
|
14
|
+
const ContextMenuRoot = styled("div", {
|
|
15
|
+
name: "ContextMenu",
|
|
16
|
+
label: "ContextMenu"
|
|
17
|
+
})({ display: "contents" });
|
|
18
|
+
const isMenuKey = (event) => event.key === "ContextMenu" || event.key === "F10" && event.shiftKey;
|
|
19
|
+
/** The element given, listening for a right-click and the context-menu keys. */
|
|
20
|
+
function ContextMenuTarget({ element, onContextMenu, onKeyDown }) {
|
|
21
|
+
return cloneElement(element, {
|
|
22
|
+
onContextMenu,
|
|
23
|
+
onKeyDown
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* @description A `MenuList` opened at the pointer by a right-click over its target, or at
|
|
28
|
+
* the focused element by the context-menu key or Shift+F10. It is placed and closes as
|
|
29
|
+
* `Menu` does - Escape, a chosen row or focus leaving - and gives focus back to where it
|
|
30
|
+
* was. The browser's own menu is held back only when this one opens.
|
|
31
|
+
*/
|
|
32
|
+
function ContextMenu({ target, children, items, onClose, onSelect, marginThreshold: marginThresholdProp, elevation: elevationProp, layer: layerProp, emptyLabel, color: colorProp, textColor: textColorProp, size: sizeProp, dense: denseProp, "aria-label": ariaLabel, className, "data-testid": dataTestid }) {
|
|
33
|
+
const dp = useDefaultProps("ContextMenu");
|
|
34
|
+
const marginThreshold = marginThresholdProp ?? dp.marginThreshold ?? 2;
|
|
35
|
+
const elevation = elevationProp ?? dp.elevation ?? 8;
|
|
36
|
+
const layer = layerProp ?? dp.layer ?? "modal";
|
|
37
|
+
const color = colorProp ?? dp.color;
|
|
38
|
+
const textColor = textColorProp ?? dp.textColor;
|
|
39
|
+
const size = sizeProp ?? dp.size;
|
|
40
|
+
const dense = denseProp ?? dp.dense;
|
|
41
|
+
const theme = useTheme();
|
|
42
|
+
const [point, setPoint] = useState(null);
|
|
43
|
+
const isOpen = point !== null;
|
|
44
|
+
const rootRef = useRef(null);
|
|
45
|
+
const surfaceRef = useRef(null);
|
|
46
|
+
const returnFocusRef = useRef(null);
|
|
47
|
+
const listId = useId();
|
|
48
|
+
const margin = Number.parseFloat(String(theme.space[marginThreshold]));
|
|
49
|
+
const menuContext = useMemo(() => ({
|
|
50
|
+
align: "start",
|
|
51
|
+
margin,
|
|
52
|
+
elevation,
|
|
53
|
+
layer
|
|
54
|
+
}), [
|
|
55
|
+
margin,
|
|
56
|
+
elevation,
|
|
57
|
+
layer
|
|
58
|
+
]);
|
|
59
|
+
useMenuPlacement({
|
|
60
|
+
isOpen,
|
|
61
|
+
anchorRef: rootRef,
|
|
62
|
+
anchorPosition: point,
|
|
63
|
+
surfaceRef,
|
|
64
|
+
placement: "below",
|
|
65
|
+
align: "start",
|
|
66
|
+
margin
|
|
67
|
+
});
|
|
68
|
+
const openAt = (top, left) => {
|
|
69
|
+
returnFocusRef.current = document.activeElement;
|
|
70
|
+
setPoint({
|
|
71
|
+
top,
|
|
72
|
+
left
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
const close = useCallback((event, reason) => {
|
|
76
|
+
setPoint(null);
|
|
77
|
+
onClose?.(event, reason);
|
|
78
|
+
if (reason !== "blur") returnFocusRef.current.focus();
|
|
79
|
+
}, [onClose]);
|
|
80
|
+
const handleActivate = useCallback((_value, event) => close(event, "select"), [close]);
|
|
81
|
+
const handleContextMenu = (event) => {
|
|
82
|
+
target.props.onContextMenu?.(event);
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
openAt(event.clientY, event.clientX);
|
|
85
|
+
};
|
|
86
|
+
const handleKeyDown = (event) => {
|
|
87
|
+
target.props.onKeyDown?.(event);
|
|
88
|
+
if (!isMenuKey(event)) return;
|
|
89
|
+
event.preventDefault();
|
|
90
|
+
const { bottom, left } = event.target.getBoundingClientRect();
|
|
91
|
+
openAt(bottom, left);
|
|
92
|
+
};
|
|
93
|
+
const handleSurfaceKeyDown = (event) => {
|
|
94
|
+
if (event.key === "Escape") {
|
|
95
|
+
event.preventDefault();
|
|
96
|
+
close(event, "escapeKey");
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const handleBlur = (event) => {
|
|
100
|
+
const next = event.relatedTarget;
|
|
101
|
+
if (isOpen && !event.currentTarget.contains(next)) close(event, "blur");
|
|
102
|
+
};
|
|
103
|
+
const hasRows = items ? items.length > 0 : Children.toArray(children).length > 0;
|
|
104
|
+
const rows = items ? /* @__PURE__ */ jsx(MenuItems, { items }) : children;
|
|
105
|
+
return /* @__PURE__ */ jsxs(ContextMenuRoot, {
|
|
106
|
+
ref: rootRef,
|
|
107
|
+
className,
|
|
108
|
+
"data-testid": dataTestid,
|
|
109
|
+
onBlur: handleBlur,
|
|
110
|
+
children: [/* @__PURE__ */ jsx(ContextMenuTarget, {
|
|
111
|
+
element: target,
|
|
112
|
+
onContextMenu: handleContextMenu,
|
|
113
|
+
onKeyDown: handleKeyDown
|
|
114
|
+
}), isOpen && /* @__PURE__ */ jsx(ContextMenuPaper, {
|
|
115
|
+
ref: surfaceRef,
|
|
116
|
+
elevation,
|
|
117
|
+
layer,
|
|
118
|
+
margin,
|
|
119
|
+
onKeyDown: handleSurfaceKeyDown,
|
|
120
|
+
children: /* @__PURE__ */ jsx(MenuContext.Provider, {
|
|
121
|
+
value: menuContext,
|
|
122
|
+
children: /* @__PURE__ */ jsx(MenuActivationContext.Provider, {
|
|
123
|
+
value: handleActivate,
|
|
124
|
+
children: /* @__PURE__ */ jsx(MenuList, {
|
|
125
|
+
id: listId,
|
|
126
|
+
"aria-label": ariaLabel,
|
|
127
|
+
shouldAutoFocus: true,
|
|
128
|
+
onSelect,
|
|
129
|
+
color,
|
|
130
|
+
textColor,
|
|
131
|
+
size,
|
|
132
|
+
dense,
|
|
133
|
+
width: "100%",
|
|
134
|
+
children: hasRows ? rows : emptyLabel != null && /* @__PURE__ */ jsx(MenuItem, {
|
|
135
|
+
disabled: true,
|
|
136
|
+
children: emptyLabel
|
|
137
|
+
})
|
|
138
|
+
})
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
})]
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//#endregion
|
|
145
|
+
export { ContextMenu };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_src = require("../src-DU81aGy9.cjs");
|
|
3
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
+
//#region src/Menu/MenuDivider/MenuDivider.tsx
|
|
5
|
+
const MenuDividerRoot = require_src.styled("li", {
|
|
6
|
+
name: "MenuDivider",
|
|
7
|
+
label: "MenuDivider"
|
|
8
|
+
})(({ theme }) => ({
|
|
9
|
+
listStyle: "none",
|
|
10
|
+
height: 0,
|
|
11
|
+
marginTop: theme.space[.5],
|
|
12
|
+
marginBottom: theme.space[.5],
|
|
13
|
+
borderTopWidth: theme.borderWidths.thin,
|
|
14
|
+
borderTopStyle: "solid",
|
|
15
|
+
borderTopColor: (0, require_src.src_exports.get)(theme, "border.light")
|
|
16
|
+
}));
|
|
17
|
+
/**
|
|
18
|
+
* @description A `role="separator"` line between groups of rows in a `MenuList`. The
|
|
19
|
+
* arrow keys pass over it.
|
|
20
|
+
*/
|
|
21
|
+
function MenuDivider({ className, "data-testid": dataTestid }) {
|
|
22
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MenuDividerRoot, {
|
|
23
|
+
role: "separator",
|
|
24
|
+
className,
|
|
25
|
+
"data-testid": dataTestid
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
exports.MenuDivider = MenuDivider;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/Menu/MenuDivider/MenuDivider.d.ts
|
|
2
|
+
interface MenuDividerProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
'data-testid'?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* @description A `role="separator"` line between groups of rows in a `MenuList`. The
|
|
8
|
+
* arrow keys pass over it.
|
|
9
|
+
*/
|
|
10
|
+
declare function MenuDivider({ className, 'data-testid': dataTestid }: Readonly<MenuDividerProps>): import("react").JSX.Element;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { MenuDivider, MenuDividerProps };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/Menu/MenuDivider/MenuDivider.d.ts
|
|
2
|
+
interface MenuDividerProps {
|
|
3
|
+
className?: string;
|
|
4
|
+
'data-testid'?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* @description A `role="separator"` line between groups of rows in a `MenuList`. The
|
|
8
|
+
* arrow keys pass over it.
|
|
9
|
+
*/
|
|
10
|
+
declare function MenuDivider({ className, 'data-testid': dataTestid }: Readonly<MenuDividerProps>): import("react").JSX.Element;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { MenuDivider, MenuDividerProps };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { a as src_exports, o as styled } from "../src-DLGYOJMh.mjs";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
//#region src/Menu/MenuDivider/MenuDivider.tsx
|
|
4
|
+
const MenuDividerRoot = styled("li", {
|
|
5
|
+
name: "MenuDivider",
|
|
6
|
+
label: "MenuDivider"
|
|
7
|
+
})(({ theme }) => ({
|
|
8
|
+
listStyle: "none",
|
|
9
|
+
height: 0,
|
|
10
|
+
marginTop: theme.space[.5],
|
|
11
|
+
marginBottom: theme.space[.5],
|
|
12
|
+
borderTopWidth: theme.borderWidths.thin,
|
|
13
|
+
borderTopStyle: "solid",
|
|
14
|
+
borderTopColor: (0, src_exports.get)(theme, "border.light")
|
|
15
|
+
}));
|
|
16
|
+
/**
|
|
17
|
+
* @description A `role="separator"` line between groups of rows in a `MenuList`. The
|
|
18
|
+
* arrow keys pass over it.
|
|
19
|
+
*/
|
|
20
|
+
function MenuDivider({ className, "data-testid": dataTestid }) {
|
|
21
|
+
return /* @__PURE__ */ jsx(MenuDividerRoot, {
|
|
22
|
+
role: "separator",
|
|
23
|
+
className,
|
|
24
|
+
"data-testid": dataTestid
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { MenuDivider };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_MenuItem = require("../MenuItem-CfdN4axw.cjs");
|
|
3
|
+
const require_Menu_MenuDivider = require("./MenuDivider.cjs");
|
|
4
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
|
+
//#region src/Menu/MenuItems/MenuItems.tsx
|
|
6
|
+
const isDivider = (item) => "type" in item && item.type === "divider";
|
|
7
|
+
/**
|
|
8
|
+
* @description Menu rows from data: each entry a `MenuItem` (its label as `label`, its
|
|
9
|
+
* submenu as more entries) or `{ type: 'divider' }`. It renders the same rows JSX children
|
|
10
|
+
* would, so the two behave alike - inside a `MenuList`, a `Menu` or a `ContextMenu`.
|
|
11
|
+
*/
|
|
12
|
+
function MenuItems({ items }) {
|
|
13
|
+
let dividers = 0;
|
|
14
|
+
return items.map((item, index) => {
|
|
15
|
+
if (isDivider(item)) {
|
|
16
|
+
dividers += 1;
|
|
17
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Menu_MenuDivider.MenuDivider, {}, `divider-${dividers}`);
|
|
18
|
+
}
|
|
19
|
+
const { label, submenu, ...row } = item;
|
|
20
|
+
const submenuRows = submenu?.length ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MenuItems, { items: submenu }) : null;
|
|
21
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.MenuItem, {
|
|
22
|
+
...row,
|
|
23
|
+
submenu: submenu === void 0 ? void 0 : submenuRows,
|
|
24
|
+
children: label
|
|
25
|
+
}, item.value ?? `row-${index}`);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
exports.MenuItems = MenuItems;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { t as MenuItem } from "../MenuItem-BR7ingQx.mjs";
|
|
2
|
+
import { MenuDivider } from "./MenuDivider.mjs";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/Menu/MenuItems/MenuItems.tsx
|
|
5
|
+
const isDivider = (item) => "type" in item && item.type === "divider";
|
|
6
|
+
/**
|
|
7
|
+
* @description Menu rows from data: each entry a `MenuItem` (its label as `label`, its
|
|
8
|
+
* submenu as more entries) or `{ type: 'divider' }`. It renders the same rows JSX children
|
|
9
|
+
* would, so the two behave alike - inside a `MenuList`, a `Menu` or a `ContextMenu`.
|
|
10
|
+
*/
|
|
11
|
+
function MenuItems({ items }) {
|
|
12
|
+
let dividers = 0;
|
|
13
|
+
return items.map((item, index) => {
|
|
14
|
+
if (isDivider(item)) {
|
|
15
|
+
dividers += 1;
|
|
16
|
+
return /* @__PURE__ */ jsx(MenuDivider, {}, `divider-${dividers}`);
|
|
17
|
+
}
|
|
18
|
+
const { label, submenu, ...row } = item;
|
|
19
|
+
const submenuRows = submenu?.length ? /* @__PURE__ */ jsx(MenuItems, { items: submenu }) : null;
|
|
20
|
+
return /* @__PURE__ */ jsx(MenuItem, {
|
|
21
|
+
...row,
|
|
22
|
+
submenu: submenu === void 0 ? void 0 : submenuRows,
|
|
23
|
+
children: label
|
|
24
|
+
}, item.value ?? `row-${index}`);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { MenuItems };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { V as Theme } from "../index-DmJ7yWWi.cjs";
|
|
2
|
+
import { t as MenuItemValue } from "../MenuListContext-vujGcRk9.cjs";
|
|
3
|
+
import { KeyboardEvent, ReactNode } from "react";
|
|
4
|
+
import { LayoutProps, SpaceProps } from "@soroush.tech/styled-system";
|
|
5
|
+
//#region src/Menu/MenuList/MenuList.d.ts
|
|
6
|
+
interface MenuListProps extends SpaceProps<Theme>, LayoutProps<Theme> {
|
|
7
|
+
/** `MenuItem` rows and `MenuDivider`s. */
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
/** Fired with a row's `value` when a row that has one is chosen. */
|
|
10
|
+
onSelect?: (value: MenuItemValue) => void;
|
|
11
|
+
/** Carry the arrow keys past the last row to the first, and back. Default: `true`. */
|
|
12
|
+
shouldWrap?: boolean;
|
|
13
|
+
/** Focus the selected row, or the first enabled one, on mount. Default: `false`. */
|
|
14
|
+
shouldAutoFocus?: boolean;
|
|
15
|
+
/** Accent color for every row - resolves to `theme.palette[color]`. A row's own value wins. */
|
|
16
|
+
color?: keyof Theme['palette'];
|
|
17
|
+
/** Base text color for every row - resolves against `theme.text`. A row's own value wins. */
|
|
18
|
+
textColor?: keyof Theme['text'];
|
|
19
|
+
/** Density token for every row - resolves against `theme.sizes`. A row's own value wins. */
|
|
20
|
+
size?: keyof Theme['sizes'];
|
|
21
|
+
/** Compact vertical padding for every row. */
|
|
22
|
+
dense?: boolean;
|
|
23
|
+
onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;
|
|
24
|
+
id?: string;
|
|
25
|
+
className?: string;
|
|
26
|
+
'aria-label'?: string;
|
|
27
|
+
'aria-labelledby'?: string;
|
|
28
|
+
'data-testid'?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @description A `role="menu"` list that owns the keyboard: the arrow keys, Home and End
|
|
32
|
+
* move focus between its own rows, skipping disabled ones; typing jumps to a row by its
|
|
33
|
+
* label. Rows are found in the DOM by their nearest `role="menu"`, so a nested submenu's
|
|
34
|
+
* rows are never this list's. Renders in place - `Menu` floats one next to a trigger.
|
|
35
|
+
*/
|
|
36
|
+
declare function MenuList({ children, onSelect, shouldWrap: shouldWrapProp, shouldAutoFocus, color, textColor, size, dense, onKeyDown, ...rest }: Readonly<MenuListProps>): import("react").JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { type MenuItemValue, MenuList, MenuListProps };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { V as Theme } from "../index-CVNJEUwJ.mjs";
|
|
2
|
+
import { t as MenuItemValue } from "../MenuListContext-Dml16k0X.mjs";
|
|
3
|
+
import { LayoutProps, SpaceProps } from "@soroush.tech/styled-system";
|
|
4
|
+
import { KeyboardEvent, ReactNode } from "react";
|
|
5
|
+
//#region src/Menu/MenuList/MenuList.d.ts
|
|
6
|
+
interface MenuListProps extends SpaceProps<Theme>, LayoutProps<Theme> {
|
|
7
|
+
/** `MenuItem` rows and `MenuDivider`s. */
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
/** Fired with a row's `value` when a row that has one is chosen. */
|
|
10
|
+
onSelect?: (value: MenuItemValue) => void;
|
|
11
|
+
/** Carry the arrow keys past the last row to the first, and back. Default: `true`. */
|
|
12
|
+
shouldWrap?: boolean;
|
|
13
|
+
/** Focus the selected row, or the first enabled one, on mount. Default: `false`. */
|
|
14
|
+
shouldAutoFocus?: boolean;
|
|
15
|
+
/** Accent color for every row - resolves to `theme.palette[color]`. A row's own value wins. */
|
|
16
|
+
color?: keyof Theme['palette'];
|
|
17
|
+
/** Base text color for every row - resolves against `theme.text`. A row's own value wins. */
|
|
18
|
+
textColor?: keyof Theme['text'];
|
|
19
|
+
/** Density token for every row - resolves against `theme.sizes`. A row's own value wins. */
|
|
20
|
+
size?: keyof Theme['sizes'];
|
|
21
|
+
/** Compact vertical padding for every row. */
|
|
22
|
+
dense?: boolean;
|
|
23
|
+
onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;
|
|
24
|
+
id?: string;
|
|
25
|
+
className?: string;
|
|
26
|
+
'aria-label'?: string;
|
|
27
|
+
'aria-labelledby'?: string;
|
|
28
|
+
'data-testid'?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @description A `role="menu"` list that owns the keyboard: the arrow keys, Home and End
|
|
32
|
+
* move focus between its own rows, skipping disabled ones; typing jumps to a row by its
|
|
33
|
+
* label. Rows are found in the DOM by their nearest `role="menu"`, so a nested submenu's
|
|
34
|
+
* rows are never this list's. Renders in place - `Menu` floats one next to a trigger.
|
|
35
|
+
*/
|
|
36
|
+
declare function MenuList({ children, onSelect, shouldWrap: shouldWrapProp, shouldAutoFocus, color, textColor, size, dense, onKeyDown, ...rest }: Readonly<MenuListProps>): import("react").JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { type MenuItemValue, MenuList, MenuListProps };
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
const require_src = require("./src-DU81aGy9.cjs");
|
|
2
|
+
const require_theme = require("./theme-BxXuXRgQ.cjs");
|
|
3
|
+
const require_MenuList = require("./MenuList-D4imLXAa.cjs");
|
|
4
|
+
const require_MenuItem = require("./MenuItem-CfdN4axw.cjs");
|
|
5
|
+
const require_Menu_MenuItems = require("./Menu/MenuItems.cjs");
|
|
6
|
+
let react = require("react");
|
|
7
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
+
//#region src/Menu/utils/assignRef.ts
|
|
9
|
+
/** Hands `value` to a ref of either kind - a callback, or an object - when there is one. */
|
|
10
|
+
function assignRef(ref, value) {
|
|
11
|
+
if (typeof ref === "function") ref(value);
|
|
12
|
+
else if (ref) ref.current = value;
|
|
13
|
+
}
|
|
14
|
+
//#endregion
|
|
15
|
+
//#region src/Menu/Menu/Menu.tsx
|
|
16
|
+
const MenuRoot = require_src.styled("div", {
|
|
17
|
+
name: "Menu",
|
|
18
|
+
label: "Menu"
|
|
19
|
+
})({ display: "inline-flex" });
|
|
20
|
+
/** The menu's trigger: the element given, as the button that opens the list. */
|
|
21
|
+
function MenuTrigger({ element, id, elementRef, isOpen, listId, onClick, onKeyDown }) {
|
|
22
|
+
return (0, react.cloneElement)(element, {
|
|
23
|
+
id,
|
|
24
|
+
ref: elementRef,
|
|
25
|
+
"aria-haspopup": "menu",
|
|
26
|
+
"aria-expanded": isOpen,
|
|
27
|
+
"aria-controls": isOpen ? listId : void 0,
|
|
28
|
+
onClick,
|
|
29
|
+
onKeyDown
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @description A trigger and the `MenuList` it opens. Not modal: no focus trap, no scroll
|
|
34
|
+
* lock, nothing laid over the page, so the pointer passes over it freely. The list is
|
|
35
|
+
* placed `position: fixed` in the window next to the trigger, so a panel's overflow
|
|
36
|
+
* can't clip it, but stays inside the menu's own box in the DOM. Escape or a chosen row
|
|
37
|
+
* closes it and returns focus to the trigger; focus leaving it closes it where it went.
|
|
38
|
+
*/
|
|
39
|
+
function Menu({ trigger, children, items, isOpen: isOpenProp, defaultOpen = false, onOpen, onClose, onStep, onSelect, align: alignProp, marginThreshold: marginThresholdProp, elevation: elevationProp, layer: layerProp, emptyLabel, color: colorProp, textColor: textColorProp, size: sizeProp, dense: denseProp, "aria-label": ariaLabel, className, "data-testid": dataTestid }) {
|
|
40
|
+
const dp = require_theme.useDefaultProps("Menu");
|
|
41
|
+
const align = alignProp ?? dp.align ?? "start";
|
|
42
|
+
const marginThreshold = marginThresholdProp ?? dp.marginThreshold ?? 2;
|
|
43
|
+
const elevation = elevationProp ?? dp.elevation ?? 8;
|
|
44
|
+
const layer = layerProp ?? dp.layer ?? "modal";
|
|
45
|
+
const color = colorProp ?? dp.color;
|
|
46
|
+
const textColor = textColorProp ?? dp.textColor;
|
|
47
|
+
const size = sizeProp ?? dp.size;
|
|
48
|
+
const dense = denseProp ?? dp.dense;
|
|
49
|
+
const theme = require_theme.useTheme();
|
|
50
|
+
const isControlled = isOpenProp !== void 0;
|
|
51
|
+
const [isOpenState, setIsOpenState] = (0, react.useState)(defaultOpen);
|
|
52
|
+
const isOpen = isControlled ? isOpenProp : isOpenState;
|
|
53
|
+
const rootRef = (0, react.useRef)(null);
|
|
54
|
+
const triggerRef = (0, react.useRef)(null);
|
|
55
|
+
const surfaceRef = (0, react.useRef)(null);
|
|
56
|
+
const listId = (0, react.useId)();
|
|
57
|
+
const fallbackTriggerId = (0, react.useId)();
|
|
58
|
+
const triggerId = trigger.props.id ?? fallbackTriggerId;
|
|
59
|
+
const margin = Number.parseFloat(String(theme.space[marginThreshold]));
|
|
60
|
+
const menuContext = (0, react.useMemo)(() => ({
|
|
61
|
+
align,
|
|
62
|
+
margin,
|
|
63
|
+
elevation,
|
|
64
|
+
layer
|
|
65
|
+
}), [
|
|
66
|
+
align,
|
|
67
|
+
margin,
|
|
68
|
+
elevation,
|
|
69
|
+
layer
|
|
70
|
+
]);
|
|
71
|
+
require_MenuItem.useMenuPlacement({
|
|
72
|
+
isOpen,
|
|
73
|
+
anchorRef: rootRef,
|
|
74
|
+
surfaceRef,
|
|
75
|
+
placement: "below",
|
|
76
|
+
align,
|
|
77
|
+
margin
|
|
78
|
+
});
|
|
79
|
+
const open = () => {
|
|
80
|
+
if (!isControlled) setIsOpenState(true);
|
|
81
|
+
onOpen?.();
|
|
82
|
+
};
|
|
83
|
+
const close = (0, react.useCallback)((event, reason) => {
|
|
84
|
+
if (!isControlled) setIsOpenState(false);
|
|
85
|
+
onClose?.(event, reason);
|
|
86
|
+
if (reason !== "blur") triggerRef.current?.focus();
|
|
87
|
+
}, [isControlled, onClose]);
|
|
88
|
+
const triggerProps = trigger.props;
|
|
89
|
+
const setTriggerRef = (0, react.useCallback)((element) => {
|
|
90
|
+
triggerRef.current = element;
|
|
91
|
+
assignRef(triggerProps.ref, element);
|
|
92
|
+
}, [triggerProps]);
|
|
93
|
+
const handleActivate = (0, react.useCallback)((_value, event) => close(event, "select"), [close]);
|
|
94
|
+
const handleTriggerClick = (event) => {
|
|
95
|
+
trigger.props.onClick?.(event);
|
|
96
|
+
if (isOpen) close(event, "triggerClick");
|
|
97
|
+
else open();
|
|
98
|
+
};
|
|
99
|
+
const handleTriggerKeyDown = (event) => {
|
|
100
|
+
trigger.props.onKeyDown?.(event);
|
|
101
|
+
if (!isOpen && (event.key === "ArrowDown" || event.key === "ArrowUp")) {
|
|
102
|
+
event.preventDefault();
|
|
103
|
+
open();
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const handleSurfaceKeyDown = (event) => {
|
|
107
|
+
if (event.key === "Escape") {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
close(event, "escapeKey");
|
|
110
|
+
} else if (onStep && (event.key === "ArrowLeft" || event.key === "ArrowRight")) {
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
const step = event.key === "ArrowRight" ? 1 : -1;
|
|
113
|
+
onStep(require_MenuItem.isRtl(event.currentTarget) ? -step : step);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
const handleBlur = (event) => {
|
|
117
|
+
const next = event.relatedTarget;
|
|
118
|
+
if (isOpen && !event.currentTarget.contains(next)) close(event, "blur");
|
|
119
|
+
};
|
|
120
|
+
const hasRows = items ? items.length > 0 : react.Children.toArray(children).length > 0;
|
|
121
|
+
const rows = items ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Menu_MenuItems.MenuItems, { items }) : children;
|
|
122
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(MenuRoot, {
|
|
123
|
+
ref: rootRef,
|
|
124
|
+
className,
|
|
125
|
+
"data-testid": dataTestid,
|
|
126
|
+
onBlur: handleBlur,
|
|
127
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(MenuTrigger, {
|
|
128
|
+
element: trigger,
|
|
129
|
+
id: triggerId,
|
|
130
|
+
elementRef: setTriggerRef,
|
|
131
|
+
isOpen,
|
|
132
|
+
listId,
|
|
133
|
+
onClick: handleTriggerClick,
|
|
134
|
+
onKeyDown: handleTriggerKeyDown
|
|
135
|
+
}), isOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.MenuPaper, {
|
|
136
|
+
ref: surfaceRef,
|
|
137
|
+
elevation,
|
|
138
|
+
layer,
|
|
139
|
+
margin,
|
|
140
|
+
onKeyDown: handleSurfaceKeyDown,
|
|
141
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.MenuContext.Provider, {
|
|
142
|
+
value: menuContext,
|
|
143
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuList.MenuActivationContext.Provider, {
|
|
144
|
+
value: handleActivate,
|
|
145
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuList.MenuList, {
|
|
146
|
+
id: listId,
|
|
147
|
+
"aria-label": ariaLabel,
|
|
148
|
+
"aria-labelledby": ariaLabel ? void 0 : triggerId,
|
|
149
|
+
shouldAutoFocus: true,
|
|
150
|
+
onSelect,
|
|
151
|
+
color,
|
|
152
|
+
textColor,
|
|
153
|
+
size,
|
|
154
|
+
dense,
|
|
155
|
+
width: "100%",
|
|
156
|
+
children: hasRows ? rows : emptyLabel != null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_MenuItem.MenuItem, {
|
|
157
|
+
disabled: true,
|
|
158
|
+
children: emptyLabel
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
})]
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
//#endregion
|
|
167
|
+
Object.defineProperty(exports, "Menu", {
|
|
168
|
+
enumerable: true,
|
|
169
|
+
get: function() {
|
|
170
|
+
return Menu;
|
|
171
|
+
}
|
|
172
|
+
});
|