@mgdis/mg-components 6.3.0 → 6.4.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 (231) hide show
  1. package/dist/cjs/{index-a5b2cd1b.js → index-911898e4.js} +410 -266
  2. package/dist/cjs/index-911898e4.js.map +1 -0
  3. package/dist/cjs/{index-cc11af95.js → index-a3269bfc.js} +3 -3
  4. package/dist/cjs/{index-cc11af95.js.map → index-a3269bfc.js.map} +1 -1
  5. package/dist/cjs/{index.es-ac7c22e3.js → index.es-325100d7.js} +47 -47
  6. package/dist/cjs/index.es-325100d7.js.map +1 -0
  7. package/dist/cjs/loader.cjs.js +2 -2
  8. package/dist/cjs/mg-action-more_36.cjs.entry.js +1341 -951
  9. package/dist/cjs/mg-action-more_36.cjs.entry.js.map +1 -1
  10. package/dist/cjs/mg-alert.cjs.entry.js +15 -12
  11. package/dist/cjs/mg-alert.cjs.entry.js.map +1 -1
  12. package/dist/cjs/mg-components.cjs.js +3 -3
  13. package/dist/cjs/mg-components.cjs.js.map +1 -1
  14. package/dist/cjs/mg-loader.cjs.entry.js +6 -8
  15. package/dist/cjs/mg-loader.cjs.entry.js.map +1 -1
  16. package/dist/cjs/mg-progress.cjs.entry.js +27 -12
  17. package/dist/cjs/mg-progress.cjs.entry.js.map +1 -1
  18. package/dist/collection/collection-manifest.json +2 -2
  19. package/dist/collection/components/atoms/internals/mg-character-left/mg-character-left.js +10 -3
  20. package/dist/collection/components/atoms/internals/mg-character-left/mg-character-left.js.map +1 -1
  21. package/dist/collection/components/atoms/internals/mg-input-title/mg-input-title.js +15 -4
  22. package/dist/collection/components/atoms/internals/mg-input-title/mg-input-title.js.map +1 -1
  23. package/dist/collection/components/atoms/mg-badge/mg-badge.js +15 -4
  24. package/dist/collection/components/atoms/mg-badge/mg-badge.js.map +1 -1
  25. package/dist/collection/components/atoms/mg-button/mg-button.js +50 -11
  26. package/dist/collection/components/atoms/mg-button/mg-button.js.map +1 -1
  27. package/dist/collection/components/atoms/mg-card/mg-card.js +1 -1
  28. package/dist/collection/components/atoms/mg-divider/mg-divider.js +9 -1
  29. package/dist/collection/components/atoms/mg-divider/mg-divider.js.map +1 -1
  30. package/dist/collection/components/atoms/mg-icon/mg-icon.js +22 -6
  31. package/dist/collection/components/atoms/mg-icon/mg-icon.js.map +1 -1
  32. package/dist/collection/components/atoms/mg-tag/mg-tag.js +14 -4
  33. package/dist/collection/components/atoms/mg-tag/mg-tag.js.map +1 -1
  34. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip-content/mg-tooltip-content.js +3 -4
  35. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip-content/mg-tooltip-content.js.map +1 -1
  36. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js +28 -6
  37. package/dist/collection/components/atoms/mg-tooltip/mg-tooltip.js.map +1 -1
  38. package/dist/collection/components/molecules/inputs/mg-input/mg-input.js +50 -13
  39. package/dist/collection/components/molecules/inputs/mg-input/mg-input.js.map +1 -1
  40. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox-paginated/mg-input-checkbox-paginated.js +29 -11
  41. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox-paginated/mg-input-checkbox-paginated.js.map +1 -1
  42. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.js +106 -33
  43. package/dist/collection/components/molecules/inputs/mg-input-checkbox/mg-input-checkbox.js.map +1 -1
  44. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js +99 -36
  45. package/dist/collection/components/molecules/inputs/mg-input-date/mg-input-date.js.map +1 -1
  46. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.js +130 -35
  47. package/dist/collection/components/molecules/inputs/mg-input-numeric/mg-input-numeric.js.map +1 -1
  48. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.js +87 -25
  49. package/dist/collection/components/molecules/inputs/mg-input-password/mg-input-password.js.map +1 -1
  50. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.js +86 -26
  51. package/dist/collection/components/molecules/inputs/mg-input-radio/mg-input-radio.js.map +1 -1
  52. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js +92 -30
  53. package/dist/collection/components/molecules/inputs/mg-input-select/mg-input-select.js.map +1 -1
  54. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.js +108 -31
  55. package/dist/collection/components/molecules/inputs/mg-input-text/mg-input-text.js.map +1 -1
  56. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.js +109 -29
  57. package/dist/collection/components/molecules/inputs/mg-input-textarea/mg-input-textarea.js.map +1 -1
  58. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.js +67 -21
  59. package/dist/collection/components/molecules/inputs/mg-input-toggle/mg-input-toggle.js.map +1 -1
  60. package/dist/collection/components/molecules/internals/mg-item-more/mg-item-more.js +16 -70
  61. package/dist/collection/components/molecules/internals/mg-item-more/mg-item-more.js.map +1 -1
  62. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js +101 -89
  63. package/dist/collection/components/molecules/menu/mg-menu/mg-menu.js.map +1 -1
  64. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js +194 -157
  65. package/dist/collection/components/molecules/menu/mg-menu-item/mg-menu-item.js.map +1 -1
  66. package/dist/collection/components/molecules/mg-action-more/mg-action-more.js +19 -8
  67. package/dist/collection/components/molecules/mg-action-more/mg-action-more.js.map +1 -1
  68. package/dist/collection/components/molecules/mg-alert/mg-alert.js +15 -6
  69. package/dist/collection/components/molecules/mg-alert/mg-alert.js.map +1 -1
  70. package/dist/collection/components/molecules/mg-details/mg-details.js +17 -5
  71. package/dist/collection/components/molecules/mg-details/mg-details.js.map +1 -1
  72. package/dist/collection/components/molecules/mg-form/mg-form.js +48 -16
  73. package/dist/collection/components/molecules/mg-form/mg-form.js.map +1 -1
  74. package/dist/collection/components/molecules/mg-illustrated-message/mg-illustrated-message.js +13 -3
  75. package/dist/collection/components/molecules/mg-illustrated-message/mg-illustrated-message.js.map +1 -1
  76. package/dist/collection/components/molecules/mg-loader/mg-loader.js +5 -5
  77. package/dist/collection/components/molecules/mg-loader/mg-loader.js.map +1 -1
  78. package/dist/collection/components/molecules/mg-message/mg-message.js +22 -6
  79. package/dist/collection/components/molecules/mg-message/mg-message.js.map +1 -1
  80. package/dist/collection/components/molecules/mg-modal/mg-modal.js +37 -9
  81. package/dist/collection/components/molecules/mg-modal/mg-modal.js.map +1 -1
  82. package/dist/collection/components/molecules/mg-pagination/mg-pagination.js +28 -9
  83. package/dist/collection/components/molecules/mg-pagination/mg-pagination.js.map +1 -1
  84. package/dist/collection/components/molecules/mg-panel/mg-panel.js +48 -13
  85. package/dist/collection/components/molecules/mg-panel/mg-panel.js.map +1 -1
  86. package/dist/collection/components/molecules/mg-popover/mg-popover-content/mg-popover-content.js +10 -2
  87. package/dist/collection/components/molecules/mg-popover/mg-popover-content/mg-popover-content.js.map +1 -1
  88. package/dist/collection/components/molecules/mg-popover/mg-popover.js +44 -7
  89. package/dist/collection/components/molecules/mg-popover/mg-popover.js.map +1 -1
  90. package/dist/collection/components/molecules/mg-progress/mg-progress.js +26 -1
  91. package/dist/collection/components/molecules/mg-progress/mg-progress.js.map +1 -1
  92. package/dist/collection/components/molecules/mg-skip-links/mg-skip-links.js +3 -2
  93. package/dist/collection/components/molecules/mg-skip-links/mg-skip-links.js.map +1 -1
  94. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js +28 -8
  95. package/dist/collection/components/molecules/mg-tabs/mg-tabs.js.map +1 -1
  96. package/dist/collection/utils/behaviors.utils.js +44 -107
  97. package/dist/collection/utils/behaviors.utils.js.map +1 -1
  98. package/dist/components/index.es.js +42 -42
  99. package/dist/components/index.es.js.map +1 -1
  100. package/dist/components/index2.js +2 -2
  101. package/dist/components/mg-action-more.js +15 -12
  102. package/dist/components/mg-action-more.js.map +1 -1
  103. package/dist/components/mg-alert.js +13 -10
  104. package/dist/components/mg-alert.js.map +1 -1
  105. package/dist/components/mg-badge2.js +13 -10
  106. package/dist/components/mg-badge2.js.map +1 -1
  107. package/dist/components/mg-button2.js +37 -16
  108. package/dist/components/mg-button2.js.map +1 -1
  109. package/dist/components/mg-card2.js +1 -1
  110. package/dist/components/mg-character-left2.js +8 -7
  111. package/dist/components/mg-character-left2.js.map +1 -1
  112. package/dist/components/mg-details.js +11 -7
  113. package/dist/components/mg-details.js.map +1 -1
  114. package/dist/components/mg-divider2.js +7 -1
  115. package/dist/components/mg-divider2.js.map +1 -1
  116. package/dist/components/mg-form.js +35 -21
  117. package/dist/components/mg-form.js.map +1 -1
  118. package/dist/components/mg-icon2.js +17 -11
  119. package/dist/components/mg-icon2.js.map +1 -1
  120. package/dist/components/mg-illustrated-message.js +10 -4
  121. package/dist/components/mg-illustrated-message.js.map +1 -1
  122. package/dist/components/mg-input-checkbox-paginated2.js +14 -10
  123. package/dist/components/mg-input-checkbox-paginated2.js.map +1 -1
  124. package/dist/components/mg-input-checkbox.js +73 -40
  125. package/dist/components/mg-input-checkbox.js.map +1 -1
  126. package/dist/components/mg-input-date.js +77 -46
  127. package/dist/components/mg-input-date.js.map +1 -1
  128. package/dist/components/mg-input-numeric.js +89 -44
  129. package/dist/components/mg-input-numeric.js.map +1 -1
  130. package/dist/components/mg-input-password.js +55 -27
  131. package/dist/components/mg-input-password.js.map +1 -1
  132. package/dist/components/mg-input-radio.js +59 -31
  133. package/dist/components/mg-input-radio.js.map +1 -1
  134. package/dist/components/mg-input-select2.js +59 -35
  135. package/dist/components/mg-input-select2.js.map +1 -1
  136. package/dist/components/mg-input-text2.js +69 -38
  137. package/dist/components/mg-input-text2.js.map +1 -1
  138. package/dist/components/mg-input-textarea.js +71 -35
  139. package/dist/components/mg-input-textarea.js.map +1 -1
  140. package/dist/components/mg-input-title2.js +11 -8
  141. package/dist/components/mg-input-title2.js.map +1 -1
  142. package/dist/components/mg-input-toggle.js +43 -25
  143. package/dist/components/mg-input-toggle.js.map +1 -1
  144. package/dist/components/mg-input2.js +37 -20
  145. package/dist/components/mg-input2.js.map +1 -1
  146. package/dist/components/mg-item-more2.js +146 -270
  147. package/dist/components/mg-item-more2.js.map +1 -1
  148. package/dist/components/mg-loader.js +4 -6
  149. package/dist/components/mg-loader.js.map +1 -1
  150. package/dist/components/mg-menu-item2.js +193 -149
  151. package/dist/components/mg-menu-item2.js.map +1 -1
  152. package/dist/components/mg-message2.js +21 -9
  153. package/dist/components/mg-message2.js.map +1 -1
  154. package/dist/components/mg-modal.js +33 -15
  155. package/dist/components/mg-modal.js.map +1 -1
  156. package/dist/components/mg-pagination2.js +21 -14
  157. package/dist/components/mg-pagination2.js.map +1 -1
  158. package/dist/components/mg-panel.js +37 -20
  159. package/dist/components/mg-panel.js.map +1 -1
  160. package/dist/components/mg-popover-content2.js +9 -3
  161. package/dist/components/mg-popover-content2.js.map +1 -1
  162. package/dist/components/mg-popover2.js +35 -10
  163. package/dist/components/mg-popover2.js.map +1 -1
  164. package/dist/components/mg-progress.js +26 -11
  165. package/dist/components/mg-progress.js.map +1 -1
  166. package/dist/components/mg-skip-links.js +2 -3
  167. package/dist/components/mg-skip-links.js.map +1 -1
  168. package/dist/components/mg-tabs.js +27 -17
  169. package/dist/components/mg-tabs.js.map +1 -1
  170. package/dist/components/mg-tag.js +12 -8
  171. package/dist/components/mg-tag.js.map +1 -1
  172. package/dist/components/mg-tooltip-content2.js +1 -2
  173. package/dist/components/mg-tooltip-content2.js.map +1 -1
  174. package/dist/components/mg-tooltip2.js +24 -12
  175. package/dist/components/mg-tooltip2.js.map +1 -1
  176. package/dist/esm/{index-eb0e1053.js → index-1f32332a.js} +410 -266
  177. package/dist/esm/index-1f32332a.js.map +1 -0
  178. package/dist/esm/{index-f3d3fb70.js → index-9bd10f5d.js} +3 -3
  179. package/dist/esm/{index-f3d3fb70.js.map → index-9bd10f5d.js.map} +1 -1
  180. package/dist/esm/{index.es-940821a9.js → index.es-a2587b72.js} +43 -43
  181. package/dist/esm/index.es-a2587b72.js.map +1 -0
  182. package/dist/esm/loader.js +3 -3
  183. package/dist/esm/mg-action-more_36.entry.js +1341 -951
  184. package/dist/esm/mg-action-more_36.entry.js.map +1 -1
  185. package/dist/esm/mg-alert.entry.js +15 -12
  186. package/dist/esm/mg-alert.entry.js.map +1 -1
  187. package/dist/esm/mg-components.js +4 -4
  188. package/dist/esm/mg-components.js.map +1 -1
  189. package/dist/esm/mg-loader.entry.js +6 -8
  190. package/dist/esm/mg-loader.entry.js.map +1 -1
  191. package/dist/esm/mg-progress.entry.js +27 -12
  192. package/dist/esm/mg-progress.entry.js.map +1 -1
  193. package/dist/mg-components/mg-components.esm.js +1 -1
  194. package/dist/mg-components/mg-components.esm.js.map +1 -1
  195. package/dist/mg-components/p-0ead5317.entry.js +2 -0
  196. package/dist/mg-components/{p-d0086664.entry.js.map → p-0ead5317.entry.js.map} +1 -1
  197. package/dist/mg-components/p-35898742.js +3 -0
  198. package/dist/mg-components/p-35898742.js.map +1 -0
  199. package/dist/mg-components/p-3b052ac0.entry.js +2 -0
  200. package/dist/mg-components/p-3b052ac0.entry.js.map +1 -0
  201. package/dist/mg-components/p-6810a565.entry.js +2 -0
  202. package/dist/mg-components/p-6810a565.entry.js.map +1 -0
  203. package/dist/mg-components/{p-ee51ec5e.js → p-b986c107.js} +2 -2
  204. package/dist/mg-components/p-b986c107.js.map +1 -0
  205. package/dist/mg-components/{p-a49e2b74.js → p-dc436f3c.js} +2 -2
  206. package/dist/mg-components/p-f48d964f.entry.js +2 -0
  207. package/dist/mg-components/p-f48d964f.entry.js.map +1 -0
  208. package/dist/types/components/molecules/inputs/mg-input-numeric/mg-input-numeric.d.ts +6 -0
  209. package/dist/types/components/molecules/internals/mg-item-more/mg-item-more.d.ts +1 -15
  210. package/dist/types/components/molecules/menu/mg-menu/mg-menu.d.ts +14 -30
  211. package/dist/types/components/molecules/menu/mg-menu-item/mg-menu-item.d.ts +46 -37
  212. package/dist/types/components.d.ts +0 -5
  213. package/dist/types/utils/behaviors.utils.d.ts +15 -44
  214. package/ide/intellij/web-types.json +3 -7
  215. package/ide/vscode/html-custom-data.json +2 -2
  216. package/package.json +22 -22
  217. package/dist/cjs/index-a5b2cd1b.js.map +0 -1
  218. package/dist/cjs/index.es-ac7c22e3.js.map +0 -1
  219. package/dist/esm/index-eb0e1053.js.map +0 -1
  220. package/dist/esm/index.es-940821a9.js.map +0 -1
  221. package/dist/mg-components/p-15b6849a.js +0 -3
  222. package/dist/mg-components/p-15b6849a.js.map +0 -1
  223. package/dist/mg-components/p-3aecf564.entry.js +0 -2
  224. package/dist/mg-components/p-3aecf564.entry.js.map +0 -1
  225. package/dist/mg-components/p-6f3d70b2.entry.js +0 -2
  226. package/dist/mg-components/p-6f3d70b2.entry.js.map +0 -1
  227. package/dist/mg-components/p-a17ea0af.entry.js +0 -2
  228. package/dist/mg-components/p-a17ea0af.entry.js.map +0 -1
  229. package/dist/mg-components/p-d0086664.entry.js +0 -2
  230. package/dist/mg-components/p-ee51ec5e.js.map +0 -1
  231. /package/dist/mg-components/{p-a49e2b74.js.map → p-dc436f3c.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { proxyCustomElement, HTMLElement, h, Host } from '@stencil/core/internal/client';
2
- import { Y as Ye, m as me, t as tt } from './index.es.js';
2
+ import { J as Je } from './index.es.js';
3
3
  import { d as defineCustomElement$4, D as Direction, s as sizes } from './mg-menu-item2.js';
4
4
  import { i as initLocales } from './index2.js';
5
5
  import { d as defineCustomElement$8 } from './mg-badge2.js';
@@ -10,19 +10,13 @@ import { d as defineCustomElement$3 } from './mg-popover2.js';
10
10
  import { d as defineCustomElement$2 } from './mg-popover-content2.js';
11
11
 
12
12
  /**
13
- * MgItemMore type guard
14
- * @param element - element to control type
15
- * @returns truthy if element is mg-item-more
13
+ *
16
14
  */
17
- const isMgItemMore = (element) => element.nodeName === 'MG-ITEM-MORE';
18
- const OverflowBehaviorElements = {
19
- BASE_INDEX: 'data-overflow-base-index',
20
- PROXY_INDEX: 'data-overflow-proxy-index',
21
- };
22
15
  class OverflowBehavior {
23
- constructor(element, render) {
24
- this.element = element;
25
- this.render = render;
16
+ constructor(parentElement, itemMoreElement, itemMoreContainerElement) {
17
+ this.parentElement = parentElement;
18
+ this.itemMoreElement = itemMoreElement;
19
+ this.itemMoreContainerElement = itemMoreContainerElement;
26
20
  /**********
27
21
  * Public *
28
22
  **********/
@@ -36,120 +30,63 @@ class OverflowBehavior {
36
30
  * Internal *
37
31
  ************/
38
32
  /**
39
- * run overflow behavior
40
- * @param width - width of the container. Optional.
41
- */
42
- this.run = (width) => {
43
- if (this._moreElement === undefined) {
44
- // set moreElement
45
- this._moreElement = this.render();
46
- // set children
47
- this._baseChildren = this.getInteractiveItems(this.element);
48
- if (isMgItemMore(this._moreElement)) {
49
- this._proxyChildren = this.getInteractiveItems(this._moreElement.shadowRoot.querySelector('mg-menu'));
50
- }
51
- // update children
52
- this._baseChildren.forEach((child, index) => {
53
- child.setAttribute(OverflowBehaviorElements.BASE_INDEX, `${index}`);
54
- // set moreElement children
55
- this._proxyChildren[index].setAttribute(OverflowBehaviorElements.PROXY_INDEX, `${index}`);
56
- });
57
- }
58
- if (width !== undefined)
59
- this.updateDisplayedItems(width);
60
- };
61
- /**
62
- * Get interactive children filtred by authorized nodeName ['MG-MENU-ITEM', 'MG-BUTTON']
63
- * @param element - element to parse
64
- * @returns children
65
- */
66
- this.getInteractiveItems = (element) => { var _a; return (((_a = element.children) === null || _a === void 0 ? void 0 : _a.length) > 0 ? Array.from(element.children) : []).filter(element => ['MG-MENU-ITEM', 'MG-BUTTON'].includes(element.nodeName)); };
67
- /**
68
- * Update displayed items in container from a given available space
69
- * @param availableWidth - available width in container to display child items
33
+ * Utility method to know if element is HTMLMgItemMoreElement
34
+ * @param element - element to match with 'MORE' element
35
+ * @returns truthy if element is the 'MORE' element
70
36
  */
71
- this.updateDisplayedItems = (availableWidth) => {
72
- this.restoreItems();
73
- const acc = { accWidth: 0, previousItem: null };
74
- [...this._baseChildren, this._moreElement].forEach((child) => {
75
- acc.accWidth += child.offsetWidth;
76
- const hasPreviuosItem = acc.previousItem !== null;
77
- const isPreviousItemHidden = hasPreviuosItem && acc.previousItem.hasAttribute('hidden');
78
- // if previous item is hidden AND is NOT more element we hide current
79
- // OR if item has an overflow we hide current
80
- // OR if current item is more element AND have NOT previous hidden items, current more element item is an hidden item
81
- // ELSE current is a display item
82
- this.toggleItem(child, (isPreviousItemHidden && !this.isMoreElement(child)) || this.isOverflowElement(acc.accWidth, child, availableWidth) || (this.isMoreElement(child) && !isPreviousItemHidden));
83
- // update previous item with current item
84
- acc.previousItem = child;
85
- });
86
- };
37
+ this.isMoreElement = (element) => element === this.itemMoreElement;
87
38
  /**
88
39
  * Utility method to know if item overflow partialy or totaly in the container
89
40
  * @param cumulateWidth - previous sibling elements cumulate width + item width
90
41
  * @param item - item HTML element
91
- * @param availableWidth - container available width
92
42
  * @returns truthy if element is overflow
93
43
  */
94
- this.isOverflowElement = (cumulateWidth, item, availableWidth) => {
95
- if (item.previousElementSibling === null || this.isMoreElement(item))
96
- return false;
97
- else if (!this.isMoreElement(item.nextElementSibling))
98
- return cumulateWidth + this._moreElement.offsetWidth > availableWidth;
99
- else
100
- return cumulateWidth > availableWidth;
101
- };
102
- /**
103
- * Utility method to know if a given element is the 'MORE' element
104
- * @param element - element to match with 'MORE' element
105
- * @returns truthy if element is the 'MORE' element
106
- */
107
- this.isMoreElement = (element) => element.nodeName === 'MG-ITEM-MORE';
108
- /**
109
- * Toggle display item element
110
- * @param item - item to control
111
- * @param isHidden - is item hidden
112
- */
113
- this.toggleItem = (item, isHidden) => {
114
- const mgActionMenuindex = Number(item.getAttribute(OverflowBehaviorElements.BASE_INDEX));
115
- if (this.isMoreElement(item))
116
- this.toggleElement(this._moreElement, isHidden);
117
- else if (mgActionMenuindex >= 0) {
118
- this.toggleElement(item, isHidden);
119
- this.toggleElement(this._proxyChildren[mgActionMenuindex], !isHidden);
44
+ this.isOverflowElement = (cumulateWidth, item) => {
45
+ const displayMgItemMore = this.itemMoreContainerElement.children.length > 0;
46
+ if (!this.isMoreElement(item)) {
47
+ if (item.nextElementSibling.nodeName !== 'MG-ITEM-MORE' && !displayMgItemMore)
48
+ return cumulateWidth + this.itemMoreElement.offsetWidth > this._availableWidth;
49
+ else
50
+ return cumulateWidth > this._availableWidth;
120
51
  }
121
- };
122
- /**
123
- * Toggle element's hide attribute
124
- * @param element - element to toggle
125
- * @param isHidden - element is hidden
126
- */
127
- this.toggleElement = (element, isHidden) => {
128
- if (isHidden)
129
- element.setAttribute('hidden', '');
130
52
  else
131
- element.removeAttribute('hidden');
53
+ return !displayMgItemMore;
132
54
  };
133
55
  /**
134
- * Remove hidden attributes on all items
56
+ * Toogle item from isHidden condition
57
+ * @param item - item to update
58
+ * @param isHidden - item is hidden
135
59
  */
136
- this.restoreItems = () => {
137
- [...this._baseChildren, this._moreElement].forEach(item => item.removeAttribute('hidden'));
60
+ this.toggleItem = (item, isHidden) => {
61
+ if (this.isMoreElement(item) && isHidden)
62
+ item.setAttribute('hidden', '');
63
+ else if (this.isMoreElement(item) && !isHidden)
64
+ item.removeAttribute('hidden');
65
+ else if (!this.isMoreElement(item) && isHidden)
66
+ this.itemMoreContainerElement.appendChild(item);
67
+ else if (!this.isMoreElement(item) && item.parentElement !== this.parentElement)
68
+ this.parentElement.insertBefore(item, this.itemMoreElement);
138
69
  };
139
- if (this._resizeObserver === undefined) {
140
- // add resize observer
141
- this._resizeObserver = new ResizeObserver(entries => {
142
- entries.forEach(entry => {
143
- this.run(entry.contentRect.width);
144
- });
145
- });
146
- this._resizeObserver.observe(this.element);
70
+ if (!this.parentElement || !this.itemMoreElement || !this.itemMoreContainerElement) {
71
+ throw new Error('OverflowBehavior - all construtor params are required');
147
72
  }
148
- this.run();
73
+ const items = Array.from(this.parentElement.children);
74
+ this._resizeObserver = new ResizeObserver(entries => {
75
+ this._availableWidth = entries.map(entry => entry.contentRect.width).sort((a, b) => a - b).shift();
76
+ // reset items
77
+ items.forEach(item => this.toggleItem(item, false));
78
+ let accWidth = 0;
79
+ items.forEach((item, index) => {
80
+ accWidth += item.offsetWidth;
81
+ if (index)
82
+ this.toggleItem(item, this.isOverflowElement(accWidth, item));
83
+ });
84
+ });
85
+ this._resizeObserver.observe(this.parentElement);
149
86
  }
150
87
  }
151
88
 
152
- const mgMenuCss = ".mg-u-visually-hidden{position:absolute !important;overflow:hidden !important;width:.1rem !important;height:.1rem !important;padding:0 !important;border:0 !important;margin:-0.1rem !important;clip:rect(0.1rem, 0.1rem, 0.1rem, 0.1rem) !important;clip-path:inset(50%) !important;white-space:nowrap !important}*:focus:not(:focus-visible){outline:none}@media (prefers-reduced-motion){*{animation:none !important;transition:none !important}}/*!\n * @prop --mg-c-menu-color-background: Defines the background color of the menu. Unset by default, fallback on `--mg-b-color-light`.\n */:host{display:flex;background-color:var(--mg-c-menu-color-background, var(--mg-b-color-light))}:host([direction=vertical]){height:100%;flex-direction:column;overflow-y:auto}";
89
+ const mgMenuCss = ".mg-u-visually-hidden{position:absolute !important;overflow:hidden !important;width:.1rem !important;height:.1rem !important;padding:0 !important;border:0 !important;margin:-0.1rem !important;clip:rect(0.1rem, 0.1rem, 0.1rem, 0.1rem) !important;clip-path:inset(50%) !important;white-space:nowrap !important}*:focus:not(:focus-visible){outline:none}@media (prefers-reduced-motion){*{animation:none !important;transition:none !important}}/*!\n * @prop --mg-c-menu-color-background: Defines the background color of the menu. Unset by default, fallback on `--mg-b-color-light`.\n */:host{display:inline-flex;width:100%;background-color:var(--mg-c-menu-color-background, var(--mg-b-color-light))}:host([direction=vertical]){display:flex;height:100%;flex-direction:column;overflow-y:auto}";
153
90
  const MgMenuStyle0 = mgMenuCss;
154
91
 
155
92
  const MgMenu = /*@__PURE__*/ proxyCustomElement(class MgMenu extends HTMLElement {
@@ -161,100 +98,78 @@ const MgMenu = /*@__PURE__*/ proxyCustomElement(class MgMenu extends HTMLElement
161
98
  * Internal *
162
99
  ************/
163
100
  this.name = 'mg-menu';
164
- this.menuItems = [];
165
- this.focusedMenuItem = 0;
166
- /*************
167
- * Methods *
168
- *************/
169
101
  /**
170
- * Close matching menu-item
171
- * @param item - menu-item to close
172
- * @param condition - addionnal condition
102
+ * Component display direction.
173
103
  */
174
- this.closeMenuItem = (item, condition) => {
175
- if (!this.isChildMenu && condition) {
176
- item.expanded = false;
177
- }
178
- };
104
+ this.direction = Direction.HORIZONTAL;
179
105
  /**
180
- * get mg-item-more child mg-menu-item element
181
- * @returns mg-menu-item element
106
+ * Define mg-menu size
182
107
  */
183
- this.getItemMoreMenuItem = () => { var _a, _b; return (_b = (_a = this.itemMoreElement) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('mg-menu-item'); };
108
+ this.size = 'medium';
109
+ /*************
110
+ * Methods *
111
+ *************/
184
112
  /**
185
- * Set item listend
186
- * @param item - mg-menu-item element
187
- * @param index - number
113
+ * Test if menu is a child menu
114
+ * @returns truthy if menu is a child menu
188
115
  */
189
- this.setItemListener = (item, index) => {
190
- ['click', 'focus'].forEach(trigger => {
191
- item.shadowRoot.querySelector('button,a').addEventListener(trigger, () => {
192
- this.focusedMenuItem = index;
193
- // reset expanded on previous active menu item
194
- const itemMoreMenuItem = this.getItemMoreMenuItem();
195
- (![null, undefined].includes(itemMoreMenuItem) ? [...this.menuItems, itemMoreMenuItem] : this.menuItems).forEach((item, index) => {
196
- this.closeMenuItem(item, index !== this.focusedMenuItem);
197
- });
198
- });
199
- });
200
- };
116
+ this.isChildMenu = () => this.element.closest('mg-menu-item') !== null;
201
117
  /**
202
- * Store menu-items on component init and add listeners
118
+ * Get menu children items
119
+ * @returns menu children mg-menu-item
203
120
  */
204
- this.initMenuItemsListeners = () => {
205
- // add listeners on menu item and edit index
206
- this.menuItems.forEach((item, index) => {
207
- this.setItemListener(item, index);
208
- });
121
+ this.getMenuItems = (menu = this.element) => {
122
+ var _a, _b;
123
+ const menuItems = Array.from(menu.children).filter(child => child.nodeName === 'MG-MENU-ITEM');
124
+ const itemMoreMenuItem = (_b = (_a = menu.querySelector('mg-item-more')) === null || _a === void 0 ? void 0 : _a.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('mg-menu-item');
125
+ if (itemMoreMenuItem) {
126
+ menuItems.push(itemMoreMenuItem);
127
+ }
128
+ return menuItems;
209
129
  };
210
130
  /**
211
- * Handle item-loaded event on mg-item-more element
131
+ * Update menu items
212
132
  */
213
- this.handleItemLoaded = () => {
214
- this.setItemListener(this.getItemMoreMenuItem(), this.menuItems.length);
133
+ this.updateMenuItems = () => {
134
+ this.getMenuItems().forEach((item) => {
135
+ item.dataset.styleDirection = this.direction;
136
+ });
137
+ // render mg-item-more to manage OverflowBehavior
138
+ this.renderMgItemMore();
215
139
  };
216
140
  /**
217
141
  * render mg-item-more
218
142
  */
219
143
  this.renderMgItemMore = () => {
220
144
  var _a;
221
- if (this.direction !== Direction.HORIZONTAL || this.isChildMenu || this.element.children.length <= 1) {
145
+ if (this.direction === Direction.VERTICAL || this.direction === Direction.HORIZONTAL && this.isChildMenu() || this.element.children.length <= 1) {
222
146
  return;
223
147
  }
224
148
  // Insert mg-item-more outside the mg-menu shadowdom
225
- if (this.itemMoreElement === undefined) {
226
- this.itemMoreElement = document.createElement('mg-item-more');
227
- this.itemMoreElement.addEventListener('item-loaded', this.handleItemLoaded);
228
- this.element.appendChild(this.itemMoreElement);
149
+ let itemMoreElement = this.element.querySelector('mg-item-more');
150
+ if (itemMoreElement === null) {
151
+ itemMoreElement = document.createElement('mg-item-more');
152
+ this.element.appendChild(itemMoreElement);
229
153
  }
230
154
  // update mg-item-more props
231
- for (const attribute in this.itemmore) {
232
- const newValue = this.itemmore[attribute];
233
- // to improve rendering we use HTML attributes as much as possible
234
- if (['string', 'number'].includes(typeof newValue)) {
235
- this.itemMoreElement.setAttribute(attribute, newValue);
236
- }
237
- else {
238
- this.itemMoreElement[attribute] = newValue;
239
- }
155
+ for (const propertie in this.itemmore) {
156
+ itemMoreElement[propertie] = this.itemmore[propertie];
240
157
  }
241
158
  if (((_a = this.itemmore) === null || _a === void 0 ? void 0 : _a.size) === undefined)
242
- this.itemMoreElement.size = this.size;
159
+ itemMoreElement.size = this.size;
243
160
  };
244
- this.label = undefined;
245
- this.direction = Direction.HORIZONTAL;
246
- this.itemmore = undefined;
247
- this.size = 'medium';
248
- this.isChildMenu = undefined;
249
161
  }
250
162
  validateLabel(newValue) {
251
163
  if (newValue === undefined && !this.element.hasAttribute('aria-label')) {
252
- throw new Error(`<${this.name}> prop "label" is required. Passed value: ${Ye(newValue)}.`);
164
+ throw new Error(`<${this.name}> prop "label" is required. Passed value: ${Je(newValue)}.`);
253
165
  }
254
166
  }
255
167
  validateDirection(newValue) {
256
168
  if (![Direction.VERTICAL, Direction.HORIZONTAL].includes(newValue)) {
257
- throw new Error(`<${this.name}> prop "direction" must be one of: ${Direction.HORIZONTAL}, ${Direction.VERTICAL}. Passed value: ${Ye(newValue)}.`);
169
+ throw new Error(`<${this.name}> prop "direction" must be one of: ${Direction.HORIZONTAL}, ${Direction.VERTICAL}. Passed value: ${Je(newValue)}.`);
170
+ }
171
+ else {
172
+ this.updateMenuItems();
258
173
  }
259
174
  }
260
175
  validateItemMore(newValue) {
@@ -267,9 +182,30 @@ const MgMenu = /*@__PURE__*/ proxyCustomElement(class MgMenu extends HTMLElement
267
182
  }
268
183
  validateSize(newValue) {
269
184
  if (!sizes.includes(newValue)) {
270
- throw new Error(`<${this.name}> prop "size" must be one of: ${sizes.join(', ')}. Passed value: ${Ye(newValue)}.`);
185
+ throw new Error(`<${this.name}> prop "size" must be one of: ${sizes.join(', ')}. Passed value: ${Je(newValue)}.`);
271
186
  }
272
187
  }
188
+ /**
189
+ * Define mg-menu-item listener when they are loaded
190
+ * @param event - mg-item-loaded "item-loaded" custom event
191
+ */
192
+ updateItemListener(event) {
193
+ const itemToWatch = event.target.nodeName === 'MG-ITEM-MORE' ? event.target.shadowRoot.querySelector('mg-menu-item') : event.target;
194
+ ['click', 'focus'].forEach(trigger => {
195
+ itemToWatch.addEventListener(trigger, () => {
196
+ const focusedItem = event.target.closest('mg-menu').querySelector('[data-has-focus]');
197
+ // exit process if new focused item in the current menu children
198
+ if (focusedItem === itemToWatch)
199
+ return;
200
+ // reset expanded on previous active menu item
201
+ if (focusedItem)
202
+ focusedItem.removeAttribute("data-has-focus");
203
+ // update focusedMenuItem with new value
204
+ itemToWatch.setAttribute('data-has-focus', 'true');
205
+ });
206
+ });
207
+ }
208
+ ;
273
209
  /*************
274
210
  * Lifecycle *
275
211
  *************/
@@ -284,37 +220,38 @@ const MgMenu = /*@__PURE__*/ proxyCustomElement(class MgMenu extends HTMLElement
284
220
  }
285
221
  /**
286
222
  * Check if component slots configuration
287
- * @returns timeout
288
223
  */
289
224
  componentDidLoad() {
290
- // update props and states after componentDidLoad hook
291
- // return a promise to process action only in the FIRST render().
292
- // https://stenciljs.com/docs/component-lifecycle#componentwillload
293
- return setTimeout(() => {
294
- // store all menu-items
295
- this.menuItems = Array.from(this.element.children).filter(child => child.nodeName === 'MG-MENU-ITEM');
296
- this.isChildMenu = this.element.closest('mg-menu-item') !== null;
297
- // add mg-item-more to manage OverflowBehavior
298
- // when all props, states and DOM are already rendered we can render the mg-item-more
299
- this.renderMgItemMore();
300
- // then use mutation observer on children to improve reactivity
301
- new MutationObserver(() => {
302
- this.renderMgItemMore();
303
- }).observe(this.element, { childList: true });
304
- });
305
- }
306
- /**
307
- * Add listeners to items
308
- */
309
- componentDidRender() {
310
- this.initMenuItemsListeners();
225
+ // set menu-items
226
+ this.updateMenuItems();
227
+ // add listener to close main menu when focus leave it
228
+ if (!this.isChildMenu() && this.direction === Direction.HORIZONTAL) {
229
+ document.addEventListener('focusin', (event) => {
230
+ const isElementChild = (element) => {
231
+ if (element === this.element)
232
+ return true;
233
+ else if (!element.parentElement)
234
+ return false;
235
+ else
236
+ return isElementChild(element.parentElement);
237
+ };
238
+ if (!event.target.closest('mg-menu') || !isElementChild(event.target)) {
239
+ const focusedItem = this.element.querySelector('[data-has-focus]');
240
+ // reset expanded on previous active menu item
241
+ if (focusedItem)
242
+ focusedItem.removeAttribute('data-has-focus');
243
+ }
244
+ });
245
+ }
246
+ // add mutation observer to improve global reactivity
247
+ new MutationObserver(this.updateMenuItems).observe(this.element, { childList: true });
311
248
  }
312
249
  /**
313
250
  * Render
314
251
  * @returns HTML Element
315
252
  */
316
253
  render() {
317
- return (h(Host, { key: '550624e40ec66eeb90f8bc4ac1590adcbaa20dfd', role: "list", "aria-label": this.label }, h("slot", { key: 'bf6f5ac748fd45e250c02d93cc7cf72e4580de3b' })));
254
+ return (h(Host, { key: 'eb78530a80f841391df90167523b6d446cd5405e', role: "list", "aria-label": this.label }, h("slot", { key: '1a8839c831a81915de8a5b03ebe1481a32762217' })));
318
255
  }
319
256
  get element() { return this; }
320
257
  static get watchers() { return {
@@ -328,9 +265,8 @@ const MgMenu = /*@__PURE__*/ proxyCustomElement(class MgMenu extends HTMLElement
328
265
  "label": [1],
329
266
  "direction": [513],
330
267
  "itemmore": [16],
331
- "size": [1],
332
- "isChildMenu": [32]
333
- }, undefined, {
268
+ "size": [1]
269
+ }, [[0, "item-loaded", "updateItemListener"]], {
334
270
  "label": ["validateLabel"],
335
271
  "direction": ["validateDirection"],
336
272
  "itemmore": ["validateItemMore"],
@@ -409,86 +345,27 @@ const MgItemMore = /*@__PURE__*/ proxyCustomElement(class MgItemMore extends HTM
409
345
  ************/
410
346
  this.name = 'mg-item-more';
411
347
  /**
412
- * Set proxy element properties and listeners
413
- * @param proxified - element to proxify from
348
+ * Define icon
414
349
  */
415
- this.setProxyElement = (proxified) => {
416
- const proxy = this.moreElementMenuItem.querySelector(`[identifier="${proxified.identifier}"]`);
417
- if (proxy === null) {
418
- return;
419
- }
420
- // remove proxy id to prevent duplicate key. default html id is: '';
421
- if (me(proxy.id))
422
- proxy.id = '';
423
- const proxyClickHandler = () => {
424
- this.parentMenu
425
- .querySelector(`[identifier="${proxy.identifier}"]`)
426
- .shadowRoot.querySelector('a, button')
427
- .dispatchEvent(new MouseEvent('click', { bubbles: true }));
428
- };
429
- // Watch the `item-updated` event to keep element needeed properties and innerHTML in sync between the proxified and the proxy elements
430
- const updateProxy = (element) => {
431
- for (const key in element) {
432
- if (['identifier', 'href', 'targer', 'status', 'expanded'].includes(key))
433
- element[key] ? proxy.setAttribute(key, element[key]) : proxy.removeAttribute(key);
434
- }
435
- proxy.innerHTML = element.innerHTML;
436
- // When `href` is updated we need to wait the full component re-render before update its handler
437
- setTimeout(() => {
438
- const interactiveElement = proxy.shadowRoot.querySelector('a, button');
439
- interactiveElement === null || interactiveElement === void 0 ? void 0 : interactiveElement.removeEventListener('click', proxyClickHandler);
440
- interactiveElement === null || interactiveElement === void 0 ? void 0 : interactiveElement.addEventListener('click', proxyClickHandler);
441
- });
442
- };
443
- updateProxy(proxified);
444
- proxified.addEventListener('item-updated', event => {
445
- updateProxy(event.target);
446
- });
447
- // update click event listener on proxy item and mirror the event on the main menu element
448
- // we need to wait mg-menu-item to be loaded to ensure the shadowroot is rendered
449
- proxy.addEventListener('item-loaded', () => {
450
- updateProxy(proxified);
451
- });
452
- };
453
- /***********
454
- * Methods *
455
- ***********/
350
+ this.icon = { icon: 'ellipsis-vertical' };
456
351
  /**
457
- * render mg-item-more overflow element
458
- * @returns mg-item-more element
352
+ * Define slot label element
459
353
  */
460
- this.renderMgMenuItemOverflowElement = () => {
461
- this.parentMenuItems.forEach((child) => {
462
- // create item-more menu items element from main menu-items clones
463
- this.moreElementMenuItem.querySelector('mg-menu').appendChild(child.cloneNode(true));
464
- // we need to get all `mg-menu-item` linked to the cloned one to set mirror process
465
- tt(() => {
466
- this.setProxyElement(child);
467
- if (child.querySelector('mg-menu') !== null) {
468
- child.querySelectorAll('mg-menu-item').forEach(this.setProxyElement);
469
- }
470
- });
471
- });
472
- return this.element;
473
- };
474
- this.icon = { icon: 'ellipsis-vertical' };
475
354
  this.slotlabel = { display: false };
476
- this.size = undefined;
477
- this.parentMenu = undefined;
478
355
  }
479
356
  validateIcon(newValue) {
480
357
  if (typeof newValue !== 'object' || (typeof newValue === 'object' && typeof newValue.icon !== 'string'))
481
- throw new Error(`<${this.name}> prop "icon" must match MgItemMore['icon'] type. Passed value: ${Ye(newValue)}.`);
358
+ throw new Error(`<${this.name}> prop "icon" must match MgItemMore['icon'] type. Passed value: ${Je(newValue)}.`);
482
359
  }
483
360
  validateSlotLabel(newValue) {
484
361
  if (typeof newValue !== 'object' || (typeof newValue === 'object' && typeof newValue.display !== 'boolean'))
485
- throw new Error(`<${this.name}> prop "slotlabel" must match MgItemMore['slotlabel'] type. Passed value: ${Ye(newValue)}.`);
362
+ throw new Error(`<${this.name}> prop "slotlabel" must match MgItemMore['slotlabel'] type. Passed value: ${Je(newValue)}.`);
486
363
  else if (typeof newValue.label !== 'string')
487
364
  this.slotlabel.label = this.messages.menuLabel;
488
365
  }
489
366
  validateSize(newValue) {
490
367
  if (newValue && !sizes.includes(newValue))
491
- throw new Error(`<${this.name}> prop "size" must match MgItemMore['size'] type. Passed value: ${Ye(newValue)}.`);
368
+ throw new Error(`<${this.name}> prop "size" must match MgItemMore['size'] type. Passed value: ${Je(newValue)}.`);
492
369
  }
493
370
  /*************
494
371
  * Lifecycle *
@@ -519,8 +396,7 @@ const MgItemMore = /*@__PURE__*/ proxyCustomElement(class MgItemMore extends HTM
519
396
  */
520
397
  componentDidUpdate() {
521
398
  if (this.parentMenu && this.overflowBehavior === undefined) {
522
- this.parentMenuItems = Array.from(this.parentMenu.children).filter(item => item.nodeName === 'MG-MENU-ITEM');
523
- this.overflowBehavior = new OverflowBehavior(this.parentMenu, this.renderMgMenuItemOverflowElement);
399
+ this.overflowBehavior = new OverflowBehavior(this.parentMenu, this.element, this.itemMoreContainer);
524
400
  }
525
401
  }
526
402
  /**
@@ -535,11 +411,11 @@ const MgItemMore = /*@__PURE__*/ proxyCustomElement(class MgItemMore extends HTM
535
411
  * @returns HTML Element
536
412
  */
537
413
  render() {
538
- return (h(Host, { key: '11c43154129c5756e80db0af3434c88cab2191f3', role: "listitem" }, this.parentMenu && (h("mg-menu-item", { key: '38fc92410328c317fb046f4e1ec4f94175d484fb', "data-overflow-more": true, "data-size": this.parentMenu.size, identifier: "mg-item-more", ref: el => {
539
- if (el !== null) {
540
- this.moreElementMenuItem = el;
541
- }
542
- } }, h("mg-icon", { key: '90e21f30004e38a1a0938359276dccd7458e5e86', icon: this.icon.icon, size: this.size, slot: "image" }), h("span", { key: '20f846c5718a19d39ad94abf59bab54658e1ff9c', class: { 'mg-u-visually-hidden': !this.slotlabel.display }, slot: "label" }, this.slotlabel.label), h("mg-menu", { key: 'b52f97129e736be9164ae18b717057d1bfc0cd0a', direction: Direction.VERTICAL, label: this.messages.menuLabel, size: this.size })))));
414
+ const menuItemIdentifier = "mg-item-more";
415
+ return (h(Host, { key: '522fc142a992fa450b2d102e2c053fcd25704dcc', role: "listitem", "data-mg-popover-guard": `${menuItemIdentifier}-popover` }, this.parentMenu && (h("mg-menu-item", { key: 'c05fb5c0379656b9634beca745b3b74d36c8e46c', "data-overflow-more": true, "data-size": this.parentMenu.size, "data-style-direction": Direction.HORIZONTAL, identifier: menuItemIdentifier }, h("mg-icon", { key: 'e40f07ce8c55c30ef79a42ddb973d884ab289427', icon: this.icon.icon, size: this.size, slot: "image" }), h("span", { key: '3b38b9362a023df9e53733bf810c4f37a0016a93', class: { 'mg-u-visually-hidden': !this.slotlabel.display }, slot: "label" }, this.slotlabel.label), h("mg-menu", { key: '4f20389326507261356d897dd25e676ac37ca5bb', direction: Direction.VERTICAL, label: this.messages.menuLabel, size: this.size, ref: (ref) => {
416
+ if (ref !== null)
417
+ this.itemMoreContainer = ref;
418
+ } })))));
543
419
  }
544
420
  get element() { return this; }
545
421
  static get watchers() { return {