@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
@@ -1,45 +1,95 @@
1
- .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button {
2
- padding: calc(1rem + 0.3rem) calc(1rem * 1.3) 1rem;
1
+ .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button,
2
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular {
3
+ padding: 1rem 2rem;
3
4
  }
4
-
5
- .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button {
6
- padding: calc(1.8rem + 0.3rem) calc(1.8rem * 1.3) 1.8rem;
5
+ .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button,
6
+ .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button ::slotted([slot=label]),
7
+ .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button ::slotted([slot=metadata]),
8
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular,
9
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular ::slotted([slot=label]),
10
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular ::slotted([slot=metadata]) {
11
+ font-size: 1.3rem;
12
+ }
13
+ .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal,
14
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular.mg-tabs__navigation-button--horizontal {
15
+ padding-bottom: calc(1rem - 0.3rem);
16
+ }
17
+ .mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical,
18
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular.mg-tabs__navigation-button--vertical {
19
+ padding-left: calc(2rem - 0.3rem);
7
20
  }
8
21
 
9
- .mg-tabs__header {
10
- display: flex;
11
- flex-direction: row;
12
- flex-wrap: wrap;
22
+ .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button,
23
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-large {
24
+ padding: 1.5rem 3rem;
25
+ }
26
+ .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button,
27
+ .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button ::slotted([slot=label]),
28
+ .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button ::slotted([slot=metadata]),
29
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-large,
30
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-large ::slotted([slot=label]),
31
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-large ::slotted([slot=metadata]) {
32
+ font-size: 1.5rem;
33
+ }
34
+ .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal,
35
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-large.mg-tabs__navigation-button--horizontal {
36
+ padding-bottom: calc(1.5rem - 0.3rem);
37
+ }
38
+ .mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical,
39
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--size-large.mg-tabs__navigation-button--vertical {
40
+ padding-left: calc(3rem - 0.3rem);
13
41
  }
14
42
 
15
43
  .mg-tabs__navigation-button {
16
44
  display: flex;
17
45
  align-items: center;
18
- column-gap: 0.5rem;
19
- background: none;
46
+ column-gap: 1rem;
47
+ background-color: unset;
20
48
  border: none;
21
- border-bottom: 0.3rem solid transparent;
22
49
  font-family: var(--font-family);
23
- color: hsl(var(--color-dark));
50
+ color: hsl(var(--mg-tabs-color-hsl, var(--color-dark)));
24
51
  line-height: var(--line-height);
52
+ text-decoration: none;
25
53
  cursor: pointer;
26
54
  }
27
55
  .mg-tabs__navigation-button:disabled, .mg-tabs__navigation-button--disabled {
28
56
  cursor: default;
29
57
  opacity: 30%;
30
58
  }
31
- .mg-tabs__navigation-button:hover:not(:disabled), .mg-tabs__navigation-button:focus:not(:disabled) {
32
- background-color: hsla(var(--color-info-h), var(--color-info-s), var(--color-info-l), 10%);
59
+ .mg-tabs__navigation-button:focus-visible {
60
+ z-index: 10;
61
+ }
62
+ .mg-tabs__navigation-button:hover:not(.mg-tabs__navigation-button--disabled), .mg-tabs__navigation-button:focus:not(.mg-tabs__navigation-button--disabled) {
63
+ background-color: hsla(var(--mg-tabs-focused-background-color-hsl), 10%);
33
64
  }
34
65
  .mg-tabs__navigation-button.mg-tabs__navigation-button--active {
35
- color: hsl(var(--color-info));
36
- border-bottom-color: hsl(var(--color-info));
66
+ color: hsl(var(--mg-tabs-color-active-hsl));
37
67
  font-weight: 700;
38
68
  }
69
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--active.mg-tabs__navigation-button--horizontal {
70
+ border-bottom-color: hsl(var(--mg-tabs-border-color-active-hsl));
71
+ }
72
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--active.mg-tabs__navigation-button--vertical {
73
+ border-left-color: hsl(var(--mg-tabs-border-color-active-hsl));
74
+ }
39
75
  .mg-tabs__navigation-button.mg-tabs__navigation-button--hidden {
40
76
  display: none;
41
77
  }
78
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal {
79
+ border-bottom: 0.3rem solid transparent;
80
+ }
81
+ .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical {
82
+ border-left: 0.3rem solid transparent;
83
+ }
42
84
 
85
+ .mg-tabs__header {
86
+ display: flex;
87
+ flex-direction: row;
88
+ flex-wrap: wrap;
89
+ }
43
90
  .mg-tabs__content-container:focus-visible {
44
91
  outline: none;
92
+ }
93
+ .mg-tabs__navigation-button-text {
94
+ flex: 0 0 content;
45
95
  }
@@ -185,10 +185,11 @@ export class MgTabs {
185
185
  render() {
186
186
  return (h("div", { class: this.classList.join() }, h("header", { role: "tablist", "aria-label": this.label, class: "mg-tabs__header" }, this.tabs.map((tab, index) => (h("button", { role: "tab", id: this.getElementId(this.identifier, index), class: {
187
187
  [`${this.buttonTabBaseClass}`]: true,
188
+ [`${this.buttonTabBaseClass}--horizontal`]: true,
188
189
  [`${this.getNavigationButtonClass(Status.ACTIVE)}`]: this.tabHasGivenStatus(tab, Status.ACTIVE),
189
190
  [`${this.getNavigationButtonClass(Status.DISABLED)}`]: this.tabHasGivenStatus(tab, Status.DISABLED),
190
191
  [`${this.getNavigationButtonClass(Status.HIDDEN)}`]: this.tabHasGivenStatus(tab, Status.HIDDEN),
191
- }, tabindex: this.tabHasGivenStatus(tab, Status.ACTIVE) ? 0 : -1, "aria-selected": this.tabHasGivenStatus(tab, Status.ACTIVE).toString(), "aria-controls": this.getElementId(this.tabPanel, index), onClick: this.handleClick, onKeyDown: this.handleKeydown, "data-index": this.getTabIndex(index), disabled: this.tabHasGivenStatus(tab, Status.DISABLED) }, tab.icon !== undefined && h("mg-icon", { icon: tab.icon }), tab.label, tab.badge !== undefined && h("mg-badge", { variant: "info", value: tab.badge.value, label: tab.badge.label }))))), this.tabs.map((tab, index) => (h("article", { role: "tabpanel", id: this.getElementId(this.tabPanel, index), hidden: !this.tabHasGivenStatus(tab, Status.ACTIVE), "aria-labelledby": this.getElementId(this.identifier, index), tabindex: this.tabHasGivenStatus(tab, Status.ACTIVE) ? 0 : -1, class: "mg-tabs__content-container" }, h("slot", { name: this.getElementId('tab_content', index) }))))));
192
+ }, tabindex: this.tabHasGivenStatus(tab, Status.ACTIVE) ? 0 : -1, "aria-selected": this.tabHasGivenStatus(tab, Status.ACTIVE).toString(), "aria-controls": this.getElementId(this.tabPanel, index), onClick: this.handleClick, onKeyDown: this.handleKeydown, "data-index": this.getTabIndex(index), disabled: this.tabHasGivenStatus(tab, Status.DISABLED) }, tab.icon !== undefined && h("mg-icon", { icon: tab.icon }), tab.label, tab.badge !== undefined && h("mg-badge", { variant: tab.status !== Status.ACTIVE ? 'primary' : 'info', value: tab.badge.value, label: tab.badge.label }))))), this.tabs.map((tab, index) => (h("article", { role: "tabpanel", id: this.getElementId(this.tabPanel, index), hidden: !this.tabHasGivenStatus(tab, Status.ACTIVE), "aria-labelledby": this.getElementId(this.identifier, index), tabindex: this.tabHasGivenStatus(tab, Status.ACTIVE) ? 0 : -1, class: "mg-tabs__content-container" }, h("slot", { name: this.getElementId('tab_content', index) }))))));
192
193
  }
193
194
  static get is() { return "mg-tabs"; }
194
195
  static get encapsulation() { return "shadow"; }
@@ -243,9 +244,14 @@ export class MgTabs {
243
244
  "type": "string",
244
245
  "mutable": false,
245
246
  "complexType": {
246
- "original": "string",
247
- "resolved": "string",
248
- "references": {}
247
+ "original": "SizeType",
248
+ "resolved": "\"large\" | \"regular\"",
249
+ "references": {
250
+ "SizeType": {
251
+ "location": "import",
252
+ "path": "./mg-tabs.conf"
253
+ }
254
+ }
249
255
  },
250
256
  "required": false,
251
257
  "optional": false,
@@ -10,7 +10,9 @@ const messages = { en, fr };
10
10
  */
11
11
  const getLocale = (element) => {
12
12
  var _a;
13
- return ((_a = element.closest('[lang]')) === null || _a === void 0 ? void 0 : _a.lang) || navigator.language || defaultLocale;
13
+ // validate locale
14
+ const closestLang = Intl.NumberFormat.supportedLocalesOf((_a = element.closest('[lang]')) === null || _a === void 0 ? void 0 : _a.lang);
15
+ return closestLang.length > 0 ? closestLang[0] : navigator.language || defaultLocale;
14
16
  };
15
17
  /**
16
18
  * Get Intl object
@@ -20,6 +20,13 @@
20
20
  https://jira.mgdis.fr/browse/PDA9-690
21
21
  */
22
22
 
23
+ /* App */
24
+ /* default color-info */
25
+ --mg-color-app-h: var(--color-info-h);
26
+ --mg-color-app-s: var(--color-info-s);
27
+ --mg-color-app-l: var(--color-info-l);
28
+ --mg-color-app-hsl: var(--mg-color-app-h), var(--mg-color-app-s), var(--mg-color-app-l);
29
+
23
30
  /* Neutral */
24
31
  /* #fefefe; */
25
32
  /* rgb(254, 254, 254); */
@@ -173,9 +180,10 @@
173
180
  --mg-panel-box-shadow: var(--box-shadow);
174
181
  --mg-panel-content-padding: 1.5rem;
175
182
 
176
- /*
183
+ /*
177
184
  <mg-illustrated-message>
178
185
  */
186
+
179
187
  --mg-illustrated-message-padding-vertical: 4rem;
180
188
 
181
189
  /*
@@ -230,4 +238,18 @@
230
238
  <mg-input-radio>
231
239
  */
232
240
  --mg-input-check-size: 1.3rem;
241
+
242
+ /*
243
+ <mg-menu-item>
244
+ */
245
+ --mg-menu-item-focused-background-color-hsl: var(--mg-color-app-hsl);
246
+ --mg-menu-item-border-color-active-hsl: var(--mg-color-app-hsl);
247
+ --mg-menu-item-color-active-hsl: var(--mg-color-app-hsl);
248
+
249
+ /*
250
+ <mg-tabs>
251
+ */
252
+ --mg-tabs-focused-background-color-hsl: var(--mg-color-app-hsl);
253
+ --mg-tabs-border-color-active-hsl: var(--mg-color-app-hsl);
254
+ --mg-tabs-color-active-hsl: var(--mg-color-app-hsl);
233
255
  }
@@ -18,6 +18,8 @@ export { MgInputText as MgInputText } from '../types/components/molecules/inputs
18
18
  export { MgInputTextarea as MgInputTextarea } from '../types/components/molecules/inputs/mg-input-textarea/mg-input-textarea';
19
19
  export { MgInputTitle as MgInputTitle } from '../types/components/atoms/mg-input-title/mg-input-title';
20
20
  export { MgInputToggle as MgInputToggle } from '../types/components/molecules/inputs/mg-input-toggle/mg-input-toggle';
21
+ export { MgMenu as MgMenu } from '../types/components/molecules/menu/mg-menu/mg-menu';
22
+ export { MgMenuItem as MgMenuItem } from '../types/components/molecules/menu/mg-menu-item/mg-menu-item';
21
23
  export { MgMessage as MgMessage } from '../types/components/molecules/mg-message/mg-message';
22
24
  export { MgModal as MgModal } from '../types/components/molecules/mg-modal/mg-modal';
23
25
  export { MgPagination as MgPagination } from '../types/components/molecules/mg-pagination/mg-pagination';
@@ -18,6 +18,8 @@ export { MgInputText, defineCustomElement as defineCustomElementMgInputText } fr
18
18
  export { MgInputTextarea, defineCustomElement as defineCustomElementMgInputTextarea } from './mg-input-textarea.js';
19
19
  export { MgInputTitle, defineCustomElement as defineCustomElementMgInputTitle } from './mg-input-title.js';
20
20
  export { MgInputToggle, defineCustomElement as defineCustomElementMgInputToggle } from './mg-input-toggle.js';
21
+ export { MgMenu, defineCustomElement as defineCustomElementMgMenu } from './mg-menu.js';
22
+ export { MgMenuItem, defineCustomElement as defineCustomElementMgMenuItem } from './mg-menu-item.js';
21
23
  export { MgMessage, defineCustomElement as defineCustomElementMgMessage } from './mg-message.js';
22
24
  export { MgModal, defineCustomElement as defineCustomElementMgModal } from './mg-modal.js';
23
25
  export { MgPagination, defineCustomElement as defineCustomElementMgPagination } from './mg-pagination.js';
@@ -128,7 +128,9 @@ const messages = { en, fr };
128
128
  */
129
129
  const getLocale = (element) => {
130
130
  var _a;
131
- return ((_a = element.closest('[lang]')) === null || _a === void 0 ? void 0 : _a.lang) || navigator.language || defaultLocale;
131
+ // validate locale
132
+ const closestLang = Intl.NumberFormat.supportedLocalesOf((_a = element.closest('[lang]')) === null || _a === void 0 ? void 0 : _a.lang);
133
+ return closestLang.length > 0 ? closestLang[0] : navigator.language || defaultLocale;
132
134
  };
133
135
  /**
134
136
  * Get Intl object
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface MgMenuItem extends Components.MgMenuItem, HTMLElement {}
4
+ export const MgMenuItem: {
5
+ prototype: MgMenuItem;
6
+ new (): MgMenuItem;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;
@@ -0,0 +1,273 @@
1
+ import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client';
2
+ import { C as ClassList } from './components.utils.js';
3
+ import { D as Direction } from './mg-menu.conf.js';
4
+ import { d as defineCustomElement$2 } from './mg-icon2.js';
5
+
6
+ /**
7
+ * Available menu-item positions
8
+ */
9
+ var ElementPosition;
10
+ (function (ElementPosition) {
11
+ ElementPosition["FIRST"] = "first";
12
+ ElementPosition["LAST"] = "last";
13
+ })(ElementPosition || (ElementPosition = {}));
14
+ /**
15
+ * Available menu item status
16
+ */
17
+ var Status;
18
+ (function (Status) {
19
+ Status["VISIBLE"] = "visible";
20
+ Status["HIDDEN"] = "hidden";
21
+ Status["DISABLED"] = "disabled";
22
+ Status["ACTIVE"] = "active";
23
+ })(Status || (Status = {}));
24
+ /**
25
+ * List of all possibles sizes
26
+ */
27
+ const sizes = ['regular', 'medium', 'large'];
28
+
29
+ const mgMenuItemCss = ".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}.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:1.3rem}.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:1.5rem 3rem}.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:1.5rem}.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(1.5rem - 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:2.5rem 4rem}.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:1.5rem}.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(2.5rem - 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: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;cursor:pointer}.mg-menu-item__navigation-button:disabled,.mg-menu-item__navigation-button--disabled{cursor:default;opacity:30%}.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:not(.mg-menu-item__navigation-button--disabled){background-color:hsla(var(--mg-menu-item-focused-background-color-hsl), 10%)}.mg-menu-item__navigation-button.mg-menu-item__navigation-button--active{color:hsl(var(--mg-menu-item-color-active-hsl));font-weight:700}.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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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(.mg-menu-item--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}:host(.mg-menu-item--last) .mg-menu-item__collapse-container{left:unset;right:0}:host(.mg-menu-item--vertical){flex-direction:column}:host(.mg-menu-item--vertical) .mg-menu-item__collapse-container{left:unset;top:unset;position:unset;width:unset}:host(.mg-menu-item--vertical) .mg-menu-item-chevron{margin-left:auto}:host(.mg-menu-item--horizontal) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level{box-shadow:var(--box-shadow);background-color:hsl(var(--color-light))}:host(.mg-menu-item--horizontal) .mg-menu-item__collapse-container.mg-menu-item__collapse-container--first-level ::slotted(mg-menu){padding:1rem 0}.mg-menu-item{max-width:var(--mg-menu-item-navigation-button-max-width)}.mg-menu-item__collapse-container{position:absolute;top:100%;left:0;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}.mg-menu-item__navigation-button-text-content ::slotted([slot=information]){margin-left:1rem}.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}";
30
+
31
+ const MgMenuItem$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
32
+ constructor() {
33
+ super();
34
+ this.__registerHost();
35
+ this.__attachShadow();
36
+ /************
37
+ * Internal *
38
+ ************/
39
+ this.name = 'mg-menu-item';
40
+ this.navigationButton = `${this.name}__navigation-button`;
41
+ /**
42
+ * Define menu-item status. Default: "visible"
43
+ */
44
+ this.status = Status.VISIBLE;
45
+ /**
46
+ * Define menu-item size. Default: "large".
47
+ */
48
+ this.size = 'large';
49
+ /**
50
+ * Define menu-item content expanded. Default: false.
51
+ */
52
+ this.expanded = false;
53
+ /************
54
+ * States *
55
+ ************/
56
+ /**
57
+ * Component classes
58
+ */
59
+ this.classList = new ClassList([this.name]);
60
+ /**
61
+ * Component button classes
62
+ */
63
+ this.navigationButtonClassList = new ClassList([this.navigationButton]);
64
+ /**
65
+ * Does component have children. Default: false.
66
+ */
67
+ this.hasChildren = false;
68
+ /************
69
+ * Methods *
70
+ ************/
71
+ /**
72
+ * Toggle expanded prop value
73
+ *
74
+ * @returns {void}
75
+ */
76
+ this.toggleExpanded = () => {
77
+ this.expanded = !this.expanded;
78
+ };
79
+ /**
80
+ * Does an HTMLElement contain child with given Status
81
+ *
82
+ * @param {HTMLElement} element to parse
83
+ * @param {MgMenuItem['status']} status to check
84
+ * @returns {boolean} true if element with status is found
85
+ */
86
+ this.hasChildElementStatus = (element, status) => element.querySelector(`${this.name}[status="${status}"]`) !== null;
87
+ /**
88
+ * Is component contextual direction match the given direction
89
+ *
90
+ * @param {MgMenuItem['direction']} direction in parent menu
91
+ * @returns {boolean} true is direction match the direction propertie
92
+ */
93
+ this.isdirection = (direction) => this.direction === direction;
94
+ /************
95
+ * Handlers *
96
+ ************/
97
+ /**
98
+ * Handle interacrtive element click
99
+ *
100
+ * @param {MouseEvent} event click on element
101
+ * @returns {void}
102
+ */
103
+ this.handleElementCLick = (event) => {
104
+ event.preventDefault();
105
+ if (this.hasChildren)
106
+ this.toggleExpanded();
107
+ };
108
+ }
109
+ validateStatus(newValue, oldValue) {
110
+ if (oldValue !== undefined) {
111
+ this.navigationButtonClassList.delete(`${this.navigationButton}--${oldValue}`);
112
+ }
113
+ this.navigationButtonClassList.add(`${this.navigationButton}--${newValue}`);
114
+ }
115
+ validateSize(newValue, oldValue) {
116
+ if (!sizes.includes(newValue)) {
117
+ throw new Error(`<${this.name}> prop "size" must be one of : ${sizes.join(', ')}.`);
118
+ }
119
+ this.navigationButtonClassList.delete(`${this.navigationButton}--size-${oldValue}`);
120
+ this.navigationButtonClassList.add(`${this.navigationButton}--size-${newValue}`);
121
+ }
122
+ validateExpanded(newValue) {
123
+ if (typeof newValue !== 'boolean')
124
+ throw new Error(`<${this.name}> prop "expanded" must be a boolean.`);
125
+ // if menu-item has sub-menu we have to apply some updates:
126
+ if (this.hasChildren) {
127
+ const subItems = Array.from(this.element.querySelectorAll(this.name));
128
+ if (!newValue) {
129
+ // - when main menu item is NOT expanded we need NOT expanded sub-items and NOT expanded sub-content
130
+ subItems.forEach(item => {
131
+ item.expanded = false;
132
+ });
133
+ }
134
+ else if (newValue && this.hasChildElementStatus(this.element, Status.ACTIVE)) {
135
+ // - when expanded and contain an active item parents are expended too
136
+ subItems.forEach(item => {
137
+ if (this.hasChildElementStatus(item, Status.ACTIVE)) {
138
+ item.expanded = true;
139
+ }
140
+ });
141
+ }
142
+ }
143
+ }
144
+ validateHasChildren(newValue) {
145
+ if (newValue && this.element.href !== undefined) {
146
+ throw new Error(`<${this.name}> prop "href" is unauthorizied when element is a parent.`);
147
+ }
148
+ }
149
+ /*************
150
+ * Lifecycle *
151
+ *************/
152
+ /**
153
+ * Validate props
154
+ *
155
+ * @returns {void}
156
+ */
157
+ componentWillLoad() {
158
+ // has children items that is NOT [slot="illustration"] || [slot="information"] element
159
+ // we store only matching elements
160
+ this.hasChildren = Array.from(this.element.children).filter(child => !['illustration', 'information', 'label', 'metadata'].includes(child.getAttribute('slot'))).length > 0;
161
+ // Validate props
162
+ this.validateSize(this.size);
163
+ this.validateStatus(this.status);
164
+ this.validateExpanded(this.expanded);
165
+ }
166
+ /**
167
+ * Check if component slots configuration
168
+ *
169
+ * @returns {ReturnType<typeof setTimeout>} timeout
170
+ */
171
+ componentDidLoad() {
172
+ // slot title AND metadata validation
173
+ // add title on label AND metada slots due to text-overflow on these element
174
+ if (Array.from(this.element.children).find(child => child.getAttribute('slot') === 'label') === undefined)
175
+ throw new Error(`<${this.name}> slot "label" is required.`);
176
+ ['label', 'metadata'].forEach(slot => {
177
+ Array.from(this.element.querySelectorAll(`[slot="${slot}"]`)).forEach(element => {
178
+ if (element.textContent.trim().length < 1)
179
+ throw new Error(`<${this.name}> slot "${slot}" must have text content.`);
180
+ if (element.getAttribute('title') === null)
181
+ element.setAttribute('title', element.textContent);
182
+ });
183
+ });
184
+ // update props and states after componentDidLoad hook
185
+ // return a promise to process action only in the FIRST render().
186
+ // https://stenciljs.com/docs/component-lifecycle#componentwillload
187
+ return setTimeout(() => {
188
+ var _a, _b;
189
+ // define menu-item context states
190
+ if (this.element.parentElement.nodeName === 'MG-MENU') {
191
+ this.direction = this.element.parentElement.direction;
192
+ }
193
+ this.isInMainMenu = this.element.parentElement.className.includes('mg-menu-item') === false;
194
+ const hasNextMenuItem = ((_a = this.element.nextElementSibling) === null || _a === void 0 ? void 0 : _a.nodeName) === 'MG-MENU-ITEM';
195
+ const hasPreviousMenuItem = ((_b = this.element.previousElementSibling) === null || _b === void 0 ? void 0 : _b.nodeName) === 'MG-MENU-ITEM';
196
+ // manage last menu item
197
+ if (!hasNextMenuItem && hasPreviousMenuItem && this.isdirection(Direction.HORIZONTAL)) {
198
+ this.classList.add(`${this.name}--${ElementPosition.LAST}`);
199
+ }
200
+ // when main menu item contain an active item it will get the active style
201
+ // AND if item is in vertical menu it will be expanded
202
+ if (this.isInMainMenu && this.hasChildElementStatus(this.element, Status.ACTIVE)) {
203
+ this.status = Status.ACTIVE;
204
+ this.expanded = this.direction === Direction.VERTICAL;
205
+ }
206
+ // manage menu items style depending to parent menu horientation
207
+ this.classList.add(`${this.name}--${this.direction}`);
208
+ this.navigationButtonClassList.add(`${this.navigationButton}--${this.direction}`);
209
+ // manage child items level
210
+ const childItems = Array.from(this.element.querySelectorAll('mg-menu-item'));
211
+ childItems.forEach(item => {
212
+ if (this.direction === Direction.VERTICAL) {
213
+ const itemLevel = Number(item.getAttribute('data-level')) || 1;
214
+ item.setAttribute('data-level', `${itemLevel + 1}`);
215
+ }
216
+ });
217
+ }, 0);
218
+ }
219
+ /**
220
+ * Render
221
+ *
222
+ * @returns {HTMLElement} HTML Element
223
+ */
224
+ render() {
225
+ const TagName = this.href !== undefined ? 'a' : 'button';
226
+ 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: {
227
+ [`${this.navigationButton}-chevron`]: true,
228
+ [`${this.navigationButton}-chevron--rotate`]: this.expanded === true,
229
+ } }, 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))));
230
+ }
231
+ get element() { return this; }
232
+ static get watchers() { return {
233
+ "status": ["validateStatus"],
234
+ "size": ["validateSize"],
235
+ "expanded": ["validateExpanded"],
236
+ "hasChildren": ["validateHasChildren"]
237
+ }; }
238
+ static get style() { return mgMenuItemCss; }
239
+ }, [1, "mg-menu-item", {
240
+ "href": [1],
241
+ "status": [1537],
242
+ "size": [1],
243
+ "expanded": [1028],
244
+ "classList": [32],
245
+ "navigationButtonClassList": [32],
246
+ "direction": [32],
247
+ "isInMainMenu": [32],
248
+ "hasChildren": [32]
249
+ }]);
250
+ function defineCustomElement$1() {
251
+ if (typeof customElements === "undefined") {
252
+ return;
253
+ }
254
+ const components = ["mg-menu-item", "mg-icon"];
255
+ components.forEach(tagName => { switch (tagName) {
256
+ case "mg-menu-item":
257
+ if (!customElements.get(tagName)) {
258
+ customElements.define(tagName, MgMenuItem$1);
259
+ }
260
+ break;
261
+ case "mg-icon":
262
+ if (!customElements.get(tagName)) {
263
+ defineCustomElement$2();
264
+ }
265
+ break;
266
+ } });
267
+ }
268
+ defineCustomElement$1();
269
+
270
+ const MgMenuItem = MgMenuItem$1;
271
+ const defineCustomElement = defineCustomElement$1;
272
+
273
+ export { MgMenuItem, defineCustomElement };
@@ -0,0 +1,10 @@
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
+ export { Direction as D };
@@ -0,0 +1,11 @@
1
+ import type { Components, JSX } from "../types/components";
2
+
3
+ interface MgMenu extends Components.MgMenu, HTMLElement {}
4
+ export const MgMenu: {
5
+ prototype: MgMenu;
6
+ new (): MgMenu;
7
+ };
8
+ /**
9
+ * Used to define this component and all nested components recursively.
10
+ */
11
+ export const defineCustomElement: () => void;