@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,212 @@
1
+ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
+ import { c as createID, C as ClassList, g as getWindows, i as isTagName } from './components.utils.js';
3
+ import { i as initLocales } from './index2.js';
4
+ import { d as defineCustomElement$3 } from './mg-button2.js';
5
+ import { d as defineCustomElement$2 } from './mg-card2.js';
6
+ import { d as defineCustomElement$1 } from './mg-icon2.js';
7
+ import { c as createPopper } from './popper.js';
8
+
9
+ const mgPopoverCss = ":host{--mg-card-padding:var(--mg-popover-padding-vertical, 1.5rem) var(--mg-popover-padding-horizontal, var(--mg-popover-padding-vertical, 1.5rem));--mg-card-border:none;--mg-card-border-radius:0.5rem;--mg-card-background:hsl(var(--mg-popover-background-color));position:relative;display:contents}:host::slotted(*){display:inline-block}.mg-popover{display:none;padding:1rem;z-index:2000;color:hsl(var(--mg-popover-font-color))}.mg-popover mg-card{position:relative;z-index:-1}.mg-popover[data-show]{display:block}.mg-popover mg-button{float:right;margin-right:calc(0rem - (var(--default-size) - var(--mg-icon-regular-size)) / 2);margin-top:calc(0rem - (var(--default-size) - var(--mg-popover-title-font-size) * var(--line-height)) / 2);margin-left:3rem}.mg-popover__arrow{position:absolute;visibility:hidden;width:calc(3rem + 2 * var(--mg-card-border-radius) + 2rem);height:calc(3rem + 2 * var(--mg-card-border-radius) + 2rem)}.mg-popover__arrow:before{visibility:visible;content:\"\";position:absolute}.mg-popover[data-popper-placement^=top]>.mg-popover__arrow,.mg-popover[data-popper-placement^=bottom]>.mg-popover__arrow{height:1rem}.mg-popover[data-popper-placement^=top]>.mg-popover__arrow:before,.mg-popover[data-popper-placement^=bottom]>.mg-popover__arrow:before{left:calc(var(--mg-card-border-radius) + 1rem);border-right:calc(3rem / 2) solid transparent;border-left:calc(3rem / 2) solid transparent}.mg-popover[data-popper-placement^=top]>.mg-popover__arrow{bottom:0.1rem;filter:drop-shadow(0 0.5rem 0.25rem hsl(var(--color-dark), 0.15))}.mg-popover[data-popper-placement^=top]>.mg-popover__arrow:before{border-top:1rem solid hsl(var(--mg-popover-background-color))}.mg-popover[data-popper-placement^=bottom]>.mg-popover__arrow{top:0.1rem;filter:drop-shadow(0 -0.5rem 0.25rem hsl(var(--color-dark), 0.15))}.mg-popover[data-popper-placement^=bottom]>.mg-popover__arrow:before{border-bottom:1rem solid hsl(var(--mg-popover-background-color))}.mg-popover[data-popper-placement^=left]>.mg-popover__arrow,.mg-popover[data-popper-placement^=right]>.mg-popover__arrow{width:1rem}.mg-popover[data-popper-placement^=left]>.mg-popover__arrow:before,.mg-popover[data-popper-placement^=right]>.mg-popover__arrow:before{top:calc(var(--mg-card-border-radius) + 1rem);border-top:calc(3rem / 2) solid transparent;border-bottom:calc(3rem / 2) solid transparent}.mg-popover[data-popper-placement^=left]>.mg-popover__arrow{right:0.1rem;filter:drop-shadow(0.5rem 0 0.25rem hsl(var(--color-dark), 0.15))}.mg-popover[data-popper-placement^=left]>.mg-popover__arrow:before{border-left:1rem solid hsl(var(--mg-popover-background-color))}.mg-popover[data-popper-placement^=right]>.mg-popover__arrow{left:0.1rem;filter:drop-shadow(-0.5rem 0 0.25rem hsl(var(--color-dark), 0.15))}.mg-popover[data-popper-placement^=right]>.mg-popover__arrow:before{border-right:1rem solid hsl(var(--mg-popover-background-color))}.mg-popover[data-popper-placement^=left-start],.mg-popover[data-popper-placement^=left-end],.mg-popover[data-popper-placement^=right-start],.mg-popover[data-popper-placement^=right-end]{padding:0 1rem}.mg-popover[data-popper-placement^=left-start]>.mg-popover__arrow,.mg-popover[data-popper-placement^=left-end]>.mg-popover__arrow,.mg-popover[data-popper-placement^=right-start]>.mg-popover__arrow,.mg-popover[data-popper-placement^=right-end]>.mg-popover__arrow{height:calc(3rem + 2 * var(--mg-card-border-radius))}.mg-popover[data-popper-placement^=left-start]>.mg-popover__arrow:before,.mg-popover[data-popper-placement^=left-end]>.mg-popover__arrow:before,.mg-popover[data-popper-placement^=right-start]>.mg-popover__arrow:before,.mg-popover[data-popper-placement^=right-end]>.mg-popover__arrow:before{top:var(--mg-card-border-radius)}.mg-popover__title ::slotted([slot=title]){margin:0 0 1rem !important;font-size:var(--mg-popover-title-font-size) !important;font-weight:600}.mg-popover--arrow-hide.mg-popover[data-popper-placement^=top]{padding-bottom:0}.mg-popover--arrow-hide.mg-popover[data-popper-placement^=bottom]{padding-top:0}.mg-popover--arrow-hide.mg-popover[data-popper-placement$=end],.mg-popover--arrow-hide.mg-popover[data-popper-placement^=left]{padding-right:0}.mg-popover--arrow-hide.mg-popover[data-popper-placement$=start],.mg-popover--arrow-hide.mg-popover[data-popper-placement^=right]{padding-left:0}.mg-popover ::slotted(*){--mg-card-border:var(--mg-card-border-default);--mg-card-padding:var(--mg-card-padding-default);--mg-card-border-radius:var(--mg-card-border-radius-default);--mg-card-background:var(--mg-card-background-default);--mg-card-box-shadow:var(--mg-card-box-shadow-default)}";
10
+
11
+ const MgPopover = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
12
+ constructor() {
13
+ super();
14
+ this.__registerHost();
15
+ this.__attachShadow();
16
+ this.displayChange = createEvent(this, "display-change", 7);
17
+ this.closeButtonId = '';
18
+ // Classes
19
+ this.classArrowHide = `mg-popover--arrow-hide`;
20
+ /**
21
+ * Check if clicked outside of component
22
+ *
23
+ * @param {MouseEvent} event mouse event
24
+ * @returns {void}
25
+ */
26
+ this.clickOutside = (event) => {
27
+ if (!this.disabled && event.target.closest(`mg-popover`) !== this.element) {
28
+ this.display = false;
29
+ }
30
+ };
31
+ /**
32
+ * Show popover
33
+ *
34
+ * @returns {void}
35
+ */
36
+ this.show = () => {
37
+ // Make the popover visible
38
+ this.popover.setAttribute('data-show', '');
39
+ // Enable the event listeners
40
+ this.popper.setOptions(options => (Object.assign(Object.assign({}, options), { modifiers: [...options.modifiers, { name: 'eventListeners', enabled: true }] })));
41
+ // Update its position
42
+ this.popper.update();
43
+ // hide when click outside
44
+ // setTimeout is used to prevent event to trigger after creation
45
+ setTimeout(() => {
46
+ this.windows.forEach((localWindow) => {
47
+ localWindow.addEventListener('click', this.clickOutside, false);
48
+ });
49
+ }, 0);
50
+ };
51
+ /**
52
+ * Hide popover
53
+ *
54
+ * @returns {void}
55
+ */
56
+ this.hide = () => {
57
+ // Hide the popover
58
+ this.popover.removeAttribute('data-show');
59
+ // Disable the event listeners
60
+ this.popper.setOptions(options => (Object.assign(Object.assign({}, options), { modifiers: [...options.modifiers, { name: 'eventListeners', enabled: false }] })));
61
+ // Remove event listener
62
+ this.windows.forEach((localWindow) => {
63
+ localWindow.removeEventListener('click', this.clickOutside, false);
64
+ });
65
+ };
66
+ /**
67
+ * Handle action for close button
68
+ *
69
+ * @returns {void}
70
+ */
71
+ this.handleCloseButton = () => {
72
+ this.display = false;
73
+ };
74
+ this.identifier = createID('mg-popover');
75
+ this.placement = 'bottom';
76
+ this.arrowHide = false;
77
+ this.closeButton = false;
78
+ this.display = false;
79
+ this.disabled = false;
80
+ this.classList = new ClassList(['mg-popover']);
81
+ }
82
+ validateArrowHide(newValue) {
83
+ if (newValue)
84
+ this.classList.add(this.classArrowHide);
85
+ else
86
+ this.classList.delete(this.classArrowHide);
87
+ }
88
+ handleDisplay(newValue) {
89
+ if (newValue) {
90
+ this.show();
91
+ }
92
+ else {
93
+ this.hide();
94
+ }
95
+ this.displayChange.emit(newValue);
96
+ }
97
+ /*************
98
+ * Lifecycle *
99
+ *************/
100
+ /**
101
+ * Check if component props are well configured on init
102
+ *
103
+ * @returns {void} timeout
104
+ */
105
+ componentWillLoad() {
106
+ // Get windows to attach events
107
+ this.windows = getWindows(window);
108
+ // Get locales
109
+ this.messages = initLocales(this.element).messages;
110
+ this.validateArrowHide(this.arrowHide);
111
+ }
112
+ /**
113
+ * Check if component props are well configured on init
114
+ *
115
+ * @returns {void}
116
+ */
117
+ componentDidLoad() {
118
+ const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
119
+ const slottedTitleElement = this.element.querySelector('[slot="title"]');
120
+ if (slottedTitleElement && !isTagName(slottedTitleElement, headingTags)) {
121
+ throw new Error(`<mg-popover> Slotted title must be a heading: ${headingTags.join(', ')}`);
122
+ }
123
+ // Set close button id
124
+ if (this.closeButton) {
125
+ this.closeButtonId = `${this.identifier}-close-button`;
126
+ }
127
+ // Get popover content
128
+ this.popover = this.element.shadowRoot.getElementById(this.identifier);
129
+ //Get interactive element (first element without slot attribute)
130
+ const interactiveElement = this.element.querySelector(':not([slot])');
131
+ // Add aria attributes
132
+ interactiveElement.setAttribute('aria-controls', this.identifier);
133
+ interactiveElement.setAttribute('aria-expanded', `${this.display}`);
134
+ // Create popperjs popover
135
+ this.popper = createPopper(interactiveElement, this.popover, {
136
+ placement: this.placement,
137
+ strategy: 'fixed',
138
+ modifiers: [
139
+ {
140
+ name: 'offset',
141
+ options: {
142
+ offset: [0, 0],
143
+ },
144
+ },
145
+ ],
146
+ });
147
+ // Add events to toggle display
148
+ interactiveElement.addEventListener('click', () => {
149
+ if (!this.disabled)
150
+ this.display = !this.display;
151
+ });
152
+ // Add events to hide popover
153
+ this.element.addEventListener('keydown', e => {
154
+ if (!this.disabled && e.code === 'Escape')
155
+ this.display = false;
156
+ });
157
+ this.handleDisplay(this.display);
158
+ }
159
+ /**
160
+ * Render
161
+ *
162
+ * @returns {HTMLElement} HTML Element
163
+ */
164
+ render() {
165
+ return (h(Host, null, h("slot", null), h("div", { id: this.identifier, class: this.classList.join() }, h("mg-card", null, this.closeButton && (h("mg-button", { identifier: this.closeButtonId, "is-icon": true, variant: "flat", label: this.messages.general.close, onClick: this.handleCloseButton }, h("mg-icon", { icon: "cross" }))), h("div", { class: "mg-popover__title" }, h("slot", { name: "title" })), h("slot", { name: "content" })), !this.arrowHide && h("div", { class: "mg-popover__arrow", "data-popper-arrow": true }))));
166
+ }
167
+ get element() { return this; }
168
+ static get watchers() { return {
169
+ "arrowHide": ["validateArrowHide"],
170
+ "display": ["handleDisplay"]
171
+ }; }
172
+ static get style() { return mgPopoverCss; }
173
+ }, [1, "mg-popover", {
174
+ "identifier": [1],
175
+ "placement": [1],
176
+ "arrowHide": [4, "arrow-hide"],
177
+ "closeButton": [4, "close-button"],
178
+ "display": [1028],
179
+ "disabled": [1028],
180
+ "classList": [32]
181
+ }]);
182
+ function defineCustomElement() {
183
+ if (typeof customElements === "undefined") {
184
+ return;
185
+ }
186
+ const components = ["mg-popover", "mg-button", "mg-card", "mg-icon"];
187
+ components.forEach(tagName => { switch (tagName) {
188
+ case "mg-popover":
189
+ if (!customElements.get(tagName)) {
190
+ customElements.define(tagName, MgPopover);
191
+ }
192
+ break;
193
+ case "mg-button":
194
+ if (!customElements.get(tagName)) {
195
+ defineCustomElement$3();
196
+ }
197
+ break;
198
+ case "mg-card":
199
+ if (!customElements.get(tagName)) {
200
+ defineCustomElement$2();
201
+ }
202
+ break;
203
+ case "mg-icon":
204
+ if (!customElements.get(tagName)) {
205
+ defineCustomElement$1();
206
+ }
207
+ break;
208
+ } });
209
+ }
210
+ defineCustomElement();
211
+
212
+ export { MgPopover as M, defineCustomElement as d };
@@ -1,4 +1,4 @@
1
- import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client';
1
+ import { proxyCustomElement, HTMLElement, createEvent, h } from '@stencil/core/internal/client';
2
2
  import { i as initLocales } from './index2.js';
3
3
 
4
4
  const mgSkipLinksCss = ".mg-skip-links{position:absolute;transform:translateY(-100%);opacity:0;background:hsl(var(--color-light))}.mg-skip-links:focus-within{position:relative;transform:translateY(0);opacity:1}.mg-skip-links__list{display:flex;flex-wrap:wrap;align-items:center;gap:0.6rem;margin:0;padding:0.64rem 1.8rem;list-style:none}.mg-skip-links__link{display:inline-block;padding:1.2rem;color:hsl(var(--color-dark))}.mg-skip-links__link:hover{background:hsl(var(--color-dark), 0.1)}";
@@ -8,6 +8,20 @@ const MgSkipLinks$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement
8
8
  super();
9
9
  this.__registerHost();
10
10
  this.__attachShadow();
11
+ this.goToAnchor = createEvent(this, "go-to-anchor", 7);
12
+ /***********
13
+ * Methods *
14
+ **********/
15
+ /**
16
+ * Handle link click and emit go-to-anchor event
17
+ *
18
+ * @param {MouseEvent} event mouse event
19
+ * @returns {void}
20
+ */
21
+ this.handleLinkCLick = (event) => {
22
+ event.currentTarget.blur();
23
+ this.goToAnchor.emit(event.currentTarget.getAttribute('href'));
24
+ };
11
25
  this.links = undefined;
12
26
  }
13
27
  validateLinks(links) {
@@ -35,7 +49,7 @@ const MgSkipLinks$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement
35
49
  * @returns {HTMLElement} HTML Element
36
50
  */
37
51
  render() {
38
- return (h("nav", { class: "mg-skip-links", role: "navigation", "aria-label": this.messages.skipLinks.navLabel }, h("ul", { class: "mg-skip-links__list" }, this.links.map(link => (h("li", null, h("a", { class: "mg-skip-links__link", href: link.href }, link.label)))))));
52
+ return (h("nav", { class: "mg-skip-links", role: "navigation", "aria-label": this.messages.skipLinks.navLabel }, h("ul", { class: "mg-skip-links__list" }, this.links.map(link => (h("li", null, h("a", { class: "mg-skip-links__link", href: link.href, onClick: this.handleLinkCLick }, link.label)))))));
39
53
  }
40
54
  get element() { return this; }
41
55
  static get watchers() { return {
@@ -18,7 +18,7 @@ var Status;
18
18
  */
19
19
  const sizes = ['regular', 'large'];
20
20
 
21
- const mgTabsCss = ".mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular{padding:1rem 2rem}.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button,.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button ::slotted([slot=label]),.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button ::slotted([slot=metadata]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular ::slotted([slot=label]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular ::slotted([slot=metadata]){font-size:1.3rem}.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular.mg-tabs__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular.mg-tabs__navigation-button--vertical{padding-left:calc(2rem - 0.3rem)}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large{padding:1.5rem 3rem}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button,.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button ::slotted([slot=label]),.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button ::slotted([slot=metadata]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large ::slotted([slot=label]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large ::slotted([slot=metadata]){font-size:1.5rem}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large.mg-tabs__navigation-button--horizontal{padding-bottom:calc(1.5rem - 0.3rem)}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large.mg-tabs__navigation-button--vertical{padding-left:calc(3rem - 0.3rem)}.mg-tabs__navigation-button{display:flex;align-items:center;column-gap:1rem;background-color:unset;border:none;font-family:var(--font-family);color:hsl(var(--mg-tabs-color-hsl, var(--color-dark)));line-height:var(--line-height);text-decoration:none;cursor:pointer}.mg-tabs__navigation-button:disabled,.mg-tabs__navigation-button--disabled{cursor:default;opacity:30%}.mg-tabs__navigation-button:focus-visible{z-index:10}.mg-tabs__navigation-button:hover:not(.mg-tabs__navigation-button--disabled),.mg-tabs__navigation-button:focus:not(.mg-tabs__navigation-button--disabled){background-color:hsla(var(--mg-tabs-focused-background-color-hsl), 10%)}.mg-tabs__navigation-button.mg-tabs__navigation-button--active{color:hsl(var(--mg-tabs-color-active-hsl));font-weight:700}.mg-tabs__navigation-button.mg-tabs__navigation-button--active.mg-tabs__navigation-button--horizontal{border-bottom-color:hsl(var(--mg-tabs-border-color-active-hsl))}.mg-tabs__navigation-button.mg-tabs__navigation-button--active.mg-tabs__navigation-button--vertical{border-left-color:hsl(var(--mg-tabs-border-color-active-hsl))}.mg-tabs__navigation-button.mg-tabs__navigation-button--hidden{display:none}.mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal{border-bottom:0.3rem solid transparent}.mg-tabs__navigation-button.mg-tabs__navigation-button--vertical{border-left:0.3rem solid transparent}.mg-tabs__header{display:flex;flex-direction:row;flex-wrap:wrap}.mg-tabs__content-container:focus-visible{outline:none}.mg-tabs__navigation-button-text{flex:0 0 content}";
21
+ const mgTabsCss = ".mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular{padding:1rem 2rem;height:calc()}.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button,.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button ::slotted([slot=label]),.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button ::slotted([slot=metadata]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular ::slotted([slot=label]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular ::slotted([slot=metadata]){font-size:var(--font-size)}.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular.mg-tabs__navigation-button--horizontal{padding-bottom:calc(1rem - 0.3rem)}.mg-tabs.mg-tabs--size-regular .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-regular.mg-tabs__navigation-button--vertical{padding-left:calc(2rem - 0.3rem)}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large{padding:1.5rem 3rem;height:calc()}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button,.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button ::slotted([slot=label]),.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button ::slotted([slot=metadata]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large ::slotted([slot=label]),.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large ::slotted([slot=metadata]){font-size:calc(var(--font-size) + 0.2rem)}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large.mg-tabs__navigation-button--horizontal{padding-bottom:calc(1.5rem - 0.3rem)}.mg-tabs.mg-tabs--size-large .mg-tabs__navigation-button.mg-tabs__navigation-button--vertical,.mg-tabs__navigation-button.mg-tabs__navigation-button--size-large.mg-tabs__navigation-button--vertical{padding-left:calc(3rem - 0.3rem)}.mg-tabs__navigation-button{display:flex;align-items:center;column-gap:var(--mg-tabs-navigation-button-column-gap, 1rem);background-color:unset;border:none;font-family:var(--font-family);color:hsl(var(--mg-tabs-color-hsl, var(--color-dark)));line-height:var(--line-height);text-decoration:none;white-space:nowrap;box-sizing:border-box;cursor:pointer}.mg-tabs__navigation-button:disabled,.mg-tabs__navigation-button--disabled{cursor:default;opacity:0.3}.mg-tabs__navigation-button:focus-visible{z-index:10}.mg-tabs__navigation-button:hover:not(.mg-tabs__navigation-button--disabled),.mg-tabs__navigation-button:focus-visible:not(.mg-tabs__navigation-button--disabled){background-color:hsl(var(--mg-tabs-focused-background-color-hsl), 0.1)}.mg-tabs__navigation-button.mg-tabs__navigation-button--active{color:hsl(var(--mg-tabs-color-active-hsl));font-weight:600}.mg-tabs__navigation-button.mg-tabs__navigation-button--active.mg-tabs__navigation-button--horizontal{border-bottom-color:hsl(var(--mg-tabs-border-color-active-hsl))}.mg-tabs__navigation-button.mg-tabs__navigation-button--active.mg-tabs__navigation-button--vertical{border-left-color:hsl(var(--mg-tabs-border-color-active-hsl))}.mg-tabs__navigation-button.mg-tabs__navigation-button--hidden{display:none}.mg-tabs__navigation-button.mg-tabs__navigation-button--horizontal{border-bottom:0.3rem solid transparent}.mg-tabs__navigation-button.mg-tabs__navigation-button--vertical{border-left:0.3rem solid transparent}.mg-tabs__header{display:flex;flex-direction:row;flex-wrap:wrap}.mg-tabs__content-container:focus-visible{outline:none}.mg-tabs__navigation-button-text{flex:0 0 content}";
22
22
 
23
23
  /**
24
24
  * type TabItem validation function
@@ -39,25 +39,7 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
39
39
  // classes
40
40
  this.tabPanel = 'panel';
41
41
  this.buttonTabBaseClass = 'mg-tabs__navigation-button';
42
- // variables
43
42
  this.startIndex = 1;
44
- /**
45
- * Method to set active tab
46
- *
47
- * @param {number} tabKey item tab key to set to ACTIVE status
48
- * @returns {void}
49
- */
50
- this.setActiveTab = (tabKey) => {
51
- // reset active tabs
52
- this.tabs.forEach(tab => {
53
- if (this.tabHasGivenStatus(tab, Status.ACTIVE))
54
- tab.status = Status.VISIBLE;
55
- });
56
- // set active tab from given tab key
57
- this.tabs[tabKey - this.startIndex].status = Status.ACTIVE;
58
- // emit change active tab key event
59
- this.activeTabChange.emit(tabKey);
60
- };
61
43
  /**
62
44
  * Method to know if given tab has the given status
63
45
  *
@@ -65,7 +47,7 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
65
47
  * @param {Status} status status to valide
66
48
  * @returns {boolean} status comparaison
67
49
  */
68
- this.tabHasGivenStatus = (tab, status) => tab.status === status;
50
+ this.tabHasStatus = (tab, status) => tab.status === status;
69
51
  /**
70
52
  * Method to get element id from index
71
53
  *
@@ -73,14 +55,20 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
73
55
  * @param {number} index to generate id
74
56
  * @returns {string} generated element id
75
57
  */
76
- this.getElementId = (element, index) => `${element}-${this.getTabIndex(index)}`;
58
+ this.getElementId = (element, index) => `${element}-${this.getTabItemIndex(index)}`;
77
59
  /**
78
- * Method to get tab index
60
+ * Method to get tab item index
79
61
  *
80
62
  * @param {number} index to get
81
63
  * @returns {number} index
82
64
  */
83
- this.getTabIndex = (index) => index + this.startIndex;
65
+ this.getTabItemIndex = (index) => index + this.startIndex;
66
+ /**
67
+ * Method to get the active-tab value
68
+ *
69
+ * @returns {number} of the active-tab
70
+ */
71
+ this.getActiveTab = () => this.activeTab || this.getTabItemIndex(this.tabs.map((tab, index) => (Object.assign(Object.assign({}, tab), { index }))).find(tab => this.tabHasStatus(tab, Status.ACTIVE)).index);
84
72
  /**
85
73
  * Handle click events on tabs
86
74
  *
@@ -88,16 +76,22 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
88
76
  */
89
77
  this.handleClick = (event) => {
90
78
  const tabId = event.currentTarget.getAttribute('data-index');
91
- this.activeTab = Number(tabId);
79
+ const tab = this.tabs[Number(tabId) - this.startIndex];
80
+ if (this.tabHasStatus(tab, Status.HIDDEN) || this.tabHasStatus(tab, Status.DISABLED)) {
81
+ event.preventDefault();
82
+ }
83
+ else {
84
+ this.activeTab = Number(tabId);
85
+ this.tabFocus = undefined;
86
+ }
92
87
  };
93
88
  /**
94
89
  * get navigation button class from given status
95
90
  *
96
91
  * @param {Status} status button tab status
97
- * @param {boolean} isSelector set if we need a CSS selector with the dot '.' at the begin. default value = false.
98
92
  * @returns {string} button class/selector variant
99
93
  */
100
- this.getNavigationButtonClass = (status, isSelector = false) => `${isSelector ? '.' : ''}${this.buttonTabBaseClass}--${status}`;
94
+ this.getNavigationButtonClass = (status) => `${this.buttonTabBaseClass}--${status}`;
101
95
  /**
102
96
  * Handle keyboard event on tabs
103
97
  *
@@ -105,37 +99,65 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
105
99
  * @returns {void}
106
100
  */
107
101
  this.handleKeydown = (event) => {
108
- let tabId = Number(event.target.getAttribute('data-index'));
109
102
  const parent = event.target.parentElement;
110
- // change selected id from key code
111
- if (event.key === 'ArrowRight') {
112
- tabId++;
113
- }
114
- else if (event.key === 'ArrowLeft') {
115
- tabId--;
103
+ if (['ArrowRight', 'ArrowLeft'].includes(event.key)) {
104
+ this.tabFocus = Number(event.target.getAttribute('data-index'));
105
+ parent.querySelector(`[data-index="${this.tabFocus}"]`).setAttribute('tabindex', '-1');
106
+ // Move right
107
+ if (event.key === 'ArrowRight') {
108
+ this.tabFocus++;
109
+ // If we're at the end, go to the start
110
+ if (this.tabFocus > this.tabs.length)
111
+ this.tabFocus = this.startIndex;
112
+ // Move left
113
+ }
114
+ else if (event.key === 'ArrowLeft') {
115
+ this.tabFocus--;
116
+ // If we're at the start, move to the end
117
+ if (this.tabFocus < this.startIndex)
118
+ this.tabFocus = this.tabs.length;
119
+ }
120
+ // if focus item is ['hidden'] we recursively repeat action
121
+ if (this.tabHasStatus(this.tabs[this.tabFocus - 1], Status.HIDDEN)) {
122
+ parent.querySelector(`[data-index="${this.tabFocus}"]`).dispatchEvent(new KeyboardEvent('keydown', { key: event.key, bubbles: true }));
123
+ // else run focus methods on tabFocus element
124
+ }
125
+ else {
126
+ parent.querySelector(`[data-index="${this.tabFocus}"]`).setAttribute('tabindex', '0');
127
+ parent.querySelector(`[data-index="${this.tabFocus}"]`).focus();
128
+ }
116
129
  }
117
- // get selected tab if NOT hidden, disabled
118
- const selectedTab = parent.querySelector(`[data-index="${tabId}"]:not(${[this.getNavigationButtonClass(Status.HIDDEN, true), this.getNavigationButtonClass(Status.DISABLED, true)].join()})`);
119
- // apply selected tab if exist
120
- if (selectedTab !== null) {
121
- selectedTab.focus();
122
- this.activeTab = tabId;
130
+ else if (event.key === 'Tab') {
131
+ this.resetFocus();
123
132
  }
124
133
  };
134
+ /**
135
+ * Method to reset focus behavior
136
+ *
137
+ * @returns {void}
138
+ */
139
+ this.resetFocus = () => {
140
+ // update asynchronously tabindex to prevent get focus on new tabindex at then end of event process
141
+ setTimeout(() => {
142
+ this.tabFocus = undefined;
143
+ Array.from(this.element.shadowRoot.querySelectorAll('[data-index]')).forEach((tab, index) => {
144
+ tab.setAttribute('tabindex', this.getActiveTab() - this.startIndex !== index ? '-1' : '0');
145
+ });
146
+ }, 0);
147
+ };
125
148
  /**
126
149
  * Validate slots setting
127
150
  */
128
151
  this.validateSlots = () => {
129
152
  const slots = Array.from(this.element.children).filter(slot => { var _a; return (_a = slot.getAttribute('slot')) === null || _a === void 0 ? void 0 : _a.includes('tab_content-'); });
130
- if (slots.length !== this.tabs.length) {
153
+ if (slots.length !== this.tabs.length)
131
154
  throw new Error('<mg-tabs> Must have slots counts equal to tabs count.');
132
- }
133
155
  };
134
156
  this.identifier = createID('mg-tabs');
135
157
  this.label = undefined;
136
158
  this.size = 'regular';
137
159
  this.items = undefined;
138
- this.activeTab = 1;
160
+ this.activeTab = undefined;
139
161
  this.tabs = [];
140
162
  this.classList = new ClassList(['mg-tabs']);
141
163
  }
@@ -153,22 +175,37 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
153
175
  validateItems(newValue) {
154
176
  // String array
155
177
  if (allItemsAreString(newValue)) {
156
- this.tabs = newValue.map(item => ({ label: item, status: Status.VISIBLE }));
178
+ this.tabs = newValue.map((item, index) => ({ label: item, status: index === 0 ? Status.ACTIVE : Status.VISIBLE }));
157
179
  }
158
180
  // Object array
159
- else if (newValue && newValue.every(item => isTabItem(item))) {
181
+ else if (newValue && newValue.length > 0 && newValue.every(item => isTabItem(item))) {
160
182
  this.tabs = newValue;
183
+ // init active tabs if not set. Default: index 0.
184
+ if (this.tabs.find(tab => this.tabHasStatus(tab, Status.ACTIVE)) === undefined)
185
+ this.tabs[0].status = Status.ACTIVE;
161
186
  }
162
187
  else {
163
188
  throw new Error('<mg-tabs> prop "items" is required and all items must be the same type: TabItem.');
164
189
  }
165
190
  }
166
191
  validateActiveTab(newValue) {
167
- if (newValue < 1 || newValue > this.tabs.length) {
168
- throw new Error('<mg-tabs> prop "activeTab" must be between 1 and tabs length.');
192
+ if (typeof newValue === 'number' && newValue >= 1 && newValue <= this.tabs.length) {
193
+ this.tabs.forEach((tab, index) => {
194
+ const isNewActiveTab = index === newValue - this.startIndex;
195
+ // reset active tabs
196
+ if (this.tabHasStatus(tab, Status.ACTIVE) && !isNewActiveTab)
197
+ tab.status = Status.VISIBLE;
198
+ // set active tab from given tab key
199
+ else if ((tab.status === undefined || this.tabHasStatus(tab, Status.VISIBLE)) && isNewActiveTab)
200
+ tab.status = Status.ACTIVE;
201
+ });
202
+ // emit change active tab key event
203
+ if (this.tabs.find(tab => this.tabHasStatus(tab, Status.ACTIVE)) !== undefined) {
204
+ this.activeTabChange.emit(newValue);
205
+ }
169
206
  }
170
- else {
171
- this.setActiveTab(newValue);
207
+ else if (newValue !== undefined) {
208
+ throw new Error('<mg-tabs> prop "activeTab" must be between 1 and tabs length.');
172
209
  }
173
210
  }
174
211
  /*************
@@ -187,6 +224,17 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
187
224
  this.validateSize(this.size);
188
225
  this.validateSlots();
189
226
  }
227
+ /**
228
+ * add listners
229
+ *
230
+ * @returns {void}
231
+ */
232
+ componentDidLoad() {
233
+ document.addEventListener('click', (event) => {
234
+ if (event.target.closest('mg-tabs') !== this.element)
235
+ this.resetFocus();
236
+ }, false);
237
+ }
190
238
  /**
191
239
  * Render
192
240
  *
@@ -196,10 +244,10 @@ const MgTabs$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
196
244
  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: {
197
245
  [`${this.buttonTabBaseClass}`]: true,
198
246
  [`${this.buttonTabBaseClass}--horizontal`]: true,
199
- [`${this.getNavigationButtonClass(Status.ACTIVE)}`]: this.tabHasGivenStatus(tab, Status.ACTIVE),
200
- [`${this.getNavigationButtonClass(Status.DISABLED)}`]: this.tabHasGivenStatus(tab, Status.DISABLED),
201
- [`${this.getNavigationButtonClass(Status.HIDDEN)}`]: this.tabHasGivenStatus(tab, Status.HIDDEN),
202
- }, 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) }))))));
247
+ [`${this.getNavigationButtonClass(Status.ACTIVE)}`]: this.tabHasStatus(tab, Status.ACTIVE),
248
+ [`${this.getNavigationButtonClass(Status.DISABLED)}`]: this.tabHasStatus(tab, Status.DISABLED),
249
+ [`${this.getNavigationButtonClass(Status.HIDDEN)}`]: this.tabHasStatus(tab, Status.HIDDEN),
250
+ }, tabindex: this.tabHasStatus(tab, Status.ACTIVE) ? 0 : -1, "aria-selected": this.tabHasStatus(tab, Status.ACTIVE).toString(), "aria-controls": this.getElementId(this.tabPanel, index), "aria-disabled": this.tabHasStatus(tab, Status.DISABLED), onClick: this.handleClick, onKeyDown: this.handleKeydown, "data-index": this.getTabItemIndex(index) }, tab.icon !== undefined && h("mg-icon", { icon: tab.icon }), tab.label, tab.badge !== undefined && h("mg-badge", { variant: "text-color", value: tab.badge.value, label: tab.badge.label, outline: tab.badge.role === 'information' }))))), this.tabs.map((tab, index) => (h("article", { role: "tabpanel", id: this.getElementId(this.tabPanel, index), hidden: !this.tabHasStatus(tab, Status.ACTIVE), "aria-labelledby": this.getElementId(this.identifier, index), tabindex: this.tabHasStatus(tab, Status.ACTIVE) ? 0 : -1, class: "mg-tabs__content-container" }, h("slot", { name: this.getElementId('tab_content', index) }))))));
203
251
  }
204
252
  get element() { return this; }
205
253
  static get watchers() { return {
@@ -6,7 +6,7 @@ import { C as ClassList } from './components.utils.js';
6
6
  */
7
7
  const variants = ['primary', 'secondary', 'success', 'warning', 'danger', 'info'];
8
8
 
9
- const mgTagCss = ".mg-tag{padding:calc((var(--mg-tag-height) - 0.2rem - var(--mg-tag-font-size) * var(--line-height)) / 2) 0.6rem;min-height:var(--mg-tag-height);box-sizing:border-box;border-radius:var(--mg-tag-border-radius);border:0.1rem solid;font-size:var(--mg-tag-font-size);font-weight:600;text-align:center}.mg-tag.mg-tag--primary{background-color:hsl(var(--color-dark));border-color:hsl(var(--color-dark));color:hsl(var(--color-light))}.mg-tag.mg-tag--primary.mg-tag--outline{background-color:transparent;color:hsl(var(--color-dark))}.mg-tag.mg-tag--primary.mg-tag--soft{font-weight:200;background-color:hsl(var(--color-dark-h), var(--color-dark-s), 90%);border-color:hsl(var(--color-dark-h), var(--color-dark-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--primary.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-dark))}.mg-tag.mg-tag--secondary{background-color:hsl(var(--color-light));border-color:hsl(var(--color-light));color:hsl(var(--color-dark))}.mg-tag.mg-tag--secondary.mg-tag--outline{background-color:transparent;color:hsl(var(--color-light))}.mg-tag.mg-tag--secondary.mg-tag--soft{font-weight:200;background-color:hsl(var(--color-light-h), var(--color-light-s), 90%);border-color:hsl(var(--color-light-h), var(--color-light-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--secondary.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-dark))}.mg-tag.mg-tag--success{background-color:hsl(var(--color-success));border-color:hsl(var(--color-success));color:hsl(var(--color-dark))}.mg-tag.mg-tag--success.mg-tag--outline{background-color:transparent;color:hsl(var(--color-success))}.mg-tag.mg-tag--success.mg-tag--soft{font-weight:200;background-color:hsl(var(--color-success-h), var(--color-success-s), 90%);border-color:hsl(var(--color-success-h), var(--color-success-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--success.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-success))}.mg-tag.mg-tag--warning{background-color:hsl(var(--color-warning));border-color:hsl(var(--color-warning));color:hsl(var(--color-dark))}.mg-tag.mg-tag--warning.mg-tag--outline{background-color:transparent;color:hsl(var(--color-warning))}.mg-tag.mg-tag--warning.mg-tag--soft{font-weight:200;background-color:hsl(var(--color-warning-h), var(--color-warning-s), 90%);border-color:hsl(var(--color-warning-h), var(--color-warning-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--warning.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-warning))}.mg-tag.mg-tag--danger{background-color:hsl(var(--color-danger));border-color:hsl(var(--color-danger));color:hsl(var(--color-light))}.mg-tag.mg-tag--danger.mg-tag--outline{background-color:transparent;color:hsl(var(--color-danger))}.mg-tag.mg-tag--danger.mg-tag--soft{font-weight:200;background-color:hsl(var(--color-danger-h), var(--color-danger-s), 90%);border-color:hsl(var(--color-danger-h), var(--color-danger-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--danger.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-danger))}.mg-tag.mg-tag--info{background-color:hsl(var(--color-info));border-color:hsl(var(--color-info));color:hsl(var(--color-light))}.mg-tag.mg-tag--info.mg-tag--outline{background-color:transparent;color:hsl(var(--color-info))}.mg-tag.mg-tag--info.mg-tag--soft{font-weight:200;background-color:hsl(var(--color-info-h), var(--color-info-s), 90%);border-color:hsl(var(--color-info-h), var(--color-info-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--info.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-info))}.mg-tag,mg-tag{display:inline-block;vertical-align:middle}::slotted(mg-icon){margin-right:0.4rem}";
9
+ const mgTagCss = ".mg-tag{padding:calc((var(--mg-tag-height) - 0.2rem - var(--mg-tag-font-size) * var(--line-height)) / 2) 0.6rem;min-height:var(--mg-tag-height);box-sizing:border-box;border-radius:var(--mg-tag-border-radius);border:0.1rem solid;font-size:var(--mg-tag-font-size);font-weight:600;text-align:center}.mg-tag.mg-tag--primary{background-color:hsl(var(--color-dark));border-color:hsl(var(--color-dark));color:hsl(var(--color-light))}.mg-tag.mg-tag--primary.mg-tag--outline{background-color:transparent;color:hsl(var(--color-dark))}.mg-tag.mg-tag--primary.mg-tag--soft{font-weight:400;background-color:hsl(var(--color-dark-h), var(--color-dark-s), 90%);border-color:hsl(var(--color-dark-h), var(--color-dark-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--primary.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-dark))}.mg-tag.mg-tag--secondary{background-color:hsl(var(--color-light));border-color:hsl(var(--color-light));color:hsl(var(--color-dark))}.mg-tag.mg-tag--secondary.mg-tag--outline{background-color:transparent;color:hsl(var(--color-light))}.mg-tag.mg-tag--secondary.mg-tag--soft{font-weight:400;background-color:hsl(var(--color-light-h), var(--color-light-s), 90%);border-color:hsl(var(--color-light-h), var(--color-light-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--secondary.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-dark))}.mg-tag.mg-tag--success{background-color:hsl(var(--color-success));border-color:hsl(var(--color-success));color:hsl(var(--color-dark))}.mg-tag.mg-tag--success.mg-tag--outline{background-color:transparent;color:hsl(var(--color-success))}.mg-tag.mg-tag--success.mg-tag--soft{font-weight:400;background-color:hsl(var(--color-success-h), var(--color-success-s), 90%);border-color:hsl(var(--color-success-h), var(--color-success-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--success.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-success))}.mg-tag.mg-tag--warning{background-color:hsl(var(--color-warning));border-color:hsl(var(--color-warning));color:hsl(var(--color-dark))}.mg-tag.mg-tag--warning.mg-tag--outline{background-color:transparent;color:hsl(var(--color-warning))}.mg-tag.mg-tag--warning.mg-tag--soft{font-weight:400;background-color:hsl(var(--color-warning-h), var(--color-warning-s), 90%);border-color:hsl(var(--color-warning-h), var(--color-warning-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--warning.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-warning))}.mg-tag.mg-tag--danger{background-color:hsl(var(--color-danger));border-color:hsl(var(--color-danger));color:hsl(var(--color-light))}.mg-tag.mg-tag--danger.mg-tag--outline{background-color:transparent;color:hsl(var(--color-danger))}.mg-tag.mg-tag--danger.mg-tag--soft{font-weight:400;background-color:hsl(var(--color-danger-h), var(--color-danger-s), 90%);border-color:hsl(var(--color-danger-h), var(--color-danger-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--danger.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-danger))}.mg-tag.mg-tag--info{background-color:hsl(var(--color-info));border-color:hsl(var(--color-info));color:hsl(var(--color-light))}.mg-tag.mg-tag--info.mg-tag--outline{background-color:transparent;color:hsl(var(--color-info))}.mg-tag.mg-tag--info.mg-tag--soft{font-weight:400;background-color:hsl(var(--color-info-h), var(--color-info-s), 90%);border-color:hsl(var(--color-info-h), var(--color-info-s), 90%);color:hsl(var(--color-dark))}.mg-tag.mg-tag--info.mg-tag--soft ::slotted(mg-icon){color:hsl(var(--color-info))}.mg-tag,mg-tag{display:inline-block;vertical-align:middle}::slotted(mg-icon){margin-right:0.4rem}";
10
10
 
11
11
  const MgTag$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
12
12
  constructor() {
@@ -17,8 +17,8 @@ const MgTag$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
17
17
  * Internal *
18
18
  ************/
19
19
  // Classes
20
- this.classOutline = `mg-tag--outline`;
21
- this.classSoft = `mg-tag--soft`;
20
+ this.classOutline = 'mg-tag--outline';
21
+ this.classSoft = 'mg-tag--soft';
22
22
  this.variant = variants[0];
23
23
  this.outline = undefined;
24
24
  this.soft = undefined;
@@ -61,7 +61,7 @@ const MgTag$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
61
61
  * @returns {void}
62
62
  */
63
63
  validateTextContent(textContent) {
64
- if (!textContent || textContent.trim() === '')
64
+ if (typeof textContent !== 'string' || textContent.trim() === '')
65
65
  throw new Error('<mg-tag> slot must contain a text content.');
66
66
  }
67
67
  /*************
@@ -9,7 +9,7 @@ var Guard;
9
9
  Guard["HOVER_TOOLTIPED_ELEMENT"] = "hoverTooltipedGuard";
10
10
  })(Guard || (Guard = {}));
11
11
 
12
- const mgTooltipCss = ":host{display:inline-block}.mg-tooltip{display:none;padding:0.5rem 0.8rem;z-index:1000;border-radius:var(--mg-tooltip-border-radius);background-color:hsl(var(--mg-tooltip-background-color));color:hsl(var(--mg-tooltip-font-color));text-align:start}.mg-tooltip[data-show]{display:block}.mg-tooltip .mg-tooltip__arrow,.mg-tooltip .mg-tooltip__arrow::before{position:absolute;width:0.8rem;height:0.8rem;z-index:9999;background:inherit}.mg-tooltip .mg-tooltip__arrow{visibility:hidden}.mg-tooltip .mg-tooltip__arrow::before{visibility:visible;content:\"\";transform:rotate(45deg)}.mg-tooltip[data-popper-placement^=top]>.mg-tooltip__arrow{bottom:-4px}.mg-tooltip[data-popper-placement^=bottom]>.mg-tooltip__arrow{top:-4px}.mg-tooltip[data-popper-placement^=left]>.mg-tooltip__arrow{right:-4px}.mg-tooltip[data-popper-placement^=right]>.mg-tooltip__arrow{left:-4px}";
12
+ const mgTooltipCss = ":host{display:inline-block}.mg-tooltip{display:none;padding:0.5rem 0.8rem;z-index:1000;border-radius:var(--mg-tooltip-border-radius);background-color:hsl(var(--mg-tooltip-background-color));color:hsl(var(--mg-tooltip-font-color));text-align:start;max-width:40rem;box-sizing:border-box}.mg-tooltip[data-show]{display:block}.mg-tooltip .mg-tooltip__arrow,.mg-tooltip .mg-tooltip__arrow::before{position:absolute;width:0.8rem;height:0.8rem;z-index:9999;background:inherit}.mg-tooltip .mg-tooltip__arrow{visibility:hidden}.mg-tooltip .mg-tooltip__arrow::before{visibility:visible;content:\"\";transform:rotate(45deg)}.mg-tooltip[data-popper-placement^=top]>.mg-tooltip__arrow{bottom:-4px}.mg-tooltip[data-popper-placement^=bottom]>.mg-tooltip__arrow{top:-4px}.mg-tooltip[data-popper-placement^=left]>.mg-tooltip__arrow{right:-4px}.mg-tooltip[data-popper-placement^=right]>.mg-tooltip__arrow{left:-4px}";
13
13
 
14
14
  const MgTooltip = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
15
15
  constructor() {
@@ -69,7 +69,7 @@ const MgTooltip = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
69
69
  this.resetGuard();
70
70
  }, 100);
71
71
  }
72
- else if (isMouseenter && elementGuard === Guard.HOVER_TOOLTIPED_ELEMENT) {
72
+ else if (this.guard === Guard.HOVER_TOOLTIPED_ELEMENT) {
73
73
  this.setDisplay(isMouseenter);
74
74
  }
75
75
  }
@@ -139,7 +139,7 @@ const MgTooltip = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
139
139
  this.setDisplay(true);
140
140
  });
141
141
  ['blur', 'keydown'].forEach(event => {
142
- this.tooltipedElement.addEventListener(event, (e) => {
142
+ document.addEventListener(event, (e) => {
143
143
  // we continue to process ONLY for KeyboardEvents 'Escape'
144
144
  if (e.type === 'keydown' && e.code !== 'Escape') {
145
145
  return;
@@ -223,7 +223,7 @@ const MgTooltip = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
223
223
  * @returns {HTMLElement} HTML Element
224
224
  */
225
225
  render() {
226
- return (h(Host, null, h("slot", null), h("div", { role: "tooltip", id: this.identifier, class: "mg-tooltip", innerHTML: this.message }, h("div", { class: "mg-tooltip__arrow", "data-popper-arrow": true }))));
226
+ return (h(Host, null, h("slot", null), h("div", { role: "tooltip", id: this.identifier, class: "mg-tooltip" }, h("span", { innerHTML: this.message }), h("div", { class: "mg-tooltip__arrow", "data-popper-arrow": true }))));
227
227
  }
228
228
  get element() { return this; }
229
229
  static get watchers() { return {
@@ -58,7 +58,6 @@ const isComplexType = (o) => {
58
58
  *
59
59
  * Modified for Stencil's compiler and vdom
60
60
  */
61
- // const stack: any[] = [];
62
61
  // export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, child?: d.ChildType): d.VNode;
63
62
  // export function h(nodeName: string | d.FunctionalComponent, vnodeData: d.PropsType, ...children: d.ChildType[]): d.VNode;
64
63
  const h = (nodeName, vnodeData, ...children) => {
@@ -138,6 +137,13 @@ const newVNode = (tag, text) => {
138
137
  };
139
138
  const Host = {};
140
139
  const isHost = (node) => node && node.$tag$ === Host;
140
+ /**
141
+ * Implementation of {@link d.FunctionalUtilities} for Stencil's VDom.
142
+ *
143
+ * Note that these functions convert from {@link d.VNode} to
144
+ * {@link d.ChildNode} to give functional component developers a friendly
145
+ * interface.
146
+ */
141
147
  const vdomFnUtils = {
142
148
  forEach: (children, cb) => children.map(convertToPublic).forEach(cb),
143
149
  map: (children, cb) => children.map(convertToPublic).map(cb).map(convertToPrivate),
@@ -1653,12 +1659,16 @@ const setContentReference = (elm) => {
1653
1659
  const disconnectedCallback = (elm) => {
1654
1660
  if ((plt.$flags$ & 1 /* PLATFORM_FLAGS.isTmpDisconnected */) === 0) {
1655
1661
  const hostRef = getHostRef(elm);
1662
+ const instance = hostRef.$lazyInstance$ ;
1656
1663
  {
1657
1664
  if (hostRef.$rmListeners$) {
1658
1665
  hostRef.$rmListeners$.map((rmListener) => rmListener());
1659
1666
  hostRef.$rmListeners$ = undefined;
1660
1667
  }
1661
1668
  }
1669
+ {
1670
+ safeCall(instance, 'disconnectedCallback');
1671
+ }
1662
1672
  }
1663
1673
  };
1664
1674
  const bootstrapLazy = (lazyBundles, options = {}) => {