@mgdis/mg-components 5.7.0 → 5.8.0
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/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/mg-action-more_31.cjs.entry.js +216 -565
- package/dist/cjs/mg-components.cjs.js +1 -1
- package/dist/cjs/mg-item-more.cjs.entry.js +273 -0
- package/dist/cjs/mg-menu.conf-9afe6571.js +242 -0
- package/dist/collection/collection-manifest.json +2 -1
- package/dist/collection/components/atoms/mg-button/mg-button.js +24 -0
- package/dist/collection/components/atoms/mg-icon/mg-icon.conf.js +8 -0
- package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +6 -2
- package/dist/collection/components/molecules/menu/mg-menu/mg-menu.conf.js +0 -13
- package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js +39 -67
- package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.css +3 -3
- package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js +156 -77
- package/dist/collection/components/molecules/mg-item-more/mg-item-more.conf.js +1 -0
- package/dist/collection/components/molecules/mg-item-more/mg-item-more.css +30 -0
- package/dist/collection/components/molecules/mg-item-more/mg-item-more.js +200 -0
- package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +0 -2
- package/dist/collection/styles/navigation-button.scss +1 -1
- package/dist/collection/utils/behaviors.utils.js +33 -29
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +1 -0
- package/dist/components/mg-action-more.js +2 -1
- package/dist/components/mg-button2.js +4 -1
- package/dist/components/mg-icon2.js +8 -0
- package/dist/components/mg-item-more.d.ts +11 -0
- package/dist/components/mg-item-more.js +336 -0
- package/dist/components/mg-menu-item2.js +134 -250
- package/dist/components/mg-menu.conf.js +14 -0
- package/dist/components/mg-menu2.js +35 -102
- package/dist/components/mg-tabs.js +1 -1
- package/dist/components/mg-tooltip2.js +6 -2
- package/dist/esm/loader.js +1 -1
- package/dist/esm/mg-action-more_31.entry.js +185 -534
- package/dist/esm/mg-components.js +1 -1
- package/dist/esm/mg-item-more.entry.js +269 -0
- package/dist/esm/mg-menu.conf-881fbd82.js +235 -0
- package/dist/mg-components/mg-components.css +1 -1
- package/dist/mg-components/mg-components.esm.js +1 -1
- package/dist/mg-components/p-1221773c.entry.js +1 -0
- package/dist/mg-components/p-367f92d2.js +1 -0
- package/dist/mg-components/p-6aeded97.entry.js +1 -0
- package/dist/mg-components/styles/navigation-button.scss +1 -1
- package/dist/types/components/atoms/mg-button/mg-button.d.ts +5 -0
- package/dist/types/components/molecules/menu/mg-menu/mg-menu.conf.d.ts +3 -27
- package/dist/types/components/molecules/menu/mg-menu/mg-menu.d.ts +9 -27
- package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.conf.d.ts +5 -0
- package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.d.ts +65 -16
- package/dist/types/components/molecules/mg-item-more/mg-item-more.conf.d.ts +26 -0
- package/dist/types/components/molecules/mg-item-more/mg-item-more.d.ts +74 -0
- package/dist/types/components.d.ts +66 -12
- package/dist/types/utils/behaviors.utils.d.ts +12 -5
- package/package.json +1 -1
- package/dist/mg-components/p-4cfd5423.entry.js +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
|
|
2
|
-
import { C as ClassList } from './components.utils.js';
|
|
2
|
+
import { c as createID, C as ClassList } from './components.utils.js';
|
|
3
3
|
import { i as initLocales } from './index2.js';
|
|
4
|
+
import { D as Direction } from './mg-menu.conf.js';
|
|
4
5
|
import { d as defineCustomElement$5 } from './mg-badge2.js';
|
|
5
6
|
import { d as defineCustomElement$4 } from './mg-button2.js';
|
|
6
7
|
import { d as defineCustomElement$3 } from './mg-card2.js';
|
|
@@ -26,223 +27,127 @@ var Status;
|
|
|
26
27
|
Status["ACTIVE"] = "active";
|
|
27
28
|
})(Status || (Status = {}));
|
|
28
29
|
|
|
29
|
-
/**
|
|
30
|
-
* Menu direction type
|
|
31
|
-
*/
|
|
32
|
-
var Direction;
|
|
33
|
-
(function (Direction) {
|
|
34
|
-
Direction["VERTICAL"] = "vertical";
|
|
35
|
-
Direction["HORIZONTAL"] = "horizontal";
|
|
36
|
-
})(Direction || (Direction = {}));
|
|
37
|
-
/**
|
|
38
|
-
* More item type guard
|
|
39
|
-
*
|
|
40
|
-
* @param {unknown} element element to control
|
|
41
|
-
* @returns {boolean} truthy if element is more-item
|
|
42
|
-
*/
|
|
43
|
-
const isMoreItem = (element) => {
|
|
44
|
-
var _a, _b, _c;
|
|
45
|
-
const item = element;
|
|
46
|
-
return (item === undefined ||
|
|
47
|
-
(typeof item === 'object' &&
|
|
48
|
-
(typeof item.size === 'string' || typeof ((_a = item.mgIcon) === null || _a === void 0 ? void 0 : _a.icon) === 'string' || typeof ((_b = item.slotLabel) === null || _b === void 0 ? void 0 : _b.label) === 'string' || typeof ((_c = item.slotLabel) === null || _c === void 0 ? void 0 : _c.display) === 'boolean')));
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* List of all possibles sizes
|
|
52
|
-
*/
|
|
53
|
-
const sizes = ['regular', 'medium', 'large'];
|
|
30
|
+
const mgMenuItemCss = ".sr-only{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}*:focus:not(:focus-visible){outline:none}@media (prefers-reduced-motion){.mg-a11y-animation{animation:none !important;transition:none !important}}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding:1rem 2rem;height:3.8rem}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button,.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button ::slotted([slot=label]),.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button ::slotted([slot=metadata]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular ::slotted([slot=label]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular ::slotted([slot=metadata]){font-size:var(--font-size)}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular.mg-menu-item__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular.mg-menu-item__navigation-button--vertical{padding-left:calc(2rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding:1rem 3rem;height:5.1rem}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button,.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button ::slotted([slot=label]),.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button ::slotted([slot=metadata]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium ::slotted([slot=label]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium ::slotted([slot=metadata]){font-size:calc(var(--font-size) + 0.2rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium.mg-menu-item__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium.mg-menu-item__navigation-button--vertical{padding-left:calc(3rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding:1rem 4rem;height:7.1rem}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button,.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button ::slotted([slot=label]),.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button ::slotted([slot=metadata]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large ::slotted([slot=label]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large ::slotted([slot=metadata]){font-size:calc(var(--font-size) + 0.2rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large.mg-menu-item__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large.mg-menu-item__navigation-button--vertical{padding-left:calc(4rem - 0.3rem)}.mg-menu-item__navigation-button{display:flex;align-items:center;column-gap:var(--mg-menu-item-navigation-button-column-gap, 1rem);background-color:unset;border:none;font-family:var(--font-family);font-weight:400;color:hsl(var(--mg-menu-item-color-hsl, var(--color-dark)));line-height:var(--line-height);text-decoration:none;white-space:nowrap;box-sizing:border-box;cursor:pointer}.mg-menu-item__navigation-button:disabled,.mg-menu-item__navigation-button--disabled{cursor:default;opacity:var(--mg-disabled-opacity)}.mg-menu-item__navigation-button:focus-visible{z-index:10}.mg-menu-item__navigation-button:hover:not(.mg-menu-item__navigation-button--disabled),.mg-menu-item__navigation-button:focus-visible:not(.mg-menu-item__navigation-button--disabled){background-color:hsl(var(--mg-menu-item-focused-background-color-hsl), 0.1)}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active{color:hsl(var(--mg-menu-item-color-active-hsl));font-weight:600}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active.mg-menu-item__navigation-button--horizontal{border-bottom-color:hsl(var(--mg-menu-item-border-color-active-hsl))}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active.mg-menu-item__navigation-button--vertical{border-left-color:hsl(var(--mg-menu-item-border-color-active-hsl))}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--hidden{display:none}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal{border-bottom:0.3rem solid transparent}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical{border-left:0.3rem solid transparent}:host([data-style-direction-vertical][data-level=\"1\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(1 * 2rem - 0.3rem)}:host([data-level=\"1\"]) .mg-menu-item__collapse-container{z-index:calc(1 * 10)}:host([data-style-direction-vertical][data-level=\"2\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(2 * 2rem - 0.3rem)}:host([data-level=\"2\"]) .mg-menu-item__collapse-container{z-index:calc(2 * 10)}:host([data-style-direction-vertical][data-level=\"3\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(3 * 2rem - 0.3rem)}:host([data-level=\"3\"]) .mg-menu-item__collapse-container{z-index:calc(3 * 10)}:host([data-style-direction-vertical][data-level=\"4\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(4 * 2rem - 0.3rem)}:host([data-level=\"4\"]) .mg-menu-item__collapse-container{z-index:calc(4 * 10)}:host([data-style-direction-vertical][data-level=\"5\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(5 * 2rem - 0.3rem)}:host([data-level=\"5\"]) .mg-menu-item__collapse-container{z-index:calc(5 * 10)}:host([data-style-direction-vertical][data-level=\"6\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(6 * 2rem - 0.3rem)}:host([data-level=\"6\"]) .mg-menu-item__collapse-container{z-index:calc(6 * 10)}:host([data-style-direction-vertical][data-level=\"1\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(1 * 3rem - 0.3rem)}:host([data-level=\"1\"]) .mg-menu-item__collapse-container{z-index:calc(1 * 10)}:host([data-style-direction-vertical][data-level=\"2\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(2 * 3rem - 0.3rem)}:host([data-level=\"2\"]) .mg-menu-item__collapse-container{z-index:calc(2 * 10)}:host([data-style-direction-vertical][data-level=\"3\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(3 * 3rem - 0.3rem)}:host([data-level=\"3\"]) .mg-menu-item__collapse-container{z-index:calc(3 * 10)}:host([data-style-direction-vertical][data-level=\"4\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(4 * 3rem - 0.3rem)}:host([data-level=\"4\"]) .mg-menu-item__collapse-container{z-index:calc(4 * 10)}:host([data-style-direction-vertical][data-level=\"5\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(5 * 3rem - 0.3rem)}:host([data-level=\"5\"]) .mg-menu-item__collapse-container{z-index:calc(5 * 10)}:host([data-style-direction-vertical][data-level=\"6\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(6 * 3rem - 0.3rem)}:host([data-level=\"6\"]) .mg-menu-item__collapse-container{z-index:calc(6 * 10)}:host([data-style-direction-vertical][data-level=\"1\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(1 * 4rem - 0.3rem)}:host([data-level=\"1\"]) .mg-menu-item__collapse-container{z-index:calc(1 * 10)}:host([data-style-direction-vertical][data-level=\"2\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(2 * 4rem - 0.3rem)}:host([data-level=\"2\"]) .mg-menu-item__collapse-container{z-index:calc(2 * 10)}:host([data-style-direction-vertical][data-level=\"3\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(3 * 4rem - 0.3rem)}:host([data-level=\"3\"]) .mg-menu-item__collapse-container{z-index:calc(3 * 10)}:host([data-style-direction-vertical][data-level=\"4\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(4 * 4rem - 0.3rem)}:host([data-level=\"4\"]) .mg-menu-item__collapse-container{z-index:calc(4 * 10)}:host([data-style-direction-vertical][data-level=\"5\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(5 * 4rem - 0.3rem)}:host([data-level=\"5\"]) .mg-menu-item__collapse-container{z-index:calc(5 * 10)}:host([data-style-direction-vertical][data-level=\"6\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(6 * 4rem - 0.3rem)}:host([data-level=\"6\"]) .mg-menu-item__collapse-container{z-index:calc(6 * 10)}:host{position:relative;display:flex;--mg-popover-padding-vertical:0;--mg-popover-padding-horizontal:0}:host([data-style-direction-vertical]){flex-direction:column}:host([data-style-direction-vertical]) .mg-menu-item__navigation-button{width:100%}:host([data-style-direction-vertical]) .mg-menu-item__collapse-container{left:unset;top:unset;position:unset;width:unset}:host([data-style-direction-vertical]) .mg-menu-item-chevron{margin-left:auto}:host([data-style-direction-horizontal]) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level{background-color:hsl(var(--color-light))}:host([data-style-direction-horizontal]) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level ::slotted(mg-menu){padding:1rem 0}:host([data-overflow-more]){--mg-menu-item-navigation-button-column-gap:0}:host([data-overflow-more]) .mg-menu-item__navigation-button-chevron{display:none}:host([data-overflow-more]) .mg-menu-item__navigation-button-text-content ::slotted([slot=information]){margin-left:0}:host([data-overflow-more]) ::slotted(mg-menu){--mg-menu-item-navigation-button-column-gap:1rem}.mg-menu-item{max-width:var(--mg-menu-item-navigation-button-max-width)}.mg-menu-item__collapse-container{width:max-content;z-index:10}.mg-menu-item__navigation-button-center{min-width:0}.mg-menu-item__navigation-button-text-content{width:100%;display:flex;align-items:center}.mg-menu-item__navigation-button-text-content-notification,.mg-menu-item__navigation-button-text-content ::slotted([slot=information]){margin-left:1rem;font-size:var(--font-size)}.mg-menu-item__navigation-button-chevron{margin-left:auto;transition:200ms}.mg-menu-item__navigation-button-chevron--rotate.mg-menu-item__navigation-button-chevron{transform:rotate(180deg)}::slotted([slot=label]),::slotted([slot=metadata]){display:block;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}::slotted(*){display:flex;flex-direction:column}:host([status=disabled]){pointer-events:none}:host([hidden]){display:none}";
|
|
54
31
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const isMgMenuItem = (element) => element.nodeName === 'MG-MENU-ITEM';
|
|
62
|
-
var OverflowBehaviorElements;
|
|
63
|
-
(function (OverflowBehaviorElements) {
|
|
64
|
-
OverflowBehaviorElements["MORE"] = "data-overflow-more";
|
|
65
|
-
OverflowBehaviorElements["BASE_INDEX"] = "data-overflow-base-index";
|
|
66
|
-
OverflowBehaviorElements["PROXY_INDEX"] = "data-overflow-proxy-index";
|
|
67
|
-
})(OverflowBehaviorElements || (OverflowBehaviorElements = {}));
|
|
68
|
-
class OverflowBehavior {
|
|
69
|
-
constructor(element, render) {
|
|
70
|
-
this.element = element;
|
|
71
|
-
this.render = render;
|
|
72
|
-
/**********
|
|
73
|
-
* Public *
|
|
74
|
-
**********/
|
|
75
|
-
/**
|
|
76
|
-
* Disconnect ResizeObserver
|
|
77
|
-
*
|
|
78
|
-
* @returns {void}
|
|
79
|
-
*/
|
|
80
|
-
this.disconnect = () => {
|
|
81
|
-
this.resizeObserver.disconnect();
|
|
82
|
-
};
|
|
32
|
+
const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
33
|
+
constructor() {
|
|
34
|
+
super();
|
|
35
|
+
this.__registerHost();
|
|
36
|
+
this.__attachShadow();
|
|
37
|
+
this.statusChange = createEvent(this, "status-change", 7);
|
|
83
38
|
/************
|
|
84
39
|
* Internal *
|
|
85
40
|
************/
|
|
41
|
+
this.name = 'mg-menu-item';
|
|
42
|
+
this.navigationButton = `${this.name}__navigation-button`;
|
|
43
|
+
/***********
|
|
44
|
+
* Methods *
|
|
45
|
+
**********/
|
|
86
46
|
/**
|
|
87
|
-
*
|
|
47
|
+
* Toggle expanded prop value
|
|
88
48
|
*
|
|
89
|
-
* @param {number} width width of the container
|
|
90
49
|
* @returns {void}
|
|
91
50
|
*/
|
|
92
|
-
this.
|
|
93
|
-
|
|
94
|
-
// set moreElement
|
|
95
|
-
this.moreElement = this.render();
|
|
96
|
-
this.moreElement.setAttribute(OverflowBehaviorElements.MORE, '');
|
|
97
|
-
// set children
|
|
98
|
-
this.children = Array.from(this.element.children);
|
|
99
|
-
let moreElementChildren;
|
|
100
|
-
const allowedElements = ['MG-MENU-ITEM', 'MG-BUTTON'];
|
|
101
|
-
if (isMgMenuItem(this.moreElement)) {
|
|
102
|
-
moreElementChildren = Array.from(this.moreElement.querySelector('mg-menu').children).filter(element => allowedElements.includes(element.nodeName));
|
|
103
|
-
}
|
|
104
|
-
this.children.forEach((child, index) => {
|
|
105
|
-
child.setAttribute(OverflowBehaviorElements.BASE_INDEX, `${index}`);
|
|
106
|
-
if (child.getAttribute(OverflowBehaviorElements.MORE) === null) {
|
|
107
|
-
// set moreElement children
|
|
108
|
-
moreElementChildren[index].setAttribute(OverflowBehaviorElements.PROXY_INDEX, `${index}`);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
this.updateDisplayedItems(width);
|
|
51
|
+
this.toggleExpanded = () => {
|
|
52
|
+
this.expanded = !this.expanded;
|
|
113
53
|
};
|
|
114
54
|
/**
|
|
115
|
-
*
|
|
55
|
+
* Does an Element have given Status
|
|
116
56
|
*
|
|
117
|
-
* @param {
|
|
118
|
-
* @
|
|
57
|
+
* @param {HTMLMgMenuItemElement} mgMenuItemElement to parse
|
|
58
|
+
* @param {MgMenuItem['status']} status to check
|
|
59
|
+
* @returns {boolean} true if element with status is found
|
|
119
60
|
*/
|
|
120
|
-
this.
|
|
121
|
-
this.restoreItems();
|
|
122
|
-
const acc = { accWidth: 0, previousItem: null };
|
|
123
|
-
this.children.forEach((child) => {
|
|
124
|
-
acc.accWidth += child.offsetWidth;
|
|
125
|
-
const isPreviousItemHidden = acc.previousItem !== null && acc.previousItem.getAttribute('hidden') !== null;
|
|
126
|
-
// if previous item is hidden AND is NOT more element we hidde current
|
|
127
|
-
// OR if item has an overflow we hidde current
|
|
128
|
-
// OR if current item is more element AND have NOT previous hidden items, current more element item is an hidden item
|
|
129
|
-
// ELSE current is a display item
|
|
130
|
-
this.toggleItem(child, (isPreviousItemHidden && !this.isMoreElement(child)) || this.isOverflowElement(acc.accWidth, child, availableWidth) || (this.isMoreElement(child) && !isPreviousItemHidden));
|
|
131
|
-
// update previous item with current item
|
|
132
|
-
acc.previousItem = child;
|
|
133
|
-
});
|
|
134
|
-
};
|
|
61
|
+
this.hasStatus = (mgMenuItemElement, status) => mgMenuItemElement.status === status;
|
|
135
62
|
/**
|
|
136
|
-
*
|
|
63
|
+
* Is component contextual direction match the given direction
|
|
137
64
|
*
|
|
138
|
-
* @param {
|
|
139
|
-
* @param {
|
|
140
|
-
* @
|
|
141
|
-
* @returns {boolean} truthy if element is overflow
|
|
65
|
+
* @param {MgMenuItem['direction']} direction in parent menu
|
|
66
|
+
* @param {MgMenuItem['direction']} compareWith direction to compare with. Default: `this.direction`
|
|
67
|
+
* @returns {boolean} true is direction match the direction propertie
|
|
142
68
|
*/
|
|
143
|
-
this.
|
|
144
|
-
if (item.previousElementSibling === null || this.isMoreElement(item))
|
|
145
|
-
return false;
|
|
146
|
-
else if (!this.isMoreElement(item.nextElementSibling))
|
|
147
|
-
return cumulateWidth + this.moreElement.offsetWidth > availableWidth;
|
|
148
|
-
else
|
|
149
|
-
return cumulateWidth > availableWidth;
|
|
150
|
-
};
|
|
69
|
+
this.isDirection = (direction, compareWith = this.direction) => direction === compareWith;
|
|
151
70
|
/**
|
|
152
|
-
*
|
|
71
|
+
* Update displayNotificationBadge
|
|
72
|
+
* current component notification badge have priority over the slot badge when submenu contain badge
|
|
153
73
|
*
|
|
154
|
-
* @
|
|
155
|
-
* @returns {boolean} truthy if element is the 'MORE' element
|
|
74
|
+
* @returns {void} update displayNotificationBadge value
|
|
156
75
|
*/
|
|
157
|
-
this.
|
|
76
|
+
this.updateDisplayNotificationBadge = () => {
|
|
77
|
+
const childMenu = this.element.querySelector('mg-menu');
|
|
78
|
+
this.displayNotificationBadge =
|
|
79
|
+
childMenu !== null &&
|
|
80
|
+
Array.from(childMenu.children).some((subItem) => subItem.querySelector('mg-badge') !== null && subItem.getAttribute('hidden') === null);
|
|
81
|
+
};
|
|
158
82
|
/**
|
|
159
|
-
*
|
|
83
|
+
* Method to control if one of component children have active status
|
|
160
84
|
*
|
|
161
|
-
* @
|
|
162
|
-
* @param {boolean} isHidden is item hidden
|
|
163
|
-
* @returns {void}
|
|
85
|
+
* @returns {boolean} truthy if component has active child
|
|
164
86
|
*/
|
|
165
|
-
this.
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
this.toggleElement(this.moreElement, isHidden);
|
|
169
|
-
else if (mgActionMenuindex >= 0) {
|
|
170
|
-
this.toggleElement(item, isHidden);
|
|
171
|
-
this.toggleElement(this.moreElement.querySelector(`[${OverflowBehaviorElements.PROXY_INDEX}="${mgActionMenuindex}"]`), !isHidden);
|
|
172
|
-
}
|
|
87
|
+
this.hasActiveChild = () => {
|
|
88
|
+
var _a;
|
|
89
|
+
return Array.from(((_a = this.element.querySelector('mg-menu')) === null || _a === void 0 ? void 0 : _a.children) || []).some((element) => element.nodeName === 'MG-MENU-ITEM' && this.hasStatus(element, Status.ACTIVE) && element.getAttribute('hidden') === null);
|
|
173
90
|
};
|
|
174
91
|
/**
|
|
175
|
-
*
|
|
92
|
+
* Validate slots
|
|
176
93
|
*
|
|
177
|
-
* @param {
|
|
178
|
-
* @param {boolean} isHidden element is hidden
|
|
94
|
+
* @param {boolean} guard prevent action whith guard. Default: false.
|
|
179
95
|
* @returns {void}
|
|
180
96
|
*/
|
|
181
|
-
this.
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
97
|
+
this.validateSlot = (guard = false) => {
|
|
98
|
+
// slot title AND metadata validation
|
|
99
|
+
// add title on label AND metada slots due to text-overflow on these element
|
|
100
|
+
if (Array.from(this.element.children).find(child => child.getAttribute('slot') === 'label') === undefined)
|
|
101
|
+
throw new Error(`<${this.name}> slot "label" is required.`);
|
|
102
|
+
['label', 'metadata'].forEach(slot => {
|
|
103
|
+
Array.from(this.element.querySelectorAll(`[slot="${slot}"]`)).forEach(element => {
|
|
104
|
+
if (element.textContent.trim().length < 1)
|
|
105
|
+
throw new Error(`<${this.name}> slot "${slot}" must have text content.`);
|
|
106
|
+
if ((guard && element.getAttribute('title') === null) || !guard)
|
|
107
|
+
element.setAttribute('title', element.textContent);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
186
110
|
};
|
|
187
111
|
/**
|
|
188
|
-
*
|
|
112
|
+
* Update status
|
|
189
113
|
*
|
|
114
|
+
* @param {Status[]} guard status to exclude from process in addition to [Status.HIDDEN, Status.DISABLED] . Default: [].
|
|
190
115
|
* @returns {void}
|
|
191
116
|
*/
|
|
192
|
-
this.
|
|
193
|
-
|
|
117
|
+
this.updateStatus = (guard = []) => {
|
|
118
|
+
if (![Status.HIDDEN, Status.DISABLED, ...guard].includes(this.status)) {
|
|
119
|
+
this.status = this.hasActiveChild() ? Status.ACTIVE : Status.VISIBLE;
|
|
120
|
+
}
|
|
194
121
|
};
|
|
195
|
-
if (this.resizeObserver === undefined) {
|
|
196
|
-
// add resize observer
|
|
197
|
-
this.resizeObserver = new ResizeObserver(entries => {
|
|
198
|
-
entries.forEach(entry => {
|
|
199
|
-
this.run(entry.contentRect.width);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
this.resizeObserver.observe(this.element);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
const mgMenuItemCss = ".sr-only{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}*:focus:not(:focus-visible){outline:none}@media (prefers-reduced-motion){.mg-a11y-animation{animation:none !important;transition:none !important}}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding:1rem 2rem;height:calc(3.8rem)}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button,.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button ::slotted([slot=label]),.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button ::slotted([slot=metadata]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular ::slotted([slot=label]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular ::slotted([slot=metadata]){font-size:var(--font-size)}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular.mg-menu-item__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular.mg-menu-item__navigation-button--vertical{padding-left:calc(2rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding:1rem 3rem;height:calc(5.1rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button,.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button ::slotted([slot=label]),.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button ::slotted([slot=metadata]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium ::slotted([slot=label]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium ::slotted([slot=metadata]){font-size:calc(var(--font-size) + 0.2rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium.mg-menu-item__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium.mg-menu-item__navigation-button--vertical{padding-left:calc(3rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding:1rem 4rem;height:calc(7.1rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button,.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button ::slotted([slot=label]),.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button ::slotted([slot=metadata]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large ::slotted([slot=label]),.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large ::slotted([slot=metadata]){font-size:calc(var(--font-size) + 0.2rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large.mg-menu-item__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,.mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large.mg-menu-item__navigation-button--vertical{padding-left:calc(4rem - 0.3rem)}.mg-menu-item__navigation-button{display:flex;align-items:center;column-gap:var(--mg-menu-item-navigation-button-column-gap, 1rem);background-color:unset;border:none;font-family:var(--font-family);font-weight:400;color:hsl(var(--mg-menu-item-color-hsl, var(--color-dark)));line-height:var(--line-height);text-decoration:none;white-space:nowrap;box-sizing:border-box;cursor:pointer}.mg-menu-item__navigation-button:disabled,.mg-menu-item__navigation-button--disabled{cursor:default;opacity:var(--mg-disabled-opacity)}.mg-menu-item__navigation-button:focus-visible{z-index:10}.mg-menu-item__navigation-button:hover:not(.mg-menu-item__navigation-button--disabled),.mg-menu-item__navigation-button:focus-visible:not(.mg-menu-item__navigation-button--disabled){background-color:hsl(var(--mg-menu-item-focused-background-color-hsl), 0.1)}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active{color:hsl(var(--mg-menu-item-color-active-hsl));font-weight:600}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active.mg-menu-item__navigation-button--horizontal{border-bottom-color:hsl(var(--mg-menu-item-border-color-active-hsl))}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active.mg-menu-item__navigation-button--vertical{border-left-color:hsl(var(--mg-menu-item-border-color-active-hsl))}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--hidden{display:none}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal{border-bottom:0.3rem solid transparent}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical{border-left:0.3rem solid transparent}:host([data-style-direction-vertical][data-level=\"1\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(1 * 2rem - 0.3rem)}:host([data-level=\"1\"]) .mg-menu-item__collapse-container{z-index:calc(1 * 10)}:host([data-style-direction-vertical][data-level=\"2\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(2 * 2rem - 0.3rem)}:host([data-level=\"2\"]) .mg-menu-item__collapse-container{z-index:calc(2 * 10)}:host([data-style-direction-vertical][data-level=\"3\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(3 * 2rem - 0.3rem)}:host([data-level=\"3\"]) .mg-menu-item__collapse-container{z-index:calc(3 * 10)}:host([data-style-direction-vertical][data-level=\"4\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(4 * 2rem - 0.3rem)}:host([data-level=\"4\"]) .mg-menu-item__collapse-container{z-index:calc(4 * 10)}:host([data-style-direction-vertical][data-level=\"5\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(5 * 2rem - 0.3rem)}:host([data-level=\"5\"]) .mg-menu-item__collapse-container{z-index:calc(5 * 10)}:host([data-style-direction-vertical][data-level=\"6\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular{padding-left:calc(6 * 2rem - 0.3rem)}:host([data-level=\"6\"]) .mg-menu-item__collapse-container{z-index:calc(6 * 10)}:host([data-style-direction-vertical][data-level=\"1\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(1 * 3rem - 0.3rem)}:host([data-level=\"1\"]) .mg-menu-item__collapse-container{z-index:calc(1 * 10)}:host([data-style-direction-vertical][data-level=\"2\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(2 * 3rem - 0.3rem)}:host([data-level=\"2\"]) .mg-menu-item__collapse-container{z-index:calc(2 * 10)}:host([data-style-direction-vertical][data-level=\"3\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(3 * 3rem - 0.3rem)}:host([data-level=\"3\"]) .mg-menu-item__collapse-container{z-index:calc(3 * 10)}:host([data-style-direction-vertical][data-level=\"4\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(4 * 3rem - 0.3rem)}:host([data-level=\"4\"]) .mg-menu-item__collapse-container{z-index:calc(4 * 10)}:host([data-style-direction-vertical][data-level=\"5\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(5 * 3rem - 0.3rem)}:host([data-level=\"5\"]) .mg-menu-item__collapse-container{z-index:calc(5 * 10)}:host([data-style-direction-vertical][data-level=\"6\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium{padding-left:calc(6 * 3rem - 0.3rem)}:host([data-level=\"6\"]) .mg-menu-item__collapse-container{z-index:calc(6 * 10)}:host([data-style-direction-vertical][data-level=\"1\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(1 * 4rem - 0.3rem)}:host([data-level=\"1\"]) .mg-menu-item__collapse-container{z-index:calc(1 * 10)}:host([data-style-direction-vertical][data-level=\"2\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(2 * 4rem - 0.3rem)}:host([data-level=\"2\"]) .mg-menu-item__collapse-container{z-index:calc(2 * 10)}:host([data-style-direction-vertical][data-level=\"3\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(3 * 4rem - 0.3rem)}:host([data-level=\"3\"]) .mg-menu-item__collapse-container{z-index:calc(3 * 10)}:host([data-style-direction-vertical][data-level=\"4\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(4 * 4rem - 0.3rem)}:host([data-level=\"4\"]) .mg-menu-item__collapse-container{z-index:calc(4 * 10)}:host([data-style-direction-vertical][data-level=\"5\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(5 * 4rem - 0.3rem)}:host([data-level=\"5\"]) .mg-menu-item__collapse-container{z-index:calc(5 * 10)}:host([data-style-direction-vertical][data-level=\"6\"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large{padding-left:calc(6 * 4rem - 0.3rem)}:host([data-level=\"6\"]) .mg-menu-item__collapse-container{z-index:calc(6 * 10)}:host{position:relative;display:flex;--mg-popover-padding-vertical:0;--mg-popover-padding-horizontal:0}:host([data-style-direction-vertical]){flex-direction:column}:host([data-style-direction-vertical]) .mg-menu-item__navigation-button{width:100%}:host([data-style-direction-vertical]) .mg-menu-item__collapse-container{left:unset;top:unset;position:unset;width:unset}:host([data-style-direction-vertical]) .mg-menu-item-chevron{margin-left:auto}:host([data-style-direction-horizontal]) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level{background-color:hsl(var(--color-light))}:host([data-style-direction-horizontal]) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level ::slotted(mg-menu){padding:1rem 0}:host([data-overflow-more]){--mg-menu-item-navigation-button-column-gap:0}:host([data-overflow-more]) .mg-menu-item__navigation-button-chevron{display:none}:host([data-overflow-more]) .mg-menu-item__navigation-button-text-content ::slotted([slot=information]){margin-left:0}:host([data-overflow-more]) ::slotted(mg-menu){--mg-menu-item-navigation-button-column-gap:1rem}.mg-menu-item{max-width:var(--mg-menu-item-navigation-button-max-width)}.mg-menu-item__collapse-container{width:max-content;z-index:10}.mg-menu-item__navigation-button-center{min-width:0}.mg-menu-item__navigation-button-text-content{width:100%;display:flex;align-items:center}.mg-menu-item__navigation-button-text-content-notification,.mg-menu-item__navigation-button-text-content ::slotted([slot=information]){margin-left:1rem;font-size:var(--font-size)}.mg-menu-item__navigation-button-chevron{margin-left:auto;transition:200ms}.mg-menu-item__navigation-button-chevron--rotate.mg-menu-item__navigation-button-chevron{transform:rotate(180deg)}::slotted([slot=label]),::slotted([slot=metadata]){display:block;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}::slotted(*){display:flex;flex-direction:column}:host([status=disabled]){pointer-events:none}:host([hidden]){display:none}";
|
|
208
|
-
|
|
209
|
-
const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
210
|
-
constructor() {
|
|
211
|
-
super();
|
|
212
|
-
this.__registerHost();
|
|
213
|
-
this.__attachShadow();
|
|
214
|
-
this.statusChange = createEvent(this, "status-change", 7);
|
|
215
|
-
/************
|
|
216
|
-
* Internal *
|
|
217
|
-
************/
|
|
218
|
-
this.name = 'mg-menu-item';
|
|
219
|
-
this.navigationButton = `${this.name}__navigation-button`;
|
|
220
|
-
/***********
|
|
221
|
-
* Methods *
|
|
222
|
-
**********/
|
|
223
122
|
/**
|
|
224
|
-
*
|
|
123
|
+
* Init event-listeners
|
|
225
124
|
*
|
|
226
125
|
* @returns {void}
|
|
227
126
|
*/
|
|
228
|
-
this.
|
|
229
|
-
|
|
127
|
+
this.initListeners = () => {
|
|
128
|
+
var _a;
|
|
129
|
+
// manage first sub-level menu-items
|
|
130
|
+
Array.from(((_a = this.element.querySelector('mg-menu')) === null || _a === void 0 ? void 0 : _a.children) || []).forEach(item => {
|
|
131
|
+
if (item.nodeName === 'MG-MENU-ITEM') {
|
|
132
|
+
// manage child menu listener
|
|
133
|
+
item.addEventListener('status-change', () => {
|
|
134
|
+
this.updateStatus();
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
});
|
|
230
138
|
};
|
|
231
139
|
/**
|
|
232
|
-
*
|
|
140
|
+
* Get mg-popover identifier
|
|
233
141
|
*
|
|
234
|
-
* @
|
|
235
|
-
* @param {MgMenuItem['status']} status to check
|
|
236
|
-
* @returns {boolean} true if element with status is found
|
|
142
|
+
* @returns {MgPopover['identifier']} generated mg-popover identifier
|
|
237
143
|
*/
|
|
238
|
-
this.
|
|
144
|
+
this.getPopoverIdentifier = () => `${this.identifier}-popover`;
|
|
239
145
|
/**
|
|
240
|
-
*
|
|
146
|
+
* Condition to know if component should display a mg-popover
|
|
241
147
|
*
|
|
242
|
-
* @
|
|
243
|
-
* @returns {boolean} true is direction match the direction propertie
|
|
148
|
+
* @returns {boolean} truthy if component display popover
|
|
244
149
|
*/
|
|
245
|
-
this.
|
|
150
|
+
this.displayPopover = () => this.isDirection(Direction.HORIZONTAL) && this.hasChildren && this.href === undefined;
|
|
246
151
|
/************
|
|
247
152
|
* Handlers *
|
|
248
153
|
************/
|
|
@@ -270,35 +175,13 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
270
175
|
this.handlePopoverDisplay = (event) => {
|
|
271
176
|
this.expanded = event.detail;
|
|
272
177
|
};
|
|
273
|
-
/**
|
|
274
|
-
* Update displayNotificationBadge
|
|
275
|
-
* current component notification badge have priority over the slot badge when submenu contain badge
|
|
276
|
-
*
|
|
277
|
-
* @returns {void} update displayNotificationBadge value
|
|
278
|
-
*/
|
|
279
|
-
this.updateDisplayNotificationBadge = () => {
|
|
280
|
-
const childMenu = this.element.querySelector('mg-menu');
|
|
281
|
-
this.displayNotificationBadge =
|
|
282
|
-
childMenu !== null &&
|
|
283
|
-
Array.from(childMenu.children).some((subItem) => subItem.querySelector('mg-badge') !== null && subItem.getAttribute('hidden') === null);
|
|
284
|
-
};
|
|
285
|
-
/**
|
|
286
|
-
* Method to control if one of component children have active status
|
|
287
|
-
*
|
|
288
|
-
* @returns {boolean} truthy if component has active child
|
|
289
|
-
*/
|
|
290
|
-
this.hasActiveChild = () => {
|
|
291
|
-
var _a;
|
|
292
|
-
return Array.from(((_a = this.element.querySelector('mg-menu')) === null || _a === void 0 ? void 0 : _a.children) || [])
|
|
293
|
-
.filter(element => element.nodeName === 'MG-MENU-ITEM')
|
|
294
|
-
.some((element) => this.hasStatus(element, Status.ACTIVE) && element.getAttribute('hidden') === null);
|
|
295
|
-
};
|
|
296
178
|
/**
|
|
297
179
|
* Render slot
|
|
298
180
|
*
|
|
299
181
|
* @returns {HTMLElement} HTML Element
|
|
300
182
|
*/
|
|
301
183
|
this.renderSlot = () => h("slot", null);
|
|
184
|
+
this.identifier = createID('mg-menu-item');
|
|
302
185
|
this.href = undefined;
|
|
303
186
|
this.status = Status.VISIBLE;
|
|
304
187
|
this.expanded = false;
|
|
@@ -306,6 +189,7 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
306
189
|
this.navigationButtonClassList = new ClassList([this.navigationButton]);
|
|
307
190
|
this.direction = undefined;
|
|
308
191
|
this.isInMainMenu = undefined;
|
|
192
|
+
this.isItemMore = undefined;
|
|
309
193
|
this.hasChildren = false;
|
|
310
194
|
this.displayNotificationBadge = undefined;
|
|
311
195
|
}
|
|
@@ -342,11 +226,33 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
342
226
|
this.navigationButtonClassList.delete(`${this.navigationButton}--size-${oldValue}`);
|
|
343
227
|
this.navigationButtonClassList.add(`${this.navigationButton}--size-${newValue}`);
|
|
344
228
|
}
|
|
229
|
+
validateDirection(newValue) {
|
|
230
|
+
// manage menu items style depending to parent menu horientation
|
|
231
|
+
this.element.setAttribute(`data-style-direction-${newValue}`, '');
|
|
232
|
+
this.navigationButtonClassList.add(`${this.navigationButton}--${newValue}`);
|
|
233
|
+
// manage all sub levels child menu-items level with data-level attribut
|
|
234
|
+
if (this.isDirection(Direction.VERTICAL, newValue)) {
|
|
235
|
+
Array.from(this.element.querySelectorAll('mg-menu-item')).forEach(item => {
|
|
236
|
+
item.dataset.level = `${(Number(item.dataset.level) || 1) + 1}`;
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
345
240
|
validateHasChildren(newValue) {
|
|
346
241
|
if (newValue && this.element.href !== undefined) {
|
|
347
242
|
throw new Error(`<${this.name}> prop "href" is unauthorizied when element is a parent.`);
|
|
348
243
|
}
|
|
349
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* Render popover clickoutside guard for content slot
|
|
247
|
+
*
|
|
248
|
+
* @returns {void}
|
|
249
|
+
*/
|
|
250
|
+
updatePopoverGuard() {
|
|
251
|
+
if (this.displayPopover())
|
|
252
|
+
Array.from(this.element.children)
|
|
253
|
+
.filter((child) => child.getAttribute('slot') === null && child.nodeName !== 'MG-MENU' && Boolean(child.dataset))
|
|
254
|
+
.forEach((slot) => (slot.dataset.mgPopoverGuard = this.getPopoverIdentifier()));
|
|
255
|
+
}
|
|
350
256
|
/*************
|
|
351
257
|
* Lifecycle *
|
|
352
258
|
*************/
|
|
@@ -359,11 +265,13 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
359
265
|
// has children items that is NOT [slot='image' | 'information' | 'label' | 'metadata'] element
|
|
360
266
|
// we store only matching elements
|
|
361
267
|
this.hasChildren = Array.from(this.element.children).some(child => !['image', 'information', 'label', 'metadata'].includes(child.getAttribute('slot')));
|
|
268
|
+
this.badgeLabel = initLocales(this.element).messages.plusMenu.badgeLabel;
|
|
269
|
+
this.isItemMore = this.element.dataset.overflowMore !== undefined;
|
|
362
270
|
// Validate props
|
|
363
|
-
this.validateSize(this.size);
|
|
364
271
|
this.validateStatus(this.status);
|
|
365
272
|
this.validateExpanded(this.expanded);
|
|
366
|
-
|
|
273
|
+
// Validate states
|
|
274
|
+
this.validateSize(this.size);
|
|
367
275
|
}
|
|
368
276
|
/**
|
|
369
277
|
* Check if component slots configuration
|
|
@@ -371,63 +279,36 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
371
279
|
* @returns {ReturnType<typeof setTimeout>} timeout
|
|
372
280
|
*/
|
|
373
281
|
componentDidLoad() {
|
|
374
|
-
//
|
|
375
|
-
|
|
376
|
-
if (Array.from(this.element.children).find(child => child.getAttribute('slot') === 'label') === undefined)
|
|
377
|
-
throw new Error(`<${this.name}> slot "label" is required.`);
|
|
378
|
-
['label', 'metadata'].forEach(slot => {
|
|
379
|
-
Array.from(this.element.querySelectorAll(`[slot="${slot}"]`)).forEach(element => {
|
|
380
|
-
if (element.textContent.trim().length < 1)
|
|
381
|
-
throw new Error(`<${this.name}> slot "${slot}" must have text content.`);
|
|
382
|
-
if (element.getAttribute('title') === null)
|
|
383
|
-
element.setAttribute('title', element.textContent);
|
|
384
|
-
});
|
|
385
|
-
});
|
|
282
|
+
// validation
|
|
283
|
+
this.validateSlot(true);
|
|
386
284
|
// update props and states after componentDidLoad hook
|
|
387
285
|
// return a promise to process action only in the FIRST render().
|
|
388
286
|
// https://stenciljs.com/docs/component-lifecycle#componentwillload
|
|
389
287
|
return setTimeout(() => {
|
|
390
|
-
var _a;
|
|
391
288
|
// define menu-item context states
|
|
392
289
|
const menu = this.element.closest('mg-menu');
|
|
393
|
-
this.direction = this.
|
|
394
|
-
this.
|
|
395
|
-
|
|
290
|
+
this.direction = this.isItemMore || menu === null ? Direction.HORIZONTAL : menu.direction;
|
|
291
|
+
this.isInMainMenu = menu !== null && this.element.parentElement.closest('mg-menu-item') === null;
|
|
292
|
+
if ((menu === null || menu === void 0 ? void 0 : menu.size) !== undefined)
|
|
293
|
+
this.size = menu.size;
|
|
294
|
+
if (this.isItemMore)
|
|
295
|
+
this.size = this.element.dataset.size;
|
|
396
296
|
// when main menu item contain an active item it will get the active style
|
|
397
297
|
// AND if item is in vertical menu it will be expanded
|
|
398
|
-
if (this.hasActiveChild())
|
|
399
|
-
this.
|
|
400
|
-
|
|
401
|
-
this.expanded = this.isDirection(Direction.VERTICAL);
|
|
402
|
-
}
|
|
403
|
-
// manage menu items style depending to parent menu horientation
|
|
404
|
-
this.element.setAttribute(`data-style-direction-${this.direction}`, '');
|
|
405
|
-
this.navigationButtonClassList.add(`${this.navigationButton}--${this.direction}`);
|
|
298
|
+
if (this.hasActiveChild() && this.isInMainMenu)
|
|
299
|
+
this.expanded = this.isDirection(Direction.VERTICAL);
|
|
300
|
+
this.updateStatus([Status.ACTIVE]);
|
|
406
301
|
this.updateDisplayNotificationBadge();
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
if (![Status.HIDDEN, Status.DISABLED].includes(this.status)) {
|
|
418
|
-
this.status = this.hasActiveChild() ? Status.ACTIVE : Status.VISIBLE;
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
// manage child menu listener
|
|
422
|
-
item.addEventListener('status-change', () => {
|
|
423
|
-
updateStatus();
|
|
424
|
-
});
|
|
425
|
-
new MutationObserver(mutationsList => {
|
|
426
|
-
if (mutationsList.some(mutation => mutation.attributeName === 'hidden'))
|
|
427
|
-
updateStatus();
|
|
428
|
-
this.updateDisplayNotificationBadge();
|
|
429
|
-
}).observe(item, { attributes: true });
|
|
430
|
-
});
|
|
302
|
+
this.updatePopoverGuard();
|
|
303
|
+
// manage child dom changes with mutationObserver and listzners
|
|
304
|
+
this.initListeners();
|
|
305
|
+
new MutationObserver(mutationsList => {
|
|
306
|
+
if (mutationsList.some(mutation => mutation.attributeName === 'hidden'))
|
|
307
|
+
this.updateStatus();
|
|
308
|
+
if (mutationsList.some(mutation => mutation.type === 'characterData'))
|
|
309
|
+
this.validateSlot();
|
|
310
|
+
this.updateDisplayNotificationBadge();
|
|
311
|
+
}).observe(this.element, { attributes: true, childList: true, characterData: true, subtree: true });
|
|
431
312
|
}, 0);
|
|
432
313
|
}
|
|
433
314
|
/**
|
|
@@ -453,7 +334,7 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
453
334
|
[`${this.name}__collapse-container`]: true,
|
|
454
335
|
[`${this.name}__collapse-container--first-level`]: this.isInMainMenu && this.isDirection(Direction.HORIZONTAL),
|
|
455
336
|
});
|
|
456
|
-
return (h(Host, { role:
|
|
337
|
+
return (h(Host, { role: !this.isItemMore && 'menuitem', "aria-haspopup": !this.isItemMore && this.hasChildren.toString() }, this.displayPopover() ? (h("mg-popover", { display: this.expanded, placement: "bottom-start", arrowHide: true, "onDisplay-change": this.handlePopoverDisplay, identifier: this.getPopoverIdentifier() }, this.renderInteractiveElement(), h("div", { class: getContainerClasses(), slot: "content" }, this.renderSlot()))) : ([
|
|
457
338
|
this.renderInteractiveElement(),
|
|
458
339
|
h("div", { key: "vertical-container", class: getContainerClasses(), hidden: !this.expanded }, this.renderSlot()),
|
|
459
340
|
])));
|
|
@@ -463,10 +344,12 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
463
344
|
"status": ["validateStatus"],
|
|
464
345
|
"expanded": ["validateExpanded"],
|
|
465
346
|
"size": ["validateSize"],
|
|
347
|
+
"direction": ["validateDirection"],
|
|
466
348
|
"hasChildren": ["validateHasChildren"]
|
|
467
349
|
}; }
|
|
468
350
|
static get style() { return mgMenuItemCss; }
|
|
469
351
|
}, [1, "mg-menu-item", {
|
|
352
|
+
"identifier": [1],
|
|
470
353
|
"href": [1],
|
|
471
354
|
"status": [1537],
|
|
472
355
|
"expanded": [1028],
|
|
@@ -474,6 +357,7 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
|
474
357
|
"navigationButtonClassList": [32],
|
|
475
358
|
"direction": [32],
|
|
476
359
|
"isInMainMenu": [32],
|
|
360
|
+
"isItemMore": [32],
|
|
477
361
|
"hasChildren": [32],
|
|
478
362
|
"displayNotificationBadge": [32]
|
|
479
363
|
}]);
|
|
@@ -517,4 +401,4 @@ function defineCustomElement() {
|
|
|
517
401
|
}
|
|
518
402
|
defineCustomElement();
|
|
519
403
|
|
|
520
|
-
export {
|
|
404
|
+
export { MgMenuItem as M, Status as S, defineCustomElement as d };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Menu direction type
|
|
3
|
+
*/
|
|
4
|
+
var Direction;
|
|
5
|
+
(function (Direction) {
|
|
6
|
+
Direction["VERTICAL"] = "vertical";
|
|
7
|
+
Direction["HORIZONTAL"] = "horizontal";
|
|
8
|
+
})(Direction || (Direction = {}));
|
|
9
|
+
/**
|
|
10
|
+
* List of all possibles sizes
|
|
11
|
+
*/
|
|
12
|
+
const sizes = ['regular', 'medium', 'large'];
|
|
13
|
+
|
|
14
|
+
export { Direction as D, sizes as s };
|