@studiometa/ui 0.2.23 → 0.2.25

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 (195) hide show
  1. package/README.md +2 -12
  2. package/atoms/AnchorScrollTo/AnchorScrollTo.cjs +11 -0
  3. package/atoms/AnchorScrollTo/AnchorScrollTo.cjs.map +2 -2
  4. package/atoms/AnchorScrollTo/AnchorScrollTo.js +11 -0
  5. package/atoms/AnchorScrollTo/AnchorScrollTo.js.map +2 -2
  6. package/atoms/Button/StyledButton.twig +6 -4
  7. package/atoms/Button/StyledButtonRounded.twig +65 -0
  8. package/atoms/Cursor/Cursor.cjs +12 -0
  9. package/atoms/Cursor/Cursor.cjs.map +2 -2
  10. package/atoms/Cursor/Cursor.js +12 -0
  11. package/atoms/Cursor/Cursor.js.map +2 -2
  12. package/atoms/Figure/Figure.cjs +27 -3
  13. package/atoms/Figure/Figure.cjs.map +2 -2
  14. package/atoms/Figure/Figure.js +27 -3
  15. package/atoms/Figure/Figure.js.map +2 -2
  16. package/atoms/Figure/Figure.twig +6 -1
  17. package/atoms/Figure/FigureTwicpics.cjs +21 -0
  18. package/atoms/Figure/FigureTwicpics.cjs.map +1 -1
  19. package/atoms/Figure/FigureTwicpics.js +21 -0
  20. package/atoms/Figure/FigureTwicpics.js.map +1 -1
  21. package/atoms/LargeText/LargeText.cjs +27 -0
  22. package/atoms/LargeText/LargeText.cjs.map +2 -2
  23. package/atoms/LargeText/LargeText.js +27 -0
  24. package/atoms/LargeText/LargeText.js.map +2 -2
  25. package/atoms/LazyInclude/LazyInclude.cjs +15 -0
  26. package/atoms/LazyInclude/LazyInclude.cjs.map +2 -2
  27. package/atoms/LazyInclude/LazyInclude.js +15 -0
  28. package/atoms/LazyInclude/LazyInclude.js.map +2 -2
  29. package/atoms/Prefetch/AbstractPrefetch.cjs +12 -0
  30. package/atoms/Prefetch/AbstractPrefetch.cjs.map +2 -2
  31. package/atoms/Prefetch/AbstractPrefetch.js +12 -0
  32. package/atoms/Prefetch/AbstractPrefetch.js.map +2 -2
  33. package/atoms/Prefetch/PrefetchWhenOver.cjs +6 -0
  34. package/atoms/Prefetch/PrefetchWhenOver.cjs.map +2 -2
  35. package/atoms/Prefetch/PrefetchWhenOver.js +6 -0
  36. package/atoms/Prefetch/PrefetchWhenOver.js.map +2 -2
  37. package/atoms/Prefetch/PrefetchWhenVisible.cjs +6 -0
  38. package/atoms/Prefetch/PrefetchWhenVisible.cjs.map +2 -2
  39. package/atoms/Prefetch/PrefetchWhenVisible.js +6 -0
  40. package/atoms/Prefetch/PrefetchWhenVisible.js.map +2 -2
  41. package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs +12 -0
  42. package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs.map +2 -2
  43. package/atoms/ScrollAnimation/AbstractScrollAnimation.js +12 -0
  44. package/atoms/ScrollAnimation/AbstractScrollAnimation.js.map +2 -2
  45. package/atoms/ScrollAnimation/ScrollAnimation.cjs +6 -0
  46. package/atoms/ScrollAnimation/ScrollAnimation.cjs.map +1 -1
  47. package/atoms/ScrollAnimation/ScrollAnimation.js +6 -0
  48. package/atoms/ScrollAnimation/ScrollAnimation.js.map +1 -1
  49. package/atoms/ScrollAnimation/ScrollAnimationChild.cjs +18 -1
  50. package/atoms/ScrollAnimation/ScrollAnimationChild.cjs.map +2 -2
  51. package/atoms/ScrollAnimation/ScrollAnimationChild.js +18 -1
  52. package/atoms/ScrollAnimation/ScrollAnimationChild.js.map +2 -2
  53. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs +3 -0
  54. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs.map +1 -1
  55. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.js +3 -0
  56. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.js.map +1 -1
  57. package/atoms/ScrollAnimation/ScrollAnimationParent.cjs +6 -0
  58. package/atoms/ScrollAnimation/ScrollAnimationParent.cjs.map +1 -1
  59. package/atoms/ScrollAnimation/ScrollAnimationParent.js +6 -0
  60. package/atoms/ScrollAnimation/ScrollAnimationParent.js.map +1 -1
  61. package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs +3 -0
  62. package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs.map +1 -1
  63. package/atoms/ScrollAnimation/ScrollAnimationWithEase.d.ts +1 -1
  64. package/atoms/ScrollAnimation/ScrollAnimationWithEase.js +3 -0
  65. package/atoms/ScrollAnimation/ScrollAnimationWithEase.js.map +1 -1
  66. package/atoms/ScrollAnimation/animationScrollWithEase.cjs +6 -0
  67. package/atoms/ScrollAnimation/animationScrollWithEase.cjs.map +2 -2
  68. package/atoms/ScrollAnimation/animationScrollWithEase.js +6 -0
  69. package/atoms/ScrollAnimation/animationScrollWithEase.js.map +2 -2
  70. package/atoms/ScrollReveal/ScrollReveal.cjs +12 -0
  71. package/atoms/ScrollReveal/ScrollReveal.cjs.map +1 -1
  72. package/atoms/ScrollReveal/ScrollReveal.js +12 -0
  73. package/atoms/ScrollReveal/ScrollReveal.js.map +1 -1
  74. package/decorators/withTransition.cjs +16 -2
  75. package/decorators/withTransition.cjs.map +2 -2
  76. package/decorators/withTransition.js +16 -2
  77. package/decorators/withTransition.js.map +2 -2
  78. package/molecules/Accordion/AccordionCore.cjs +9 -0
  79. package/molecules/Accordion/AccordionCore.cjs.map +2 -2
  80. package/molecules/Accordion/AccordionCore.js +9 -0
  81. package/molecules/Accordion/AccordionCore.js.map +2 -2
  82. package/molecules/Accordion/AccordionItem.cjs +33 -1
  83. package/molecules/Accordion/AccordionItem.cjs.map +2 -2
  84. package/molecules/Accordion/AccordionItem.d.ts +1 -1
  85. package/molecules/Accordion/AccordionItem.js +29 -1
  86. package/molecules/Accordion/AccordionItem.js.map +2 -2
  87. package/molecules/Menu/Menu.cjs +47 -0
  88. package/molecules/Menu/Menu.cjs.map +1 -1
  89. package/molecules/Menu/Menu.js +47 -0
  90. package/molecules/Menu/Menu.js.map +1 -1
  91. package/molecules/Menu/MenuBtn.cjs +24 -0
  92. package/molecules/Menu/MenuBtn.cjs.map +1 -1
  93. package/molecules/Menu/MenuBtn.js +24 -0
  94. package/molecules/Menu/MenuBtn.js.map +1 -1
  95. package/molecules/Menu/MenuList.cjs +39 -0
  96. package/molecules/Menu/MenuList.cjs.map +2 -2
  97. package/molecules/Menu/MenuList.d.ts +1 -1
  98. package/molecules/Menu/MenuList.js +39 -0
  99. package/molecules/Menu/MenuList.js.map +2 -2
  100. package/molecules/Modal/Modal.cjs +50 -1
  101. package/molecules/Modal/Modal.cjs.map +2 -2
  102. package/molecules/Modal/Modal.d.ts +3 -3
  103. package/molecules/Modal/Modal.js +50 -1
  104. package/molecules/Modal/Modal.js.map +2 -2
  105. package/molecules/Modal/ModalWithTransition.cjs +6 -0
  106. package/molecules/Modal/ModalWithTransition.cjs.map +2 -2
  107. package/molecules/Modal/ModalWithTransition.js +6 -0
  108. package/molecules/Modal/ModalWithTransition.js.map +2 -2
  109. package/molecules/Panel/Panel.cjs +19 -0
  110. package/molecules/Panel/Panel.cjs.map +2 -2
  111. package/molecules/Panel/Panel.js +19 -0
  112. package/molecules/Panel/Panel.js.map +2 -2
  113. package/molecules/Slider/AbstractSliderChild.cjs +24 -0
  114. package/molecules/Slider/AbstractSliderChild.cjs.map +2 -2
  115. package/molecules/Slider/AbstractSliderChild.js +24 -0
  116. package/molecules/Slider/AbstractSliderChild.js.map +2 -2
  117. package/molecules/Slider/Slider.cjs +97 -0
  118. package/molecules/Slider/Slider.cjs.map +2 -2
  119. package/molecules/Slider/Slider.d.ts +3 -2
  120. package/molecules/Slider/Slider.js +97 -0
  121. package/molecules/Slider/Slider.js.map +2 -2
  122. package/molecules/Slider/SliderBtn.cjs +22 -2
  123. package/molecules/Slider/SliderBtn.cjs.map +2 -2
  124. package/molecules/Slider/SliderBtn.d.ts +1 -0
  125. package/molecules/Slider/SliderBtn.js +22 -2
  126. package/molecules/Slider/SliderBtn.js.map +2 -2
  127. package/molecules/Slider/SliderCount.cjs +9 -0
  128. package/molecules/Slider/SliderCount.cjs.map +2 -2
  129. package/molecules/Slider/SliderCount.js +9 -0
  130. package/molecules/Slider/SliderCount.js.map +2 -2
  131. package/molecules/Slider/SliderDots.cjs +19 -0
  132. package/molecules/Slider/SliderDots.cjs.map +2 -2
  133. package/molecules/Slider/SliderDots.js +19 -0
  134. package/molecules/Slider/SliderDots.js.map +2 -2
  135. package/molecules/Slider/SliderDrag.cjs +15 -0
  136. package/molecules/Slider/SliderDrag.cjs.map +2 -2
  137. package/molecules/Slider/SliderDrag.js +15 -0
  138. package/molecules/Slider/SliderDrag.js.map +2 -2
  139. package/molecules/Slider/SliderItem.cjs +75 -14
  140. package/molecules/Slider/SliderItem.cjs.map +2 -2
  141. package/molecules/Slider/SliderItem.d.ts +12 -11
  142. package/molecules/Slider/SliderItem.js +75 -14
  143. package/molecules/Slider/SliderItem.js.map +2 -2
  144. package/molecules/Slider/SliderProgress.cjs +6 -0
  145. package/molecules/Slider/SliderProgress.cjs.map +2 -2
  146. package/molecules/Slider/SliderProgress.js +6 -0
  147. package/molecules/Slider/SliderProgress.js.map +2 -2
  148. package/molecules/Sticky/Sticky.cjs +56 -0
  149. package/molecules/Sticky/Sticky.cjs.map +2 -2
  150. package/molecules/Sticky/Sticky.js +56 -0
  151. package/molecules/Sticky/Sticky.js.map +2 -2
  152. package/molecules/TableOfContent/TableOfContent.cjs +13 -0
  153. package/molecules/TableOfContent/TableOfContent.cjs.map +1 -1
  154. package/molecules/TableOfContent/TableOfContent.js +13 -0
  155. package/molecules/TableOfContent/TableOfContent.js.map +1 -1
  156. package/molecules/TableOfContent/TableOfContentAnchor.cjs +16 -0
  157. package/molecules/TableOfContent/TableOfContentAnchor.cjs.map +2 -2
  158. package/molecules/TableOfContent/TableOfContentAnchor.js +16 -0
  159. package/molecules/TableOfContent/TableOfContentAnchor.js.map +2 -2
  160. package/molecules/Tabs/Tabs.cjs +16 -0
  161. package/molecules/Tabs/Tabs.cjs.map +2 -2
  162. package/molecules/Tabs/Tabs.d.ts +3 -3
  163. package/molecules/Tabs/Tabs.js +16 -0
  164. package/molecules/Tabs/Tabs.js.map +2 -2
  165. package/organisms/Frame/Frame.cjs +30 -0
  166. package/organisms/Frame/Frame.cjs.map +2 -2
  167. package/organisms/Frame/Frame.js +30 -0
  168. package/organisms/Frame/Frame.js.map +2 -2
  169. package/organisms/Frame/FrameAnchor.cjs +6 -0
  170. package/organisms/Frame/FrameAnchor.cjs.map +1 -1
  171. package/organisms/Frame/FrameAnchor.js +6 -0
  172. package/organisms/Frame/FrameAnchor.js.map +1 -1
  173. package/organisms/Frame/FrameForm.cjs +6 -0
  174. package/organisms/Frame/FrameForm.cjs.map +1 -1
  175. package/organisms/Frame/FrameForm.js +6 -0
  176. package/organisms/Frame/FrameForm.js.map +1 -1
  177. package/organisms/Frame/FrameTarget.cjs +25 -2
  178. package/organisms/Frame/FrameTarget.cjs.map +2 -2
  179. package/organisms/Frame/FrameTarget.d.ts +1 -1
  180. package/organisms/Frame/FrameTarget.js +25 -2
  181. package/organisms/Frame/FrameTarget.js.map +2 -2
  182. package/organisms/Hero/Hero.twig +151 -0
  183. package/package.json +2 -2
  184. package/primitives/Draggable/Draggable.cjs +18 -0
  185. package/primitives/Draggable/Draggable.cjs.map +2 -2
  186. package/primitives/Draggable/Draggable.js +18 -0
  187. package/primitives/Draggable/Draggable.js.map +2 -2
  188. package/primitives/Sentinel/Sentinel.cjs +3 -0
  189. package/primitives/Sentinel/Sentinel.cjs.map +2 -2
  190. package/primitives/Sentinel/Sentinel.js +3 -0
  191. package/primitives/Sentinel/Sentinel.js.map +2 -2
  192. package/primitives/Transition/Transition.cjs +3 -0
  193. package/primitives/Transition/Transition.cjs.map +1 -1
  194. package/primitives/Transition/Transition.js +3 -0
  195. package/primitives/Transition/Transition.js.map +1 -1
@@ -32,18 +32,34 @@ var import_utils = require("@studiometa/js-toolkit/utils");
32
32
  var import_MenuBtn = require("./MenuBtn.cjs");
33
33
  var import_MenuList = require("./MenuList.cjs");
34
34
  var _Menu = class extends import_js_toolkit.Base {
35
+ /**
36
+ * Get the first `MenuList` instance.
37
+ */
35
38
  get menuList() {
36
39
  return (0, import_js_toolkit.getDirectChildren)(this, "Menu", "MenuList")[0];
37
40
  }
41
+ /**
42
+ * Get the first `MenuBtn` instance.
43
+ */
38
44
  get menuBtn() {
39
45
  return (0, import_js_toolkit.getDirectChildren)(this, "Menu", "MenuBtn")[0];
40
46
  }
47
+ /**
48
+ * Test which mode to use.
49
+ */
41
50
  get shouldReactOnClick() {
42
51
  return this.$options.mode === "click";
43
52
  }
53
+ /**
54
+ * Wether the button or the items are hovered.
55
+ */
44
56
  get isHover() {
45
57
  return this.menuBtn.isHover || this.menuList.isHover;
46
58
  }
59
+ /**
60
+ * Set attributes on mounted, destroy the component if it is missing required
61
+ * child components.
62
+ */
47
63
  mounted() {
48
64
  if (!this.menuBtn || !this.menuList) {
49
65
  this.$destroy();
@@ -53,6 +69,9 @@ var _Menu = class extends import_js_toolkit.Base {
53
69
  this.menuList.$el.setAttribute("id", this.$id);
54
70
  this.menuList.close();
55
71
  }
72
+ /**
73
+ * Keyboard management.
74
+ */
56
75
  keyed({ ENTER, ESC, isUp }) {
57
76
  if (!isUp) {
58
77
  return;
@@ -68,17 +87,26 @@ var _Menu = class extends import_js_toolkit.Base {
68
87
  }
69
88
  }
70
89
  }
90
+ /**
91
+ * Toggle menu items on button click.
92
+ */
71
93
  onMenuBtnClick(index, event) {
72
94
  if ((0, import_js_toolkit.isDirectChild)(this, "Menu", "MenuBtn", this.$children.MenuBtn[index]) && this.shouldReactOnClick) {
73
95
  event.preventDefault();
74
96
  this.toggle();
75
97
  }
76
98
  }
99
+ /**
100
+ * Open menu items on button mouse enter.
101
+ */
77
102
  onMenuBtnMouseenter(index) {
78
103
  if (this.$children.MenuBtn[index] === this.menuBtn && !this.shouldReactOnClick) {
79
104
  this.open();
80
105
  }
81
106
  }
107
+ /**
108
+ * Close menu items on button mouse leave.
109
+ */
82
110
  onMenuBtnMouseleave() {
83
111
  if (this.shouldReactOnClick) {
84
112
  return;
@@ -89,6 +117,9 @@ var _Menu = class extends import_js_toolkit.Base {
89
117
  }
90
118
  });
91
119
  }
120
+ /**
121
+ * Close menu items on button mouse leave.
122
+ */
92
123
  onMenuListMouseleave() {
93
124
  if (this.shouldReactOnClick) {
94
125
  return;
@@ -99,6 +130,9 @@ var _Menu = class extends import_js_toolkit.Base {
99
130
  }
100
131
  });
101
132
  }
133
+ /**
134
+ * Close other non-parent menu items on menu items open.
135
+ */
102
136
  onMenuListItemsOpen(index) {
103
137
  const targetMenu = this.$children.MenuList[index];
104
138
  this.$children.MenuList.forEach((menuItem) => {
@@ -107,17 +141,29 @@ var _Menu = class extends import_js_toolkit.Base {
107
141
  }
108
142
  });
109
143
  }
144
+ /**
145
+ * Close the menu.
146
+ */
110
147
  close() {
111
148
  this.menuList.close();
112
149
  }
150
+ /**
151
+ * Open the menu.
152
+ */
113
153
  open() {
114
154
  this.menuList.open();
115
155
  }
156
+ /**
157
+ * Toggle the menu.
158
+ */
116
159
  toggle() {
117
160
  this.menuList.toggle();
118
161
  }
119
162
  };
120
163
  var Menu = _Menu;
164
+ /**
165
+ * Config.
166
+ */
121
167
  __publicField(Menu, "config", {
122
168
  name: "Menu",
123
169
  components: {
@@ -129,6 +175,7 @@ __publicField(Menu, "config", {
129
175
  mode: {
130
176
  type: String,
131
177
  default: "click"
178
+ // or 'hover'
132
179
  }
133
180
  }
134
181
  });
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/molecules/Menu/Menu.ts"],
4
4
  "sourcesContent": ["import { Base, isDirectChild, getDirectChildren } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps, KeyServiceProps } from '@studiometa/js-toolkit';\nimport { nextTick } from '@studiometa/js-toolkit/utils';\nimport { MenuBtn } from './MenuBtn.js';\nimport { MenuList } from './MenuList.js';\n\nexport interface MenuProps extends BaseProps {\n $children: {\n // eslint-disable-next-line no-use-before-define\n Menu: Menu[];\n MenutBtn: MenuBtn[];\n MenuList: MenuList[];\n };\n $options: {\n mode: 'click' | 'hover';\n };\n}\n\n/**\n * Menu class.\n */\nexport class Menu<T extends BaseProps = BaseProps> extends Base<T & MenuProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Menu',\n components: {\n MenuBtn,\n MenuList,\n Menu,\n },\n options: {\n mode: {\n type: String,\n default: 'click', // or 'hover'\n },\n },\n };\n\n /**\n * Get the first `MenuList` instance.\n */\n get menuList(): MenuList {\n return getDirectChildren<MenuList>(this, 'Menu', 'MenuList')[0];\n }\n\n /**\n * Get the first `MenuBtn` instance.\n */\n get menuBtn(): MenuBtn {\n return getDirectChildren<MenuBtn>(this, 'Menu', 'MenuBtn')[0];\n }\n\n /**\n * Test which mode to use.\n */\n get shouldReactOnClick(): boolean {\n return this.$options.mode === 'click';\n }\n\n /**\n * Wether the button or the items are hovered.\n */\n get isHover(): boolean {\n return this.menuBtn.isHover || this.menuList.isHover;\n }\n\n /**\n * Set attributes on mounted, destroy the component if it is missing required\n * child components.\n */\n mounted() {\n if (!this.menuBtn || !this.menuList) {\n this.$destroy();\n return;\n }\n\n this.menuBtn.$el.setAttribute('aria-controls', this.$id);\n this.menuList.$el.setAttribute('id', this.$id);\n this.menuList.close();\n }\n\n /**\n * Keyboard management.\n */\n keyed({ ENTER, ESC, isUp }: KeyServiceProps) {\n if (!isUp) {\n return;\n }\n\n if (ESC) {\n this.close();\n return;\n }\n\n if (!this.shouldReactOnClick) {\n const hasFocusElementWithin = document.activeElement === this.menuBtn.$el;\n\n if (ENTER && hasFocusElementWithin) {\n this.toggle();\n }\n }\n }\n\n /**\n * Toggle menu items on button click.\n */\n onMenuBtnClick(index: number, event: MouseEvent) {\n if (\n isDirectChild(this, 'Menu', 'MenuBtn', this.$children.MenuBtn[index]) &&\n this.shouldReactOnClick\n ) {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /**\n * Open menu items on button mouse enter.\n */\n onMenuBtnMouseenter(index: number) {\n if (this.$children.MenuBtn[index] === this.menuBtn && !this.shouldReactOnClick) {\n this.open();\n }\n }\n\n /**\n * Close menu items on button mouse leave.\n */\n onMenuBtnMouseleave() {\n if (this.shouldReactOnClick) {\n return;\n }\n\n nextTick(() => {\n if (!this.isHover) {\n this.close();\n }\n });\n }\n\n /**\n * Close menu items on button mouse leave.\n */\n onMenuListMouseleave() {\n if (this.shouldReactOnClick) {\n return;\n }\n\n nextTick(() => {\n if (!this.isHover) {\n this.close();\n }\n });\n }\n\n /**\n * Close other non-parent menu items on menu items open.\n */\n onMenuListItemsOpen(index: number) {\n const targetMenu = this.$children.MenuList[index];\n this.$children.MenuList.forEach((menuItem) => {\n if (!menuItem.$el.contains(targetMenu.$el)) {\n menuItem.close();\n }\n });\n }\n\n /**\n * Close the menu.\n */\n close() {\n this.menuList.close();\n }\n\n /**\n * Open the menu.\n */\n open() {\n this.menuList.open();\n }\n\n /**\n * Toggle the menu.\n */\n toggle() {\n this.menuList.toggle();\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAuD;AAEvD,mBAAyB;AACzB,qBAAwB;AACxB,sBAAyB;AAiBlB,IAAM,QAAN,cAAoD,uBAAoB;AAAA,EAsB7E,IAAI,WAAqB;AACvB,eAAO,qCAA4B,MAAM,QAAQ,UAAU,EAAE;AAAA,EAC/D;AAAA,EAKA,IAAI,UAAmB;AACrB,eAAO,qCAA2B,MAAM,QAAQ,SAAS,EAAE;AAAA,EAC7D;AAAA,EAKA,IAAI,qBAA8B;AAChC,WAAO,KAAK,SAAS,SAAS;AAAA,EAChC;AAAA,EAKA,IAAI,UAAmB;AACrB,WAAO,KAAK,QAAQ,WAAW,KAAK,SAAS;AAAA,EAC/C;AAAA,EAMA,UAAU;AACR,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU;AACnC,WAAK,SAAS;AACd;AAAA,IACF;AAEA,SAAK,QAAQ,IAAI,aAAa,iBAAiB,KAAK,GAAG;AACvD,SAAK,SAAS,IAAI,aAAa,MAAM,KAAK,GAAG;AAC7C,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAKA,MAAM,EAAE,OAAO,KAAK,KAAK,GAAoB;AAC3C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,KAAK;AACP,WAAK,MAAM;AACX;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,oBAAoB;AAC5B,YAAM,wBAAwB,SAAS,kBAAkB,KAAK,QAAQ;AAEtE,UAAI,SAAS,uBAAuB;AAClC,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAKA,eAAe,OAAe,OAAmB;AAC/C,YACE,iCAAc,MAAM,QAAQ,WAAW,KAAK,UAAU,QAAQ,MAAM,KACpE,KAAK,oBACL;AACA,YAAM,eAAe;AACrB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAKA,oBAAoB,OAAe;AACjC,QAAI,KAAK,UAAU,QAAQ,WAAW,KAAK,WAAW,CAAC,KAAK,oBAAoB;AAC9E,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAKA,sBAAsB;AACpB,QAAI,KAAK,oBAAoB;AAC3B;AAAA,IACF;AAEA,+BAAS,MAAM;AACb,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,uBAAuB;AACrB,QAAI,KAAK,oBAAoB;AAC3B;AAAA,IACF;AAEA,+BAAS,MAAM;AACb,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,oBAAoB,OAAe;AACjC,UAAM,aAAa,KAAK,UAAU,SAAS;AAC3C,SAAK,UAAU,SAAS,QAAQ,CAAC,aAAa;AAC5C,UAAI,CAAC,SAAS,IAAI,SAAS,WAAW,GAAG,GAAG;AAC1C,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,QAAQ;AACN,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAKA,OAAO;AACL,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAKA,SAAS;AACP,SAAK,SAAS,OAAO;AAAA,EACvB;AACF;AAxKO,IAAM,OAAN;AAIL,cAJW,MAIJ,UAAqB;AAAA,EAC1B,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,6 +3,9 @@ import { nextTick } from "@studiometa/js-toolkit/utils";
3
3
  import { MenuBtn } from "./MenuBtn.js";
4
4
  import { MenuList } from "./MenuList.js";
5
5
  class Menu extends Base {
6
+ /**
7
+ * Config.
8
+ */
6
9
  static config = {
7
10
  name: "Menu",
8
11
  components: {
@@ -14,21 +17,38 @@ class Menu extends Base {
14
17
  mode: {
15
18
  type: String,
16
19
  default: "click"
20
+ // or 'hover'
17
21
  }
18
22
  }
19
23
  };
24
+ /**
25
+ * Get the first `MenuList` instance.
26
+ */
20
27
  get menuList() {
21
28
  return getDirectChildren(this, "Menu", "MenuList")[0];
22
29
  }
30
+ /**
31
+ * Get the first `MenuBtn` instance.
32
+ */
23
33
  get menuBtn() {
24
34
  return getDirectChildren(this, "Menu", "MenuBtn")[0];
25
35
  }
36
+ /**
37
+ * Test which mode to use.
38
+ */
26
39
  get shouldReactOnClick() {
27
40
  return this.$options.mode === "click";
28
41
  }
42
+ /**
43
+ * Wether the button or the items are hovered.
44
+ */
29
45
  get isHover() {
30
46
  return this.menuBtn.isHover || this.menuList.isHover;
31
47
  }
48
+ /**
49
+ * Set attributes on mounted, destroy the component if it is missing required
50
+ * child components.
51
+ */
32
52
  mounted() {
33
53
  if (!this.menuBtn || !this.menuList) {
34
54
  this.$destroy();
@@ -38,6 +58,9 @@ class Menu extends Base {
38
58
  this.menuList.$el.setAttribute("id", this.$id);
39
59
  this.menuList.close();
40
60
  }
61
+ /**
62
+ * Keyboard management.
63
+ */
41
64
  keyed({ ENTER, ESC, isUp }) {
42
65
  if (!isUp) {
43
66
  return;
@@ -53,17 +76,26 @@ class Menu extends Base {
53
76
  }
54
77
  }
55
78
  }
79
+ /**
80
+ * Toggle menu items on button click.
81
+ */
56
82
  onMenuBtnClick(index, event) {
57
83
  if (isDirectChild(this, "Menu", "MenuBtn", this.$children.MenuBtn[index]) && this.shouldReactOnClick) {
58
84
  event.preventDefault();
59
85
  this.toggle();
60
86
  }
61
87
  }
88
+ /**
89
+ * Open menu items on button mouse enter.
90
+ */
62
91
  onMenuBtnMouseenter(index) {
63
92
  if (this.$children.MenuBtn[index] === this.menuBtn && !this.shouldReactOnClick) {
64
93
  this.open();
65
94
  }
66
95
  }
96
+ /**
97
+ * Close menu items on button mouse leave.
98
+ */
67
99
  onMenuBtnMouseleave() {
68
100
  if (this.shouldReactOnClick) {
69
101
  return;
@@ -74,6 +106,9 @@ class Menu extends Base {
74
106
  }
75
107
  });
76
108
  }
109
+ /**
110
+ * Close menu items on button mouse leave.
111
+ */
77
112
  onMenuListMouseleave() {
78
113
  if (this.shouldReactOnClick) {
79
114
  return;
@@ -84,6 +119,9 @@ class Menu extends Base {
84
119
  }
85
120
  });
86
121
  }
122
+ /**
123
+ * Close other non-parent menu items on menu items open.
124
+ */
87
125
  onMenuListItemsOpen(index) {
88
126
  const targetMenu = this.$children.MenuList[index];
89
127
  this.$children.MenuList.forEach((menuItem) => {
@@ -92,12 +130,21 @@ class Menu extends Base {
92
130
  }
93
131
  });
94
132
  }
133
+ /**
134
+ * Close the menu.
135
+ */
95
136
  close() {
96
137
  this.menuList.close();
97
138
  }
139
+ /**
140
+ * Open the menu.
141
+ */
98
142
  open() {
99
143
  this.menuList.open();
100
144
  }
145
+ /**
146
+ * Toggle the menu.
147
+ */
101
148
  toggle() {
102
149
  this.menuList.toggle();
103
150
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/molecules/Menu/Menu.ts"],
4
4
  "sourcesContent": ["import { Base, isDirectChild, getDirectChildren } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps, KeyServiceProps } from '@studiometa/js-toolkit';\nimport { nextTick } from '@studiometa/js-toolkit/utils';\nimport { MenuBtn } from './MenuBtn.js';\nimport { MenuList } from './MenuList.js';\n\nexport interface MenuProps extends BaseProps {\n $children: {\n // eslint-disable-next-line no-use-before-define\n Menu: Menu[];\n MenutBtn: MenuBtn[];\n MenuList: MenuList[];\n };\n $options: {\n mode: 'click' | 'hover';\n };\n}\n\n/**\n * Menu class.\n */\nexport class Menu<T extends BaseProps = BaseProps> extends Base<T & MenuProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Menu',\n components: {\n MenuBtn,\n MenuList,\n Menu,\n },\n options: {\n mode: {\n type: String,\n default: 'click', // or 'hover'\n },\n },\n };\n\n /**\n * Get the first `MenuList` instance.\n */\n get menuList(): MenuList {\n return getDirectChildren<MenuList>(this, 'Menu', 'MenuList')[0];\n }\n\n /**\n * Get the first `MenuBtn` instance.\n */\n get menuBtn(): MenuBtn {\n return getDirectChildren<MenuBtn>(this, 'Menu', 'MenuBtn')[0];\n }\n\n /**\n * Test which mode to use.\n */\n get shouldReactOnClick(): boolean {\n return this.$options.mode === 'click';\n }\n\n /**\n * Wether the button or the items are hovered.\n */\n get isHover(): boolean {\n return this.menuBtn.isHover || this.menuList.isHover;\n }\n\n /**\n * Set attributes on mounted, destroy the component if it is missing required\n * child components.\n */\n mounted() {\n if (!this.menuBtn || !this.menuList) {\n this.$destroy();\n return;\n }\n\n this.menuBtn.$el.setAttribute('aria-controls', this.$id);\n this.menuList.$el.setAttribute('id', this.$id);\n this.menuList.close();\n }\n\n /**\n * Keyboard management.\n */\n keyed({ ENTER, ESC, isUp }: KeyServiceProps) {\n if (!isUp) {\n return;\n }\n\n if (ESC) {\n this.close();\n return;\n }\n\n if (!this.shouldReactOnClick) {\n const hasFocusElementWithin = document.activeElement === this.menuBtn.$el;\n\n if (ENTER && hasFocusElementWithin) {\n this.toggle();\n }\n }\n }\n\n /**\n * Toggle menu items on button click.\n */\n onMenuBtnClick(index: number, event: MouseEvent) {\n if (\n isDirectChild(this, 'Menu', 'MenuBtn', this.$children.MenuBtn[index]) &&\n this.shouldReactOnClick\n ) {\n event.preventDefault();\n this.toggle();\n }\n }\n\n /**\n * Open menu items on button mouse enter.\n */\n onMenuBtnMouseenter(index: number) {\n if (this.$children.MenuBtn[index] === this.menuBtn && !this.shouldReactOnClick) {\n this.open();\n }\n }\n\n /**\n * Close menu items on button mouse leave.\n */\n onMenuBtnMouseleave() {\n if (this.shouldReactOnClick) {\n return;\n }\n\n nextTick(() => {\n if (!this.isHover) {\n this.close();\n }\n });\n }\n\n /**\n * Close menu items on button mouse leave.\n */\n onMenuListMouseleave() {\n if (this.shouldReactOnClick) {\n return;\n }\n\n nextTick(() => {\n if (!this.isHover) {\n this.close();\n }\n });\n }\n\n /**\n * Close other non-parent menu items on menu items open.\n */\n onMenuListItemsOpen(index: number) {\n const targetMenu = this.$children.MenuList[index];\n this.$children.MenuList.forEach((menuItem) => {\n if (!menuItem.$el.contains(targetMenu.$el)) {\n menuItem.close();\n }\n });\n }\n\n /**\n * Close the menu.\n */\n close() {\n this.menuList.close();\n }\n\n /**\n * Open the menu.\n */\n open() {\n this.menuList.open();\n }\n\n /**\n * Toggle the menu.\n */\n toggle() {\n this.menuList.toggle();\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,MAAM,eAAe,yBAAyB;AAEvD,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAiBlB,MAAM,aAA8C,KAAoB;AAAA,EAI7E,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAKA,IAAI,WAAqB;AACvB,WAAO,kBAA4B,MAAM,QAAQ,UAAU,EAAE;AAAA,EAC/D;AAAA,EAKA,IAAI,UAAmB;AACrB,WAAO,kBAA2B,MAAM,QAAQ,SAAS,EAAE;AAAA,EAC7D;AAAA,EAKA,IAAI,qBAA8B;AAChC,WAAO,KAAK,SAAS,SAAS;AAAA,EAChC;AAAA,EAKA,IAAI,UAAmB;AACrB,WAAO,KAAK,QAAQ,WAAW,KAAK,SAAS;AAAA,EAC/C;AAAA,EAMA,UAAU;AACR,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU;AACnC,WAAK,SAAS;AACd;AAAA,IACF;AAEA,SAAK,QAAQ,IAAI,aAAa,iBAAiB,KAAK,GAAG;AACvD,SAAK,SAAS,IAAI,aAAa,MAAM,KAAK,GAAG;AAC7C,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAKA,MAAM,EAAE,OAAO,KAAK,KAAK,GAAoB;AAC3C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,QAAI,KAAK;AACP,WAAK,MAAM;AACX;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,oBAAoB;AAC5B,YAAM,wBAAwB,SAAS,kBAAkB,KAAK,QAAQ;AAEtE,UAAI,SAAS,uBAAuB;AAClC,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAKA,eAAe,OAAe,OAAmB;AAC/C,QACE,cAAc,MAAM,QAAQ,WAAW,KAAK,UAAU,QAAQ,MAAM,KACpE,KAAK,oBACL;AACA,YAAM,eAAe;AACrB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAKA,oBAAoB,OAAe;AACjC,QAAI,KAAK,UAAU,QAAQ,WAAW,KAAK,WAAW,CAAC,KAAK,oBAAoB;AAC9E,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAKA,sBAAsB;AACpB,QAAI,KAAK,oBAAoB;AAC3B;AAAA,IACF;AAEA,aAAS,MAAM;AACb,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,uBAAuB;AACrB,QAAI,KAAK,oBAAoB;AAC3B;AAAA,IACF;AAEA,aAAS,MAAM;AACb,UAAI,CAAC,KAAK,SAAS;AACjB,aAAK,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,oBAAoB,OAAe;AACjC,UAAM,aAAa,KAAK,UAAU,SAAS;AAC3C,SAAK,UAAU,SAAS,QAAQ,CAAC,aAAa;AAC5C,UAAI,CAAC,SAAS,IAAI,SAAS,WAAW,GAAG,GAAG;AAC1C,iBAAS,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAKA,QAAQ;AACN,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA,EAKA,OAAO;AACL,SAAK,SAAS,KAAK;AAAA,EACrB;AAAA,EAKA,SAAS;AACP,SAAK,SAAS,OAAO;AAAA,EACvB;AACF;",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -29,19 +29,43 @@ __export(MenuBtn_exports, {
29
29
  module.exports = __toCommonJS(MenuBtn_exports);
30
30
  var import_js_toolkit = require("@studiometa/js-toolkit");
31
31
  var MenuBtn = class extends import_js_toolkit.Base {
32
+ /**
33
+ * Wether the button is hovered or not.
34
+ * @type {boolean}
35
+ */
32
36
  isHover = false;
37
+ /**
38
+ * Dispatch the click event.
39
+ *
40
+ * @param {MouseEvent} event
41
+ * @returns {void}
42
+ */
33
43
  onClick(event) {
34
44
  event.stopPropagation();
35
45
  }
46
+ /**
47
+ * Dispatch the mouseenter event.
48
+ *
49
+ * @param {MouseEvent} event
50
+ * @returns {void}
51
+ */
36
52
  onMouseenter(event) {
37
53
  this.isHover = true;
38
54
  event.stopPropagation();
39
55
  }
56
+ /**
57
+ * Dispatch the mouseleave event.
58
+ * @param {MouseEvent} event
59
+ * @returns {void}
60
+ */
40
61
  onMouseleave(event) {
41
62
  this.isHover = false;
42
63
  event.stopPropagation();
43
64
  }
44
65
  };
66
+ /**
67
+ * Config.
68
+ */
45
69
  __publicField(MenuBtn, "config", {
46
70
  name: "MenuBtn"
47
71
  });
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/molecules/Menu/MenuBtn.ts"],
4
4
  "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\n\n/**\n * MenuBtn class.\n */\nexport class MenuBtn<T extends BaseProps = BaseProps> extends Base<T> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'MenuBtn',\n };\n\n /**\n * Wether the button is hovered or not.\n * @type {boolean}\n */\n isHover = false;\n\n /**\n * Dispatch the click event.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n event.stopPropagation();\n }\n\n /**\n * Dispatch the mouseenter event.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onMouseenter(event) {\n this.isHover = true;\n event.stopPropagation();\n }\n\n /**\n * Dispatch the mouseleave event.\n * @param {MouseEvent} event\n * @returns {void}\n */\n onMouseleave(event) {\n this.isHover = false;\n event.stopPropagation();\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AAMd,IAAM,UAAN,cAAuD,uBAAQ;AAAA,EAYpE,UAAU;AAAA,EAQV,QAAQ,OAAO;AACb,UAAM,gBAAgB;AAAA,EACxB;AAAA,EAQA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AAAA,EAOA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AACF;AAxCE,cAJW,SAIJ,UAAqB;AAAA,EAC1B,MAAM;AACR;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AAMd,IAAM,UAAN,cAAuD,uBAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,EAYpE,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,QAAQ,OAAO;AACb,UAAM,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AACF;AAAA;AAAA;AAAA;AAxCE,cAJW,SAIJ,UAAqB;AAAA,EAC1B,MAAM;AACR;",
6
6
  "names": []
7
7
  }
@@ -1,16 +1,40 @@
1
1
  import { Base } from "@studiometa/js-toolkit";
2
2
  class MenuBtn extends Base {
3
+ /**
4
+ * Config.
5
+ */
3
6
  static config = {
4
7
  name: "MenuBtn"
5
8
  };
9
+ /**
10
+ * Wether the button is hovered or not.
11
+ * @type {boolean}
12
+ */
6
13
  isHover = false;
14
+ /**
15
+ * Dispatch the click event.
16
+ *
17
+ * @param {MouseEvent} event
18
+ * @returns {void}
19
+ */
7
20
  onClick(event) {
8
21
  event.stopPropagation();
9
22
  }
23
+ /**
24
+ * Dispatch the mouseenter event.
25
+ *
26
+ * @param {MouseEvent} event
27
+ * @returns {void}
28
+ */
10
29
  onMouseenter(event) {
11
30
  this.isHover = true;
12
31
  event.stopPropagation();
13
32
  }
33
+ /**
34
+ * Dispatch the mouseleave event.
35
+ * @param {MouseEvent} event
36
+ * @returns {void}
37
+ */
14
38
  onMouseleave(event) {
15
39
  this.isHover = false;
16
40
  event.stopPropagation();
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/molecules/Menu/MenuBtn.ts"],
4
4
  "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\n\n/**\n * MenuBtn class.\n */\nexport class MenuBtn<T extends BaseProps = BaseProps> extends Base<T> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'MenuBtn',\n };\n\n /**\n * Wether the button is hovered or not.\n * @type {boolean}\n */\n isHover = false;\n\n /**\n * Dispatch the click event.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n event.stopPropagation();\n }\n\n /**\n * Dispatch the mouseenter event.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onMouseenter(event) {\n this.isHover = true;\n event.stopPropagation();\n }\n\n /**\n * Dispatch the mouseleave event.\n * @param {MouseEvent} event\n * @returns {void}\n */\n onMouseleave(event) {\n this.isHover = false;\n event.stopPropagation();\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AAMd,MAAM,gBAAiD,KAAQ;AAAA,EAIpE,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA,EAMA,UAAU;AAAA,EAQV,QAAQ,OAAO;AACb,UAAM,gBAAgB;AAAA,EACxB;AAAA,EAQA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AAAA,EAOA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AACF;",
5
+ "mappings": "AAAA,SAAS,YAAY;AAMd,MAAM,gBAAiD,KAAQ;AAAA;AAAA;AAAA;AAAA,EAIpE,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQV,QAAQ,OAAO;AACb,UAAM,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAO;AAClB,SAAK,UAAU;AACf,UAAM,gBAAgB;AAAA,EACxB;AACF;",
6
6
  "names": []
7
7
  }
@@ -42,23 +42,45 @@ var FOCUSABLE_ELEMENTS = [
42
42
  "[tabindex]:not([inert])"
43
43
  ].join(",");
44
44
  var _MenuList = class extends import_primitives.Transition {
45
+ /**
46
+ * Are the menu items visible?
47
+ */
45
48
  isOpen = false;
49
+ /**
50
+ * Wether the component is hovered.
51
+ */
46
52
  isHover = false;
53
+ /**
54
+ * Override `Transition` options.
55
+ */
56
+ // @ts-ignore
47
57
  get $options() {
48
58
  const options = super.$options;
49
59
  options.leaveKeep = true;
50
60
  options.enterKeep = true;
51
61
  return options;
52
62
  }
63
+ /**
64
+ * Update tab indexes on mount.
65
+ */
53
66
  mounted() {
54
67
  this.__updateTabIndexes("close");
55
68
  }
69
+ /**
70
+ * Set hover state.
71
+ */
56
72
  onMouseenter() {
57
73
  this.isHover = true;
58
74
  }
75
+ /**
76
+ * Unset hover state.
77
+ */
59
78
  onMouseleave() {
60
79
  this.isHover = false;
61
80
  }
81
+ /**
82
+ * Display the menu items.
83
+ */
62
84
  open() {
63
85
  if (this.isOpen) {
64
86
  return;
@@ -76,6 +98,9 @@ var _MenuList = class extends import_primitives.Transition {
76
98
  this.enter();
77
99
  this.$emit("items-open");
78
100
  }
101
+ /**
102
+ * Hide the menu items.
103
+ */
79
104
  close() {
80
105
  if (!this.isOpen) {
81
106
  return;
@@ -92,6 +117,9 @@ var _MenuList = class extends import_primitives.Transition {
92
117
  this.leave();
93
118
  this.$emit("items-close");
94
119
  }
120
+ /**
121
+ * Toggle the menu items.
122
+ */
95
123
  toggle() {
96
124
  if (this.isOpen) {
97
125
  this.close();
@@ -99,6 +127,10 @@ var _MenuList = class extends import_primitives.Transition {
99
127
  this.open();
100
128
  }
101
129
  }
130
+ /**
131
+ * Update `tabindex` attribute of child focusable elements.
132
+ * @private
133
+ */
102
134
  __updateTabIndexes(mode = "open") {
103
135
  const focusableItems = Array.from(this.$el.querySelectorAll(FOCUSABLE_ELEMENTS)).filter(
104
136
  (item) => this.__filterFocusableItems(item)
@@ -111,6 +143,10 @@ var _MenuList = class extends import_primitives.Transition {
111
143
  }
112
144
  });
113
145
  }
146
+ /**
147
+ * Filter out items which are inside a child `MenuList` instance.
148
+ * @private
149
+ */
114
150
  __filterFocusableItems(item) {
115
151
  let ancestor = item.parentElement;
116
152
  while (ancestor && (!ancestor.__base__ || !ancestor.__base__.has(this.constructor))) {
@@ -120,6 +156,9 @@ var _MenuList = class extends import_primitives.Transition {
120
156
  }
121
157
  };
122
158
  var MenuList = _MenuList;
159
+ /**
160
+ * Config.
161
+ */
123
162
  __publicField(MenuList, "config", {
124
163
  ...import_primitives.Transition.config,
125
164
  name: "MenuList",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/molecules/Menu/MenuList.ts"],
4
- "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([inert])',\n 'area[href]:not([inert])',\n 'input:not([disabled]):not([inert])',\n 'select:not([disabled]):not([inert])',\n 'textarea:not([disabled]):not([inert])',\n 'button:not([disabled]):not([inert])',\n 'iframe:not([inert])',\n 'audio:not([inert])',\n 'video:not([inert])',\n '[contenteditable]:not([inert])',\n '[tabindex]:not([inert])',\n].join(',');\n\nexport interface MenuListProps extends BaseProps {\n $children: {\n // eslint-disable-next-line no-use-before-define\n MenuList: MenuList[];\n };\n}\n\n/**\n * MenuList class.\n */\nexport class MenuList<T extends BaseProps = BaseProps> extends Transition<T & MenuListProps> {\n /**\n * Config.\n */\n static config:BaseConfig = {\n ...Transition.config,\n name: 'MenuList',\n emits: ['items-open', 'items-close', 'items-mouseleave'],\n components: {\n MenuList,\n },\n };\n\n /**\n * Are the menu items visible?\n */\n isOpen = false;\n\n /**\n * Wether the component is hovered.\n */\n isHover = false;\n\n /**\n * Override `Transition` options.\n */\n // @ts-ignore\n get $options() {\n const options = super.$options;\n\n options.leaveKeep = true;\n options.enterKeep = true;\n\n return options;\n }\n\n /**\n * Update tab indexes on mount.\n */\n mounted() {\n this.__updateTabIndexes('close');\n }\n\n /**\n * Set hover state.\n */\n onMouseenter() {\n this.isHover = true;\n }\n\n /**\n * Unset hover state.\n */\n onMouseleave() {\n this.isHover = false;\n }\n\n /**\n * Display the menu items.\n */\n open() {\n if (this.isOpen) {\n return;\n }\n\n // @todo Remove event listener when the close method is called.\n const clickOutsideHandler = (event) => {\n if (!this.$el.contains(event.target)) {\n document.removeEventListener('click', clickOutsideHandler);\n this.close();\n }\n };\n document.addEventListener('click', clickOutsideHandler);\n\n this.__updateTabIndexes('open');\n this.$el.setAttribute('aria-hidden', 'false');\n this.isOpen = true;\n this.enter();\n this.$emit('items-open');\n }\n\n /**\n * Hide the menu items.\n */\n close() {\n if (!this.isOpen) {\n return;\n }\n\n // Close child menu items.\n this.$children.MenuList.forEach((menuItem) => {\n menuItem.close();\n });\n\n if (\n document.activeElement instanceof HTMLElement &&\n this.$el.contains(document.activeElement)\n ) {\n document.activeElement.blur();\n }\n\n this.$el.setAttribute('aria-hidden', 'true');\n this.__updateTabIndexes('close');\n this.isOpen = false;\n this.leave();\n this.$emit('items-close');\n }\n\n /**\n * Toggle the menu items.\n */\n toggle() {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Update `tabindex` attribute of child focusable elements.\n * @private\n */\n __updateTabIndexes(mode:'open'|'close' = 'open') {\n const focusableItems = Array.from(this.$el.querySelectorAll(FOCUSABLE_ELEMENTS)).filter(\n (item) => this.__filterFocusableItems(item as HTMLElement),\n );\n\n focusableItems.forEach((item) => {\n if (mode === 'close') {\n item.setAttribute('tabindex', '-1');\n } else {\n item.removeAttribute('tabindex');\n }\n });\n }\n\n /**\n * Filter out items which are inside a child `MenuList` instance.\n * @private\n */\n __filterFocusableItems(item:HTMLElement):boolean {\n let ancestor = item.parentElement;\n\n // @ts-ignore\n while (ancestor && (!ancestor.__base__ || !ancestor.__base__.has(this.constructor))) {\n ancestor = ancestor.parentElement;\n }\n\n return ancestor === null || ancestor === this.$el;\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAA2B;AAE3B,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAYH,IAAM,YAAN,cAAwD,6BAA8B;AAAA,EAgB3F,SAAS;AAAA,EAKT,UAAU;AAAA,EAMV,IAAI,WAAW;AACb,UAAM,UAAU,MAAM;AAEtB,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAEpB,WAAO;AAAA,EACT;AAAA,EAKA,UAAU;AACR,SAAK,mBAAmB,OAAO;AAAA,EACjC;AAAA,EAKA,eAAe;AACb,SAAK,UAAU;AAAA,EACjB;AAAA,EAKA,eAAe;AACb,SAAK,UAAU;AAAA,EACjB;AAAA,EAKA,OAAO;AACL,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAGA,UAAM,sBAAsB,CAAC,UAAU;AACrC,UAAI,CAAC,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;AACpC,iBAAS,oBAAoB,SAAS,mBAAmB;AACzD,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAiB,SAAS,mBAAmB;AAEtD,SAAK,mBAAmB,MAAM;AAC9B,SAAK,IAAI,aAAa,eAAe,OAAO;AAC5C,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,MAAM,YAAY;AAAA,EACzB;AAAA,EAKA,QAAQ;AACN,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAGA,SAAK,UAAU,SAAS,QAAQ,CAAC,aAAa;AAC5C,eAAS,MAAM;AAAA,IACjB,CAAC;AAED,QACE,SAAS,yBAAyB,eAClC,KAAK,IAAI,SAAS,SAAS,aAAa,GACxC;AACA,eAAS,cAAc,KAAK;AAAA,IAC9B;AAEA,SAAK,IAAI,aAAa,eAAe,MAAM;AAC3C,SAAK,mBAAmB,OAAO;AAC/B,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,MAAM,aAAa;AAAA,EAC1B;AAAA,EAKA,SAAS;AACP,QAAI,KAAK,QAAQ;AACf,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAMA,mBAAmB,OAAsB,QAAQ;AAC/C,UAAM,iBAAiB,MAAM,KAAK,KAAK,IAAI,iBAAiB,kBAAkB,CAAC,EAAE;AAAA,MAC/E,CAAC,SAAS,KAAK,uBAAuB,IAAmB;AAAA,IAC3D;AAEA,mBAAe,QAAQ,CAAC,SAAS;AAC/B,UAAI,SAAS,SAAS;AACpB,aAAK,aAAa,YAAY,IAAI;AAAA,MACpC,OAAO;AACL,aAAK,gBAAgB,UAAU;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAMA,uBAAuB,MAA0B;AAC/C,QAAI,WAAW,KAAK;AAGpB,WAAO,aAAa,CAAC,SAAS,YAAY,CAAC,SAAS,SAAS,IAAI,KAAK,WAAW,IAAI;AACnF,iBAAW,SAAS;AAAA,IACtB;AAEA,WAAO,aAAa,QAAQ,aAAa,KAAK;AAAA,EAChD;AACF;AAvJO,IAAM,WAAN;AAIL,cAJW,UAIJ,UAAoB;AAAA,EACzB,GAAG,6BAAW;AAAA,EACd,MAAM;AAAA,EACN,OAAO,CAAC,cAAc,eAAe,kBAAkB;AAAA,EACvD,YAAY;AAAA,IACV;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nconst FOCUSABLE_ELEMENTS = [\n 'a[href]:not([inert])',\n 'area[href]:not([inert])',\n 'input:not([disabled]):not([inert])',\n 'select:not([disabled]):not([inert])',\n 'textarea:not([disabled]):not([inert])',\n 'button:not([disabled]):not([inert])',\n 'iframe:not([inert])',\n 'audio:not([inert])',\n 'video:not([inert])',\n '[contenteditable]:not([inert])',\n '[tabindex]:not([inert])',\n].join(',');\n\nexport interface MenuListProps extends BaseProps {\n $children: {\n // eslint-disable-next-line no-use-before-define\n MenuList: MenuList[];\n };\n}\n\n/**\n * MenuList class.\n */\nexport class MenuList<T extends BaseProps = BaseProps> extends Transition<T & MenuListProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Transition.config,\n name: 'MenuList',\n emits: ['items-open', 'items-close', 'items-mouseleave'],\n components: {\n MenuList,\n },\n };\n\n /**\n * Are the menu items visible?\n */\n isOpen = false;\n\n /**\n * Wether the component is hovered.\n */\n isHover = false;\n\n /**\n * Override `Transition` options.\n */\n // @ts-ignore\n get $options() {\n const options = super.$options;\n\n options.leaveKeep = true;\n options.enterKeep = true;\n\n return options;\n }\n\n /**\n * Update tab indexes on mount.\n */\n mounted() {\n this.__updateTabIndexes('close');\n }\n\n /**\n * Set hover state.\n */\n onMouseenter() {\n this.isHover = true;\n }\n\n /**\n * Unset hover state.\n */\n onMouseleave() {\n this.isHover = false;\n }\n\n /**\n * Display the menu items.\n */\n open() {\n if (this.isOpen) {\n return;\n }\n\n // @todo Remove event listener when the close method is called.\n const clickOutsideHandler = (event) => {\n if (!this.$el.contains(event.target)) {\n document.removeEventListener('click', clickOutsideHandler);\n this.close();\n }\n };\n document.addEventListener('click', clickOutsideHandler);\n\n this.__updateTabIndexes('open');\n this.$el.setAttribute('aria-hidden', 'false');\n this.isOpen = true;\n this.enter();\n this.$emit('items-open');\n }\n\n /**\n * Hide the menu items.\n */\n close() {\n if (!this.isOpen) {\n return;\n }\n\n // Close child menu items.\n this.$children.MenuList.forEach((menuItem) => {\n menuItem.close();\n });\n\n if (\n document.activeElement instanceof HTMLElement &&\n this.$el.contains(document.activeElement)\n ) {\n document.activeElement.blur();\n }\n\n this.$el.setAttribute('aria-hidden', 'true');\n this.__updateTabIndexes('close');\n this.isOpen = false;\n this.leave();\n this.$emit('items-close');\n }\n\n /**\n * Toggle the menu items.\n */\n toggle() {\n if (this.isOpen) {\n this.close();\n } else {\n this.open();\n }\n }\n\n /**\n * Update `tabindex` attribute of child focusable elements.\n * @private\n */\n __updateTabIndexes(mode: 'open' | 'close' = 'open') {\n const focusableItems = Array.from(this.$el.querySelectorAll(FOCUSABLE_ELEMENTS)).filter(\n (item) => this.__filterFocusableItems(item as HTMLElement),\n );\n\n focusableItems.forEach((item) => {\n if (mode === 'close') {\n item.setAttribute('tabindex', '-1');\n } else {\n item.removeAttribute('tabindex');\n }\n });\n }\n\n /**\n * Filter out items which are inside a child `MenuList` instance.\n * @private\n */\n __filterFocusableItems(item: HTMLElement): boolean {\n let ancestor = item.parentElement;\n\n // @ts-ignore\n while (ancestor && (!ancestor.__base__ || !ancestor.__base__.has(this.constructor))) {\n ancestor = ancestor.parentElement;\n }\n\n return ancestor === null || ancestor === this.$el;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,wBAA2B;AAE3B,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG;AAYH,IAAM,YAAN,cAAwD,6BAA8B;AAAA;AAAA;AAAA;AAAA,EAgB3F,SAAS;AAAA;AAAA;AAAA;AAAA,EAKT,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV,IAAI,WAAW;AACb,UAAM,UAAU,MAAM;AAEtB,YAAQ,YAAY;AACpB,YAAQ,YAAY;AAEpB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,mBAAmB,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe;AACb,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACL,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAGA,UAAM,sBAAsB,CAAC,UAAU;AACrC,UAAI,CAAC,KAAK,IAAI,SAAS,MAAM,MAAM,GAAG;AACpC,iBAAS,oBAAoB,SAAS,mBAAmB;AACzD,aAAK,MAAM;AAAA,MACb;AAAA,IACF;AACA,aAAS,iBAAiB,SAAS,mBAAmB;AAEtD,SAAK,mBAAmB,MAAM;AAC9B,SAAK,IAAI,aAAa,eAAe,OAAO;AAC5C,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,MAAM,YAAY;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,QAAI,CAAC,KAAK,QAAQ;AAChB;AAAA,IACF;AAGA,SAAK,UAAU,SAAS,QAAQ,CAAC,aAAa;AAC5C,eAAS,MAAM;AAAA,IACjB,CAAC;AAED,QACE,SAAS,yBAAyB,eAClC,KAAK,IAAI,SAAS,SAAS,aAAa,GACxC;AACA,eAAS,cAAc,KAAK;AAAA,IAC9B;AAEA,SAAK,IAAI,aAAa,eAAe,MAAM;AAC3C,SAAK,mBAAmB,OAAO;AAC/B,SAAK,SAAS;AACd,SAAK,MAAM;AACX,SAAK,MAAM,aAAa;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,QAAI,KAAK,QAAQ;AACf,WAAK,MAAM;AAAA,IACb,OAAO;AACL,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,OAAyB,QAAQ;AAClD,UAAM,iBAAiB,MAAM,KAAK,KAAK,IAAI,iBAAiB,kBAAkB,CAAC,EAAE;AAAA,MAC/E,CAAC,SAAS,KAAK,uBAAuB,IAAmB;AAAA,IAC3D;AAEA,mBAAe,QAAQ,CAAC,SAAS;AAC/B,UAAI,SAAS,SAAS;AACpB,aAAK,aAAa,YAAY,IAAI;AAAA,MACpC,OAAO;AACL,aAAK,gBAAgB,UAAU;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB,MAA4B;AACjD,QAAI,WAAW,KAAK;AAGpB,WAAO,aAAa,CAAC,SAAS,YAAY,CAAC,SAAS,SAAS,IAAI,KAAK,WAAW,IAAI;AACnF,iBAAW,SAAS;AAAA,IACtB;AAEA,WAAO,aAAa,QAAQ,aAAa,KAAK;AAAA,EAChD;AACF;AAvJO,IAAM,WAAN;AAAA;AAAA;AAAA;AAIL,cAJW,UAIJ,UAAqB;AAAA,EAC1B,GAAG,6BAAW;AAAA,EACd,MAAM;AAAA,EACN,OAAO,CAAC,cAAc,eAAe,kBAAkB;AAAA,EACvD,YAAY;AAAA,IACV;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -24,7 +24,7 @@ export declare class MenuList<T extends BaseProps = BaseProps> extends Transitio
24
24
  /**
25
25
  * Override `Transition` options.
26
26
  */
27
- get $options(): import("@studiometa/js-toolkit/Base/managers/OptionsManager.js").OptionsManager & import("@studiometa/js-toolkit/Base/index.js").BaseOptions & (T & MenuListProps & import("../../index.js").TransitionProps)["$options"];
27
+ get $options(): import("@studiometa/js-toolkit/Base/managers/OptionsManager.js").OptionsManager & import("@studiometa/js-toolkit/Base/Base.js").BaseOptions & (T & MenuListProps & import("../../index.js").TransitionProps)["$options"];
28
28
  /**
29
29
  * Update tab indexes on mount.
30
30
  */
@@ -13,6 +13,9 @@ const FOCUSABLE_ELEMENTS = [
13
13
  "[tabindex]:not([inert])"
14
14
  ].join(",");
15
15
  class MenuList extends Transition {
16
+ /**
17
+ * Config.
18
+ */
16
19
  static config = {
17
20
  ...Transition.config,
18
21
  name: "MenuList",
@@ -21,23 +24,45 @@ class MenuList extends Transition {
21
24
  MenuList
22
25
  }
23
26
  };
27
+ /**
28
+ * Are the menu items visible?
29
+ */
24
30
  isOpen = false;
31
+ /**
32
+ * Wether the component is hovered.
33
+ */
25
34
  isHover = false;
35
+ /**
36
+ * Override `Transition` options.
37
+ */
38
+ // @ts-ignore
26
39
  get $options() {
27
40
  const options = super.$options;
28
41
  options.leaveKeep = true;
29
42
  options.enterKeep = true;
30
43
  return options;
31
44
  }
45
+ /**
46
+ * Update tab indexes on mount.
47
+ */
32
48
  mounted() {
33
49
  this.__updateTabIndexes("close");
34
50
  }
51
+ /**
52
+ * Set hover state.
53
+ */
35
54
  onMouseenter() {
36
55
  this.isHover = true;
37
56
  }
57
+ /**
58
+ * Unset hover state.
59
+ */
38
60
  onMouseleave() {
39
61
  this.isHover = false;
40
62
  }
63
+ /**
64
+ * Display the menu items.
65
+ */
41
66
  open() {
42
67
  if (this.isOpen) {
43
68
  return;
@@ -55,6 +80,9 @@ class MenuList extends Transition {
55
80
  this.enter();
56
81
  this.$emit("items-open");
57
82
  }
83
+ /**
84
+ * Hide the menu items.
85
+ */
58
86
  close() {
59
87
  if (!this.isOpen) {
60
88
  return;
@@ -71,6 +99,9 @@ class MenuList extends Transition {
71
99
  this.leave();
72
100
  this.$emit("items-close");
73
101
  }
102
+ /**
103
+ * Toggle the menu items.
104
+ */
74
105
  toggle() {
75
106
  if (this.isOpen) {
76
107
  this.close();
@@ -78,6 +109,10 @@ class MenuList extends Transition {
78
109
  this.open();
79
110
  }
80
111
  }
112
+ /**
113
+ * Update `tabindex` attribute of child focusable elements.
114
+ * @private
115
+ */
81
116
  __updateTabIndexes(mode = "open") {
82
117
  const focusableItems = Array.from(this.$el.querySelectorAll(FOCUSABLE_ELEMENTS)).filter(
83
118
  (item) => this.__filterFocusableItems(item)
@@ -90,6 +125,10 @@ class MenuList extends Transition {
90
125
  }
91
126
  });
92
127
  }
128
+ /**
129
+ * Filter out items which are inside a child `MenuList` instance.
130
+ * @private
131
+ */
93
132
  __filterFocusableItems(item) {
94
133
  let ancestor = item.parentElement;
95
134
  while (ancestor && (!ancestor.__base__ || !ancestor.__base__.has(this.constructor))) {