@studiometa/ui 1.0.0-alpha.0 → 1.0.0-alpha.11

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 (273) hide show
  1. package/README.md +6 -4
  2. package/atoms/Action/Action.d.ts +4 -6
  3. package/atoms/Action/Action.js +25 -60
  4. package/atoms/Action/Action.js.map +2 -2
  5. package/atoms/Action/ActionEvent.d.ts +55 -0
  6. package/atoms/Action/ActionEvent.js +130 -0
  7. package/atoms/Action/ActionEvent.js.map +7 -0
  8. package/atoms/AnchorScrollTo/AnchorScrollTo.d.ts +3 -3
  9. package/atoms/AnchorScrollTo/AnchorScrollTo.js +1 -3
  10. package/atoms/AnchorScrollTo/AnchorScrollTo.js.map +2 -2
  11. package/atoms/Data/DataBind.d.ts +2 -2
  12. package/atoms/Data/DataBind.js +22 -12
  13. package/atoms/Data/DataBind.js.map +2 -2
  14. package/atoms/Data/DataComputed.js +3 -3
  15. package/atoms/Data/DataComputed.js.map +2 -2
  16. package/atoms/Data/DataEffect.js +2 -2
  17. package/atoms/Data/DataEffect.js.map +2 -2
  18. package/atoms/Data/DataModel.d.ts +1 -0
  19. package/atoms/Data/DataModel.js +13 -3
  20. package/atoms/Data/DataModel.js.map +2 -2
  21. package/atoms/Figure/AbstractFigure.d.ts +41 -0
  22. package/atoms/Figure/AbstractFigure.js +65 -0
  23. package/atoms/Figure/AbstractFigure.js.map +7 -0
  24. package/atoms/Figure/AbstractFigureDynamic.d.ts +29 -0
  25. package/atoms/Figure/AbstractFigureDynamic.js +48 -0
  26. package/atoms/Figure/AbstractFigureDynamic.js.map +7 -0
  27. package/atoms/Figure/Figure.d.ts +4 -35
  28. package/atoms/Figure/Figure.js +5 -68
  29. package/atoms/Figure/Figure.js.map +2 -2
  30. package/atoms/Figure/FigureShopify.d.ts +23 -0
  31. package/atoms/Figure/FigureShopify.js +38 -0
  32. package/atoms/Figure/FigureShopify.js.map +7 -0
  33. package/atoms/Figure/FigureTwicpics.d.ts +3 -19
  34. package/atoms/Figure/FigureTwicpics.js +10 -32
  35. package/atoms/Figure/FigureTwicpics.js.map +2 -2
  36. package/atoms/Figure/index.d.ts +1 -0
  37. package/atoms/Figure/index.js +1 -0
  38. package/atoms/Figure/index.js.map +2 -2
  39. package/atoms/Figure/utils.d.ts +8 -0
  40. package/atoms/Figure/utils.js +15 -0
  41. package/atoms/Figure/utils.js.map +7 -0
  42. package/atoms/FigureVideo/FigureVideo.js +1 -1
  43. package/atoms/FigureVideo/FigureVideo.js.map +1 -1
  44. package/atoms/FigureVideo/FigureVideoTwicpics.js +1 -1
  45. package/atoms/FigureVideo/FigureVideoTwicpics.js.map +1 -1
  46. package/atoms/LazyInclude/LazyInclude.d.ts +3 -1
  47. package/atoms/LazyInclude/LazyInclude.js +1 -1
  48. package/atoms/LazyInclude/LazyInclude.js.map +2 -2
  49. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.d.ts +1 -1
  50. package/atoms/ScrollAnimation/ScrollAnimationWithEase.d.ts +1 -1
  51. package/decorators/withTransition.d.ts +1 -0
  52. package/decorators/withTransition.js +47 -23
  53. package/decorators/withTransition.js.map +2 -2
  54. package/molecules/Accordion/AccordionCore.d.ts +6 -2
  55. package/molecules/Accordion/AccordionCore.js +2 -2
  56. package/molecules/Accordion/AccordionCore.js.map +2 -2
  57. package/molecules/AnchorNav/AnchorNav.d.ts +6 -2
  58. package/molecules/AnchorNav/AnchorNav.js +4 -4
  59. package/molecules/AnchorNav/AnchorNav.js.map +2 -2
  60. package/molecules/AnchorNav/AnchorNavLink.d.ts +1 -1
  61. package/molecules/Menu/Menu.d.ts +11 -4
  62. package/molecules/Menu/Menu.js +7 -9
  63. package/molecules/Menu/Menu.js.map +2 -2
  64. package/molecules/Menu/MenuBtn.d.ts +9 -3
  65. package/molecules/Menu/MenuBtn.js +3 -3
  66. package/molecules/Menu/MenuBtn.js.map +2 -2
  67. package/molecules/Menu/MenuList.d.ts +1 -1
  68. package/molecules/Slider/Slider.d.ts +6 -2
  69. package/molecules/Slider/Slider.js +2 -2
  70. package/molecules/Slider/Slider.js.map +2 -2
  71. package/molecules/Slider/SliderDots.d.ts +5 -2
  72. package/molecules/Slider/SliderDots.js +1 -1
  73. package/molecules/Slider/SliderDots.js.map +2 -2
  74. package/molecules/Slider/SliderDrag.d.ts +3 -1
  75. package/molecules/Slider/SliderDrag.js +1 -1
  76. package/molecules/Slider/SliderDrag.js.map +2 -2
  77. package/molecules/Sticky/Sticky.d.ts +3 -1
  78. package/molecules/Sticky/Sticky.js +1 -1
  79. package/molecules/Sticky/Sticky.js.map +2 -2
  80. package/molecules/Tabs/Tabs.d.ts +4 -1
  81. package/molecules/Tabs/Tabs.js +1 -1
  82. package/molecules/Tabs/Tabs.js.map +2 -2
  83. package/molecules/index.d.ts +2 -3
  84. package/molecules/index.js +2 -3
  85. package/molecules/index.js.map +2 -2
  86. package/organisms/Frame/Frame.d.ts +11 -3
  87. package/organisms/Frame/Frame.js +14 -16
  88. package/organisms/Frame/Frame.js.map +2 -2
  89. package/organisms/Frame/FrameTarget.d.ts +1 -1
  90. package/package.json +2 -2
  91. package/primitives/Transition/Transition.d.ts +1 -1
  92. package/atoms/Action/Action.cjs +0 -115
  93. package/atoms/Action/Action.cjs.map +0 -7
  94. package/atoms/Action/Target.cjs +0 -35
  95. package/atoms/Action/Target.cjs.map +0 -7
  96. package/atoms/Action/index.cjs +0 -22
  97. package/atoms/Action/index.cjs.map +0 -7
  98. package/atoms/AnchorScrollTo/AnchorScrollTo.cjs +0 -52
  99. package/atoms/AnchorScrollTo/AnchorScrollTo.cjs.map +0 -7
  100. package/atoms/AnchorScrollTo/index.cjs +0 -21
  101. package/atoms/AnchorScrollTo/index.cjs.map +0 -7
  102. package/atoms/CircularMarquee/CircularMarquee.cjs +0 -69
  103. package/atoms/CircularMarquee/CircularMarquee.cjs.map +0 -7
  104. package/atoms/CircularMarquee/index.cjs +0 -21
  105. package/atoms/CircularMarquee/index.cjs.map +0 -7
  106. package/atoms/Cursor/Cursor.cjs +0 -137
  107. package/atoms/Cursor/Cursor.cjs.map +0 -7
  108. package/atoms/Cursor/index.cjs +0 -21
  109. package/atoms/Cursor/index.cjs.map +0 -7
  110. package/atoms/Data/DataBind.cjs +0 -124
  111. package/atoms/Data/DataBind.cjs.map +0 -7
  112. package/atoms/Data/DataComputed.cjs +0 -49
  113. package/atoms/Data/DataComputed.cjs.map +0 -7
  114. package/atoms/Data/DataEffect.cjs +0 -47
  115. package/atoms/Data/DataEffect.cjs.map +0 -7
  116. package/atoms/Data/DataModel.cjs +0 -38
  117. package/atoms/Data/DataModel.cjs.map +0 -7
  118. package/atoms/Data/index.cjs +0 -24
  119. package/atoms/Data/index.cjs.map +0 -7
  120. package/atoms/Data/utils.cjs +0 -46
  121. package/atoms/Data/utils.cjs.map +0 -7
  122. package/atoms/Figure/Figure.cjs +0 -105
  123. package/atoms/Figure/Figure.cjs.map +0 -7
  124. package/atoms/Figure/FigureTwicpics.cjs +0 -123
  125. package/atoms/Figure/FigureTwicpics.cjs.map +0 -7
  126. package/atoms/Figure/index.cjs +0 -22
  127. package/atoms/Figure/index.cjs.map +0 -7
  128. package/atoms/FigureVideo/FigureVideo.cjs +0 -132
  129. package/atoms/FigureVideo/FigureVideo.cjs.map +0 -7
  130. package/atoms/FigureVideo/FigureVideoTwicpics.cjs +0 -153
  131. package/atoms/FigureVideo/FigureVideoTwicpics.cjs.map +0 -7
  132. package/atoms/FigureVideo/index.cjs +0 -22
  133. package/atoms/FigureVideo/index.cjs.map +0 -7
  134. package/atoms/LargeText/LargeText.cjs +0 -109
  135. package/atoms/LargeText/LargeText.cjs.map +0 -7
  136. package/atoms/LargeText/index.cjs +0 -21
  137. package/atoms/LargeText/index.cjs.map +0 -7
  138. package/atoms/LazyInclude/LazyInclude.cjs +0 -78
  139. package/atoms/LazyInclude/LazyInclude.cjs.map +0 -7
  140. package/atoms/LazyInclude/index.cjs +0 -21
  141. package/atoms/LazyInclude/index.cjs.map +0 -7
  142. package/atoms/Prefetch/AbstractPrefetch.cjs +0 -86
  143. package/atoms/Prefetch/AbstractPrefetch.cjs.map +0 -7
  144. package/atoms/Prefetch/PrefetchWhenOver.cjs +0 -42
  145. package/atoms/Prefetch/PrefetchWhenOver.cjs.map +0 -7
  146. package/atoms/Prefetch/PrefetchWhenVisible.cjs +0 -43
  147. package/atoms/Prefetch/PrefetchWhenVisible.cjs.map +0 -7
  148. package/atoms/Prefetch/index.cjs +0 -23
  149. package/atoms/Prefetch/index.cjs.map +0 -7
  150. package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs +0 -95
  151. package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs.map +0 -7
  152. package/atoms/ScrollAnimation/ScrollAnimation.cjs +0 -44
  153. package/atoms/ScrollAnimation/ScrollAnimation.cjs.map +0 -7
  154. package/atoms/ScrollAnimation/ScrollAnimationChild.cjs +0 -84
  155. package/atoms/ScrollAnimation/ScrollAnimationChild.cjs.map +0 -7
  156. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs +0 -37
  157. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs.map +0 -7
  158. package/atoms/ScrollAnimation/ScrollAnimationParent.cjs +0 -50
  159. package/atoms/ScrollAnimation/ScrollAnimationParent.cjs.map +0 -7
  160. package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs +0 -37
  161. package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs.map +0 -7
  162. package/atoms/ScrollAnimation/animationScrollWithEase.cjs +0 -59
  163. package/atoms/ScrollAnimation/animationScrollWithEase.cjs.map +0 -7
  164. package/atoms/ScrollAnimation/index.cjs +0 -27
  165. package/atoms/ScrollAnimation/index.cjs.map +0 -7
  166. package/atoms/ScrollReveal/ScrollReveal.cjs +0 -81
  167. package/atoms/ScrollReveal/ScrollReveal.cjs.map +0 -7
  168. package/atoms/ScrollReveal/index.cjs +0 -21
  169. package/atoms/ScrollReveal/index.cjs.map +0 -7
  170. package/atoms/index.cjs +0 -32
  171. package/atoms/index.cjs.map +0 -7
  172. package/decorators/index.cjs +0 -22
  173. package/decorators/index.cjs.map +0 -7
  174. package/decorators/withDeprecation.cjs +0 -47
  175. package/decorators/withDeprecation.cjs.map +0 -7
  176. package/decorators/withTransition.cjs +0 -86
  177. package/decorators/withTransition.cjs.map +0 -7
  178. package/index.cjs +0 -25
  179. package/index.cjs.map +0 -7
  180. package/molecules/Accordion/Accordion.cjs +0 -36
  181. package/molecules/Accordion/Accordion.cjs.map +0 -7
  182. package/molecules/Accordion/AccordionCore.cjs +0 -58
  183. package/molecules/Accordion/AccordionCore.cjs.map +0 -7
  184. package/molecules/Accordion/AccordionItem.cjs +0 -206
  185. package/molecules/Accordion/AccordionItem.cjs.map +0 -7
  186. package/molecules/Accordion/index.cjs +0 -22
  187. package/molecules/Accordion/index.cjs.map +0 -7
  188. package/molecules/AnchorNav/AnchorNav.cjs +0 -63
  189. package/molecules/AnchorNav/AnchorNav.cjs.map +0 -7
  190. package/molecules/AnchorNav/AnchorNavLink.cjs +0 -40
  191. package/molecules/AnchorNav/AnchorNavLink.cjs.map +0 -7
  192. package/molecules/AnchorNav/AnchorNavTarget.cjs +0 -35
  193. package/molecules/AnchorNav/AnchorNavTarget.cjs.map +0 -7
  194. package/molecules/AnchorNav/index.cjs +0 -23
  195. package/molecules/AnchorNav/index.cjs.map +0 -7
  196. package/molecules/Menu/Menu.cjs +0 -177
  197. package/molecules/Menu/Menu.cjs.map +0 -7
  198. package/molecules/Menu/MenuBtn.cjs +0 -66
  199. package/molecules/Menu/MenuBtn.cjs.map +0 -7
  200. package/molecules/Menu/MenuList.cjs +0 -165
  201. package/molecules/Menu/MenuList.cjs.map +0 -7
  202. package/molecules/Menu/index.cjs +0 -23
  203. package/molecules/Menu/index.cjs.map +0 -7
  204. package/molecules/Modal/Modal.cjs +0 -219
  205. package/molecules/Modal/Modal.cjs.map +0 -7
  206. package/molecules/Modal/ModalWithTransition.cjs +0 -69
  207. package/molecules/Modal/ModalWithTransition.cjs.map +0 -7
  208. package/molecules/Modal/index.cjs +0 -22
  209. package/molecules/Modal/index.cjs.map +0 -7
  210. package/molecules/Panel/Panel.cjs +0 -137
  211. package/molecules/Panel/Panel.cjs.map +0 -7
  212. package/molecules/Panel/index.cjs +0 -21
  213. package/molecules/Panel/index.cjs.map +0 -7
  214. package/molecules/Slider/AbstractSliderChild.cjs +0 -88
  215. package/molecules/Slider/AbstractSliderChild.cjs.map +0 -7
  216. package/molecules/Slider/Slider.cjs +0 -404
  217. package/molecules/Slider/Slider.cjs.map +0 -7
  218. package/molecules/Slider/SliderBtn.cjs +0 -71
  219. package/molecules/Slider/SliderBtn.cjs.map +0 -7
  220. package/molecules/Slider/SliderCount.cjs +0 -44
  221. package/molecules/Slider/SliderCount.cjs.map +0 -7
  222. package/molecules/Slider/SliderDots.cjs +0 -64
  223. package/molecules/Slider/SliderDots.cjs.map +0 -7
  224. package/molecules/Slider/SliderDrag.cjs +0 -66
  225. package/molecules/Slider/SliderDrag.cjs.map +0 -7
  226. package/molecules/Slider/SliderItem.cjs +0 -177
  227. package/molecules/Slider/SliderItem.cjs.map +0 -7
  228. package/molecules/Slider/SliderProgress.cjs +0 -49
  229. package/molecules/Slider/SliderProgress.cjs.map +0 -7
  230. package/molecules/Slider/index.cjs +0 -28
  231. package/molecules/Slider/index.cjs.map +0 -7
  232. package/molecules/Sticky/Sticky.cjs +0 -177
  233. package/molecules/Sticky/Sticky.cjs.map +0 -7
  234. package/molecules/Sticky/index.cjs +0 -21
  235. package/molecules/Sticky/index.cjs.map +0 -7
  236. package/molecules/TableOfContent/TableOfContent.cjs +0 -72
  237. package/molecules/TableOfContent/TableOfContent.cjs.map +0 -7
  238. package/molecules/TableOfContent/TableOfContentAnchor.cjs +0 -76
  239. package/molecules/TableOfContent/TableOfContentAnchor.cjs.map +0 -7
  240. package/molecules/TableOfContent/index.cjs +0 -22
  241. package/molecules/TableOfContent/index.cjs.map +0 -7
  242. package/molecules/Tabs/Tabs.cjs +0 -153
  243. package/molecules/Tabs/Tabs.cjs.map +0 -7
  244. package/molecules/Tabs/index.cjs +0 -21
  245. package/molecules/Tabs/index.cjs.map +0 -7
  246. package/molecules/index.cjs +0 -30
  247. package/molecules/index.cjs.map +0 -7
  248. package/organisms/Frame/Frame.cjs +0 -220
  249. package/organisms/Frame/Frame.cjs.map +0 -7
  250. package/organisms/Frame/FrameAnchor.cjs +0 -41
  251. package/organisms/Frame/FrameAnchor.cjs.map +0 -7
  252. package/organisms/Frame/FrameForm.cjs +0 -41
  253. package/organisms/Frame/FrameForm.cjs.map +0 -7
  254. package/organisms/Frame/FrameTarget.cjs +0 -114
  255. package/organisms/Frame/FrameTarget.cjs.map +0 -7
  256. package/organisms/Frame/index.cjs +0 -24
  257. package/organisms/Frame/index.cjs.map +0 -7
  258. package/organisms/index.cjs +0 -21
  259. package/organisms/index.cjs.map +0 -7
  260. package/primitives/Draggable/Draggable.cjs +0 -65
  261. package/primitives/Draggable/Draggable.cjs.map +0 -7
  262. package/primitives/Draggable/index.cjs +0 -21
  263. package/primitives/Draggable/index.cjs.map +0 -7
  264. package/primitives/Sentinel/Sentinel.cjs +0 -35
  265. package/primitives/Sentinel/Sentinel.cjs.map +0 -7
  266. package/primitives/Sentinel/index.cjs +0 -21
  267. package/primitives/Sentinel/index.cjs.map +0 -7
  268. package/primitives/Transition/Transition.cjs +0 -36
  269. package/primitives/Transition/Transition.cjs.map +0 -7
  270. package/primitives/Transition/index.cjs +0 -21
  271. package/primitives/Transition/index.cjs.map +0 -7
  272. package/primitives/index.cjs +0 -23
  273. package/primitives/index.cjs.map +0 -7
package/README.md CHANGED
@@ -1,9 +1,11 @@
1
1
  # @studiometa/ui
2
2
 
3
- [![NPM Version](https://img.shields.io/npm/v/@studiometa/ui.svg?style=flat-square)](https://www.npmjs.com/package/@studiometa/ui/)
4
- [![Size](https://img.shields.io/bundlephobia/minzip/@studiometa/ui?label=size&style=flat-square)](https://bundlephobia.com/package/@studiometa/ui)
5
- [![Dependency Status](https://img.shields.io/librariesio/release/npm/@studiometa/ui?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/ui.svg?style=flat&colorB=3e63dd&colorA=414853)](https://www.npmjs.com/package/@studiometa/ui/)
4
+ [![NPM Next Version](https://img.shields.io/npm/v/@studiometa/ui/next?style=flat&colorB=3e63dd&colorA=414853)](https://www.npmjs.com/package/@studiometa/ui/v/next)
5
+ [![Downloads](https://img.shields.io/npm/dm/@studiometa/ui?style=flat&colorB=3e63dd&colorA=414853)](https://www.npmjs.com/package/@studiometa/ui/)
6
+ [![Size](https://img.shields.io/bundlephobia/minzip/@studiometa/ui?style=flat&colorB=3e63dd&colorA=414853&label=size)](https://bundlephobia.com/package/@studiometa/ui)
7
+ [![Dependency Status](https://img.shields.io/librariesio/release/npm/@studiometa/ui?style=flat&colorB=3e63dd&colorA=414853)](https://david-dm.org/studiometa/js-toolkit)
8
+ ![Codecov](https://img.shields.io/codecov/c/github/studiometa/ui?style=flat&colorB=3e63dd&colorA=414853)
7
9
 
8
10
  > 📦 A set of opiniated, unstyled and accessible components based on [@studiometa/js-toolkit](https://github.com/studiometa/js-toolkit)
9
11
 
@@ -1,5 +1,6 @@
1
1
  import { Base } from '@studiometa/js-toolkit';
2
2
  import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';
3
+ import { ActionEvent } from './ActionEvent.js';
3
4
  export interface ActionProps extends BaseProps {
4
5
  $options: {
5
6
  on: string;
@@ -13,14 +14,11 @@ export interface ActionProps extends BaseProps {
13
14
  */
14
15
  export declare class Action<T extends BaseProps = BaseProps> extends Base<ActionProps & T> {
15
16
  static config: BaseConfig;
16
- get event(): string;
17
- get modifiers(): string[];
18
- get effect(): Function;
19
- get targets(): Record<string, Base<BaseProps>>[];
20
17
  /**
21
- * Run method on targeted components
18
+ * @private
22
19
  */
23
- handleEvent(event: Event): void;
20
+ __actionEvents: Set<ActionEvent<Action>>;
21
+ get actionEvents(): Set<ActionEvent<Action<BaseProps>>>;
24
22
  /**
25
23
  * Mounted
26
24
  */
@@ -1,6 +1,5 @@
1
- import { Base, getInstances } from "@studiometa/js-toolkit";
2
- const TARGET_REGEX = /([a-zA-Z]+)(\((.*)\))?/;
3
- const effectCache = /* @__PURE__ */ new Map();
1
+ import { Base } from "@studiometa/js-toolkit";
2
+ import { ActionEvent } from "./ActionEvent.js";
4
3
  class Action extends Base {
5
4
  static config = {
6
5
  name: "Action",
@@ -10,81 +9,47 @@ class Action extends Base {
10
9
  default: "click"
11
10
  },
12
11
  target: String,
13
- selector: String,
14
12
  effect: String
15
13
  }
16
14
  };
17
- get event() {
18
- const [event] = this.$options.on.split(".", 1);
19
- return event;
20
- }
21
- get modifiers() {
22
- return this.$options.on.split(".").slice(1);
23
- }
24
- get effect() {
25
- const { effect } = this.$options;
26
- if (!effectCache.has(effect)) {
27
- effectCache.set(effect, new Function("ctx", "event", "target", `return ${effect}`));
28
- }
29
- return effectCache.get(effect);
30
- }
31
- get targets() {
32
- const { target } = this.$options;
33
- const parts = target.split(" ").map((part) => {
34
- const [, name, , selector] = part.match(TARGET_REGEX) ?? [];
35
- return [name, selector];
36
- });
37
- const targets = [];
38
- for (const instance of getInstances()) {
39
- const { name } = instance.__config;
40
- for (const part of parts) {
41
- const shouldPush = part[0] === name && (!part[1] || part[1] && instance.$el.matches(part[1]));
42
- if (shouldPush) {
43
- targets.push({ [instance.$options.name]: instance });
44
- }
45
- }
46
- }
47
- return targets;
48
- }
49
15
  /**
50
- * Run method on targeted components
16
+ * @private
51
17
  */
52
- handleEvent(event) {
53
- const { targets, effect, modifiers } = this;
54
- if (modifiers.includes("prevent")) {
55
- event.preventDefault();
56
- }
57
- if (modifiers.includes("stop")) {
58
- event.stopPropagation();
18
+ __actionEvents;
19
+ get actionEvents() {
20
+ if (this.__actionEvents) {
21
+ return this.__actionEvents;
59
22
  }
60
- for (const target of targets) {
61
- try {
62
- const [name, currentTarget] = Object.entries(target).flat();
63
- const value = effect(target, event, currentTarget);
64
- if (typeof value === "function") {
65
- value(target, event, currentTarget);
66
- }
67
- } catch (err) {
68
- this.$warn(err);
23
+ const { on } = this.$options;
24
+ this.__actionEvents = /* @__PURE__ */ new Set();
25
+ for (const attribute of this.$el.attributes) {
26
+ if (attribute.name.includes("on:")) {
27
+ const name = attribute.name.split("on:").pop();
28
+ this.__actionEvents.add(new ActionEvent(this, name, attribute.value));
69
29
  }
70
30
  }
31
+ if (on) {
32
+ const { target, effect } = this.$options;
33
+ const effectDefinition = target ? `${target}${ActionEvent.effectSeparator}${effect}` : effect;
34
+ this.__actionEvents.add(new ActionEvent(this, on, effectDefinition));
35
+ }
36
+ return this.__actionEvents;
71
37
  }
72
38
  /**
73
39
  * Mounted
74
40
  */
75
41
  mounted() {
76
- const { event, modifiers } = this;
77
- this.$el.addEventListener(event, this, {
78
- capture: modifiers.includes("capture"),
79
- once: modifiers.includes("once"),
80
- passive: modifiers.includes("passive")
81
- });
42
+ for (const actionEvent of this.actionEvents) {
43
+ actionEvent.attachEvent();
44
+ }
82
45
  }
83
46
  /**
84
47
  * Destroyed
85
48
  */
86
49
  destroyed() {
87
- this.$el.removeEventListener(this.$options.on, this);
50
+ for (const actionEvent of this.actionEvents) {
51
+ actionEvent.detachEvent();
52
+ }
88
53
  }
89
54
  }
90
55
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Action/Action.ts"],
4
- "sourcesContent": ["import { Base, getInstances } from '@studiometa/js-toolkit';\nimport { isFunction } from '@studiometa/js-toolkit/utils';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\n\nexport interface ActionProps extends BaseProps {\n $options: {\n on: string;\n target: string;\n selector: string;\n effect: string;\n };\n}\n\n/**\n * Extract component name and an optional additional selector from a string.\n * @type {RegExp}\n */\nconst TARGET_REGEX = /([a-zA-Z]+)(\\((.*)\\))?/;\n\nconst effectCache = new Map<string, Function>();\n\n/**\n * Action class.\n */\nexport class Action<T extends BaseProps = BaseProps> extends Base<ActionProps & T> {\n static config: BaseConfig = {\n name: 'Action',\n options: {\n on: {\n type: String,\n default: 'click',\n },\n target: String,\n selector: String,\n effect: String,\n },\n };\n\n get event() {\n const [event] = this.$options.on.split('.', 1);\n return event;\n }\n\n get modifiers() {\n return this.$options.on.split('.').slice(1);\n }\n\n get effect() {\n const { effect } = this.$options;\n if (!effectCache.has(effect)) {\n effectCache.set(effect, new Function('ctx', 'event', 'target', `return ${effect}`));\n }\n return effectCache.get(effect);\n }\n\n get targets() {\n const { target } = this.$options;\n const parts = target.split(' ').map((part) => {\n const [, name, , selector] = part.match(TARGET_REGEX) ?? [];\n return [name, selector];\n });\n\n const targets = [] as Array<Record<string, Base>>;\n\n for (const instance of getInstances()) {\n const { name } = instance.__config;\n\n for (const part of parts) {\n const shouldPush =\n part[0] === name && (!part[1] || (part[1] && instance.$el.matches(part[1])));\n if (shouldPush) {\n targets.push({ [instance.$options.name]: instance });\n }\n }\n }\n\n return targets;\n }\n\n /**\n * Run method on targeted components\n */\n handleEvent(event: Event) {\n const { targets, effect, modifiers } = this;\n\n if (modifiers.includes('prevent')) {\n event.preventDefault();\n }\n\n if (modifiers.includes('stop')) {\n event.stopPropagation();\n }\n\n for (const target of targets) {\n try {\n const [name, currentTarget] = Object.entries(target).flat();\n const value = effect(target, event, currentTarget);\n if (typeof value === 'function') {\n value(target, event, currentTarget);\n }\n } catch (err) {\n this.$warn(err);\n }\n }\n }\n\n /**\n * Mounted\n */\n mounted() {\n const { event, modifiers } = this;\n\n this.$el.addEventListener(event, this, {\n capture: modifiers.includes('capture'),\n once: modifiers.includes('once'),\n passive: modifiers.includes('passive'),\n });\n }\n\n /**\n * Destroyed\n */\n destroyed() {\n this.$el.removeEventListener(this.$options.on, this);\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,MAAM,oBAAoB;AAiBnC,MAAM,eAAe;AAErB,MAAM,cAAc,oBAAI,IAAsB;AAKvC,MAAM,eAAgD,KAAsB;AAAA,EACjF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,IAAI;AAAA,QACF,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,UAAM,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG,MAAM,KAAK,CAAC;AAC7C,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,SAAS,GAAG,MAAM,GAAG,EAAE,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,QAAI,CAAC,YAAY,IAAI,MAAM,GAAG;AAC5B,kBAAY,IAAI,QAAQ,IAAI,SAAS,OAAO,SAAS,UAAU,UAAU,MAAM,EAAE,CAAC;AAAA,IACpF;AACA,WAAO,YAAY,IAAI,MAAM;AAAA,EAC/B;AAAA,EAEA,IAAI,UAAU;AACZ,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS;AAC5C,YAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK,MAAM,YAAY,KAAK,CAAC;AAC1D,aAAO,CAAC,MAAM,QAAQ;AAAA,IACxB,CAAC;AAED,UAAM,UAAU,CAAC;AAEjB,eAAW,YAAY,aAAa,GAAG;AACrC,YAAM,EAAE,KAAK,IAAI,SAAS;AAE1B,iBAAW,QAAQ,OAAO;AACxB,cAAM,aACJ,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,KAAM,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,KAAK,CAAC,CAAC;AAC3E,YAAI,YAAY;AACd,kBAAQ,KAAK,EAAE,CAAC,SAAS,SAAS,IAAI,GAAG,SAAS,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAc;AACxB,UAAM,EAAE,SAAS,QAAQ,UAAU,IAAI;AAEvC,QAAI,UAAU,SAAS,SAAS,GAAG;AACjC,YAAM,eAAe;AAAA,IACvB;AAEA,QAAI,UAAU,SAAS,MAAM,GAAG;AAC9B,YAAM,gBAAgB;AAAA,IACxB;AAEA,eAAW,UAAU,SAAS;AAC5B,UAAI;AACF,cAAM,CAAC,MAAM,aAAa,IAAI,OAAO,QAAQ,MAAM,EAAE,KAAK;AAC1D,cAAM,QAAQ,OAAO,QAAQ,OAAO,aAAa;AACjD,YAAI,OAAO,UAAU,YAAY;AAC/B,gBAAM,QAAQ,OAAO,aAAa;AAAA,QACpC;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,MAAM,GAAG;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,OAAO,UAAU,IAAI;AAE7B,SAAK,IAAI,iBAAiB,OAAO,MAAM;AAAA,MACrC,SAAS,UAAU,SAAS,SAAS;AAAA,MACrC,MAAM,UAAU,SAAS,MAAM;AAAA,MAC/B,SAAS,UAAU,SAAS,SAAS;AAAA,IACvC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,SAAK,IAAI,oBAAoB,KAAK,SAAS,IAAI,IAAI;AAAA,EACrD;AACF;",
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { ActionEvent } from './ActionEvent.js';\n\nexport interface ActionProps extends BaseProps {\n $options: {\n on: string;\n target: string;\n selector: string;\n effect: string;\n };\n}\n\n/**\n * Action class.\n */\nexport class Action<T extends BaseProps = BaseProps> extends Base<ActionProps & T> {\n static config: BaseConfig = {\n name: 'Action',\n options: {\n on: {\n type: String,\n default: 'click',\n },\n target: String,\n effect: String,\n },\n };\n\n /**\n * @private\n */\n __actionEvents: Set<ActionEvent<Action>>;\n\n get actionEvents() {\n if (this.__actionEvents) {\n return this.__actionEvents;\n }\n\n const { on } = this.$options;\n this.__actionEvents = new Set();\n\n // @ts-ignore\n for (const attribute of this.$el.attributes) {\n if (attribute.name.includes('on:')) {\n const name = attribute.name.split('on:').pop();\n this.__actionEvents.add(new ActionEvent(this, name, attribute.value));\n }\n }\n\n if (on) {\n const { target, effect } = this.$options;\n const effectDefinition = target ? `${target}${ActionEvent.effectSeparator}${effect}` : effect;\n this.__actionEvents.add(new ActionEvent(this, on, effectDefinition));\n }\n\n return this.__actionEvents;\n }\n\n /**\n * Mounted\n */\n mounted() {\n for (const actionEvent of this.actionEvents) {\n actionEvent.attachEvent();\n }\n }\n\n /**\n * Destroyed\n */\n destroyed() {\n for (const actionEvent of this.actionEvents) {\n actionEvent.detachEvent();\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,mBAAmB;AAcrB,MAAM,eAAgD,KAAsB;AAAA,EACjF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,IAAI;AAAA,QACF,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,EAEA,IAAI,eAAe;AACjB,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,EAAE,GAAG,IAAI,KAAK;AACpB,SAAK,iBAAiB,oBAAI,IAAI;AAG9B,eAAW,aAAa,KAAK,IAAI,YAAY;AAC3C,UAAI,UAAU,KAAK,SAAS,KAAK,GAAG;AAClC,cAAM,OAAO,UAAU,KAAK,MAAM,KAAK,EAAE,IAAI;AAC7C,aAAK,eAAe,IAAI,IAAI,YAAY,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,QAAI,IAAI;AACN,YAAM,EAAE,QAAQ,OAAO,IAAI,KAAK;AAChC,YAAM,mBAAmB,SAAS,GAAG,MAAM,GAAG,YAAY,eAAe,GAAG,MAAM,KAAK;AACvF,WAAK,eAAe,IAAI,IAAI,YAAY,MAAM,IAAI,gBAAgB,CAAC;AAAA,IACrE;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,eAAW,eAAe,KAAK,cAAc;AAC3C,kBAAY,YAAY;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,eAAW,eAAe,KAAK,cAAc;AAC3C,kBAAY,YAAY;AAAA,IAC1B;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,55 @@
1
+ import type { Base } from '@studiometa/js-toolkit';
2
+ export type Modifiers = 'prevent' | 'stop' | 'once' | 'passive' | 'capture';
3
+ export declare class ActionEvent<T extends Base> {
4
+ static modifierSeparator: string;
5
+ static targetSeparator: string;
6
+ static effectSeparator: string;
7
+ /**
8
+ * The Action instance.
9
+ */
10
+ action: T;
11
+ /**
12
+ * The event to listen to.
13
+ */
14
+ event: string;
15
+ /**
16
+ * The modifiers to apply to the event.
17
+ */
18
+ modifiers: Modifiers[];
19
+ /**
20
+ * Target definition.
21
+ * Ex: `Target Target(.selector)`.
22
+ */
23
+ targetDefinition: string;
24
+ /**
25
+ * The content of the effect callback function.
26
+ */
27
+ effectDefinition: string;
28
+ /**
29
+ * Class constructor.
30
+ * @param {T} action The parent Action instance.
31
+ * @param {string} eventDefinition The event with its modifiers: `click.prevent.stop`
32
+ * @param {string} effectDefinition The target and effect definition: `Target(.selector)->target.$destroy()`
33
+ */
34
+ constructor(action: T, eventDefinition: string, effectDefinition: string);
35
+ /**
36
+ * Get the generated function for the defined effect.
37
+ */
38
+ get effect(): Function;
39
+ /**
40
+ * Get the targets object for the defined targets string.
41
+ */
42
+ get targets(): Record<string, Base<import("@studiometa/js-toolkit").BaseProps>>[];
43
+ /**
44
+ * Handle the defined event and trigger the effect for each defined target.
45
+ */
46
+ handleEvent(event: Event): void;
47
+ /**
48
+ * Bind the defined event to the given Action instance root element.
49
+ */
50
+ attachEvent(): void;
51
+ /**
52
+ * Unbind the event from the given Action instance root element.
53
+ */
54
+ detachEvent(): void;
55
+ }
@@ -0,0 +1,130 @@
1
+ import { getInstances } from "@studiometa/js-toolkit";
2
+ import { isFunction } from "@studiometa/js-toolkit/utils";
3
+ const TARGET_REGEX = /([a-zA-Z]+)(\((.*)\))?/;
4
+ const effectCache = /* @__PURE__ */ new Map();
5
+ class ActionEvent {
6
+ static modifierSeparator = ".";
7
+ static targetSeparator = " ";
8
+ static effectSeparator = "->";
9
+ /**
10
+ * The Action instance.
11
+ */
12
+ action;
13
+ /**
14
+ * The event to listen to.
15
+ */
16
+ event;
17
+ /**
18
+ * The modifiers to apply to the event.
19
+ */
20
+ modifiers;
21
+ /**
22
+ * Target definition.
23
+ * Ex: `Target Target(.selector)`.
24
+ */
25
+ targetDefinition;
26
+ /**
27
+ * The content of the effect callback function.
28
+ */
29
+ effectDefinition;
30
+ /**
31
+ * Class constructor.
32
+ * @param {T} action The parent Action instance.
33
+ * @param {string} eventDefinition The event with its modifiers: `click.prevent.stop`
34
+ * @param {string} effectDefinition The target and effect definition: `Target(.selector)->target.$destroy()`
35
+ */
36
+ constructor(action, eventDefinition, effectDefinition) {
37
+ this.action = action;
38
+ const [event, ...modifiers] = eventDefinition.split(ActionEvent.modifierSeparator);
39
+ this.event = event;
40
+ this.modifiers = modifiers;
41
+ let effect = effectDefinition;
42
+ let targetDefinition = "";
43
+ if (effect.includes(ActionEvent.effectSeparator)) {
44
+ [targetDefinition, effect] = effect.split(ActionEvent.effectSeparator);
45
+ }
46
+ this.targetDefinition = targetDefinition.trim();
47
+ this.effectDefinition = effect.trim();
48
+ }
49
+ /**
50
+ * Get the generated function for the defined effect.
51
+ */
52
+ get effect() {
53
+ const { effectDefinition } = this;
54
+ if (!effectCache.has(effectDefinition)) {
55
+ effectCache.set(
56
+ effectDefinition,
57
+ new Function("ctx", "event", "target", "action", "self", `return ${effectDefinition}`)
58
+ );
59
+ }
60
+ return effectCache.get(effectDefinition);
61
+ }
62
+ /**
63
+ * Get the targets object for the defined targets string.
64
+ */
65
+ get targets() {
66
+ const { targetDefinition } = this;
67
+ if (!targetDefinition) {
68
+ return [{ Action: this.action }];
69
+ }
70
+ const parts = targetDefinition.split(ActionEvent.targetSeparator).map((part) => {
71
+ const [, name, , selector] = part.match(TARGET_REGEX) ?? [];
72
+ return [name, selector];
73
+ });
74
+ const targets = [];
75
+ for (const instance of getInstances()) {
76
+ const { name } = instance.__config;
77
+ for (const part of parts) {
78
+ const shouldPush = part[0] === name && (!part[1] || part[1] && instance.$el.matches(part[1]));
79
+ if (shouldPush) {
80
+ targets.push({ [instance.__config.name]: instance });
81
+ }
82
+ }
83
+ }
84
+ return targets;
85
+ }
86
+ /**
87
+ * Handle the defined event and trigger the effect for each defined target.
88
+ */
89
+ handleEvent(event) {
90
+ const { targets, effect, modifiers } = this;
91
+ if (modifiers.includes("prevent")) {
92
+ event.preventDefault();
93
+ }
94
+ if (modifiers.includes("stop")) {
95
+ event.stopPropagation();
96
+ }
97
+ for (const target of targets) {
98
+ try {
99
+ const [currentTarget] = Object.values(target).flat();
100
+ const value = effect(target, event, currentTarget, this.action, this.action);
101
+ if (isFunction(value)) {
102
+ value(target, event, currentTarget, this.action, this.action);
103
+ }
104
+ } catch (err) {
105
+ this.action.$warn(err);
106
+ }
107
+ }
108
+ }
109
+ /**
110
+ * Bind the defined event to the given Action instance root element.
111
+ */
112
+ attachEvent() {
113
+ const { event, modifiers } = this;
114
+ this.action.$el.addEventListener(event, this, {
115
+ capture: modifiers.includes("capture"),
116
+ once: modifiers.includes("once"),
117
+ passive: modifiers.includes("passive")
118
+ });
119
+ }
120
+ /**
121
+ * Unbind the event from the given Action instance root element.
122
+ */
123
+ detachEvent() {
124
+ this.action.$el.removeEventListener(this.event, this);
125
+ }
126
+ }
127
+ export {
128
+ ActionEvent
129
+ };
130
+ //# sourceMappingURL=ActionEvent.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/ui/atoms/Action/ActionEvent.ts"],
4
+ "sourcesContent": ["import { getInstances } from '@studiometa/js-toolkit';\nimport type { Base } from '@studiometa/js-toolkit';\nimport { isFunction } from '@studiometa/js-toolkit/utils';\n\n/**\n * Extract component name and an optional additional selector from a string.\n * @type {RegExp}\n */\nconst TARGET_REGEX = /([a-zA-Z]+)(\\((.*)\\))?/;\n\nconst effectCache = new Map<string, Function>();\n\nexport type Modifiers = 'prevent' | 'stop' | 'once' | 'passive' | 'capture';\n\nexport class ActionEvent<T extends Base> {\n static modifierSeparator = '.';\n static targetSeparator = ' ';\n static effectSeparator = '->';\n\n /**\n * The Action instance.\n */\n action: T;\n\n /**\n * The event to listen to.\n */\n event: string;\n\n /**\n * The modifiers to apply to the event.\n */\n modifiers: Modifiers[];\n\n /**\n * Target definition.\n * Ex: `Target Target(.selector)`.\n */\n targetDefinition: string;\n\n /**\n * The content of the effect callback function.\n */\n effectDefinition: string;\n\n /**\n * Class constructor.\n * @param {T} action The parent Action instance.\n * @param {string} eventDefinition The event with its modifiers: `click.prevent.stop`\n * @param {string} effectDefinition The target and effect definition: `Target(.selector)->target.$destroy()`\n */\n constructor(action: T, eventDefinition: string, effectDefinition: string) {\n this.action = action;\n const [event, ...modifiers] = eventDefinition.split(ActionEvent.modifierSeparator);\n this.event = event;\n this.modifiers = modifiers as Modifiers[];\n\n let effect = effectDefinition;\n let targetDefinition = '';\n\n if (effect.includes(ActionEvent.effectSeparator)) {\n [targetDefinition, effect] = effect.split(ActionEvent.effectSeparator);\n }\n\n this.targetDefinition = targetDefinition.trim();\n this.effectDefinition = effect.trim();\n }\n\n /**\n * Get the generated function for the defined effect.\n */\n get effect() {\n const { effectDefinition } = this;\n\n if (!effectCache.has(effectDefinition)) {\n effectCache.set(\n effectDefinition,\n new Function('ctx', 'event', 'target', 'action', 'self', `return ${effectDefinition}`),\n );\n }\n\n return effectCache.get(effectDefinition) as Function;\n }\n\n /**\n * Get the targets object for the defined targets string.\n */\n get targets() {\n const { targetDefinition } = this;\n\n if (!targetDefinition) {\n return [{ Action: this.action }];\n }\n\n // Extract component's names and selectors.\n const parts = targetDefinition.split(ActionEvent.targetSeparator).map((part) => {\n const [, name, , selector] = part.match(TARGET_REGEX) ?? [];\n return [name, selector];\n });\n\n const targets = [] as Array<Record<string, Base>>;\n\n for (const instance of getInstances()) {\n const { name } = instance.__config;\n\n for (const part of parts) {\n const shouldPush =\n part[0] === name && (!part[1] || (part[1] && instance.$el.matches(part[1])));\n if (shouldPush) {\n targets.push({ [instance.__config.name]: instance });\n }\n }\n }\n\n return targets;\n }\n\n /**\n * Handle the defined event and trigger the effect for each defined target.\n */\n handleEvent(event: Event) {\n const { targets, effect, modifiers } = this;\n\n if (modifiers.includes('prevent')) {\n event.preventDefault();\n }\n\n if (modifiers.includes('stop')) {\n event.stopPropagation();\n }\n\n for (const target of targets) {\n try {\n const [currentTarget] = Object.values(target).flat();\n const value = effect(target, event, currentTarget, this.action, this.action);\n if (isFunction(value)) {\n value(target, event, currentTarget, this.action, this.action);\n }\n } catch (err) {\n this.action.$warn(err);\n }\n }\n }\n\n /**\n * Bind the defined event to the given Action instance root element.\n */\n attachEvent() {\n const { event, modifiers } = this;\n this.action.$el.addEventListener(event, this, {\n capture: modifiers.includes('capture'),\n once: modifiers.includes('once'),\n passive: modifiers.includes('passive'),\n });\n }\n\n /**\n * Unbind the event from the given Action instance root element.\n */\n detachEvent() {\n this.action.$el.removeEventListener(this.event, this);\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB;AAM3B,MAAM,eAAe;AAErB,MAAM,cAAc,oBAAI,IAAsB;AAIvC,MAAM,YAA4B;AAAA,EACvC,OAAO,oBAAoB;AAAA,EAC3B,OAAO,kBAAkB;AAAA,EACzB,OAAO,kBAAkB;AAAA;AAAA;AAAA;AAAA,EAKzB;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,QAAW,iBAAyB,kBAA0B;AACxE,SAAK,SAAS;AACd,UAAM,CAAC,OAAO,GAAG,SAAS,IAAI,gBAAgB,MAAM,YAAY,iBAAiB;AACjF,SAAK,QAAQ;AACb,SAAK,YAAY;AAEjB,QAAI,SAAS;AACb,QAAI,mBAAmB;AAEvB,QAAI,OAAO,SAAS,YAAY,eAAe,GAAG;AAChD,OAAC,kBAAkB,MAAM,IAAI,OAAO,MAAM,YAAY,eAAe;AAAA,IACvE;AAEA,SAAK,mBAAmB,iBAAiB,KAAK;AAC9C,SAAK,mBAAmB,OAAO,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS;AACX,UAAM,EAAE,iBAAiB,IAAI;AAE7B,QAAI,CAAC,YAAY,IAAI,gBAAgB,GAAG;AACtC,kBAAY;AAAA,QACV;AAAA,QACA,IAAI,SAAS,OAAO,SAAS,UAAU,UAAU,QAAQ,UAAU,gBAAgB,EAAE;AAAA,MACvF;AAAA,IACF;AAEA,WAAO,YAAY,IAAI,gBAAgB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAU;AACZ,UAAM,EAAE,iBAAiB,IAAI;AAE7B,QAAI,CAAC,kBAAkB;AACrB,aAAO,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAC;AAAA,IACjC;AAGA,UAAM,QAAQ,iBAAiB,MAAM,YAAY,eAAe,EAAE,IAAI,CAAC,SAAS;AAC9E,YAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK,MAAM,YAAY,KAAK,CAAC;AAC1D,aAAO,CAAC,MAAM,QAAQ;AAAA,IACxB,CAAC;AAED,UAAM,UAAU,CAAC;AAEjB,eAAW,YAAY,aAAa,GAAG;AACrC,YAAM,EAAE,KAAK,IAAI,SAAS;AAE1B,iBAAW,QAAQ,OAAO;AACxB,cAAM,aACJ,KAAK,CAAC,MAAM,SAAS,CAAC,KAAK,CAAC,KAAM,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,KAAK,CAAC,CAAC;AAC3E,YAAI,YAAY;AACd,kBAAQ,KAAK,EAAE,CAAC,SAAS,SAAS,IAAI,GAAG,SAAS,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAc;AACxB,UAAM,EAAE,SAAS,QAAQ,UAAU,IAAI;AAEvC,QAAI,UAAU,SAAS,SAAS,GAAG;AACjC,YAAM,eAAe;AAAA,IACvB;AAEA,QAAI,UAAU,SAAS,MAAM,GAAG;AAC9B,YAAM,gBAAgB;AAAA,IACxB;AAEA,eAAW,UAAU,SAAS;AAC5B,UAAI;AACF,cAAM,CAAC,aAAa,IAAI,OAAO,OAAO,MAAM,EAAE,KAAK;AACnD,cAAM,QAAQ,OAAO,QAAQ,OAAO,eAAe,KAAK,QAAQ,KAAK,MAAM;AAC3E,YAAI,WAAW,KAAK,GAAG;AACrB,gBAAM,QAAQ,OAAO,eAAe,KAAK,QAAQ,KAAK,MAAM;AAAA,QAC9D;AAAA,MACF,SAAS,KAAK;AACZ,aAAK,OAAO,MAAM,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,UAAM,EAAE,OAAO,UAAU,IAAI;AAC7B,SAAK,OAAO,IAAI,iBAAiB,OAAO,MAAM;AAAA,MAC5C,SAAS,UAAU,SAAS,SAAS;AAAA,MACrC,MAAM,UAAU,SAAS,MAAM;AAAA,MAC/B,SAAS,UAAU,SAAS,SAAS;AAAA,IACvC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,SAAK,OAAO,IAAI,oBAAoB,KAAK,OAAO,IAAI;AAAA,EACtD;AACF;",
6
+ "names": []
7
+ }
@@ -15,8 +15,8 @@ export declare class AnchorScrollTo<T extends BaseProps = BaseProps> extends Bas
15
15
  get targetSelector(): string;
16
16
  /**
17
17
  * Scroll to the target selector on click.
18
- * @param {MouseEvent} event
19
- * @returns {void}
20
18
  */
21
- onClick(event: any): void;
19
+ onClick({ event }: {
20
+ event: MouseEvent;
21
+ }): void;
22
22
  }
@@ -13,10 +13,8 @@ class AnchorScrollTo extends Base {
13
13
  }
14
14
  /**
15
15
  * Scroll to the target selector on click.
16
- * @param {MouseEvent} event
17
- * @returns {void}
18
16
  */
19
- onClick(event) {
17
+ onClick({ event }) {
20
18
  try {
21
19
  scrollTo(this.targetSelector);
22
20
  event.preventDefault();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/AnchorScrollTo/AnchorScrollTo.ts"],
4
- "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { scrollTo } from '@studiometa/js-toolkit/utils';\n\nexport interface AnchorScrollToProps extends BaseProps {\n $el: HTMLAnchorElement;\n}\n\n/**\n * AncorScrollTo class.\n */\nexport class AnchorScrollTo<T extends BaseProps = BaseProps> extends Base<AnchorScrollToProps & T> {\n static config: BaseConfig = {\n name: 'AnchorScrollTo',\n };\n\n /**\n * Get the target selector.\n * @returns {string}\n */\n get targetSelector() {\n return this.$el.hash;\n }\n\n /**\n * Scroll to the target selector on click.\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n try {\n scrollTo(this.targetSelector);\n event.preventDefault();\n } catch {\n // Silence is golden.\n }\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,gBAAgB;AASlB,MAAM,uBAAwD,KAA8B;AAAA,EACjG,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAiB;AACnB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,OAAO;AACb,QAAI;AACF,eAAS,KAAK,cAAc;AAC5B,YAAM,eAAe;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { scrollTo } from '@studiometa/js-toolkit/utils';\n\nexport interface AnchorScrollToProps extends BaseProps {\n $el: HTMLAnchorElement;\n}\n\n/**\n * AncorScrollTo class.\n */\nexport class AnchorScrollTo<T extends BaseProps = BaseProps> extends Base<AnchorScrollToProps & T> {\n static config: BaseConfig = {\n name: 'AnchorScrollTo',\n };\n\n /**\n * Get the target selector.\n * @returns {string}\n */\n get targetSelector() {\n return this.$el.hash;\n }\n\n /**\n * Scroll to the target selector on click.\n */\n onClick({ event }: { event: MouseEvent }) {\n try {\n scrollTo(this.targetSelector);\n event.preventDefault();\n } catch {\n // Silence is golden.\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,gBAAgB;AASlB,MAAM,uBAAwD,KAA8B;AAAA,EACjG,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,iBAAiB;AACnB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,EAAE,MAAM,GAA0B;AACxC,QAAI;AACF,eAAS,KAAK,cAAc;AAC5B,YAAM,eAAe;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,7 @@ import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';
3
3
  export interface DataBindProps extends BaseProps {
4
4
  $options: {
5
5
  prop: string;
6
- name: string;
6
+ group: string;
7
7
  };
8
8
  }
9
9
  export declare class DataBind<T extends BaseProps = BaseProps> extends Base<DataBindProps & T> {
@@ -17,7 +17,7 @@ export declare class DataBind<T extends BaseProps = BaseProps> extends Base<Data
17
17
  get value(): any;
18
18
  set value(value: any);
19
19
  get(): any;
20
- set(value: boolean | string | string[]): void;
20
+ set(value: boolean | string | string[], dispatch?: boolean): void;
21
21
  mounted(): void;
22
22
  destroyed(): void;
23
23
  }
@@ -1,24 +1,27 @@
1
1
  import { Base } from "@studiometa/js-toolkit";
2
2
  import { isArray } from "@studiometa/js-toolkit/utils";
3
3
  import { isInput, isCheckbox, isSelect } from "./utils.js";
4
- const instances = /* @__PURE__ */ new Map();
4
+ const groups = /* @__PURE__ */ new Map();
5
5
  class DataBind extends Base {
6
6
  static config = {
7
7
  name: "DataBind",
8
8
  options: {
9
9
  prop: String,
10
- name: String
10
+ group: String
11
11
  }
12
12
  };
13
13
  get relatedInstances() {
14
- const { name } = this.$options;
15
- if (!instances.has(name)) {
16
- instances.set(name, /* @__PURE__ */ new Set());
14
+ const { group } = this.$options;
15
+ const instances = groups.get(group) ?? groups.set(group, /* @__PURE__ */ new Set()).get(group);
16
+ for (const instance of instances) {
17
+ if (!instance.$el.isConnected) {
18
+ instances.delete(instance);
19
+ }
17
20
  }
18
- return instances.get(name);
21
+ return instances;
19
22
  }
20
23
  get multiple() {
21
- return this.$options.name.endsWith("[]");
24
+ return this.$options.group.endsWith("[]");
22
25
  }
23
26
  get target() {
24
27
  return this.$el;
@@ -56,21 +59,28 @@ class DataBind extends Base {
56
59
  }
57
60
  if (isCheckbox(target)) {
58
61
  if (multiple) {
59
- const values = [];
62
+ const values = /* @__PURE__ */ new Set();
60
63
  for (const instance of this.relatedInstances) {
61
64
  if (isCheckbox(instance.target) && instance.target.checked) {
62
- values.push(instance.target.value);
65
+ values.add(instance.target.value);
63
66
  }
64
67
  }
65
- return values;
68
+ return Array.from(values);
66
69
  } else {
67
70
  return target.checked;
68
71
  }
69
72
  }
70
73
  return target[this.prop];
71
74
  }
72
- set(value) {
73
- const { target, multiple } = this;
75
+ set(value, dispatch = true) {
76
+ const { target, multiple, relatedInstances } = this;
77
+ if (dispatch) {
78
+ for (const instance of relatedInstances) {
79
+ if (instance !== this && instance.value !== value) {
80
+ instance.set(value, false);
81
+ }
82
+ }
83
+ }
74
84
  if (isSelect(target)) {
75
85
  for (const option of target.options) {
76
86
  option.selected = multiple && isArray(value) ? value.includes(option.value) : option.value === value;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Data/DataBind.ts"],
4
- "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isArray } from '@studiometa/js-toolkit/utils';\nimport { isInput, isCheckbox, isSelect } from './utils.js';\n\nconst instances = new Map<string, Set<DataBind>>();\n\nexport interface DataBindProps extends BaseProps {\n $options: {\n prop: string;\n name: string;\n };\n}\n\nexport class DataBind<T extends BaseProps = BaseProps> extends Base<DataBindProps & T> {\n static config: BaseConfig = {\n name: 'DataBind',\n options: {\n prop: String,\n name: String,\n },\n };\n\n get relatedInstances() {\n const { name } = this.$options;\n\n if (!instances.has(name)) {\n instances.set(name, new Set());\n }\n\n return instances.get(name);\n }\n\n get multiple() {\n return this.$options.name.endsWith('[]');\n }\n\n get target() {\n return this.$el;\n }\n\n get prop() {\n if (this.$options.prop) {\n return this.$options.prop;\n }\n\n const { target } = this;\n if (target instanceof HTMLInputElement) {\n return 'value';\n }\n\n return 'textContent';\n }\n\n get value() {\n return this.get();\n }\n\n set value(value) {\n this.set(value);\n }\n\n get() {\n const { target, multiple } = this;\n\n if (isSelect(target)) {\n if (multiple) {\n const values = [];\n for (const option of target.options) {\n if (option.selected) {\n values.push(option.value);\n }\n }\n\n return values;\n }\n\n const option = target.options.item(target.selectedIndex);\n return option.value;\n }\n\n if (isCheckbox(target)) {\n if (multiple) {\n const values = [];\n for (const instance of this.relatedInstances) {\n if (isCheckbox(instance.target) && instance.target.checked) {\n values.push(instance.target.value);\n }\n }\n return values;\n } else {\n return target.checked;\n }\n }\n\n return target[this.prop];\n }\n\n set(value: boolean | string | string[]) {\n const { target, multiple } = this;\n\n if (isSelect(target)) {\n for (const option of target.options) {\n option.selected =\n multiple && isArray(value) ? value.includes(option.value) : option.value === value;\n }\n return;\n }\n\n if (isInput(target)) {\n switch (target.type) {\n case 'radio':\n target.checked = target.value === value;\n return;\n case 'checkbox':\n target.checked =\n multiple && isArray(value) ? value.includes(target.value) : Boolean(value);\n return;\n }\n }\n\n target[this.prop] = value;\n }\n\n mounted() {\n this.relatedInstances.add(this);\n }\n\n destroyed() {\n this.relatedInstances.delete(this);\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY,gBAAgB;AAE9C,MAAM,YAAY,oBAAI,IAA2B;AAS1C,MAAM,iBAAkD,KAAwB;AAAA,EACrF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,IAAI,mBAAmB;AACrB,UAAM,EAAE,KAAK,IAAI,KAAK;AAEtB,QAAI,CAAC,UAAU,IAAI,IAAI,GAAG;AACxB,gBAAU,IAAI,MAAM,oBAAI,IAAI,CAAC;AAAA,IAC/B;AAEA,WAAO,UAAU,IAAI,IAAI;AAAA,EAC3B;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,SAAS,KAAK,SAAS,IAAI;AAAA,EACzC;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAO;AACT,QAAI,KAAK,SAAS,MAAM;AACtB,aAAO,KAAK,SAAS;AAAA,IACvB;AAEA,UAAM,EAAE,OAAO,IAAI;AACnB,QAAI,kBAAkB,kBAAkB;AACtC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,IAAI,MAAM,OAAO;AACf,SAAK,IAAI,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM;AACJ,UAAM,EAAE,QAAQ,SAAS,IAAI;AAE7B,QAAI,SAAS,MAAM,GAAG;AACpB,UAAI,UAAU;AACZ,cAAM,SAAS,CAAC;AAChB,mBAAWA,WAAU,OAAO,SAAS;AACnC,cAAIA,QAAO,UAAU;AACnB,mBAAO,KAAKA,QAAO,KAAK;AAAA,UAC1B;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,OAAO,QAAQ,KAAK,OAAO,aAAa;AACvD,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI,WAAW,MAAM,GAAG;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,CAAC;AAChB,mBAAW,YAAY,KAAK,kBAAkB;AAC5C,cAAI,WAAW,SAAS,MAAM,KAAK,SAAS,OAAO,SAAS;AAC1D,mBAAO,KAAK,SAAS,OAAO,KAAK;AAAA,UACnC;AAAA,QACF;AACA,eAAO;AAAA,MACT,OAAO;AACL,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,IAAI;AAAA,EACzB;AAAA,EAEA,IAAI,OAAoC;AACtC,UAAM,EAAE,QAAQ,SAAS,IAAI;AAE7B,QAAI,SAAS,MAAM,GAAG;AACpB,iBAAW,UAAU,OAAO,SAAS;AACnC,eAAO,WACL,YAAY,QAAQ,KAAK,IAAI,MAAM,SAAS,OAAO,KAAK,IAAI,OAAO,UAAU;AAAA,MACjF;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,MAAM,GAAG;AACnB,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,iBAAO,UAAU,OAAO,UAAU;AAClC;AAAA,QACF,KAAK;AACH,iBAAO,UACL,YAAY,QAAQ,KAAK,IAAI,MAAM,SAAS,OAAO,KAAK,IAAI,QAAQ,KAAK;AAC3E;AAAA,MACJ;AAAA,IACF;AAEA,WAAO,KAAK,IAAI,IAAI;AAAA,EACtB;AAAA,EAEA,UAAU;AACR,SAAK,iBAAiB,IAAI,IAAI;AAAA,EAChC;AAAA,EAEA,YAAY;AACV,SAAK,iBAAiB,OAAO,IAAI;AAAA,EACnC;AACF;",
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isArray } from '@studiometa/js-toolkit/utils';\nimport { isInput, isCheckbox, isSelect } from './utils.js';\n\nconst groups = new Map<string, Set<DataBind>>();\n\nexport interface DataBindProps extends BaseProps {\n $options: {\n prop: string;\n group: string;\n };\n}\n\nexport class DataBind<T extends BaseProps = BaseProps> extends Base<DataBindProps & T> {\n static config: BaseConfig = {\n name: 'DataBind',\n options: {\n prop: String,\n group: String,\n },\n };\n\n get relatedInstances() {\n const { group } = this.$options;\n\n const instances = groups.get(group) ?? groups.set(group, new Set()).get(group);\n\n for (const instance of instances) {\n if (!instance.$el.isConnected) {\n instances.delete(instance);\n }\n }\n\n return instances;\n }\n\n get multiple() {\n return this.$options.group.endsWith('[]');\n }\n\n get target() {\n return this.$el;\n }\n\n get prop() {\n if (this.$options.prop) {\n return this.$options.prop;\n }\n\n const { target } = this;\n if (target instanceof HTMLInputElement) {\n return 'value';\n }\n\n return 'textContent';\n }\n\n get value() {\n return this.get();\n }\n\n set value(value) {\n this.set(value);\n }\n\n get() {\n const { target, multiple } = this;\n\n if (isSelect(target)) {\n if (multiple) {\n const values = [];\n // @ts-ignore\n for (const option of target.options) {\n if (option.selected) {\n values.push(option.value);\n }\n }\n\n return values;\n }\n\n const option = target.options.item(target.selectedIndex);\n return option.value;\n }\n\n if (isCheckbox(target)) {\n if (multiple) {\n const values = new Set();\n for (const instance of this.relatedInstances) {\n if (isCheckbox(instance.target) && instance.target.checked) {\n values.add(instance.target.value);\n }\n }\n return Array.from(values);\n } else {\n return target.checked;\n }\n }\n\n return target[this.prop];\n }\n\n set(value: boolean | string | string[], dispatch = true) {\n const { target, multiple, relatedInstances } = this;\n\n if (dispatch) {\n for (const instance of relatedInstances) {\n if (instance !== this && instance.value !== value) {\n instance.set(value, false);\n }\n }\n }\n\n if (isSelect(target)) {\n // @ts-ignore\n for (const option of target.options) {\n option.selected =\n multiple && isArray(value) ? value.includes(option.value) : option.value === value;\n }\n return;\n }\n\n if (isInput(target)) {\n switch (target.type) {\n case 'radio':\n target.checked = target.value === value;\n return;\n case 'checkbox':\n target.checked =\n multiple && isArray(value) ? value.includes(target.value) : Boolean(value);\n return;\n }\n }\n\n target[this.prop] = value;\n }\n\n mounted() {\n this.relatedInstances.add(this);\n }\n\n destroyed() {\n this.relatedInstances.delete(this);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["option"]
7
7
  }
@@ -9,8 +9,8 @@ class DataComputed extends DataBind {
9
9
  }
10
10
  };
11
11
  get compute() {
12
- const { name, compute } = this.$options;
13
- return getCallback(name, `return ${compute};`);
12
+ const { group, compute } = this.$options;
13
+ return getCallback(group, `return ${compute};`);
14
14
  }
15
15
  set(value) {
16
16
  let newValue = value;
@@ -19,7 +19,7 @@ class DataComputed extends DataBind {
19
19
  } catch (error) {
20
20
  console.error("Failed", error);
21
21
  }
22
- super.set(newValue);
22
+ super.set(newValue, false);
23
23
  }
24
24
  }
25
25
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Data/DataComputed.ts"],
4
- "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isDefined } from '@studiometa/js-toolkit/utils';\nimport { DataBind } from './DataBind.js';\nimport type { DataBindProps } from './DataBind.js';\nimport { getCallback } from './utils.js';\n\nexport interface DataComputedProps extends DataBindProps {\n $options: {\n compute: string;\n } & DataBindProps['$options'];\n}\n\nconst callbacks = new Map<string, Function>();\n\nexport class DataComputed<T extends BaseProps = BaseProps> extends DataBind<DataComputedProps & T> {\n static config: BaseConfig = {\n name: 'DataComputed',\n options: {\n compute: String,\n },\n };\n\n get compute() {\n const { name, compute } = this.$options;\n return getCallback(name, `return ${compute};`);\n }\n\n set(value: boolean | string | string[]) {\n let newValue = value;\n\n try {\n newValue = this.compute(value, this.target);\n } catch (error) {\n // @todo better handling of errors?\n console.error('Failed', error);\n }\n\n super.set(newValue);\n }\n}\n"],
5
- "mappings": "AAEA,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAQ5B,MAAM,YAAY,oBAAI,IAAsB;AAErC,MAAM,qBAAsD,SAAgC;AAAA,EACjG,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,IAAI,UAAU;AACZ,UAAM,EAAE,MAAM,QAAQ,IAAI,KAAK;AAC/B,WAAO,YAAY,MAAM,UAAU,OAAO,GAAG;AAAA,EAC/C;AAAA,EAEA,IAAI,OAAoC;AACtC,QAAI,WAAW;AAEf,QAAI;AACF,iBAAW,KAAK,QAAQ,OAAO,KAAK,MAAM;AAAA,IAC5C,SAAS,OAAO;AAEd,cAAQ,MAAM,UAAU,KAAK;AAAA,IAC/B;AAEA,UAAM,IAAI,QAAQ;AAAA,EACpB;AACF;",
4
+ "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isDefined } from '@studiometa/js-toolkit/utils';\nimport { DataBind } from './DataBind.js';\nimport type { DataBindProps } from './DataBind.js';\nimport { getCallback } from './utils.js';\n\nexport interface DataComputedProps extends DataBindProps {\n $options: {\n compute: string;\n } & DataBindProps['$options'];\n}\n\nconst callbacks = new Map<string, Function>();\n\nexport class DataComputed<T extends BaseProps = BaseProps> extends DataBind<DataComputedProps & T> {\n static config: BaseConfig = {\n name: 'DataComputed',\n options: {\n compute: String,\n },\n };\n\n get compute() {\n const { group, compute } = this.$options;\n return getCallback(group, `return ${compute};`);\n }\n\n set(value: boolean | string | string[]) {\n let newValue = value;\n\n try {\n newValue = this.compute(value, this.target);\n } catch (error) {\n // @todo better handling of errors?\n console.error('Failed', error);\n }\n\n super.set(newValue, false);\n }\n}\n"],
5
+ "mappings": "AAEA,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAQ5B,MAAM,YAAY,oBAAI,IAAsB;AAErC,MAAM,qBAAsD,SAAgC;AAAA,EACjG,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,IAAI,UAAU;AACZ,UAAM,EAAE,OAAO,QAAQ,IAAI,KAAK;AAChC,WAAO,YAAY,OAAO,UAAU,OAAO,GAAG;AAAA,EAChD;AAAA,EAEA,IAAI,OAAoC;AACtC,QAAI,WAAW;AAEf,QAAI;AACF,iBAAW,KAAK,QAAQ,OAAO,KAAK,MAAM;AAAA,IAC5C,SAAS,OAAO;AAEd,cAAQ,MAAM,UAAU,KAAK;AAAA,IAC/B;AAEA,UAAM,IAAI,UAAU,KAAK;AAAA,EAC3B;AACF;",
6
6
  "names": []
7
7
  }
@@ -8,8 +8,8 @@ class DataEffect extends DataBind {
8
8
  }
9
9
  };
10
10
  get effect() {
11
- const { name, effect } = this.$options;
12
- return getCallback(name, effect);
11
+ const { group, effect } = this.$options;
12
+ return getCallback(group, effect);
13
13
  }
14
14
  set(value) {
15
15
  try {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Data/DataEffect.ts"],
4
- "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isDefined } from '@studiometa/js-toolkit/utils';\nimport { DataBind } from './DataBind.js';\nimport type { DataBindProps } from './DataBind.js';\nimport { getCallback } from './utils.js';\n\nexport interface DataEffectProps extends DataBindProps {\n $options: {\n effect: string;\n } & DataBindProps['$options'];\n}\n\nexport class DataEffect<T extends BaseProps = BaseProps> extends DataBind<DataEffectProps & T> {\n static config: BaseConfig = {\n name: 'DataEffect',\n options: {\n effect: String,\n },\n };\n\n get effect() {\n const { name, effect } = this.$options;\n return getCallback(name, effect);\n }\n\n set(value: boolean | string | string[]) {\n try {\n this.effect(value, this.target);\n } catch (error) {\n // @todo better handling of errors?\n console.error('Failed', error);\n }\n }\n}\n"],
5
- "mappings": "AAEA,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAQrB,MAAM,mBAAoD,SAA8B;AAAA,EAC7F,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,EAAE,MAAM,OAAO,IAAI,KAAK;AAC9B,WAAO,YAAY,MAAM,MAAM;AAAA,EACjC;AAAA,EAEA,IAAI,OAAoC;AACtC,QAAI;AACF,WAAK,OAAO,OAAO,KAAK,MAAM;AAAA,IAChC,SAAS,OAAO;AAEd,cAAQ,MAAM,UAAU,KAAK;AAAA,IAC/B;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isDefined } from '@studiometa/js-toolkit/utils';\nimport { DataBind } from './DataBind.js';\nimport type { DataBindProps } from './DataBind.js';\nimport { getCallback } from './utils.js';\n\nexport interface DataEffectProps extends DataBindProps {\n $options: {\n effect: string;\n } & DataBindProps['$options'];\n}\n\nexport class DataEffect<T extends BaseProps = BaseProps> extends DataBind<DataEffectProps & T> {\n static config: BaseConfig = {\n name: 'DataEffect',\n options: {\n effect: String,\n },\n };\n\n get effect() {\n const { group, effect } = this.$options;\n return getCallback(group, effect);\n }\n\n set(value: boolean | string | string[]) {\n try {\n this.effect(value, this.target);\n } catch (error) {\n // @todo better handling of errors?\n console.error('Failed', error);\n }\n }\n}\n"],
5
+ "mappings": "AAEA,SAAS,gBAAgB;AAEzB,SAAS,mBAAmB;AAQrB,MAAM,mBAAoD,SAA8B;AAAA,EAC7F,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,IAAI,SAAS;AACX,UAAM,EAAE,OAAO,OAAO,IAAI,KAAK;AAC/B,WAAO,YAAY,OAAO,MAAM;AAAA,EAClC;AAAA,EAEA,IAAI,OAAoC;AACtC,QAAI;AACF,WAAK,OAAO,OAAO,KAAK,MAAM;AAAA,IAChC,SAAS,OAAO;AAEd,cAAQ,MAAM,UAAU,KAAK;AAAA,IAC/B;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -5,5 +5,6 @@ export interface DataModelProps extends DataBindProps {
5
5
  }
6
6
  export declare class DataModel<T extends BaseProps = BaseProps> extends DataBind<DataModelProps & T> {
7
7
  static config: BaseConfig;
8
+ dispatch(): void;
8
9
  onInput(): void;
9
10
  }