@udixio/ui-react 2.10.2 → 2.10.3
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/CHANGELOG.md +11 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1893 -1915
- package/dist/lib/components/Menu.d.ts +1 -1
- package/dist/lib/components/Menu.d.ts.map +1 -1
- package/dist/lib/components/MenuItem.d.ts +1 -1
- package/dist/lib/components/MenuItem.d.ts.map +1 -1
- package/dist/lib/interfaces/menu-item.interface.d.ts +20 -25
- package/dist/lib/interfaces/menu-item.interface.d.ts.map +1 -1
- package/dist/lib/styles/menu-item.style.d.ts +64 -14
- package/dist/lib/styles/menu-item.style.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/Menu.tsx +1 -26
- package/src/lib/components/MenuItem.tsx +37 -19
- package/src/lib/interfaces/menu-item.interface.ts +21 -26
- package/src/lib/styles/menu-item.style.ts +7 -15
|
@@ -12,5 +12,5 @@ import { ReactProps } from '../utils/component';
|
|
|
12
12
|
* @a11y
|
|
13
13
|
* - `role="listbox"` with `aria-selected` management.
|
|
14
14
|
*/
|
|
15
|
-
export declare const Menu: ({ children,
|
|
15
|
+
export declare const Menu: ({ children, className, variant, ...restProps }: ReactProps<MenuInterface>) => import("react/jsx-runtime").JSX.Element;
|
|
16
16
|
//# sourceMappingURL=Menu.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMhD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,GAAI,
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/lib/components/Menu.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAMhD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,IAAI,GAAI,gDAKlB,UAAU,CAAC,aAAa,CAAC,4CA4D3B,CAAC"}
|
|
@@ -5,5 +5,5 @@ import { MenuItemInterface } from '../interfaces/menu-item.interface';
|
|
|
5
5
|
* @status beta
|
|
6
6
|
* @category Selection
|
|
7
7
|
*/
|
|
8
|
-
export declare const MenuItem: ({ label, children, value, leadingIcon, trailingIcon, disabled,
|
|
8
|
+
export declare const MenuItem: ({ label, children, value, leadingIcon, trailingIcon, disabled, variant, href, onClick, onToggle, activated, className, ...restProps }: ReactProps<MenuItemInterface>) => import("react/jsx-runtime").JSX.Element;
|
|
9
9
|
//# sourceMappingURL=MenuItem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenuItem.d.ts","sourceRoot":"","sources":["../../../src/lib/components/MenuItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAMtE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,
|
|
1
|
+
{"version":3,"file":"MenuItem.d.ts","sourceRoot":"","sources":["../../../src/lib/components/MenuItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAc,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAMtE;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,uIActB,UAAU,CAAC,iBAAiB,CAAC,4CA0L/B,CAAC"}
|
|
@@ -1,34 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
value
|
|
1
|
+
import { ActionOrLink } from '../utils/component';
|
|
2
|
+
type Props = {
|
|
3
|
+
value?: string | number;
|
|
4
4
|
label?: string;
|
|
5
5
|
children?: React.ReactNode;
|
|
6
6
|
leadingIcon?: any;
|
|
7
7
|
trailingIcon?: any;
|
|
8
8
|
disabled?: boolean;
|
|
9
|
-
selected?: boolean;
|
|
10
9
|
variant?: 'standard' | 'vibrant';
|
|
11
10
|
onClick?: (e?: React.MouseEvent) => void;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
onToggle?: (activated: boolean) => void;
|
|
12
|
+
activated?: boolean;
|
|
13
|
+
};
|
|
14
|
+
type Elements = [
|
|
15
|
+
'menuItem',
|
|
16
|
+
'selectedItem',
|
|
17
|
+
'itemLabel',
|
|
18
|
+
'itemIcon',
|
|
19
|
+
'leadingIcon',
|
|
20
|
+
'trailingIcon'
|
|
21
|
+
];
|
|
22
|
+
export type MenuItemInterface = ActionOrLink<Props> & {
|
|
23
|
+
states: {
|
|
24
|
+
isActive: boolean;
|
|
23
25
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
'selectedItem',
|
|
28
|
-
'itemLabel',
|
|
29
|
-
'itemIcon',
|
|
30
|
-
'leadingIcon',
|
|
31
|
-
'trailingIcon'
|
|
32
|
-
];
|
|
33
|
-
}
|
|
26
|
+
elements: Elements;
|
|
27
|
+
};
|
|
28
|
+
export {};
|
|
34
29
|
//# sourceMappingURL=menu-item.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/menu-item.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"menu-item.interface.d.ts","sourceRoot":"","sources":["../../../src/lib/interfaces/menu-item.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,KAAK,KAAK,GAAG;IACX,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,QAAQ,GAAG;IACd,UAAU;IACV,cAAc;IACd,WAAW;IACX,UAAU;IACV,aAAa;IACb,cAAc;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG;IACpD,MAAM,EAAE;QACN,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;CACpB,CAAC"}
|
|
@@ -1,39 +1,89 @@
|
|
|
1
1
|
import { ClassNameComponent } from '../utils';
|
|
2
2
|
import { MenuItemInterface } from '../interfaces/menu-item.interface';
|
|
3
|
-
export declare const menuItemStyle: (states: {
|
|
4
|
-
label: any;
|
|
3
|
+
export declare const menuItemStyle: (states: (({
|
|
5
4
|
value: any;
|
|
5
|
+
label: any;
|
|
6
|
+
children: any;
|
|
6
7
|
leadingIcon: any;
|
|
7
8
|
trailingIcon: any;
|
|
8
9
|
disabled: any;
|
|
9
|
-
selected: any;
|
|
10
10
|
variant: any;
|
|
11
|
-
|
|
11
|
+
onClick: any;
|
|
12
|
+
onToggle: any;
|
|
13
|
+
activated: any;
|
|
14
|
+
href: any;
|
|
15
|
+
} | {
|
|
16
|
+
value: any;
|
|
17
|
+
label: any;
|
|
12
18
|
children: any;
|
|
13
|
-
|
|
19
|
+
leadingIcon: any;
|
|
20
|
+
trailingIcon: any;
|
|
21
|
+
disabled: any;
|
|
22
|
+
variant: any;
|
|
23
|
+
onClick: any;
|
|
24
|
+
onToggle: any;
|
|
25
|
+
activated: any;
|
|
26
|
+
href: any;
|
|
27
|
+
}) & (({
|
|
28
|
+
value?: string | number;
|
|
14
29
|
label?: string;
|
|
15
|
-
|
|
30
|
+
children?: React.ReactNode;
|
|
16
31
|
leadingIcon?: any;
|
|
17
32
|
trailingIcon?: any;
|
|
18
33
|
disabled?: boolean;
|
|
19
|
-
selected?: boolean;
|
|
20
34
|
variant?: "standard" | "vibrant";
|
|
21
|
-
|
|
35
|
+
onClick?: (e?: React.MouseEvent) => void;
|
|
36
|
+
onToggle?: (activated: boolean) => void;
|
|
37
|
+
activated?: boolean;
|
|
38
|
+
} & {
|
|
39
|
+
href?: string;
|
|
40
|
+
}) | ({
|
|
41
|
+
value?: string | number;
|
|
42
|
+
label?: string;
|
|
22
43
|
children?: React.ReactNode;
|
|
23
|
-
|
|
44
|
+
leadingIcon?: any;
|
|
45
|
+
trailingIcon?: any;
|
|
46
|
+
disabled?: boolean;
|
|
47
|
+
variant?: "standard" | "vibrant";
|
|
48
|
+
onClick?: (e?: React.MouseEvent) => void;
|
|
49
|
+
onToggle?: (activated: boolean) => void;
|
|
50
|
+
activated?: boolean;
|
|
51
|
+
} & {
|
|
52
|
+
href?: never;
|
|
53
|
+
}))) & {
|
|
54
|
+
isActive: boolean;
|
|
55
|
+
} & {
|
|
24
56
|
className: string | ClassNameComponent<MenuItemInterface> | undefined;
|
|
25
57
|
}) => Record<"leadingIcon" | "trailingIcon" | "selectedItem" | "menuItem" | "itemLabel" | "itemIcon", string>;
|
|
26
|
-
export declare const useMenuItemStyle: (states:
|
|
58
|
+
export declare const useMenuItemStyle: (states: {
|
|
59
|
+
isActive: boolean;
|
|
60
|
+
} & ((({
|
|
61
|
+
value?: string | number;
|
|
27
62
|
label?: string;
|
|
28
|
-
|
|
63
|
+
children?: React.ReactNode;
|
|
29
64
|
leadingIcon?: any;
|
|
30
65
|
trailingIcon?: any;
|
|
31
66
|
disabled?: boolean;
|
|
32
|
-
selected?: boolean;
|
|
33
67
|
variant?: "standard" | "vibrant";
|
|
34
|
-
|
|
68
|
+
onClick?: (e?: React.MouseEvent) => void;
|
|
69
|
+
onToggle?: (activated: boolean) => void;
|
|
70
|
+
activated?: boolean;
|
|
71
|
+
} & {
|
|
72
|
+
href?: string;
|
|
73
|
+
}) | ({
|
|
74
|
+
value?: string | number;
|
|
75
|
+
label?: string;
|
|
35
76
|
children?: React.ReactNode;
|
|
77
|
+
leadingIcon?: any;
|
|
78
|
+
trailingIcon?: any;
|
|
79
|
+
disabled?: boolean;
|
|
80
|
+
variant?: "standard" | "vibrant";
|
|
81
|
+
onClick?: (e?: React.MouseEvent) => void;
|
|
82
|
+
onToggle?: (activated: boolean) => void;
|
|
83
|
+
activated?: boolean;
|
|
36
84
|
} & {
|
|
85
|
+
href?: never;
|
|
86
|
+
})) & {
|
|
37
87
|
className?: string | ClassNameComponent<MenuItemInterface> | undefined;
|
|
38
|
-
}) => Record<"leadingIcon" | "trailingIcon" | "selectedItem" | "menuItem" | "itemLabel" | "itemIcon", string>;
|
|
88
|
+
})) => Record<"leadingIcon" | "trailingIcon" | "selectedItem" | "menuItem" | "itemLabel" | "itemIcon", string>;
|
|
39
89
|
//# sourceMappingURL=menu-item.style.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-item.style.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/menu-item.style.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"menu-item.style.d.ts","sourceRoot":"","sources":["../../../src/lib/styles/menu-item.style.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,kBAAkB,EAIxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AA+BtE,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA1BpB,CAAC;;;;;;;;;;;;;gBAAD,CAAC;;;;;;;;;6GA6BN,CAAC;AACF,eAAO,MAAM,gBAAgB;;;;;;;;;;gBA9BvB,CAAC;;;;;;;;;;;;;gBAAD,CAAC;;;;;;;8GAiCN,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useRef } from 'react';
|
|
2
2
|
import { MenuInterface } from '../interfaces/menu.interface';
|
|
3
3
|
import { useMenuStyle } from '../styles/menu.style';
|
|
4
4
|
import { classNames } from '../utils';
|
|
@@ -22,8 +22,6 @@ import { MenuGroup } from './MenuGroup';
|
|
|
22
22
|
*/
|
|
23
23
|
export const Menu = ({
|
|
24
24
|
children,
|
|
25
|
-
selected,
|
|
26
|
-
onItemSelect,
|
|
27
25
|
className,
|
|
28
26
|
variant = 'standard',
|
|
29
27
|
...restProps
|
|
@@ -34,8 +32,6 @@ export const Menu = ({
|
|
|
34
32
|
);
|
|
35
33
|
const styles = useMenuStyle({
|
|
36
34
|
children,
|
|
37
|
-
selected,
|
|
38
|
-
onItemSelect,
|
|
39
35
|
className,
|
|
40
36
|
variant,
|
|
41
37
|
hasGroups,
|
|
@@ -44,18 +40,6 @@ export const Menu = ({
|
|
|
44
40
|
|
|
45
41
|
const listRef = useRef<HTMLDivElement>(null);
|
|
46
42
|
|
|
47
|
-
// Scroll to selected item on open
|
|
48
|
-
useEffect(() => {
|
|
49
|
-
if (listRef.current) {
|
|
50
|
-
const selectedEl = listRef.current.querySelector(
|
|
51
|
-
'[aria-selected="true"]',
|
|
52
|
-
) as HTMLElement;
|
|
53
|
-
if (selectedEl) {
|
|
54
|
-
selectedEl.scrollIntoView({ block: 'nearest' });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}, []);
|
|
58
|
-
|
|
59
43
|
const renderChildren = (nodes: React.ReactNode): React.ReactNode => {
|
|
60
44
|
return React.Children.map(nodes, (child) => {
|
|
61
45
|
if (!React.isValidElement(child)) return child;
|
|
@@ -70,17 +54,8 @@ export const Menu = ({
|
|
|
70
54
|
}
|
|
71
55
|
|
|
72
56
|
if (child.type === MenuItem) {
|
|
73
|
-
const childValue = (child.props as any).value;
|
|
74
|
-
const isSelected = Array.isArray(selected)
|
|
75
|
-
? selected.includes(childValue)
|
|
76
|
-
: selected === childValue;
|
|
77
|
-
|
|
78
57
|
return React.cloneElement(child, {
|
|
79
|
-
selected: isSelected,
|
|
80
58
|
variant: variant,
|
|
81
|
-
onItemSelect: (val: string | number) => {
|
|
82
|
-
onItemSelect?.(val);
|
|
83
|
-
},
|
|
84
59
|
} as any);
|
|
85
60
|
}
|
|
86
61
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import React, { useRef, useState } from 'react';
|
|
1
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { Icon } from '../icon';
|
|
3
3
|
import { classNames, ReactProps } from '../utils';
|
|
4
4
|
import { MenuItemInterface } from '../interfaces/menu-item.interface';
|
|
5
5
|
import { useMenuItemStyle } from '../styles/menu-item.style';
|
|
6
|
-
import { faChevronRight } from '@fortawesome/free-solid-svg-icons';
|
|
6
|
+
import { faCheck, faChevronRight } from '@fortawesome/free-solid-svg-icons';
|
|
7
7
|
import { AnchorPositioner } from './AnchorPositioner';
|
|
8
8
|
import { State } from '../effects';
|
|
9
9
|
|
|
@@ -19,10 +19,11 @@ export const MenuItem = ({
|
|
|
19
19
|
leadingIcon,
|
|
20
20
|
trailingIcon,
|
|
21
21
|
disabled,
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
variant = 'standard',
|
|
23
|
+
href,
|
|
24
24
|
onClick,
|
|
25
|
-
|
|
25
|
+
onToggle,
|
|
26
|
+
activated = false,
|
|
26
27
|
className,
|
|
27
28
|
...restProps
|
|
28
29
|
}: ReactProps<MenuItemInterface>) => {
|
|
@@ -47,15 +48,26 @@ export const MenuItem = ({
|
|
|
47
48
|
const labelContent = contentChildren.length > 0 ? contentChildren : label;
|
|
48
49
|
|
|
49
50
|
const [isSubMenuOpen, setIsSubMenuOpen] = useState(false);
|
|
50
|
-
const
|
|
51
|
+
const [isActive, setIsActive] = useState(activated);
|
|
52
|
+
|
|
53
|
+
if (isActive) {
|
|
54
|
+
leadingIcon = faCheck;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const itemRef = useRef<HTMLButtonElement | HTMLAnchorElement>(null);
|
|
51
58
|
const closeTimerRef = useRef<any>(null);
|
|
52
59
|
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
setIsActive(activated);
|
|
62
|
+
}, [activated]);
|
|
63
|
+
|
|
53
64
|
const styles = useMenuItemStyle({
|
|
54
65
|
variant,
|
|
55
66
|
disabled,
|
|
56
|
-
selected,
|
|
57
67
|
className,
|
|
58
68
|
value,
|
|
69
|
+
activated: isActive,
|
|
70
|
+
isActive,
|
|
59
71
|
});
|
|
60
72
|
|
|
61
73
|
const handleClick = (e: React.MouseEvent) => {
|
|
@@ -69,9 +81,11 @@ export const MenuItem = ({
|
|
|
69
81
|
return;
|
|
70
82
|
}
|
|
71
83
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
84
|
+
if (onToggle) {
|
|
85
|
+
setIsActive(!isActive);
|
|
86
|
+
onToggle(!isActive);
|
|
87
|
+
} else {
|
|
88
|
+
onClick?.(e);
|
|
75
89
|
}
|
|
76
90
|
};
|
|
77
91
|
|
|
@@ -104,20 +118,23 @@ export const MenuItem = ({
|
|
|
104
118
|
const effectiveTrailingIcon =
|
|
105
119
|
trailingIcon ?? (subMenuElement ? faChevronRight : undefined);
|
|
106
120
|
|
|
121
|
+
const ElementType = href ? 'a' : 'button';
|
|
122
|
+
|
|
107
123
|
return (
|
|
108
|
-
<
|
|
109
|
-
ref={itemRef}
|
|
110
|
-
|
|
124
|
+
<ElementType
|
|
125
|
+
ref={itemRef as any}
|
|
126
|
+
href={href}
|
|
127
|
+
className={styles.menuItem}
|
|
111
128
|
onClick={handleClick}
|
|
112
129
|
onMouseEnter={handleMouseEnter}
|
|
113
130
|
onMouseLeave={handleMouseLeave}
|
|
114
131
|
role="option"
|
|
115
132
|
aria-haspopup={!!subMenuElement}
|
|
116
133
|
aria-expanded={isSubMenuOpen}
|
|
117
|
-
aria-
|
|
134
|
+
aria-pressed={onToggle ? isActive : undefined}
|
|
118
135
|
tabIndex={disabled ? -1 : 0}
|
|
136
|
+
disabled={!href ? disabled : undefined}
|
|
119
137
|
onKeyDown={(e) => {
|
|
120
|
-
// ... key handlers ...
|
|
121
138
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
122
139
|
e.preventDefault();
|
|
123
140
|
if (subMenuElement) {
|
|
@@ -135,14 +152,15 @@ export const MenuItem = ({
|
|
|
135
152
|
e.stopPropagation();
|
|
136
153
|
}
|
|
137
154
|
}}
|
|
138
|
-
{...restProps}
|
|
155
|
+
{...(restProps as any)}
|
|
139
156
|
>
|
|
140
157
|
<State
|
|
141
158
|
className="absolute inset-0 pointer-events-none"
|
|
142
159
|
colorName={classNames(
|
|
143
160
|
// Match text color for state layer usually
|
|
144
|
-
variant === 'vibrant'
|
|
145
|
-
|
|
161
|
+
variant === 'vibrant' || isActive
|
|
162
|
+
? 'on-tertiary-container'
|
|
163
|
+
: 'on-secondary-container',
|
|
146
164
|
)}
|
|
147
165
|
stateClassName={'state-ripple-group-[menu-item]'}
|
|
148
166
|
/>
|
|
@@ -192,6 +210,6 @@ export const MenuItem = ({
|
|
|
192
210
|
</div>
|
|
193
211
|
</AnchorPositioner>
|
|
194
212
|
)}
|
|
195
|
-
</
|
|
213
|
+
</ElementType>
|
|
196
214
|
);
|
|
197
215
|
};
|
|
@@ -1,35 +1,30 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ActionOrLink } from '../utils/component';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
value
|
|
3
|
+
type Props = {
|
|
4
|
+
value?: string | number;
|
|
5
5
|
label?: string;
|
|
6
6
|
children?: React.ReactNode;
|
|
7
7
|
leadingIcon?: any;
|
|
8
8
|
trailingIcon?: any;
|
|
9
9
|
disabled?: boolean;
|
|
10
|
-
selected?: boolean; // Injected by parent
|
|
11
10
|
variant?: 'standard' | 'vibrant'; // Injected by parent
|
|
12
11
|
onClick?: (e?: React.MouseEvent) => void;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
onToggle?: (activated: boolean) => void;
|
|
13
|
+
activated?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
type Elements = [
|
|
17
|
+
'menuItem',
|
|
18
|
+
'selectedItem',
|
|
19
|
+
'itemLabel',
|
|
20
|
+
'itemIcon',
|
|
21
|
+
'leadingIcon',
|
|
22
|
+
'trailingIcon',
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export type MenuItemInterface = ActionOrLink<Props> & {
|
|
26
|
+
states: {
|
|
27
|
+
isActive: boolean;
|
|
25
28
|
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
'menuItem',
|
|
29
|
-
'selectedItem',
|
|
30
|
-
'itemLabel',
|
|
31
|
-
'itemIcon',
|
|
32
|
-
'leadingIcon',
|
|
33
|
-
'trailingIcon',
|
|
34
|
-
];
|
|
35
|
-
}
|
|
29
|
+
elements: Elements;
|
|
30
|
+
};
|
|
@@ -9,31 +9,23 @@ import { MenuItemInterface } from '../interfaces/menu-item.interface';
|
|
|
9
9
|
const menuItemConfig: ClassNameComponent<MenuItemInterface> = ({
|
|
10
10
|
variant,
|
|
11
11
|
disabled,
|
|
12
|
-
|
|
12
|
+
isActive,
|
|
13
13
|
}) => ({
|
|
14
14
|
menuItem: classNames(
|
|
15
|
-
'group/menu-item overflow-hidden flex items-center h-12 px-3 cursor-pointer outline-none select-none shrink-0 ',
|
|
15
|
+
'group/menu-item text-start overflow-hidden flex items-center h-12 px-3 cursor-pointer outline-none select-none shrink-0 ',
|
|
16
16
|
'text-label-large',
|
|
17
17
|
'transition-colors duration-200',
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
'rounded-xl': !selected,
|
|
21
|
-
},
|
|
18
|
+
'rounded-xl',
|
|
19
|
+
|
|
22
20
|
{
|
|
23
21
|
'text-on-surface': !variant || variant === 'standard',
|
|
24
22
|
// 'hover:bg-on-surface/[0.08] focus:bg-on-surface/[0.12]': !props?.variant || props.variant === 'standard', // Handled by State
|
|
25
23
|
// 'hover:bg-on-tertiary-container/[0.08] focus:bg-on-tertiary-container/[0.12]': props?.variant === 'vibrant', // Handled by State
|
|
26
24
|
'opacity-38 pointer-events-none': disabled,
|
|
27
25
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// 'hover:bg-secondary-container/[0.8]',
|
|
32
|
-
'[&_.menu-item-icon]:text-inherit',
|
|
33
|
-
{
|
|
34
|
-
// For vibrant, selected state
|
|
35
|
-
'!bg-on-tertiary-container/[0.12]': variant === 'vibrant',
|
|
36
|
-
},
|
|
26
|
+
(variant === 'vibrant' || isActive) && [
|
|
27
|
+
'bg-secondary-container text-on-secondary-container',
|
|
28
|
+
],
|
|
37
29
|
),
|
|
38
30
|
itemLabel: classNames('flex-1 truncate'),
|
|
39
31
|
itemIcon: classNames(
|