@hh.ru/magritte-ui-menu 1.0.1
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/BottomSheet.d.ts +2 -0
- package/BottomSheet.js +14 -0
- package/BottomSheet.js.map +1 -0
- package/Divider.d.ts +2 -0
- package/Divider.js +11 -0
- package/Divider.js.map +1 -0
- package/Drop.d.ts +3 -0
- package/Drop.js +21 -0
- package/Drop.js.map +1 -0
- package/Item.d.ts +2 -0
- package/Item.js +94 -0
- package/Item.js.map +1 -0
- package/Menu.d.ts +13 -0
- package/Menu.js +68 -0
- package/Menu.js.map +1 -0
- package/SectionHeader.d.ts +2 -0
- package/SectionHeader.js +14 -0
- package/SectionHeader.js.map +1 -0
- package/context.d.ts +12 -0
- package/context.js +12 -0
- package/context.js.map +1 -0
- package/index.css +156 -0
- package/index.d.ts +2 -0
- package/index.js +26 -0
- package/index.js.map +1 -0
- package/index.mock.d.ts +8 -0
- package/index.mock.js +18 -0
- package/index.mock.js.map +1 -0
- package/menu-DUjBkv3I.js +5 -0
- package/menu-DUjBkv3I.js.map +1 -0
- package/package.json +46 -0
- package/types.d.ts +31 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
package/BottomSheet.d.ts
ADDED
package/BottomSheet.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useContext } from 'react';
|
|
4
|
+
import { BottomSheet } from '@hh.ru/magritte-ui-bottom-sheet';
|
|
5
|
+
import { MenuContext } from './context.js';
|
|
6
|
+
|
|
7
|
+
const MenuBottomSheet = (props) => {
|
|
8
|
+
const { onClose, visible } = useContext(MenuContext);
|
|
9
|
+
return jsx(BottomSheet, { ...props, onClose: onClose, visible: visible, withContentPaddings: "top" });
|
|
10
|
+
};
|
|
11
|
+
MenuBottomSheet.displayName = 'Menu.BottomSheet';
|
|
12
|
+
|
|
13
|
+
export { MenuBottomSheet };
|
|
14
|
+
//# sourceMappingURL=BottomSheet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BottomSheet.js","sources":["src/BottomSheet.tsx"],"sourcesContent":["import { useContext } from 'react';\n\nimport { type BottomSheetProps, BottomSheet } from '@hh.ru/magritte-ui-bottom-sheet';\nimport { MenuContext } from '@hh.ru/magritte-ui-menu/context';\n\nexport const MenuBottomSheet: React.FC<Omit<BottomSheetProps, 'onClose' | 'visible' | 'withContentPaddings'>> = (\n props\n) => {\n const { onClose, visible } = useContext(MenuContext);\n\n return <BottomSheet {...props} onClose={onClose} visible={visible} withContentPaddings=\"top\" />;\n};\n\nMenuBottomSheet.displayName = 'Menu.BottomSheet';\n"],"names":["_jsx"],"mappings":";;;;;AAKa,MAAA,eAAe,GAAoF,CAC5G,KAAK,KACL;IACA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAErD,IAAA,OAAOA,IAAC,WAAW,EAAA,EAAA,GAAK,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAC,KAAK,GAAG,CAAC;AACpG,EAAE;AAEF,eAAe,CAAC,WAAW,GAAG,kBAAkB;;;;"}
|
package/Divider.d.ts
ADDED
package/Divider.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { Divider } from '@hh.ru/magritte-ui-divider';
|
|
4
|
+
|
|
5
|
+
const MenuDivider = (props) => {
|
|
6
|
+
return jsx(Divider, { marginTop: 4, marginBottom: 4, ...props });
|
|
7
|
+
};
|
|
8
|
+
MenuDivider.displayName = 'Menu.Divider';
|
|
9
|
+
|
|
10
|
+
export { MenuDivider };
|
|
11
|
+
//# sourceMappingURL=Divider.js.map
|
package/Divider.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Divider.js","sources":["src/Divider.tsx"],"sourcesContent":["import { type DividerProps, Divider } from '@hh.ru/magritte-ui-divider';\n\nexport const MenuDivider: React.FC<DividerProps> = (props) => {\n return <Divider marginTop={4} marginBottom={4} {...props} />;\n};\n\nMenuDivider.displayName = 'Menu.Divider';\n"],"names":["_jsx"],"mappings":";;;AAEa,MAAA,WAAW,GAA2B,CAAC,KAAK,KAAI;AACzD,IAAA,OAAOA,GAAC,CAAA,OAAO,EAAC,EAAA,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAM,GAAA,KAAK,GAAI,CAAC;AACjE,EAAE;AAEF,WAAW,CAAC,WAAW,GAAG,cAAc;;;;"}
|
package/Drop.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { type DropProps } from '@hh.ru/magritte-ui-drop';
|
|
2
|
+
export declare const DROP_PROPS: Partial<DropProps>;
|
|
3
|
+
export declare const MenuDrop: React.FC<Omit<DropProps, 'activatorRef' | 'onClose' | 'padding' | 'paddingTop' | 'paddingRight' | 'paddingBottom' | 'paddingLeft' | 'placement' | 'role' | 'visible'>>;
|
package/Drop.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useContext } from 'react';
|
|
4
|
+
import { Drop } from '@hh.ru/magritte-ui-drop';
|
|
5
|
+
import { MenuContext } from './context.js';
|
|
6
|
+
|
|
7
|
+
const DROP_PROPS = {
|
|
8
|
+
paddingTop: 12,
|
|
9
|
+
paddingRight: 0,
|
|
10
|
+
paddingBottom: 12,
|
|
11
|
+
paddingLeft: 0,
|
|
12
|
+
role: 'menu',
|
|
13
|
+
};
|
|
14
|
+
const MenuDrop = (props) => {
|
|
15
|
+
const { activatorRef, onClose, placement, visible } = useContext(MenuContext);
|
|
16
|
+
return (jsx(Drop, { ...props, ...DROP_PROPS, activatorRef: activatorRef, onClose: onClose, placement: placement, visible: visible }));
|
|
17
|
+
};
|
|
18
|
+
MenuDrop.displayName = 'Menu.Drop';
|
|
19
|
+
|
|
20
|
+
export { DROP_PROPS, MenuDrop };
|
|
21
|
+
//# sourceMappingURL=Drop.js.map
|
package/Drop.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Drop.js","sources":["src/Drop.tsx"],"sourcesContent":["import { useContext } from 'react';\n\nimport { type DropProps, Drop } from '@hh.ru/magritte-ui-drop';\nimport { MenuContext } from '@hh.ru/magritte-ui-menu/context';\n\nexport const DROP_PROPS: Partial<DropProps> = {\n paddingTop: 12,\n paddingRight: 0,\n paddingBottom: 12,\n paddingLeft: 0,\n role: 'menu',\n};\n\nexport const MenuDrop: React.FC<\n Omit<\n DropProps,\n | 'activatorRef'\n | 'onClose'\n | 'padding'\n | 'paddingTop'\n | 'paddingRight'\n | 'paddingBottom'\n | 'paddingLeft'\n | 'placement'\n | 'role'\n | 'visible'\n >\n> = (props) => {\n const { activatorRef, onClose, placement, visible } = useContext(MenuContext);\n\n return (\n <Drop\n {...props}\n {...DROP_PROPS}\n activatorRef={activatorRef}\n onClose={onClose}\n placement={placement}\n visible={visible}\n />\n );\n};\n\nMenuDrop.displayName = 'Menu.Drop';\n"],"names":["_jsx"],"mappings":";;;;;AAKa,MAAA,UAAU,GAAuB;AAC1C,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,YAAY,EAAE,CAAC;AACf,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,WAAW,EAAE,CAAC;AACd,IAAA,IAAI,EAAE,MAAM;EACd;AAEW,MAAA,QAAQ,GAcjB,CAAC,KAAK,KAAI;AACV,IAAA,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IAE9E,QACIA,GAAC,CAAA,IAAI,EACG,EAAA,GAAA,KAAK,KACL,UAAU,EACd,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,OAAO,EAClB,CAAA,EACJ;AACN,EAAE;AAEF,QAAQ,CAAC,WAAW,GAAG,WAAW;;;;"}
|
package/Item.d.ts
ADDED
package/Item.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { useContext, useRef, useState, isValidElement, cloneElement } from 'react';
|
|
4
|
+
import { createPortal } from 'react-dom';
|
|
5
|
+
import classnames from 'classnames';
|
|
6
|
+
import { keyboardMatches, keyboardKeys } from '@hh.ru/magritte-common-keyboard';
|
|
7
|
+
import { DisabledContext } from '@hh.ru/magritte-common-use-disabled';
|
|
8
|
+
import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
|
|
9
|
+
import { Drop } from '@hh.ru/magritte-ui-drop';
|
|
10
|
+
import { IconDynamic, IconDefaultPropsContext } from '@hh.ru/magritte-ui-icon';
|
|
11
|
+
import { CheckOutlinedSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
|
|
12
|
+
import { DROP_PROPS } from './Drop.js';
|
|
13
|
+
import { MenuContext } from './context.js';
|
|
14
|
+
import { isSwitchComponent } from '@hh.ru/magritte-ui-switch';
|
|
15
|
+
import { TextDynamic, Text } from '@hh.ru/magritte-ui-typography';
|
|
16
|
+
import { s as styles } from './menu-DUjBkv3I.js';
|
|
17
|
+
|
|
18
|
+
const DEFAULT_ICON_PROPS = {
|
|
19
|
+
neutral: {},
|
|
20
|
+
negative: { initialColor: 'negative' },
|
|
21
|
+
};
|
|
22
|
+
const TEXT_STYLE = {
|
|
23
|
+
neutral: 'primary',
|
|
24
|
+
negative: 'negative',
|
|
25
|
+
};
|
|
26
|
+
const SECONDARY_TEXT_STYLE = {
|
|
27
|
+
neutral: 'secondary',
|
|
28
|
+
negative: 'negative-secondary',
|
|
29
|
+
};
|
|
30
|
+
const SUBMENU_DROP_PLACEMENT = [
|
|
31
|
+
'right-top',
|
|
32
|
+
'right-bottom',
|
|
33
|
+
'right-center',
|
|
34
|
+
'left-top',
|
|
35
|
+
'left-bottom',
|
|
36
|
+
'left-center',
|
|
37
|
+
];
|
|
38
|
+
const MenuItem = ({ children, className, disabled = false, icon, subitems, selected, style = 'neutral', rightContent, subtitle, tag, ...props }) => {
|
|
39
|
+
const { isMobile } = useBreakpoint();
|
|
40
|
+
const contextValue = useContext(MenuContext);
|
|
41
|
+
const { mobileSubmenuContainer, mobileTitleContainer, setMobileSubmenuVisible, submenuAllowed } = contextValue;
|
|
42
|
+
const activatorRef = useRef(null);
|
|
43
|
+
const [hasHover, setHover] = useState(false);
|
|
44
|
+
const [submenuVisible, setSubmenuVisible] = useState(false);
|
|
45
|
+
const hasSwitch = !selected && isSwitchComponent(rightContent);
|
|
46
|
+
const hasSubmenu = !selected && !isSwitchComponent(rightContent) && isValidElement(subitems) && submenuAllowed;
|
|
47
|
+
const showSubmenu = (visible) => {
|
|
48
|
+
setSubmenuVisible(visible);
|
|
49
|
+
setMobileSubmenuVisible?.(visible);
|
|
50
|
+
};
|
|
51
|
+
return (jsx(DisabledContext.Provider, { value: disabled, children: jsx(IconDynamic, { style: { display: 'contents' }, children: jsx(TextDynamic, { style: { display: 'contents' }, children: jsxs("div", { ...props, "aria-disabled": disabled, className: classnames(className, { [styles.disabled]: disabled }, styles.dropContentMargin, styles.item, styles[style]), onClick: (event) => {
|
|
52
|
+
props.onClick?.(event);
|
|
53
|
+
if (hasSwitch) {
|
|
54
|
+
rightContent.props.onClick?.();
|
|
55
|
+
}
|
|
56
|
+
if (hasSubmenu) {
|
|
57
|
+
showSubmenu(true);
|
|
58
|
+
}
|
|
59
|
+
}, onKeyDown: (event) => {
|
|
60
|
+
props.onKeyDown?.(event);
|
|
61
|
+
if (keyboardMatches(event, [keyboardKeys.Enter, keyboardKeys.Space])) {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
if (hasSwitch) {
|
|
64
|
+
rightContent.props.onClick?.();
|
|
65
|
+
}
|
|
66
|
+
else if (hasSubmenu) {
|
|
67
|
+
showSubmenu(true);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
event.target.click();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}, onMouseEnter: (event) => {
|
|
74
|
+
props.onMouseEnter?.(event);
|
|
75
|
+
if (!isMobile) {
|
|
76
|
+
setHover(true);
|
|
77
|
+
if (hasSubmenu) {
|
|
78
|
+
showSubmenu(true);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}, onMouseLeave: (event) => {
|
|
82
|
+
props.onMouseLeave?.(event);
|
|
83
|
+
if (!isMobile) {
|
|
84
|
+
setHover(false);
|
|
85
|
+
showSubmenu(false); // TODO реализовать треугольную safe zone
|
|
86
|
+
}
|
|
87
|
+
}, ref: activatorRef, role: "menuitem", tabIndex: disabled ? -1 : 0, children: [icon && (jsx("div", { className: styles.itemIcon, children: jsx(IconDefaultPropsContext, { props: DEFAULT_ICON_PROPS[style], children: icon }) })), jsxs("div", { className: styles.itemText, children: [jsx(Text, { ellipsis: true, style: TEXT_STYLE[style], typography: isMobile ? 'label-2-regular' : 'label-3-regular', children: children }), subtitle && (jsx(Text, { ellipsis: true, style: SECONDARY_TEXT_STYLE[style], typography: "label-3-regular", children: subtitle }))] }), tag && (jsx("div", { className: styles.itemTag, children: cloneElement(tag, { onSurface: hasHover }) })), selected && (jsx("div", { className: styles.itemRightContent, children: jsx(CheckOutlinedSize24, { initialColor: "secondary" }) })), hasSwitch && (jsx("div", { className: styles.itemRightContent, onClick: (event) => event.stopPropagation(), children: rightContent })), hasSubmenu && (jsxs(MenuContext.Provider, { value: { ...contextValue, submenuAllowed: false }, children: [jsxs("div", { className: styles.itemRightContent, children: [jsx(Text, { ellipsis: true, style: SECONDARY_TEXT_STYLE[style], typography: "label-3-regular", children: rightContent }), jsx(ChevronRightOutlinedSize24, { initialColor: "secondary" })] }), jsx(Drop, { ...DROP_PROPS, activatorRef: activatorRef, onClose: () => setSubmenuVisible(false), placement: SUBMENU_DROP_PLACEMENT, visible: submenuVisible, children: subitems }), submenuVisible &&
|
|
88
|
+
mobileSubmenuContainer &&
|
|
89
|
+
createPortal(subitems, mobileSubmenuContainer), submenuVisible && mobileTitleContainer && createPortal(children, mobileTitleContainer)] }))] }) }) }) }));
|
|
90
|
+
};
|
|
91
|
+
MenuItem.displayName = 'Menu.Item';
|
|
92
|
+
|
|
93
|
+
export { MenuItem };
|
|
94
|
+
//# sourceMappingURL=Item.js.map
|
package/Item.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Item.js","sources":["src/Item.tsx"],"sourcesContent":["import { cloneElement, isValidElement, useContext, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport classnames from 'classnames';\n\nimport { keyboardKeys, keyboardMatches } from '@hh.ru/magritte-common-keyboard';\nimport { DisabledContext } from '@hh.ru/magritte-common-use-disabled';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { type DropProps, Drop } from '@hh.ru/magritte-ui-drop';\nimport { type IconProps, IconDefaultPropsContext, IconDynamic } from '@hh.ru/magritte-ui-icon';\nimport { CheckOutlinedSize24, ChevronRightOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { DROP_PROPS } from '@hh.ru/magritte-ui-menu/Drop';\nimport { MenuContext } from '@hh.ru/magritte-ui-menu/context';\nimport { type MenuItemProps } from '@hh.ru/magritte-ui-menu/types';\nimport { isSwitchComponent } from '@hh.ru/magritte-ui-switch';\nimport { type TagProps } from '@hh.ru/magritte-ui-tag';\nimport { type TextStyle, Text, TextDynamic } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './menu.less';\n\nconst DEFAULT_ICON_PROPS: Record<NonNullable<MenuItemProps['style']>, Partial<IconProps>> = {\n neutral: {},\n negative: { initialColor: 'negative' },\n};\n\nconst TEXT_STYLE: Record<NonNullable<MenuItemProps['style']>, TextStyle> = {\n neutral: 'primary',\n negative: 'negative',\n};\n\nconst SECONDARY_TEXT_STYLE: Record<NonNullable<MenuItemProps['style']>, TextStyle> = {\n neutral: 'secondary',\n negative: 'negative-secondary',\n};\n\nconst SUBMENU_DROP_PLACEMENT: DropProps['placement'] = [\n 'right-top',\n 'right-bottom',\n 'right-center',\n 'left-top',\n 'left-bottom',\n 'left-center',\n];\n\nexport const MenuItem: React.FC<MenuItemProps> = ({\n children,\n className,\n disabled = false,\n icon,\n subitems,\n selected,\n style = 'neutral',\n rightContent,\n subtitle,\n tag,\n ...props\n}) => {\n const { isMobile } = useBreakpoint();\n const contextValue = useContext(MenuContext);\n const { mobileSubmenuContainer, mobileTitleContainer, setMobileSubmenuVisible, submenuAllowed } = contextValue;\n const activatorRef = useRef(null);\n const [hasHover, setHover] = useState(false);\n const [submenuVisible, setSubmenuVisible] = useState(false);\n\n const hasSwitch = !selected && isSwitchComponent(rightContent);\n const hasSubmenu = !selected && !isSwitchComponent(rightContent) && isValidElement(subitems) && submenuAllowed;\n\n const showSubmenu = (visible: boolean) => {\n setSubmenuVisible(visible);\n setMobileSubmenuVisible?.(visible);\n };\n\n return (\n <DisabledContext.Provider value={disabled}>\n <IconDynamic style={{ display: 'contents' }}>\n <TextDynamic style={{ display: 'contents' }}>\n <div\n {...props}\n aria-disabled={disabled}\n className={classnames(\n className,\n { [styles.disabled]: disabled },\n styles.dropContentMargin,\n styles.item,\n styles[style]\n )}\n onClick={(event) => {\n props.onClick?.(event);\n if (hasSwitch) {\n rightContent.props.onClick?.();\n }\n if (hasSubmenu) {\n showSubmenu(true);\n }\n }}\n onKeyDown={(event) => {\n props.onKeyDown?.(event);\n if (keyboardMatches(event, [keyboardKeys.Enter, keyboardKeys.Space])) {\n event.preventDefault();\n if (hasSwitch) {\n rightContent.props.onClick?.();\n } else if (hasSubmenu) {\n showSubmenu(true);\n } else {\n (event.target as HTMLElement).click();\n }\n }\n }}\n onMouseEnter={(event) => {\n props.onMouseEnter?.(event);\n if (!isMobile) {\n setHover(true);\n if (hasSubmenu) {\n showSubmenu(true);\n }\n }\n }}\n onMouseLeave={(event) => {\n props.onMouseLeave?.(event);\n if (!isMobile) {\n setHover(false);\n showSubmenu(false); // TODO реализовать треугольную safe zone\n }\n }}\n ref={activatorRef}\n role=\"menuitem\"\n tabIndex={disabled ? -1 : 0}\n >\n {icon && (\n <div className={styles.itemIcon}>\n <IconDefaultPropsContext props={DEFAULT_ICON_PROPS[style]}>\n {icon}\n </IconDefaultPropsContext>\n </div>\n )}\n <div className={styles.itemText}>\n <Text\n ellipsis\n style={TEXT_STYLE[style]}\n typography={isMobile ? 'label-2-regular' : 'label-3-regular'}\n >\n {children}\n </Text>\n {subtitle && (\n <Text ellipsis style={SECONDARY_TEXT_STYLE[style]} typography=\"label-3-regular\">\n {subtitle}\n </Text>\n )}\n </div>\n {tag && (\n <div className={styles.itemTag}>\n {cloneElement(tag as React.ReactElement<TagProps>, { onSurface: hasHover })}\n </div>\n )}\n {selected && (\n <div className={styles.itemRightContent}>\n <CheckOutlinedSize24 initialColor=\"secondary\" />\n </div>\n )}\n {hasSwitch && (\n <div className={styles.itemRightContent} onClick={(event) => event.stopPropagation()}>\n {rightContent}\n </div>\n )}\n {hasSubmenu && (\n <MenuContext.Provider value={{ ...contextValue, submenuAllowed: false }}>\n <div className={styles.itemRightContent}>\n <Text ellipsis style={SECONDARY_TEXT_STYLE[style]} typography=\"label-3-regular\">\n {rightContent}\n </Text>\n <ChevronRightOutlinedSize24 initialColor=\"secondary\" />\n </div>\n <Drop\n {...DROP_PROPS}\n activatorRef={activatorRef}\n onClose={() => setSubmenuVisible(false)}\n placement={SUBMENU_DROP_PLACEMENT}\n visible={submenuVisible}\n >\n {subitems}\n </Drop>\n {submenuVisible &&\n mobileSubmenuContainer &&\n createPortal(subitems, mobileSubmenuContainer)}\n {submenuVisible && mobileTitleContainer && createPortal(children, mobileTitleContainer)}\n </MenuContext.Provider>\n )}\n </div>\n </TextDynamic>\n </IconDynamic>\n </DisabledContext.Provider>\n );\n};\n\nMenuItem.displayName = 'Menu.Item';\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
package/Menu.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { MenuBottomSheet } from '@hh.ru/magritte-ui-menu/BottomSheet';
|
|
2
|
+
import { MenuDivider } from '@hh.ru/magritte-ui-menu/Divider';
|
|
3
|
+
import { MenuDrop } from '@hh.ru/magritte-ui-menu/Drop';
|
|
4
|
+
import { MenuItem } from '@hh.ru/magritte-ui-menu/Item';
|
|
5
|
+
import { MenuSectionHeader } from '@hh.ru/magritte-ui-menu/SectionHeader';
|
|
6
|
+
import { type MenuProps } from '@hh.ru/magritte-ui-menu/types';
|
|
7
|
+
export declare const Menu: React.FC<MenuProps> & {
|
|
8
|
+
BottomSheet: typeof MenuBottomSheet;
|
|
9
|
+
Divider: typeof MenuDivider;
|
|
10
|
+
Drop: typeof MenuDrop;
|
|
11
|
+
Item: typeof MenuItem;
|
|
12
|
+
SectionHeader: typeof MenuSectionHeader;
|
|
13
|
+
};
|
package/Menu.js
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef, useState, useLayoutEffect } from 'react';
|
|
4
|
+
import classnames from 'classnames';
|
|
5
|
+
import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
|
|
6
|
+
import { ChevronLeftOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
|
|
7
|
+
import { MenuBottomSheet } from './BottomSheet.js';
|
|
8
|
+
import { MenuDivider } from './Divider.js';
|
|
9
|
+
import { MenuDrop } from './Drop.js';
|
|
10
|
+
import { MenuItem } from './Item.js';
|
|
11
|
+
import { MenuSectionHeader } from './SectionHeader.js';
|
|
12
|
+
import { MenuContext } from './context.js';
|
|
13
|
+
import { NavBar } from '@hh.ru/magritte-ui-nav-bar';
|
|
14
|
+
import { s as styles } from './menu-DUjBkv3I.js';
|
|
15
|
+
import '@hh.ru/magritte-ui-bottom-sheet';
|
|
16
|
+
import '@hh.ru/magritte-ui-divider';
|
|
17
|
+
import '@hh.ru/magritte-ui-drop';
|
|
18
|
+
import 'react-dom';
|
|
19
|
+
import '@hh.ru/magritte-common-keyboard';
|
|
20
|
+
import '@hh.ru/magritte-common-use-disabled';
|
|
21
|
+
import '@hh.ru/magritte-ui-icon';
|
|
22
|
+
import '@hh.ru/magritte-ui-switch';
|
|
23
|
+
import '@hh.ru/magritte-ui-typography';
|
|
24
|
+
import '@hh.ru/magritte-ui-section-header';
|
|
25
|
+
|
|
26
|
+
const Menu = ({ activatorRef, children, onClose, placement, visible, render }) => {
|
|
27
|
+
const { isMobile } = useBreakpoint();
|
|
28
|
+
const mobileMenuContainerRef = useRef(null);
|
|
29
|
+
const [mobileSubmenuContainer, setMobileSubmenuContainer] = useState(null);
|
|
30
|
+
const [mobileTitleContainer, setMobileTitleContainer] = useState(null);
|
|
31
|
+
const [mobileSubmenuVisible, setMobileSubmenuVisible] = useState(false);
|
|
32
|
+
const contextValue = {
|
|
33
|
+
activatorRef,
|
|
34
|
+
mobileSubmenuContainer,
|
|
35
|
+
mobileTitleContainer,
|
|
36
|
+
onClose: () => {
|
|
37
|
+
setMobileSubmenuVisible(false);
|
|
38
|
+
onClose();
|
|
39
|
+
},
|
|
40
|
+
placement,
|
|
41
|
+
setMobileSubmenuVisible,
|
|
42
|
+
submenuAllowed: true,
|
|
43
|
+
visible,
|
|
44
|
+
};
|
|
45
|
+
useLayoutEffect(() => {
|
|
46
|
+
const mobileMenuContainer = mobileMenuContainerRef.current;
|
|
47
|
+
if (!mobileMenuContainer) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
mobileMenuContainer.style.height = mobileSubmenuVisible ? `${mobileSubmenuContainer?.offsetHeight ?? 0}px` : '';
|
|
51
|
+
}, [mobileSubmenuVisible, mobileSubmenuContainer]);
|
|
52
|
+
if (isMobile) {
|
|
53
|
+
const mobileChildren = (jsxs("div", { className: classnames(styles.mobileMenuContainer, {
|
|
54
|
+
[styles.mobileMenuContainerSlide]: mobileSubmenuVisible,
|
|
55
|
+
}), ref: mobileMenuContainerRef, children: [jsx("div", { className: styles.mobileMainMenuContainer, children: children }), jsx("div", { className: styles.mobileSubmenuContainer, ref: setMobileSubmenuContainer })] }));
|
|
56
|
+
const closeMobileSubmenu = () => setMobileSubmenuVisible(false);
|
|
57
|
+
return (jsx(MenuContext.Provider, { value: contextValue, children: render ? (render({ children: mobileChildren, closeMobileSubmenu, mobileSubmenuVisible })) : (jsx(Menu.BottomSheet, { header: mobileSubmenuVisible && (jsx(NavBar, { children: jsx(NavBar.Actions, { centered: true, left: jsx(ChevronLeftOutlinedSize24, { onClick: closeMobileSubmenu }), children: jsx(NavBar.TitleContainer, { centered: true, title: jsx("div", { ref: setMobileTitleContainer }) }) }) })), children: mobileChildren })) }));
|
|
58
|
+
}
|
|
59
|
+
return (jsx(MenuContext.Provider, { value: contextValue, children: render ? render({ children }) : jsx(Menu.Drop, { children: children }) }));
|
|
60
|
+
};
|
|
61
|
+
Menu.BottomSheet = MenuBottomSheet;
|
|
62
|
+
Menu.Divider = MenuDivider;
|
|
63
|
+
Menu.Drop = MenuDrop;
|
|
64
|
+
Menu.Item = MenuItem;
|
|
65
|
+
Menu.SectionHeader = MenuSectionHeader;
|
|
66
|
+
|
|
67
|
+
export { Menu };
|
|
68
|
+
//# sourceMappingURL=Menu.js.map
|
package/Menu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Menu.js","sources":["src/Menu.tsx"],"sourcesContent":["import { useLayoutEffect, useRef, useState } from 'react';\nimport classnames from 'classnames';\n\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { ChevronLeftOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { MenuBottomSheet } from '@hh.ru/magritte-ui-menu/BottomSheet';\nimport { MenuDivider } from '@hh.ru/magritte-ui-menu/Divider';\nimport { MenuDrop } from '@hh.ru/magritte-ui-menu/Drop';\nimport { MenuItem } from '@hh.ru/magritte-ui-menu/Item';\nimport { MenuSectionHeader } from '@hh.ru/magritte-ui-menu/SectionHeader';\nimport { MenuContext } from '@hh.ru/magritte-ui-menu/context';\nimport { type MenuProps } from '@hh.ru/magritte-ui-menu/types';\nimport { NavBar } from '@hh.ru/magritte-ui-nav-bar';\n\nimport styles from './menu.less';\n\nexport const Menu: React.FC<MenuProps> & {\n BottomSheet: typeof MenuBottomSheet;\n Divider: typeof MenuDivider;\n Drop: typeof MenuDrop;\n Item: typeof MenuItem;\n SectionHeader: typeof MenuSectionHeader;\n} = ({ activatorRef, children, onClose, placement, visible, render }) => {\n const { isMobile } = useBreakpoint();\n const mobileMenuContainerRef = useRef<HTMLDivElement>(null);\n const [mobileSubmenuContainer, setMobileSubmenuContainer] = useState<HTMLDivElement | null>(null);\n const [mobileTitleContainer, setMobileTitleContainer] = useState<HTMLDivElement | null>(null);\n const [mobileSubmenuVisible, setMobileSubmenuVisible] = useState(false);\n\n const contextValue = {\n activatorRef,\n mobileSubmenuContainer,\n mobileTitleContainer,\n onClose: () => {\n setMobileSubmenuVisible(false);\n onClose();\n },\n placement,\n setMobileSubmenuVisible,\n submenuAllowed: true,\n visible,\n };\n\n useLayoutEffect(() => {\n const mobileMenuContainer = mobileMenuContainerRef.current;\n if (!mobileMenuContainer) {\n return;\n }\n mobileMenuContainer.style.height = mobileSubmenuVisible ? `${mobileSubmenuContainer?.offsetHeight ?? 0}px` : '';\n }, [mobileSubmenuVisible, mobileSubmenuContainer]);\n\n if (isMobile) {\n const mobileChildren = (\n <div\n className={classnames(styles.mobileMenuContainer, {\n [styles.mobileMenuContainerSlide]: mobileSubmenuVisible,\n })}\n ref={mobileMenuContainerRef}\n >\n <div className={styles.mobileMainMenuContainer}>{children}</div>\n <div className={styles.mobileSubmenuContainer} ref={setMobileSubmenuContainer} />\n </div>\n );\n\n const closeMobileSubmenu = () => setMobileSubmenuVisible(false);\n\n return (\n <MenuContext.Provider value={contextValue}>\n {render ? (\n render({ children: mobileChildren, closeMobileSubmenu, mobileSubmenuVisible })\n ) : (\n <Menu.BottomSheet\n header={\n mobileSubmenuVisible && (\n <NavBar>\n <NavBar.Actions\n centered\n left={<ChevronLeftOutlinedSize24 onClick={closeMobileSubmenu} />}\n >\n <NavBar.TitleContainer centered title={<div ref={setMobileTitleContainer} />} />\n </NavBar.Actions>\n </NavBar>\n )\n }\n >\n {mobileChildren}\n </Menu.BottomSheet>\n )}\n </MenuContext.Provider>\n );\n }\n\n return (\n <MenuContext.Provider value={contextValue}>\n {render ? render({ children }) : <Menu.Drop>{children}</Menu.Drop>}\n </MenuContext.Provider>\n );\n};\n\nMenu.BottomSheet = MenuBottomSheet;\nMenu.Divider = MenuDivider;\nMenu.Drop = MenuDrop;\nMenu.Item = MenuItem;\nMenu.SectionHeader = MenuSectionHeader;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
package/SectionHeader.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
|
|
4
|
+
import { SectionHeader } from '@hh.ru/magritte-ui-section-header';
|
|
5
|
+
import { s as styles } from './menu-DUjBkv3I.js';
|
|
6
|
+
|
|
7
|
+
const MenuSectionHeader = (props) => {
|
|
8
|
+
const { isMobile } = useBreakpoint();
|
|
9
|
+
return (jsx("div", { className: styles.dropContentMargin, children: jsx(SectionHeader, { padding: isMobile ? 16 : 12, ...props }) }));
|
|
10
|
+
};
|
|
11
|
+
MenuSectionHeader.displayName = 'Menu.SectionHeader';
|
|
12
|
+
|
|
13
|
+
export { MenuSectionHeader };
|
|
14
|
+
//# sourceMappingURL=SectionHeader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.js","sources":["src/SectionHeader.tsx"],"sourcesContent":["import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { type SectionHeaderProps, SectionHeader } from '@hh.ru/magritte-ui-section-header';\n\nimport styles from './menu.less';\n\nexport const MenuSectionHeader: React.FC<Partial<SectionHeaderProps>> = (props) => {\n const { isMobile } = useBreakpoint();\n\n return (\n <div className={styles.dropContentMargin}>\n <SectionHeader padding={isMobile ? 16 : 12} {...props} />\n </div>\n );\n};\n\nMenuSectionHeader.displayName = 'Menu.SectionHeader';\n"],"names":["_jsx"],"mappings":";;;;;AAKa,MAAA,iBAAiB,GAA0C,CAAC,KAAK,KAAI;AAC9E,IAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;IAErC,QACIA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,iBAAiB,EACpC,QAAA,EAAAA,GAAA,CAAC,aAAa,EAAA,EAAC,OAAO,EAAE,QAAQ,GAAG,EAAE,GAAG,EAAE,EAAA,GAAM,KAAK,EAAA,CAAI,EACvD,CAAA,EACR;AACN,EAAE;AAEF,iBAAiB,CAAC,WAAW,GAAG,oBAAoB;;;;"}
|
package/context.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type DropProps } from '@hh.ru/magritte-ui-drop';
|
|
2
|
+
export interface MenuContextProps {
|
|
3
|
+
activatorRef: DropProps['activatorRef'];
|
|
4
|
+
mobileSubmenuContainer?: HTMLDivElement | null;
|
|
5
|
+
mobileTitleContainer?: HTMLDivElement | null;
|
|
6
|
+
onClose: VoidFunction;
|
|
7
|
+
placement: DropProps['placement'];
|
|
8
|
+
setMobileSubmenuVisible?: (visible: boolean) => void;
|
|
9
|
+
submenuAllowed?: boolean;
|
|
10
|
+
visible: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const MenuContext: import("react").Context<MenuContextProps>;
|
package/context.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { createContext } from 'react';
|
|
3
|
+
|
|
4
|
+
const MenuContext = createContext({
|
|
5
|
+
activatorRef: { current: null },
|
|
6
|
+
onClose: () => void 0,
|
|
7
|
+
placement: [],
|
|
8
|
+
visible: false,
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
export { MenuContext };
|
|
12
|
+
//# sourceMappingURL=context.js.map
|
package/context.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sources":["src/context.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport { type DropProps } from '@hh.ru/magritte-ui-drop';\n\nexport interface MenuContextProps {\n activatorRef: DropProps['activatorRef'];\n mobileSubmenuContainer?: HTMLDivElement | null;\n mobileTitleContainer?: HTMLDivElement | null;\n onClose: VoidFunction;\n placement: DropProps['placement'];\n setMobileSubmenuVisible?: (visible: boolean) => void;\n submenuAllowed?: boolean;\n visible: boolean;\n}\n\nexport const MenuContext = createContext<MenuContextProps>({\n activatorRef: { current: null },\n onClose: () => void 0,\n placement: [],\n visible: false,\n});\n"],"names":[],"mappings":";;AAeO,MAAM,WAAW,GAAG,aAAa,CAAmB;AACvD,IAAA,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AAC/B,IAAA,OAAO,EAAE,MAAM,KAAK,CAAC;AACrB,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,OAAO,EAAE,KAAK;AACjB,CAAA;;;;"}
|
package/index.css
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
:root{
|
|
2
|
+
--magritte-color-background-state-secondary-hovered-v24-7-2:#F1F4F9;
|
|
3
|
+
--magritte-color-background-state-secondary-pressed-v24-7-2:#F1F4F9;
|
|
4
|
+
--magritte-color-background-state-negative-secondary-hovered-v24-7-2:#FEF2EF;
|
|
5
|
+
--magritte-color-background-state-negative-secondary-pressed-v24-7-2:#FEF2EF;
|
|
6
|
+
--magritte-color-stroke-state-focused-accessible-v24-7-2:#0070ff7a;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
:root{
|
|
10
|
+
--magritte-semantic-animation-time-m-duration-v24-7-2:400ms;
|
|
11
|
+
--magritte-semantic-animation-ease-base-timing-function-v24-7-2:cubic-bezier(0.4, 0.24, 0, 1);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.magritte-night-theme{
|
|
15
|
+
--magritte-color-background-state-secondary-hovered-v24-7-2:#303030;
|
|
16
|
+
--magritte-color-background-state-secondary-pressed-v24-7-2:#303030;
|
|
17
|
+
--magritte-color-background-state-negative-secondary-hovered-v24-7-2:#3D2622;
|
|
18
|
+
--magritte-color-background-state-negative-secondary-pressed-v24-7-2:#3D2622;
|
|
19
|
+
}
|
|
20
|
+
.magritte-disabled___ZuG-J_1-0-1{
|
|
21
|
+
pointer-events:none;
|
|
22
|
+
}
|
|
23
|
+
@media (min-width: 1020px){
|
|
24
|
+
body.magritte-old-layout .magritte-drop-content-margin___q01ll_1-0-1{
|
|
25
|
+
margin:0 12px;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
@media (min-width: 1024px){
|
|
29
|
+
body:not(.magritte-old-layout) .magritte-drop-content-margin___q01ll_1-0-1{
|
|
30
|
+
margin:0 12px;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
.magritte-item___HyDAw_1-0-1{
|
|
34
|
+
display:flex;
|
|
35
|
+
gap:12px;
|
|
36
|
+
align-items:center;
|
|
37
|
+
padding:12px 16px;
|
|
38
|
+
}
|
|
39
|
+
@media (min-width: 1020px){
|
|
40
|
+
body.magritte-old-layout .magritte-item___HyDAw_1-0-1{
|
|
41
|
+
cursor:pointer;
|
|
42
|
+
border-radius:12px;
|
|
43
|
+
padding:10px 12px;
|
|
44
|
+
}
|
|
45
|
+
body.magritte-old-layout .magritte-item___HyDAw_1-0-1.focus-visible{
|
|
46
|
+
outline:4px solid var(--magritte-color-stroke-state-focused-accessible-v24-7-2);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
@media (min-width: 1024px){
|
|
50
|
+
body:not(.magritte-old-layout) .magritte-item___HyDAw_1-0-1{
|
|
51
|
+
cursor:pointer;
|
|
52
|
+
border-radius:12px;
|
|
53
|
+
padding:10px 12px;
|
|
54
|
+
}
|
|
55
|
+
body:not(.magritte-old-layout) .magritte-item___HyDAw_1-0-1.focus-visible{
|
|
56
|
+
outline:4px solid var(--magritte-color-stroke-state-focused-accessible-v24-7-2);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
.magritte-neutral___WyGeQ_1-0-1:active{
|
|
60
|
+
background-color:var(--magritte-color-background-state-secondary-pressed-v24-7-2);
|
|
61
|
+
}
|
|
62
|
+
@media (min-width: 1020px){
|
|
63
|
+
body.magritte-old-layout .magritte-neutral___WyGeQ_1-0-1:hover:not(:active){
|
|
64
|
+
background-color:var(--magritte-color-background-state-secondary-hovered-v24-7-2);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
@media (min-width: 1024px){
|
|
68
|
+
body:not(.magritte-old-layout) .magritte-neutral___WyGeQ_1-0-1:hover:not(:active){
|
|
69
|
+
background-color:var(--magritte-color-background-state-secondary-hovered-v24-7-2);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
.magritte-negative___F7a0c_1-0-1:active{
|
|
73
|
+
background-color:var(--magritte-color-background-state-negative-secondary-pressed-v24-7-2);
|
|
74
|
+
}
|
|
75
|
+
@media (min-width: 1020px){
|
|
76
|
+
body.magritte-old-layout .magritte-negative___F7a0c_1-0-1:hover:not(:active){
|
|
77
|
+
background-color:var(--magritte-color-background-state-negative-secondary-hovered-v24-7-2);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
@media (min-width: 1024px){
|
|
81
|
+
body:not(.magritte-old-layout) .magritte-negative___F7a0c_1-0-1:hover:not(:active){
|
|
82
|
+
background-color:var(--magritte-color-background-state-negative-secondary-hovered-v24-7-2);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
.magritte-item-icon___yCv9l_1-0-1{
|
|
86
|
+
flex:0 0 auto;
|
|
87
|
+
padding:4px 0;
|
|
88
|
+
}
|
|
89
|
+
@media (min-width: 1020px){
|
|
90
|
+
body.magritte-old-layout .magritte-item-icon___yCv9l_1-0-1{
|
|
91
|
+
padding:0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
@media (min-width: 1024px){
|
|
95
|
+
body:not(.magritte-old-layout) .magritte-item-icon___yCv9l_1-0-1{
|
|
96
|
+
padding:0;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
.magritte-item-text___GL3A5_1-0-1{
|
|
100
|
+
flex:1 1 auto;
|
|
101
|
+
min-width:0;
|
|
102
|
+
padding:4px 0;
|
|
103
|
+
}
|
|
104
|
+
@media (min-width: 1020px){
|
|
105
|
+
body.magritte-old-layout .magritte-item-text___GL3A5_1-0-1{
|
|
106
|
+
padding:0;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
@media (min-width: 1024px){
|
|
110
|
+
body:not(.magritte-old-layout) .magritte-item-text___GL3A5_1-0-1{
|
|
111
|
+
padding:0;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
.magritte-item-tag___KX5wL_1-0-1{
|
|
115
|
+
flex:0 1 auto;
|
|
116
|
+
min-width:0;
|
|
117
|
+
padding:4px 0;
|
|
118
|
+
}
|
|
119
|
+
@media (min-width: 1020px){
|
|
120
|
+
body.magritte-old-layout .magritte-item-tag___KX5wL_1-0-1{
|
|
121
|
+
padding:0;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
@media (min-width: 1024px){
|
|
125
|
+
body:not(.magritte-old-layout) .magritte-item-tag___KX5wL_1-0-1{
|
|
126
|
+
padding:0;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
.magritte-item-right-content___U2hc1_1-0-1{
|
|
130
|
+
flex:0 1 auto;
|
|
131
|
+
min-width:0;
|
|
132
|
+
display:flex;
|
|
133
|
+
align-items:center;
|
|
134
|
+
gap:8px;
|
|
135
|
+
}
|
|
136
|
+
.magritte-mobile-menu-container___zlY08_1-0-1{
|
|
137
|
+
position:relative;
|
|
138
|
+
overflow:hidden;
|
|
139
|
+
}
|
|
140
|
+
.magritte-mobile-main-menu-container___fOW3d_1-0-1{
|
|
141
|
+
position:relative;
|
|
142
|
+
}
|
|
143
|
+
.magritte-mobile-submenu-container___od1Ev_1-0-1{
|
|
144
|
+
position:absolute;
|
|
145
|
+
inset:0 -100% auto 100%;
|
|
146
|
+
}
|
|
147
|
+
@media (prefers-reduced-motion: no-preference){
|
|
148
|
+
.magritte-mobile-main-menu-container___fOW3d_1-0-1,
|
|
149
|
+
.magritte-mobile-submenu-container___od1Ev_1-0-1{
|
|
150
|
+
transition:transform var(--magritte-semantic-animation-time-m-duration-v24-7-2) var(--magritte-semantic-animation-ease-base-timing-function-v24-7-2);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
.magritte-mobile-menu-container-slide___HXiEx_1-0-1 .magritte-mobile-main-menu-container___fOW3d_1-0-1,
|
|
154
|
+
.magritte-mobile-menu-container-slide___HXiEx_1-0-1 .magritte-mobile-submenu-container___od1Ev_1-0-1{
|
|
155
|
+
transform:translateX(-100%);
|
|
156
|
+
}
|
package/index.d.ts
ADDED
package/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
export { Menu } from './Menu.js';
|
|
3
|
+
import 'react/jsx-runtime';
|
|
4
|
+
import 'react';
|
|
5
|
+
import 'classnames';
|
|
6
|
+
import '@hh.ru/magritte-ui-breakpoint';
|
|
7
|
+
import '@hh.ru/magritte-ui-icon/icon';
|
|
8
|
+
import './BottomSheet.js';
|
|
9
|
+
import '@hh.ru/magritte-ui-bottom-sheet';
|
|
10
|
+
import './context.js';
|
|
11
|
+
import './Divider.js';
|
|
12
|
+
import '@hh.ru/magritte-ui-divider';
|
|
13
|
+
import './Drop.js';
|
|
14
|
+
import '@hh.ru/magritte-ui-drop';
|
|
15
|
+
import './Item.js';
|
|
16
|
+
import 'react-dom';
|
|
17
|
+
import '@hh.ru/magritte-common-keyboard';
|
|
18
|
+
import '@hh.ru/magritte-common-use-disabled';
|
|
19
|
+
import '@hh.ru/magritte-ui-icon';
|
|
20
|
+
import '@hh.ru/magritte-ui-switch';
|
|
21
|
+
import '@hh.ru/magritte-ui-typography';
|
|
22
|
+
import './menu-DUjBkv3I.js';
|
|
23
|
+
import './SectionHeader.js';
|
|
24
|
+
import '@hh.ru/magritte-ui-section-header';
|
|
25
|
+
import '@hh.ru/magritte-ui-nav-bar';
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;"}
|
package/index.mock.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from '@hh.ru/magritte-ui-menu/types';
|
|
2
|
+
export declare const Menu: import("react").ForwardRefExoticComponent<Record<string, unknown>> & {
|
|
3
|
+
BottomSheet: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
|
|
4
|
+
Divider: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
|
|
5
|
+
Drop: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
|
|
6
|
+
Item: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
|
|
7
|
+
SectionHeader: import("react").ForwardRefExoticComponent<Record<string, unknown>>;
|
|
8
|
+
};
|
package/index.mock.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
import { mockComponent } from '@hh.ru/magritte-ui-mock-component';
|
|
3
|
+
|
|
4
|
+
const BottomSheet = mockComponent('Menu.BottomSheet', undefined, { withChildren: true });
|
|
5
|
+
const Divider = mockComponent('Menu.Divider', undefined);
|
|
6
|
+
const Drop = mockComponent('Menu.Drop', undefined, { withChildren: true });
|
|
7
|
+
const Item = mockComponent('Menu.Item', undefined, { withChildren: true });
|
|
8
|
+
const SectionHeader = mockComponent('Menu.SectionHeader', undefined, { withChildren: true });
|
|
9
|
+
const Menu = Object.assign(mockComponent('Menu', undefined, { withChildren: true }), {
|
|
10
|
+
BottomSheet,
|
|
11
|
+
Divider,
|
|
12
|
+
Drop,
|
|
13
|
+
Item,
|
|
14
|
+
SectionHeader,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export { Menu };
|
|
18
|
+
//# sourceMappingURL=index.mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mock.js","sources":["src/index.mock.ts"],"sourcesContent":["import { mockComponent } from '@hh.ru/magritte-ui-mock-component';\n\nexport * from '@hh.ru/magritte-ui-menu/types';\n\nconst BottomSheet = mockComponent('Menu.BottomSheet', undefined, { withChildren: true });\n\nconst Divider = mockComponent('Menu.Divider', undefined);\n\nconst Drop = mockComponent('Menu.Drop', undefined, { withChildren: true });\n\nconst Item = mockComponent('Menu.Item', undefined, { withChildren: true });\n\nconst SectionHeader = mockComponent('Menu.SectionHeader', undefined, { withChildren: true });\n\nexport const Menu = Object.assign(mockComponent('Menu', undefined, { withChildren: true }), {\n BottomSheet,\n Divider,\n Drop,\n Item,\n SectionHeader,\n});\n"],"names":[],"mappings":";;AAIA,MAAM,WAAW,GAAG,aAAa,CAAC,kBAAkB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzF,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAEzD,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3E,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;AAE3E,MAAM,aAAa,GAAG,aAAa,CAAC,oBAAoB,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;MAEhF,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE;IACxF,WAAW;IACX,OAAO;IACP,IAAI;IACJ,IAAI;IACJ,aAAa;AAChB,CAAA;;;;"}
|
package/menu-DUjBkv3I.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import './index.css';
|
|
2
|
+
var styles = {"disabled":"magritte-disabled___ZuG-J_1-0-1","drop-content-margin":"magritte-drop-content-margin___q01ll_1-0-1","dropContentMargin":"magritte-drop-content-margin___q01ll_1-0-1","item":"magritte-item___HyDAw_1-0-1","neutral":"magritte-neutral___WyGeQ_1-0-1","negative":"magritte-negative___F7a0c_1-0-1","item-icon":"magritte-item-icon___yCv9l_1-0-1","itemIcon":"magritte-item-icon___yCv9l_1-0-1","item-text":"magritte-item-text___GL3A5_1-0-1","itemText":"magritte-item-text___GL3A5_1-0-1","item-tag":"magritte-item-tag___KX5wL_1-0-1","itemTag":"magritte-item-tag___KX5wL_1-0-1","item-right-content":"magritte-item-right-content___U2hc1_1-0-1","itemRightContent":"magritte-item-right-content___U2hc1_1-0-1","mobile-menu-container":"magritte-mobile-menu-container___zlY08_1-0-1","mobileMenuContainer":"magritte-mobile-menu-container___zlY08_1-0-1","mobile-main-menu-container":"magritte-mobile-main-menu-container___fOW3d_1-0-1","mobileMainMenuContainer":"magritte-mobile-main-menu-container___fOW3d_1-0-1","mobile-submenu-container":"magritte-mobile-submenu-container___od1Ev_1-0-1","mobileSubmenuContainer":"magritte-mobile-submenu-container___od1Ev_1-0-1","mobile-menu-container-slide":"magritte-mobile-menu-container-slide___HXiEx_1-0-1","mobileMenuContainerSlide":"magritte-mobile-menu-container-slide___HXiEx_1-0-1"};
|
|
3
|
+
|
|
4
|
+
export { styles as s };
|
|
5
|
+
//# sourceMappingURL=menu-DUjBkv3I.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-DUjBkv3I.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hh.ru/magritte-ui-menu",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"types": "index.d.ts",
|
|
6
|
+
"sideEffects": [
|
|
7
|
+
"index.css"
|
|
8
|
+
],
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "yarn root:build $(pwd)",
|
|
11
|
+
"build-test-branch": "yarn root:build-test-branch $(pwd)",
|
|
12
|
+
"prepack": "yarn root:prepack $(pwd)",
|
|
13
|
+
"postpublish": "yarn root:postpublish $(pwd)",
|
|
14
|
+
"stylelint-check": "yarn root:stylelint-check $(pwd)",
|
|
15
|
+
"eslint-check": "yarn root:eslint-check $(pwd)",
|
|
16
|
+
"ts-config": "yarn root:ts-config $(pwd)",
|
|
17
|
+
"ts-check": "yarn root:ts-check $(pwd)",
|
|
18
|
+
"test": "yarn root:test $(pwd)",
|
|
19
|
+
"watch": "yarn root:watch $(pwd)"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@hh.ru/magritte-common-keyboard": "4.3.4",
|
|
23
|
+
"@hh.ru/magritte-common-use-disabled": "1.0.15",
|
|
24
|
+
"@hh.ru/magritte-design-tokens": "24.7.2",
|
|
25
|
+
"@hh.ru/magritte-ui-bottom-sheet": "9.4.9",
|
|
26
|
+
"@hh.ru/magritte-ui-breakpoint": "6.1.1",
|
|
27
|
+
"@hh.ru/magritte-ui-divider": "3.2.1",
|
|
28
|
+
"@hh.ru/magritte-ui-drop": "12.3.34",
|
|
29
|
+
"@hh.ru/magritte-ui-icon": "14.2.13",
|
|
30
|
+
"@hh.ru/magritte-ui-mock-component": "1.1.7",
|
|
31
|
+
"@hh.ru/magritte-ui-nav-bar": "2.0.1",
|
|
32
|
+
"@hh.ru/magritte-ui-section-header": "1.1.0",
|
|
33
|
+
"@hh.ru/magritte-ui-switch": "3.1.25",
|
|
34
|
+
"@hh.ru/magritte-ui-tag": "5.3.13",
|
|
35
|
+
"@hh.ru/magritte-ui-typography": "5.3.6"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"classnames": ">=2.3.2",
|
|
39
|
+
"react": ">=18.2.0",
|
|
40
|
+
"react-dom": ">=18.2.0"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"gitHead": "2d1368843f436bae7ed053430de10909840d8cc4"
|
|
46
|
+
}
|
package/types.d.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type DropProps } from '@hh.ru/magritte-ui-drop';
|
|
2
|
+
export interface MenuProps extends React.PropsWithChildren {
|
|
3
|
+
activatorRef: DropProps['activatorRef'];
|
|
4
|
+
onClose: VoidFunction;
|
|
5
|
+
placement: DropProps['placement'];
|
|
6
|
+
visible: boolean;
|
|
7
|
+
render?: (props: MenuRenderFuncProps) => React.ReactElement;
|
|
8
|
+
}
|
|
9
|
+
export interface MenuRenderFuncProps extends React.PropsWithChildren {
|
|
10
|
+
/** Функция, закрывающая мобильное сабменю */
|
|
11
|
+
closeMobileSubmenu?: VoidFunction;
|
|
12
|
+
/** Флаг видимости мобильного сабменю */
|
|
13
|
+
mobileSubmenuVisible?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface MenuItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'style'>, React.PropsWithChildren {
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/** Иконка размера 24px */
|
|
18
|
+
icon?: React.ReactNode;
|
|
19
|
+
/** Флаг выбранности айтема, добавляет галочку справа и отключает rightContent и сабменю */
|
|
20
|
+
selected?: boolean;
|
|
21
|
+
/** Стиль */
|
|
22
|
+
style?: 'neutral' | 'negative';
|
|
23
|
+
/** Айтемы сабменю. Не будут отображаться, если selected=true. Уровень вложенности более двух не допускается. */
|
|
24
|
+
subitems?: React.ReactNode;
|
|
25
|
+
/** Подзаголовок */
|
|
26
|
+
subtitle?: React.ReactNode;
|
|
27
|
+
/** Компонент <Tag /> */
|
|
28
|
+
tag?: React.ReactNode;
|
|
29
|
+
/** Компонент <Switch /> либо текст. Не будет отображаться, если selected=true. */
|
|
30
|
+
rightContent?: React.ReactNode;
|
|
31
|
+
}
|
package/types.js
ADDED
package/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|