@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.
Files changed (53) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/mg-action-more_31.cjs.entry.js +216 -565
  3. package/dist/cjs/mg-components.cjs.js +1 -1
  4. package/dist/cjs/mg-item-more.cjs.entry.js +273 -0
  5. package/dist/cjs/mg-menu.conf-9afe6571.js +242 -0
  6. package/dist/collection/collection-manifest.json +2 -1
  7. package/dist/collection/components/atoms/mg-button/mg-button.js +24 -0
  8. package/dist/collection/components/atoms/mg-icon/mg-icon.conf.js +8 -0
  9. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +6 -2
  10. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.conf.js +0 -13
  11. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js +39 -67
  12. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.css +3 -3
  13. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js +156 -77
  14. package/dist/collection/components/molecules/mg-item-more/mg-item-more.conf.js +1 -0
  15. package/dist/collection/components/molecules/mg-item-more/mg-item-more.css +30 -0
  16. package/dist/collection/components/molecules/mg-item-more/mg-item-more.js +200 -0
  17. package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +0 -2
  18. package/dist/collection/styles/navigation-button.scss +1 -1
  19. package/dist/collection/utils/behaviors.utils.js +33 -29
  20. package/dist/components/index.d.ts +1 -0
  21. package/dist/components/index.js +1 -0
  22. package/dist/components/mg-action-more.js +2 -1
  23. package/dist/components/mg-button2.js +4 -1
  24. package/dist/components/mg-icon2.js +8 -0
  25. package/dist/components/mg-item-more.d.ts +11 -0
  26. package/dist/components/mg-item-more.js +336 -0
  27. package/dist/components/mg-menu-item2.js +134 -250
  28. package/dist/components/mg-menu.conf.js +14 -0
  29. package/dist/components/mg-menu2.js +35 -102
  30. package/dist/components/mg-tabs.js +1 -1
  31. package/dist/components/mg-tooltip2.js +6 -2
  32. package/dist/esm/loader.js +1 -1
  33. package/dist/esm/mg-action-more_31.entry.js +185 -534
  34. package/dist/esm/mg-components.js +1 -1
  35. package/dist/esm/mg-item-more.entry.js +269 -0
  36. package/dist/esm/mg-menu.conf-881fbd82.js +235 -0
  37. package/dist/mg-components/mg-components.css +1 -1
  38. package/dist/mg-components/mg-components.esm.js +1 -1
  39. package/dist/mg-components/p-1221773c.entry.js +1 -0
  40. package/dist/mg-components/p-367f92d2.js +1 -0
  41. package/dist/mg-components/p-6aeded97.entry.js +1 -0
  42. package/dist/mg-components/styles/navigation-button.scss +1 -1
  43. package/dist/types/components/atoms/mg-button/mg-button.d.ts +5 -0
  44. package/dist/types/components/molecules/menu/mg-menu/mg-menu.conf.d.ts +3 -27
  45. package/dist/types/components/molecules/menu/mg-menu/mg-menu.d.ts +9 -27
  46. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.conf.d.ts +5 -0
  47. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.d.ts +65 -16
  48. package/dist/types/components/molecules/mg-item-more/mg-item-more.conf.d.ts +26 -0
  49. package/dist/types/components/molecules/mg-item-more/mg-item-more.d.ts +74 -0
  50. package/dist/types/components.d.ts +66 -12
  51. package/dist/types/utils/behaviors.utils.d.ts +12 -5
  52. package/package.json +1 -1
  53. 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
- * MgMenuItem type guard
57
- *
58
- * @param {HTMLElement} element element to control type
59
- * @returns {boolean} truthy if element is mg-menu-item
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
- * run overflow behavior
47
+ * Toggle expanded prop value
88
48
  *
89
- * @param {number} width width of the container
90
49
  * @returns {void}
91
50
  */
92
- this.run = (width) => {
93
- if (this.moreElement === undefined) {
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
- * Update displayed items in container from a given available space
55
+ * Does an Element have given Status
116
56
  *
117
- * @param {number} availableWidth available width in container to display child items
118
- * @returns {void}
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.updateDisplayedItems = (availableWidth) => {
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
- * Utility method to know if item overflow partialy or totaly in the container
63
+ * Is component contextual direction match the given direction
137
64
  *
138
- * @param {number} cumulateWidth previous sibling elements cumulate width + item width
139
- * @param {HTMLElement} item item HTML element
140
- * @param {number} availableWidth container available width
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.isOverflowElement = (cumulateWidth, item, availableWidth) => {
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
- * Utility method to know if a given element is the 'MORE' element
71
+ * Update displayNotificationBadge
72
+ * current component notification badge have priority over the slot badge when submenu contain badge
153
73
  *
154
- * @param {Element} element element to match with 'MORE' element
155
- * @returns {boolean} truthy if element is the 'MORE' element
74
+ * @returns {void} update displayNotificationBadge value
156
75
  */
157
- this.isMoreElement = (element) => element.getAttribute(OverflowBehaviorElements.MORE) !== null;
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
- * Toggle display item element
83
+ * Method to control if one of component children have active status
160
84
  *
161
- * @param {HTMLElement} item item to control
162
- * @param {boolean} isHidden is item hidden
163
- * @returns {void}
85
+ * @returns {boolean} truthy if component has active child
164
86
  */
165
- this.toggleItem = (item, isHidden) => {
166
- const mgActionMenuindex = Number(item.getAttribute(OverflowBehaviorElements.BASE_INDEX));
167
- if (this.isMoreElement(item))
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
- * Toggle element's hidde attribute
92
+ * Validate slots
176
93
  *
177
- * @param {Element} element element to toggle
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.toggleElement = (element, isHidden) => {
182
- if (isHidden)
183
- element.setAttribute('hidden', '');
184
- else
185
- element.removeAttribute('hidden');
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
- * Remove hidden attributes on all items
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.restoreItems = () => {
193
- this.children.forEach(item => item.removeAttribute('hidden'));
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
- * Toggle expanded prop value
123
+ * Init event-listeners
225
124
  *
226
125
  * @returns {void}
227
126
  */
228
- this.toggleExpanded = () => {
229
- this.expanded = !this.expanded;
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
- * Does an Element have given Status
140
+ * Get mg-popover identifier
233
141
  *
234
- * @param {HTMLMgMenuItemElement} mgMenuItemElement to parse
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.hasStatus = (mgMenuItemElement, status) => mgMenuItemElement.status === status;
144
+ this.getPopoverIdentifier = () => `${this.identifier}-popover`;
239
145
  /**
240
- * Is component contextual direction match the given direction
146
+ * Condition to know if component should display a mg-popover
241
147
  *
242
- * @param {MgMenuItem['direction']} direction in parent menu
243
- * @returns {boolean} true is direction match the direction propertie
148
+ * @returns {boolean} truthy if component display popover
244
149
  */
245
- this.isDirection = (direction) => this.direction === direction;
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
- this.badgeLabel = initLocales(this.element).messages.plusMenu.badgeLabel;
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
- // slot title AND metadata validation
375
- // add title on label AND metada slots due to text-overflow on these element
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.element.getAttribute(OverflowBehaviorElements.MORE) !== null || menu === null ? Direction.HORIZONTAL : menu.direction;
394
- this.size = menu === null || menu === void 0 ? void 0 : menu.size;
395
- this.isInMainMenu = this.element.parentElement.closest('mg-menu-item') === null;
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.status = Status.ACTIVE;
400
- if (this.isInMainMenu)
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
- // manage all sub levels child menu-items level with data-level attribut
408
- if (this.isDirection(Direction.VERTICAL)) {
409
- Array.from(this.element.querySelectorAll('mg-menu-item')).forEach(item => {
410
- item.dataset.level = `${(Number(item.dataset.level) || 1) + 1}`;
411
- });
412
- }
413
- // manage first sub-level menu-items
414
- const childItems = Array.from(((_a = this.element.querySelector('mg-menu')) === null || _a === void 0 ? void 0 : _a.children) || []).filter(item => item.nodeName === 'MG-MENU-ITEM');
415
- childItems.forEach(item => {
416
- const updateStatus = () => {
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: "menuitem", "aria-haspopup": this.hasChildren.toString() }, this.isDirection(Direction.HORIZONTAL) && this.hasChildren && this.href === undefined ? (h("mg-popover", { display: this.expanded, placement: "bottom-start", arrowHide: true, "onDisplay-change": this.handlePopoverDisplay }, this.renderInteractiveElement(), h("div", { class: getContainerClasses(), slot: "content" }, this.renderSlot()))) : ([
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 { Direction as D, MgMenuItem as M, OverflowBehaviorElements as O, Status as S, OverflowBehavior as a, defineCustomElement as d, isMoreItem as i, sizes as s };
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 };