@studiometa/js-toolkit 2.11.2 → 2.12.1

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 (248) hide show
  1. package/Base/Base.cjs +155 -60
  2. package/Base/Base.cjs.map +2 -2
  3. package/Base/Base.js +138 -38
  4. package/Base/Base.js.map +2 -2
  5. package/Base/managers/AbstractManager.cjs +21 -0
  6. package/Base/managers/AbstractManager.cjs.map +1 -1
  7. package/Base/managers/AbstractManager.js +21 -0
  8. package/Base/managers/AbstractManager.js.map +1 -1
  9. package/Base/managers/ChildrenManager.cjs +41 -8
  10. package/Base/managers/ChildrenManager.cjs.map +3 -3
  11. package/Base/managers/ChildrenManager.js +41 -8
  12. package/Base/managers/ChildrenManager.js.map +2 -2
  13. package/Base/managers/EventsManager.cjs +92 -7
  14. package/Base/managers/EventsManager.cjs.map +2 -2
  15. package/Base/managers/EventsManager.js +88 -7
  16. package/Base/managers/EventsManager.js.map +2 -2
  17. package/Base/managers/OptionsManager.cjs +29 -2
  18. package/Base/managers/OptionsManager.cjs.map +2 -2
  19. package/Base/managers/OptionsManager.js +25 -2
  20. package/Base/managers/OptionsManager.js.map +2 -2
  21. package/Base/managers/RefsManager.cjs +19 -5
  22. package/Base/managers/RefsManager.cjs.map +2 -2
  23. package/Base/managers/RefsManager.js +27 -6
  24. package/Base/managers/RefsManager.js.map +2 -2
  25. package/Base/managers/ResponsiveOptionsManager.cjs +22 -6
  26. package/Base/managers/ResponsiveOptionsManager.cjs.map +2 -2
  27. package/Base/managers/ResponsiveOptionsManager.js +22 -6
  28. package/Base/managers/ResponsiveOptionsManager.js.map +2 -2
  29. package/Base/managers/ServicesManager.cjs +54 -4
  30. package/Base/managers/ServicesManager.cjs.map +2 -2
  31. package/Base/managers/ServicesManager.js +54 -4
  32. package/Base/managers/ServicesManager.js.map +2 -2
  33. package/Base/utils.cjs +4 -0
  34. package/Base/utils.cjs.map +1 -1
  35. package/Base/utils.js +4 -0
  36. package/Base/utils.js.map +1 -1
  37. package/decorators/withBreakpointManager.cjs +14 -4
  38. package/decorators/withBreakpointManager.cjs.map +2 -2
  39. package/decorators/withBreakpointManager.js +14 -4
  40. package/decorators/withBreakpointManager.js.map +2 -2
  41. package/decorators/withBreakpointObserver.cjs +11 -1
  42. package/decorators/withBreakpointObserver.cjs.map +2 -2
  43. package/decorators/withBreakpointObserver.js +12 -2
  44. package/decorators/withBreakpointObserver.js.map +2 -2
  45. package/decorators/withDrag.cjs +6 -0
  46. package/decorators/withDrag.cjs.map +1 -1
  47. package/decorators/withDrag.js +6 -0
  48. package/decorators/withDrag.js.map +1 -1
  49. package/decorators/withExtraConfig.cjs +7 -0
  50. package/decorators/withExtraConfig.cjs.map +1 -1
  51. package/decorators/withExtraConfig.js +3 -0
  52. package/decorators/withExtraConfig.js.map +1 -1
  53. package/decorators/withFreezedOptions.cjs +8 -0
  54. package/decorators/withFreezedOptions.cjs.map +1 -1
  55. package/decorators/withFreezedOptions.js +8 -0
  56. package/decorators/withFreezedOptions.js.map +1 -1
  57. package/decorators/withIntersectionObserver.cjs +9 -0
  58. package/decorators/withIntersectionObserver.cjs.map +1 -1
  59. package/decorators/withIntersectionObserver.js +9 -0
  60. package/decorators/withIntersectionObserver.js.map +1 -1
  61. package/decorators/withMountOnMediaQuery.cjs +16 -0
  62. package/decorators/withMountOnMediaQuery.cjs.map +1 -1
  63. package/decorators/withMountOnMediaQuery.js +16 -0
  64. package/decorators/withMountOnMediaQuery.js.map +1 -1
  65. package/decorators/withMountWhenInView.cjs +21 -0
  66. package/decorators/withMountWhenInView.cjs.map +1 -1
  67. package/decorators/withMountWhenInView.js +21 -0
  68. package/decorators/withMountWhenInView.js.map +1 -1
  69. package/decorators/withRelativePointer.cjs +6 -0
  70. package/decorators/withRelativePointer.cjs.map +1 -1
  71. package/decorators/withRelativePointer.js +6 -0
  72. package/decorators/withRelativePointer.js.map +1 -1
  73. package/decorators/withResponsiveOptions.cjs +3 -0
  74. package/decorators/withResponsiveOptions.cjs.map +1 -1
  75. package/decorators/withResponsiveOptions.js +3 -0
  76. package/decorators/withResponsiveOptions.js.map +1 -1
  77. package/decorators/withScrolledInView/utils.cjs +6 -6
  78. package/decorators/withScrolledInView/utils.cjs.map +2 -2
  79. package/decorators/withScrolledInView/utils.js +7 -7
  80. package/decorators/withScrolledInView/utils.js.map +2 -2
  81. package/decorators/withScrolledInView/withScrolledInView.cjs +33 -0
  82. package/decorators/withScrolledInView/withScrolledInView.cjs.map +1 -1
  83. package/decorators/withScrolledInView/withScrolledInView.js +33 -0
  84. package/decorators/withScrolledInView/withScrolledInView.js.map +1 -1
  85. package/decorators/withVue2.cjs +3 -0
  86. package/decorators/withVue2.cjs.map +1 -1
  87. package/decorators/withVue2.js +3 -0
  88. package/decorators/withVue2.js.map +1 -1
  89. package/helpers/createApp.cjs +2 -2
  90. package/helpers/createApp.cjs.map +2 -2
  91. package/helpers/createApp.js +2 -2
  92. package/helpers/createApp.js.map +2 -2
  93. package/helpers/getClosestParent.cjs +4 -0
  94. package/helpers/getClosestParent.cjs.map +1 -1
  95. package/helpers/getDirectChildren.cjs.map +1 -1
  96. package/helpers/getDirectChildren.js.map +1 -1
  97. package/helpers/importOnInteraction.cjs +4 -4
  98. package/helpers/importOnInteraction.cjs.map +2 -2
  99. package/helpers/importOnInteraction.js +4 -4
  100. package/helpers/importOnInteraction.js.map +2 -2
  101. package/helpers/importWhenPrefersMotion.cjs +4 -0
  102. package/helpers/importWhenPrefersMotion.cjs.map +1 -1
  103. package/helpers/importWhenVisible.cjs +2 -1
  104. package/helpers/importWhenVisible.cjs.map +2 -2
  105. package/helpers/importWhenVisible.js +2 -1
  106. package/helpers/importWhenVisible.js.map +2 -2
  107. package/helpers/index.cjs +4 -0
  108. package/helpers/index.cjs.map +1 -1
  109. package/package.json +3 -3
  110. package/services/drag.cjs +12 -8
  111. package/services/drag.cjs.map +2 -2
  112. package/services/drag.js +8 -8
  113. package/services/drag.js.map +2 -2
  114. package/services/index.cjs +4 -0
  115. package/services/index.cjs.map +1 -1
  116. package/services/key.cjs +6 -2
  117. package/services/key.cjs.map +2 -2
  118. package/services/key.js +2 -2
  119. package/services/key.js.map +2 -2
  120. package/services/load.cjs +3 -0
  121. package/services/load.cjs.map +1 -1
  122. package/services/load.js +3 -0
  123. package/services/load.js.map +1 -1
  124. package/services/pointer.cjs +4 -4
  125. package/services/pointer.cjs.map +2 -2
  126. package/services/pointer.js +4 -4
  127. package/services/pointer.js.map +2 -2
  128. package/services/raf.cjs +2 -2
  129. package/services/raf.cjs.map +2 -2
  130. package/services/raf.js +2 -2
  131. package/services/raf.js.map +2 -2
  132. package/services/resize.cjs +4 -0
  133. package/services/resize.cjs.map +1 -1
  134. package/services/scroll.cjs +4 -0
  135. package/services/scroll.cjs.map +1 -1
  136. package/services/service.cjs +2 -2
  137. package/services/service.cjs.map +2 -2
  138. package/services/service.js +2 -2
  139. package/services/service.js.map +2 -2
  140. package/utils/Queue.cjs +30 -0
  141. package/utils/Queue.cjs.map +1 -1
  142. package/utils/Queue.js +30 -0
  143. package/utils/Queue.js.map +1 -1
  144. package/utils/SmartQueue.cjs +16 -0
  145. package/utils/SmartQueue.cjs.map +1 -1
  146. package/utils/SmartQueue.js +12 -0
  147. package/utils/SmartQueue.js.map +1 -1
  148. package/utils/collide/collidePointRect.cjs +4 -1
  149. package/utils/collide/collidePointRect.cjs.map +1 -1
  150. package/utils/collide/collidePointRect.js +4 -1
  151. package/utils/collide/collidePointRect.js.map +1 -1
  152. package/utils/collide/collideRectRect.cjs +4 -1
  153. package/utils/collide/collideRectRect.cjs.map +1 -1
  154. package/utils/collide/collideRectRect.js +4 -1
  155. package/utils/collide/collideRectRect.js.map +1 -1
  156. package/utils/collide/index.cjs +4 -0
  157. package/utils/collide/index.cjs.map +1 -1
  158. package/utils/css/animate.cjs +21 -12
  159. package/utils/css/animate.cjs.map +2 -2
  160. package/utils/css/animate.js +17 -12
  161. package/utils/css/animate.js.map +2 -2
  162. package/utils/css/classes.cjs +2 -3
  163. package/utils/css/classes.cjs.map +2 -2
  164. package/utils/css/classes.js +2 -3
  165. package/utils/css/classes.js.map +2 -2
  166. package/utils/css/index.cjs +4 -0
  167. package/utils/css/index.cjs.map +1 -1
  168. package/utils/css/matrix.cjs.map +1 -1
  169. package/utils/css/matrix.js.map +1 -1
  170. package/utils/css/styles.cjs +2 -2
  171. package/utils/css/styles.cjs.map +2 -2
  172. package/utils/css/styles.js +2 -2
  173. package/utils/css/styles.js.map +2 -2
  174. package/utils/css/transform.cjs.map +1 -1
  175. package/utils/css/transform.js.map +1 -1
  176. package/utils/css/transition.cjs +19 -0
  177. package/utils/css/transition.cjs.map +1 -1
  178. package/utils/css/transition.js +15 -0
  179. package/utils/css/transition.js.map +1 -1
  180. package/utils/focusTrap.cjs +4 -0
  181. package/utils/focusTrap.cjs.map +1 -1
  182. package/utils/focusTrap.js.map +1 -1
  183. package/utils/history.cjs +6 -5
  184. package/utils/history.cjs.map +2 -2
  185. package/utils/history.js +6 -5
  186. package/utils/history.js.map +2 -2
  187. package/utils/index.cjs +4 -0
  188. package/utils/index.cjs.map +1 -1
  189. package/utils/math/clamp01.cjs +4 -0
  190. package/utils/math/clamp01.cjs.map +1 -1
  191. package/utils/math/index.cjs +4 -0
  192. package/utils/math/index.cjs.map +1 -1
  193. package/utils/math/inertiaFinalValue.cjs +4 -0
  194. package/utils/math/inertiaFinalValue.cjs.map +1 -1
  195. package/utils/object/autoBind.cjs +11 -5
  196. package/utils/object/autoBind.cjs.map +2 -2
  197. package/utils/object/autoBind.js +7 -5
  198. package/utils/object/autoBind.js.map +2 -2
  199. package/utils/object/index.cjs +4 -0
  200. package/utils/object/index.cjs.map +1 -1
  201. package/utils/scheduler.cjs +4 -4
  202. package/utils/scheduler.cjs.map +2 -2
  203. package/utils/scheduler.js +4 -4
  204. package/utils/scheduler.js.map +2 -2
  205. package/utils/scrollTo.cjs +4 -0
  206. package/utils/scrollTo.cjs.map +1 -1
  207. package/utils/string/endsWith.cjs +35 -0
  208. package/utils/string/endsWith.cjs.map +7 -0
  209. package/utils/string/endsWith.d.ts +8 -0
  210. package/utils/string/endsWith.js +13 -0
  211. package/utils/string/endsWith.js.map +7 -0
  212. package/utils/string/index.cjs +7 -0
  213. package/utils/string/index.cjs.map +2 -2
  214. package/utils/string/index.d.ts +2 -0
  215. package/utils/string/index.js +2 -0
  216. package/utils/string/index.js.map +2 -2
  217. package/utils/string/startsWith.cjs +35 -0
  218. package/utils/string/startsWith.cjs.map +7 -0
  219. package/utils/string/startsWith.d.ts +8 -0
  220. package/utils/string/startsWith.js +13 -0
  221. package/utils/string/startsWith.js.map +7 -0
  222. package/utils/string/withLeadingCharacters.cjs +4 -0
  223. package/utils/string/withLeadingCharacters.cjs.map +1 -1
  224. package/utils/string/withLeadingCharacters.js.map +1 -1
  225. package/utils/string/withLeadingSlash.cjs +4 -0
  226. package/utils/string/withLeadingSlash.cjs.map +1 -1
  227. package/utils/string/withTrailingCharacters.cjs +4 -0
  228. package/utils/string/withTrailingCharacters.cjs.map +1 -1
  229. package/utils/string/withTrailingCharacters.js.map +1 -1
  230. package/utils/string/withTrailingSlash.cjs +4 -0
  231. package/utils/string/withTrailingSlash.cjs.map +1 -1
  232. package/utils/string/withoutLeadingCharacters.cjs.map +1 -1
  233. package/utils/string/withoutLeadingCharacters.js.map +1 -1
  234. package/utils/string/withoutLeadingCharactersRecursive.cjs +4 -0
  235. package/utils/string/withoutLeadingCharactersRecursive.cjs.map +1 -1
  236. package/utils/string/withoutLeadingCharactersRecursive.js.map +1 -1
  237. package/utils/string/withoutLeadingSlash.cjs +4 -0
  238. package/utils/string/withoutLeadingSlash.cjs.map +1 -1
  239. package/utils/string/withoutTrailingCharacters.cjs.map +1 -1
  240. package/utils/string/withoutTrailingCharacters.js.map +1 -1
  241. package/utils/string/withoutTrailingCharactersRecursive.cjs +4 -0
  242. package/utils/string/withoutTrailingCharactersRecursive.cjs.map +1 -1
  243. package/utils/string/withoutTrailingCharactersRecursive.js.map +1 -1
  244. package/utils/string/withoutTrailingSlash.cjs +4 -0
  245. package/utils/string/withoutTrailingSlash.cjs.map +1 -1
  246. package/utils/tween.cjs +4 -0
  247. package/utils/tween.cjs.map +1 -1
  248. package/utils/tween.js.map +1 -1
@@ -1,5 +1,12 @@
1
1
  import { AbstractManager } from "./AbstractManager.js";
2
- import { isDev, isArray, isDefined, getAncestorWhereUntil } from "../../utils/index.js";
2
+ import {
3
+ isDev,
4
+ isArray,
5
+ isDefined,
6
+ getAncestorWhereUntil,
7
+ endsWith,
8
+ startsWith
9
+ } from "../../utils/index.js";
3
10
  const NORMALIZE_REF_NAME_REGEX = /\[\]$/;
4
11
  const NAMESPACED_REF_REGEX = /^(.*\.)/;
5
12
  const normalizedRefNamesCache = /* @__PURE__ */ new Map();
@@ -8,7 +15,7 @@ function normalizeRefName(name) {
8
15
  return normalizedRefNamesCache.get(name);
9
16
  }
10
17
  let normalizedName = name;
11
- if (name.endsWith("[]")) {
18
+ if (endsWith(name, "[]")) {
12
19
  normalizedName = normalizedName.replace(NORMALIZE_REF_NAME_REGEX, "");
13
20
  }
14
21
  if (normalizedName.includes(".")) {
@@ -18,7 +25,7 @@ function normalizeRefName(name) {
18
25
  return normalizedName;
19
26
  }
20
27
  function refBelongToInstance(ref, rootElement, name) {
21
- const isPrefixed = ref.dataset.ref.startsWith(name);
28
+ const isPrefixed = startsWith(ref.dataset.ref, name);
22
29
  const firstComponentAncestor = getAncestorWhereUntil(
23
30
  ref,
24
31
  (el) => el && (isPrefixed ? el.dataset.component === name && el : isDefined(el.dataset.component)) && el !== rootElement,
@@ -27,7 +34,7 @@ function refBelongToInstance(ref, rootElement, name) {
27
34
  return firstComponentAncestor === rootElement;
28
35
  }
29
36
  function __register(that, refName) {
30
- const isMultiple = refName.endsWith("[]");
37
+ const isMultiple = endsWith(refName, "[]");
31
38
  const propName = normalizeRefName(refName);
32
39
  const { name } = that.__base.$options;
33
40
  const refs = Array.from(
@@ -37,6 +44,7 @@ function __register(that, refName) {
37
44
  ).filter((ref) => refBelongToInstance(ref, that.__element, name));
38
45
  if (isDev && !isMultiple && refs.length > 1) {
39
46
  console.warn(
47
+ // @ts-ignore
40
48
  `[${that.__base.$options.name}]`,
41
49
  `The "${refName}" ref has been found multiple times.`,
42
50
  "Did you forgot to add the `[]` suffix to its name?"
@@ -45,6 +53,7 @@ function __register(that, refName) {
45
53
  if (!isMultiple && refs.length <= 1 && !isDefined(refs[0])) {
46
54
  if (isDev) {
47
55
  console.warn(
56
+ // @ts-ignore
48
57
  `[${that.__base.$options.name}]`,
49
58
  `The "${refName}" ref is missing.`,
50
59
  `Is there an \`[data-ref="${refName}"]\` element in the component's scope?`
@@ -54,6 +63,7 @@ function __register(that, refName) {
54
63
  }
55
64
  that.__eventsManager.bindRef(refName, refs);
56
65
  Object.defineProperty(that, propName, {
66
+ // @todo remove usage of non-multiple refs as array
57
67
  value: isMultiple || refs.length > 1 ? refs : refs[0],
58
68
  enumerable: true,
59
69
  configurable: true
@@ -65,14 +75,25 @@ function __unregister(that, refName) {
65
75
  that.__eventsManager.unbindRef(refName, refs);
66
76
  }
67
77
  class RefsManager extends AbstractManager {
78
+ /**
79
+ * Get refs configuration.
80
+ */
68
81
  get __refs() {
69
82
  return this.__config.refs ?? [];
70
83
  }
84
+ /**
85
+ * Register all refs.
86
+ */
71
87
  registerAll() {
72
- this.__refs.forEach((refName) => __register(this, refName));
88
+ for (const refName of this.__refs)
89
+ __register(this, refName);
73
90
  }
91
+ /**
92
+ * Unregister all refs.
93
+ */
74
94
  unregisterAll() {
75
- this.__refs.forEach((refName) => __unregister(this, refName));
95
+ for (const refName of this.__refs)
96
+ __unregister(this, refName);
76
97
  }
77
98
  }
78
99
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/RefsManager.ts"],
4
- "sourcesContent": ["import { AbstractManager } from './AbstractManager.js';\nimport { isDev, isArray, isDefined, getAncestorWhereUntil } from '../../utils/index.js';\n\nconst NORMALIZE_REF_NAME_REGEX = /\\[\\]$/;\nconst NAMESPACED_REF_REGEX = /^(.*\\.)/;\nconst normalizedRefNamesCache = new Map();\n\n/**\n * Normalize the name of ref.\n */\nexport function normalizeRefName(name: string) {\n if (normalizedRefNamesCache.has(name)) {\n return normalizedRefNamesCache.get(name);\n }\n\n let normalizedName = name;\n\n if (name.endsWith('[]')) {\n normalizedName = normalizedName.replace(NORMALIZE_REF_NAME_REGEX, '');\n }\n\n if (normalizedName.includes('.')) {\n return normalizedName.replace(NAMESPACED_REF_REGEX, '');\n }\n\n normalizedRefNamesCache.set(name, normalizedName);\n return normalizedName;\n}\n\n/**\n * Filter refs belonging to the related Base instance.\n */\nfunction refBelongToInstance(ref: HTMLElement, rootElement: HTMLElement, name: string) {\n const isPrefixed = ref.dataset.ref.startsWith(name);\n const firstComponentAncestor = getAncestorWhereUntil(\n ref,\n (el) =>\n el &&\n (isPrefixed ? el.dataset.component === name && el : isDefined(el.dataset.component)) &&\n el !== rootElement,\n (el) => el === rootElement,\n );\n\n return firstComponentAncestor === rootElement;\n}\n\n/**\n * Register one ref.\n *\n * @param {RefsManager} that\n * @param {string} refName The ref name.\n * @private\n */\nfunction __register(that: RefsManager, refName: string) {\n const isMultiple = refName.endsWith('[]');\n const propName = normalizeRefName(refName);\n const { name } = that.__base.$options;\n\n const refs = Array.from(\n that.__element.querySelectorAll<HTMLElement>(\n `[data-ref=\"${refName}\"],[data-ref=\"${name}.${refName}\"]`,\n ),\n ).filter((ref) => refBelongToInstance(ref, that.__element, name));\n\n if (isDev && !isMultiple && refs.length > 1) {\n console.warn(\n // @ts-ignore\n `[${that.__base.$options.name}]`,\n `The \"${refName}\" ref has been found multiple times.`,\n 'Did you forgot to add the `[]` suffix to its name?',\n );\n }\n\n if (!isMultiple && refs.length <= 1 && !isDefined(refs[0])) {\n if (isDev) {\n console.warn(\n // @ts-ignore\n `[${that.__base.$options.name}]`,\n `The \"${refName}\" ref is missing.`,\n `Is there an \\`[data-ref=\"${refName}\"]\\` element in the component's scope?`,\n );\n }\n\n return;\n }\n\n that.__eventsManager.bindRef(refName, refs);\n\n Object.defineProperty(that, propName, {\n // @todo remove usage of non-multiple refs as array\n value: isMultiple || refs.length > 1 ? refs : refs[0],\n enumerable: true,\n configurable: true,\n });\n}\n\n/**\n * Unregister one ref.\n */\nfunction __unregister(that: RefsManager, refName: string) {\n const propName = normalizeRefName(refName);\n const refs = isArray(that[propName]) ? that[propName] : [that[propName]];\n that.__eventsManager.unbindRef(refName, refs);\n}\n\n/**\n * Refs Manager\n *\n * @todo Use `MutationObserver` to automatically update refs?\n */\nexport class RefsManager extends AbstractManager {\n /**\n * Get refs configuration.\n */\n get __refs() {\n return this.__config.refs ?? [];\n }\n\n /**\n * Register all refs.\n */\n registerAll() {\n this.__refs.forEach((refName) => __register(this, refName));\n }\n\n /**\n * Unregister all refs.\n */\n unregisterAll() {\n this.__refs.forEach((refName) => __unregister(this, refName));\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,uBAAuB;AAChC,SAAS,OAAO,SAAS,WAAW,6BAA6B;AAEjE,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAC7B,MAAM,0BAA0B,oBAAI,IAAI;AAKjC,SAAS,iBAAiB,MAAc;AAC7C,MAAI,wBAAwB,IAAI,IAAI,GAAG;AACrC,WAAO,wBAAwB,IAAI,IAAI;AAAA,EACzC;AAEA,MAAI,iBAAiB;AAErB,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,qBAAiB,eAAe,QAAQ,0BAA0B,EAAE;AAAA,EACtE;AAEA,MAAI,eAAe,SAAS,GAAG,GAAG;AAChC,WAAO,eAAe,QAAQ,sBAAsB,EAAE;AAAA,EACxD;AAEA,0BAAwB,IAAI,MAAM,cAAc;AAChD,SAAO;AACT;AAKA,SAAS,oBAAoB,KAAkB,aAA0B,MAAc;AACrF,QAAM,aAAa,IAAI,QAAQ,IAAI,WAAW,IAAI;AAClD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA,CAAC,OACC,OACC,aAAa,GAAG,QAAQ,cAAc,QAAQ,KAAK,UAAU,GAAG,QAAQ,SAAS,MAClF,OAAO;AAAA,IACT,CAAC,OAAO,OAAO;AAAA,EACjB;AAEA,SAAO,2BAA2B;AACpC;AASA,SAAS,WAAW,MAAmB,SAAiB;AACtD,QAAM,aAAa,QAAQ,SAAS,IAAI;AACxC,QAAM,WAAW,iBAAiB,OAAO;AACzC,QAAM,EAAE,KAAK,IAAI,KAAK,OAAO;AAE7B,QAAM,OAAO,MAAM;AAAA,IACjB,KAAK,UAAU;AAAA,MACb,cAAc,wBAAwB,QAAQ;AAAA,IAChD;AAAA,EACF,EAAE,OAAO,CAAC,QAAQ,oBAAoB,KAAK,KAAK,WAAW,IAAI,CAAC;AAEhE,MAAI,SAAS,CAAC,cAAc,KAAK,SAAS,GAAG;AAC3C,YAAQ;AAAA,MAEN,IAAI,KAAK,OAAO,SAAS;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,KAAK,UAAU,KAAK,CAAC,UAAU,KAAK,EAAE,GAAG;AAC1D,QAAI,OAAO;AACT,cAAQ;AAAA,QAEN,IAAI,KAAK,OAAO,SAAS;AAAA,QACzB,QAAQ;AAAA,QACR,4BAA4B;AAAA,MAC9B;AAAA,IACF;AAEA;AAAA,EACF;AAEA,OAAK,gBAAgB,QAAQ,SAAS,IAAI;AAE1C,SAAO,eAAe,MAAM,UAAU;AAAA,IAEpC,OAAO,cAAc,KAAK,SAAS,IAAI,OAAO,KAAK;AAAA,IACnD,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AACH;AAKA,SAAS,aAAa,MAAmB,SAAiB;AACxD,QAAM,WAAW,iBAAiB,OAAO;AACzC,QAAM,OAAO,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,CAAC,KAAK,SAAS;AACvE,OAAK,gBAAgB,UAAU,SAAS,IAAI;AAC9C;AAOO,MAAM,oBAAoB,gBAAgB;AAAA,EAI/C,IAAI,SAAS;AACX,WAAO,KAAK,SAAS,QAAQ,CAAC;AAAA,EAChC;AAAA,EAKA,cAAc;AACZ,SAAK,OAAO,QAAQ,CAAC,YAAY,WAAW,MAAM,OAAO,CAAC;AAAA,EAC5D;AAAA,EAKA,gBAAgB;AACd,SAAK,OAAO,QAAQ,CAAC,YAAY,aAAa,MAAM,OAAO,CAAC;AAAA,EAC9D;AACF;",
4
+ "sourcesContent": ["import { AbstractManager } from './AbstractManager.js';\nimport {\n isDev,\n isArray,\n isDefined,\n getAncestorWhereUntil,\n endsWith,\n startsWith,\n} from '../../utils/index.js';\n\nconst NORMALIZE_REF_NAME_REGEX = /\\[\\]$/;\nconst NAMESPACED_REF_REGEX = /^(.*\\.)/;\nconst normalizedRefNamesCache = new Map();\n\n/**\n * Normalize the name of ref.\n */\nexport function normalizeRefName(name: string) {\n if (normalizedRefNamesCache.has(name)) {\n return normalizedRefNamesCache.get(name);\n }\n\n let normalizedName = name;\n\n if (endsWith(name, '[]')) {\n normalizedName = normalizedName.replace(NORMALIZE_REF_NAME_REGEX, '');\n }\n\n if (normalizedName.includes('.')) {\n return normalizedName.replace(NAMESPACED_REF_REGEX, '');\n }\n\n normalizedRefNamesCache.set(name, normalizedName);\n return normalizedName;\n}\n\n/**\n * Filter refs belonging to the related Base instance.\n */\nfunction refBelongToInstance(ref: HTMLElement, rootElement: HTMLElement, name: string) {\n const isPrefixed = startsWith(ref.dataset.ref, name);\n const firstComponentAncestor = getAncestorWhereUntil(\n ref,\n (el) =>\n el &&\n (isPrefixed ? el.dataset.component === name && el : isDefined(el.dataset.component)) &&\n el !== rootElement,\n (el) => el === rootElement,\n );\n\n return firstComponentAncestor === rootElement;\n}\n\n/**\n * Register one ref.\n *\n * @param {RefsManager} that\n * @param {string} refName The ref name.\n * @private\n */\nfunction __register(that: RefsManager, refName: string) {\n const isMultiple = endsWith(refName, '[]');\n const propName = normalizeRefName(refName);\n const { name } = that.__base.$options;\n\n const refs = Array.from(\n that.__element.querySelectorAll<HTMLElement>(\n `[data-ref=\"${refName}\"],[data-ref=\"${name}.${refName}\"]`,\n ),\n ).filter((ref) => refBelongToInstance(ref, that.__element, name));\n\n if (isDev && !isMultiple && refs.length > 1) {\n console.warn(\n // @ts-ignore\n `[${that.__base.$options.name}]`,\n `The \"${refName}\" ref has been found multiple times.`,\n 'Did you forgot to add the `[]` suffix to its name?',\n );\n }\n\n if (!isMultiple && refs.length <= 1 && !isDefined(refs[0])) {\n if (isDev) {\n console.warn(\n // @ts-ignore\n `[${that.__base.$options.name}]`,\n `The \"${refName}\" ref is missing.`,\n `Is there an \\`[data-ref=\"${refName}\"]\\` element in the component's scope?`,\n );\n }\n\n return;\n }\n\n that.__eventsManager.bindRef(refName, refs);\n\n Object.defineProperty(that, propName, {\n // @todo remove usage of non-multiple refs as array\n value: isMultiple || refs.length > 1 ? refs : refs[0],\n enumerable: true,\n configurable: true,\n });\n}\n\n/**\n * Unregister one ref.\n */\nfunction __unregister(that: RefsManager, refName: string) {\n const propName = normalizeRefName(refName);\n const refs = isArray(that[propName]) ? that[propName] : [that[propName]];\n that.__eventsManager.unbindRef(refName, refs);\n}\n\n/**\n * Refs Manager\n *\n * @todo Use `MutationObserver` to automatically update refs?\n */\nexport class RefsManager extends AbstractManager {\n /**\n * Get refs configuration.\n */\n get __refs() {\n return this.__config.refs ?? [];\n }\n\n /**\n * Register all refs.\n */\n registerAll() {\n for (const refName of this.__refs) __register(this, refName);\n }\n\n /**\n * Unregister all refs.\n */\n unregisterAll() {\n for (const refName of this.__refs) __unregister(this, refName);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAC7B,MAAM,0BAA0B,oBAAI,IAAI;AAKjC,SAAS,iBAAiB,MAAc;AAC7C,MAAI,wBAAwB,IAAI,IAAI,GAAG;AACrC,WAAO,wBAAwB,IAAI,IAAI;AAAA,EACzC;AAEA,MAAI,iBAAiB;AAErB,MAAI,SAAS,MAAM,IAAI,GAAG;AACxB,qBAAiB,eAAe,QAAQ,0BAA0B,EAAE;AAAA,EACtE;AAEA,MAAI,eAAe,SAAS,GAAG,GAAG;AAChC,WAAO,eAAe,QAAQ,sBAAsB,EAAE;AAAA,EACxD;AAEA,0BAAwB,IAAI,MAAM,cAAc;AAChD,SAAO;AACT;AAKA,SAAS,oBAAoB,KAAkB,aAA0B,MAAc;AACrF,QAAM,aAAa,WAAW,IAAI,QAAQ,KAAK,IAAI;AACnD,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA,CAAC,OACC,OACC,aAAa,GAAG,QAAQ,cAAc,QAAQ,KAAK,UAAU,GAAG,QAAQ,SAAS,MAClF,OAAO;AAAA,IACT,CAAC,OAAO,OAAO;AAAA,EACjB;AAEA,SAAO,2BAA2B;AACpC;AASA,SAAS,WAAW,MAAmB,SAAiB;AACtD,QAAM,aAAa,SAAS,SAAS,IAAI;AACzC,QAAM,WAAW,iBAAiB,OAAO;AACzC,QAAM,EAAE,KAAK,IAAI,KAAK,OAAO;AAE7B,QAAM,OAAO,MAAM;AAAA,IACjB,KAAK,UAAU;AAAA,MACb,cAAc,OAAO,iBAAiB,IAAI,IAAI,OAAO;AAAA,IACvD;AAAA,EACF,EAAE,OAAO,CAAC,QAAQ,oBAAoB,KAAK,KAAK,WAAW,IAAI,CAAC;AAEhE,MAAI,SAAS,CAAC,cAAc,KAAK,SAAS,GAAG;AAC3C,YAAQ;AAAA;AAAA,MAEN,IAAI,KAAK,OAAO,SAAS,IAAI;AAAA,MAC7B,QAAQ,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,cAAc,KAAK,UAAU,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,GAAG;AAC1D,QAAI,OAAO;AACT,cAAQ;AAAA;AAAA,QAEN,IAAI,KAAK,OAAO,SAAS,IAAI;AAAA,QAC7B,QAAQ,OAAO;AAAA,QACf,4BAA4B,OAAO;AAAA,MACrC;AAAA,IACF;AAEA;AAAA,EACF;AAEA,OAAK,gBAAgB,QAAQ,SAAS,IAAI;AAE1C,SAAO,eAAe,MAAM,UAAU;AAAA;AAAA,IAEpC,OAAO,cAAc,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,IACpD,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB,CAAC;AACH;AAKA,SAAS,aAAa,MAAmB,SAAiB;AACxD,QAAM,WAAW,iBAAiB,OAAO;AACzC,QAAM,OAAO,QAAQ,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,CAAC;AACvE,OAAK,gBAAgB,UAAU,SAAS,IAAI;AAC9C;AAOO,MAAM,oBAAoB,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAI/C,IAAI,SAAS;AACX,WAAO,KAAK,SAAS,QAAQ,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,eAAW,WAAW,KAAK;AAAQ,iBAAW,MAAM,OAAO;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,eAAW,WAAW,KAAK;AAAQ,mBAAa,MAAM,OAAO;AAAA,EAC/D;AACF;",
6
6
  "names": []
7
7
  }
@@ -33,22 +33,38 @@ function __getResponsiveName(that, name) {
33
33
  let responsiveName = name;
34
34
  const propertyName = (0, import_OptionsManager.__getPropertyName)(name);
35
35
  const regex = new RegExp(`${propertyName}:(.+)$`);
36
- Object.keys(that.__element.dataset).filter((optionName) => regex.test(optionName)).forEach((optionName) => {
37
- const [, breakpoints] = optionName.match(regex);
38
- const isInBreakpoint = breakpoints.split(":").includes(breakpoint);
39
- if (isInBreakpoint) {
40
- responsiveName = optionName.replace(/^option/, "");
36
+ for (const optionName of Object.keys(that.__element.dataset)) {
37
+ if (regex.test(optionName)) {
38
+ const [, breakpoints] = optionName.match(regex);
39
+ const isInBreakpoint = breakpoints.split(":").includes(breakpoint);
40
+ if (isInBreakpoint) {
41
+ responsiveName = optionName.replace(/^option/, "");
42
+ }
41
43
  }
42
- });
44
+ }
43
45
  return responsiveName;
44
46
  }
45
47
  var ResponsiveOptionsManager = class extends import_OptionsManager.OptionsManager {
48
+ /**
49
+ * Get an option value.
50
+ *
51
+ * @param {string} name The option name.
52
+ * @param {ResponsiveOptionObject} config The option configuration.
53
+ * @returns {any}
54
+ */
46
55
  get(name, config) {
47
56
  if (!config.responsive) {
48
57
  return super.get(name, config);
49
58
  }
50
59
  return super.get(__getResponsiveName(this, name), config);
51
60
  }
61
+ /**
62
+ * Set an option value.
63
+ *
64
+ * @param {string} name The option name.
65
+ * @param {any} value The new value.
66
+ * @param {ResponsiveOptionObject} config The option configuration.
67
+ */
52
68
  set(name, value, config) {
53
69
  if (!config.responsive) {
54
70
  super.set(name, value, config);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/ResponsiveOptionsManager.ts"],
4
- "sourcesContent": ["import { OptionsManager, __getPropertyName } from './OptionsManager.js';\nimport type { OptionObject } from './OptionsManager.js';\nimport { useResize } from '../../services/index.js';\nimport { isDev } from '../../utils/index.js';\n\nexport type ResponsiveOptionObject = OptionObject & { responsive?: boolean };\n\n/**\n * Get the currently active responsive name of an option.\n *\n * @param {ResponsiveOptionsManager} that\n * @param {string} name The default name of the option.\n * @returns {string} The responsive name if one matches the current breakpoint, the default name otherwise.\n */\nfunction __getResponsiveName(that: ResponsiveOptionsManager, name: string) {\n const { breakpoint } = useResize().props();\n\n if (!breakpoint) {\n return name;\n }\n\n let responsiveName = name;\n const propertyName = __getPropertyName(name);\n const regex = new RegExp(`${propertyName}:(.+)$`);\n\n Object.keys(that.__element.dataset)\n .filter((optionName) => regex.test(optionName))\n .forEach((optionName) => {\n const [, breakpoints] = optionName.match(regex);\n const isInBreakpoint = breakpoints.split(':').includes(breakpoint);\n if (isInBreakpoint) {\n responsiveName = optionName.replace(/^option/, '');\n }\n });\n\n return responsiveName;\n}\n\n/**\n * Class options to manage options as data attributes on an HTML element.\n */\nexport class ResponsiveOptionsManager extends OptionsManager {\n /**\n * Get an option value.\n *\n * @param {string} name The option name.\n * @param {ResponsiveOptionObject} config The option configuration.\n * @returns {any}\n */\n get(name: string, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n return super.get(name, config);\n }\n\n return super.get(__getResponsiveName(this, name), config);\n }\n\n /**\n * Set an option value.\n *\n * @param {string} name The option name.\n * @param {any} value The new value.\n * @param {ResponsiveOptionObject} config The option configuration.\n */\n set(name: string, value: unknown, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n super.set(name, value, config);\n return;\n }\n\n if (isDev) {\n console.warn(`[${this.__config.name}]`, 'Responsive options are read-only.');\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAkD;AAElD,sBAA0B;AAC1B,mBAAsB;AAWtB,SAAS,oBAAoB,MAAgC,MAAc;AACzE,QAAM,EAAE,WAAW,QAAI,2BAAU,EAAE,MAAM;AAEzC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB;AACrB,QAAM,mBAAe,yCAAkB,IAAI;AAC3C,QAAM,QAAQ,IAAI,OAAO,GAAG,oBAAoB;AAEhD,SAAO,KAAK,KAAK,UAAU,OAAO,EAC/B,OAAO,CAAC,eAAe,MAAM,KAAK,UAAU,CAAC,EAC7C,QAAQ,CAAC,eAAe;AACvB,UAAM,CAAC,EAAE,WAAW,IAAI,WAAW,MAAM,KAAK;AAC9C,UAAM,iBAAiB,YAAY,MAAM,GAAG,EAAE,SAAS,UAAU;AACjE,QAAI,gBAAgB;AAClB,uBAAiB,WAAW,QAAQ,WAAW,EAAE;AAAA,IACnD;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAKO,IAAM,2BAAN,cAAuC,qCAAe;AAAA,EAQ3D,IAAI,MAAc,QAAgC;AAChD,QAAI,CAAC,OAAO,YAAY;AACtB,aAAO,MAAM,IAAI,MAAM,MAAM;AAAA,IAC/B;AAEA,WAAO,MAAM,IAAI,oBAAoB,MAAM,IAAI,GAAG,MAAM;AAAA,EAC1D;AAAA,EASA,IAAI,MAAc,OAAgB,QAAgC;AAChE,QAAI,CAAC,OAAO,YAAY;AACtB,YAAM,IAAI,MAAM,OAAO,MAAM;AAC7B;AAAA,IACF;AAEA,QAAI,oBAAO;AACT,cAAQ,KAAK,IAAI,KAAK,SAAS,SAAS,mCAAmC;AAAA,IAC7E;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { OptionsManager, __getPropertyName } from './OptionsManager.js';\nimport type { OptionObject } from './OptionsManager.js';\nimport { useResize } from '../../services/index.js';\nimport { isDev } from '../../utils/index.js';\n\nexport type ResponsiveOptionObject = OptionObject & { responsive?: boolean };\n\n/**\n * Get the currently active responsive name of an option.\n *\n * @param {ResponsiveOptionsManager} that\n * @param {string} name The default name of the option.\n * @returns {string} The responsive name if one matches the current breakpoint, the default name otherwise.\n */\nfunction __getResponsiveName(that: ResponsiveOptionsManager, name: string) {\n const { breakpoint } = useResize().props();\n\n if (!breakpoint) {\n return name;\n }\n\n let responsiveName = name;\n const propertyName = __getPropertyName(name);\n const regex = new RegExp(`${propertyName}:(.+)$`);\n\n for (const optionName of Object.keys(that.__element.dataset)) {\n if (regex.test(optionName)) {\n const [, breakpoints] = optionName.match(regex);\n const isInBreakpoint = breakpoints.split(':').includes(breakpoint);\n if (isInBreakpoint) {\n responsiveName = optionName.replace(/^option/, '');\n }\n }\n }\n\n return responsiveName;\n}\n\n/**\n * Class options to manage options as data attributes on an HTML element.\n */\nexport class ResponsiveOptionsManager extends OptionsManager {\n /**\n * Get an option value.\n *\n * @param {string} name The option name.\n * @param {ResponsiveOptionObject} config The option configuration.\n * @returns {any}\n */\n get(name: string, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n return super.get(name, config);\n }\n\n return super.get(__getResponsiveName(this, name), config);\n }\n\n /**\n * Set an option value.\n *\n * @param {string} name The option name.\n * @param {any} value The new value.\n * @param {ResponsiveOptionObject} config The option configuration.\n */\n set(name: string, value: unknown, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n super.set(name, value, config);\n return;\n }\n\n if (isDev) {\n console.warn(`[${this.__config.name}]`, 'Responsive options are read-only.');\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAkD;AAElD,sBAA0B;AAC1B,mBAAsB;AAWtB,SAAS,oBAAoB,MAAgC,MAAc;AACzE,QAAM,EAAE,WAAW,QAAI,2BAAU,EAAE,MAAM;AAEzC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB;AACrB,QAAM,mBAAe,yCAAkB,IAAI;AAC3C,QAAM,QAAQ,IAAI,OAAO,GAAG,YAAY,QAAQ;AAEhD,aAAW,cAAc,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG;AAC5D,QAAI,MAAM,KAAK,UAAU,GAAG;AAC1B,YAAM,CAAC,EAAE,WAAW,IAAI,WAAW,MAAM,KAAK;AAC9C,YAAM,iBAAiB,YAAY,MAAM,GAAG,EAAE,SAAS,UAAU;AACjE,UAAI,gBAAgB;AAClB,yBAAiB,WAAW,QAAQ,WAAW,EAAE;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,IAAM,2BAAN,cAAuC,qCAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3D,IAAI,MAAc,QAAgC;AAChD,QAAI,CAAC,OAAO,YAAY;AACtB,aAAO,MAAM,IAAI,MAAM,MAAM;AAAA,IAC/B;AAEA,WAAO,MAAM,IAAI,oBAAoB,MAAM,IAAI,GAAG,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,MAAc,OAAgB,QAAgC;AAChE,QAAI,CAAC,OAAO,YAAY;AACtB,YAAM,IAAI,MAAM,OAAO,MAAM;AAC7B;AAAA,IACF;AAEA,QAAI,oBAAO;AACT,cAAQ,KAAK,IAAI,KAAK,SAAS,IAAI,KAAK,mCAAmC;AAAA,IAC7E;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -9,22 +9,38 @@ function __getResponsiveName(that, name) {
9
9
  let responsiveName = name;
10
10
  const propertyName = __getPropertyName(name);
11
11
  const regex = new RegExp(`${propertyName}:(.+)$`);
12
- Object.keys(that.__element.dataset).filter((optionName) => regex.test(optionName)).forEach((optionName) => {
13
- const [, breakpoints] = optionName.match(regex);
14
- const isInBreakpoint = breakpoints.split(":").includes(breakpoint);
15
- if (isInBreakpoint) {
16
- responsiveName = optionName.replace(/^option/, "");
12
+ for (const optionName of Object.keys(that.__element.dataset)) {
13
+ if (regex.test(optionName)) {
14
+ const [, breakpoints] = optionName.match(regex);
15
+ const isInBreakpoint = breakpoints.split(":").includes(breakpoint);
16
+ if (isInBreakpoint) {
17
+ responsiveName = optionName.replace(/^option/, "");
18
+ }
17
19
  }
18
- });
20
+ }
19
21
  return responsiveName;
20
22
  }
21
23
  class ResponsiveOptionsManager extends OptionsManager {
24
+ /**
25
+ * Get an option value.
26
+ *
27
+ * @param {string} name The option name.
28
+ * @param {ResponsiveOptionObject} config The option configuration.
29
+ * @returns {any}
30
+ */
22
31
  get(name, config) {
23
32
  if (!config.responsive) {
24
33
  return super.get(name, config);
25
34
  }
26
35
  return super.get(__getResponsiveName(this, name), config);
27
36
  }
37
+ /**
38
+ * Set an option value.
39
+ *
40
+ * @param {string} name The option name.
41
+ * @param {any} value The new value.
42
+ * @param {ResponsiveOptionObject} config The option configuration.
43
+ */
28
44
  set(name, value, config) {
29
45
  if (!config.responsive) {
30
46
  super.set(name, value, config);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/ResponsiveOptionsManager.ts"],
4
- "sourcesContent": ["import { OptionsManager, __getPropertyName } from './OptionsManager.js';\nimport type { OptionObject } from './OptionsManager.js';\nimport { useResize } from '../../services/index.js';\nimport { isDev } from '../../utils/index.js';\n\nexport type ResponsiveOptionObject = OptionObject & { responsive?: boolean };\n\n/**\n * Get the currently active responsive name of an option.\n *\n * @param {ResponsiveOptionsManager} that\n * @param {string} name The default name of the option.\n * @returns {string} The responsive name if one matches the current breakpoint, the default name otherwise.\n */\nfunction __getResponsiveName(that: ResponsiveOptionsManager, name: string) {\n const { breakpoint } = useResize().props();\n\n if (!breakpoint) {\n return name;\n }\n\n let responsiveName = name;\n const propertyName = __getPropertyName(name);\n const regex = new RegExp(`${propertyName}:(.+)$`);\n\n Object.keys(that.__element.dataset)\n .filter((optionName) => regex.test(optionName))\n .forEach((optionName) => {\n const [, breakpoints] = optionName.match(regex);\n const isInBreakpoint = breakpoints.split(':').includes(breakpoint);\n if (isInBreakpoint) {\n responsiveName = optionName.replace(/^option/, '');\n }\n });\n\n return responsiveName;\n}\n\n/**\n * Class options to manage options as data attributes on an HTML element.\n */\nexport class ResponsiveOptionsManager extends OptionsManager {\n /**\n * Get an option value.\n *\n * @param {string} name The option name.\n * @param {ResponsiveOptionObject} config The option configuration.\n * @returns {any}\n */\n get(name: string, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n return super.get(name, config);\n }\n\n return super.get(__getResponsiveName(this, name), config);\n }\n\n /**\n * Set an option value.\n *\n * @param {string} name The option name.\n * @param {any} value The new value.\n * @param {ResponsiveOptionObject} config The option configuration.\n */\n set(name: string, value: unknown, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n super.set(name, value, config);\n return;\n }\n\n if (isDev) {\n console.warn(`[${this.__config.name}]`, 'Responsive options are read-only.');\n }\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,gBAAgB,yBAAyB;AAElD,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAWtB,SAAS,oBAAoB,MAAgC,MAAc;AACzE,QAAM,EAAE,WAAW,IAAI,UAAU,EAAE,MAAM;AAEzC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB;AACrB,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,QAAQ,IAAI,OAAO,GAAG,oBAAoB;AAEhD,SAAO,KAAK,KAAK,UAAU,OAAO,EAC/B,OAAO,CAAC,eAAe,MAAM,KAAK,UAAU,CAAC,EAC7C,QAAQ,CAAC,eAAe;AACvB,UAAM,CAAC,EAAE,WAAW,IAAI,WAAW,MAAM,KAAK;AAC9C,UAAM,iBAAiB,YAAY,MAAM,GAAG,EAAE,SAAS,UAAU;AACjE,QAAI,gBAAgB;AAClB,uBAAiB,WAAW,QAAQ,WAAW,EAAE;AAAA,IACnD;AAAA,EACF,CAAC;AAEH,SAAO;AACT;AAKO,MAAM,iCAAiC,eAAe;AAAA,EAQ3D,IAAI,MAAc,QAAgC;AAChD,QAAI,CAAC,OAAO,YAAY;AACtB,aAAO,MAAM,IAAI,MAAM,MAAM;AAAA,IAC/B;AAEA,WAAO,MAAM,IAAI,oBAAoB,MAAM,IAAI,GAAG,MAAM;AAAA,EAC1D;AAAA,EASA,IAAI,MAAc,OAAgB,QAAgC;AAChE,QAAI,CAAC,OAAO,YAAY;AACtB,YAAM,IAAI,MAAM,OAAO,MAAM;AAC7B;AAAA,IACF;AAEA,QAAI,OAAO;AACT,cAAQ,KAAK,IAAI,KAAK,SAAS,SAAS,mCAAmC;AAAA,IAC7E;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { OptionsManager, __getPropertyName } from './OptionsManager.js';\nimport type { OptionObject } from './OptionsManager.js';\nimport { useResize } from '../../services/index.js';\nimport { isDev } from '../../utils/index.js';\n\nexport type ResponsiveOptionObject = OptionObject & { responsive?: boolean };\n\n/**\n * Get the currently active responsive name of an option.\n *\n * @param {ResponsiveOptionsManager} that\n * @param {string} name The default name of the option.\n * @returns {string} The responsive name if one matches the current breakpoint, the default name otherwise.\n */\nfunction __getResponsiveName(that: ResponsiveOptionsManager, name: string) {\n const { breakpoint } = useResize().props();\n\n if (!breakpoint) {\n return name;\n }\n\n let responsiveName = name;\n const propertyName = __getPropertyName(name);\n const regex = new RegExp(`${propertyName}:(.+)$`);\n\n for (const optionName of Object.keys(that.__element.dataset)) {\n if (regex.test(optionName)) {\n const [, breakpoints] = optionName.match(regex);\n const isInBreakpoint = breakpoints.split(':').includes(breakpoint);\n if (isInBreakpoint) {\n responsiveName = optionName.replace(/^option/, '');\n }\n }\n }\n\n return responsiveName;\n}\n\n/**\n * Class options to manage options as data attributes on an HTML element.\n */\nexport class ResponsiveOptionsManager extends OptionsManager {\n /**\n * Get an option value.\n *\n * @param {string} name The option name.\n * @param {ResponsiveOptionObject} config The option configuration.\n * @returns {any}\n */\n get(name: string, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n return super.get(name, config);\n }\n\n return super.get(__getResponsiveName(this, name), config);\n }\n\n /**\n * Set an option value.\n *\n * @param {string} name The option name.\n * @param {any} value The new value.\n * @param {ResponsiveOptionObject} config The option configuration.\n */\n set(name: string, value: unknown, config: ResponsiveOptionObject) {\n if (!config.responsive) {\n super.set(name, value, config);\n return;\n }\n\n if (isDev) {\n console.warn(`[${this.__config.name}]`, 'Responsive options are read-only.');\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,gBAAgB,yBAAyB;AAElD,SAAS,iBAAiB;AAC1B,SAAS,aAAa;AAWtB,SAAS,oBAAoB,MAAgC,MAAc;AACzE,QAAM,EAAE,WAAW,IAAI,UAAU,EAAE,MAAM;AAEzC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB;AACrB,QAAM,eAAe,kBAAkB,IAAI;AAC3C,QAAM,QAAQ,IAAI,OAAO,GAAG,YAAY,QAAQ;AAEhD,aAAW,cAAc,OAAO,KAAK,KAAK,UAAU,OAAO,GAAG;AAC5D,QAAI,MAAM,KAAK,UAAU,GAAG;AAC1B,YAAM,CAAC,EAAE,WAAW,IAAI,WAAW,MAAM,KAAK;AAC9C,YAAM,iBAAiB,YAAY,MAAM,GAAG,EAAE,SAAS,UAAU;AACjE,UAAI,gBAAgB;AAClB,yBAAiB,WAAW,QAAQ,WAAW,EAAE;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,MAAM,iCAAiC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3D,IAAI,MAAc,QAAgC;AAChD,QAAI,CAAC,OAAO,YAAY;AACtB,aAAO,MAAM,IAAI,MAAM,MAAM;AAAA,IAC/B;AAEA,WAAO,MAAM,IAAI,oBAAoB,MAAM,IAAI,GAAG,MAAM;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,MAAc,OAAgB,QAAgC;AAChE,QAAI,CAAC,OAAO,YAAY;AACtB,YAAM,IAAI,MAAM,OAAO,MAAM;AAC7B;AAAA,IACF;AAEA,QAAI,OAAO;AACT,cAAQ,KAAK,IAAI,KAAK,SAAS,IAAI,KAAK,mCAAmC;AAAA,IAC7E;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -35,42 +35,75 @@ var SERVICES_MAP = {
35
35
  };
36
36
  var SERVICE_NAMES = Object.keys(SERVICES_MAP);
37
37
  var ServicesManager = class extends import_AbstractManager.AbstractManager {
38
+ /**
39
+ * Holder for custom services.
40
+ */
38
41
  __customServices = {};
42
+ /**
43
+ * Get registered services.
44
+ */
39
45
  get __services() {
40
46
  return {
41
47
  ...this.__customServices,
42
48
  ...SERVICES_MAP
43
49
  };
44
50
  }
51
+ /**
52
+ * Test if the given service is registered.
53
+ */
45
54
  has(service) {
46
- if (!(((0, import_utils.isFunction)(this.__base[service]) || this.__base.__hasEvent(service)) && this.__services[service])) {
55
+ if (!(((0, import_utils.isFunction)(this.__base[service]) || // @ts-ignore
56
+ this.__base.__hasEvent(service)) && this.__services[service])) {
47
57
  return false;
48
58
  }
49
59
  const { has } = this.__services[service]();
50
60
  return has(this.__base.$id);
51
61
  }
62
+ /**
63
+ * Get a service props by name.
64
+ */
52
65
  get(service) {
53
66
  return this.__services[service]().props();
54
67
  }
68
+ /**
69
+ * Init the given service and bind it to the given instance.
70
+ *
71
+ * @param {ServiceNames} service The name of the service.
72
+ * @returns {() => void} A function to unbind the service.
73
+ */
55
74
  enable(service) {
56
75
  if (this.has(service)) {
57
76
  return this.disable.bind(this, service);
58
77
  }
59
- if (!((0, import_utils.isFunction)(this.__base[service]) || this.__base.__hasEvent(service)) || !this.__services[service]) {
78
+ if (
79
+ // @ts-ignore
80
+ !((0, import_utils.isFunction)(this.__base[service]) || this.__base.__hasEvent(service)) || !this.__services[service]
81
+ ) {
60
82
  return import_utils.noop;
61
83
  }
62
84
  const serviceInstance = this.__services[service]();
63
85
  serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args));
64
86
  return this.disable.bind(this, service);
65
87
  }
88
+ /**
89
+ * Enable all services and return methods to disable them.
90
+ */
66
91
  enableAll() {
67
92
  return Object.keys(this.__services).map((serviceName) => this.enable(serviceName));
68
93
  }
94
+ /**
95
+ * Disable all services.
96
+ *
97
+ * @returns {void}
98
+ */
69
99
  disableAll() {
70
- Object.keys(this.__services).forEach((serviceName) => {
100
+ for (const serviceName of Object.keys(this.__services)) {
71
101
  this.disable(serviceName);
72
- });
102
+ }
73
103
  }
104
+ /**
105
+ * Disable a service.
106
+ */
74
107
  disable(service) {
75
108
  if (!this.__services[service]) {
76
109
  return;
@@ -78,6 +111,9 @@ var ServicesManager = class extends import_AbstractManager.AbstractManager {
78
111
  const { remove } = this.__services[service]();
79
112
  remove(this.__base.$id);
80
113
  }
114
+ /**
115
+ * Toggle a service.
116
+ */
81
117
  toggle(service, force) {
82
118
  if ((0, import_utils.isDefined)(force)) {
83
119
  if (force && !this.has(service)) {
@@ -92,10 +128,24 @@ var ServicesManager = class extends import_AbstractManager.AbstractManager {
92
128
  this.enable(service);
93
129
  }
94
130
  }
131
+ /**
132
+ * Register a new service to be enabled/disabled.
133
+ *
134
+ * @param {string} name
135
+ * The name of the service hook.
136
+ * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction
137
+ * The `use...` function for the service.
138
+ */
95
139
  register(name, useFunction) {
96
140
  this.__customServices[name] = useFunction;
97
141
  this.__base.__addEmits(name);
98
142
  }
143
+ /**
144
+ * Unregister a new service to be enabled disabled.
145
+ *
146
+ * @param {string} name
147
+ * The name of the service hook.
148
+ */
99
149
  unregister(name) {
100
150
  if (SERVICE_NAMES.includes(name)) {
101
151
  if (import_utils.isDev) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/ServicesManager.ts"],
4
- "sourcesContent": ["import { usePointer, useRaf, useResize, useScroll, useKey, useLoad } from '../../services/index.js';\nimport type {\n PointerServiceInterface,\n RafServiceInterface,\n ResizeServiceInterface,\n ScrollServiceInterface,\n KeyServiceInterface,\n LoadServiceInterface,\n ServiceInterface,\n} from '../../services/index.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { noop, isFunction, isDefined, isDev } from '../../utils/index.js';\n\nconst SERVICES_MAP = {\n scrolled: useScroll,\n resized: useResize,\n ticked: useRaf,\n moved: usePointer,\n keyed: useKey,\n loaded: useLoad,\n};\n\nconst SERVICE_NAMES = Object.keys(SERVICES_MAP);\n\ntype Services = {\n scrolled: ScrollServiceInterface;\n resized: ResizeServiceInterface;\n ticked: RafServiceInterface;\n moved: PointerServiceInterface;\n keyed: KeyServiceInterface;\n loaded: LoadServiceInterface;\n} & Record<string, ServiceInterface<unknown>>;\n\ntype ServiceNames = keyof Services;\n\n/**\n * Services management for the Base class.\n *\n * @todo Add support for disabled services on mount when the method is defined.\n */\nexport class ServicesManager extends AbstractManager {\n /**\n * Holder for custom services.\n */\n __customServices: Record<string, <T>() => ServiceInterface<T>> = {};\n\n /**\n * Get registered services.\n */\n get __services() {\n return {\n ...this.__customServices,\n ...SERVICES_MAP,\n };\n }\n\n /**\n * Test if the given service is registered.\n */\n has(service: ServiceNames | string): boolean {\n if (\n !(\n (isFunction(this.__base[service]) ||\n // @ts-ignore\n this.__base.__hasEvent(service)) &&\n this.__services[service]\n )\n ) {\n return false;\n }\n\n const { has } = this.__services[service]();\n return has(this.__base.$id);\n }\n\n /**\n * Get a service props by name.\n */\n get<S extends ServiceNames | string>(service: S): ReturnType<Services[S]['props']> {\n // @ts-ignore\n return this.__services[service]().props();\n }\n\n /**\n * Init the given service and bind it to the given instance.\n *\n * @param {ServiceNames} service The name of the service.\n * @returns {() => void} A function to unbind the service.\n */\n enable(service: ServiceNames): () => void {\n if (this.has(service)) {\n return this.disable.bind(this, service);\n }\n\n if (\n // @ts-ignore\n !(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) ||\n !this.__services[service]\n ) {\n return noop;\n }\n const serviceInstance = this.__services[service]();\n\n serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args));\n\n return this.disable.bind(this, service);\n }\n\n /**\n * Enable all services and return methods to disable them.\n */\n enableAll() {\n return Object.keys(this.__services).map((serviceName) => this.enable(serviceName));\n }\n\n /**\n * Disable all services.\n *\n * @returns {void}\n */\n disableAll() {\n Object.keys(this.__services).forEach((serviceName) => {\n this.disable(serviceName);\n });\n }\n\n /**\n * Disable a service.\n */\n disable(service: ServiceNames) {\n if (!this.__services[service]) {\n return;\n }\n\n const { remove } = this.__services[service]();\n remove(this.__base.$id);\n }\n\n /**\n * Toggle a service.\n */\n toggle(service: ServiceNames, force?: boolean) {\n if (isDefined(force)) {\n if (force && !this.has(service)) {\n this.enable(service);\n }\n\n if (!force && this.has(service)) {\n this.disable(service);\n }\n } else if (this.has(service)) {\n this.disable(service);\n } else {\n this.enable(service);\n }\n }\n\n /**\n * Register a new service to be enabled/disabled.\n *\n * @param {string} name\n * The name of the service hook.\n * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction\n * The `use...` function for the service.\n */\n register(name: string, useFunction: <T>(...args: unknown[]) => ServiceInterface<T>) {\n this.__customServices[name] = useFunction;\n this.__base.__addEmits(name);\n }\n\n /**\n * Unregister a new service to be enabled disabled.\n *\n * @param {string} name\n * The name of the service hook.\n */\n unregister(name: string) {\n if (SERVICE_NAMES.includes(name)) {\n if (isDev) {\n throw new Error(`[ServicesManager] The \\`${name}\\` core service can not be unregistered.`);\n }\n return;\n }\n\n this.__base.__removeEmits(name);\n delete this.__customServices[name];\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA0E;AAU1E,6BAAgC;AAChC,mBAAmD;AAEnD,IAAM,eAAe;AAAA,EACnB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,IAAM,gBAAgB,OAAO,KAAK,YAAY;AAkBvC,IAAM,kBAAN,cAA8B,uCAAgB;AAAA,EAInD,mBAAiE,CAAC;AAAA,EAKlE,IAAI,aAAa;AACf,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAKA,IAAI,SAAyC;AAC3C,QACE,OACG,yBAAW,KAAK,OAAO,QAAQ,KAE9B,KAAK,OAAO,WAAW,OAAO,MAChC,KAAK,WAAW,WAElB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,IAAI,IAAI,KAAK,WAAW,SAAS;AACzC,WAAO,IAAI,KAAK,OAAO,GAAG;AAAA,EAC5B;AAAA,EAKA,IAAqC,SAA8C;AAEjF,WAAO,KAAK,WAAW,SAAS,EAAE,MAAM;AAAA,EAC1C;AAAA,EAQA,OAAO,SAAmC;AACxC,QAAI,KAAK,IAAI,OAAO,GAAG;AACrB,aAAO,KAAK,QAAQ,KAAK,MAAM,OAAO;AAAA,IACxC;AAEA,QAEE,MAAE,yBAAW,KAAK,OAAO,QAAQ,KAAK,KAAK,OAAO,WAAW,OAAO,MACpE,CAAC,KAAK,WAAW,UACjB;AACA,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,WAAW,SAAS;AAEjD,oBAAgB,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,KAAK,OAAO,aAAa,SAAS,GAAG,IAAI,CAAC;AAE5F,WAAO,KAAK,QAAQ,KAAK,MAAM,OAAO;AAAA,EACxC;AAAA,EAKA,YAAY;AACV,WAAO,OAAO,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,gBAAgB,KAAK,OAAO,WAAW,CAAC;AAAA,EACnF;AAAA,EAOA,aAAa;AACX,WAAO,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,gBAAgB;AACpD,WAAK,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAKA,QAAQ,SAAuB;AAC7B,QAAI,CAAC,KAAK,WAAW,UAAU;AAC7B;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI,KAAK,WAAW,SAAS;AAC5C,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAAA,EAKA,OAAO,SAAuB,OAAiB;AAC7C,YAAI,wBAAU,KAAK,GAAG;AACpB,UAAI,SAAS,CAAC,KAAK,IAAI,OAAO,GAAG;AAC/B,aAAK,OAAO,OAAO;AAAA,MACrB;AAEA,UAAI,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG;AAC/B,aAAK,QAAQ,OAAO;AAAA,MACtB;AAAA,IACF,WAAW,KAAK,IAAI,OAAO,GAAG;AAC5B,WAAK,QAAQ,OAAO;AAAA,IACtB,OAAO;AACL,WAAK,OAAO,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAUA,SAAS,MAAc,aAA6D;AAClF,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,OAAO,WAAW,IAAI;AAAA,EAC7B;AAAA,EAQA,WAAW,MAAc;AACvB,QAAI,cAAc,SAAS,IAAI,GAAG;AAChC,UAAI,oBAAO;AACT,cAAM,IAAI,MAAM,2BAA2B,8CAA8C;AAAA,MAC3F;AACA;AAAA,IACF;AAEA,SAAK,OAAO,cAAc,IAAI;AAC9B,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AACF;",
4
+ "sourcesContent": ["import { usePointer, useRaf, useResize, useScroll, useKey, useLoad } from '../../services/index.js';\nimport type {\n PointerServiceInterface,\n RafServiceInterface,\n ResizeServiceInterface,\n ScrollServiceInterface,\n KeyServiceInterface,\n LoadServiceInterface,\n ServiceInterface,\n} from '../../services/index.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { noop, isFunction, isDefined, isDev } from '../../utils/index.js';\n\nconst SERVICES_MAP = {\n scrolled: useScroll,\n resized: useResize,\n ticked: useRaf,\n moved: usePointer,\n keyed: useKey,\n loaded: useLoad,\n};\n\nconst SERVICE_NAMES = Object.keys(SERVICES_MAP);\n\ntype Services = {\n scrolled: ScrollServiceInterface;\n resized: ResizeServiceInterface;\n ticked: RafServiceInterface;\n moved: PointerServiceInterface;\n keyed: KeyServiceInterface;\n loaded: LoadServiceInterface;\n} & Record<string, ServiceInterface<unknown>>;\n\ntype ServiceNames = keyof Services;\n\n/**\n * Services management for the Base class.\n *\n * @todo Add support for disabled services on mount when the method is defined.\n */\nexport class ServicesManager extends AbstractManager {\n /**\n * Holder for custom services.\n */\n __customServices: Record<string, <T>() => ServiceInterface<T>> = {};\n\n /**\n * Get registered services.\n */\n get __services() {\n return {\n ...this.__customServices,\n ...SERVICES_MAP,\n };\n }\n\n /**\n * Test if the given service is registered.\n */\n has(service: ServiceNames | string): boolean {\n if (\n !(\n (isFunction(this.__base[service]) ||\n // @ts-ignore\n this.__base.__hasEvent(service)) &&\n this.__services[service]\n )\n ) {\n return false;\n }\n\n const { has } = this.__services[service]();\n return has(this.__base.$id);\n }\n\n /**\n * Get a service props by name.\n */\n get<S extends ServiceNames | string>(service: S): ReturnType<Services[S]['props']> {\n // @ts-ignore\n return this.__services[service]().props();\n }\n\n /**\n * Init the given service and bind it to the given instance.\n *\n * @param {ServiceNames} service The name of the service.\n * @returns {() => void} A function to unbind the service.\n */\n enable(service: ServiceNames): () => void {\n if (this.has(service)) {\n return this.disable.bind(this, service);\n }\n\n if (\n // @ts-ignore\n !(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) ||\n !this.__services[service]\n ) {\n return noop;\n }\n const serviceInstance = this.__services[service]();\n\n serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args));\n\n return this.disable.bind(this, service);\n }\n\n /**\n * Enable all services and return methods to disable them.\n */\n enableAll() {\n return Object.keys(this.__services).map((serviceName) => this.enable(serviceName));\n }\n\n /**\n * Disable all services.\n *\n * @returns {void}\n */\n disableAll() {\n for (const serviceName of Object.keys(this.__services)) {\n this.disable(serviceName);\n }\n }\n\n /**\n * Disable a service.\n */\n disable(service: ServiceNames) {\n if (!this.__services[service]) {\n return;\n }\n\n const { remove } = this.__services[service]();\n remove(this.__base.$id);\n }\n\n /**\n * Toggle a service.\n */\n toggle(service: ServiceNames, force?: boolean) {\n if (isDefined(force)) {\n if (force && !this.has(service)) {\n this.enable(service);\n }\n\n if (!force && this.has(service)) {\n this.disable(service);\n }\n } else if (this.has(service)) {\n this.disable(service);\n } else {\n this.enable(service);\n }\n }\n\n /**\n * Register a new service to be enabled/disabled.\n *\n * @param {string} name\n * The name of the service hook.\n * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction\n * The `use...` function for the service.\n */\n register(name: string, useFunction: <T>(...args: unknown[]) => ServiceInterface<T>) {\n this.__customServices[name] = useFunction;\n this.__base.__addEmits(name);\n }\n\n /**\n * Unregister a new service to be enabled disabled.\n *\n * @param {string} name\n * The name of the service hook.\n */\n unregister(name: string) {\n if (SERVICE_NAMES.includes(name)) {\n if (isDev) {\n throw new Error(`[ServicesManager] The \\`${name}\\` core service can not be unregistered.`);\n }\n return;\n }\n\n this.__base.__removeEmits(name);\n delete this.__customServices[name];\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -11,42 +11,75 @@ const SERVICES_MAP = {
11
11
  };
12
12
  const SERVICE_NAMES = Object.keys(SERVICES_MAP);
13
13
  class ServicesManager extends AbstractManager {
14
+ /**
15
+ * Holder for custom services.
16
+ */
14
17
  __customServices = {};
18
+ /**
19
+ * Get registered services.
20
+ */
15
21
  get __services() {
16
22
  return {
17
23
  ...this.__customServices,
18
24
  ...SERVICES_MAP
19
25
  };
20
26
  }
27
+ /**
28
+ * Test if the given service is registered.
29
+ */
21
30
  has(service) {
22
- if (!((isFunction(this.__base[service]) || this.__base.__hasEvent(service)) && this.__services[service])) {
31
+ if (!((isFunction(this.__base[service]) || // @ts-ignore
32
+ this.__base.__hasEvent(service)) && this.__services[service])) {
23
33
  return false;
24
34
  }
25
35
  const { has } = this.__services[service]();
26
36
  return has(this.__base.$id);
27
37
  }
38
+ /**
39
+ * Get a service props by name.
40
+ */
28
41
  get(service) {
29
42
  return this.__services[service]().props();
30
43
  }
44
+ /**
45
+ * Init the given service and bind it to the given instance.
46
+ *
47
+ * @param {ServiceNames} service The name of the service.
48
+ * @returns {() => void} A function to unbind the service.
49
+ */
31
50
  enable(service) {
32
51
  if (this.has(service)) {
33
52
  return this.disable.bind(this, service);
34
53
  }
35
- if (!(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) || !this.__services[service]) {
54
+ if (
55
+ // @ts-ignore
56
+ !(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) || !this.__services[service]
57
+ ) {
36
58
  return noop;
37
59
  }
38
60
  const serviceInstance = this.__services[service]();
39
61
  serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args));
40
62
  return this.disable.bind(this, service);
41
63
  }
64
+ /**
65
+ * Enable all services and return methods to disable them.
66
+ */
42
67
  enableAll() {
43
68
  return Object.keys(this.__services).map((serviceName) => this.enable(serviceName));
44
69
  }
70
+ /**
71
+ * Disable all services.
72
+ *
73
+ * @returns {void}
74
+ */
45
75
  disableAll() {
46
- Object.keys(this.__services).forEach((serviceName) => {
76
+ for (const serviceName of Object.keys(this.__services)) {
47
77
  this.disable(serviceName);
48
- });
78
+ }
49
79
  }
80
+ /**
81
+ * Disable a service.
82
+ */
50
83
  disable(service) {
51
84
  if (!this.__services[service]) {
52
85
  return;
@@ -54,6 +87,9 @@ class ServicesManager extends AbstractManager {
54
87
  const { remove } = this.__services[service]();
55
88
  remove(this.__base.$id);
56
89
  }
90
+ /**
91
+ * Toggle a service.
92
+ */
57
93
  toggle(service, force) {
58
94
  if (isDefined(force)) {
59
95
  if (force && !this.has(service)) {
@@ -68,10 +104,24 @@ class ServicesManager extends AbstractManager {
68
104
  this.enable(service);
69
105
  }
70
106
  }
107
+ /**
108
+ * Register a new service to be enabled/disabled.
109
+ *
110
+ * @param {string} name
111
+ * The name of the service hook.
112
+ * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction
113
+ * The `use...` function for the service.
114
+ */
71
115
  register(name, useFunction) {
72
116
  this.__customServices[name] = useFunction;
73
117
  this.__base.__addEmits(name);
74
118
  }
119
+ /**
120
+ * Unregister a new service to be enabled disabled.
121
+ *
122
+ * @param {string} name
123
+ * The name of the service hook.
124
+ */
75
125
  unregister(name) {
76
126
  if (SERVICE_NAMES.includes(name)) {
77
127
  if (isDev) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/js-toolkit/Base/managers/ServicesManager.ts"],
4
- "sourcesContent": ["import { usePointer, useRaf, useResize, useScroll, useKey, useLoad } from '../../services/index.js';\nimport type {\n PointerServiceInterface,\n RafServiceInterface,\n ResizeServiceInterface,\n ScrollServiceInterface,\n KeyServiceInterface,\n LoadServiceInterface,\n ServiceInterface,\n} from '../../services/index.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { noop, isFunction, isDefined, isDev } from '../../utils/index.js';\n\nconst SERVICES_MAP = {\n scrolled: useScroll,\n resized: useResize,\n ticked: useRaf,\n moved: usePointer,\n keyed: useKey,\n loaded: useLoad,\n};\n\nconst SERVICE_NAMES = Object.keys(SERVICES_MAP);\n\ntype Services = {\n scrolled: ScrollServiceInterface;\n resized: ResizeServiceInterface;\n ticked: RafServiceInterface;\n moved: PointerServiceInterface;\n keyed: KeyServiceInterface;\n loaded: LoadServiceInterface;\n} & Record<string, ServiceInterface<unknown>>;\n\ntype ServiceNames = keyof Services;\n\n/**\n * Services management for the Base class.\n *\n * @todo Add support for disabled services on mount when the method is defined.\n */\nexport class ServicesManager extends AbstractManager {\n /**\n * Holder for custom services.\n */\n __customServices: Record<string, <T>() => ServiceInterface<T>> = {};\n\n /**\n * Get registered services.\n */\n get __services() {\n return {\n ...this.__customServices,\n ...SERVICES_MAP,\n };\n }\n\n /**\n * Test if the given service is registered.\n */\n has(service: ServiceNames | string): boolean {\n if (\n !(\n (isFunction(this.__base[service]) ||\n // @ts-ignore\n this.__base.__hasEvent(service)) &&\n this.__services[service]\n )\n ) {\n return false;\n }\n\n const { has } = this.__services[service]();\n return has(this.__base.$id);\n }\n\n /**\n * Get a service props by name.\n */\n get<S extends ServiceNames | string>(service: S): ReturnType<Services[S]['props']> {\n // @ts-ignore\n return this.__services[service]().props();\n }\n\n /**\n * Init the given service and bind it to the given instance.\n *\n * @param {ServiceNames} service The name of the service.\n * @returns {() => void} A function to unbind the service.\n */\n enable(service: ServiceNames): () => void {\n if (this.has(service)) {\n return this.disable.bind(this, service);\n }\n\n if (\n // @ts-ignore\n !(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) ||\n !this.__services[service]\n ) {\n return noop;\n }\n const serviceInstance = this.__services[service]();\n\n serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args));\n\n return this.disable.bind(this, service);\n }\n\n /**\n * Enable all services and return methods to disable them.\n */\n enableAll() {\n return Object.keys(this.__services).map((serviceName) => this.enable(serviceName));\n }\n\n /**\n * Disable all services.\n *\n * @returns {void}\n */\n disableAll() {\n Object.keys(this.__services).forEach((serviceName) => {\n this.disable(serviceName);\n });\n }\n\n /**\n * Disable a service.\n */\n disable(service: ServiceNames) {\n if (!this.__services[service]) {\n return;\n }\n\n const { remove } = this.__services[service]();\n remove(this.__base.$id);\n }\n\n /**\n * Toggle a service.\n */\n toggle(service: ServiceNames, force?: boolean) {\n if (isDefined(force)) {\n if (force && !this.has(service)) {\n this.enable(service);\n }\n\n if (!force && this.has(service)) {\n this.disable(service);\n }\n } else if (this.has(service)) {\n this.disable(service);\n } else {\n this.enable(service);\n }\n }\n\n /**\n * Register a new service to be enabled/disabled.\n *\n * @param {string} name\n * The name of the service hook.\n * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction\n * The `use...` function for the service.\n */\n register(name: string, useFunction: <T>(...args: unknown[]) => ServiceInterface<T>) {\n this.__customServices[name] = useFunction;\n this.__base.__addEmits(name);\n }\n\n /**\n * Unregister a new service to be enabled disabled.\n *\n * @param {string} name\n * The name of the service hook.\n */\n unregister(name: string) {\n if (SERVICE_NAMES.includes(name)) {\n if (isDev) {\n throw new Error(`[ServicesManager] The \\`${name}\\` core service can not be unregistered.`);\n }\n return;\n }\n\n this.__base.__removeEmits(name);\n delete this.__customServices[name];\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY,QAAQ,WAAW,WAAW,QAAQ,eAAe;AAU1E,SAAS,uBAAuB;AAChC,SAAS,MAAM,YAAY,WAAW,aAAa;AAEnD,MAAM,eAAe;AAAA,EACnB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,MAAM,gBAAgB,OAAO,KAAK,YAAY;AAkBvC,MAAM,wBAAwB,gBAAgB;AAAA,EAInD,mBAAiE,CAAC;AAAA,EAKlE,IAAI,aAAa;AACf,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAKA,IAAI,SAAyC;AAC3C,QACE,GACG,WAAW,KAAK,OAAO,QAAQ,KAE9B,KAAK,OAAO,WAAW,OAAO,MAChC,KAAK,WAAW,WAElB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,IAAI,IAAI,KAAK,WAAW,SAAS;AACzC,WAAO,IAAI,KAAK,OAAO,GAAG;AAAA,EAC5B;AAAA,EAKA,IAAqC,SAA8C;AAEjF,WAAO,KAAK,WAAW,SAAS,EAAE,MAAM;AAAA,EAC1C;AAAA,EAQA,OAAO,SAAmC;AACxC,QAAI,KAAK,IAAI,OAAO,GAAG;AACrB,aAAO,KAAK,QAAQ,KAAK,MAAM,OAAO;AAAA,IACxC;AAEA,QAEE,EAAE,WAAW,KAAK,OAAO,QAAQ,KAAK,KAAK,OAAO,WAAW,OAAO,MACpE,CAAC,KAAK,WAAW,UACjB;AACA,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,WAAW,SAAS;AAEjD,oBAAgB,IAAI,KAAK,OAAO,KAAK,IAAI,SAAS,KAAK,OAAO,aAAa,SAAS,GAAG,IAAI,CAAC;AAE5F,WAAO,KAAK,QAAQ,KAAK,MAAM,OAAO;AAAA,EACxC;AAAA,EAKA,YAAY;AACV,WAAO,OAAO,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,gBAAgB,KAAK,OAAO,WAAW,CAAC;AAAA,EACnF;AAAA,EAOA,aAAa;AACX,WAAO,KAAK,KAAK,UAAU,EAAE,QAAQ,CAAC,gBAAgB;AACpD,WAAK,QAAQ,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAKA,QAAQ,SAAuB;AAC7B,QAAI,CAAC,KAAK,WAAW,UAAU;AAC7B;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI,KAAK,WAAW,SAAS;AAC5C,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAAA,EAKA,OAAO,SAAuB,OAAiB;AAC7C,QAAI,UAAU,KAAK,GAAG;AACpB,UAAI,SAAS,CAAC,KAAK,IAAI,OAAO,GAAG;AAC/B,aAAK,OAAO,OAAO;AAAA,MACrB;AAEA,UAAI,CAAC,SAAS,KAAK,IAAI,OAAO,GAAG;AAC/B,aAAK,QAAQ,OAAO;AAAA,MACtB;AAAA,IACF,WAAW,KAAK,IAAI,OAAO,GAAG;AAC5B,WAAK,QAAQ,OAAO;AAAA,IACtB,OAAO;AACL,WAAK,OAAO,OAAO;AAAA,IACrB;AAAA,EACF;AAAA,EAUA,SAAS,MAAc,aAA6D;AAClF,SAAK,iBAAiB,QAAQ;AAC9B,SAAK,OAAO,WAAW,IAAI;AAAA,EAC7B;AAAA,EAQA,WAAW,MAAc;AACvB,QAAI,cAAc,SAAS,IAAI,GAAG;AAChC,UAAI,OAAO;AACT,cAAM,IAAI,MAAM,2BAA2B,8CAA8C;AAAA,MAC3F;AACA;AAAA,IACF;AAEA,SAAK,OAAO,cAAc,IAAI;AAC9B,WAAO,KAAK,iBAAiB;AAAA,EAC/B;AACF;",
4
+ "sourcesContent": ["import { usePointer, useRaf, useResize, useScroll, useKey, useLoad } from '../../services/index.js';\nimport type {\n PointerServiceInterface,\n RafServiceInterface,\n ResizeServiceInterface,\n ScrollServiceInterface,\n KeyServiceInterface,\n LoadServiceInterface,\n ServiceInterface,\n} from '../../services/index.js';\nimport { AbstractManager } from './AbstractManager.js';\nimport { noop, isFunction, isDefined, isDev } from '../../utils/index.js';\n\nconst SERVICES_MAP = {\n scrolled: useScroll,\n resized: useResize,\n ticked: useRaf,\n moved: usePointer,\n keyed: useKey,\n loaded: useLoad,\n};\n\nconst SERVICE_NAMES = Object.keys(SERVICES_MAP);\n\ntype Services = {\n scrolled: ScrollServiceInterface;\n resized: ResizeServiceInterface;\n ticked: RafServiceInterface;\n moved: PointerServiceInterface;\n keyed: KeyServiceInterface;\n loaded: LoadServiceInterface;\n} & Record<string, ServiceInterface<unknown>>;\n\ntype ServiceNames = keyof Services;\n\n/**\n * Services management for the Base class.\n *\n * @todo Add support for disabled services on mount when the method is defined.\n */\nexport class ServicesManager extends AbstractManager {\n /**\n * Holder for custom services.\n */\n __customServices: Record<string, <T>() => ServiceInterface<T>> = {};\n\n /**\n * Get registered services.\n */\n get __services() {\n return {\n ...this.__customServices,\n ...SERVICES_MAP,\n };\n }\n\n /**\n * Test if the given service is registered.\n */\n has(service: ServiceNames | string): boolean {\n if (\n !(\n (isFunction(this.__base[service]) ||\n // @ts-ignore\n this.__base.__hasEvent(service)) &&\n this.__services[service]\n )\n ) {\n return false;\n }\n\n const { has } = this.__services[service]();\n return has(this.__base.$id);\n }\n\n /**\n * Get a service props by name.\n */\n get<S extends ServiceNames | string>(service: S): ReturnType<Services[S]['props']> {\n // @ts-ignore\n return this.__services[service]().props();\n }\n\n /**\n * Init the given service and bind it to the given instance.\n *\n * @param {ServiceNames} service The name of the service.\n * @returns {() => void} A function to unbind the service.\n */\n enable(service: ServiceNames): () => void {\n if (this.has(service)) {\n return this.disable.bind(this, service);\n }\n\n if (\n // @ts-ignore\n !(isFunction(this.__base[service]) || this.__base.__hasEvent(service)) ||\n !this.__services[service]\n ) {\n return noop;\n }\n const serviceInstance = this.__services[service]();\n\n serviceInstance.add(this.__base.$id, (...args) => this.__base.__callMethod(service, ...args));\n\n return this.disable.bind(this, service);\n }\n\n /**\n * Enable all services and return methods to disable them.\n */\n enableAll() {\n return Object.keys(this.__services).map((serviceName) => this.enable(serviceName));\n }\n\n /**\n * Disable all services.\n *\n * @returns {void}\n */\n disableAll() {\n for (const serviceName of Object.keys(this.__services)) {\n this.disable(serviceName);\n }\n }\n\n /**\n * Disable a service.\n */\n disable(service: ServiceNames) {\n if (!this.__services[service]) {\n return;\n }\n\n const { remove } = this.__services[service]();\n remove(this.__base.$id);\n }\n\n /**\n * Toggle a service.\n */\n toggle(service: ServiceNames, force?: boolean) {\n if (isDefined(force)) {\n if (force && !this.has(service)) {\n this.enable(service);\n }\n\n if (!force && this.has(service)) {\n this.disable(service);\n }\n } else if (this.has(service)) {\n this.disable(service);\n } else {\n this.enable(service);\n }\n }\n\n /**\n * Register a new service to be enabled/disabled.\n *\n * @param {string} name\n * The name of the service hook.\n * @param {<T>(...args:unknown[]) => ServiceInterface<T>} useFunction\n * The `use...` function for the service.\n */\n register(name: string, useFunction: <T>(...args: unknown[]) => ServiceInterface<T>) {\n this.__customServices[name] = useFunction;\n this.__base.__addEmits(name);\n }\n\n /**\n * Unregister a new service to be enabled disabled.\n *\n * @param {string} name\n * The name of the service hook.\n */\n unregister(name: string) {\n if (SERVICE_NAMES.includes(name)) {\n if (isDev) {\n throw new Error(`[ServicesManager] The \\`${name}\\` core service can not be unregistered.`);\n }\n return;\n }\n\n this.__base.__removeEmits(name);\n delete this.__customServices[name];\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/Base/utils.cjs CHANGED
@@ -44,9 +44,13 @@ var separator = " ";
44
44
  function getSelector(nameOrSelector) {
45
45
  if (!selectors.has(nameOrSelector)) {
46
46
  const parts = [
47
+ // Single selector
47
48
  `[data-component="${nameOrSelector}"]`,
49
+ // Selector in the middle of a list of selectors
48
50
  `[data-component*="${separator}${nameOrSelector}${separator}"]`,
51
+ // Selector at the end of a list of selectors
49
52
  `[data-component$="${separator}${nameOrSelector}"]`,
53
+ // Selector at the beginning of a list of selectors
50
54
  `[data-component^="${nameOrSelector}${separator}"]`
51
55
  ];
52
56
  selectors.set(nameOrSelector, parts.join(","));
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/Base/utils.ts"],
4
4
  "sourcesContent": ["import { isArray, isDefined, isDev, SmartQueue } from '../utils/index.js';\nimport type { Base, BaseConfig } from './index.js';\nimport { features } from './features.js';\n\nlet queue: SmartQueue;\n\n/**\n * Add a task to the main queue.\n */\nexport function addToQueue(fn: () => unknown): void {\n if (!features.get('asyncChildren')) {\n fn();\n return;\n }\n\n if (!queue) {\n queue = new SmartQueue();\n }\n\n queue.add(fn);\n}\n\nconst selectors = new Map();\n\n// Separator used for multi-component declaration in `data-component` attributeS.\nconst separator = ' ';\n\n/**\n * Get the selector for a given component.\n */\nfunction getSelector(nameOrSelector: string): string {\n if (!selectors.has(nameOrSelector)) {\n const parts = [\n // Single selector\n `[data-component=\"${nameOrSelector}\"]`,\n // Selector in the middle of a list of selectors\n `[data-component*=\"${separator}${nameOrSelector}${separator}\"]`,\n // Selector at the end of a list of selectors\n `[data-component$=\"${separator}${nameOrSelector}\"]`,\n // Selector at the beginning of a list of selectors\n `[data-component^=\"${nameOrSelector}${separator}\"]`,\n ];\n selectors.set(nameOrSelector, parts.join(','));\n }\n\n return selectors.get(nameOrSelector);\n}\n\n/**\n * Get a list of elements based on the name of a component.\n *\n * @param {string} nameOrSelector\n * The name or selector to used for this component.\n * @param {HTMLElement|Document} element\n * The root element on which to query the selector, defaults to `document`.\n * @returns {Array<HTMLElement>}\n * A list of elements on which the component should be mounted.\n */\nexport function getComponentElements(\n nameOrSelector: string,\n element: HTMLElement | Document = document,\n): HTMLElement[] {\n const selector = getSelector(nameOrSelector);\n let elements = [];\n\n try {\n elements = Array.from(element.querySelectorAll(selector));\n // eslint-disable-next-line no-empty\n } catch {}\n\n // If no child component found with the default selector, try a classic DOM selector\n if (elements.length === 0) {\n elements = Array.from(element.querySelectorAll(nameOrSelector));\n }\n\n return elements;\n}\n\n/**\n * Test if an event is defined in the given config.\n */\nexport function eventIsDefinedInConfig(event: string, config: BaseConfig): boolean {\n return isArray(config.emits) && config.emits.includes(event);\n}\n\n/**\n * Test if an event can be used on the given element.\n */\nexport function eventIsNative(event: string, element: HTMLElement): boolean {\n return isDefined(element[`on${event}`]);\n}\n\n/**\n * Get the target of a given event.\n *\n * @todo Return false in v3 if event is not defined or not native to prevent adding a listener.\n */\nexport function getEventTarget(\n instance: Base,\n event: string,\n config: BaseConfig,\n): Base | Base['$el'] {\n if (eventIsDefinedInConfig(event, config)) {\n return instance;\n }\n\n if (eventIsNative(event, instance.$el)) {\n return instance.$el;\n }\n\n if (isDev) {\n console.warn(\n `[${config.name}]`,\n `The \"${event}\" event is missing from the configuration and is not a native`,\n `event for the root element of type \\`${instance.$el.constructor.name}\\`.`,\n );\n }\n\n // @todo v3 return false or null\n return instance;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsD;AAEtD,sBAAyB;AAEzB,IAAI;AAKG,SAAS,WAAW,IAAyB;AAClD,MAAI,CAAC,yBAAS,IAAI,eAAe,GAAG;AAClC,OAAG;AACH;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,wBAAW;AAAA,EACzB;AAEA,QAAM,IAAI,EAAE;AACd;AAEA,IAAM,YAAY,oBAAI,IAAI;AAG1B,IAAM,YAAY;AAKlB,SAAS,YAAY,gBAAgC;AACnD,MAAI,CAAC,UAAU,IAAI,cAAc,GAAG;AAClC,UAAM,QAAQ;AAAA,MAEZ,oBAAoB;AAAA,MAEpB,qBAAqB,YAAY,iBAAiB;AAAA,MAElD,qBAAqB,YAAY;AAAA,MAEjC,qBAAqB,iBAAiB;AAAA,IACxC;AACA,cAAU,IAAI,gBAAgB,MAAM,KAAK,GAAG,CAAC;AAAA,EAC/C;AAEA,SAAO,UAAU,IAAI,cAAc;AACrC;AAYO,SAAS,qBACd,gBACA,UAAkC,UACnB;AACf,QAAM,WAAW,YAAY,cAAc;AAC3C,MAAI,WAAW,CAAC;AAEhB,MAAI;AACF,eAAW,MAAM,KAAK,QAAQ,iBAAiB,QAAQ,CAAC;AAAA,EAE1D,QAAE;AAAA,EAAO;AAGT,MAAI,SAAS,WAAW,GAAG;AACzB,eAAW,MAAM,KAAK,QAAQ,iBAAiB,cAAc,CAAC;AAAA,EAChE;AAEA,SAAO;AACT;AAKO,SAAS,uBAAuB,OAAe,QAA6B;AACjF,aAAO,sBAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,KAAK;AAC7D;AAKO,SAAS,cAAc,OAAe,SAA+B;AAC1E,aAAO,wBAAU,QAAQ,KAAK,QAAQ;AACxC;AAOO,SAAS,eACd,UACA,OACA,QACoB;AACpB,MAAI,uBAAuB,OAAO,MAAM,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,OAAO,SAAS,GAAG,GAAG;AACtC,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,oBAAO;AACT,YAAQ;AAAA,MACN,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,wCAAwC,SAAS,IAAI,YAAY;AAAA,IACnE;AAAA,EACF;AAGA,SAAO;AACT;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAsD;AAEtD,sBAAyB;AAEzB,IAAI;AAKG,SAAS,WAAW,IAAyB;AAClD,MAAI,CAAC,yBAAS,IAAI,eAAe,GAAG;AAClC,OAAG;AACH;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,wBAAW;AAAA,EACzB;AAEA,QAAM,IAAI,EAAE;AACd;AAEA,IAAM,YAAY,oBAAI,IAAI;AAG1B,IAAM,YAAY;AAKlB,SAAS,YAAY,gBAAgC;AACnD,MAAI,CAAC,UAAU,IAAI,cAAc,GAAG;AAClC,UAAM,QAAQ;AAAA;AAAA,MAEZ,oBAAoB,cAAc;AAAA;AAAA,MAElC,qBAAqB,SAAS,GAAG,cAAc,GAAG,SAAS;AAAA;AAAA,MAE3D,qBAAqB,SAAS,GAAG,cAAc;AAAA;AAAA,MAE/C,qBAAqB,cAAc,GAAG,SAAS;AAAA,IACjD;AACA,cAAU,IAAI,gBAAgB,MAAM,KAAK,GAAG,CAAC;AAAA,EAC/C;AAEA,SAAO,UAAU,IAAI,cAAc;AACrC;AAYO,SAAS,qBACd,gBACA,UAAkC,UACnB;AACf,QAAM,WAAW,YAAY,cAAc;AAC3C,MAAI,WAAW,CAAC;AAEhB,MAAI;AACF,eAAW,MAAM,KAAK,QAAQ,iBAAiB,QAAQ,CAAC;AAAA,EAE1D,QAAQ;AAAA,EAAC;AAGT,MAAI,SAAS,WAAW,GAAG;AACzB,eAAW,MAAM,KAAK,QAAQ,iBAAiB,cAAc,CAAC;AAAA,EAChE;AAEA,SAAO;AACT;AAKO,SAAS,uBAAuB,OAAe,QAA6B;AACjF,aAAO,sBAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,KAAK;AAC7D;AAKO,SAAS,cAAc,OAAe,SAA+B;AAC1E,aAAO,wBAAU,QAAQ,KAAK,KAAK,EAAE,CAAC;AACxC;AAOO,SAAS,eACd,UACA,OACA,QACoB;AACpB,MAAI,uBAAuB,OAAO,MAAM,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,OAAO,SAAS,GAAG,GAAG;AACtC,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,oBAAO;AACT,YAAQ;AAAA,MACN,IAAI,OAAO,IAAI;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,wCAAwC,SAAS,IAAI,YAAY,IAAI;AAAA,IACvE;AAAA,EACF;AAGA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
package/Base/utils.js CHANGED
@@ -16,9 +16,13 @@ const separator = " ";
16
16
  function getSelector(nameOrSelector) {
17
17
  if (!selectors.has(nameOrSelector)) {
18
18
  const parts = [
19
+ // Single selector
19
20
  `[data-component="${nameOrSelector}"]`,
21
+ // Selector in the middle of a list of selectors
20
22
  `[data-component*="${separator}${nameOrSelector}${separator}"]`,
23
+ // Selector at the end of a list of selectors
21
24
  `[data-component$="${separator}${nameOrSelector}"]`,
25
+ // Selector at the beginning of a list of selectors
22
26
  `[data-component^="${nameOrSelector}${separator}"]`
23
27
  ];
24
28
  selectors.set(nameOrSelector, parts.join(","));