@studiometa/js-toolkit 2.12.1 → 3.0.0-alpha.10

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 (383) hide show
  1. package/Base/Base.d.ts +8 -8
  2. package/Base/Base.js +75 -78
  3. package/Base/Base.js.map +2 -2
  4. package/Base/features.d.ts +15 -2
  5. package/Base/features.js +31 -1
  6. package/Base/features.js.map +2 -2
  7. package/Base/index.d.ts +1 -0
  8. package/Base/index.js +4 -0
  9. package/Base/index.js.map +2 -2
  10. package/Base/managers/AbstractManager.d.ts +1 -1
  11. package/Base/managers/ChildrenManager.d.ts +6 -6
  12. package/Base/managers/ChildrenManager.js +34 -20
  13. package/Base/managers/ChildrenManager.js.map +2 -2
  14. package/Base/managers/EventsManager.d.ts +6 -28
  15. package/Base/managers/EventsManager.js +54 -64
  16. package/Base/managers/EventsManager.js.map +2 -2
  17. package/Base/managers/OptionsManager.d.ts +6 -6
  18. package/Base/managers/OptionsManager.js +29 -23
  19. package/Base/managers/OptionsManager.js.map +3 -3
  20. package/Base/managers/RefsManager.d.ts +1 -1
  21. package/Base/managers/RefsManager.js +23 -34
  22. package/Base/managers/RefsManager.js.map +3 -3
  23. package/Base/managers/ResponsiveOptionsManager.js +7 -4
  24. package/Base/managers/ResponsiveOptionsManager.js.map +2 -2
  25. package/Base/managers/ServicesManager.d.ts +2 -4
  26. package/Base/managers/ServicesManager.js +2 -3
  27. package/Base/managers/ServicesManager.js.map +2 -2
  28. package/Base/utils.d.ts +10 -5
  29. package/Base/utils.js +37 -23
  30. package/Base/utils.js.map +2 -2
  31. package/README.md +107 -6
  32. package/decorators/index.d.ts +1 -1
  33. package/decorators/index.js +1 -1
  34. package/decorators/index.js.map +1 -1
  35. package/decorators/withBreakpointManager.js +6 -4
  36. package/decorators/withBreakpointManager.js.map +2 -2
  37. package/decorators/withBreakpointObserver.d.ts +0 -1
  38. package/decorators/withBreakpointObserver.js +5 -3
  39. package/decorators/withBreakpointObserver.js.map +2 -2
  40. package/decorators/withIntersectionObserver.js +3 -5
  41. package/decorators/withIntersectionObserver.js.map +2 -2
  42. package/decorators/withMountOnMediaQuery.js +3 -3
  43. package/decorators/withMountOnMediaQuery.js.map +2 -2
  44. package/decorators/withMountWhenInView.js +3 -3
  45. package/decorators/withMountWhenInView.js.map +2 -2
  46. package/decorators/withName.d.ts +6 -0
  47. package/decorators/withName.js +12 -0
  48. package/decorators/withName.js.map +7 -0
  49. package/decorators/withScrolledInView/utils.d.ts +12 -1
  50. package/decorators/withScrolledInView/utils.js.map +2 -2
  51. package/decorators/withScrolledInView/withScrolledInView.js +7 -62
  52. package/decorators/withScrolledInView/withScrolledInView.js.map +2 -2
  53. package/helpers/createApp.d.ts +3 -4
  54. package/helpers/createApp.js +21 -11
  55. package/helpers/createApp.js.map +2 -2
  56. package/helpers/getDirectChildren.js +10 -5
  57. package/helpers/getDirectChildren.js.map +2 -2
  58. package/helpers/importWhenVisible.js +1 -2
  59. package/helpers/importWhenVisible.js.map +1 -1
  60. package/index.d.ts +2 -3
  61. package/index.js +2 -4
  62. package/index.js.map +2 -2
  63. package/package.json +2 -10
  64. package/services/index.d.ts +1 -1
  65. package/services/index.js.map +2 -2
  66. package/services/pointer.d.ts +1 -1
  67. package/services/pointer.js +3 -3
  68. package/services/pointer.js.map +2 -2
  69. package/services/raf.js +2 -4
  70. package/services/raf.js.map +2 -2
  71. package/services/resize.d.ts +7 -6
  72. package/services/resize.js +18 -26
  73. package/services/resize.js.map +2 -2
  74. package/services/scroll.d.ts +14 -0
  75. package/services/scroll.js +39 -21
  76. package/services/scroll.js.map +2 -2
  77. package/utils/SmartQueue.d.ts +1 -1
  78. package/utils/SmartQueue.js +1 -1
  79. package/utils/SmartQueue.js.map +2 -2
  80. package/utils/css/animate.d.ts +33 -15
  81. package/utils/css/animate.js +67 -26
  82. package/utils/css/animate.js.map +2 -2
  83. package/utils/css/getOffsetSizes.js +2 -2
  84. package/utils/css/getOffsetSizes.js.map +1 -1
  85. package/utils/css/index.d.ts +2 -1
  86. package/utils/css/index.js +4 -4
  87. package/utils/css/index.js.map +2 -2
  88. package/utils/css/matrix.d.ts +1 -1
  89. package/utils/css/matrix.js.map +2 -2
  90. package/utils/css/transform.d.ts +1 -1
  91. package/utils/css/transform.js +1 -1
  92. package/utils/css/transform.js.map +2 -2
  93. package/utils/css/utils.d.ts +1 -1
  94. package/utils/css/utils.js +1 -1
  95. package/utils/css/utils.js.map +2 -2
  96. package/utils/index.d.ts +6 -4
  97. package/utils/index.js +17 -16
  98. package/utils/index.js.map +2 -2
  99. package/utils/is.d.ts +12 -0
  100. package/utils/is.js +17 -0
  101. package/utils/is.js.map +2 -2
  102. package/utils/math/createRange.d.ts +4 -0
  103. package/utils/math/createRange.js +13 -0
  104. package/utils/math/createRange.js.map +7 -0
  105. package/utils/math/ease.d.ts +1 -0
  106. package/utils/math/ease.js +2 -0
  107. package/utils/math/ease.js.map +2 -2
  108. package/utils/math/index.d.ts +5 -3
  109. package/utils/math/index.js +7 -3
  110. package/utils/math/index.js.map +2 -2
  111. package/utils/math/mean.d.ts +1 -0
  112. package/utils/math/mean.js +17 -0
  113. package/utils/math/mean.js.map +7 -0
  114. package/utils/memo.d.ts +5 -0
  115. package/utils/memo.js +14 -0
  116. package/utils/memo.js.map +7 -0
  117. package/utils/nextFrame.d.ts +4 -22
  118. package/utils/nextFrame.js +3 -10
  119. package/utils/nextFrame.js.map +2 -2
  120. package/utils/nextMicrotask.d.ts +4 -1
  121. package/utils/nextMicrotask.js +3 -3
  122. package/utils/nextMicrotask.js.map +2 -2
  123. package/utils/nextTick.d.ts +4 -1
  124. package/utils/nextTick.js +3 -3
  125. package/utils/nextTick.js.map +2 -2
  126. package/utils/random.d.ts +15 -0
  127. package/utils/random.js +15 -0
  128. package/utils/random.js.map +7 -0
  129. package/utils/scrollTo.d.ts +30 -6
  130. package/utils/scrollTo.js +97 -43
  131. package/utils/scrollTo.js.map +2 -2
  132. package/utils/string/changeCase.d.ts +24 -0
  133. package/utils/string/changeCase.js +47 -0
  134. package/utils/string/changeCase.js.map +7 -0
  135. package/utils/string/index.d.ts +1 -0
  136. package/utils/string/index.js +1 -0
  137. package/utils/string/index.js.map +2 -2
  138. package/utils/{focusTrap.d.ts → trapFocus.d.ts} +2 -10
  139. package/utils/{focusTrap.js → trapFocus.js} +5 -9
  140. package/utils/trapFocus.js.map +7 -0
  141. package/utils/tween.d.ts +59 -10
  142. package/utils/tween.js +24 -18
  143. package/utils/tween.js.map +2 -2
  144. package/Base/Base.cjs +0 -420
  145. package/Base/Base.cjs.map +0 -7
  146. package/Base/features.cjs +0 -27
  147. package/Base/features.cjs.map +0 -7
  148. package/Base/index.cjs +0 -21
  149. package/Base/index.cjs.map +0 -7
  150. package/Base/managers/AbstractManager.cjs +0 -78
  151. package/Base/managers/AbstractManager.cjs.map +0 -7
  152. package/Base/managers/ChildrenManager.cjs +0 -156
  153. package/Base/managers/ChildrenManager.cjs.map +0 -7
  154. package/Base/managers/EventsManager.cjs +0 -305
  155. package/Base/managers/EventsManager.cjs.map +0 -7
  156. package/Base/managers/OptionsManager.cjs +0 -198
  157. package/Base/managers/OptionsManager.cjs.map +0 -7
  158. package/Base/managers/RefsManager.cjs +0 -118
  159. package/Base/managers/RefsManager.cjs.map +0 -7
  160. package/Base/managers/ResponsiveOptionsManager.cjs +0 -79
  161. package/Base/managers/ResponsiveOptionsManager.cjs.map +0 -7
  162. package/Base/managers/ServicesManager.cjs +0 -161
  163. package/Base/managers/ServicesManager.cjs.map +0 -7
  164. package/Base/managers/index.cjs +0 -39
  165. package/Base/managers/index.cjs.map +0 -7
  166. package/Base/types.cjs +0 -19
  167. package/Base/types.cjs.map +0 -7
  168. package/Base/utils.cjs +0 -95
  169. package/Base/utils.cjs.map +0 -7
  170. package/decorators/index.cjs +0 -33
  171. package/decorators/index.cjs.map +0 -7
  172. package/decorators/withBreakpointManager.cjs +0 -102
  173. package/decorators/withBreakpointManager.cjs.map +0 -7
  174. package/decorators/withBreakpointObserver.cjs +0 -128
  175. package/decorators/withBreakpointObserver.cjs.map +0 -7
  176. package/decorators/withDrag.cjs +0 -56
  177. package/decorators/withDrag.cjs.map +0 -7
  178. package/decorators/withExtraConfig.cjs +0 -50
  179. package/decorators/withExtraConfig.cjs.map +0 -7
  180. package/decorators/withFreezedOptions.cjs +0 -50
  181. package/decorators/withFreezedOptions.cjs.map +0 -7
  182. package/decorators/withIntersectionObserver.cjs +0 -71
  183. package/decorators/withIntersectionObserver.cjs.map +0 -7
  184. package/decorators/withMountOnMediaQuery.cjs +0 -86
  185. package/decorators/withMountOnMediaQuery.cjs.map +0 -7
  186. package/decorators/withMountWhenInView.cjs +0 -92
  187. package/decorators/withMountWhenInView.cjs.map +0 -7
  188. package/decorators/withMountWhenPrefersMotion.cjs +0 -30
  189. package/decorators/withMountWhenPrefersMotion.cjs.map +0 -7
  190. package/decorators/withRelativePointer.cjs +0 -56
  191. package/decorators/withRelativePointer.cjs.map +0 -7
  192. package/decorators/withResponsiveOptions.cjs +0 -41
  193. package/decorators/withResponsiveOptions.cjs.map +0 -7
  194. package/decorators/withScrolledInView/index.cjs +0 -22
  195. package/decorators/withScrolledInView/index.cjs.map +0 -7
  196. package/decorators/withScrolledInView/types.cjs +0 -19
  197. package/decorators/withScrolledInView/types.cjs.map +0 -7
  198. package/decorators/withScrolledInView/utils.cjs +0 -99
  199. package/decorators/withScrolledInView/utils.cjs.map +0 -7
  200. package/decorators/withScrolledInView/withScrolledInView.cjs +0 -249
  201. package/decorators/withScrolledInView/withScrolledInView.cjs.map +0 -7
  202. package/decorators/withVue2.cjs +0 -68
  203. package/decorators/withVue2.cjs.map +0 -7
  204. package/decorators/withVue2.d.ts +0 -16
  205. package/decorators/withVue2.js +0 -46
  206. package/decorators/withVue2.js.map +0 -7
  207. package/helpers/createApp.cjs +0 -58
  208. package/helpers/createApp.cjs.map +0 -7
  209. package/helpers/getClosestParent.cjs +0 -45
  210. package/helpers/getClosestParent.cjs.map +0 -7
  211. package/helpers/getDirectChildren.cjs +0 -47
  212. package/helpers/getDirectChildren.cjs.map +0 -7
  213. package/helpers/getInstanceFromElement.cjs +0 -32
  214. package/helpers/getInstanceFromElement.cjs.map +0 -7
  215. package/helpers/importOnInteraction.cjs +0 -48
  216. package/helpers/importOnInteraction.cjs.map +0 -7
  217. package/helpers/importOnMediaQuery.cjs +0 -44
  218. package/helpers/importOnMediaQuery.cjs.map +0 -7
  219. package/helpers/importWhenIdle.cjs +0 -46
  220. package/helpers/importWhenIdle.cjs.map +0 -7
  221. package/helpers/importWhenPrefersMotion.cjs +0 -40
  222. package/helpers/importWhenPrefersMotion.cjs.map +0 -7
  223. package/helpers/importWhenVisible.cjs +0 -44
  224. package/helpers/importWhenVisible.cjs.map +0 -7
  225. package/helpers/index.cjs +0 -53
  226. package/helpers/index.cjs.map +0 -7
  227. package/helpers/utils.cjs +0 -37
  228. package/helpers/utils.cjs.map +0 -7
  229. package/index.cjs +0 -31
  230. package/index.cjs.map +0 -7
  231. package/services/drag.cjs +0 -231
  232. package/services/drag.cjs.map +0 -7
  233. package/services/index.cjs +0 -51
  234. package/services/index.cjs.map +0 -7
  235. package/services/key.cjs +0 -97
  236. package/services/key.cjs.map +0 -7
  237. package/services/load.cjs +0 -60
  238. package/services/load.cjs.map +0 -7
  239. package/services/pointer.cjs +0 -145
  240. package/services/pointer.cjs.map +0 -7
  241. package/services/raf.cjs +0 -80
  242. package/services/raf.cjs.map +0 -7
  243. package/services/resize.cjs +0 -107
  244. package/services/resize.cjs.map +0 -7
  245. package/services/scroll.cjs +0 -119
  246. package/services/scroll.cjs.map +0 -7
  247. package/services/service.cjs +0 -69
  248. package/services/service.cjs.map +0 -7
  249. package/utils/Queue.cjs +0 -93
  250. package/utils/Queue.cjs.map +0 -7
  251. package/utils/SmartQueue.cjs +0 -73
  252. package/utils/SmartQueue.cjs.map +0 -7
  253. package/utils/collide/boundingRectToCircle.cjs +0 -36
  254. package/utils/collide/boundingRectToCircle.cjs.map +0 -7
  255. package/utils/collide/collideCircleCircle.cjs +0 -35
  256. package/utils/collide/collideCircleCircle.cjs.map +0 -7
  257. package/utils/collide/collideCircleRect.cjs +0 -47
  258. package/utils/collide/collideCircleRect.cjs.map +0 -7
  259. package/utils/collide/collidePointCircle.cjs +0 -32
  260. package/utils/collide/collidePointCircle.cjs.map +0 -7
  261. package/utils/collide/collidePointRect.cjs +0 -32
  262. package/utils/collide/collidePointRect.cjs.map +0 -7
  263. package/utils/collide/collideRectRect.cjs +0 -32
  264. package/utils/collide/collideRectRect.cjs.map +0 -7
  265. package/utils/collide/index.cjs +0 -47
  266. package/utils/collide/index.cjs.map +0 -7
  267. package/utils/css/animate.cjs +0 -202
  268. package/utils/css/animate.cjs.map +0 -7
  269. package/utils/css/classes.cjs +0 -51
  270. package/utils/css/classes.cjs.map +0 -7
  271. package/utils/css/getOffsetSizes.cjs +0 -48
  272. package/utils/css/getOffsetSizes.cjs.map +0 -7
  273. package/utils/css/index.cjs +0 -52
  274. package/utils/css/index.cjs.map +0 -7
  275. package/utils/css/matrix.cjs +0 -30
  276. package/utils/css/matrix.cjs.map +0 -7
  277. package/utils/css/styles.cjs +0 -45
  278. package/utils/css/styles.cjs.map +0 -7
  279. package/utils/css/transform.cjs +0 -91
  280. package/utils/css/transform.cjs.map +0 -7
  281. package/utils/css/transition.cjs +0 -145
  282. package/utils/css/transition.cjs.map +0 -7
  283. package/utils/css/utils.cjs +0 -32
  284. package/utils/css/utils.cjs.map +0 -7
  285. package/utils/debounce.cjs +0 -35
  286. package/utils/debounce.cjs.map +0 -7
  287. package/utils/dom/ancestors.cjs +0 -37
  288. package/utils/dom/ancestors.cjs.map +0 -7
  289. package/utils/dom/index.cjs +0 -21
  290. package/utils/dom/index.cjs.map +0 -7
  291. package/utils/focusTrap.cjs +0 -93
  292. package/utils/focusTrap.cjs.map +0 -7
  293. package/utils/focusTrap.js.map +0 -7
  294. package/utils/getComponentResolver.cjs +0 -38
  295. package/utils/getComponentResolver.cjs.map +0 -7
  296. package/utils/has.cjs +0 -29
  297. package/utils/has.cjs.map +0 -7
  298. package/utils/history.cjs +0 -92
  299. package/utils/history.cjs.map +0 -7
  300. package/utils/index.cjs +0 -76
  301. package/utils/index.cjs.map +0 -7
  302. package/utils/is.cjs +0 -41
  303. package/utils/is.cjs.map +0 -7
  304. package/utils/keyCodes.cjs +0 -36
  305. package/utils/keyCodes.cjs.map +0 -7
  306. package/utils/math/clamp.cjs +0 -29
  307. package/utils/math/clamp.cjs.map +0 -7
  308. package/utils/math/clamp01.cjs +0 -40
  309. package/utils/math/clamp01.cjs.map +0 -7
  310. package/utils/math/createEases.cjs +0 -33
  311. package/utils/math/createEases.cjs.map +0 -7
  312. package/utils/math/damp.cjs +0 -29
  313. package/utils/math/damp.cjs.map +0 -7
  314. package/utils/math/ease.cjs +0 -82
  315. package/utils/math/ease.cjs.map +0 -7
  316. package/utils/math/index.cjs +0 -54
  317. package/utils/math/index.cjs.map +0 -7
  318. package/utils/math/inertiaFinalValue.cjs +0 -47
  319. package/utils/math/inertiaFinalValue.cjs.map +0 -7
  320. package/utils/math/lerp.cjs +0 -29
  321. package/utils/math/lerp.cjs.map +0 -7
  322. package/utils/math/map.cjs +0 -29
  323. package/utils/math/map.cjs.map +0 -7
  324. package/utils/math/round.cjs +0 -29
  325. package/utils/math/round.cjs.map +0 -7
  326. package/utils/memoize.cjs +0 -48
  327. package/utils/memoize.cjs.map +0 -7
  328. package/utils/nextFrame.cjs +0 -41
  329. package/utils/nextFrame.cjs.map +0 -7
  330. package/utils/nextMicrotask.cjs +0 -30
  331. package/utils/nextMicrotask.cjs.map +0 -7
  332. package/utils/nextTick.cjs +0 -31
  333. package/utils/nextTick.cjs.map +0 -7
  334. package/utils/noop.cjs +0 -32
  335. package/utils/noop.cjs.map +0 -7
  336. package/utils/object/autoBind.cjs +0 -60
  337. package/utils/object/autoBind.cjs.map +0 -7
  338. package/utils/object/autoBind.d.ts +0 -14
  339. package/utils/object/autoBind.js +0 -28
  340. package/utils/object/autoBind.js.map +0 -7
  341. package/utils/object/getAllProperties.cjs +0 -39
  342. package/utils/object/getAllProperties.cjs.map +0 -7
  343. package/utils/object/index.cjs +0 -39
  344. package/utils/object/index.cjs.map +0 -7
  345. package/utils/object/index.d.ts +0 -2
  346. package/utils/object/index.js +0 -7
  347. package/utils/object/index.js.map +0 -7
  348. package/utils/scheduler.cjs +0 -75
  349. package/utils/scheduler.cjs.map +0 -7
  350. package/utils/scrollTo.cjs +0 -88
  351. package/utils/scrollTo.cjs.map +0 -7
  352. package/utils/string/endsWith.cjs +0 -35
  353. package/utils/string/endsWith.cjs.map +0 -7
  354. package/utils/string/index.cjs +0 -58
  355. package/utils/string/index.cjs.map +0 -7
  356. package/utils/string/startsWith.cjs +0 -35
  357. package/utils/string/startsWith.cjs.map +0 -7
  358. package/utils/string/withLeadingCharacters.cjs +0 -40
  359. package/utils/string/withLeadingCharacters.cjs.map +0 -7
  360. package/utils/string/withLeadingSlash.cjs +0 -40
  361. package/utils/string/withLeadingSlash.cjs.map +0 -7
  362. package/utils/string/withTrailingCharacters.cjs +0 -40
  363. package/utils/string/withTrailingCharacters.cjs.map +0 -7
  364. package/utils/string/withTrailingSlash.cjs +0 -40
  365. package/utils/string/withTrailingSlash.cjs.map +0 -7
  366. package/utils/string/withoutLeadingCharacters.cjs +0 -29
  367. package/utils/string/withoutLeadingCharacters.cjs.map +0 -7
  368. package/utils/string/withoutLeadingCharactersRecursive.cjs +0 -45
  369. package/utils/string/withoutLeadingCharactersRecursive.cjs.map +0 -7
  370. package/utils/string/withoutLeadingSlash.cjs +0 -40
  371. package/utils/string/withoutLeadingSlash.cjs.map +0 -7
  372. package/utils/string/withoutTrailingCharacters.cjs +0 -29
  373. package/utils/string/withoutTrailingCharacters.cjs.map +0 -7
  374. package/utils/string/withoutTrailingCharactersRecursive.cjs +0 -45
  375. package/utils/string/withoutTrailingCharactersRecursive.cjs.map +0 -7
  376. package/utils/string/withoutTrailingSlash.cjs +0 -40
  377. package/utils/string/withoutTrailingSlash.cjs.map +0 -7
  378. package/utils/throttle.cjs +0 -37
  379. package/utils/throttle.cjs.map +0 -7
  380. package/utils/tween.cjs +0 -122
  381. package/utils/tween.cjs.map +0 -7
  382. package/utils/wait.cjs +0 -31
  383. package/utils/wait.cjs.map +0 -7
@@ -2,18 +2,16 @@ import { AbstractManager } from "./AbstractManager.js";
2
2
  import {
3
3
  isDev,
4
4
  isArray,
5
- isDefined,
6
5
  getAncestorWhereUntil,
7
6
  endsWith,
8
- startsWith
7
+ startsWith,
8
+ memo,
9
+ camelCase
9
10
  } from "../../utils/index.js";
11
+ import { features } from "../features.js";
10
12
  const NORMALIZE_REF_NAME_REGEX = /\[\]$/;
11
13
  const NAMESPACED_REF_REGEX = /^(.*\.)/;
12
- const normalizedRefNamesCache = /* @__PURE__ */ new Map();
13
- function normalizeRefName(name) {
14
- if (normalizedRefNamesCache.has(name)) {
15
- return normalizedRefNamesCache.get(name);
16
- }
14
+ const normalizeRefName = memo(function normalizeRefName2(name) {
17
15
  let normalizedName = name;
18
16
  if (endsWith(name, "[]")) {
19
17
  normalizedName = normalizedName.replace(NORMALIZE_REF_NAME_REGEX, "");
@@ -21,14 +19,14 @@ function normalizeRefName(name) {
21
19
  if (normalizedName.includes(".")) {
22
20
  return normalizedName.replace(NAMESPACED_REF_REGEX, "");
23
21
  }
24
- normalizedRefNamesCache.set(name, normalizedName);
25
22
  return normalizedName;
26
- }
23
+ });
27
24
  function refBelongToInstance(ref, rootElement, name) {
28
- const isPrefixed = startsWith(ref.dataset.ref, name);
25
+ const attributes = features.get("attributes");
26
+ const isPrefixed = startsWith(ref.getAttribute(attributes.ref), name);
29
27
  const firstComponentAncestor = getAncestorWhereUntil(
30
28
  ref,
31
- (el) => el && (isPrefixed ? el.dataset.component === name && el : isDefined(el.dataset.component)) && el !== rootElement,
29
+ (el) => el && (isPrefixed ? el.getAttribute(attributes.component) === name && el : el.getAttribute(attributes.component)) && el !== rootElement,
32
30
  (el) => el === rootElement
33
31
  );
34
32
  return firstComponentAncestor === rootElement;
@@ -37,32 +35,25 @@ function __register(that, refName) {
37
35
  const isMultiple = endsWith(refName, "[]");
38
36
  const propName = normalizeRefName(refName);
39
37
  const { name } = that.__base.$options;
40
- const refs = Array.from(
41
- that.__element.querySelectorAll(
42
- `[data-ref="${refName}"],[data-ref="${name}.${refName}"]`
43
- )
44
- ).filter((ref) => refBelongToInstance(ref, that.__element, name));
38
+ const attributes = features.get("attributes");
39
+ const refs = [];
40
+ const selector = `[${attributes.ref}="${refName}"],[${attributes.ref}="${name}.${refName}"]`;
41
+ for (const ref of that.__element.querySelectorAll(selector)) {
42
+ if (refBelongToInstance(ref, that.__element, name)) {
43
+ refs.push(ref);
44
+ }
45
+ }
45
46
  if (isDev && !isMultiple && refs.length > 1) {
46
47
  console.warn(
47
- // @ts-ignore
48
- `[${that.__base.$options.name}]`,
48
+ `[${that.__base.$id}]`,
49
49
  `The "${refName}" ref has been found multiple times.`,
50
50
  "Did you forgot to add the `[]` suffix to its name?"
51
51
  );
52
52
  }
53
- if (!isMultiple && refs.length <= 1 && !isDefined(refs[0])) {
54
- if (isDev) {
55
- console.warn(
56
- // @ts-ignore
57
- `[${that.__base.$options.name}]`,
58
- `The "${refName}" ref is missing.`,
59
- `Is there an \`[data-ref="${refName}"]\` element in the component's scope?`
60
- );
61
- }
62
- return;
53
+ if (refs.length) {
54
+ that.__eventsManager.bindRef(refName, refs);
63
55
  }
64
- that.__eventsManager.bindRef(refName, refs);
65
- Object.defineProperty(that, propName, {
56
+ Object.defineProperty(that, camelCase(propName), {
66
57
  // @todo remove usage of non-multiple refs as array
67
58
  value: isMultiple || refs.length > 1 ? refs : refs[0],
68
59
  enumerable: true,
@@ -85,15 +76,13 @@ class RefsManager extends AbstractManager {
85
76
  * Register all refs.
86
77
  */
87
78
  registerAll() {
88
- for (const refName of this.__refs)
89
- __register(this, refName);
79
+ for (const refName of this.__refs) __register(this, refName);
90
80
  }
91
81
  /**
92
82
  * Unregister all refs.
93
83
  */
94
84
  unregisterAll() {
95
- for (const refName of this.__refs)
96
- __unregister(this, refName);
85
+ for (const refName of this.__refs) __unregister(this, refName);
97
86
  }
98
87
  }
99
88
  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 {\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
- "names": []
4
+ "sourcesContent": ["import { AbstractManager } from './AbstractManager.js';\nimport {\n isDev,\n isArray,\n isDefined,\n getAncestorWhereUntil,\n endsWith,\n startsWith,\n memo,\n camelCase,\n} from '../../utils/index.js';\nimport { features } from '../features.js';\n\nconst NORMALIZE_REF_NAME_REGEX = /\\[\\]$/;\nconst NAMESPACED_REF_REGEX = /^(.*\\.)/;\n\n/**\n * Normalize the name of ref.\n */\nexport const normalizeRefName = memo(function normalizeRefName(name: string) {\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 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 attributes = features.get('attributes');\n const isPrefixed = startsWith(ref.getAttribute(attributes.ref), name);\n const firstComponentAncestor = getAncestorWhereUntil(\n ref,\n (el) =>\n el &&\n (isPrefixed\n ? el.getAttribute(attributes.component) === name && el\n : el.getAttribute(attributes.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 const attributes = features.get('attributes');\n const refs = [] as HTMLElement[];\n const selector = `[${attributes.ref}=\"${refName}\"],[${attributes.ref}=\"${name}.${refName}\"]`;\n\n for (const ref of that.__element.querySelectorAll<HTMLElement>(selector)) {\n if (refBelongToInstance(ref, that.__element, name)) {\n refs.push(ref);\n }\n }\n\n /* v8 ignore next 7 */\n if (isDev && !isMultiple && refs.length > 1) {\n console.warn(\n `[${that.__base.$id}]`,\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 (refs.length) {\n that.__eventsManager.bindRef(refName, refs);\n }\n\n Object.defineProperty(that, camelCase(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,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,gBAAgB;AAEzB,MAAM,2BAA2B;AACjC,MAAM,uBAAuB;AAKtB,MAAM,mBAAmB,KAAK,SAASA,kBAAiB,MAAc;AAC3E,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,SAAO;AACT,CAAC;AAKD,SAAS,oBAAoB,KAAkB,aAA0B,MAAc;AACrF,QAAM,aAAa,SAAS,IAAI,YAAY;AAC5C,QAAM,aAAa,WAAW,IAAI,aAAa,WAAW,GAAG,GAAG,IAAI;AACpE,QAAM,yBAAyB;AAAA,IAC7B;AAAA,IACA,CAAC,OACC,OACC,aACG,GAAG,aAAa,WAAW,SAAS,MAAM,QAAQ,KAClD,GAAG,aAAa,WAAW,SAAS,MACxC,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;AAC7B,QAAM,aAAa,SAAS,IAAI,YAAY;AAC5C,QAAM,OAAO,CAAC;AACd,QAAM,WAAW,IAAI,WAAW,GAAG,KAAK,OAAO,OAAO,WAAW,GAAG,KAAK,IAAI,IAAI,OAAO;AAExF,aAAW,OAAO,KAAK,UAAU,iBAA8B,QAAQ,GAAG;AACxE,QAAI,oBAAoB,KAAK,KAAK,WAAW,IAAI,GAAG;AAClD,WAAK,KAAK,GAAG;AAAA,IACf;AAAA,EACF;AAGA,MAAI,SAAS,CAAC,cAAc,KAAK,SAAS,GAAG;AAC3C,YAAQ;AAAA,MACN,IAAI,KAAK,OAAO,GAAG;AAAA,MACnB,QAAQ,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ;AACf,SAAK,gBAAgB,QAAQ,SAAS,IAAI;AAAA,EAC5C;AAEA,SAAO,eAAe,MAAM,UAAU,QAAQ,GAAG;AAAA;AAAA,IAE/C,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,OAAQ,YAAW,MAAM,OAAO;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AACd,eAAW,WAAW,KAAK,OAAQ,cAAa,MAAM,OAAO;AAAA,EAC/D;AACF;",
6
+ "names": ["normalizeRefName"]
7
7
  }
@@ -1,20 +1,23 @@
1
1
  import { OptionsManager, __getPropertyName } from "./OptionsManager.js";
2
2
  import { useResize } from "../../services/index.js";
3
3
  import { isDev } from "../../utils/index.js";
4
+ import { features } from "../features.js";
4
5
  function __getResponsiveName(that, name) {
5
6
  const { breakpoint } = useResize().props();
6
7
  if (!breakpoint) {
7
8
  return name;
8
9
  }
9
10
  let responsiveName = name;
10
- const propertyName = __getPropertyName(name);
11
- const regex = new RegExp(`${propertyName}:(.+)$`);
12
- for (const optionName of Object.keys(that.__element.dataset)) {
11
+ const propertyName = __getPropertyName(name).toLowerCase();
12
+ const regex = new RegExp(`${propertyName}:(.+)$`, "i");
13
+ const attributes = features.get("attributes");
14
+ const dataOptionRegExp = new RegExp(`^${attributes.option}-`);
15
+ for (const optionName of that.__element.getAttributeNames()) {
13
16
  if (regex.test(optionName)) {
14
17
  const [, breakpoints] = optionName.match(regex);
15
18
  const isInBreakpoint = breakpoints.split(":").includes(breakpoint);
16
19
  if (isInBreakpoint) {
17
- responsiveName = optionName.replace(/^option/, "");
20
+ responsiveName = optionName.replace(dataOptionRegExp, "");
18
21
  }
19
22
  }
20
23
  }
@@ -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 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;",
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';\nimport { features } from '../features.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).toLowerCase();\n const regex = new RegExp(`${propertyName}:(.+)$`, 'i');\n const attributes = features.get('attributes');\n const dataOptionRegExp = new RegExp(`^${attributes.option}-`);\n\n for (const optionName of that.__element.getAttributeNames()) {\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(dataOptionRegExp, '');\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;AACtB,SAAS,gBAAgB;AAWzB,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,EAAE,YAAY;AACzD,QAAM,QAAQ,IAAI,OAAO,GAAG,YAAY,UAAU,GAAG;AACrD,QAAM,aAAa,SAAS,IAAI,YAAY;AAC5C,QAAM,mBAAmB,IAAI,OAAO,IAAI,WAAW,MAAM,GAAG;AAE5D,aAAW,cAAc,KAAK,UAAU,kBAAkB,GAAG;AAC3D,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,kBAAkB,EAAE;AAAA,MAC1D;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
  }
@@ -1,5 +1,5 @@
1
- import { usePointer, useRaf, useResize, useScroll, useKey, useLoad } from '../../services/index.js';
2
- import type { PointerServiceInterface, RafServiceInterface, ResizeServiceInterface, ScrollServiceInterface, KeyServiceInterface, LoadServiceInterface, ServiceInterface } from '../../services/index.js';
1
+ import { usePointer, useRaf, useResize, useScroll, useKey } from '../../services/index.js';
2
+ import type { PointerServiceInterface, RafServiceInterface, ResizeServiceInterface, ScrollServiceInterface, KeyServiceInterface, ServiceInterface } from '../../services/index.js';
3
3
  import { AbstractManager } from './AbstractManager.js';
4
4
  type Services = {
5
5
  scrolled: ScrollServiceInterface;
@@ -7,7 +7,6 @@ type Services = {
7
7
  ticked: RafServiceInterface;
8
8
  moved: PointerServiceInterface;
9
9
  keyed: KeyServiceInterface;
10
- loaded: LoadServiceInterface;
11
10
  } & Record<string, ServiceInterface<unknown>>;
12
11
  type ServiceNames = keyof Services;
13
12
  /**
@@ -29,7 +28,6 @@ export declare class ServicesManager extends AbstractManager {
29
28
  ticked: typeof useRaf;
30
29
  moved: typeof usePointer;
31
30
  keyed: typeof useKey;
32
- loaded: typeof useLoad;
33
31
  };
34
32
  /**
35
33
  * Test if the given service is registered.
@@ -1,4 +1,4 @@
1
- import { usePointer, useRaf, useResize, useScroll, useKey, useLoad } from "../../services/index.js";
1
+ import { usePointer, useRaf, useResize, useScroll, useKey } from "../../services/index.js";
2
2
  import { AbstractManager } from "./AbstractManager.js";
3
3
  import { noop, isFunction, isDefined, isDev } from "../../utils/index.js";
4
4
  const SERVICES_MAP = {
@@ -6,8 +6,7 @@ const SERVICES_MAP = {
6
6
  resized: useResize,
7
7
  ticked: useRaf,
8
8
  moved: usePointer,
9
- keyed: useKey,
10
- loaded: useLoad
9
+ keyed: useKey
11
10
  };
12
11
  const SERVICE_NAMES = Object.keys(SERVICES_MAP);
13
12
  class ServicesManager extends AbstractManager {
@@ -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 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": "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;AAAA;AAAA;AAAA,EAInD,mBAAiE,CAAC;AAAA;AAAA;AAAA;AAAA,EAKlE,IAAI,aAAa;AACf,WAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAyC;AAC3C,QACE,GACG,WAAW,KAAK,OAAO,OAAO,CAAC;AAAA,IAE9B,KAAK,OAAO,WAAW,OAAO,MAChC,KAAK,WAAW,OAAO,IAEzB;AACA,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,IAAI,IAAI,KAAK,WAAW,OAAO,EAAE;AACzC,WAAO,IAAI,KAAK,OAAO,GAAG;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAqC,SAA8C;AAEjF,WAAO,KAAK,WAAW,OAAO,EAAE,EAAE,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SAAmC;AACxC,QAAI,KAAK,IAAI,OAAO,GAAG;AACrB,aAAO,KAAK,QAAQ,KAAK,MAAM,OAAO;AAAA,IACxC;AAEA;AAAA;AAAA,MAEE,EAAE,WAAW,KAAK,OAAO,OAAO,CAAC,KAAK,KAAK,OAAO,WAAW,OAAO,MACpE,CAAC,KAAK,WAAW,OAAO;AAAA,MACxB;AACA,aAAO;AAAA,IACT;AACA,UAAM,kBAAkB,KAAK,WAAW,OAAO,EAAE;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;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,WAAO,OAAO,KAAK,KAAK,UAAU,EAAE,IAAI,CAAC,gBAAgB,KAAK,OAAO,WAAW,CAAC;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa;AACX,eAAW,eAAe,OAAO,KAAK,KAAK,UAAU,GAAG;AACtD,WAAK,QAAQ,WAAW;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,SAAuB;AAC7B,QAAI,CAAC,KAAK,WAAW,OAAO,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,EAAE,OAAO,IAAI,KAAK,WAAW,OAAO,EAAE;AAC5C,WAAO,KAAK,OAAO,GAAG;AAAA,EACxB;AAAA;AAAA;AAAA;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,MAAc,aAA6D;AAClF,SAAK,iBAAiB,IAAI,IAAI;AAC9B,SAAK,OAAO,WAAW,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,MAAc;AACvB,QAAI,cAAc,SAAS,IAAI,GAAG;AAChC,UAAI,OAAO;AACT,cAAM,IAAI,MAAM,2BAA2B,IAAI,0CAA0C;AAAA,MAC3F;AACA;AAAA,IACF;AAEA,SAAK,OAAO,cAAc,IAAI;AAC9B,WAAO,KAAK,iBAAiB,IAAI;AAAA,EACnC;AACF;",
4
+ "sourcesContent": ["import { usePointer, useRaf, useResize, useScroll, useKey } from '../../services/index.js';\nimport type {\n PointerServiceInterface,\n RafServiceInterface,\n ResizeServiceInterface,\n ScrollServiceInterface,\n KeyServiceInterface,\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};\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} & 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.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { Base, BaseConfig } from './index.js';
1
+ import type { Base, BaseConfig, BaseConstructor } from './index.js';
2
2
  /**
3
3
  * Add a task to the main queue.
4
4
  */
5
- export declare function addToQueue(fn: () => unknown): void;
5
+ export declare function addToQueue(fn: () => unknown): Promise<unknown>;
6
6
  /**
7
7
  * Get a list of elements based on the name of a component.
8
8
  *
@@ -24,7 +24,12 @@ export declare function eventIsDefinedInConfig(event: string, config: BaseConfig
24
24
  export declare function eventIsNative(event: string, element: HTMLElement): boolean;
25
25
  /**
26
26
  * Get the target of a given event.
27
- *
28
- * @todo Return false in v3 if event is not defined or not native to prevent adding a listener.
29
27
  */
30
- export declare function getEventTarget(instance: Base, event: string, config: BaseConfig): Base | Base['$el'];
28
+ export declare function getEventTarget(instance: Base, event: string, config: BaseConfig): Base['$el'];
29
+ /**
30
+ * Get all mounted instances or the ones from a given component.
31
+ */
32
+ export declare function getInstances(): Set<Base>;
33
+ export declare function getInstances<T extends BaseConstructor = BaseConstructor>(ctor: T): Set<InstanceType<T>>;
34
+ export declare function addInstance(instance: Base): void;
35
+ export declare function deleteInstance(instance: Base): void;
package/Base/utils.js CHANGED
@@ -1,33 +1,35 @@
1
- import { isArray, isDefined, isDev, SmartQueue } from "../utils/index.js";
1
+ import { isArray, isDefined, SmartQueue } from "../utils/index.js";
2
2
  import { features } from "./features.js";
3
3
  let queue;
4
4
  function addToQueue(fn) {
5
- if (!features.get("asyncChildren")) {
5
+ if (features.get("blocking")) {
6
6
  fn();
7
7
  return;
8
8
  }
9
9
  if (!queue) {
10
10
  queue = new SmartQueue();
11
11
  }
12
- queue.add(fn);
12
+ return queue.add(fn);
13
13
  }
14
14
  const selectors = /* @__PURE__ */ new Map();
15
15
  const separator = " ";
16
16
  function getSelector(nameOrSelector) {
17
- if (!selectors.has(nameOrSelector)) {
17
+ const { component } = features.get("attributes");
18
+ const key = component + nameOrSelector;
19
+ if (!selectors.has(key)) {
18
20
  const parts = [
19
21
  // Single selector
20
- `[data-component="${nameOrSelector}"]`,
22
+ `[${component}="${nameOrSelector}"]`,
21
23
  // Selector in the middle of a list of selectors
22
- `[data-component*="${separator}${nameOrSelector}${separator}"]`,
24
+ `[${component}*="${separator}${nameOrSelector}${separator}"]`,
23
25
  // Selector at the end of a list of selectors
24
- `[data-component$="${separator}${nameOrSelector}"]`,
26
+ `[${component}$="${separator}${nameOrSelector}"]`,
25
27
  // Selector at the beginning of a list of selectors
26
- `[data-component^="${nameOrSelector}${separator}"]`
28
+ `[${component}^="${nameOrSelector}${separator}"]`
27
29
  ];
28
- selectors.set(nameOrSelector, parts.join(","));
30
+ selectors.set(key, parts.join(","));
29
31
  }
30
- return selectors.get(nameOrSelector);
32
+ return selectors.get(key);
31
33
  }
32
34
  function getComponentElements(nameOrSelector, element = document) {
33
35
  const selector = getSelector(nameOrSelector);
@@ -36,7 +38,7 @@ function getComponentElements(nameOrSelector, element = document) {
36
38
  elements = Array.from(element.querySelectorAll(selector));
37
39
  } catch {
38
40
  }
39
- if (elements.length === 0) {
41
+ if (elements.length === 0 && nameOrSelector[0] === nameOrSelector[0].toLowerCase()) {
40
42
  elements = Array.from(element.querySelectorAll(nameOrSelector));
41
43
  }
42
44
  return elements;
@@ -48,26 +50,38 @@ function eventIsNative(event, element) {
48
50
  return isDefined(element[`on${event}`]);
49
51
  }
50
52
  function getEventTarget(instance, event, config) {
51
- if (eventIsDefinedInConfig(event, config)) {
52
- return instance;
53
- }
54
- if (eventIsNative(event, instance.$el)) {
53
+ if (eventIsDefinedInConfig(event, config) || eventIsNative(event, instance.$el)) {
55
54
  return instance.$el;
56
55
  }
57
- if (isDev) {
58
- console.warn(
59
- `[${config.name}]`,
60
- `The "${event}" event is missing from the configuration and is not a native`,
61
- `event for the root element of type \`${instance.$el.constructor.name}\`.`
62
- );
56
+ }
57
+ const instances = /* @__PURE__ */ new Set();
58
+ function getInstances(ctor) {
59
+ if (isDefined(ctor)) {
60
+ const filteredInstances = /* @__PURE__ */ new Set();
61
+ for (const instance of instances) {
62
+ if (instance instanceof ctor) {
63
+ filteredInstances.add(instance);
64
+ }
65
+ }
66
+ return filteredInstances;
67
+ } else {
68
+ return new Set(instances);
63
69
  }
64
- return instance;
70
+ }
71
+ function addInstance(instance) {
72
+ instances.add(instance);
73
+ }
74
+ function deleteInstance(instance) {
75
+ instances.delete(instance);
65
76
  }
66
77
  export {
78
+ addInstance,
67
79
  addToQueue,
80
+ deleteInstance,
68
81
  eventIsDefinedInConfig,
69
82
  eventIsNative,
70
83
  getComponentElements,
71
- getEventTarget
84
+ getEventTarget,
85
+ getInstances
72
86
  };
73
87
  //# sourceMappingURL=utils.js.map
package/Base/utils.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/Base/utils.ts"],
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,SAAS,SAAS,WAAW,OAAO,kBAAkB;AAEtD,SAAS,gBAAgB;AAEzB,IAAI;AAKG,SAAS,WAAW,IAAyB;AAClD,MAAI,CAAC,SAAS,IAAI,eAAe,GAAG;AAClC,OAAG;AACH;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,WAAW;AAAA,EACzB;AAEA,QAAM,IAAI,EAAE;AACd;AAEA,MAAM,YAAY,oBAAI,IAAI;AAG1B,MAAM,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,SAAO,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,KAAK;AAC7D;AAKO,SAAS,cAAc,OAAe,SAA+B;AAC1E,SAAO,UAAU,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,OAAO;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;",
4
+ "sourcesContent": ["import { isArray, isDefined, isDev, SmartQueue } from '../utils/index.js';\nimport type { Base, BaseConfig, BaseConstructor } 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) {\n if (features.get('blocking')) {\n fn();\n return;\n }\n\n if (!queue) {\n queue = new SmartQueue();\n }\n\n return 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 const { component } = features.get('attributes');\n const key = component + nameOrSelector;\n\n if (!selectors.has(key)) {\n const parts = [\n // Single selector\n `[${component}=\"${nameOrSelector}\"]`,\n // Selector in the middle of a list of selectors\n `[${component}*=\"${separator}${nameOrSelector}${separator}\"]`,\n // Selector at the end of a list of selectors\n `[${component}$=\"${separator}${nameOrSelector}\"]`,\n // Selector at the beginning of a list of selectors\n `[${component}^=\"${nameOrSelector}${separator}\"]`,\n ];\n selectors.set(key, parts.join(','));\n }\n\n return selectors.get(key);\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, and if the selector does not\n // start with an uppercase letter, matching a component's name, try a classic DOM selector.\n if (elements.length === 0 && nameOrSelector[0] === nameOrSelector[0].toLowerCase()) {\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 */\nexport function getEventTarget(\n instance: Base,\n event: string,\n config: BaseConfig,\n): Base['$el'] {\n if (eventIsDefinedInConfig(event, config) || eventIsNative(event, instance.$el)) {\n return instance.$el;\n }\n}\n\nconst instances = new Set<Base>();\n\n/**\n * Get all mounted instances or the ones from a given component.\n */\nexport function getInstances(): Set<Base>;\nexport function getInstances<T extends BaseConstructor = BaseConstructor>(\n ctor: T,\n): Set<InstanceType<T>>;\nexport function getInstances<T extends BaseConstructor = BaseConstructor>(\n ctor?: T,\n): Set<InstanceType<T>> | Set<Base> {\n if (isDefined(ctor)) {\n const filteredInstances = new Set<InstanceType<T>>();\n for (const instance of instances) {\n if (instance instanceof ctor) {\n filteredInstances.add(instance as InstanceType<T>);\n }\n }\n return filteredInstances;\n } else {\n return new Set(instances);\n }\n}\n\nexport function addInstance(instance: Base) {\n instances.add(instance);\n}\n\nexport function deleteInstance(instance: Base) {\n instances.delete(instance);\n}\n"],
5
+ "mappings": "AAAA,SAAS,SAAS,WAAkB,kBAAkB;AAEtD,SAAS,gBAAgB;AAEzB,IAAI;AAKG,SAAS,WAAW,IAAmB;AAC5C,MAAI,SAAS,IAAI,UAAU,GAAG;AAC5B,OAAG;AACH;AAAA,EACF;AAEA,MAAI,CAAC,OAAO;AACV,YAAQ,IAAI,WAAW;AAAA,EACzB;AAEA,SAAO,MAAM,IAAI,EAAE;AACrB;AAEA,MAAM,YAAY,oBAAI,IAAI;AAG1B,MAAM,YAAY;AAKlB,SAAS,YAAY,gBAAgC;AACnD,QAAM,EAAE,UAAU,IAAI,SAAS,IAAI,YAAY;AAC/C,QAAM,MAAM,YAAY;AAExB,MAAI,CAAC,UAAU,IAAI,GAAG,GAAG;AACvB,UAAM,QAAQ;AAAA;AAAA,MAEZ,IAAI,SAAS,KAAK,cAAc;AAAA;AAAA,MAEhC,IAAI,SAAS,MAAM,SAAS,GAAG,cAAc,GAAG,SAAS;AAAA;AAAA,MAEzD,IAAI,SAAS,MAAM,SAAS,GAAG,cAAc;AAAA;AAAA,MAE7C,IAAI,SAAS,MAAM,cAAc,GAAG,SAAS;AAAA,IAC/C;AACA,cAAU,IAAI,KAAK,MAAM,KAAK,GAAG,CAAC;AAAA,EACpC;AAEA,SAAO,UAAU,IAAI,GAAG;AAC1B;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;AAIT,MAAI,SAAS,WAAW,KAAK,eAAe,CAAC,MAAM,eAAe,CAAC,EAAE,YAAY,GAAG;AAClF,eAAW,MAAM,KAAK,QAAQ,iBAAiB,cAAc,CAAC;AAAA,EAChE;AAEA,SAAO;AACT;AAKO,SAAS,uBAAuB,OAAe,QAA6B;AACjF,SAAO,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,KAAK;AAC7D;AAKO,SAAS,cAAc,OAAe,SAA+B;AAC1E,SAAO,UAAU,QAAQ,KAAK,KAAK,EAAE,CAAC;AACxC;AAKO,SAAS,eACd,UACA,OACA,QACa;AACb,MAAI,uBAAuB,OAAO,MAAM,KAAK,cAAc,OAAO,SAAS,GAAG,GAAG;AAC/E,WAAO,SAAS;AAAA,EAClB;AACF;AAEA,MAAM,YAAY,oBAAI,IAAU;AASzB,SAAS,aACd,MACkC;AAClC,MAAI,UAAU,IAAI,GAAG;AACnB,UAAM,oBAAoB,oBAAI,IAAqB;AACnD,eAAW,YAAY,WAAW;AAChC,UAAI,oBAAoB,MAAM;AAC5B,0BAAkB,IAAI,QAA2B;AAAA,MACnD;AAAA,IACF;AACA,WAAO;AAAA,EACT,OAAO;AACL,WAAO,IAAI,IAAI,SAAS;AAAA,EAC1B;AACF;AAEO,SAAS,YAAY,UAAgB;AAC1C,YAAU,IAAI,QAAQ;AACxB;AAEO,SAAS,eAAe,UAAgB;AAC7C,YAAU,OAAO,QAAQ;AAC3B;",
6
6
  "names": []
7
7
  }
package/README.md CHANGED
@@ -1,9 +1,11 @@
1
- # JS Toolkit
1
+ # @studiometa/js-toolkit
2
2
 
3
- [![NPM Version](https://img.shields.io/npm/v/@studiometa/js-toolkit.svg?style=flat-square)](https://www.npmjs.com/package/@studiometa/js-toolkit/)
4
- [![Size](https://img.shields.io/bundlephobia/minzip/@studiometa/js-toolkit?label=size&style=flat-square)](https://bundlephobia.com/package/@studiometa/js-toolkit)
5
- [![Dependency Status](https://img.shields.io/librariesio/release/npm/@studiometa/js-toolkit?style=flat-square)](https://david-dm.org/studiometa/js-toolkit)
6
- ![Codecov](https://img.shields.io/codecov/c/github/studiometa/js-toolkit?style=flat-square)
3
+ [![NPM Version](https://img.shields.io/npm/v/@studiometa/js-toolkit.svg?style=flat&colorB=3e63dd&colorA=414853)](https://www.npmjs.com/package/@studiometa/js-toolkit/)
4
+ [![NPM Next Version](https://img.shields.io/npm/v/@studiometa/js-toolkit/next?style=flat&colorB=3e63dd&colorA=414853)](https://www.npmjs.com/package/@studiometa/js-toolkit/v/next)
5
+ [![Downloads](https://img.shields.io/npm/dm/@studiometa/js-toolkit?style=flat&colorB=3e63dd&colorA=414853)](https://www.npmjs.com/package/@studiometa/js-toolkit/)
6
+ [![Size](https://img.shields.io/bundlephobia/minzip/@studiometa/js-toolkit?style=flat&colorB=3e63dd&colorA=414853&label=size)](https://bundlephobia.com/package/@studiometa/js-toolkit)
7
+ [![Dependency Status](https://img.shields.io/librariesio/release/npm/@studiometa/js-toolkit?style=flat&colorB=3e63dd&colorA=414853)](https://david-dm.org/studiometa/js-toolkit)
8
+ ![Codecov](https://img.shields.io/codecov/c/github/studiometa/js-toolkit?style=flat&colorB=3e63dd&colorA=414853)
7
9
 
8
10
  > A JavaScript data-attributes driven micro-framework shipped with plenty of useful utility functions to boost your project.
9
11
 
@@ -26,7 +28,106 @@ This project is a JavaScript micro-framework (along with its utility functions)
26
28
  - Initializing components in the right place at the right time
27
29
  - Defining dependencies between components
28
30
 
29
- Visit [js-toolkit.studiometa.dev](https://js-toolkit.studiometa.dev) to learn more.
31
+ Visit [js-toolkit.studiometa.dev](https://js-toolkit.studiometa.dev) to learn more, or jump directly to [ui.studiometa.dev](https://ui.studiometa.dev) to discover existing components.
32
+
33
+ ## Quick overview
34
+
35
+ This framework lets you define components as classes, and bind them to the DOM with `data-…` attributes. For example, here is how a `Counter` component would be defined in JavaScript:
36
+
37
+ ```js
38
+ import { Base } from '@studiometa/js-toolkit';
39
+
40
+ export default class Counter extends Base {
41
+ static config = {
42
+ name: 'Counter',
43
+ refs: ['add', 'remove', 'count'],
44
+ };
45
+
46
+ get counter() {
47
+ return this.$refs.count.valueAsNumber;
48
+ }
49
+
50
+ set counter(value) {
51
+ this.$refs.count.value = value;
52
+ }
53
+
54
+ onAddClick() {
55
+ this.counter += 1;
56
+ }
57
+
58
+ onRemoveClick() {
59
+ this.counter -= 1;
60
+ }
61
+ }
62
+ ```
63
+
64
+ And its accompanying HTML would be sprinkled with `data-…` attributes to bind elements from the DOM to the JavaScript class.
65
+
66
+ ```html
67
+ <div data-component="Counter">
68
+ <button data-ref="add">Add</button>
69
+ <button data-ref="remove">Remove</button>
70
+ <input data-ref="count" type="number" value="0" />
71
+ </div>
72
+ ```
73
+
74
+ You can define options that can be specified with `data-option-...` attributes as well. First in JavaScript:
75
+
76
+ ```diff
77
+ class Counter extends Base {
78
+ static config = {
79
+ name: 'Counter',
80
+ refs: ['add', 'remove', 'count'],
81
+ + options: {
82
+ + step: {
83
+ + type: Number,
84
+ + default: 1,
85
+ + },
86
+ + },
87
+ };
88
+
89
+ onAddClick() {
90
+ - this.counter += 1;
91
+ + this.counter += this.$options.step;
92
+ }
93
+
94
+ onRemoveClick() {
95
+ - this.counter -= 1;
96
+ + this.counter -= this.$options.step;
97
+ }
98
+ }
99
+ ```
100
+
101
+ And then adjust it as you wish in your HTML:
102
+
103
+ ```diff
104
+ - <div data-component="Counter">
105
+ + <div data-component="Counter" data-option-step="2">
106
+ <button data-ref="add">Add</button>
107
+ <button data-ref="remove">Remove</button>
108
+ <input data-ref="count" type="number" value="0">
109
+ </div>
110
+ ```
111
+
112
+ The framework also offers a way to instantiate a root component as an application, with child components as dependencies:
113
+
114
+ ```js
115
+ import { Base, createApp } from '@studiometa/js-toolkit';
116
+ import Counter from './components/Counter.js';
117
+
118
+ class App extends Base {
119
+ static config = {
120
+ name: 'App',
121
+ components: {
122
+ Counter,
123
+ },
124
+ };
125
+ }
126
+
127
+ export default createApp(App);
128
+ ```
129
+
130
+ Visit our ["Getting Started" guide](https://js-toolkit.studiometa.dev/guide/) to learn more and try the above component by visiting [the playground](https://ui.studiometa.dev/-/play/#script=eNqVkjFPwzAQhff%2BijcguRVtEGurSpTuDKyIwdiXYprYkX2pQFX%2BO7bjlg6A1EiJndO97873bNrOecYRjzLQHMqTZNp0HQbU3rUQD4F7bVxLLO8%2BwoKda%2FaGxWoyUY0MAVvXWyYP%2BmSyOmQOjhMgsGSjoJytzQ7rHAOsbGkJUVRinoOe6rDEi5BaizmEp9YdKO1UShOvY5br2DgbE0dSqkDdzx%2FAX11kP%2FXtG%2FlRkh5NtewbXuL%2BFBvGzRC%2FQzwHsCOOfeaOprMC9MS9t%2BB3E6qb1GCVM6qDbHrahLHKKiESIVwQcsYJ87s%2BjiOvZ72zG623jVH7cwNZWZi4XRdSGUKVzn6hfs4j%2Bwew%2BBsQEaOVyfbrbIyKYqFy8SJZsnzhTzG5TDstcdyp2umSTeM7W30DtazCdQ%3D%3D&html=eNqFkEsKwzAMRPc9hdDe5EOXcaD0Br2BEyvBkMjGkUN7%2Byb1ogkUupJAmjfMNNatYI0Y1fs5eCYWjXefWChiPvggzrNahILGGqGfzLJoDOoKw0RPGM22YnsBaLok4jnLIg0ajbUHQQ3dqLopkarKEuLmYslie7O2KbL0NyXS7Ff6D3p8%2Fk4sxyHJAdXv0RDkFUgjp7nbY65mQ2ksTw7R8aiqPBwvJF%2BfS1NstbVv4jxoZA%3D%3D&style=eNpLyk%2BpVKjmUlAoSExJycxLt1IwLErNteaqBQBpsgf8). Discover our existing library of components by checking out the [@studiometa/ui](https://github.com/studiometa/ui) package.
30
131
 
31
132
  ## Contributing
32
133
 
@@ -7,7 +7,7 @@ export * from './withIntersectionObserver.js';
7
7
  export * from './withMountOnMediaQuery.js';
8
8
  export * from './withMountWhenInView.js';
9
9
  export * from './withMountWhenPrefersMotion.js';
10
+ export * from './withName.js';
10
11
  export * from './withRelativePointer.js';
11
12
  export * from './withResponsiveOptions.js';
12
13
  export * from './withScrolledInView/index.js';
13
- export * from './withVue2.js';
@@ -7,8 +7,8 @@ export * from "./withIntersectionObserver.js";
7
7
  export * from "./withMountOnMediaQuery.js";
8
8
  export * from "./withMountWhenInView.js";
9
9
  export * from "./withMountWhenPrefersMotion.js";
10
+ export * from "./withName.js";
10
11
  export * from "./withRelativePointer.js";
11
12
  export * from "./withResponsiveOptions.js";
12
13
  export * from "./withScrolledInView/index.js";
13
- export * from "./withVue2.js";
14
14
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/js-toolkit/decorators/index.ts"],
4
- "sourcesContent": ["export * from './withBreakpointManager.js';\nexport * from './withBreakpointObserver.js';\nexport * from './withDrag.js';\nexport * from './withExtraConfig.js';\nexport * from './withFreezedOptions.js';\nexport * from './withIntersectionObserver.js';\nexport * from './withMountOnMediaQuery.js';\nexport * from './withMountWhenInView.js';\nexport * from './withMountWhenPrefersMotion.js';\nexport * from './withRelativePointer.js';\nexport * from './withResponsiveOptions.js';\nexport * from './withScrolledInView/index.js';\nexport * from './withVue2.js';\n"],
4
+ "sourcesContent": ["export * from './withBreakpointManager.js';\nexport * from './withBreakpointObserver.js';\nexport * from './withDrag.js';\nexport * from './withExtraConfig.js';\nexport * from './withFreezedOptions.js';\nexport * from './withIntersectionObserver.js';\nexport * from './withMountOnMediaQuery.js';\nexport * from './withMountWhenInView.js';\nexport * from './withMountWhenPrefersMotion.js';\nexport * from './withName.js';\nexport * from './withRelativePointer.js';\nexport * from './withResponsiveOptions.js';\nexport * from './withScrolledInView/index.js';\n"],
5
5
  "mappings": "AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
6
6
  "names": []
7
7
  }