@studiometa/ui 0.2.52 → 1.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/atoms/Action/Action.cjs +58 -28
  2. package/atoms/Action/Action.cjs.map +2 -2
  3. package/atoms/Action/Action.d.ts +6 -2
  4. package/atoms/Action/Action.js +59 -29
  5. package/atoms/Action/Action.js.map +2 -2
  6. package/atoms/Action/Target.cjs +35 -0
  7. package/atoms/Action/Target.cjs.map +7 -0
  8. package/atoms/Action/Target.d.ts +13 -0
  9. package/atoms/Action/Target.js +13 -0
  10. package/atoms/Action/Target.js.map +7 -0
  11. package/atoms/Action/index.cjs +1 -0
  12. package/atoms/Action/index.cjs.map +2 -2
  13. package/atoms/Action/index.d.ts +1 -0
  14. package/atoms/Action/index.js +1 -0
  15. package/atoms/Action/index.js.map +2 -2
  16. package/atoms/Button/Button.twig +1 -1
  17. package/atoms/Data/DataBind.cjs +124 -0
  18. package/atoms/Data/DataBind.cjs.map +7 -0
  19. package/atoms/Data/DataBind.d.ts +23 -0
  20. package/atoms/Data/DataBind.js +102 -0
  21. package/atoms/Data/DataBind.js.map +7 -0
  22. package/atoms/Data/DataComputed.cjs +49 -0
  23. package/atoms/Data/DataComputed.cjs.map +7 -0
  24. package/atoms/Data/DataComputed.d.ts +13 -0
  25. package/atoms/Data/DataComputed.js +28 -0
  26. package/atoms/Data/DataComputed.js.map +7 -0
  27. package/atoms/Data/DataEffect.cjs +47 -0
  28. package/atoms/Data/DataEffect.cjs.map +7 -0
  29. package/atoms/Data/DataEffect.d.ts +13 -0
  30. package/atoms/Data/DataEffect.js +25 -0
  31. package/atoms/Data/DataEffect.js.map +7 -0
  32. package/atoms/Data/DataModel.cjs +38 -0
  33. package/atoms/Data/DataModel.cjs.map +7 -0
  34. package/atoms/Data/DataModel.d.ts +9 -0
  35. package/atoms/Data/DataModel.js +16 -0
  36. package/atoms/Data/DataModel.js.map +7 -0
  37. package/atoms/Data/index.cjs +24 -0
  38. package/atoms/Data/index.cjs.map +7 -0
  39. package/atoms/Data/index.d.ts +4 -0
  40. package/atoms/Data/index.js +5 -0
  41. package/atoms/Data/index.js.map +7 -0
  42. package/atoms/Data/utils.cjs +46 -0
  43. package/atoms/Data/utils.cjs.map +7 -0
  44. package/atoms/Data/utils.d.ts +4 -0
  45. package/atoms/Data/utils.js +24 -0
  46. package/atoms/Data/utils.js.map +7 -0
  47. package/atoms/Icon/IconInline.twig +1 -1
  48. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.d.ts +1 -1
  49. package/atoms/ScrollAnimation/ScrollAnimationWithEase.d.ts +2 -2
  50. package/atoms/index.cjs +1 -0
  51. package/atoms/index.cjs.map +2 -2
  52. package/atoms/index.d.ts +1 -0
  53. package/atoms/index.js +1 -0
  54. package/atoms/index.js.map +2 -2
  55. package/molecules/AnchorNav/AnchorNavLink.d.ts +1 -1
  56. package/molecules/Menu/MenuList.d.ts +1 -1
  57. package/molecules/Modal/Modal.cjs +3 -4
  58. package/molecules/Modal/Modal.cjs.map +3 -3
  59. package/molecules/Modal/Modal.d.ts +1 -1
  60. package/molecules/Modal/Modal.js +6 -2
  61. package/molecules/Modal/Modal.js.map +2 -2
  62. package/molecules/Slider/SliderDots.d.ts +1 -1
  63. package/organisms/Frame/FrameTarget.d.ts +1 -1
  64. package/package.json +2 -2
  65. package/primitives/Transition/Transition.d.ts +1 -1
@@ -23,7 +23,8 @@ __export(Action_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(Action_exports);
25
25
  var import_js_toolkit = require("@studiometa/js-toolkit");
26
- var import_utils = require("@studiometa/js-toolkit/utils");
26
+ var TARGET_REGEX = /([a-zA-Z]+)(\((.*)\))?/;
27
+ var effectCache = /* @__PURE__ */ new Map();
27
28
  var Action = class extends import_js_toolkit.Base {
28
29
  static config = {
29
30
  name: "Action",
@@ -33,46 +34,75 @@ var Action = class extends import_js_toolkit.Base {
33
34
  default: "click"
34
35
  },
35
36
  target: String,
36
- method: String,
37
- selector: String
37
+ selector: String,
38
+ effect: String
38
39
  }
39
40
  };
41
+ get event() {
42
+ const [event] = this.$options.on.split(".", 1);
43
+ return event;
44
+ }
45
+ get modifiers() {
46
+ return this.$options.on.split(".").slice(1);
47
+ }
48
+ get effect() {
49
+ const { effect } = this.$options;
50
+ if (!effectCache.has(effect)) {
51
+ effectCache.set(effect, new Function("ctx", "event", "target", `return ${effect}`));
52
+ }
53
+ return effectCache.get(effect);
54
+ }
55
+ get targets() {
56
+ const { target } = this.$options;
57
+ const parts = target.split(" ").map((part) => {
58
+ const [, name, , selector] = part.match(TARGET_REGEX) ?? [];
59
+ return [name, selector];
60
+ });
61
+ const targets = [];
62
+ for (const instance of (0, import_js_toolkit.getInstances)()) {
63
+ const { name } = instance.__config;
64
+ for (const part of parts) {
65
+ const shouldPush = part[0] === name && (!part[1] || part[1] && instance.$el.matches(part[1]));
66
+ if (shouldPush) {
67
+ targets.push({ [instance.$options.name]: instance });
68
+ }
69
+ }
70
+ }
71
+ return targets;
72
+ }
40
73
  /**
41
74
  * Run method on targeted components
42
75
  */
43
- handleEvent() {
44
- const { target: componentNames, method, selector } = this.$options;
45
- let targets = componentNames.includes(" ") ? componentNames.split(" ").flatMap((componentName) => this.$root.$children?.[componentName]) : this.$root.$children?.[componentNames];
46
- if (!targets || !targets.length) {
47
- this.$warn("Target not found.");
48
- return;
49
- }
50
- if (selector || selector.length > 0) {
51
- targets = targets.filter((target) => target.$el.matches(selector));
76
+ handleEvent(event) {
77
+ const { targets, effect, modifiers } = this;
78
+ if (modifiers.includes("prevent")) {
79
+ event.preventDefault();
52
80
  }
53
- if (!targets || !targets.length) {
54
- this.$warn(`Target with selector "${selector}" not found.`);
55
- return;
81
+ if (modifiers.includes("stop")) {
82
+ event.stopPropagation();
56
83
  }
57
- targets.forEach((target) => {
58
- if (!(0, import_utils.isFunction)(target[method])) {
59
- this.$warn(`Method "${method}()" not found on target.`, target);
60
- return;
84
+ for (const target of targets) {
85
+ try {
86
+ const [name, currentTarget] = Object.entries(target).flat();
87
+ const value = effect(target, event, currentTarget);
88
+ if (typeof value === "function") {
89
+ value(target, event, currentTarget);
90
+ }
91
+ } catch (err) {
92
+ this.$warn(err);
61
93
  }
62
- target[method]();
63
- });
94
+ }
64
95
  }
65
96
  /**
66
97
  * Mounted
67
98
  */
68
99
  mounted() {
69
- const { on: eventName, target, method } = this.$options;
70
- if (!target || !method || target.length <= 0 || method.length <= 0) {
71
- this.$warn("No target or method specified.");
72
- this.$terminate();
73
- return;
74
- }
75
- this.$el.addEventListener(eventName, this);
100
+ const { event, modifiers } = this;
101
+ this.$el.addEventListener(event, this, {
102
+ capture: modifiers.includes("capture"),
103
+ once: modifiers.includes("once"),
104
+ passive: modifiers.includes("passive")
105
+ });
76
106
  }
77
107
  /**
78
108
  * Destroyed
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Action/Action.ts"],
4
- "sourcesContent": ["import { Base } 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 method: string;\n selector: 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 method: String,\n selector: String,\n },\n };\n\n /**\n * Run method on targeted components\n */\n handleEvent() {\n const { target: componentNames, method, selector } = this.$options;\n\n let targets = componentNames.includes(' ')\n ? componentNames\n .split(' ')\n .flatMap((componentName) => this.$root.$children?.[componentName] as Base[])\n : (this.$root.$children?.[componentNames] as Base[]);\n\n if (!targets || !targets.length) {\n this.$warn('Target not found.');\n return;\n }\n\n if (selector || selector.length > 0) {\n targets = targets.filter((target) => target.$el.matches(selector));\n }\n\n if (!targets || !targets.length) {\n this.$warn(`Target with selector \"${selector}\" not found.`);\n return;\n }\n\n targets.forEach((target) => {\n if (!isFunction(target[method])) {\n this.$warn(`Method \"${method}()\" not found on target.`, target);\n return;\n }\n\n target[method]();\n });\n }\n\n /**\n * Mounted\n */\n mounted() {\n const { on: eventName, target, method } = this.$options;\n\n if (!target || !method || target.length <= 0 || method.length <= 0) {\n this.$warn('No target or method specified.');\n this.$terminate();\n return;\n }\n\n this.$el.addEventListener(eventName, this);\n }\n\n /**\n * Destroyed\n */\n destroyed() {\n this.$el.removeEventListener(this.$options.on, this);\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AACrB,mBAA2B;AAepB,IAAM,SAAN,cAAsD,uBAAsB;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,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,UAAM,EAAE,QAAQ,gBAAgB,QAAQ,SAAS,IAAI,KAAK;AAE1D,QAAI,UAAU,eAAe,SAAS,GAAG,IACrC,eACG,MAAM,GAAG,EACT,QAAQ,CAAC,kBAAkB,KAAK,MAAM,YAAY,aAAa,CAAW,IAC5E,KAAK,MAAM,YAAY,cAAc;AAE1C,QAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ;AAC/B,WAAK,MAAM,mBAAmB;AAC9B;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,gBAAU,QAAQ,OAAO,CAAC,WAAW,OAAO,IAAI,QAAQ,QAAQ,CAAC;AAAA,IACnE;AAEA,QAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ;AAC/B,WAAK,MAAM,yBAAyB,QAAQ,cAAc;AAC1D;AAAA,IACF;AAEA,YAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAI,KAAC,yBAAW,OAAO,MAAM,CAAC,GAAG;AAC/B,aAAK,MAAM,WAAW,MAAM,4BAA4B,MAAM;AAC9D;AAAA,MACF;AAEA,aAAO,MAAM,EAAE;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,IAAI,WAAW,QAAQ,OAAO,IAAI,KAAK;AAE/C,QAAI,CAAC,UAAU,CAAC,UAAU,OAAO,UAAU,KAAK,OAAO,UAAU,GAAG;AAClE,WAAK,MAAM,gCAAgC;AAC3C,WAAK,WAAW;AAChB;AAAA,IACF;AAEA,SAAK,IAAI,iBAAiB,WAAW,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,SAAK,IAAI,oBAAoB,KAAK,SAAS,IAAI,IAAI;AAAA,EACrD;AACF;",
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;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAmC;AAiBnC,IAAM,eAAe;AAErB,IAAM,cAAc,oBAAI,IAAsB;AAKvC,IAAM,SAAN,cAAsD,uBAAsB;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,gBAAY,gCAAa,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;",
6
6
  "names": []
7
7
  }
@@ -4,8 +4,8 @@ export interface ActionProps extends BaseProps {
4
4
  $options: {
5
5
  on: string;
6
6
  target: string;
7
- method: string;
8
7
  selector: string;
8
+ effect: string;
9
9
  };
10
10
  }
11
11
  /**
@@ -13,10 +13,14 @@ export interface ActionProps extends BaseProps {
13
13
  */
14
14
  export declare class Action<T extends BaseProps = BaseProps> extends Base<ActionProps & T> {
15
15
  static config: BaseConfig;
16
+ get event(): string;
17
+ get modifiers(): string[];
18
+ get effect(): Function;
19
+ get targets(): Record<string, Base<BaseProps>>[];
16
20
  /**
17
21
  * Run method on targeted components
18
22
  */
19
- handleEvent(): void;
23
+ handleEvent(event: Event): void;
20
24
  /**
21
25
  * Mounted
22
26
  */
@@ -1,5 +1,6 @@
1
- import { Base } from "@studiometa/js-toolkit";
2
- import { isFunction } from "@studiometa/js-toolkit/utils";
1
+ import { Base, getInstances } from "@studiometa/js-toolkit";
2
+ const TARGET_REGEX = /([a-zA-Z]+)(\((.*)\))?/;
3
+ const effectCache = /* @__PURE__ */ new Map();
3
4
  class Action extends Base {
4
5
  static config = {
5
6
  name: "Action",
@@ -9,46 +10,75 @@ class Action extends Base {
9
10
  default: "click"
10
11
  },
11
12
  target: String,
12
- method: String,
13
- selector: String
13
+ selector: String,
14
+ effect: String
14
15
  }
15
16
  };
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
+ }
16
49
  /**
17
50
  * Run method on targeted components
18
51
  */
19
- handleEvent() {
20
- const { target: componentNames, method, selector } = this.$options;
21
- let targets = componentNames.includes(" ") ? componentNames.split(" ").flatMap((componentName) => this.$root.$children?.[componentName]) : this.$root.$children?.[componentNames];
22
- if (!targets || !targets.length) {
23
- this.$warn("Target not found.");
24
- return;
25
- }
26
- if (selector || selector.length > 0) {
27
- targets = targets.filter((target) => target.$el.matches(selector));
52
+ handleEvent(event) {
53
+ const { targets, effect, modifiers } = this;
54
+ if (modifiers.includes("prevent")) {
55
+ event.preventDefault();
28
56
  }
29
- if (!targets || !targets.length) {
30
- this.$warn(`Target with selector "${selector}" not found.`);
31
- return;
57
+ if (modifiers.includes("stop")) {
58
+ event.stopPropagation();
32
59
  }
33
- targets.forEach((target) => {
34
- if (!isFunction(target[method])) {
35
- this.$warn(`Method "${method}()" not found on target.`, target);
36
- return;
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);
37
69
  }
38
- target[method]();
39
- });
70
+ }
40
71
  }
41
72
  /**
42
73
  * Mounted
43
74
  */
44
75
  mounted() {
45
- const { on: eventName, target, method } = this.$options;
46
- if (!target || !method || target.length <= 0 || method.length <= 0) {
47
- this.$warn("No target or method specified.");
48
- this.$terminate();
49
- return;
50
- }
51
- this.$el.addEventListener(eventName, this);
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
+ });
52
82
  }
53
83
  /**
54
84
  * Destroyed
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Action/Action.ts"],
4
- "sourcesContent": ["import { Base } 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 method: string;\n selector: 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 method: String,\n selector: String,\n },\n };\n\n /**\n * Run method on targeted components\n */\n handleEvent() {\n const { target: componentNames, method, selector } = this.$options;\n\n let targets = componentNames.includes(' ')\n ? componentNames\n .split(' ')\n .flatMap((componentName) => this.$root.$children?.[componentName] as Base[])\n : (this.$root.$children?.[componentNames] as Base[]);\n\n if (!targets || !targets.length) {\n this.$warn('Target not found.');\n return;\n }\n\n if (selector || selector.length > 0) {\n targets = targets.filter((target) => target.$el.matches(selector));\n }\n\n if (!targets || !targets.length) {\n this.$warn(`Target with selector \"${selector}\" not found.`);\n return;\n }\n\n targets.forEach((target) => {\n if (!isFunction(target[method])) {\n this.$warn(`Method \"${method}()\" not found on target.`, target);\n return;\n }\n\n target[method]();\n });\n }\n\n /**\n * Mounted\n */\n mounted() {\n const { on: eventName, target, method } = this.$options;\n\n if (!target || !method || target.length <= 0 || method.length <= 0) {\n this.$warn('No target or method specified.');\n this.$terminate();\n return;\n }\n\n this.$el.addEventListener(eventName, this);\n }\n\n /**\n * Destroyed\n */\n destroyed() {\n this.$el.removeEventListener(this.$options.on, this);\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AACrB,SAAS,kBAAkB;AAepB,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,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,UAAM,EAAE,QAAQ,gBAAgB,QAAQ,SAAS,IAAI,KAAK;AAE1D,QAAI,UAAU,eAAe,SAAS,GAAG,IACrC,eACG,MAAM,GAAG,EACT,QAAQ,CAAC,kBAAkB,KAAK,MAAM,YAAY,aAAa,CAAW,IAC5E,KAAK,MAAM,YAAY,cAAc;AAE1C,QAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ;AAC/B,WAAK,MAAM,mBAAmB;AAC9B;AAAA,IACF;AAEA,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,gBAAU,QAAQ,OAAO,CAAC,WAAW,OAAO,IAAI,QAAQ,QAAQ,CAAC;AAAA,IACnE;AAEA,QAAI,CAAC,WAAW,CAAC,QAAQ,QAAQ;AAC/B,WAAK,MAAM,yBAAyB,QAAQ,cAAc;AAC1D;AAAA,IACF;AAEA,YAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAI,CAAC,WAAW,OAAO,MAAM,CAAC,GAAG;AAC/B,aAAK,MAAM,WAAW,MAAM,4BAA4B,MAAM;AAC9D;AAAA,MACF;AAEA,aAAO,MAAM,EAAE;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,IAAI,WAAW,QAAQ,OAAO,IAAI,KAAK;AAE/C,QAAI,CAAC,UAAU,CAAC,UAAU,OAAO,UAAU,KAAK,OAAO,UAAU,GAAG;AAClE,WAAK,MAAM,gCAAgC;AAC3C,WAAK,WAAW;AAChB;AAAA,IACF;AAEA,SAAK,IAAI,iBAAiB,WAAW,IAAI;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,SAAK,IAAI,oBAAoB,KAAK,SAAS,IAAI,IAAI;AAAA,EACrD;AACF;",
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;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // packages/ui/atoms/Action/Target.ts
20
+ var Target_exports = {};
21
+ __export(Target_exports, {
22
+ Target: () => Target
23
+ });
24
+ module.exports = __toCommonJS(Target_exports);
25
+ var import_js_toolkit = require("@studiometa/js-toolkit");
26
+ var Target = class extends import_js_toolkit.Base {
27
+ /**
28
+ * Config.
29
+ */
30
+ static config = {
31
+ name: "Target"
32
+ };
33
+ };
34
+ if (module.exports.default) module.exports = module.exports.default;
35
+ //# sourceMappingURL=Target.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/ui/atoms/Action/Target.ts"],
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\n\nexport interface TargetProps extends BaseProps {}\n\n/**\n * Target class.\n */\nexport class Target extends Base<TargetProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Target',\n };\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AAQd,IAAM,SAAN,cAAqB,uBAAkB;AAAA;AAAA;AAAA;AAAA,EAI5C,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,13 @@
1
+ import { Base } from '@studiometa/js-toolkit';
2
+ import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';
3
+ export interface TargetProps extends BaseProps {
4
+ }
5
+ /**
6
+ * Target class.
7
+ */
8
+ export declare class Target extends Base<TargetProps> {
9
+ /**
10
+ * Config.
11
+ */
12
+ static config: BaseConfig;
13
+ }
@@ -0,0 +1,13 @@
1
+ import { Base } from "@studiometa/js-toolkit";
2
+ class Target extends Base {
3
+ /**
4
+ * Config.
5
+ */
6
+ static config = {
7
+ name: "Target"
8
+ };
9
+ }
10
+ export {
11
+ Target
12
+ };
13
+ //# sourceMappingURL=Target.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../packages/ui/atoms/Action/Target.ts"],
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\n\nexport interface TargetProps extends BaseProps {}\n\n/**\n * Target class.\n */\nexport class Target extends Base<TargetProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Target',\n };\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AAQd,MAAM,eAAe,KAAkB;AAAA;AAAA;AAAA;AAAA,EAI5C,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AACF;",
6
+ "names": []
7
+ }
@@ -17,5 +17,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
17
17
  var Action_exports = {};
18
18
  module.exports = __toCommonJS(Action_exports);
19
19
  __reExport(Action_exports, require("./Action.cjs"), module.exports);
20
+ __reExport(Action_exports, require("./Target.cjs"), module.exports);
20
21
  if (module.exports.default) module.exports = module.exports.default;
21
22
  //# sourceMappingURL=index.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Action/index.ts"],
4
- "sourcesContent": ["export * from './Action.js';\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,2BAAc,yBAAd;",
4
+ "sourcesContent": ["export * from './Action.js';\nexport * from './Target.js';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,2BAAc,yBAAd;AACA,2BAAc,yBADd;",
6
6
  "names": []
7
7
  }
@@ -1 +1,2 @@
1
1
  export * from './Action.js';
2
+ export * from './Target.js';
@@ -1,2 +1,3 @@
1
1
  export * from "./Action.js";
2
+ export * from "./Target.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Action/index.ts"],
4
- "sourcesContent": ["export * from './Action.js';\n"],
5
- "mappings": "AAAA,cAAc;",
4
+ "sourcesContent": ["export * from './Action.js';\nexport * from './Target.js';\n"],
5
+ "mappings": "AAAA,cAAc;AACd,cAAc;",
6
6
  "names": []
7
7
  }
@@ -52,7 +52,7 @@
52
52
  }
53
53
  },
54
54
  {
55
- class: icon_classes,
55
+ class: icon_classes ?? '',
56
56
  },
57
57
  )
58
58
  } %}
@@ -0,0 +1,124 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+
19
+ // packages/ui/atoms/Data/DataBind.ts
20
+ var DataBind_exports = {};
21
+ __export(DataBind_exports, {
22
+ DataBind: () => DataBind
23
+ });
24
+ module.exports = __toCommonJS(DataBind_exports);
25
+ var import_js_toolkit = require("@studiometa/js-toolkit");
26
+ var import_utils = require("@studiometa/js-toolkit/utils");
27
+ var import_utils2 = require("./utils.cjs");
28
+ var instances = /* @__PURE__ */ new Map();
29
+ var DataBind = class extends import_js_toolkit.Base {
30
+ static config = {
31
+ name: "DataBind",
32
+ options: {
33
+ prop: String,
34
+ name: String
35
+ }
36
+ };
37
+ get relatedInstances() {
38
+ const { name } = this.$options;
39
+ if (!instances.has(name)) {
40
+ instances.set(name, /* @__PURE__ */ new Set());
41
+ }
42
+ return instances.get(name);
43
+ }
44
+ get multiple() {
45
+ return this.$options.name.endsWith("[]");
46
+ }
47
+ get target() {
48
+ return this.$el;
49
+ }
50
+ get prop() {
51
+ if (this.$options.prop) {
52
+ return this.$options.prop;
53
+ }
54
+ const { target } = this;
55
+ if (target instanceof HTMLInputElement) {
56
+ return "value";
57
+ }
58
+ return "textContent";
59
+ }
60
+ get value() {
61
+ return this.get();
62
+ }
63
+ set value(value) {
64
+ this.set(value);
65
+ }
66
+ get() {
67
+ const { target, multiple } = this;
68
+ if ((0, import_utils2.isSelect)(target)) {
69
+ if (multiple) {
70
+ const values = [];
71
+ for (const option2 of target.options) {
72
+ if (option2.selected) {
73
+ values.push(option2.value);
74
+ }
75
+ }
76
+ return values;
77
+ }
78
+ const option = target.options.item(target.selectedIndex);
79
+ return option.value;
80
+ }
81
+ if ((0, import_utils2.isCheckbox)(target)) {
82
+ if (multiple) {
83
+ const values = [];
84
+ for (const instance of this.relatedInstances) {
85
+ if ((0, import_utils2.isCheckbox)(instance.target) && instance.target.checked) {
86
+ values.push(instance.target.value);
87
+ }
88
+ }
89
+ return values;
90
+ } else {
91
+ return target.checked;
92
+ }
93
+ }
94
+ return target[this.prop];
95
+ }
96
+ set(value) {
97
+ const { target, multiple } = this;
98
+ if ((0, import_utils2.isSelect)(target)) {
99
+ for (const option of target.options) {
100
+ option.selected = multiple && (0, import_utils.isArray)(value) ? value.includes(option.value) : option.value === value;
101
+ }
102
+ return;
103
+ }
104
+ if ((0, import_utils2.isInput)(target)) {
105
+ switch (target.type) {
106
+ case "radio":
107
+ target.checked = target.value === value;
108
+ return;
109
+ case "checkbox":
110
+ target.checked = multiple && (0, import_utils.isArray)(value) ? value.includes(target.value) : Boolean(value);
111
+ return;
112
+ }
113
+ }
114
+ target[this.prop] = value;
115
+ }
116
+ mounted() {
117
+ this.relatedInstances.add(this);
118
+ }
119
+ destroyed() {
120
+ this.relatedInstances.delete(this);
121
+ }
122
+ };
123
+ if (module.exports.default) module.exports = module.exports.default;
124
+ //# sourceMappingURL=DataBind.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AAErB,mBAAwB;AACxB,IAAAA,gBAA8C;AAE9C,IAAM,YAAY,oBAAI,IAA2B;AAS1C,IAAM,WAAN,cAAwD,uBAAwB;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,YAAI,wBAAS,MAAM,GAAG;AACpB,UAAI,UAAU;AACZ,cAAM,SAAS,CAAC;AAChB,mBAAWC,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,YAAI,0BAAW,MAAM,GAAG;AACtB,UAAI,UAAU;AACZ,cAAM,SAAS,CAAC;AAChB,mBAAW,YAAY,KAAK,kBAAkB;AAC5C,kBAAI,0BAAW,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,YAAI,wBAAS,MAAM,GAAG;AACpB,iBAAW,UAAU,OAAO,SAAS;AACnC,eAAO,WACL,gBAAY,sBAAQ,KAAK,IAAI,MAAM,SAAS,OAAO,KAAK,IAAI,OAAO,UAAU;AAAA,MACjF;AACA;AAAA,IACF;AAEA,YAAI,uBAAQ,MAAM,GAAG;AACnB,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,iBAAO,UAAU,OAAO,UAAU;AAClC;AAAA,QACF,KAAK;AACH,iBAAO,UACL,gBAAY,sBAAQ,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;",
6
+ "names": ["import_utils", "option"]
7
+ }
@@ -0,0 +1,23 @@
1
+ import { Base } from '@studiometa/js-toolkit';
2
+ import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';
3
+ export interface DataBindProps extends BaseProps {
4
+ $options: {
5
+ prop: string;
6
+ name: string;
7
+ };
8
+ }
9
+ export declare class DataBind<T extends BaseProps = BaseProps> extends Base<DataBindProps & T> {
10
+ static config: BaseConfig;
11
+ get relatedInstances(): Set<DataBind<BaseProps>>;
12
+ get multiple(): boolean;
13
+ get target(): (DataBindProps & T)["$el"] & HTMLElement & {
14
+ __base__?: WeakMap<import("@studiometa/js-toolkit").BaseConstructor, Base | "terminated">;
15
+ };
16
+ get prop(): string;
17
+ get value(): any;
18
+ set value(value: any);
19
+ get(): any;
20
+ set(value: boolean | string | string[]): void;
21
+ mounted(): void;
22
+ destroyed(): void;
23
+ }