@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
package/dist/MenuItem.cjs
CHANGED
|
@@ -1,149 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
const require_theme = require("./theme-BXlAP3xf.cjs");
|
|
5
|
-
const require_Icon = require("./Icon-CI6q2Eyi.cjs");
|
|
6
|
-
let react = require("react");
|
|
7
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
-
//#region src/MenuItem/MenuItem.tsx
|
|
9
|
-
const shouldForwardProp = (0, require("@soroush.tech/styled-system/should-forward-prop").createShouldForwardProp)([
|
|
10
|
-
"color",
|
|
11
|
-
"textColor",
|
|
12
|
-
"sizeToken",
|
|
13
|
-
"selected",
|
|
14
|
-
"highlighted",
|
|
15
|
-
"disabled",
|
|
16
|
-
"dense",
|
|
17
|
-
"disableGutters",
|
|
18
|
-
"divider"
|
|
19
|
-
]);
|
|
20
|
-
const baseStyle = ({ theme }) => ({
|
|
21
|
-
display: "flex",
|
|
22
|
-
alignItems: "center",
|
|
23
|
-
gap: theme.space[1],
|
|
24
|
-
cursor: "pointer",
|
|
25
|
-
fontFamily: theme.fonts.body,
|
|
26
|
-
lineHeight: theme.lineHeights.base,
|
|
27
|
-
listStyle: "none",
|
|
28
|
-
userSelect: "none",
|
|
29
|
-
whiteSpace: "nowrap",
|
|
30
|
-
transition: "background-color 0.12s ease",
|
|
31
|
-
outline: "none"
|
|
32
|
-
});
|
|
33
|
-
const sizeVariants = ({ theme, sizeToken, dense, disableGutters }) => {
|
|
34
|
-
const s = theme.sizes[sizeToken];
|
|
35
|
-
const verticalPadding = dense ? theme.space[.5] : void 0;
|
|
36
|
-
return {
|
|
37
|
-
paddingTop: verticalPadding ?? theme.space[s.paddingTop],
|
|
38
|
-
paddingBottom: verticalPadding ?? theme.space[s.paddingBottom],
|
|
39
|
-
paddingLeft: disableGutters ? 0 : theme.space[s.paddingLeft],
|
|
40
|
-
paddingRight: disableGutters ? 0 : theme.space[s.paddingRight],
|
|
41
|
-
fontSize: theme.fontSizes[s.fontSize]
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
const dividerStyle = ({ theme, divider }) => divider ? {
|
|
45
|
-
borderBottomWidth: theme.borderWidths.thin,
|
|
46
|
-
borderBottomStyle: "solid",
|
|
47
|
-
borderBottomColor: (0, require_src.src_exports.get)(theme, "border.light")
|
|
48
|
-
} : {};
|
|
49
|
-
const interactionStyles = ({ theme, color, textColor, selected, highlighted, disabled }) => {
|
|
50
|
-
const main = (0, require_src.src_exports.get)(theme, `palette.${color}.main`);
|
|
51
|
-
const hoverBg = `${main}1F`;
|
|
52
|
-
const selectedBg = `${main}29`;
|
|
53
|
-
const activeSelectedBg = `${main}3D`;
|
|
54
|
-
if (disabled) return {
|
|
55
|
-
color: (0, require_src.src_exports.get)(theme, "text.disabled"),
|
|
56
|
-
cursor: "not-allowed",
|
|
57
|
-
pointerEvents: "none"
|
|
58
|
-
};
|
|
59
|
-
const baseColor = textColor ? (0, require_src.src_exports.get)(theme, `text.${textColor}`) : main;
|
|
60
|
-
return {
|
|
61
|
-
color: selected ? main : baseColor,
|
|
62
|
-
backgroundColor: selected ? highlighted ? activeSelectedBg : selectedBg : highlighted ? hoverBg : "transparent",
|
|
63
|
-
"&:hover": { backgroundColor: selected ? activeSelectedBg : hoverBg }
|
|
64
|
-
};
|
|
65
|
-
};
|
|
66
|
-
const MenuItemRoot = require_src.styled("li", {
|
|
67
|
-
name: "MenuItem",
|
|
68
|
-
label: "MenuItem",
|
|
69
|
-
shouldForwardProp
|
|
70
|
-
})(baseStyle, sizeVariants, dividerStyle, interactionStyles);
|
|
71
|
-
const CheckSlot = require_src.styled("span", {
|
|
72
|
-
name: "MenuItem",
|
|
73
|
-
slot: "check",
|
|
74
|
-
label: "MenuItemCheck"
|
|
75
|
-
})({
|
|
76
|
-
display: "inline-flex",
|
|
77
|
-
width: "1.125rem",
|
|
78
|
-
flexShrink: 0
|
|
79
|
-
});
|
|
80
|
-
function isKeyboardFocus(element) {
|
|
81
|
-
try {
|
|
82
|
-
return element.matches(":focus-visible");
|
|
83
|
-
} catch {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* @description A single option row for `Select`'s listbox. Rendered as a semantic
|
|
89
|
-
* `<li role="option">` (override via `as`). Selection/highlight/density props are
|
|
90
|
-
* injected by `Select`; used on its own it renders a static, styled row.
|
|
91
|
-
*/
|
|
92
|
-
function MenuItem({ value, children, as, disabled = false, selected = false, highlighted = false, multiple = false, color: colorProp, textColor, size: sizeProp, dense = false, disableGutters = false, divider = false, autoFocus = false, focusVisibleClassName, onSelect, id, className, "data-testid": dataTestid }) {
|
|
93
|
-
const theme = require_theme.useTheme();
|
|
94
|
-
const color = colorProp ?? require_themeDefault.themeDefault(theme, "color", "primary");
|
|
95
|
-
const size = sizeProp ?? require_themeDefault.themeDefault(theme, "size", "md");
|
|
96
|
-
const rootRef = (0, react.useRef)(null);
|
|
97
|
-
const [isFocusVisible, setIsFocusVisible] = (0, react.useState)(false);
|
|
98
|
-
(0, react.useEffect)(() => {
|
|
99
|
-
if (autoFocus) rootRef.current?.focus();
|
|
100
|
-
}, [autoFocus]);
|
|
101
|
-
const handleClick = () => {
|
|
102
|
-
if (!disabled) onSelect?.(value);
|
|
103
|
-
};
|
|
104
|
-
const handleMouseDown = (event) => {
|
|
105
|
-
event.preventDefault();
|
|
106
|
-
};
|
|
107
|
-
const handleFocus = (event) => {
|
|
108
|
-
if (focusVisibleClassName && isKeyboardFocus(event.currentTarget)) setIsFocusVisible(true);
|
|
109
|
-
};
|
|
110
|
-
const handleBlur = () => {
|
|
111
|
-
setIsFocusVisible(false);
|
|
112
|
-
};
|
|
113
|
-
const rootClassName = [className, isFocusVisible ? focusVisibleClassName : void 0].filter(Boolean).join(" ") || void 0;
|
|
114
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(MenuItemRoot, {
|
|
115
|
-
as,
|
|
116
|
-
ref: rootRef,
|
|
117
|
-
id,
|
|
118
|
-
role: "option",
|
|
119
|
-
tabIndex: -1,
|
|
120
|
-
"aria-selected": selected,
|
|
121
|
-
"aria-disabled": disabled || void 0,
|
|
122
|
-
"data-value": value,
|
|
123
|
-
color,
|
|
124
|
-
textColor,
|
|
125
|
-
sizeToken: size,
|
|
126
|
-
selected,
|
|
127
|
-
highlighted,
|
|
128
|
-
disabled,
|
|
129
|
-
dense,
|
|
130
|
-
disableGutters,
|
|
131
|
-
divider,
|
|
132
|
-
className: rootClassName,
|
|
133
|
-
"data-testid": dataTestid,
|
|
134
|
-
onMouseDown: handleMouseDown,
|
|
135
|
-
onClick: handleClick,
|
|
136
|
-
onFocus: handleFocus,
|
|
137
|
-
onBlur: handleBlur,
|
|
138
|
-
children: [multiple && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CheckSlot, {
|
|
139
|
-
"aria-hidden": true,
|
|
140
|
-
children: selected && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
|
|
141
|
-
name: "check",
|
|
142
|
-
size: "1.125rem",
|
|
143
|
-
color: "inherit"
|
|
144
|
-
})
|
|
145
|
-
}), children]
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
//#endregion
|
|
149
|
-
exports.MenuItem = MenuItem;
|
|
2
|
+
const require_MenuItem = require("./MenuItem-CfdN4axw.cjs");
|
|
3
|
+
exports.MenuItem = require_MenuItem.MenuItem;
|
package/dist/MenuItem.d.cts
CHANGED
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { ElementType, ReactNode } from "react";
|
|
4
|
-
//#region src/MenuItem/MenuItem.d.ts
|
|
5
|
-
type MenuItemColor = keyof Theme['palette'];
|
|
6
|
-
type MenuItemSize = keyof Theme['sizes'];
|
|
7
|
-
type MenuItemTextColor = keyof Theme['text'];
|
|
8
|
-
interface MenuItemProps {
|
|
9
|
-
/** The value this option represents - reported to `Select`'s `onChange`. */
|
|
10
|
-
value: string | number;
|
|
11
|
-
/** The option label. */
|
|
12
|
-
children: ReactNode;
|
|
13
|
-
/** The element used for the root node - a tag name or a component. Default: `'li'`. */
|
|
14
|
-
as?: ElementType;
|
|
15
|
-
/** Disables the option - it cannot be highlighted or selected. */
|
|
16
|
-
disabled?: boolean;
|
|
17
|
-
/** Marks the option as the current selection. Injected by `Select`. */
|
|
18
|
-
selected?: boolean;
|
|
19
|
-
/** Marks the option as the keyboard-highlighted row. Injected by `Select`. */
|
|
20
|
-
highlighted?: boolean;
|
|
21
|
-
/** Reserves a leading checkmark slot for multi-select menus. Injected by `Select`. */
|
|
22
|
-
multiple?: boolean;
|
|
23
|
-
/** Accent color - resolves to `theme.palette[color]`. Injected by `Select`; the item's own value wins. Default: 'primary', overridable via `theme.defaults.color`. */
|
|
24
|
-
color?: MenuItemColor;
|
|
25
|
-
/** Base text color of the row - resolves against `theme.text`. When unset, falls back to the accent color's `main`. Injected by `Select`; the item's own value wins. */
|
|
26
|
-
textColor?: MenuItemTextColor;
|
|
27
|
-
/** Density token - resolves against `theme.sizes`. Injected by `Select`. Default: 'md', overridable via `theme.defaults.size`. */
|
|
28
|
-
size?: MenuItemSize;
|
|
29
|
-
/** Compact vertical padding, independent of `size`. Default: `false`. */
|
|
30
|
-
dense?: boolean;
|
|
31
|
-
/** Remove the left and right padding. Default: `false`. */
|
|
32
|
-
disableGutters?: boolean;
|
|
33
|
-
/** Add a 1px bottom border to separate the row. Default: `false`. */
|
|
34
|
-
divider?: boolean;
|
|
35
|
-
/** Focus the row on first mount, and whenever `autoFocus` flips from `false` to `true`. Default: `false`. */
|
|
36
|
-
autoFocus?: boolean;
|
|
37
|
-
/** Class applied only while the row has keyboard focus - a `:focus-visible` hook. */
|
|
38
|
-
focusVisibleClassName?: string;
|
|
39
|
-
/** Fired with `value` when the option is chosen. Injected by `Select`. */
|
|
40
|
-
onSelect?: (value: string | number) => void;
|
|
41
|
-
id?: string;
|
|
42
|
-
className?: string;
|
|
43
|
-
'data-testid'?: string;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* @description A single option row for `Select`'s listbox. Rendered as a semantic
|
|
47
|
-
* `<li role="option">` (override via `as`). Selection/highlight/density props are
|
|
48
|
-
* injected by `Select`; used on its own it renders a static, styled row.
|
|
49
|
-
*/
|
|
50
|
-
declare function MenuItem({ value, children, as, disabled, selected, highlighted, multiple, color: colorProp, textColor, size: sizeProp, dense, disableGutters, divider, autoFocus, focusVisibleClassName, onSelect, id, className, 'data-testid': dataTestid }: Readonly<MenuItemProps>): import("react").JSX.Element;
|
|
51
|
-
//#endregion
|
|
52
|
-
export { MenuItem, MenuItemColor, MenuItemProps, MenuItemSize, MenuItemTextColor };
|
|
1
|
+
import { a as MenuItemSize, i as MenuItemRole, n as MenuItemColor, o as MenuItemTextColor, r as MenuItemProps, t as MenuItem } from "./index-DCmH5f9I.cjs";
|
|
2
|
+
export { MenuItem, MenuItemColor, MenuItemProps, MenuItemRole, MenuItemSize, MenuItemTextColor };
|
package/dist/MenuItem.d.mts
CHANGED
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { ElementType, ReactNode } from "react";
|
|
4
|
-
//#region src/MenuItem/MenuItem.d.ts
|
|
5
|
-
type MenuItemColor = keyof Theme['palette'];
|
|
6
|
-
type MenuItemSize = keyof Theme['sizes'];
|
|
7
|
-
type MenuItemTextColor = keyof Theme['text'];
|
|
8
|
-
interface MenuItemProps {
|
|
9
|
-
/** The value this option represents - reported to `Select`'s `onChange`. */
|
|
10
|
-
value: string | number;
|
|
11
|
-
/** The option label. */
|
|
12
|
-
children: ReactNode;
|
|
13
|
-
/** The element used for the root node - a tag name or a component. Default: `'li'`. */
|
|
14
|
-
as?: ElementType;
|
|
15
|
-
/** Disables the option - it cannot be highlighted or selected. */
|
|
16
|
-
disabled?: boolean;
|
|
17
|
-
/** Marks the option as the current selection. Injected by `Select`. */
|
|
18
|
-
selected?: boolean;
|
|
19
|
-
/** Marks the option as the keyboard-highlighted row. Injected by `Select`. */
|
|
20
|
-
highlighted?: boolean;
|
|
21
|
-
/** Reserves a leading checkmark slot for multi-select menus. Injected by `Select`. */
|
|
22
|
-
multiple?: boolean;
|
|
23
|
-
/** Accent color - resolves to `theme.palette[color]`. Injected by `Select`; the item's own value wins. Default: 'primary', overridable via `theme.defaults.color`. */
|
|
24
|
-
color?: MenuItemColor;
|
|
25
|
-
/** Base text color of the row - resolves against `theme.text`. When unset, falls back to the accent color's `main`. Injected by `Select`; the item's own value wins. */
|
|
26
|
-
textColor?: MenuItemTextColor;
|
|
27
|
-
/** Density token - resolves against `theme.sizes`. Injected by `Select`. Default: 'md', overridable via `theme.defaults.size`. */
|
|
28
|
-
size?: MenuItemSize;
|
|
29
|
-
/** Compact vertical padding, independent of `size`. Default: `false`. */
|
|
30
|
-
dense?: boolean;
|
|
31
|
-
/** Remove the left and right padding. Default: `false`. */
|
|
32
|
-
disableGutters?: boolean;
|
|
33
|
-
/** Add a 1px bottom border to separate the row. Default: `false`. */
|
|
34
|
-
divider?: boolean;
|
|
35
|
-
/** Focus the row on first mount, and whenever `autoFocus` flips from `false` to `true`. Default: `false`. */
|
|
36
|
-
autoFocus?: boolean;
|
|
37
|
-
/** Class applied only while the row has keyboard focus - a `:focus-visible` hook. */
|
|
38
|
-
focusVisibleClassName?: string;
|
|
39
|
-
/** Fired with `value` when the option is chosen. Injected by `Select`. */
|
|
40
|
-
onSelect?: (value: string | number) => void;
|
|
41
|
-
id?: string;
|
|
42
|
-
className?: string;
|
|
43
|
-
'data-testid'?: string;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* @description A single option row for `Select`'s listbox. Rendered as a semantic
|
|
47
|
-
* `<li role="option">` (override via `as`). Selection/highlight/density props are
|
|
48
|
-
* injected by `Select`; used on its own it renders a static, styled row.
|
|
49
|
-
*/
|
|
50
|
-
declare function MenuItem({ value, children, as, disabled, selected, highlighted, multiple, color: colorProp, textColor, size: sizeProp, dense, disableGutters, divider, autoFocus, focusVisibleClassName, onSelect, id, className, 'data-testid': dataTestid }: Readonly<MenuItemProps>): import("react").JSX.Element;
|
|
51
|
-
//#endregion
|
|
52
|
-
export { MenuItem, MenuItemColor, MenuItemProps, MenuItemSize, MenuItemTextColor };
|
|
1
|
+
import { a as MenuItemSize, i as MenuItemRole, n as MenuItemColor, o as MenuItemTextColor, r as MenuItemProps, t as MenuItem } from "./index-Cj5Rhh_9.mjs";
|
|
2
|
+
export { MenuItem, MenuItemColor, MenuItemProps, MenuItemRole, MenuItemSize, MenuItemTextColor };
|
package/dist/MenuItem.mjs
CHANGED
|
@@ -1,148 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { t as themeDefault } from "./themeDefault-Z3KmyIbm.mjs";
|
|
3
|
-
import { r as useTheme } from "./theme-CDVxig_g.mjs";
|
|
4
|
-
import { t as Icon } from "./Icon-CH3asUJu.mjs";
|
|
5
|
-
import { useEffect, useRef, useState } from "react";
|
|
6
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
-
//#region src/MenuItem/MenuItem.tsx
|
|
8
|
-
const shouldForwardProp = createShouldForwardProp([
|
|
9
|
-
"color",
|
|
10
|
-
"textColor",
|
|
11
|
-
"sizeToken",
|
|
12
|
-
"selected",
|
|
13
|
-
"highlighted",
|
|
14
|
-
"disabled",
|
|
15
|
-
"dense",
|
|
16
|
-
"disableGutters",
|
|
17
|
-
"divider"
|
|
18
|
-
]);
|
|
19
|
-
const baseStyle = ({ theme }) => ({
|
|
20
|
-
display: "flex",
|
|
21
|
-
alignItems: "center",
|
|
22
|
-
gap: theme.space[1],
|
|
23
|
-
cursor: "pointer",
|
|
24
|
-
fontFamily: theme.fonts.body,
|
|
25
|
-
lineHeight: theme.lineHeights.base,
|
|
26
|
-
listStyle: "none",
|
|
27
|
-
userSelect: "none",
|
|
28
|
-
whiteSpace: "nowrap",
|
|
29
|
-
transition: "background-color 0.12s ease",
|
|
30
|
-
outline: "none"
|
|
31
|
-
});
|
|
32
|
-
const sizeVariants = ({ theme, sizeToken, dense, disableGutters }) => {
|
|
33
|
-
const s = theme.sizes[sizeToken];
|
|
34
|
-
const verticalPadding = dense ? theme.space[.5] : void 0;
|
|
35
|
-
return {
|
|
36
|
-
paddingTop: verticalPadding ?? theme.space[s.paddingTop],
|
|
37
|
-
paddingBottom: verticalPadding ?? theme.space[s.paddingBottom],
|
|
38
|
-
paddingLeft: disableGutters ? 0 : theme.space[s.paddingLeft],
|
|
39
|
-
paddingRight: disableGutters ? 0 : theme.space[s.paddingRight],
|
|
40
|
-
fontSize: theme.fontSizes[s.fontSize]
|
|
41
|
-
};
|
|
42
|
-
};
|
|
43
|
-
const dividerStyle = ({ theme, divider }) => divider ? {
|
|
44
|
-
borderBottomWidth: theme.borderWidths.thin,
|
|
45
|
-
borderBottomStyle: "solid",
|
|
46
|
-
borderBottomColor: (0, src_exports.get)(theme, "border.light")
|
|
47
|
-
} : {};
|
|
48
|
-
const interactionStyles = ({ theme, color, textColor, selected, highlighted, disabled }) => {
|
|
49
|
-
const main = (0, src_exports.get)(theme, `palette.${color}.main`);
|
|
50
|
-
const hoverBg = `${main}1F`;
|
|
51
|
-
const selectedBg = `${main}29`;
|
|
52
|
-
const activeSelectedBg = `${main}3D`;
|
|
53
|
-
if (disabled) return {
|
|
54
|
-
color: (0, src_exports.get)(theme, "text.disabled"),
|
|
55
|
-
cursor: "not-allowed",
|
|
56
|
-
pointerEvents: "none"
|
|
57
|
-
};
|
|
58
|
-
const baseColor = textColor ? (0, src_exports.get)(theme, `text.${textColor}`) : main;
|
|
59
|
-
return {
|
|
60
|
-
color: selected ? main : baseColor,
|
|
61
|
-
backgroundColor: selected ? highlighted ? activeSelectedBg : selectedBg : highlighted ? hoverBg : "transparent",
|
|
62
|
-
"&:hover": { backgroundColor: selected ? activeSelectedBg : hoverBg }
|
|
63
|
-
};
|
|
64
|
-
};
|
|
65
|
-
const MenuItemRoot = styled("li", {
|
|
66
|
-
name: "MenuItem",
|
|
67
|
-
label: "MenuItem",
|
|
68
|
-
shouldForwardProp
|
|
69
|
-
})(baseStyle, sizeVariants, dividerStyle, interactionStyles);
|
|
70
|
-
const CheckSlot = styled("span", {
|
|
71
|
-
name: "MenuItem",
|
|
72
|
-
slot: "check",
|
|
73
|
-
label: "MenuItemCheck"
|
|
74
|
-
})({
|
|
75
|
-
display: "inline-flex",
|
|
76
|
-
width: "1.125rem",
|
|
77
|
-
flexShrink: 0
|
|
78
|
-
});
|
|
79
|
-
function isKeyboardFocus(element) {
|
|
80
|
-
try {
|
|
81
|
-
return element.matches(":focus-visible");
|
|
82
|
-
} catch {
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* @description A single option row for `Select`'s listbox. Rendered as a semantic
|
|
88
|
-
* `<li role="option">` (override via `as`). Selection/highlight/density props are
|
|
89
|
-
* injected by `Select`; used on its own it renders a static, styled row.
|
|
90
|
-
*/
|
|
91
|
-
function MenuItem({ value, children, as, disabled = false, selected = false, highlighted = false, multiple = false, color: colorProp, textColor, size: sizeProp, dense = false, disableGutters = false, divider = false, autoFocus = false, focusVisibleClassName, onSelect, id, className, "data-testid": dataTestid }) {
|
|
92
|
-
const theme = useTheme();
|
|
93
|
-
const color = colorProp ?? themeDefault(theme, "color", "primary");
|
|
94
|
-
const size = sizeProp ?? themeDefault(theme, "size", "md");
|
|
95
|
-
const rootRef = useRef(null);
|
|
96
|
-
const [isFocusVisible, setIsFocusVisible] = useState(false);
|
|
97
|
-
useEffect(() => {
|
|
98
|
-
if (autoFocus) rootRef.current?.focus();
|
|
99
|
-
}, [autoFocus]);
|
|
100
|
-
const handleClick = () => {
|
|
101
|
-
if (!disabled) onSelect?.(value);
|
|
102
|
-
};
|
|
103
|
-
const handleMouseDown = (event) => {
|
|
104
|
-
event.preventDefault();
|
|
105
|
-
};
|
|
106
|
-
const handleFocus = (event) => {
|
|
107
|
-
if (focusVisibleClassName && isKeyboardFocus(event.currentTarget)) setIsFocusVisible(true);
|
|
108
|
-
};
|
|
109
|
-
const handleBlur = () => {
|
|
110
|
-
setIsFocusVisible(false);
|
|
111
|
-
};
|
|
112
|
-
const rootClassName = [className, isFocusVisible ? focusVisibleClassName : void 0].filter(Boolean).join(" ") || void 0;
|
|
113
|
-
return /* @__PURE__ */ jsxs(MenuItemRoot, {
|
|
114
|
-
as,
|
|
115
|
-
ref: rootRef,
|
|
116
|
-
id,
|
|
117
|
-
role: "option",
|
|
118
|
-
tabIndex: -1,
|
|
119
|
-
"aria-selected": selected,
|
|
120
|
-
"aria-disabled": disabled || void 0,
|
|
121
|
-
"data-value": value,
|
|
122
|
-
color,
|
|
123
|
-
textColor,
|
|
124
|
-
sizeToken: size,
|
|
125
|
-
selected,
|
|
126
|
-
highlighted,
|
|
127
|
-
disabled,
|
|
128
|
-
dense,
|
|
129
|
-
disableGutters,
|
|
130
|
-
divider,
|
|
131
|
-
className: rootClassName,
|
|
132
|
-
"data-testid": dataTestid,
|
|
133
|
-
onMouseDown: handleMouseDown,
|
|
134
|
-
onClick: handleClick,
|
|
135
|
-
onFocus: handleFocus,
|
|
136
|
-
onBlur: handleBlur,
|
|
137
|
-
children: [multiple && /* @__PURE__ */ jsx(CheckSlot, {
|
|
138
|
-
"aria-hidden": true,
|
|
139
|
-
children: selected && /* @__PURE__ */ jsx(Icon, {
|
|
140
|
-
name: "check",
|
|
141
|
-
size: "1.125rem",
|
|
142
|
-
color: "inherit"
|
|
143
|
-
})
|
|
144
|
-
}), children]
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
//#endregion
|
|
1
|
+
import { t as MenuItem } from "./MenuItem-BR7ingQx.mjs";
|
|
148
2
|
export { MenuItem };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { a as src_exports, i as props, o as styled, t as createShouldForwardProp } from "./src-DLGYOJMh.mjs";
|
|
2
|
+
import { t as themeDefault } from "./themeDefault-Z3KmyIbm.mjs";
|
|
3
|
+
import { n as useDefaultProps } from "./theme-Z9_QludW.mjs";
|
|
4
|
+
import { createContext, useContext, useEffect, useMemo, useRef } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/Menu/MenuActivationContext.ts
|
|
7
|
+
/**
|
|
8
|
+
* Set by a `Menu` around its lists: told when any row anywhere in the menu is chosen, with
|
|
9
|
+
* or without a `value`, so the whole menu can close. Internal - not exported from the
|
|
10
|
+
* subpath.
|
|
11
|
+
*/
|
|
12
|
+
const MenuActivationContext = createContext(null);
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/Menu/MenuListContext.ts
|
|
15
|
+
/**
|
|
16
|
+
* Present inside a `MenuList`. A `MenuItem` that finds it renders as a menu row
|
|
17
|
+
* (`menuitem`); without it, the row is `Select`'s `option`.
|
|
18
|
+
*/
|
|
19
|
+
const MenuListContext = createContext(null);
|
|
20
|
+
const useMenuListContext = () => useContext(MenuListContext);
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/Menu/MenuList/utils/getOwnRows.ts
|
|
23
|
+
const ROW_SELECTOR = "[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]";
|
|
24
|
+
/**
|
|
25
|
+
* The rows that belong to `list` itself, in document order. A nested submenu is a
|
|
26
|
+
* `role="menu"` of its own inside the list, so a row counts only when its nearest
|
|
27
|
+
* `role="menu"` is `list` - no per-list index state is kept anywhere.
|
|
28
|
+
*/
|
|
29
|
+
function getOwnRows(list) {
|
|
30
|
+
return Array.from(list.querySelectorAll(ROW_SELECTOR)).filter((row) => row.closest("[role=\"menu\"]") === list);
|
|
31
|
+
}
|
|
32
|
+
/** Whether a row can take focus and be chosen. */
|
|
33
|
+
function isRowEnabled(row) {
|
|
34
|
+
return row.getAttribute("aria-disabled") !== "true";
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/Menu/MenuList/utils/getNextRow.ts
|
|
38
|
+
/**
|
|
39
|
+
* The enabled row a key moves to from `current` (which may be absent from `rows`, as when
|
|
40
|
+
* focus is still on the list itself). Disabled rows are skipped; `shouldWrap` carries
|
|
41
|
+
* `next` past the last row to the first and `previous` before the first to the last.
|
|
42
|
+
*/
|
|
43
|
+
function getNextRow(rows, current, step, shouldWrap) {
|
|
44
|
+
const enabled = rows.filter(isRowEnabled);
|
|
45
|
+
if (step === "first") return enabled[0];
|
|
46
|
+
if (step === "last") return enabled.at(-1);
|
|
47
|
+
const index = enabled.indexOf(current);
|
|
48
|
+
if (index === -1) return step === "next" ? enabled[0] : enabled.at(-1);
|
|
49
|
+
const target = index + (step === "next" ? 1 : -1);
|
|
50
|
+
if (target >= 0 && target < enabled.length) return enabled[target];
|
|
51
|
+
if (!shouldWrap) return void 0;
|
|
52
|
+
return target < 0 ? enabled.at(-1) : enabled[0];
|
|
53
|
+
}
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/Menu/MenuList/utils/findRowByText.ts
|
|
56
|
+
/** A row's label text, without its icon, shortcut or note. */
|
|
57
|
+
function getRowText(row) {
|
|
58
|
+
return (row.querySelector("[data-menu-label]") ?? row).textContent.trim().toLowerCase();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* The row type-ahead moves to. One key typed again and again (`r`, `r`, `r`) cycles
|
|
62
|
+
* through the rows starting with it; distinct keys typed together (`re`) build a prefix,
|
|
63
|
+
* matched from the current row onward so typing on stays where it is while it matches.
|
|
64
|
+
*/
|
|
65
|
+
function findRowByText(rows, current, typed) {
|
|
66
|
+
const enabled = rows.filter(isRowEnabled);
|
|
67
|
+
const query = typed.toLowerCase();
|
|
68
|
+
const isRepeating = [...query].every((key) => key === query[0]);
|
|
69
|
+
const start = enabled.indexOf(current);
|
|
70
|
+
const from = isRepeating ? start + 1 : Math.max(start, 0);
|
|
71
|
+
const ordered = [...enabled.slice(from), ...enabled.slice(0, from)];
|
|
72
|
+
const prefix = isRepeating ? query[0] : query;
|
|
73
|
+
return ordered.find((row) => getRowText(row).startsWith(prefix));
|
|
74
|
+
}
|
|
75
|
+
//#endregion
|
|
76
|
+
//#region src/Menu/MenuList/MenuList.tsx
|
|
77
|
+
const STEP_BY_KEY = {
|
|
78
|
+
ArrowDown: "next",
|
|
79
|
+
ArrowUp: "previous",
|
|
80
|
+
Home: "first",
|
|
81
|
+
End: "last"
|
|
82
|
+
};
|
|
83
|
+
const TYPEAHEAD_TIMEOUT = 500;
|
|
84
|
+
const shouldForwardProp = createShouldForwardProp([...props]);
|
|
85
|
+
const layoutWithoutSize = (styleProps) => (0, src_exports.layout)({
|
|
86
|
+
...styleProps,
|
|
87
|
+
size: void 0
|
|
88
|
+
});
|
|
89
|
+
const MenuListRoot = styled("ul", {
|
|
90
|
+
name: "MenuList",
|
|
91
|
+
label: "MenuList",
|
|
92
|
+
shouldForwardProp,
|
|
93
|
+
systemProps: [src_exports.space, layoutWithoutSize]
|
|
94
|
+
})(({ theme }) => ({
|
|
95
|
+
listStyle: "none",
|
|
96
|
+
margin: 0,
|
|
97
|
+
paddingLeft: 0,
|
|
98
|
+
paddingRight: 0,
|
|
99
|
+
paddingTop: theme.space[.5],
|
|
100
|
+
paddingBottom: theme.space[.5],
|
|
101
|
+
outline: "none",
|
|
102
|
+
"&:focus-visible": {
|
|
103
|
+
outline: `${theme.borderWidths.base} solid ${theme.palette[themeDefault(theme, "color", "primary")].main}`,
|
|
104
|
+
outlineOffset: `-${theme.borderWidths.base}`
|
|
105
|
+
}
|
|
106
|
+
}));
|
|
107
|
+
const isPrintableKey = (event) => event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey;
|
|
108
|
+
/**
|
|
109
|
+
* @description A `role="menu"` list that owns the keyboard: the arrow keys, Home and End
|
|
110
|
+
* move focus between its own rows, skipping disabled ones; typing jumps to a row by its
|
|
111
|
+
* label. Rows are found in the DOM by their nearest `role="menu"`, so a nested submenu's
|
|
112
|
+
* rows are never this list's. Renders in place - `Menu` floats one next to a trigger.
|
|
113
|
+
*/
|
|
114
|
+
function MenuList({ children, onSelect, shouldWrap: shouldWrapProp, shouldAutoFocus = false, color, textColor, size, dense, onKeyDown, ...rest }) {
|
|
115
|
+
const listRef = useRef(null);
|
|
116
|
+
const typed = useRef({
|
|
117
|
+
keys: "",
|
|
118
|
+
time: 0
|
|
119
|
+
});
|
|
120
|
+
const onMenuActivate = useContext(MenuActivationContext);
|
|
121
|
+
const parent = useMenuListContext();
|
|
122
|
+
const dp = useDefaultProps("MenuList");
|
|
123
|
+
const shouldWrap = shouldWrapProp ?? dp.shouldWrap ?? true;
|
|
124
|
+
const rowColor = color ?? parent?.color ?? dp.color;
|
|
125
|
+
const rowTextColor = textColor ?? parent?.textColor ?? dp.textColor;
|
|
126
|
+
const rowSize = size ?? parent?.size ?? dp.size;
|
|
127
|
+
const rowDense = dense ?? parent?.dense ?? dp.dense;
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
const list = listRef.current;
|
|
130
|
+
if (!shouldAutoFocus || !list) return;
|
|
131
|
+
const rows = getOwnRows(list).filter(isRowEnabled);
|
|
132
|
+
(rows.find((row) => row.getAttribute("aria-checked") === "true") ?? rows[0] ?? list).focus();
|
|
133
|
+
}, [shouldAutoFocus]);
|
|
134
|
+
const context = useMemo(() => ({
|
|
135
|
+
onActivate: (value, event) => {
|
|
136
|
+
if (value !== void 0) onSelect?.(value);
|
|
137
|
+
if (parent) parent.onActivate(value, event);
|
|
138
|
+
else onMenuActivate?.(value, event);
|
|
139
|
+
},
|
|
140
|
+
color: rowColor,
|
|
141
|
+
textColor: rowTextColor,
|
|
142
|
+
size: rowSize,
|
|
143
|
+
dense: rowDense
|
|
144
|
+
}), [
|
|
145
|
+
onSelect,
|
|
146
|
+
onMenuActivate,
|
|
147
|
+
parent,
|
|
148
|
+
rowColor,
|
|
149
|
+
rowTextColor,
|
|
150
|
+
rowSize,
|
|
151
|
+
rowDense
|
|
152
|
+
]);
|
|
153
|
+
const handleKeyDown = (event) => {
|
|
154
|
+
const list = event.currentTarget;
|
|
155
|
+
if (event.target.closest("[role=\"menu\"]") !== list) return;
|
|
156
|
+
const rows = getOwnRows(list);
|
|
157
|
+
const current = list.ownerDocument.activeElement;
|
|
158
|
+
const step = STEP_BY_KEY[event.key];
|
|
159
|
+
let target;
|
|
160
|
+
if (step) target = getNextRow(rows, current, step, shouldWrap);
|
|
161
|
+
else if (isPrintableKey(event)) {
|
|
162
|
+
const now = Date.now();
|
|
163
|
+
const isFresh = now - typed.current.time > TYPEAHEAD_TIMEOUT;
|
|
164
|
+
typed.current = {
|
|
165
|
+
keys: (isFresh ? "" : typed.current.keys) + event.key,
|
|
166
|
+
time: now
|
|
167
|
+
};
|
|
168
|
+
target = findRowByText(rows, current, typed.current.keys);
|
|
169
|
+
}
|
|
170
|
+
if (step || target) event.preventDefault();
|
|
171
|
+
target?.focus();
|
|
172
|
+
onKeyDown?.(event);
|
|
173
|
+
};
|
|
174
|
+
return /* @__PURE__ */ jsx(MenuListContext.Provider, {
|
|
175
|
+
value: context,
|
|
176
|
+
children: /* @__PURE__ */ jsx(MenuListRoot, {
|
|
177
|
+
...rest,
|
|
178
|
+
ref: listRef,
|
|
179
|
+
role: "menu",
|
|
180
|
+
tabIndex: -1,
|
|
181
|
+
onKeyDown: handleKeyDown,
|
|
182
|
+
children
|
|
183
|
+
})
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
export { useMenuListContext as a, MenuListContext as i, getNextRow as n, MenuActivationContext as o, getOwnRows as r, MenuList as t };
|