@mgdis/mg-components 5.2.0 → 5.3.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 (55) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/{mg-badge_27.cjs.entry.js → mg-badge_29.cjs.entry.js} +376 -6
  3. package/dist/cjs/mg-components.cjs.js +1 -1
  4. package/dist/collection/collection-manifest.json +3 -1
  5. package/dist/collection/components/atoms/mg-badge/mg-badge.js +13 -18
  6. package/dist/collection/components/atoms/mg-icon/mg-icon.js +17 -7
  7. package/dist/collection/components/molecules/menu/mg-menu/doc/mg-menu.stories.js +87 -0
  8. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.conf.js +8 -0
  9. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.css +10 -0
  10. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js +185 -0
  11. package/dist/collection/components/molecules/menu/mg-menu-item/doc/mg-menu-item.stories.js +32 -0
  12. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.conf.js +22 -0
  13. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.css +316 -0
  14. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js +324 -0
  15. package/dist/collection/components/molecules/mg-tabs/mg-tabs.conf.js +3 -0
  16. package/dist/collection/components/molecules/mg-tabs/mg-tabs.css +67 -17
  17. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +10 -4
  18. package/dist/collection/locales/index.js +3 -1
  19. package/dist/collection/variables.css +23 -1
  20. package/dist/components/index.d.ts +2 -0
  21. package/dist/components/index.js +2 -0
  22. package/dist/components/index2.js +3 -1
  23. package/dist/components/mg-menu-item.d.ts +11 -0
  24. package/dist/components/mg-menu-item.js +273 -0
  25. package/dist/components/mg-menu.conf.js +10 -0
  26. package/dist/components/mg-menu.d.ts +11 -0
  27. package/dist/components/mg-menu.js +149 -0
  28. package/dist/components/mg-tabs.js +6 -2
  29. package/dist/esm/loader.js +1 -1
  30. package/dist/esm/{mg-badge_27.entry.js → mg-badge_29.entry.js} +375 -7
  31. package/dist/esm/mg-components.js +1 -1
  32. package/dist/mg-components/mg-components.css +1 -1
  33. package/dist/mg-components/mg-components.esm.js +1 -1
  34. package/dist/mg-components/p-204af46f.entry.js +1 -0
  35. package/dist/mg-components/variables.css +23 -1
  36. package/dist/types/components/atoms/mg-badge/doc/mg-badge.stories.d.ts +2 -2
  37. package/dist/types/components/atoms/mg-badge/mg-badge.conf.d.ts +5 -5
  38. package/dist/types/components/atoms/mg-badge/mg-badge.d.ts +8 -8
  39. package/dist/types/components/atoms/mg-icon/doc/mg-icon.stories.d.ts +2 -2
  40. package/dist/types/components/atoms/mg-icon/mg-icon.conf.d.ts +10 -2
  41. package/dist/types/components/atoms/mg-icon/mg-icon.d.ts +7 -6
  42. package/dist/types/components/molecules/menu/mg-menu/doc/mg-menu.stories.d.ts +17 -0
  43. package/dist/types/components/molecules/menu/mg-menu/mg-menu.conf.d.ts +7 -0
  44. package/dist/types/components/molecules/menu/mg-menu/mg-menu.d.ts +69 -0
  45. package/dist/types/components/molecules/menu/mg-menu-item/doc/mg-menu-item.stories.d.ts +11 -0
  46. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.conf.d.ts +24 -0
  47. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.d.ts +119 -0
  48. package/dist/types/components/molecules/mg-tabs/doc/mg-tabs.stories.d.ts +1 -1
  49. package/dist/types/components/molecules/mg-tabs/mg-tabs.conf.d.ts +12 -4
  50. package/dist/types/components/molecules/mg-tabs/mg-tabs.d.ts +6 -6
  51. package/dist/types/components.d.ts +91 -14
  52. package/dist/types/locales/index.d.ts +7 -1
  53. package/dist/types/stories/icons.stories.d.ts +1 -1
  54. package/package.json +1 -1
  55. package/dist/mg-components/p-b2b07c3f.entry.js +0 -1
@@ -0,0 +1,316 @@
1
+ .mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button,
2
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
3
+ padding: 1rem 2rem;
4
+ }
5
+ .mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button,
6
+ .mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button ::slotted([slot=label]),
7
+ .mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button ::slotted([slot=metadata]),
8
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular,
9
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular ::slotted([slot=label]),
10
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular ::slotted([slot=metadata]) {
11
+ font-size: 1.3rem;
12
+ }
13
+ .mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,
14
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular.mg-menu-item__navigation-button--horizontal {
15
+ padding-bottom: calc(1rem - 0.3rem);
16
+ }
17
+ .mg-menu-item.mg-menu-item--size-regular .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,
18
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular.mg-menu-item__navigation-button--vertical {
19
+ padding-left: calc(2rem - 0.3rem);
20
+ }
21
+
22
+ .mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button,
23
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
24
+ padding: 1.5rem 3rem;
25
+ }
26
+ .mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button,
27
+ .mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button ::slotted([slot=label]),
28
+ .mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button ::slotted([slot=metadata]),
29
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium,
30
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium ::slotted([slot=label]),
31
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium ::slotted([slot=metadata]) {
32
+ font-size: 1.5rem;
33
+ }
34
+ .mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,
35
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium.mg-menu-item__navigation-button--horizontal {
36
+ padding-bottom: calc(1.5rem - 0.3rem);
37
+ }
38
+ .mg-menu-item.mg-menu-item--size-medium .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,
39
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium.mg-menu-item__navigation-button--vertical {
40
+ padding-left: calc(3rem - 0.3rem);
41
+ }
42
+
43
+ .mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button,
44
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
45
+ padding: 2.5rem 4rem;
46
+ }
47
+ .mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button,
48
+ .mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button ::slotted([slot=label]),
49
+ .mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button ::slotted([slot=metadata]),
50
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large,
51
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large ::slotted([slot=label]),
52
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large ::slotted([slot=metadata]) {
53
+ font-size: 1.5rem;
54
+ }
55
+ .mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal,
56
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large.mg-menu-item__navigation-button--horizontal {
57
+ padding-bottom: calc(2.5rem - 0.3rem);
58
+ }
59
+ .mg-menu-item.mg-menu-item--size-large .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical,
60
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large.mg-menu-item__navigation-button--vertical {
61
+ padding-left: calc(4rem - 0.3rem);
62
+ }
63
+
64
+ .mg-menu-item__navigation-button {
65
+ display: flex;
66
+ align-items: center;
67
+ column-gap: 1rem;
68
+ background-color: unset;
69
+ border: none;
70
+ font-family: var(--font-family);
71
+ color: hsl(var(--mg-menu-item-color-hsl, var(--color-dark)));
72
+ line-height: var(--line-height);
73
+ text-decoration: none;
74
+ cursor: pointer;
75
+ }
76
+ .mg-menu-item__navigation-button:disabled, .mg-menu-item__navigation-button--disabled {
77
+ cursor: default;
78
+ opacity: 30%;
79
+ }
80
+ .mg-menu-item__navigation-button:focus-visible {
81
+ z-index: 10;
82
+ }
83
+ .mg-menu-item__navigation-button:hover:not(.mg-menu-item__navigation-button--disabled), .mg-menu-item__navigation-button:focus:not(.mg-menu-item__navigation-button--disabled) {
84
+ background-color: hsla(var(--mg-menu-item-focused-background-color-hsl), 10%);
85
+ }
86
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--active {
87
+ color: hsl(var(--mg-menu-item-color-active-hsl));
88
+ font-weight: 700;
89
+ }
90
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--active.mg-menu-item__navigation-button--horizontal {
91
+ border-bottom-color: hsl(var(--mg-menu-item-border-color-active-hsl));
92
+ }
93
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--active.mg-menu-item__navigation-button--vertical {
94
+ border-left-color: hsl(var(--mg-menu-item-border-color-active-hsl));
95
+ }
96
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--hidden {
97
+ display: none;
98
+ }
99
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--horizontal {
100
+ border-bottom: 0.3rem solid transparent;
101
+ }
102
+ .mg-menu-item__navigation-button.mg-menu-item__navigation-button--vertical {
103
+ border-left: 0.3rem solid transparent;
104
+ }
105
+
106
+ :host(.mg-menu-item--vertical[data-level="1"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
107
+ padding-left: calc(1 * 2rem - 0.3rem);
108
+ }
109
+
110
+ :host([data-level="1"]) .mg-menu-item__collapse-container {
111
+ z-index: calc(1 * 10);
112
+ }
113
+
114
+ :host(.mg-menu-item--vertical[data-level="2"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
115
+ padding-left: calc(2 * 2rem - 0.3rem);
116
+ }
117
+
118
+ :host([data-level="2"]) .mg-menu-item__collapse-container {
119
+ z-index: calc(2 * 10);
120
+ }
121
+
122
+ :host(.mg-menu-item--vertical[data-level="3"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
123
+ padding-left: calc(3 * 2rem - 0.3rem);
124
+ }
125
+
126
+ :host([data-level="3"]) .mg-menu-item__collapse-container {
127
+ z-index: calc(3 * 10);
128
+ }
129
+
130
+ :host(.mg-menu-item--vertical[data-level="4"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
131
+ padding-left: calc(4 * 2rem - 0.3rem);
132
+ }
133
+
134
+ :host([data-level="4"]) .mg-menu-item__collapse-container {
135
+ z-index: calc(4 * 10);
136
+ }
137
+
138
+ :host(.mg-menu-item--vertical[data-level="5"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
139
+ padding-left: calc(5 * 2rem - 0.3rem);
140
+ }
141
+
142
+ :host([data-level="5"]) .mg-menu-item__collapse-container {
143
+ z-index: calc(5 * 10);
144
+ }
145
+
146
+ :host(.mg-menu-item--vertical[data-level="6"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-regular {
147
+ padding-left: calc(6 * 2rem - 0.3rem);
148
+ }
149
+
150
+ :host([data-level="6"]) .mg-menu-item__collapse-container {
151
+ z-index: calc(6 * 10);
152
+ }
153
+
154
+ :host(.mg-menu-item--vertical[data-level="1"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
155
+ padding-left: calc(1 * 3rem - 0.3rem);
156
+ }
157
+
158
+ :host([data-level="1"]) .mg-menu-item__collapse-container {
159
+ z-index: calc(1 * 10);
160
+ }
161
+
162
+ :host(.mg-menu-item--vertical[data-level="2"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
163
+ padding-left: calc(2 * 3rem - 0.3rem);
164
+ }
165
+
166
+ :host([data-level="2"]) .mg-menu-item__collapse-container {
167
+ z-index: calc(2 * 10);
168
+ }
169
+
170
+ :host(.mg-menu-item--vertical[data-level="3"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
171
+ padding-left: calc(3 * 3rem - 0.3rem);
172
+ }
173
+
174
+ :host([data-level="3"]) .mg-menu-item__collapse-container {
175
+ z-index: calc(3 * 10);
176
+ }
177
+
178
+ :host(.mg-menu-item--vertical[data-level="4"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
179
+ padding-left: calc(4 * 3rem - 0.3rem);
180
+ }
181
+
182
+ :host([data-level="4"]) .mg-menu-item__collapse-container {
183
+ z-index: calc(4 * 10);
184
+ }
185
+
186
+ :host(.mg-menu-item--vertical[data-level="5"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
187
+ padding-left: calc(5 * 3rem - 0.3rem);
188
+ }
189
+
190
+ :host([data-level="5"]) .mg-menu-item__collapse-container {
191
+ z-index: calc(5 * 10);
192
+ }
193
+
194
+ :host(.mg-menu-item--vertical[data-level="6"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-medium {
195
+ padding-left: calc(6 * 3rem - 0.3rem);
196
+ }
197
+
198
+ :host([data-level="6"]) .mg-menu-item__collapse-container {
199
+ z-index: calc(6 * 10);
200
+ }
201
+
202
+ :host(.mg-menu-item--vertical[data-level="1"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
203
+ padding-left: calc(1 * 4rem - 0.3rem);
204
+ }
205
+
206
+ :host([data-level="1"]) .mg-menu-item__collapse-container {
207
+ z-index: calc(1 * 10);
208
+ }
209
+
210
+ :host(.mg-menu-item--vertical[data-level="2"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
211
+ padding-left: calc(2 * 4rem - 0.3rem);
212
+ }
213
+
214
+ :host([data-level="2"]) .mg-menu-item__collapse-container {
215
+ z-index: calc(2 * 10);
216
+ }
217
+
218
+ :host(.mg-menu-item--vertical[data-level="3"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
219
+ padding-left: calc(3 * 4rem - 0.3rem);
220
+ }
221
+
222
+ :host([data-level="3"]) .mg-menu-item__collapse-container {
223
+ z-index: calc(3 * 10);
224
+ }
225
+
226
+ :host(.mg-menu-item--vertical[data-level="4"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
227
+ padding-left: calc(4 * 4rem - 0.3rem);
228
+ }
229
+
230
+ :host([data-level="4"]) .mg-menu-item__collapse-container {
231
+ z-index: calc(4 * 10);
232
+ }
233
+
234
+ :host(.mg-menu-item--vertical[data-level="5"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
235
+ padding-left: calc(5 * 4rem - 0.3rem);
236
+ }
237
+
238
+ :host([data-level="5"]) .mg-menu-item__collapse-container {
239
+ z-index: calc(5 * 10);
240
+ }
241
+
242
+ :host(.mg-menu-item--vertical[data-level="6"]) .mg-menu-item__navigation-button.mg-menu-item__navigation-button--size-large {
243
+ padding-left: calc(6 * 4rem - 0.3rem);
244
+ }
245
+
246
+ :host([data-level="6"]) .mg-menu-item__collapse-container {
247
+ z-index: calc(6 * 10);
248
+ }
249
+
250
+ :host {
251
+ position: relative;
252
+ display: flex;
253
+ }
254
+
255
+ :host(.mg-menu-item--last) .mg-menu-item__collapse-container {
256
+ left: unset;
257
+ right: 0;
258
+ }
259
+
260
+ :host(.mg-menu-item--vertical) {
261
+ flex-direction: column;
262
+ }
263
+ :host(.mg-menu-item--vertical) .mg-menu-item__collapse-container {
264
+ left: unset;
265
+ top: unset;
266
+ position: unset;
267
+ width: unset;
268
+ }
269
+ :host(.mg-menu-item--vertical) .mg-menu-item-chevron {
270
+ margin-left: auto;
271
+ }
272
+
273
+ :host(.mg-menu-item--horizontal) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level {
274
+ box-shadow: var(--box-shadow);
275
+ background-color: hsl(var(--color-light));
276
+ }
277
+ :host(.mg-menu-item--horizontal) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level ::slotted(mg-menu) {
278
+ padding: 1rem 0;
279
+ }
280
+
281
+ .mg-menu-item {
282
+ max-width: var(--mg-menu-item-navigation-button-max-width);
283
+ }
284
+ .mg-menu-item__collapse-container {
285
+ position: absolute;
286
+ top: 100%;
287
+ left: 0;
288
+ width: max-content;
289
+ z-index: 10;
290
+ }
291
+ .mg-menu-item__navigation-button-center {
292
+ min-width: 0;
293
+ }
294
+ .mg-menu-item__navigation-button-text-content {
295
+ width: 100%;
296
+ display: flex;
297
+ }
298
+ .mg-menu-item__navigation-button-text-content ::slotted([slot=information]) {
299
+ margin-left: 1rem;
300
+ }
301
+ .mg-menu-item__navigation-button-chevron {
302
+ margin-left: auto;
303
+ transition: 200ms;
304
+ }
305
+ .mg-menu-item__navigation-button-chevron--rotate.mg-menu-item__navigation-button-chevron {
306
+ transform: rotate(180deg);
307
+ }
308
+
309
+ ::slotted([slot=label]),
310
+ ::slotted([slot=metadata]) {
311
+ display: block;
312
+ text-align: left;
313
+ white-space: nowrap;
314
+ overflow: hidden;
315
+ text-overflow: ellipsis;
316
+ }
@@ -0,0 +1,324 @@
1
+ import { h, Host } from '@stencil/core';
2
+ import { ClassList } from '../../../../utils/components.utils';
3
+ import { Direction } from '../mg-menu/mg-menu.conf';
4
+ import { ElementPosition, sizes, Status } from './mg-menu-item.conf';
5
+ export class MgMenuItem {
6
+ constructor() {
7
+ /************
8
+ * Internal *
9
+ ************/
10
+ this.name = 'mg-menu-item';
11
+ this.navigationButton = `${this.name}__navigation-button`;
12
+ /**
13
+ * Define menu-item status. Default: "visible"
14
+ */
15
+ this.status = Status.VISIBLE;
16
+ /**
17
+ * Define menu-item size. Default: "large".
18
+ */
19
+ this.size = 'large';
20
+ /**
21
+ * Define menu-item content expanded. Default: false.
22
+ */
23
+ this.expanded = false;
24
+ /************
25
+ * States *
26
+ ************/
27
+ /**
28
+ * Component classes
29
+ */
30
+ this.classList = new ClassList([this.name]);
31
+ /**
32
+ * Component button classes
33
+ */
34
+ this.navigationButtonClassList = new ClassList([this.navigationButton]);
35
+ /**
36
+ * Does component have children. Default: false.
37
+ */
38
+ this.hasChildren = false;
39
+ /************
40
+ * Methods *
41
+ ************/
42
+ /**
43
+ * Toggle expanded prop value
44
+ *
45
+ * @returns {void}
46
+ */
47
+ this.toggleExpanded = () => {
48
+ this.expanded = !this.expanded;
49
+ };
50
+ /**
51
+ * Does an HTMLElement contain child with given Status
52
+ *
53
+ * @param {HTMLElement} element to parse
54
+ * @param {MgMenuItem['status']} status to check
55
+ * @returns {boolean} true if element with status is found
56
+ */
57
+ this.hasChildElementStatus = (element, status) => element.querySelector(`${this.name}[status="${status}"]`) !== null;
58
+ /**
59
+ * Is component contextual direction match the given direction
60
+ *
61
+ * @param {MgMenuItem['direction']} direction in parent menu
62
+ * @returns {boolean} true is direction match the direction propertie
63
+ */
64
+ this.isdirection = (direction) => this.direction === direction;
65
+ /************
66
+ * Handlers *
67
+ ************/
68
+ /**
69
+ * Handle interacrtive element click
70
+ *
71
+ * @param {MouseEvent} event click on element
72
+ * @returns {void}
73
+ */
74
+ this.handleElementCLick = (event) => {
75
+ event.preventDefault();
76
+ if (this.hasChildren)
77
+ this.toggleExpanded();
78
+ };
79
+ }
80
+ validateStatus(newValue, oldValue) {
81
+ if (oldValue !== undefined) {
82
+ this.navigationButtonClassList.delete(`${this.navigationButton}--${oldValue}`);
83
+ }
84
+ this.navigationButtonClassList.add(`${this.navigationButton}--${newValue}`);
85
+ }
86
+ validateSize(newValue, oldValue) {
87
+ if (!sizes.includes(newValue)) {
88
+ throw new Error(`<${this.name}> prop "size" must be one of : ${sizes.join(', ')}.`);
89
+ }
90
+ this.navigationButtonClassList.delete(`${this.navigationButton}--size-${oldValue}`);
91
+ this.navigationButtonClassList.add(`${this.navigationButton}--size-${newValue}`);
92
+ }
93
+ validateExpanded(newValue) {
94
+ if (typeof newValue !== 'boolean')
95
+ throw new Error(`<${this.name}> prop "expanded" must be a boolean.`);
96
+ // if menu-item has sub-menu we have to apply some updates:
97
+ if (this.hasChildren) {
98
+ const subItems = Array.from(this.element.querySelectorAll(this.name));
99
+ if (!newValue) {
100
+ // - when main menu item is NOT expanded we need NOT expanded sub-items and NOT expanded sub-content
101
+ subItems.forEach(item => {
102
+ item.expanded = false;
103
+ });
104
+ }
105
+ else if (newValue && this.hasChildElementStatus(this.element, Status.ACTIVE)) {
106
+ // - when expanded and contain an active item parents are expended too
107
+ subItems.forEach(item => {
108
+ if (this.hasChildElementStatus(item, Status.ACTIVE)) {
109
+ item.expanded = true;
110
+ }
111
+ });
112
+ }
113
+ }
114
+ }
115
+ validateHasChildren(newValue) {
116
+ if (newValue && this.element.href !== undefined) {
117
+ throw new Error(`<${this.name}> prop "href" is unauthorizied when element is a parent.`);
118
+ }
119
+ }
120
+ /*************
121
+ * Lifecycle *
122
+ *************/
123
+ /**
124
+ * Validate props
125
+ *
126
+ * @returns {void}
127
+ */
128
+ componentWillLoad() {
129
+ // has children items that is NOT [slot="illustration"] || [slot="information"] element
130
+ // we store only matching elements
131
+ this.hasChildren = Array.from(this.element.children).filter(child => !['illustration', 'information', 'label', 'metadata'].includes(child.getAttribute('slot'))).length > 0;
132
+ // Validate props
133
+ this.validateSize(this.size);
134
+ this.validateStatus(this.status);
135
+ this.validateExpanded(this.expanded);
136
+ }
137
+ /**
138
+ * Check if component slots configuration
139
+ *
140
+ * @returns {ReturnType<typeof setTimeout>} timeout
141
+ */
142
+ componentDidLoad() {
143
+ // slot title AND metadata validation
144
+ // add title on label AND metada slots due to text-overflow on these element
145
+ if (Array.from(this.element.children).find(child => child.getAttribute('slot') === 'label') === undefined)
146
+ throw new Error(`<${this.name}> slot "label" is required.`);
147
+ ['label', 'metadata'].forEach(slot => {
148
+ Array.from(this.element.querySelectorAll(`[slot="${slot}"]`)).forEach(element => {
149
+ if (element.textContent.trim().length < 1)
150
+ throw new Error(`<${this.name}> slot "${slot}" must have text content.`);
151
+ if (element.getAttribute('title') === null)
152
+ element.setAttribute('title', element.textContent);
153
+ });
154
+ });
155
+ // update props and states after componentDidLoad hook
156
+ // return a promise to process action only in the FIRST render().
157
+ // https://stenciljs.com/docs/component-lifecycle#componentwillload
158
+ return setTimeout(() => {
159
+ var _a, _b;
160
+ // define menu-item context states
161
+ if (this.element.parentElement.nodeName === 'MG-MENU') {
162
+ this.direction = this.element.parentElement.direction;
163
+ }
164
+ this.isInMainMenu = this.element.parentElement.className.includes('mg-menu-item') === false;
165
+ const hasNextMenuItem = ((_a = this.element.nextElementSibling) === null || _a === void 0 ? void 0 : _a.nodeName) === 'MG-MENU-ITEM';
166
+ const hasPreviousMenuItem = ((_b = this.element.previousElementSibling) === null || _b === void 0 ? void 0 : _b.nodeName) === 'MG-MENU-ITEM';
167
+ // manage last menu item
168
+ if (!hasNextMenuItem && hasPreviousMenuItem && this.isdirection(Direction.HORIZONTAL)) {
169
+ this.classList.add(`${this.name}--${ElementPosition.LAST}`);
170
+ }
171
+ // when main menu item contain an active item it will get the active style
172
+ // AND if item is in vertical menu it will be expanded
173
+ if (this.isInMainMenu && this.hasChildElementStatus(this.element, Status.ACTIVE)) {
174
+ this.status = Status.ACTIVE;
175
+ this.expanded = this.direction === Direction.VERTICAL;
176
+ }
177
+ // manage menu items style depending to parent menu horientation
178
+ this.classList.add(`${this.name}--${this.direction}`);
179
+ this.navigationButtonClassList.add(`${this.navigationButton}--${this.direction}`);
180
+ // manage child items level
181
+ const childItems = Array.from(this.element.querySelectorAll('mg-menu-item'));
182
+ childItems.forEach(item => {
183
+ if (this.direction === Direction.VERTICAL) {
184
+ const itemLevel = Number(item.getAttribute('data-level')) || 1;
185
+ item.setAttribute('data-level', `${itemLevel + 1}`);
186
+ }
187
+ });
188
+ }, 0);
189
+ }
190
+ /**
191
+ * Render
192
+ *
193
+ * @returns {HTMLElement} HTML Element
194
+ */
195
+ render() {
196
+ const TagName = this.href !== undefined ? 'a' : 'button';
197
+ return (h(Host, { role: "menuitem", "aria-haspopup": this.hasChildren.toString(), class: this.classList.join() }, h(TagName, { href: this.href, class: this.navigationButtonClassList.join(), tabindex: [Status.DISABLED, Status.HIDDEN].includes(this.status) ? -1 : 0, disabled: this.status === Status.DISABLED, "aria-expanded": this.hasChildren && this.expanded.toString(), "aria-current": this.status === Status.ACTIVE && 'page', onClick: this.handleElementCLick }, h("slot", { name: "illustration" }), h("div", { class: `${this.navigationButton}-center` }, h("div", { class: `${this.navigationButton}-text-content` }, h("slot", { name: "label" }), h("slot", { name: "information" })), h("slot", { name: "metadata" })), this.hasChildren && this.href === undefined && (h("span", { class: {
198
+ [`${this.navigationButton}-chevron`]: true,
199
+ [`${this.navigationButton}-chevron--rotate`]: this.expanded === true,
200
+ } }, h("mg-icon", { icon: "chevron-down" })))), h("div", { class: { [`${this.name}__collapse-container`]: true, [`${this.name}__collapse-container--first-level`]: this.isInMainMenu && this.isdirection(Direction.HORIZONTAL) }, hidden: !this.expanded }, h("slot", null))));
201
+ }
202
+ static get is() { return "mg-menu-item"; }
203
+ static get encapsulation() { return "shadow"; }
204
+ static get originalStyleUrls() {
205
+ return {
206
+ "$": ["mg-menu-item.scss"]
207
+ };
208
+ }
209
+ static get styleUrls() {
210
+ return {
211
+ "$": ["mg-menu-item.css"]
212
+ };
213
+ }
214
+ static get properties() {
215
+ return {
216
+ "href": {
217
+ "type": "string",
218
+ "mutable": false,
219
+ "complexType": {
220
+ "original": "string",
221
+ "resolved": "string",
222
+ "references": {}
223
+ },
224
+ "required": false,
225
+ "optional": false,
226
+ "docs": {
227
+ "tags": [],
228
+ "text": "Define menu-item badge\nwhen defined menu-item contain an anchor instead of button"
229
+ },
230
+ "attribute": "href",
231
+ "reflect": false
232
+ },
233
+ "status": {
234
+ "type": "string",
235
+ "mutable": true,
236
+ "complexType": {
237
+ "original": "Status",
238
+ "resolved": "Status.ACTIVE | Status.DISABLED | Status.HIDDEN | Status.VISIBLE",
239
+ "references": {
240
+ "Status": {
241
+ "location": "import",
242
+ "path": "./mg-menu-item.conf"
243
+ }
244
+ }
245
+ },
246
+ "required": false,
247
+ "optional": false,
248
+ "docs": {
249
+ "tags": [],
250
+ "text": "Define menu-item status. Default: \"visible\""
251
+ },
252
+ "attribute": "status",
253
+ "reflect": true,
254
+ "defaultValue": "Status.VISIBLE"
255
+ },
256
+ "size": {
257
+ "type": "string",
258
+ "mutable": false,
259
+ "complexType": {
260
+ "original": "MenuItemSizeType",
261
+ "resolved": "\"large\" | \"medium\" | \"regular\"",
262
+ "references": {
263
+ "MenuItemSizeType": {
264
+ "location": "import",
265
+ "path": "./mg-menu-item.conf"
266
+ }
267
+ }
268
+ },
269
+ "required": false,
270
+ "optional": false,
271
+ "docs": {
272
+ "tags": [],
273
+ "text": "Define menu-item size. Default: \"large\"."
274
+ },
275
+ "attribute": "size",
276
+ "reflect": false,
277
+ "defaultValue": "'large'"
278
+ },
279
+ "expanded": {
280
+ "type": "boolean",
281
+ "mutable": true,
282
+ "complexType": {
283
+ "original": "boolean",
284
+ "resolved": "boolean",
285
+ "references": {}
286
+ },
287
+ "required": false,
288
+ "optional": false,
289
+ "docs": {
290
+ "tags": [],
291
+ "text": "Define menu-item content expanded. Default: false."
292
+ },
293
+ "attribute": "expanded",
294
+ "reflect": false,
295
+ "defaultValue": "false"
296
+ }
297
+ };
298
+ }
299
+ static get states() {
300
+ return {
301
+ "classList": {},
302
+ "navigationButtonClassList": {},
303
+ "direction": {},
304
+ "isInMainMenu": {},
305
+ "hasChildren": {}
306
+ };
307
+ }
308
+ static get elementRef() { return "element"; }
309
+ static get watchers() {
310
+ return [{
311
+ "propName": "status",
312
+ "methodName": "validateStatus"
313
+ }, {
314
+ "propName": "size",
315
+ "methodName": "validateSize"
316
+ }, {
317
+ "propName": "expanded",
318
+ "methodName": "validateExpanded"
319
+ }, {
320
+ "propName": "hasChildren",
321
+ "methodName": "validateHasChildren"
322
+ }];
323
+ }
324
+ }
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Available tabs items status
3
+ */
1
4
  export var Status;
2
5
  (function (Status) {
3
6
  Status["VISIBLE"] = "visible";