@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
@@ -1,7 +1,13 @@
1
1
  import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client';
2
- import { D as Direction } from './mg-menu.conf.js';
2
+ import { O as OverflowBehaviorElements, D as Direction, i as isMoreItem, s as sizes, a as OverflowBehavior, d as defineCustomElement$3 } from './mg-menu-item2.js';
3
+ import { i as initLocales } from './index2.js';
4
+ import { d as defineCustomElement$7 } from './mg-badge2.js';
5
+ import { d as defineCustomElement$6 } from './mg-button2.js';
6
+ import { d as defineCustomElement$5 } from './mg-card2.js';
7
+ import { d as defineCustomElement$4 } from './mg-icon2.js';
8
+ import { d as defineCustomElement$2 } from './mg-popover2.js';
3
9
 
4
- const mgMenuCss = ":host{display:flex;background-color:hsl(var(--mg-menu-background-color-hsl, var(--color-light)))}:host([direction=vertical]){flex-direction:column;height:100%;overflow-y:auto}";
10
+ const mgMenuCss = ".sr-only{border:0 !important;clip:rect(1px, 1px, 1px, 1px) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}*:focus:not(:focus-visible){outline:none}@media (prefers-reduced-motion){.mg-a11y-animation{animation:none !important;transition:none !important}}:host{display:flex;background-color:hsl(var(--mg-menu-background-color-hsl, var(--color-light)))}:host([direction=vertical]){flex-direction:column;height:100%;overflow-y:auto}";
5
11
 
6
12
  const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
7
13
  constructor() {
@@ -12,11 +18,12 @@ const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
12
18
  * Internal *
13
19
  ************/
14
20
  this.name = 'mg-menu';
21
+ this.menuItems = [];
15
22
  this.focusedMenuItem = 0;
16
23
  /**
17
24
  * Close matching menu-item
18
25
  *
19
- * @param {HTMLMgMenuItemElement} item menu-item to close
26
+ * @param {HTMLElement} item menu-item to close
20
27
  * @param {boolean} condition addionnal condition
21
28
  * @returns {void}
22
29
  */
@@ -25,12 +32,15 @@ const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
25
32
  item.expanded = false;
26
33
  }
27
34
  };
35
+ /*************
36
+ * Methods *
37
+ *************/
28
38
  /**
29
39
  * Store menu-items on component init and add listeners
40
+ *
41
+ * @returns {void}
30
42
  */
31
- this.initMenuItems = () => {
32
- // store all menu-items
33
- this.menuItems = Array.from(this.element.children).filter(child => child.nodeName === 'MG-MENU-ITEM');
43
+ this.initMenuItemsListeners = () => {
34
44
  // add listeners on menu item and edit index
35
45
  this.menuItems.forEach((item, menuItemIndex) => {
36
46
  ['click', 'focus'].forEach(trigger => {
@@ -44,9 +54,47 @@ const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
44
54
  });
45
55
  });
46
56
  };
57
+ /**
58
+ * render mg-menu-more
59
+ *
60
+ * @returns {HTMLElement} formated mg-menu-item element
61
+ */
62
+ this.renderMgMenuMore = () => {
63
+ const moreElement = this.element.shadowRoot.querySelector(`[${OverflowBehaviorElements.MORE}]`);
64
+ this.menuItems.forEach((child) => {
65
+ const proxy = child.cloneNode(true);
66
+ moreElement.querySelector('mg-menu').appendChild(proxy);
67
+ });
68
+ const allMenuItem = Array.from(this.element.querySelectorAll('mg-menu-item:not([data-overflow-more])'));
69
+ Array.from(moreElement.querySelectorAll('mg-menu-item:not([data-overflow-more])')).forEach((proxy, index) => {
70
+ // manage click on proxy to mirror it on initial element
71
+ proxy.addEventListener('click', () => {
72
+ (allMenuItem[index].shadowRoot.querySelector('a') || allMenuItem[index].shadowRoot.querySelector('button')).dispatchEvent(new MouseEvent('click', { bubbles: true }));
73
+ });
74
+ // manage status change miror in proxy
75
+ allMenuItem[index].addEventListener('status-change', (event) => {
76
+ proxy.setAttribute('status', event.detail);
77
+ this.overflowBehavior.updateActiveStatus();
78
+ });
79
+ });
80
+ this.element.appendChild(moreElement);
81
+ return this.element.querySelector(`[${OverflowBehaviorElements.MORE}]`);
82
+ };
83
+ /**
84
+ * Render mg-menu-item more element for overflow behavior
85
+ *
86
+ * @returns {HTMLElement} rendered mg-menu-item more element
87
+ */
88
+ this.renderMgMenuItemMore = () => {
89
+ var _a, _b, _c, _d, _e, _f, _g;
90
+ return (h("mg-menu-item", { "data-overflow-more": true }, h("mg-icon", { icon: ((_b = (_a = this.moreitem) === null || _a === void 0 ? void 0 : _a.mgIcon) === null || _b === void 0 ? void 0 : _b.icon) || 'ellipsis-vertical', slot: "image" }), h("span", { class: { 'sr-only': !((_d = (_c = this.moreitem) === null || _c === void 0 ? void 0 : _c.slotLabel) === null || _d === void 0 ? void 0 : _d.display) }, slot: "label" }, ((_f = (_e = this.moreitem) === null || _e === void 0 ? void 0 : _e.slotLabel) === null || _f === void 0 ? void 0 : _f.label) || this.messages.moreLabel), h("mg-menu", { direction: Direction.VERTICAL, label: this.messages.moreLabel, size: (_g = this.moreitem) === null || _g === void 0 ? void 0 : _g.size })));
91
+ };
47
92
  this.label = undefined;
48
93
  this.direction = Direction.HORIZONTAL;
94
+ this.moreitem = undefined;
95
+ this.size = 'regular';
49
96
  this.isChildMenu = undefined;
97
+ this.hasOverflow = false;
50
98
  }
51
99
  validateLabel(newValue) {
52
100
  if (newValue === undefined) {
@@ -58,6 +106,19 @@ const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
58
106
  throw new Error(`<${this.name}> prop "direction" must be one of : ${Direction.HORIZONTAL}, ${Direction.VERTICAL}.`);
59
107
  }
60
108
  }
109
+ validateMoreItem(newValue) {
110
+ if (newValue !== undefined && this.direction !== Direction.HORIZONTAL) {
111
+ throw new Error(`<${this.name}> prop "moreitem" must be paired with direction ${Direction.HORIZONTAL}.`);
112
+ }
113
+ else if (newValue !== undefined && !isMoreItem(newValue)) {
114
+ throw new Error(`<${this.name}> prop "moreitem" must match MoreItemType.`);
115
+ }
116
+ }
117
+ validateSize(newValue) {
118
+ if (!sizes.includes(newValue)) {
119
+ throw new Error(`<${this.name}> prop "size" must be one of : ${sizes.join(', ')}.`);
120
+ }
121
+ }
61
122
  /*************
62
123
  * Lifecycle *
63
124
  *************/
@@ -67,8 +128,12 @@ const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
67
128
  * @returns {void}
68
129
  */
69
130
  componentWillLoad() {
131
+ this.messages = initLocales(this.element).messages.plusMenu;
132
+ // validation
70
133
  this.validateDirection(this.direction);
71
134
  this.validateLabel(this.label);
135
+ this.validateMoreItem(this.moreitem);
136
+ this.validateSize(this.size);
72
137
  }
73
138
  /**
74
139
  * Check if component slots configuration
@@ -80,50 +145,102 @@ const MgMenu$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
80
145
  // return a promise to process action only in the FIRST render().
81
146
  // https://stenciljs.com/docs/component-lifecycle#componentwillload
82
147
  return setTimeout(() => {
83
- this.initMenuItems();
148
+ // store all menu-items
149
+ this.menuItems = Array.from(this.element.children).filter(child => child.nodeName === 'MG-MENU-ITEM');
84
150
  this.isChildMenu = this.element.closest('mg-menu-item') !== null;
85
- // click outside management for child vertical menu
86
- if (!this.isChildMenu && this.direction === Direction.HORIZONTAL) {
87
- document.addEventListener('click', (event) => {
88
- if (event.target.closest('mg-menu') === null) {
89
- this.menuItems.forEach(item => {
90
- this.closeMenuItem(item, this.direction === Direction.HORIZONTAL);
91
- });
92
- }
93
- });
94
- }
151
+ this.hasOverflow = this.direction === Direction.HORIZONTAL && !this.isChildMenu;
152
+ if (this.hasOverflow && isMoreItem(this.moreitem))
153
+ this.overflowBehavior = new OverflowBehavior(this.element, this.renderMgMenuMore);
95
154
  }, 0);
96
155
  }
156
+ /**
157
+ * Check add listeners to childs
158
+ *
159
+ * @returns {void}
160
+ */
161
+ componentDidRender() {
162
+ // add menu items listeners
163
+ this.initMenuItemsListeners();
164
+ }
165
+ /**
166
+ * Disconnect overflow ResizeObserver
167
+ *
168
+ * @returns {void} run overflow resize obeserver disconnexion
169
+ */
170
+ disconnectedCallback() {
171
+ if (this.hasOverflow)
172
+ this.overflowBehavior.disconnect();
173
+ }
97
174
  /**
98
175
  * Render
99
176
  *
100
177
  * @returns {HTMLElement} HTML Element
101
178
  */
102
179
  render() {
103
- return (h(Host, { role: this.isChildMenu ? 'menu' : 'menubar', "aria-label": this.label }, h("slot", null)));
180
+ return (h(Host, { role: this.isChildMenu ? 'menu' : 'menubar', "aria-label": this.label }, h("slot", null), this.hasOverflow && isMoreItem(this.moreitem) && this.renderMgMenuItemMore()));
104
181
  }
105
182
  get element() { return this; }
106
183
  static get watchers() { return {
107
184
  "label": ["validateLabel"],
108
- "direction": ["validateDirection"]
185
+ "direction": ["validateDirection"],
186
+ "moreitem": ["validateMoreItem"],
187
+ "size": ["validateSize"]
109
188
  }; }
110
189
  static get style() { return mgMenuCss; }
111
190
  }, [1, "mg-menu", {
112
191
  "label": [1],
113
192
  "direction": [513],
114
- "isChildMenu": [32]
193
+ "moreitem": [16],
194
+ "size": [1],
195
+ "isChildMenu": [32],
196
+ "hasOverflow": [32]
115
197
  }]);
116
198
  function defineCustomElement$1() {
117
199
  if (typeof customElements === "undefined") {
118
200
  return;
119
201
  }
120
- const components = ["mg-menu"];
202
+ const components = ["mg-menu", "mg-badge", "mg-button", "mg-card", "mg-icon", "mg-menu", "mg-menu-item", "mg-popover"];
121
203
  components.forEach(tagName => { switch (tagName) {
122
204
  case "mg-menu":
123
205
  if (!customElements.get(tagName)) {
124
206
  customElements.define(tagName, MgMenu$1);
125
207
  }
126
208
  break;
209
+ case "mg-badge":
210
+ if (!customElements.get(tagName)) {
211
+ defineCustomElement$7();
212
+ }
213
+ break;
214
+ case "mg-button":
215
+ if (!customElements.get(tagName)) {
216
+ defineCustomElement$6();
217
+ }
218
+ break;
219
+ case "mg-card":
220
+ if (!customElements.get(tagName)) {
221
+ defineCustomElement$5();
222
+ }
223
+ break;
224
+ case "mg-icon":
225
+ if (!customElements.get(tagName)) {
226
+ defineCustomElement$4();
227
+ }
228
+ break;
229
+ case "mg-menu":
230
+ if (!customElements.get(tagName)) {
231
+ defineCustomElement$1();
232
+ }
233
+ break;
234
+ case "mg-menu-item":
235
+ if (!customElements.get(tagName)) {
236
+ defineCustomElement$3();
237
+ }
238
+ break;
239
+ case "mg-popover":
240
+ if (!customElements.get(tagName)) {
241
+ defineCustomElement$2();
242
+ }
243
+ break;
127
244
  } });
128
245
  }
129
246
  defineCustomElement$1();
@@ -10,7 +10,7 @@ import { d as defineCustomElement$2 } from './mg-icon2.js';
10
10
  */
11
11
  const variants = ['info', 'warning', 'success', 'danger'];
12
12
 
13
- const mgMessageCss = ":host{--mg-card-padding:0;--mg-card-border-radius:var(--mg-message-border-radius);--mg-card-border:none;--mg-card-overflow:hidden}.mg-message{display:inline-block;min-height:var(--default-size)}.mg-message__bar{position:absolute;top:0;left:0;width:0.3rem;height:100%}.mg-message.mg-message--info .mg-message__bar{background-color:hsl(var(--color-info))}.mg-message.mg-message--info .mg-message__icon{color:hsl(var(--color-info))}.mg-message.mg-message--warning .mg-message__bar{background-color:hsl(var(--color-warning))}.mg-message.mg-message--warning .mg-message__icon{color:hsl(var(--color-warning))}.mg-message.mg-message--success .mg-message__bar{background-color:hsl(var(--color-success))}.mg-message.mg-message--success .mg-message__icon{color:hsl(var(--color-success))}.mg-message.mg-message--danger .mg-message__bar{background-color:hsl(var(--color-danger))}.mg-message.mg-message--danger .mg-message__icon{color:hsl(var(--color-danger))}.mg-message.mg-message--close-button{--mg-card-padding:0 3.4rem 0 0}.mg-message.mg-message--hide{display:none}.mg-message ::slotted(*){margin:0;padding:0}.mg-message__icon{position:absolute;top:calc((var(--default-size) - var(--mg-icon-regular-size)) / 2);left:1.3rem;line-height:1}.mg-message__content{display:flex;flex-wrap:wrap;justify-content:flex-end;align-content:stretch;padding:0 1rem 0 3.8rem}.mg-message__content-slot{flex-grow:1;margin:0.84rem 0}.mg-message__content-separator{display:inline-block;width:4.5rem;height:0}.mg-message__content-actions-slot{padding:1rem 0;text-align:right}.mg-message__close-button{position:absolute;top:0;right:0}.mg-message,mg-message{max-width:100%}";
13
+ const mgMessageCss = ":host{--mg-card-padding:0;--mg-card-border-radius:var(--mg-message-border-radius);--mg-card-border:none;--mg-card-overflow:hidden}.mg-message{display:inline-block;min-height:var(--default-size)}.mg-message__bar{position:absolute;top:0;left:0;width:0.3rem;height:100%}.mg-message.mg-message--info .mg-message__bar{background-color:hsl(var(--color-info))}.mg-message.mg-message--info .mg-message__icon{color:hsl(var(--color-info))}.mg-message.mg-message--warning .mg-message__bar{background-color:hsl(var(--color-warning))}.mg-message.mg-message--warning .mg-message__icon{color:hsl(var(--color-warning))}.mg-message.mg-message--success .mg-message__bar{background-color:hsl(var(--color-success))}.mg-message.mg-message--success .mg-message__icon{color:hsl(var(--color-success))}.mg-message.mg-message--danger .mg-message__bar{background-color:hsl(var(--color-danger))}.mg-message.mg-message--danger .mg-message__icon{color:hsl(var(--color-danger))}.mg-message.mg-message--close-button{--mg-card-padding:0 3.4rem 0 0}.mg-message.mg-message--hide{display:none}.mg-message ::slotted(*){margin:0;padding:0}.mg-message__icon{position:absolute;top:calc((var(--default-size) - var(--mg-icon-regular-size)) / 2);left:1.3rem;line-height:1}.mg-message__content{display:flex;flex-wrap:wrap;justify-content:flex-end;align-content:stretch;padding:0 1rem 0 3.8rem}.mg-message__content-slot{flex-grow:1;margin:0.84rem 0}.mg-message__content-separator{display:inline-block;width:4.5rem;height:0}.mg-message__content-actions-slot{padding:1rem 0;text-align:right}.mg-message__close-button{position:absolute;top:0;right:0}.mg-message ::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)}.mg-message,mg-message{max-width:100%}";
14
14
 
15
15
  const MgMessage$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
16
16
  constructor() {
@@ -28,22 +28,49 @@ const MgMessage$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
28
28
  this.closeButtonId = '';
29
29
  // Stored timer setted when hide action is run from setTimeOut
30
30
  this.storedTimer = null;
31
+ // Manage hover
32
+ this.isFocused = false;
33
+ this.isHovered = false;
31
34
  /**
32
- * Handle close button
35
+ * Set timer
36
+ *
37
+ * @returns {void}
33
38
  */
34
- this.handleClose = () => {
35
- this.hide = true;
39
+ this.setTimer = () => {
40
+ this.storedTimer = setTimeout(() => (this.hide = true), this.delay * 1000);
36
41
  };
37
42
  /**
38
- * Hide component whith delay
43
+ * Clear timer
44
+ *
45
+ * @returns {void}
39
46
  */
40
- this.hideWithDelay = () => {
41
- if (this.delay > 0 && this.hide !== true) {
42
- this.storedTimer = setTimeout(() => (this.hide = true), this.delay * 1000);
43
- }
44
- else if (this.storedTimer !== null) {
45
- clearTimeout(this.storedTimer);
46
- }
47
+ this.clearTimer = () => {
48
+ clearTimeout(this.storedTimer);
49
+ };
50
+ /**
51
+ * Event to add on element
52
+ *
53
+ * @param {MouseEvent | FocusEvent} event event
54
+ * @returns {void}
55
+ */
56
+ this.timerEvents = (event) => {
57
+ this.clearTimer();
58
+ const isMouseEvent = event.type === 'mouseenter';
59
+ // Needed to ensure we don't start the timer
60
+ this[isMouseEvent ? 'isHovered' : 'isFocused'] = true;
61
+ // Restart timer when loose focus AND mouse leave
62
+ this.element.addEventListener(isMouseEvent ? 'mouseleave' : 'focusout', eventOut => {
63
+ this[eventOut.type === 'mouseleave' ? 'isHovered' : 'isFocused'] = false;
64
+ // Start timer if needed
65
+ if (!this.isFocused && !this.isHovered)
66
+ this.setTimer();
67
+ }, { once: true });
68
+ };
69
+ /**
70
+ * Handle close button
71
+ */
72
+ this.handleClose = () => {
73
+ this.hide = true;
47
74
  };
48
75
  /**
49
76
  * Get icon corresponding to variant
@@ -96,12 +123,26 @@ const MgMessage$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
96
123
  if (newValue) {
97
124
  this.componentHide.emit();
98
125
  this.classList.add(this.classHide);
126
+ // Remove event Listener
127
+ ['focusin', 'mouseenter'].forEach(event => {
128
+ this.element.removeEventListener(event, this.timerEvents);
129
+ });
130
+ // Clear Timer
131
+ this.clearTimer();
99
132
  }
100
133
  else {
101
134
  this.componentShow.emit();
102
135
  this.classList.delete(this.classHide);
136
+ // If delay is set
137
+ if (this.delay > 1) {
138
+ // Start timer
139
+ this.setTimer();
140
+ // Stop timer when get focus or mouse enter
141
+ ['focusin', 'mouseenter'].forEach(event => {
142
+ this.element.addEventListener(event, this.timerEvents);
143
+ });
144
+ }
103
145
  }
104
- this.hideWithDelay();
105
146
  }
106
147
  /*************
107
148
  * Lifecycle *
@@ -5,7 +5,7 @@ import { d as defineCustomElement$4 } from './mg-button2.js';
5
5
  import { d as defineCustomElement$3 } from './mg-card2.js';
6
6
  import { d as defineCustomElement$2 } from './mg-icon2.js';
7
7
 
8
- const mgModalCss = ":host{--mg-card-border-radius:var(--mg-modal-border-radius);--mg-card-padding:1.5rem 2.5rem;--mg-card-border:none}.mg-modal{display:flex;justify-content:center;align-items:center;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;padding:2rem 0;background-color:hsla(var(--color-light), 85%)}.mg-modal mg-card{display:flex;width:60rem;max-width:100%;max-height:100%}.mg-modal__dialog{display:flex;position:relative;flex-direction:column;align-self:center;row-gap:3rem;height:fit-content;max-height:100%}.mg-modal__header{margin-bottom:0.5rem}.mg-modal__title{margin:0;font-family:var(--font-family-heading);font-size:var(--mg-modal-title-font-size);font-weight:600}.mg-modal__close-button{float:right;height:var(--mg-modal-title-font-size);margin-top:calc((var(--default-size) - var(--mg-modal-title-font-size) * var(--line-height)) / 2 * -1);margin-right:calc((var(--default-size) - var(--mg-icon-regular-size)) / 2 * -1)}.mg-modal__content{overflow-y:auto}.mg-modal__content::slotted(*){font-size:var(--mg-modal-content-font-size)}.mg-modal.mg-modal--hide{display:none}";
8
+ const mgModalCss = ":host{--mg-card-border-radius:var(--mg-modal-border-radius);--mg-card-padding:1.5rem 2.5rem;--mg-card-border:none}.mg-modal{display:flex;justify-content:center;align-items:center;position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;padding:2rem 0;background-color:hsl(var(--color-light), 0.85)}.mg-modal mg-card{display:flex;width:60rem;max-width:100%;max-height:100%}.mg-modal__dialog{display:flex;position:relative;flex-direction:column;align-self:center;row-gap:3rem;height:fit-content;max-height:100%}.mg-modal__header{margin-bottom:0.5rem}.mg-modal__title{margin:0;font-family:var(--font-family-heading);font-size:var(--mg-modal-title-font-size);font-weight:600}.mg-modal__close-button{float:right;height:var(--mg-modal-title-font-size);margin-top:calc((var(--default-size) - var(--mg-modal-title-font-size) * var(--line-height)) / 2 * -1);margin-right:calc((var(--default-size) - var(--mg-icon-regular-size)) / 2 * -1)}.mg-modal__content{overflow-y:auto}.mg-modal__content::slotted(*){font-size:var(--mg-modal-content-font-size)}.mg-modal.mg-modal--hide{display:none}.mg-modal ::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)}";
9
9
 
10
10
  const MgModal$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
11
11
  constructor() {
@@ -9,7 +9,7 @@ import { d as defineCustomElement$4 } from './mg-input-text2.js';
9
9
  import { d as defineCustomElement$3 } from './mg-input-title2.js';
10
10
  import { d as defineCustomElement$2 } from './mg-tooltip2.js';
11
11
 
12
- const mgPanelCss = ":host{--mg-card-border:none;--mg-card-padding:0;--mg-card-border-radius:var(--mg-panel-border-radius);--mg-card-background:hsl(var(--mg-panel-background));--mg-card-box-shadow:var(--mg-panel-box-shadow)}.mg-panel__header{display:flex;flex-wrap:wrap;justify-content:space-between;padding:0 1rem 0 0.3rem;align-items:flex-start}.mg-panel__header-left,.mg-panel__header-right{display:flex;margin:0.3rem 0}.mg-panel__header-right{padding-left:0.3rem;flex:1 auto;min-height:var(--default-size);align-items:center}.mg-panel__header-left mg-input-text{flex-grow:1;margin-left:0.3rem}.mg-panel__header-left mg-button+mg-button:not([slot=append-input]){margin-left:0.3rem}.mg-panel__header-left.mg-panel__header-left--full{flex:1 1 auto}.mg-panel__collapse-button-content{--font-size:1.4rem;--mg-button-font-weight:600}.mg-panel__content{padding:var(--mg-panel-content-padding)}.mg-panel ::slotted([slot=header-right]){display:flex;flex-wrap:wrap;gap:1rem;margin-left:auto}";
12
+ const mgPanelCss = ":host{--mg-card-border:none;--mg-card-padding:0;--mg-card-border-radius:var(--mg-panel-border-radius);--mg-card-background:hsl(var(--mg-panel-background));--mg-card-box-shadow:var(--mg-panel-box-shadow)}.mg-panel__header{display:flex;flex-wrap:wrap;justify-content:space-between;padding:0 1rem 0 0.3rem;align-items:flex-start}.mg-panel__header-left,.mg-panel__header-right{display:flex;margin:0.3rem 0}.mg-panel__header-right{padding-left:0.3rem;flex:1 auto;min-height:var(--default-size);align-items:center}.mg-panel__header-left mg-input-text{flex-grow:1;margin-left:0.3rem}.mg-panel__header-left mg-button+mg-button:not([slot=append-input]){margin-left:0.3rem}.mg-panel__header-left.mg-panel__header-left--full{flex:1 1 auto}.mg-panel__collapse-button-content{--font-size:1.4rem;--mg-button-font-weight:600}.mg-panel__content{padding:var(--mg-panel-content-padding)}.mg-panel ::slotted([slot=header-right]){display:flex;flex-wrap:wrap;gap:1rem;margin-left:auto}.mg-panel ::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)}";
13
13
 
14
14
  const MgPanel$1 = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
15
15
  constructor() {
@@ -1,193 +1,4 @@
1
- import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
2
- import { c as createID, i as isTagName } from './components.utils.js';
3
- import { i as initLocales } from './index2.js';
4
- import { d as defineCustomElement$4 } from './mg-button2.js';
5
- import { d as defineCustomElement$3 } from './mg-card2.js';
6
- import { d as defineCustomElement$2 } from './mg-icon2.js';
7
- import { c as createPopper } from './popper.js';
8
-
9
- const mgPopoverCss = ":host{--mg-card-padding: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;z-index:2000;color:hsl(var(--mg-popover-font-color))}.mg-popover mg-card{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,.mg-popover__arrow::before{position:absolute;width:2rem;height:2rem;z-index:2000;background:hsl(var(--mg-popover-background-color))}.mg-popover__arrow{visibility:hidden}.mg-popover__arrow::before{visibility:visible;content:\"\";transform:rotate(45deg)}.mg-popover[data-popper-placement^=top]>.mg-popover__arrow{bottom:-6px}.mg-popover[data-popper-placement^=bottom]>.mg-popover__arrow{top:-6px}.mg-popover[data-popper-placement^=left]>.mg-popover__arrow{right:-6px}.mg-popover[data-popper-placement^=right]>.mg-popover__arrow{left:-6px}.mg-popover__title ::slotted([slot=title]){margin:0 0 1rem !important;font-size:var(--mg-popover-title-font-size) !important;font-weight:600}";
10
-
11
- const MgPopover$1 = /*@__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
- /**
19
- * Check if clicked outside of component
20
- *
21
- * @param {MouseEvent} event mouse event
22
- * @returns {void}
23
- */
24
- this.clickOutside = (event) => {
25
- if (!this.disabled && event.target.closest(`mg-popover`) !== this.element) {
26
- this.display = false;
27
- }
28
- };
29
- /**
30
- * Show popover
31
- *
32
- * @returns {void}
33
- */
34
- this.show = () => {
35
- // Make the popover visible
36
- this.popover.setAttribute('data-show', '');
37
- // Enable the event listeners
38
- this.popper.setOptions(options => (Object.assign(Object.assign({}, options), { modifiers: [...options.modifiers, { name: 'eventListeners', enabled: true }] })));
39
- // Update its position
40
- this.popper.update();
41
- // hide when click outside
42
- // setTimeout is used to prevent event to trigger after creation
43
- setTimeout(() => {
44
- document.addEventListener('click', this.clickOutside, false);
45
- }, 0);
46
- };
47
- /**
48
- * Hide popover
49
- *
50
- * @returns {void}
51
- */
52
- this.hide = () => {
53
- // Hide the popover
54
- this.popover.removeAttribute('data-show');
55
- // Disable the event listeners
56
- this.popper.setOptions(options => (Object.assign(Object.assign({}, options), { modifiers: [...options.modifiers, { name: 'eventListeners', enabled: false }] })));
57
- // Remove event listener
58
- document.removeEventListener('click', this.clickOutside, false);
59
- };
60
- /**
61
- * Handle action for close button
62
- *
63
- * @returns {void}
64
- */
65
- this.handleCloseButton = () => {
66
- this.display = false;
67
- };
68
- this.identifier = createID('mg-popover');
69
- this.placement = 'bottom';
70
- this.closeButton = false;
71
- this.display = false;
72
- this.disabled = false;
73
- }
74
- handleDisplay(newValue) {
75
- if (newValue) {
76
- this.show();
77
- }
78
- else {
79
- this.hide();
80
- }
81
- this.displayChange.emit(newValue);
82
- }
83
- /*************
84
- * Lifecycle *
85
- *************/
86
- /**
87
- * Check if component props are well configured on init
88
- *
89
- * @returns {void} timeout
90
- */
91
- componentWillLoad() {
92
- // Get locales
93
- this.messages = initLocales(this.element).messages;
94
- }
95
- /**
96
- * Check if component props are well configured on init
97
- *
98
- * @returns {void}
99
- */
100
- componentDidLoad() {
101
- const headingTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
102
- const slottedTitleElement = this.element.querySelector('[slot="title"]');
103
- if (slottedTitleElement && !isTagName(slottedTitleElement, headingTags)) {
104
- throw new Error(`<mg-popover> Slotted title must be a heading: ${headingTags.join(', ')}`);
105
- }
106
- // Set close button id
107
- if (this.closeButton) {
108
- this.closeButtonId = `${this.identifier}-close-button`;
109
- }
110
- // Get popover content
111
- this.popover = this.element.shadowRoot.getElementById(this.identifier);
112
- //Get interactive element (first element without slot attribute)
113
- const interactiveElement = this.element.querySelector(':not([slot])');
114
- // Add aria attributes
115
- interactiveElement.setAttribute('aria-controls', this.identifier);
116
- interactiveElement.setAttribute('aria-expanded', `${this.display}`);
117
- // Create popperjs popover
118
- this.popper = createPopper(interactiveElement, this.popover, {
119
- placement: this.placement,
120
- strategy: 'fixed',
121
- modifiers: [
122
- {
123
- name: 'offset',
124
- options: {
125
- offset: [0, 10],
126
- },
127
- },
128
- ],
129
- });
130
- // Add events to toggle display
131
- interactiveElement.addEventListener('click', () => {
132
- if (!this.disabled)
133
- this.display = !this.display;
134
- });
135
- // Add events to hide popover
136
- this.element.addEventListener('keydown', e => {
137
- if (!this.disabled && e.code === 'Escape')
138
- this.display = false;
139
- });
140
- this.handleDisplay(this.display);
141
- }
142
- /**
143
- * Render
144
- *
145
- * @returns {HTMLElement} HTML Element
146
- */
147
- render() {
148
- return (h(Host, null, h("slot", null), h("div", { id: this.identifier, class: "mg-popover" }, h("mg-card", null, !this.disabled && 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" })), h("div", { class: "mg-popover__arrow", "data-popper-arrow": true }))));
149
- }
150
- get element() { return this; }
151
- static get watchers() { return {
152
- "display": ["handleDisplay"]
153
- }; }
154
- static get style() { return mgPopoverCss; }
155
- }, [1, "mg-popover", {
156
- "identifier": [1],
157
- "placement": [1],
158
- "closeButton": [4, "close-button"],
159
- "display": [1028],
160
- "disabled": [1028]
161
- }]);
162
- function defineCustomElement$1() {
163
- if (typeof customElements === "undefined") {
164
- return;
165
- }
166
- const components = ["mg-popover", "mg-button", "mg-card", "mg-icon"];
167
- components.forEach(tagName => { switch (tagName) {
168
- case "mg-popover":
169
- if (!customElements.get(tagName)) {
170
- customElements.define(tagName, MgPopover$1);
171
- }
172
- break;
173
- case "mg-button":
174
- if (!customElements.get(tagName)) {
175
- defineCustomElement$4();
176
- }
177
- break;
178
- case "mg-card":
179
- if (!customElements.get(tagName)) {
180
- defineCustomElement$3();
181
- }
182
- break;
183
- case "mg-icon":
184
- if (!customElements.get(tagName)) {
185
- defineCustomElement$2();
186
- }
187
- break;
188
- } });
189
- }
190
- defineCustomElement$1();
1
+ import { M as MgPopover$1, d as defineCustomElement$1 } from './mg-popover2.js';
191
2
 
192
3
  const MgPopover = MgPopover$1;
193
4
  const defineCustomElement = defineCustomElement$1;