@mgdis/mg-components 5.5.0 → 5.6.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 (142) hide show
  1. package/dist/cjs/{index-c3450336.js → index-4dcc1812.js} +11 -1
  2. package/dist/cjs/loader.cjs.js +3 -3
  3. package/dist/cjs/mg-badge_30.cjs.entry.js +742 -244
  4. package/dist/cjs/mg-components.cjs.js +3 -3
  5. package/dist/collection/collection-manifest.json +4 -4
  6. package/dist/collection/components/atoms/mg-badge/mg-badge.conf.js +1 -1
  7. package/dist/collection/components/atoms/mg-badge/mg-badge.css +13 -0
  8. package/dist/collection/components/atoms/mg-badge/mg-badge.js +3 -3
  9. package/dist/collection/components/atoms/mg-button/mg-button.css +2 -1
  10. package/dist/collection/components/atoms/mg-card/mg-card.css +13 -6
  11. package/dist/collection/components/atoms/mg-icon/mg-icon.conf.js +13 -3
  12. package/dist/collection/components/atoms/mg-tag/mg-tag.css +6 -6
  13. package/dist/collection/components/atoms/mg-tag/mg-tag.js +3 -3
  14. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.css +2 -0
  15. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +3 -3
  16. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.css +3 -3
  17. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js +4 -1
  18. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.css +3 -3
  19. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.css +3 -3
  20. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.css +3 -3
  21. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +7 -3
  22. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.css +3 -3
  23. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.css +3 -3
  24. package/dist/collection/components/molecules/menu/mg-menu/doc/mg-menu.stories.js +43 -11
  25. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.conf.js +17 -0
  26. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.css +27 -0
  27. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js +141 -18
  28. package/dist/collection/components/molecules/menu/mg-menu-item/doc/mg-menu-item.stories.js +5 -10
  29. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.conf.js +0 -4
  30. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.css +47 -21
  31. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js +118 -70
  32. package/dist/collection/components/molecules/mg-illustrated-message/mg-illustrated-message.js +4 -3
  33. package/dist/collection/components/molecules/mg-message/mg-message.css +7 -0
  34. package/dist/collection/components/molecules/mg-message/mg-message.js +53 -12
  35. package/dist/collection/components/molecules/mg-modal/mg-modal.css +8 -1
  36. package/dist/collection/components/molecules/mg-panel/mg-panel.css +7 -0
  37. package/dist/collection/components/molecules/mg-popover/mg-popover.css +72 -14
  38. package/dist/collection/components/molecules/mg-popover/mg-popover.js +48 -4
  39. package/dist/collection/components/molecules/mg-skip-links/doc/mg-skip-links.stories.js +1 -1
  40. package/dist/collection/components/molecules/mg-skip-links/mg-skip-links.js +32 -1
  41. package/dist/collection/components/molecules/mg-tabs/doc/mg-tabs.stories.js +5 -3
  42. package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +11 -7
  43. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +101 -54
  44. package/dist/collection/locales/en/messages.json +4 -0
  45. package/dist/collection/locales/fr/messages.json +4 -0
  46. package/dist/collection/locales/index.js +2 -25
  47. package/dist/collection/styles/a11y.scss +32 -0
  48. package/dist/collection/styles/components.scss +3 -0
  49. package/dist/collection/styles/fonts.scss +21 -0
  50. package/dist/collection/styles/form.scss +3 -0
  51. package/dist/collection/styles/global.scss +87 -0
  52. package/dist/collection/styles/layout.scss +29 -0
  53. package/dist/collection/styles/main.scss +23 -0
  54. package/dist/collection/styles/navigation-button.scss +76 -0
  55. package/dist/collection/styles/reset-mg-card-slotted-variables.scss +9 -0
  56. package/dist/collection/styles/typography.scss +75 -0
  57. package/dist/collection/styles/utilities.scss +21 -0
  58. package/dist/collection/utils/behaviors.utils.js +169 -0
  59. package/dist/collection/utils/components.utils.js +50 -0
  60. package/dist/collection/utils/locale.utils.js +22 -0
  61. package/dist/collection/utils/unit.test.utils.js +37 -32
  62. package/dist/collection/variables.css +9 -9
  63. package/dist/components/components.utils.js +51 -1
  64. package/dist/components/index2.js +65 -18
  65. package/dist/components/mg-badge2.js +4 -4
  66. package/dist/components/mg-button2.js +1 -1
  67. package/dist/components/mg-card2.js +1 -1
  68. package/dist/components/mg-icon2.js +13 -3
  69. package/dist/components/mg-illustrated-message.js +4 -3
  70. package/dist/components/mg-input-date.js +6 -4
  71. package/dist/components/mg-input-numeric.js +2 -3
  72. package/dist/components/mg-input-password.js +1 -1
  73. package/dist/components/mg-input-select2.js +8 -4
  74. package/dist/components/mg-input-text2.js +1 -1
  75. package/dist/components/mg-input-textarea.js +1 -1
  76. package/dist/components/mg-menu-item.js +1 -253
  77. package/dist/components/mg-menu-item2.js +517 -0
  78. package/dist/components/mg-menu.js +138 -21
  79. package/dist/components/mg-message.js +54 -13
  80. package/dist/components/mg-modal.js +1 -1
  81. package/dist/components/mg-panel.js +1 -1
  82. package/dist/components/mg-popover.js +1 -190
  83. package/dist/components/mg-popover2.js +212 -0
  84. package/dist/components/mg-skip-links.js +16 -2
  85. package/dist/components/mg-tabs.js +100 -52
  86. package/dist/components/mg-tag.js +4 -4
  87. package/dist/components/mg-tooltip2.js +4 -4
  88. package/dist/esm/{index-78edde1d.js → index-dc9a2348.js} +11 -1
  89. package/dist/esm/loader.js +3 -3
  90. package/dist/esm/mg-badge_30.entry.js +742 -244
  91. package/dist/esm/mg-components.js +3 -3
  92. package/dist/esm/polyfills/css-shim.js +1 -1
  93. package/dist/mg-components/locales/en/messages.json +4 -0
  94. package/dist/mg-components/locales/fr/messages.json +4 -0
  95. package/dist/mg-components/mg-components.css +1 -1
  96. package/dist/mg-components/mg-components.esm.js +1 -1
  97. package/dist/mg-components/{p-125c54ca.js → p-182bd802.js} +2 -2
  98. package/dist/mg-components/p-f7da9dd2.entry.js +1 -0
  99. package/dist/mg-components/styles/a11y.scss +32 -0
  100. package/dist/mg-components/styles/components.scss +3 -0
  101. package/dist/mg-components/styles/fonts.scss +21 -0
  102. package/dist/mg-components/styles/form.scss +3 -0
  103. package/dist/mg-components/styles/global.scss +87 -0
  104. package/dist/mg-components/styles/layout.scss +29 -0
  105. package/dist/mg-components/styles/main.scss +23 -0
  106. package/dist/mg-components/styles/navigation-button.scss +76 -0
  107. package/dist/mg-components/styles/reset-mg-card-slotted-variables.scss +9 -0
  108. package/dist/mg-components/styles/typography.scss +75 -0
  109. package/dist/mg-components/styles/utilities.scss +21 -0
  110. package/dist/mg-components/variables.css +9 -9
  111. package/dist/types/components/atoms/mg-badge/mg-badge.conf.d.ts +2 -2
  112. package/dist/types/components/atoms/mg-button/mg-button.conf.d.ts +2 -2
  113. package/dist/types/components/atoms/mg-icon/mg-icon.conf.d.ts +2 -2
  114. package/dist/types/components/atoms/mg-tag/mg-tag.conf.d.ts +1 -1
  115. package/dist/types/components/molecules/inputs/MgInput.conf.d.ts +2 -2
  116. package/dist/types/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.conf.d.ts +2 -2
  117. package/dist/types/components/molecules/inputs/mg-input-radio/mg-input-radio.conf.d.ts +1 -1
  118. package/dist/types/components/molecules/inputs/mg-input-select/mg-input-select.conf.d.ts +2 -2
  119. package/dist/types/components/molecules/inputs/mg-input-toggle/mg-input-toggle.conf.d.ts +1 -1
  120. package/dist/types/components/molecules/menu/mg-menu/doc/mg-menu.stories.d.ts +5 -0
  121. package/dist/types/components/molecules/menu/mg-menu/mg-menu.conf.d.ts +37 -0
  122. package/dist/types/components/molecules/menu/mg-menu/mg-menu.d.ts +51 -3
  123. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.conf.d.ts +0 -8
  124. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.d.ts +55 -15
  125. package/dist/types/components/molecules/mg-message/mg-message.d.ts +21 -4
  126. package/dist/types/components/molecules/mg-popover/mg-popover.d.ts +12 -0
  127. package/dist/types/components/molecules/mg-skip-links/mg-skip-links.conf.d.ts +1 -1
  128. package/dist/types/components/molecules/mg-skip-links/mg-skip-links.d.ts +15 -0
  129. package/dist/types/components/molecules/mg-tabs/mg-tabs.conf.d.ts +5 -3
  130. package/dist/types/components/molecules/mg-tabs/mg-tabs.d.ts +22 -12
  131. package/dist/types/components.d.ts +44 -12
  132. package/dist/types/locales/index.d.ts +10 -9
  133. package/dist/types/stencil-public-runtime.d.ts +39 -3
  134. package/dist/types/utils/behaviors.utils.d.ts +83 -0
  135. package/dist/types/utils/components.utils.d.ts +14 -0
  136. package/dist/types/utils/locale.utils.d.ts +13 -0
  137. package/dist/types/utils/unit.test.utils.d.ts +50 -14
  138. package/package.json +26 -26
  139. package/readme.md +22 -13
  140. package/dist/components/locale.utils.js +0 -40
  141. package/dist/components/mg-menu.conf.js +0 -10
  142. package/dist/mg-components/p-4961c96c.entry.js +0 -1
@@ -0,0 +1,517 @@
1
+ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
+ import { C as ClassList } from './components.utils.js';
3
+ import { i as initLocales } from './index2.js';
4
+ import { d as defineCustomElement$5 } from './mg-badge2.js';
5
+ import { d as defineCustomElement$4 } from './mg-button2.js';
6
+ import { d as defineCustomElement$3 } from './mg-card2.js';
7
+ import { d as defineCustomElement$2 } from './mg-icon2.js';
8
+ import { d as defineCustomElement$1 } from './mg-popover2.js';
9
+
10
+ /**
11
+ * Available menu-item positions
12
+ */
13
+ var ElementPosition;
14
+ (function (ElementPosition) {
15
+ ElementPosition["FIRST"] = "first";
16
+ ElementPosition["LAST"] = "last";
17
+ })(ElementPosition || (ElementPosition = {}));
18
+ /**
19
+ * Available menu item status
20
+ */
21
+ var Status;
22
+ (function (Status) {
23
+ Status["VISIBLE"] = "visible";
24
+ Status["HIDDEN"] = "hidden";
25
+ Status["DISABLED"] = "disabled";
26
+ Status["ACTIVE"] = "active";
27
+ })(Status || (Status = {}));
28
+
29
+ /**
30
+ * MgMenuItem type guard
31
+ *
32
+ * @param {HTMLElement} element element to control type
33
+ * @returns {boolean} truthy if element is mg-menu-item
34
+ */
35
+ const isMgMenuItem = (element) => element.nodeName === 'MG-MENU-ITEM';
36
+ var OverflowBehaviorElements;
37
+ (function (OverflowBehaviorElements) {
38
+ OverflowBehaviorElements["MORE"] = "data-overflow-more";
39
+ OverflowBehaviorElements["BASE_INDEX"] = "data-overflow-base-index";
40
+ OverflowBehaviorElements["PROXY_INDEX"] = "data-overflow-proxy-index";
41
+ })(OverflowBehaviorElements || (OverflowBehaviorElements = {}));
42
+ class OverflowBehavior {
43
+ constructor(element, render) {
44
+ this.element = element;
45
+ this.render = render;
46
+ /**********
47
+ * Public *
48
+ **********/
49
+ /**
50
+ * Disconnect ResizeObserver
51
+ *
52
+ * @returns {void}
53
+ */
54
+ this.disconnect = () => {
55
+ this.resizeObserver.disconnect();
56
+ };
57
+ /**
58
+ * Update more element status if active child
59
+ *
60
+ * @returns {void}
61
+ */
62
+ this.updateActiveStatus = () => {
63
+ const hasActiveChild = Array.from(this.moreELement.querySelector('mg-menu').children).some(element => element.nodeName === 'MG-MENU-ITEM' && element.getAttribute('status') === Status.ACTIVE && element.getAttribute('hidden') === null);
64
+ this.moreELement.setAttribute('status', hasActiveChild ? Status.ACTIVE : Status.VISIBLE);
65
+ };
66
+ /************
67
+ * Internal *
68
+ ************/
69
+ /**
70
+ * run overflow behavior
71
+ *
72
+ * @param {number} width width of the container
73
+ * @returns {void}
74
+ */
75
+ this.run = (width) => {
76
+ if (this.moreELement === undefined) {
77
+ // set moreElement
78
+ this.moreELement = this.render();
79
+ this.moreELement.setAttribute(OverflowBehaviorElements.MORE, '');
80
+ // set children
81
+ this.children = Array.from(this.element.children);
82
+ let moreELementChildren;
83
+ const allowedElements = ['MG-MENU-ITEM', 'MG-BUTTON'];
84
+ if (isMgMenuItem(this.moreELement)) {
85
+ moreELementChildren = Array.from(this.moreELement.querySelector('mg-menu').children).filter(element => allowedElements.includes(element.nodeName));
86
+ }
87
+ this.children.forEach((child, index) => {
88
+ child.setAttribute(OverflowBehaviorElements.BASE_INDEX, `${index}`);
89
+ if (child.getAttribute(OverflowBehaviorElements.MORE) === null) {
90
+ // set moreElement children
91
+ moreELementChildren[index].setAttribute(OverflowBehaviorElements.PROXY_INDEX, `${index}`);
92
+ }
93
+ });
94
+ }
95
+ this.updateDisplayedItems(width);
96
+ if (isMgMenuItem(this.moreELement))
97
+ this.updateActiveStatus();
98
+ };
99
+ /**
100
+ * Update displayed items in container from a given available space
101
+ *
102
+ * @param {number} availableWidth available width in container to display child items
103
+ * @returns {void}
104
+ */
105
+ this.updateDisplayedItems = (availableWidth) => {
106
+ this.restoreItems();
107
+ this.children.reduce((acc, curr) => {
108
+ acc.accWidth += curr.offsetWidth;
109
+ const isPreviousItemHidden = acc.previousItem !== null && acc.previousItem.getAttribute('hidden') !== null;
110
+ // if previous item is hidden AND is NOT more element we hidde current
111
+ // OR if item has an overflow we hidde current
112
+ // OR if current item is more element AND have NOT previous hidden items, current more element item is an hidden item
113
+ // ELSE current is a display item
114
+ if ((isPreviousItemHidden && !this.isMoreElement(curr)) ||
115
+ this.isOverflowElement(acc.accWidth, curr, availableWidth) ||
116
+ (this.isMoreElement(curr) && !isPreviousItemHidden)) {
117
+ this.toggleItem(curr, true);
118
+ }
119
+ else
120
+ this.toggleItem(curr, false);
121
+ // update previous item with current item
122
+ acc.previousItem = curr;
123
+ return acc;
124
+ }, { accWidth: 0, previousItem: null });
125
+ };
126
+ /**
127
+ * Utility method to know if item overflow partialy or totaly in the container
128
+ *
129
+ * @param {number} cumulateWidth previous sibling elements cumulate width + item width
130
+ * @param {HTMLElement} item item HTML element
131
+ * @param {number} availableWidth container available width
132
+ * @returns {boolean} truthy if element is overflow
133
+ */
134
+ this.isOverflowElement = (cumulateWidth, item, availableWidth) => {
135
+ if (item.previousElementSibling === null || this.isMoreElement(item))
136
+ return false;
137
+ else if (!this.isMoreElement(item.nextElementSibling))
138
+ return cumulateWidth + this.moreELement.offsetWidth > availableWidth;
139
+ else
140
+ return cumulateWidth > availableWidth;
141
+ };
142
+ /**
143
+ * Utility method to know if a given element is the 'MORE' element
144
+ *
145
+ * @param {Element} element element to match with 'MORE' element
146
+ * @returns {boolean} truthy if element is the 'MORE' element
147
+ */
148
+ this.isMoreElement = (element) => element.getAttribute(OverflowBehaviorElements.MORE) !== null;
149
+ /**
150
+ * Toggle display item element
151
+ *
152
+ * @param {HTMLElement} item item to control
153
+ * @param {boolean} isHidden is item hidden
154
+ * @returns {void}
155
+ */
156
+ this.toggleItem = (item, isHidden) => {
157
+ const mgActionMenuindex = Number(item.getAttribute(OverflowBehaviorElements.BASE_INDEX));
158
+ if (this.isMoreElement(item))
159
+ this.toggleElement(this.moreELement, isHidden);
160
+ else if (mgActionMenuindex >= 0) {
161
+ this.toggleElement(item, isHidden);
162
+ this.toggleElement(this.moreELement.querySelector(`[${OverflowBehaviorElements.PROXY_INDEX}="${mgActionMenuindex}"]`), !isHidden);
163
+ }
164
+ };
165
+ /**
166
+ * Toggle element's hidde attribute
167
+ *
168
+ * @param {Element} element element to toggle
169
+ * @param {boolean} isHidden element is hidden
170
+ * @returns {void}
171
+ */
172
+ this.toggleElement = (element, isHidden) => {
173
+ if (isHidden)
174
+ element.setAttribute('hidden', '');
175
+ else
176
+ element.removeAttribute('hidden');
177
+ };
178
+ /**
179
+ * Remove hidden attributes on all items
180
+ *
181
+ * @returns {void}
182
+ */
183
+ this.restoreItems = () => {
184
+ this.children.forEach(item => item.removeAttribute('hidden'));
185
+ };
186
+ if (this.resizeObserver === undefined) {
187
+ // add resize observer
188
+ this.resizeObserver = new ResizeObserver(entries => {
189
+ entries.forEach(entry => {
190
+ this.run(entry.contentRect.width);
191
+ });
192
+ });
193
+ this.resizeObserver.observe(this.element);
194
+ }
195
+ }
196
+ }
197
+
198
+ /**
199
+ * Menu direction type
200
+ */
201
+ var Direction;
202
+ (function (Direction) {
203
+ Direction["VERTICAL"] = "vertical";
204
+ Direction["HORIZONTAL"] = "horizontal";
205
+ })(Direction || (Direction = {}));
206
+ /**
207
+ * More item type guard
208
+ *
209
+ * @param {unknown} element element to control
210
+ * @returns {boolean} truthy if element is more-item
211
+ */
212
+ const isMoreItem = (element) => {
213
+ var _a, _b, _c;
214
+ const item = element;
215
+ return (item === undefined ||
216
+ (typeof item === 'object' &&
217
+ (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')));
218
+ };
219
+ /**
220
+ * List of all possibles sizes
221
+ */
222
+ const sizes = ['regular', 'medium', 'large'];
223
+
224
+ 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);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:0.3}.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}";
225
+
226
+ const MgMenuItem = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
227
+ constructor() {
228
+ super();
229
+ this.__registerHost();
230
+ this.__attachShadow();
231
+ this.statusChange = createEvent(this, "status-change", 7);
232
+ /************
233
+ * Internal *
234
+ ************/
235
+ this.name = 'mg-menu-item';
236
+ this.navigationButton = `${this.name}__navigation-button`;
237
+ /***********
238
+ * Methods *
239
+ **********/
240
+ /**
241
+ * Toggle expanded prop value
242
+ *
243
+ * @returns {void}
244
+ */
245
+ this.toggleExpanded = () => {
246
+ this.expanded = !this.expanded;
247
+ };
248
+ /**
249
+ * Does an Element have given Status
250
+ *
251
+ * @param {Element} element to parse
252
+ * @param {MgMenuItem['status']} status to check
253
+ * @returns {boolean} true if element with status is found
254
+ */
255
+ this.hasStatus = (element, status) => element.querySelector(`${this.name}[status="${status}"]`) !== null;
256
+ /**
257
+ * Is component contextual direction match the given direction
258
+ *
259
+ * @param {MgMenuItem['direction']} direction in parent menu
260
+ * @returns {boolean} true is direction match the direction propertie
261
+ */
262
+ this.isDirection = (direction) => this.direction === direction;
263
+ /************
264
+ * Handlers *
265
+ ************/
266
+ /**
267
+ * Handle interacrtive element click
268
+ *
269
+ * @param {MouseEvent} event click on element
270
+ * @returns {void}
271
+ */
272
+ this.handleElementCLick = (event) => {
273
+ if ((this.hasChildren && !this.isInMainMenu) || this.status === Status.DISABLED) {
274
+ event.preventDefault();
275
+ event.stopPropagation();
276
+ }
277
+ // toggle expanded when mg-menu-item has child items
278
+ if (this.hasChildren)
279
+ this.toggleExpanded();
280
+ };
281
+ /**
282
+ * Handle popover element display-change event
283
+ *
284
+ * @param {CustomEvent} event popover display event
285
+ * @returns {void}
286
+ */
287
+ this.handlePopoverDisplay = (event) => {
288
+ this.expanded = event.detail;
289
+ };
290
+ /**
291
+ * Update displayNotificationBadge
292
+ * current component notification badge have priority over the slot badge when submenu contain badge
293
+ *
294
+ * @returns {void} update displayNotificationBadge value
295
+ */
296
+ this.updateDisplayNotificationBadge = () => {
297
+ const childMenu = this.element.querySelector('mg-menu');
298
+ this.displayNotificationBadge =
299
+ childMenu !== null &&
300
+ Array.from(childMenu.children).some((subItem) => subItem.querySelector('mg-badge') !== null && subItem.getAttribute('hidden') === null);
301
+ };
302
+ /**
303
+ * Render slot
304
+ *
305
+ * @returns {HTMLElement} HTML Element
306
+ */
307
+ this.renderSlot = () => h("slot", null);
308
+ this.href = undefined;
309
+ this.status = Status.VISIBLE;
310
+ this.expanded = false;
311
+ this.size = 'regular';
312
+ this.navigationButtonClassList = new ClassList([this.navigationButton]);
313
+ this.direction = undefined;
314
+ this.isInMainMenu = undefined;
315
+ this.hasChildren = false;
316
+ this.displayNotificationBadge = undefined;
317
+ }
318
+ validateStatus(newValue, oldValue) {
319
+ if (oldValue !== undefined) {
320
+ this.navigationButtonClassList.delete(`${this.navigationButton}--${oldValue}`);
321
+ }
322
+ this.navigationButtonClassList.add(`${this.navigationButton}--${newValue}`);
323
+ this.statusChange.emit(newValue);
324
+ }
325
+ validateExpanded(newValue) {
326
+ if (typeof newValue !== 'boolean')
327
+ throw new Error(`<${this.name}> prop "expanded" must be a boolean.`);
328
+ // if menu-item has sub-menu we have to apply some updates:
329
+ if (this.hasChildren) {
330
+ const subItems = Array.from(this.element.querySelectorAll(this.name));
331
+ if (!newValue) {
332
+ // - when main menu item is NOT expanded we need NOT expanded sub-items and NOT expanded sub-content
333
+ subItems.forEach(item => {
334
+ item.expanded = false;
335
+ });
336
+ }
337
+ else if (this.hasStatus(this.element, Status.ACTIVE)) {
338
+ // - when expanded and contain an active item parents are expended too
339
+ subItems.forEach(item => {
340
+ if (this.hasStatus(item, Status.ACTIVE)) {
341
+ item.expanded = true;
342
+ }
343
+ });
344
+ }
345
+ }
346
+ }
347
+ validateSize(newValue, oldValue) {
348
+ this.navigationButtonClassList.delete(`${this.navigationButton}--size-${oldValue}`);
349
+ this.navigationButtonClassList.add(`${this.navigationButton}--size-${newValue}`);
350
+ }
351
+ validateHasChildren(newValue) {
352
+ if (newValue && this.element.href !== undefined) {
353
+ throw new Error(`<${this.name}> prop "href" is unauthorizied when element is a parent.`);
354
+ }
355
+ }
356
+ /*************
357
+ * Lifecycle *
358
+ *************/
359
+ /**
360
+ * Validate props
361
+ *
362
+ * @returns {void}
363
+ */
364
+ componentWillLoad() {
365
+ // has children items that is NOT [slot='image' | 'information' | 'label' | 'metadata'] element
366
+ // we store only matching elements
367
+ this.hasChildren = Array.from(this.element.children).some(child => !['image', 'information', 'label', 'metadata'].includes(child.getAttribute('slot')));
368
+ // Validate props
369
+ this.validateSize(this.size);
370
+ this.validateStatus(this.status);
371
+ this.validateExpanded(this.expanded);
372
+ this.badgeLabel = initLocales(this.element).messages.plusMenu.badgeLabel;
373
+ }
374
+ /**
375
+ * Check if component slots configuration
376
+ *
377
+ * @returns {ReturnType<typeof setTimeout>} timeout
378
+ */
379
+ componentDidLoad() {
380
+ // slot title AND metadata validation
381
+ // add title on label AND metada slots due to text-overflow on these element
382
+ if (Array.from(this.element.children).find(child => child.getAttribute('slot') === 'label') === undefined)
383
+ throw new Error(`<${this.name}> slot "label" is required.`);
384
+ ['label', 'metadata'].forEach(slot => {
385
+ Array.from(this.element.querySelectorAll(`[slot="${slot}"]`)).forEach(element => {
386
+ if (element.textContent.trim().length < 1)
387
+ throw new Error(`<${this.name}> slot "${slot}" must have text content.`);
388
+ if (element.getAttribute('title') === null)
389
+ element.setAttribute('title', element.textContent);
390
+ });
391
+ });
392
+ // update props and states after componentDidLoad hook
393
+ // return a promise to process action only in the FIRST render().
394
+ // https://stenciljs.com/docs/component-lifecycle#componentwillload
395
+ return setTimeout(() => {
396
+ var _a;
397
+ // define menu-item context states
398
+ const menu = this.element.closest('mg-menu');
399
+ this.direction = this.element.getAttribute(OverflowBehaviorElements.MORE) !== null || menu === null ? Direction.HORIZONTAL : menu.direction;
400
+ this.size = menu === null || menu === void 0 ? void 0 : menu.size;
401
+ this.isInMainMenu = this.element.parentElement.closest('mg-menu-item') === null;
402
+ // when main menu item contain an active item it will get the active style
403
+ // AND if item is in vertical menu it will be expanded
404
+ const hasActiveChild = Array.from(this.element.children).some(element => this.hasStatus(element, Status.ACTIVE) && element.getAttribute('hidden') === null);
405
+ if (this.isInMainMenu && hasActiveChild) {
406
+ this.status = Status.ACTIVE;
407
+ this.expanded = this.isDirection(Direction.VERTICAL);
408
+ }
409
+ // manage menu items style depending to parent menu horientation
410
+ this.element.setAttribute(`data-style-direction-${this.direction}`, '');
411
+ this.navigationButtonClassList.add(`${this.navigationButton}--${this.direction}`);
412
+ this.updateDisplayNotificationBadge();
413
+ // manage all sub levels child menu-items level with data-level attribut
414
+ if (this.isDirection(Direction.VERTICAL)) {
415
+ Array.from(this.element.querySelectorAll('mg-menu-item')).forEach(item => {
416
+ const itemLevel = Number(item.getAttribute('data-level')) || 1;
417
+ item.setAttribute('data-level', `${itemLevel + 1}`);
418
+ });
419
+ }
420
+ // manage first sub-level menu-items
421
+ 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');
422
+ childItems.forEach(item => {
423
+ // manage child menu listener
424
+ new MutationObserver(() => {
425
+ this.updateDisplayNotificationBadge();
426
+ }).observe(item, { attributes: true });
427
+ });
428
+ }, 0);
429
+ }
430
+ /**
431
+ * Render ineractive element
432
+ *
433
+ * @returns {HTMLElement} HTML Element
434
+ */
435
+ renderInteractiveElement() {
436
+ const TagName = this.href !== undefined ? 'a' : 'button';
437
+ return (h(TagName, { href: this.href, class: this.navigationButtonClassList.join(), tabindex: [Status.DISABLED, Status.HIDDEN].includes(this.status) ? -1 : 0, disabled: this.status === Status.DISABLED, hidden: this.status === Status.HIDDEN, "aria-expanded": this.hasChildren && this.expanded.toString(), "aria-current": this.status === Status.ACTIVE && 'page', onClick: this.handleElementCLick }, h("slot", { name: "image" }), h("div", { class: `${this.navigationButton}-center` }, h("div", { class: `${this.navigationButton}-text-content` }, h("slot", { name: "label" }), !this.displayNotificationBadge && h("slot", { name: "information" }), this.displayNotificationBadge && (h("span", { class: "mg-menu-item__navigation-button-text-content-notification" }, h("mg-badge", { label: this.badgeLabel, value: "!", variant: "info", slot: "information" })))), this.size !== 'regular' && h("slot", { name: "metadata" })), this.hasChildren && this.href === undefined && (h("span", { class: {
438
+ [`${this.navigationButton}-chevron`]: true,
439
+ [`${this.navigationButton}-chevron--rotate`]: this.expanded === true,
440
+ 'mg-a11y-animation': true,
441
+ } }, h("mg-icon", { icon: "chevron-down" })))));
442
+ }
443
+ /**
444
+ * Render
445
+ *
446
+ * @returns {HTMLElement} HTML Element
447
+ */
448
+ render() {
449
+ const getContainerClasses = () => ({
450
+ [`${this.name}__collapse-container`]: true,
451
+ [`${this.name}__collapse-container--first-level`]: this.isInMainMenu && this.isDirection(Direction.HORIZONTAL),
452
+ });
453
+ 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()))) : ([
454
+ this.renderInteractiveElement(),
455
+ h("div", { class: getContainerClasses(), hidden: !this.expanded }, this.renderSlot()),
456
+ ])));
457
+ }
458
+ get element() { return this; }
459
+ static get watchers() { return {
460
+ "status": ["validateStatus"],
461
+ "expanded": ["validateExpanded"],
462
+ "size": ["validateSize"],
463
+ "hasChildren": ["validateHasChildren"]
464
+ }; }
465
+ static get style() { return mgMenuItemCss; }
466
+ }, [1, "mg-menu-item", {
467
+ "href": [1],
468
+ "status": [1537],
469
+ "expanded": [1028],
470
+ "size": [32],
471
+ "navigationButtonClassList": [32],
472
+ "direction": [32],
473
+ "isInMainMenu": [32],
474
+ "hasChildren": [32],
475
+ "displayNotificationBadge": [32]
476
+ }]);
477
+ function defineCustomElement() {
478
+ if (typeof customElements === "undefined") {
479
+ return;
480
+ }
481
+ const components = ["mg-menu-item", "mg-badge", "mg-button", "mg-card", "mg-icon", "mg-popover"];
482
+ components.forEach(tagName => { switch (tagName) {
483
+ case "mg-menu-item":
484
+ if (!customElements.get(tagName)) {
485
+ customElements.define(tagName, MgMenuItem);
486
+ }
487
+ break;
488
+ case "mg-badge":
489
+ if (!customElements.get(tagName)) {
490
+ defineCustomElement$5();
491
+ }
492
+ break;
493
+ case "mg-button":
494
+ if (!customElements.get(tagName)) {
495
+ defineCustomElement$4();
496
+ }
497
+ break;
498
+ case "mg-card":
499
+ if (!customElements.get(tagName)) {
500
+ defineCustomElement$3();
501
+ }
502
+ break;
503
+ case "mg-icon":
504
+ if (!customElements.get(tagName)) {
505
+ defineCustomElement$2();
506
+ }
507
+ break;
508
+ case "mg-popover":
509
+ if (!customElements.get(tagName)) {
510
+ defineCustomElement$1();
511
+ }
512
+ break;
513
+ } });
514
+ }
515
+ defineCustomElement();
516
+
517
+ export { Direction as D, MgMenuItem as M, OverflowBehaviorElements as O, OverflowBehavior as a, defineCustomElement as d, isMoreItem as i, sizes as s };