@mgdis/mg-components 5.7.0 → 5.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/mg-action-more_31.cjs.entry.js +351 -600
  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/inputs/mg-input-checkbox/mg-input-checkbox.js +14 -10
  11. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +91 -21
  12. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.conf.js +0 -13
  13. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js +80 -76
  14. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.css +7 -5
  15. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js +174 -78
  16. package/dist/collection/components/molecules/mg-form/mg-form.js +1 -1
  17. package/dist/collection/components/molecules/mg-item-more/mg-item-more.conf.js +1 -0
  18. package/dist/collection/components/molecules/mg-item-more/mg-item-more.css +30 -0
  19. package/dist/collection/components/molecules/mg-item-more/mg-item-more.js +200 -0
  20. package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +0 -2
  21. package/dist/collection/styles/navigation-button.scss +1 -1
  22. package/dist/collection/utils/behaviors.utils.js +33 -29
  23. package/dist/collection/utils/components.utils.js +2 -4
  24. package/dist/collection/utils/unit.test.utils.js +25 -0
  25. package/dist/components/components.utils.js +2 -4
  26. package/dist/components/index.d.ts +1 -0
  27. package/dist/components/index.js +1 -0
  28. package/dist/components/mg-action-more.js +2 -1
  29. package/dist/components/mg-button2.js +4 -1
  30. package/dist/components/mg-form.js +1 -1
  31. package/dist/components/mg-icon2.js +8 -0
  32. package/dist/components/mg-input-checkbox.js +5 -4
  33. package/dist/components/mg-input-select2.js +83 -17
  34. package/dist/components/mg-item-more.d.ts +11 -0
  35. package/dist/components/mg-item-more.js +336 -0
  36. package/dist/components/mg-menu-item2.js +138 -251
  37. package/dist/components/mg-menu.conf.js +14 -0
  38. package/dist/components/mg-menu2.js +76 -111
  39. package/dist/components/mg-tabs.js +1 -1
  40. package/dist/components/mg-tooltip2.js +6 -2
  41. package/dist/esm/loader.js +1 -1
  42. package/dist/esm/mg-action-more_31.entry.js +321 -570
  43. package/dist/esm/mg-components.js +1 -1
  44. package/dist/esm/mg-item-more.entry.js +269 -0
  45. package/dist/esm/mg-menu.conf-881fbd82.js +235 -0
  46. package/dist/mg-components/mg-components.css +1 -1
  47. package/dist/mg-components/mg-components.esm.js +1 -1
  48. package/dist/mg-components/p-1221773c.entry.js +1 -0
  49. package/dist/mg-components/p-30bc87db.entry.js +1 -0
  50. package/dist/mg-components/p-367f92d2.js +1 -0
  51. package/dist/mg-components/styles/navigation-button.scss +1 -1
  52. package/dist/types/components/atoms/mg-button/mg-button.d.ts +5 -0
  53. package/dist/types/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.d.ts +3 -3
  54. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.d.ts +39 -4
  55. package/dist/types/components/molecules/menu/mg-menu/mg-menu.conf.d.ts +3 -27
  56. package/dist/types/components/molecules/menu/mg-menu/mg-menu.d.ts +38 -30
  57. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.conf.d.ts +5 -0
  58. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.d.ts +69 -16
  59. package/dist/types/components/molecules/mg-item-more/mg-item-more.conf.d.ts +26 -0
  60. package/dist/types/components/molecules/mg-item-more/mg-item-more.d.ts +74 -0
  61. package/dist/types/components.d.ts +75 -17
  62. package/dist/types/utils/behaviors.utils.d.ts +12 -5
  63. package/dist/types/utils/components.utils.d.ts +2 -2
  64. package/dist/types/utils/unit.test.utils.d.ts +11 -0
  65. package/package.json +1 -1
  66. 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,128 @@ 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,:host([data-overflow-more]) .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),:host([data-overflow-more]) .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);
38
+ this.itemLoaded = createEvent(this, "item-loaded", 7);
83
39
  /************
84
40
  * Internal *
85
41
  ************/
42
+ this.name = 'mg-menu-item';
43
+ this.navigationButton = `${this.name}__navigation-button`;
44
+ /***********
45
+ * Methods *
46
+ **********/
86
47
  /**
87
- * run overflow behavior
48
+ * Toggle expanded prop value
88
49
  *
89
- * @param {number} width width of the container
90
50
  * @returns {void}
91
51
  */
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);
52
+ this.toggleExpanded = () => {
53
+ this.expanded = !this.expanded;
113
54
  };
114
55
  /**
115
- * Update displayed items in container from a given available space
56
+ * Does an Element have given Status
116
57
  *
117
- * @param {number} availableWidth available width in container to display child items
118
- * @returns {void}
58
+ * @param {HTMLMgMenuItemElement} mgMenuItemElement to parse
59
+ * @param {MgMenuItem['status']} status to check
60
+ * @returns {boolean} true if element with status is found
119
61
  */
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
- };
62
+ this.hasStatus = (mgMenuItemElement, status) => mgMenuItemElement.status === status;
135
63
  /**
136
- * Utility method to know if item overflow partialy or totaly in the container
64
+ * Is component contextual direction match the given direction
137
65
  *
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
66
+ * @param {MgMenuItem['direction']} direction in parent menu
67
+ * @param {MgMenuItem['direction']} compareWith direction to compare with. Default: `this.direction`
68
+ * @returns {boolean} true is direction match the direction propertie
142
69
  */
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
- };
70
+ this.isDirection = (direction, compareWith = this.direction) => direction === compareWith;
151
71
  /**
152
- * Utility method to know if a given element is the 'MORE' element
72
+ * Update displayNotificationBadge
73
+ * current component notification badge have priority over the slot badge when submenu contain badge
153
74
  *
154
- * @param {Element} element element to match with 'MORE' element
155
- * @returns {boolean} truthy if element is the 'MORE' element
75
+ * @returns {void} update displayNotificationBadge value
156
76
  */
157
- this.isMoreElement = (element) => element.getAttribute(OverflowBehaviorElements.MORE) !== null;
77
+ this.updateDisplayNotificationBadge = () => {
78
+ const childMenu = this.element.querySelector('mg-menu');
79
+ this.displayNotificationBadge =
80
+ childMenu !== null &&
81
+ Array.from(childMenu.children).some((subItem) => subItem.querySelector('mg-badge') !== null && subItem.getAttribute('hidden') === null);
82
+ };
158
83
  /**
159
- * Toggle display item element
84
+ * Method to control if one of component children have active status
160
85
  *
161
- * @param {HTMLElement} item item to control
162
- * @param {boolean} isHidden is item hidden
163
- * @returns {void}
86
+ * @returns {boolean} truthy if component has active child
164
87
  */
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
- }
88
+ this.hasActiveChild = () => {
89
+ var _a;
90
+ 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
91
  };
174
92
  /**
175
- * Toggle element's hidde attribute
93
+ * Validate slots
176
94
  *
177
- * @param {Element} element element to toggle
178
- * @param {boolean} isHidden element is hidden
95
+ * @param {boolean} guard prevent action whith guard. Default: false.
179
96
  * @returns {void}
180
97
  */
181
- this.toggleElement = (element, isHidden) => {
182
- if (isHidden)
183
- element.setAttribute('hidden', '');
184
- else
185
- element.removeAttribute('hidden');
98
+ this.validateSlot = (guard = false) => {
99
+ // slot title AND metadata validation
100
+ // add title on label AND metada slots due to text-overflow on these element
101
+ if (Array.from(this.element.children).find(child => child.getAttribute('slot') === 'label') === undefined)
102
+ throw new Error(`<${this.name}> slot "label" is required.`);
103
+ ['label', 'metadata'].forEach(slot => {
104
+ Array.from(this.element.querySelectorAll(`[slot="${slot}"]`)).forEach(element => {
105
+ if (element.textContent.trim().length < 1)
106
+ throw new Error(`<${this.name}> slot "${slot}" must have text content.`);
107
+ if ((guard && element.getAttribute('title') === null) || !guard)
108
+ element.setAttribute('title', element.textContent);
109
+ });
110
+ });
186
111
  };
187
112
  /**
188
- * Remove hidden attributes on all items
113
+ * Update status
189
114
  *
115
+ * @param {Status[]} guard status to exclude from process in addition to [Status.HIDDEN, Status.DISABLED] . Default: [].
190
116
  * @returns {void}
191
117
  */
192
- this.restoreItems = () => {
193
- this.children.forEach(item => item.removeAttribute('hidden'));
118
+ this.updateStatus = (guard = []) => {
119
+ if (![Status.HIDDEN, Status.DISABLED, ...guard].includes(this.status)) {
120
+ this.status = this.hasActiveChild() ? Status.ACTIVE : Status.VISIBLE;
121
+ }
194
122
  };
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
123
  /**
224
- * Toggle expanded prop value
124
+ * Init event-listeners
225
125
  *
226
126
  * @returns {void}
227
127
  */
228
- this.toggleExpanded = () => {
229
- this.expanded = !this.expanded;
128
+ this.initListeners = () => {
129
+ var _a;
130
+ // manage first sub-level menu-items
131
+ Array.from(((_a = this.element.querySelector('mg-menu')) === null || _a === void 0 ? void 0 : _a.children) || []).forEach(item => {
132
+ if (item.nodeName === 'MG-MENU-ITEM') {
133
+ // manage child menu listener
134
+ item.addEventListener('status-change', () => {
135
+ this.updateStatus();
136
+ });
137
+ }
138
+ });
230
139
  };
231
140
  /**
232
- * Does an Element have given Status
141
+ * Get mg-popover identifier
233
142
  *
234
- * @param {HTMLMgMenuItemElement} mgMenuItemElement to parse
235
- * @param {MgMenuItem['status']} status to check
236
- * @returns {boolean} true if element with status is found
143
+ * @returns {MgPopover['identifier']} generated mg-popover identifier
237
144
  */
238
- this.hasStatus = (mgMenuItemElement, status) => mgMenuItemElement.status === status;
145
+ this.getPopoverIdentifier = () => `${this.identifier}-popover`;
239
146
  /**
240
- * Is component contextual direction match the given direction
147
+ * Condition to know if component should display a mg-popover
241
148
  *
242
- * @param {MgMenuItem['direction']} direction in parent menu
243
- * @returns {boolean} true is direction match the direction propertie
149
+ * @returns {boolean} truthy if component display popover
244
150
  */
245
- this.isDirection = (direction) => this.direction === direction;
151
+ this.displayPopover = () => this.isDirection(Direction.HORIZONTAL) && this.hasChildren && this.href === undefined;
246
152
  /************
247
153
  * Handlers *
248
154
  ************/
@@ -270,35 +176,13 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
270
176
  this.handlePopoverDisplay = (event) => {
271
177
  this.expanded = event.detail;
272
178
  };
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
179
  /**
297
180
  * Render slot
298
181
  *
299
182
  * @returns {HTMLElement} HTML Element
300
183
  */
301
184
  this.renderSlot = () => h("slot", null);
185
+ this.identifier = createID('mg-menu-item');
302
186
  this.href = undefined;
303
187
  this.status = Status.VISIBLE;
304
188
  this.expanded = false;
@@ -306,6 +190,7 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
306
190
  this.navigationButtonClassList = new ClassList([this.navigationButton]);
307
191
  this.direction = undefined;
308
192
  this.isInMainMenu = undefined;
193
+ this.isItemMore = undefined;
309
194
  this.hasChildren = false;
310
195
  this.displayNotificationBadge = undefined;
311
196
  }
@@ -342,11 +227,33 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
342
227
  this.navigationButtonClassList.delete(`${this.navigationButton}--size-${oldValue}`);
343
228
  this.navigationButtonClassList.add(`${this.navigationButton}--size-${newValue}`);
344
229
  }
230
+ validateDirection(newValue) {
231
+ // manage menu items style depending to parent menu horientation
232
+ this.element.setAttribute(`data-style-direction-${newValue}`, '');
233
+ this.navigationButtonClassList.add(`${this.navigationButton}--${newValue}`);
234
+ // manage all sub levels child menu-items level with data-level attribut
235
+ if (this.isDirection(Direction.VERTICAL, newValue)) {
236
+ Array.from(this.element.querySelectorAll('mg-menu-item')).forEach(item => {
237
+ item.dataset.level = `${(Number(item.dataset.level) || 1) + 1}`;
238
+ });
239
+ }
240
+ }
345
241
  validateHasChildren(newValue) {
346
242
  if (newValue && this.element.href !== undefined) {
347
243
  throw new Error(`<${this.name}> prop "href" is unauthorizied when element is a parent.`);
348
244
  }
349
245
  }
246
+ /**
247
+ * Render popover clickoutside guard for content slot
248
+ *
249
+ * @returns {void}
250
+ */
251
+ updatePopoverGuard() {
252
+ if (this.displayPopover())
253
+ Array.from(this.element.children)
254
+ .filter((child) => child.getAttribute('slot') === null && child.nodeName !== 'MG-MENU' && Boolean(child.dataset))
255
+ .forEach((slot) => (slot.dataset.mgPopoverGuard = this.getPopoverIdentifier()));
256
+ }
350
257
  /*************
351
258
  * Lifecycle *
352
259
  *************/
@@ -359,11 +266,13 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
359
266
  // has children items that is NOT [slot='image' | 'information' | 'label' | 'metadata'] element
360
267
  // we store only matching elements
361
268
  this.hasChildren = Array.from(this.element.children).some(child => !['image', 'information', 'label', 'metadata'].includes(child.getAttribute('slot')));
269
+ this.badgeLabel = initLocales(this.element).messages.plusMenu.badgeLabel;
270
+ this.isItemMore = this.element.dataset.overflowMore !== undefined;
362
271
  // Validate props
363
- this.validateSize(this.size);
364
272
  this.validateStatus(this.status);
365
273
  this.validateExpanded(this.expanded);
366
- this.badgeLabel = initLocales(this.element).messages.plusMenu.badgeLabel;
274
+ // Validate states
275
+ this.validateSize(this.size);
367
276
  }
368
277
  /**
369
278
  * Check if component slots configuration
@@ -371,63 +280,38 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
371
280
  * @returns {ReturnType<typeof setTimeout>} timeout
372
281
  */
373
282
  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
- });
283
+ // validation
284
+ this.validateSlot(true);
386
285
  // update props and states after componentDidLoad hook
387
286
  // return a promise to process action only in the FIRST render().
388
287
  // https://stenciljs.com/docs/component-lifecycle#componentwillload
389
288
  return setTimeout(() => {
390
- var _a;
391
289
  // define menu-item context states
392
290
  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;
291
+ this.direction = this.isItemMore || menu === null ? Direction.HORIZONTAL : menu.direction;
292
+ this.isInMainMenu = menu !== null && this.element.parentElement.closest('mg-menu-item') === null;
293
+ if ((menu === null || menu === void 0 ? void 0 : menu.size) !== undefined)
294
+ this.size = menu.size;
295
+ if (this.isItemMore)
296
+ this.size = this.element.dataset.size;
396
297
  // when main menu item contain an active item it will get the active style
397
298
  // 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}`);
299
+ if (this.hasActiveChild() && this.isInMainMenu)
300
+ this.expanded = this.isDirection(Direction.VERTICAL);
301
+ this.updateStatus([Status.ACTIVE]);
406
302
  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
- });
303
+ this.updatePopoverGuard();
304
+ // manage child dom changes with mutationObserver and listzners
305
+ this.initListeners();
306
+ // emit loaded event when component is fully loaded
307
+ this.itemLoaded.emit();
308
+ new MutationObserver(mutationsList => {
309
+ if (mutationsList.some(mutation => mutation.attributeName === 'hidden'))
310
+ this.updateStatus();
311
+ if (mutationsList.some(mutation => mutation.type === 'characterData'))
312
+ this.validateSlot();
313
+ this.updateDisplayNotificationBadge();
314
+ }).observe(this.element, { attributes: true, childList: true, characterData: true, subtree: true });
431
315
  }, 0);
432
316
  }
433
317
  /**
@@ -451,9 +335,9 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
451
335
  render() {
452
336
  const getContainerClasses = () => ({
453
337
  [`${this.name}__collapse-container`]: true,
454
- [`${this.name}__collapse-container--first-level`]: this.isInMainMenu && this.isDirection(Direction.HORIZONTAL),
338
+ [`${this.name}__collapse-container--first-level`]: (this.isInMainMenu || this.isItemMore) && this.isDirection(Direction.HORIZONTAL),
455
339
  });
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()))) : ([
340
+ 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
341
  this.renderInteractiveElement(),
458
342
  h("div", { key: "vertical-container", class: getContainerClasses(), hidden: !this.expanded }, this.renderSlot()),
459
343
  ])));
@@ -463,10 +347,12 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
463
347
  "status": ["validateStatus"],
464
348
  "expanded": ["validateExpanded"],
465
349
  "size": ["validateSize"],
350
+ "direction": ["validateDirection"],
466
351
  "hasChildren": ["validateHasChildren"]
467
352
  }; }
468
353
  static get style() { return mgMenuItemCss; }
469
354
  }, [1, "mg-menu-item", {
355
+ "identifier": [1],
470
356
  "href": [1],
471
357
  "status": [1537],
472
358
  "expanded": [1028],
@@ -474,6 +360,7 @@ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
474
360
  "navigationButtonClassList": [32],
475
361
  "direction": [32],
476
362
  "isInMainMenu": [32],
363
+ "isItemMore": [32],
477
364
  "hasChildren": [32],
478
365
  "displayNotificationBadge": [32]
479
366
  }]);
@@ -517,4 +404,4 @@ function defineCustomElement() {
517
404
  }
518
405
  defineCustomElement();
519
406
 
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 };
407
+ 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 };