@studiometa/ui 1.2.0 → 1.4.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 (90) hide show
  1. package/Accordion/Accordion.d.ts +1 -0
  2. package/Accordion/Accordion.js.map +2 -2
  3. package/Action/Action.d.ts +1 -0
  4. package/Action/Action.js.map +2 -2
  5. package/AnchorNav/AnchorNav.d.ts +4 -0
  6. package/AnchorNav/AnchorNav.js.map +2 -2
  7. package/AnchorNav/AnchorNavLink.d.ts +1 -1
  8. package/AnchorScrollTo/AnchorScrollTo.d.ts +2 -1
  9. package/AnchorScrollTo/AnchorScrollTo.js.map +2 -2
  10. package/Button/StyledButton.twig +4 -3
  11. package/CircularMarquee/CircularMarquee.d.ts +2 -1
  12. package/CircularMarquee/CircularMarquee.js.map +2 -2
  13. package/Cursor/Cursor.d.ts +1 -0
  14. package/Cursor/Cursor.js.map +2 -2
  15. package/Data/DataBind.d.ts +15 -7
  16. package/Data/DataBind.js +22 -19
  17. package/Data/DataBind.js.map +2 -2
  18. package/Draggable/Draggable.d.ts +1 -0
  19. package/Draggable/Draggable.js.map +2 -2
  20. package/Fetch/Fetch.d.ts +133 -0
  21. package/Fetch/Fetch.js +275 -0
  22. package/Fetch/Fetch.js.map +7 -0
  23. package/Fetch/index.d.ts +1 -0
  24. package/Fetch/index.js +2 -0
  25. package/Fetch/index.js.map +7 -0
  26. package/Fetch/utils.d.ts +3 -0
  27. package/Fetch/utils.js +28 -0
  28. package/Fetch/utils.js.map +7 -0
  29. package/Figure/Figure.d.ts +1 -1
  30. package/Figure/Figure.js.map +1 -1
  31. package/Figure/FigureShopify.d.ts +3 -2
  32. package/Figure/FigureShopify.js +1 -1
  33. package/Figure/FigureShopify.js.map +2 -2
  34. package/Figure/FigureTwicpics.d.ts +1 -0
  35. package/Figure/FigureTwicpics.js.map +2 -2
  36. package/FigureVideo/FigureVideo.d.ts +1 -0
  37. package/FigureVideo/FigureVideo.js.map +2 -2
  38. package/FigureVideo/FigureVideoTwicpics.d.ts +2 -1
  39. package/FigureVideo/FigureVideoTwicpics.js.map +2 -2
  40. package/Frame/Frame.d.ts +1 -1
  41. package/Frame/Frame.js.map +1 -1
  42. package/Frame/FrameForm.d.ts +1 -1
  43. package/Frame/FrameTarget.js +7 -4
  44. package/Frame/FrameTarget.js.map +2 -2
  45. package/Hoverable/Hoverable.d.ts +1 -1
  46. package/Hoverable/Hoverable.js.map +1 -1
  47. package/LargeText/LargeText.d.ts +2 -1
  48. package/LargeText/LargeText.js.map +2 -2
  49. package/LazyInclude/LazyInclude.d.ts +1 -0
  50. package/LazyInclude/LazyInclude.js.map +2 -2
  51. package/Menu/Menu.d.ts +1 -0
  52. package/Menu/Menu.js.map +2 -2
  53. package/Menu/MenuList.d.ts +1 -1
  54. package/Modal/Modal.d.ts +1 -0
  55. package/Modal/Modal.js.map +2 -2
  56. package/Modal/Modal.twig +3 -3
  57. package/Panel/Panel.d.ts +1 -0
  58. package/Panel/Panel.js +4 -2
  59. package/Panel/Panel.js.map +2 -2
  60. package/Panel/Panel.twig +2 -2
  61. package/Prefetch/AbstractPrefetch.d.ts +1 -1
  62. package/Prefetch/AbstractPrefetch.js.map +1 -1
  63. package/Prefetch/PrefetchWhenOver.d.ts +1 -1
  64. package/Prefetch/PrefetchWhenOver.js.map +1 -1
  65. package/Prefetch/PrefetchWhenVisible.d.ts +1 -1
  66. package/Prefetch/PrefetchWhenVisible.js.map +1 -1
  67. package/README.md +0 -1
  68. package/ScrollAnimation/ScrollAnimation.d.ts +1 -0
  69. package/ScrollAnimation/ScrollAnimation.js.map +2 -2
  70. package/ScrollAnimation/ScrollAnimationChildWithEase.d.ts +1 -1
  71. package/ScrollAnimation/ScrollAnimationWithEase.d.ts +3 -10
  72. package/ScrollAnimation/ScrollAnimationWithEase.js.map +2 -2
  73. package/ScrollReveal/ScrollReveal.d.ts +1 -0
  74. package/ScrollReveal/ScrollReveal.js.map +2 -2
  75. package/Sentinel/Sentinel.d.ts +1 -0
  76. package/Sentinel/Sentinel.js.map +2 -2
  77. package/Slider/Slider.d.ts +1 -6
  78. package/Slider/Slider.js +0 -16
  79. package/Slider/Slider.js.map +2 -2
  80. package/Slider/SliderDots.d.ts +1 -1
  81. package/Sticky/Sticky.d.ts +1 -0
  82. package/Sticky/Sticky.js.map +2 -2
  83. package/Tabs/Tabs.d.ts +1 -0
  84. package/Tabs/Tabs.js.map +2 -2
  85. package/Transition/Transition.d.ts +2 -1
  86. package/Transition/Transition.js.map +2 -2
  87. package/index.d.ts +1 -0
  88. package/index.js +1 -0
  89. package/index.js.map +2 -2
  90. package/package.json +3 -3
@@ -3,6 +3,7 @@ import { AccordionCore } from './AccordionCore.js';
3
3
  import type { AccordionProps } from './AccordionCore.js';
4
4
  /**
5
5
  * Accordion class.
6
+ * @link https://ui.studiometa.dev/-/components/Accordion/
6
7
  */
7
8
  export declare class Accordion<T extends BaseProps = BaseProps> extends AccordionCore<T & AccordionProps> {
8
9
  static config: BaseConfig;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/Accordion/Accordion.ts"],
4
- "sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { AccordionCore } from './AccordionCore.js';\nimport type { AccordionProps } from './AccordionCore.js';\nimport { AccordionItem } from './AccordionItem.js';\n\n/**\n * Accordion class.\n */\nexport class Accordion<T extends BaseProps = BaseProps> extends AccordionCore<T & AccordionProps> {\n static config: BaseConfig = {\n ...AccordionCore.config,\n components: {\n AccordionItem,\n },\n };\n}\n"],
5
- "mappings": "AACA,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAKvB,MAAM,kBAAmD,cAAkC;AAAA,EAChG,OAAO,SAAqB;AAAA,IAC1B,GAAG,cAAc;AAAA,IACjB,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { AccordionCore } from './AccordionCore.js';\nimport type { AccordionProps } from './AccordionCore.js';\nimport { AccordionItem } from './AccordionItem.js';\n\n/**\n * Accordion class.\n * @link https://ui.studiometa.dev/-/components/Accordion/\n */\nexport class Accordion<T extends BaseProps = BaseProps> extends AccordionCore<T & AccordionProps> {\n static config: BaseConfig = {\n ...AccordionCore.config,\n components: {\n AccordionItem,\n },\n };\n}\n"],
5
+ "mappings": "AACA,SAAS,qBAAqB;AAE9B,SAAS,qBAAqB;AAMvB,MAAM,kBAAmD,cAAkC;AAAA,EAChG,OAAO,SAAqB;AAAA,IAC1B,GAAG,cAAc;AAAA,IACjB,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -11,6 +11,7 @@ export interface ActionProps extends BaseProps {
11
11
  }
12
12
  /**
13
13
  * Action class.
14
+ * @link https://ui.studiometa.dev/-/components/Action/
14
15
  */
15
16
  export declare class Action<T extends BaseProps = BaseProps> extends Base<ActionProps & T> {
16
17
  static config: BaseConfig;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/Action/Action.ts"],
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;",
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 * @link https://ui.studiometa.dev/-/components/Action/\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;AAerB,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
  }
@@ -8,6 +8,10 @@ export interface AnchorNavProps extends BaseProps {
8
8
  AnchorNavTarget: AnchorNavTarget[];
9
9
  };
10
10
  }
11
+ /**
12
+ * AnchorNav class.
13
+ * @link https://ui.studiometa.dev/-/components/AnchorNav/
14
+ */
11
15
  export declare class AnchorNav<T extends BaseProps = BaseProps> extends Base<T & AnchorNavProps> {
12
16
  /**
13
17
  * Config
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/AnchorNav/AnchorNav.ts"],
4
- "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { AnchorNavLink } from './AnchorNavLink.js';\nimport { AnchorNavTarget } from './AnchorNavTarget.js';\n\nexport interface AnchorNavProps extends BaseProps {\n $children: {\n AnchorNavLink: AnchorNavLink[];\n AnchorNavTarget: AnchorNavTarget[];\n };\n}\n\nexport class AnchorNav<T extends BaseProps = BaseProps> extends Base<T & AnchorNavProps> {\n /**\n * Config\n */\n static config: BaseConfig = {\n name: 'AnchorNav',\n components: {\n AnchorNavLink,\n AnchorNavTarget,\n },\n };\n\n /**\n * Listen to the AnchorNavTarget that is mounted\n */\n onAnchorNavTargetMounted({ target }: { target: AnchorNavTarget }) {\n const { id } = target.$el;\n this.$children.AnchorNavLink.forEach((anchorNavLink) => {\n if (id === anchorNavLink.targetId) {\n anchorNavLink.enter();\n }\n });\n }\n\n /**\n * Listen to the AnchorNavTarget that is destroyed\n */\n onAnchorNavTargetDestroyed({ target }: { target: AnchorNavTarget }) {\n const { id } = target.$el;\n this.$children.AnchorNavLink.forEach((anchorNavLink) => {\n if (id === anchorNavLink.targetId) {\n anchorNavLink.leave();\n }\n });\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AASzB,MAAM,kBAAmD,KAAyB;AAAA;AAAA;AAAA;AAAA,EAIvF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,YAAY;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,EAAE,OAAO,GAAgC;AAChE,UAAM,EAAE,GAAG,IAAI,OAAO;AACtB,SAAK,UAAU,cAAc,QAAQ,CAAC,kBAAkB;AACtD,UAAI,OAAO,cAAc,UAAU;AACjC,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,2BAA2B,EAAE,OAAO,GAAgC;AAClE,UAAM,EAAE,GAAG,IAAI,OAAO;AACtB,SAAK,UAAU,cAAc,QAAQ,CAAC,kBAAkB;AACtD,UAAI,OAAO,cAAc,UAAU;AACjC,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { AnchorNavLink } from './AnchorNavLink.js';\nimport { AnchorNavTarget } from './AnchorNavTarget.js';\n\nexport interface AnchorNavProps extends BaseProps {\n $children: {\n AnchorNavLink: AnchorNavLink[];\n AnchorNavTarget: AnchorNavTarget[];\n };\n}\n\n/**\n * AnchorNav class.\n * @link https://ui.studiometa.dev/-/components/AnchorNav/\n */\nexport class AnchorNav<T extends BaseProps = BaseProps> extends Base<T & AnchorNavProps> {\n /**\n * Config\n */\n static config: BaseConfig = {\n name: 'AnchorNav',\n components: {\n AnchorNavLink,\n AnchorNavTarget,\n },\n };\n\n /**\n * Listen to the AnchorNavTarget that is mounted\n */\n onAnchorNavTargetMounted({ target }: { target: AnchorNavTarget }) {\n const { id } = target.$el;\n this.$children.AnchorNavLink.forEach((anchorNavLink) => {\n if (id === anchorNavLink.targetId) {\n anchorNavLink.enter();\n }\n });\n }\n\n /**\n * Listen to the AnchorNavTarget that is destroyed\n */\n onAnchorNavTargetDestroyed({ target }: { target: AnchorNavTarget }) {\n const { id } = target.$el;\n this.$children.AnchorNavLink.forEach((anchorNavLink) => {\n if (id === anchorNavLink.targetId) {\n anchorNavLink.leave();\n }\n });\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAazB,MAAM,kBAAmD,KAAyB;AAAA;AAAA;AAAA;AAAA,EAIvF,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,YAAY;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAyB,EAAE,OAAO,GAAgC;AAChE,UAAM,EAAE,GAAG,IAAI,OAAO;AACtB,SAAK,UAAU,cAAc,QAAQ,CAAC,kBAAkB;AACtD,UAAI,OAAO,cAAc,UAAU;AACjC,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,2BAA2B,EAAE,OAAO,GAAgC;AAClE,UAAM,EAAE,GAAG,IAAI,OAAO;AACtB,SAAK,UAAU,cAAc,QAAQ,CAAC,kBAAkB;AACtD,UAAI,OAAO,cAAc,UAAU;AACjC,sBAAc,MAAM;AAAA,MACtB;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -5,7 +5,7 @@ export interface AnchorNavLinkProps extends AnchorScrollToProps {
5
5
  id: string;
6
6
  };
7
7
  }
8
- declare const AnchorNavLink_base: import("@studiometa/js-toolkit").BaseDecorator<import("../decorators/withTransition.js").TransitionInterface, import("@studiometa/js-toolkit").Base<import("@studiometa/js-toolkit").BaseProps>, import("../decorators/withTransition.js").TransitionProps>;
8
+ declare const AnchorNavLink_base: import("@studiometa/js-toolkit").BaseDecorator<import("#private/index.js").TransitionInterface, import("@studiometa/js-toolkit").Base<import("@studiometa/js-toolkit").BaseProps>, import("#private/index.js").TransitionProps>;
9
9
  /**
10
10
  * Manage a slider item and its state transition.
11
11
  */
@@ -5,7 +5,8 @@ export interface AnchorScrollToProps extends BaseProps {
5
5
  $el: HTMLAnchorElement;
6
6
  }
7
7
  /**
8
- * AncorScrollTo class.
8
+ * AnchorScrollTo class.
9
+ * @link https://ui.studiometa.dev/-/components/AnchorScrollto/
9
10
  */
10
11
  export declare class AnchorScrollTo<T extends BaseProps = BaseProps> extends Base<AnchorScrollToProps & T> {
11
12
  static config: BaseConfig;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/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 */\n get targetSelector(): Parameters<typeof scrollTo>[0] {\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,EAKA,IAAI,iBAAiD;AACnD,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;",
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 * AnchorScrollTo class.\n * @link https://ui.studiometa.dev/-/components/AnchorScrollto/\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 */\n get targetSelector(): Parameters<typeof scrollTo>[0] {\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;AAUlB,MAAM,uBAAwD,KAA8B;AAAA,EACjG,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,iBAAiD;AACnD,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
  }
@@ -39,13 +39,14 @@
39
39
 
40
40
  {% set theme_primary = [
41
41
  'text-white bg-black dark:text-black dark:bg-white',
42
- 'hover:bg-opacity-75 disabled:bg-opacity-50'
42
+ 'hover:bg-black/75 dark:hover:bg-white/75',
43
+ 'disabled:bg-black/50 dark:disabled:bg-white/50',
43
44
  ] %}
44
45
 
45
46
  {% set theme_secondary = [
46
- 'ring ring-inset ring-2 ring-black dark:ring-white ring-opacity-25 dark:ring-opacity-25',
47
+ 'ring ring-inset ring-2 ring-black/25 dark:ring-white/25',
47
48
  {
48
- 'hover:ring-opacity-100': (attr is defined and attr.disabled is not defined)
49
+ 'hover:ring-black dark:hover:ring-white': (attr is defined and attr.disabled is not defined)
49
50
  or attr is not defined
50
51
  }
51
52
  ] %}
@@ -5,7 +5,8 @@ export interface CircularMarqueeProps extends BaseProps {
5
5
  };
6
6
  }
7
7
  /**
8
- * CircularMarquee component
8
+ * CircularMarquee class.
9
+ * @link https://ui.studiometa.dev/-/components/CircularMarquee/
9
10
  */
10
11
  export declare class CircularMarquee extends Base<CircularMarqueeProps> {
11
12
  /**
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/CircularMarquee/CircularMarquee.ts"],
4
- "sourcesContent": ["import { Base, BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { damp, transform } from '@studiometa/js-toolkit/utils';\n\nexport interface CircularMarqueeProps extends BaseProps {\n $options: {\n sensitivity: number;\n };\n}\n\n/**\n * CircularMarquee component\n */\nexport class CircularMarquee extends Base<CircularMarqueeProps> {\n /**\n * CircularMarquee Configuration\n */\n static config: BaseConfig = {\n name: 'CircularMarquee',\n options: {\n sensitivity: {\n type: Number,\n default: 0.1,\n },\n },\n };\n\n /**\n * Rotate value.\n * @type {number}\n */\n rotate = 0;\n\n /**\n * Scroll delta Y.\n * @type {number}\n */\n deltaY = 0;\n\n /**\n * Transform values.\n * @type {object}\n */\n transform = {\n rotate: 0,\n };\n\n scrolled(props) {\n this.deltaY = props.delta.y;\n }\n\n ticked() {\n this.rotate -= (Math.abs(this.deltaY) + 1) * this.$options.sensitivity;\n\n this.transform.rotate = damp(this.rotate, this.transform.rotate, 0.25);\n\n return () => {\n transform(this.$el, this.transform);\n };\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAmC;AAC5C,SAAS,MAAM,iBAAiB;AAWzB,MAAM,wBAAwB,KAA2B;AAAA;AAAA;AAAA;AAAA,EAI9D,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EAEA,SAAS,OAAO;AACd,SAAK,SAAS,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEA,SAAS;AACP,SAAK,WAAW,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;AAE3D,SAAK,UAAU,SAAS,KAAK,KAAK,QAAQ,KAAK,UAAU,QAAQ,IAAI;AAErE,WAAO,MAAM;AACX,gBAAU,KAAK,KAAK,KAAK,SAAS;AAAA,IACpC;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Base, BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { damp, transform } from '@studiometa/js-toolkit/utils';\n\nexport interface CircularMarqueeProps extends BaseProps {\n $options: {\n sensitivity: number;\n };\n}\n\n/**\n * CircularMarquee class.\n * @link https://ui.studiometa.dev/-/components/CircularMarquee/\n */\nexport class CircularMarquee extends Base<CircularMarqueeProps> {\n /**\n * CircularMarquee Configuration\n */\n static config: BaseConfig = {\n name: 'CircularMarquee',\n options: {\n sensitivity: {\n type: Number,\n default: 0.1,\n },\n },\n };\n\n /**\n * Rotate value.\n * @type {number}\n */\n rotate = 0;\n\n /**\n * Scroll delta Y.\n * @type {number}\n */\n deltaY = 0;\n\n /**\n * Transform values.\n * @type {object}\n */\n transform = {\n rotate: 0,\n };\n\n scrolled(props) {\n this.deltaY = props.delta.y;\n }\n\n ticked() {\n this.rotate -= (Math.abs(this.deltaY) + 1) * this.$options.sensitivity;\n\n this.transform.rotate = damp(this.rotate, this.transform.rotate, 0.25);\n\n return () => {\n transform(this.$el, this.transform);\n };\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAmC;AAC5C,SAAS,MAAM,iBAAiB;AAYzB,MAAM,wBAAwB,KAA2B;AAAA;AAAA;AAAA;AAAA,EAI9D,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,aAAa;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,YAAY;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EAEA,SAAS,OAAO;AACd,SAAK,SAAS,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEA,SAAS;AACP,SAAK,WAAW,KAAK,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;AAE3D,SAAK,UAAU,SAAS,KAAK,KAAK,QAAQ,KAAK,UAAU,QAAQ,IAAI;AAErE,WAAO,MAAM;AACX,gBAAU,KAAK,KAAK,KAAK,SAAS;AAAA,IACpC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -14,6 +14,7 @@ export interface CursorProps extends BaseProps {
14
14
  }
15
15
  /**
16
16
  * Cursor class.
17
+ * @link https://ui.studiometa.dev/-/components/Cursor/
17
18
  */
18
19
  export declare class Cursor<T extends BaseProps = BaseProps> extends Base<CursorProps & T> {
19
20
  static config: BaseConfig;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/Cursor/Cursor.ts"],
4
- "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, PointerServiceProps, BaseProps } from '@studiometa/js-toolkit';\nimport { damp, matrix } from '@studiometa/js-toolkit/utils';\n\nexport interface CursorProps extends BaseProps {\n $options: {\n growSelectors: string;\n shrinkSelectors: string;\n scale: number;\n growTo: number;\n shrinkTo: number;\n translateDampFactor: number;\n growDampFactor: number;\n shrinkDampFactor: number;\n };\n}\n\n/**\n * Cursor class.\n */\nexport class Cursor<T extends BaseProps = BaseProps> extends Base<CursorProps & T> {\n static config: BaseConfig = {\n name: 'Cursor',\n options: {\n growSelectors: {\n type: String,\n default: 'a, a *, button, button *, [data-cursor-grow], [data-cursor-grow] *',\n },\n shrinkSelectors: {\n type: String,\n default: '[data-cursor-shrink], [data-cursor-shrink] *',\n },\n scale: {\n type: Number,\n default: 1,\n },\n growTo: {\n type: Number,\n default: 2,\n },\n shrinkTo: {\n type: Number,\n default: 0.5,\n },\n translateDampFactor: {\n type: Number,\n default: 0.25,\n },\n growDampFactor: {\n type: Number,\n default: 0.25,\n },\n shrinkDampFactor: {\n type: Number,\n default: 0.25,\n },\n },\n };\n\n x = 0;\n\n y = 0;\n\n scale = 0;\n\n pointerX = 0;\n\n pointerY = 0;\n\n pointerScale = 0;\n\n /**\n * Mounted hook.\n */\n mounted() {\n this.x = 0;\n this.y = 0;\n this.scale = 0;\n this.pointerX = 0;\n this.pointerY = 0;\n this.pointerScale = 0;\n this.render({ x: this.x, y: this.y, scale: this.scale });\n }\n\n /**\n * Moved hook.\n */\n moved({ event, x, y, isDown }: PointerServiceProps) {\n if (!this.$services.has('ticked')) {\n this.$services.enable('ticked');\n }\n\n this.pointerX = x;\n this.pointerY = y;\n\n let { scale } = this.$options;\n\n if (!event) {\n this.pointerScale = scale;\n return;\n }\n\n const shouldGrow =\n (event.target instanceof Element && event.target.matches(this.$options.growSelectors)) ||\n false;\n const shouldReduce =\n isDown ||\n (event.target instanceof Element && event.target.matches(this.$options.shrinkSelectors)) ||\n false;\n\n if (shouldGrow) {\n scale = this.$options.growTo;\n }\n\n if (shouldReduce) {\n scale = this.$options.shrinkTo;\n }\n\n this.pointerScale = scale;\n }\n\n /**\n * RequestAnimationFrame hook.\n */\n ticked() {\n this.x = damp(this.pointerX, this.x, this.$options.translateDampFactor);\n this.y = damp(this.pointerY, this.y, this.$options.translateDampFactor);\n this.scale = damp(\n this.pointerScale,\n this.scale,\n this.pointerScale < this.scale\n ? this.$options.shrinkDampFactor\n : this.$options.growDampFactor,\n );\n\n this.render({ x: this.x, y: this.y, scale: this.scale });\n\n if (this.x === this.pointerX && this.y === this.pointerY && this.scale === this.pointerScale) {\n this.$services.disable('ticked');\n }\n }\n\n /**\n * Render the cursor.\n */\n render({ x, y, scale }: { x: number; y: number; scale: number }) {\n const transform = matrix({\n translateX: x,\n translateY: y,\n scaleX: scale,\n scaleY: scale,\n });\n this.$el.style.transform = `translateZ(0) ${transform}`;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseConfig, PointerServiceProps, BaseProps } from '@studiometa/js-toolkit';\nimport { damp, matrix } from '@studiometa/js-toolkit/utils';\n\nexport interface CursorProps extends BaseProps {\n $options: {\n growSelectors: string;\n shrinkSelectors: string;\n scale: number;\n growTo: number;\n shrinkTo: number;\n translateDampFactor: number;\n growDampFactor: number;\n shrinkDampFactor: number;\n };\n}\n\n/**\n * Cursor class.\n * @link https://ui.studiometa.dev/-/components/Cursor/\n */\nexport class Cursor<T extends BaseProps = BaseProps> extends Base<CursorProps & T> {\n static config: BaseConfig = {\n name: 'Cursor',\n options: {\n growSelectors: {\n type: String,\n default: 'a, a *, button, button *, [data-cursor-grow], [data-cursor-grow] *',\n },\n shrinkSelectors: {\n type: String,\n default: '[data-cursor-shrink], [data-cursor-shrink] *',\n },\n scale: {\n type: Number,\n default: 1,\n },\n growTo: {\n type: Number,\n default: 2,\n },\n shrinkTo: {\n type: Number,\n default: 0.5,\n },\n translateDampFactor: {\n type: Number,\n default: 0.25,\n },\n growDampFactor: {\n type: Number,\n default: 0.25,\n },\n shrinkDampFactor: {\n type: Number,\n default: 0.25,\n },\n },\n };\n\n x = 0;\n\n y = 0;\n\n scale = 0;\n\n pointerX = 0;\n\n pointerY = 0;\n\n pointerScale = 0;\n\n /**\n * Mounted hook.\n */\n mounted() {\n this.x = 0;\n this.y = 0;\n this.scale = 0;\n this.pointerX = 0;\n this.pointerY = 0;\n this.pointerScale = 0;\n this.render({ x: this.x, y: this.y, scale: this.scale });\n }\n\n /**\n * Moved hook.\n */\n moved({ event, x, y, isDown }: PointerServiceProps) {\n if (!this.$services.has('ticked')) {\n this.$services.enable('ticked');\n }\n\n this.pointerX = x;\n this.pointerY = y;\n\n let { scale } = this.$options;\n\n if (!event) {\n this.pointerScale = scale;\n return;\n }\n\n const shouldGrow =\n (event.target instanceof Element && event.target.matches(this.$options.growSelectors)) ||\n false;\n const shouldReduce =\n isDown ||\n (event.target instanceof Element && event.target.matches(this.$options.shrinkSelectors)) ||\n false;\n\n if (shouldGrow) {\n scale = this.$options.growTo;\n }\n\n if (shouldReduce) {\n scale = this.$options.shrinkTo;\n }\n\n this.pointerScale = scale;\n }\n\n /**\n * RequestAnimationFrame hook.\n */\n ticked() {\n this.x = damp(this.pointerX, this.x, this.$options.translateDampFactor);\n this.y = damp(this.pointerY, this.y, this.$options.translateDampFactor);\n this.scale = damp(\n this.pointerScale,\n this.scale,\n this.pointerScale < this.scale\n ? this.$options.shrinkDampFactor\n : this.$options.growDampFactor,\n );\n\n this.render({ x: this.x, y: this.y, scale: this.scale });\n\n if (this.x === this.pointerX && this.y === this.pointerY && this.scale === this.pointerScale) {\n this.$services.disable('ticked');\n }\n }\n\n /**\n * Render the cursor.\n */\n render({ x, y, scale }: { x: number; y: number; scale: number }) {\n const transform = matrix({\n translateX: x,\n translateY: y,\n scaleX: scale,\n scaleY: scale,\n });\n this.$el.style.transform = `translateZ(0) ${transform}`;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,21 +3,29 @@ import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';
3
3
  export interface DataBindProps extends BaseProps {
4
4
  $options: {
5
5
  prop: string;
6
- group: string;
6
+ immediate: boolean;
7
7
  };
8
8
  }
9
- export declare class DataBind<T extends BaseProps = BaseProps> extends Base<DataBindProps & T> {
9
+ declare const DataBind_base: import("@studiometa/js-toolkit").BaseDecorator<import("@studiometa/js-toolkit").WithGroupInterface, Base<BaseProps>, import("@studiometa/js-toolkit").WithGroupProps>;
10
+ /**
11
+ * DataBind class.
12
+ * @link https://ui.studiometa.dev/-/components/DataBind/
13
+ */
14
+ export declare class DataBind<T extends BaseProps = BaseProps> extends DataBind_base<DataBindProps & T> {
10
15
  static config: BaseConfig;
11
- get relatedInstances(): Set<DataBind<BaseProps>>;
16
+ /**
17
+ * @deprecated Use the `$group` getter instead.
18
+ */
19
+ get relatedInstances(): Set<this>;
12
20
  get multiple(): boolean;
13
- get target(): (DataBindProps & T)["$el"] & HTMLElement & {
14
- __base__?: WeakMap<import("@studiometa/js-toolkit").BaseConstructor, Base | "terminated">;
15
- };
21
+ get target(): HTMLElement & {
22
+ __base__?: Map<string, "terminated" | Base<BaseProps>>;
23
+ } & (DataBindProps & T & import("@studiometa/js-toolkit").WithGroupProps)["$el"];
16
24
  get prop(): string;
17
25
  get value(): any;
18
26
  set value(value: any);
19
27
  get(): any;
20
28
  set(value: boolean | string | string[], dispatch?: boolean): void;
21
29
  mounted(): void;
22
- destroyed(): void;
23
30
  }
31
+ export {};
package/Data/DataBind.js CHANGED
@@ -1,24 +1,19 @@
1
- import { Base } from "@studiometa/js-toolkit";
2
- import { isArray } from "@studiometa/js-toolkit/utils";
1
+ import { Base, withGroup } from "@studiometa/js-toolkit";
2
+ import { isArray, nextTick } from "@studiometa/js-toolkit/utils";
3
3
  import { isInput, isCheckbox, isSelect } from "./utils.js";
4
- const groups = /* @__PURE__ */ new Map();
5
- class DataBind extends Base {
4
+ class DataBind extends withGroup(Base, "data:") {
6
5
  static config = {
7
6
  name: "DataBind",
8
7
  options: {
9
8
  prop: String,
10
- group: String
9
+ immediate: Boolean
11
10
  }
12
11
  };
12
+ /**
13
+ * @deprecated Use the `$group` getter instead.
14
+ */
13
15
  get relatedInstances() {
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
- }
20
- }
21
- return instances;
16
+ return this.$group;
22
17
  }
23
18
  get multiple() {
24
19
  return this.$options.group.endsWith("[]");
@@ -32,7 +27,14 @@ class DataBind extends Base {
32
27
  }
33
28
  const { target } = this;
34
29
  if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {
35
- return "value";
30
+ switch (target.type) {
31
+ case "number":
32
+ return "valueAsNumber";
33
+ case "date":
34
+ return "valueAsDate";
35
+ default:
36
+ return "value";
37
+ }
36
38
  }
37
39
  return "textContent";
38
40
  }
@@ -55,7 +57,7 @@ class DataBind extends Base {
55
57
  return values;
56
58
  }
57
59
  const option = target.options.item(target.selectedIndex);
58
- return option.value;
60
+ return option?.value;
59
61
  }
60
62
  if (isCheckbox(target)) {
61
63
  if (multiple) {
@@ -100,10 +102,11 @@ class DataBind extends Base {
100
102
  target[this.prop] = value;
101
103
  }
102
104
  mounted() {
103
- this.relatedInstances.add(this);
104
- }
105
- destroyed() {
106
- this.relatedInstances.delete(this);
105
+ if (this.$options.immediate) {
106
+ nextTick().then(() => {
107
+ this.set(this.get());
108
+ });
109
+ }
107
110
  }
108
111
  }
109
112
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/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 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 || target instanceof HTMLTextAreaElement) {\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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",
4
+ "sourcesContent": ["import { Base, withGroup } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { isArray, nextTick } from '@studiometa/js-toolkit/utils';\nimport { isInput, isCheckbox, isSelect } from './utils.js';\n\nexport interface DataBindProps extends BaseProps {\n $options: {\n prop: string;\n immediate: boolean;\n };\n}\n\n/**\n * DataBind class.\n * @link https://ui.studiometa.dev/-/components/DataBind/\n */\nexport class DataBind<T extends BaseProps = BaseProps> extends withGroup(Base, 'data:')<DataBindProps & T> {\n static config: BaseConfig = {\n name: 'DataBind',\n options: {\n prop: String,\n immediate: Boolean,\n },\n };\n\n /**\n * @deprecated Use the `$group` getter instead.\n */\n get relatedInstances() {\n return this.$group as Set<this>;\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 || target instanceof HTMLTextAreaElement) {\n switch (target.type) {\n case 'number':\n return 'valueAsNumber';\n case 'date':\n return 'valueAsDate';\n default:\n return 'value';\n }\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 = [] as string[];\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 if (this.$options.immediate) {\n nextTick().then(() => {\n this.set(this.get());\n });\n }\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["option"]
7
7
  }
@@ -17,6 +17,7 @@ export interface DraggableProps extends BaseProps {
17
17
  declare const Draggable_base: import("@studiometa/js-toolkit").BaseDecorator<import("@studiometa/js-toolkit").BaseInterface, Base<BaseProps>>;
18
18
  /**
19
19
  * Draggable class.
20
+ * @link https://ui.studiometa.dev/-/components/Draggable/
20
21
  */
21
22
  export declare class Draggable<T extends BaseProps = BaseProps> extends Draggable_base<T & DraggableProps> {
22
23
  /**
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../packages/ui/Draggable/Draggable.ts"],
4
- "sourcesContent": ["import { Base, withDrag } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig, DragServiceProps } from '@studiometa/js-toolkit';\nimport {\n clamp,\n damp,\n domScheduler,\n getOffsetSizes,\n map,\n transform,\n} from '@studiometa/js-toolkit/utils';\n\nexport interface DraggableProps extends BaseProps {\n $refs: {\n target: HTMLElement;\n };\n $options: {\n x: boolean;\n y: boolean;\n fitBounds: boolean;\n strictFitBounds: boolean;\n sensitivity: number;\n dropSensitivity: number;\n margin: string;\n };\n}\n\n/**\n * Draggable class.\n */\nexport class Draggable<T extends BaseProps = BaseProps> extends withDrag(Base, {\n // @ts-expect-error draggable is instance of Draggable.\n target: (draggable) => draggable.target,\n})<T & DraggableProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Draggable',\n refs: ['target'],\n emits: [\n 'drag-start',\n 'drag-drag',\n 'drag-drop',\n 'drag-inertia',\n 'drag-stop',\n 'drag-fit',\n 'drag-render',\n ],\n options: {\n x: {\n type: Boolean,\n default: true,\n },\n y: {\n type: Boolean,\n default: true,\n },\n fitBounds: Boolean,\n strictFitBounds: Boolean,\n sensitivity: { type: Number, default: 0.5 },\n dropSensitivity: { type: Number, default: 0.1 },\n margin: { type: String, default: '0' },\n },\n };\n\n /**\n * Props for the target position.\n */\n props = {\n x: 0,\n y: 0,\n progressX: 0,\n progressY: 0,\n originX: 0,\n originY: 0,\n dampedX: 0,\n dampedY: 0,\n };\n\n /**\n * Smooth factor.\n */\n dampFactor = 0.5;\n\n /**\n * The draggable element, defaults to `this.$refs.target`.\n */\n get target(): HTMLElement {\n return this.$refs.target;\n }\n\n /**\n * The bouding element, defaults to `this.$el`.\n */\n get parent(): HTMLElement {\n return this.$el;\n }\n\n /**\n * Draggable area bounds.\n * @private Use the `bounds` getter instead.\n */\n __bounds: {\n yMin: number;\n yMax: number;\n xMin: number;\n xMax: number;\n };\n\n /**\n * Cached margin values.\n * @private\n */\n __margin: { top: number; right: number; bottom: number; left: number };\n\n /**\n * Cached margin option for invalidation.\n * @private\n */\n __marginOption: string;\n\n /**\n * Offset from the bounds.\n */\n get margin() {\n const marginOption = this.$options.margin;\n\n if (this.__margin && this.__marginOption === marginOption) {\n return this.__margin;\n }\n\n const values = marginOption.split(' ').map(Number);\n let [top = 0] = values;\n let right = top;\n let bottom = top;\n let left = top;\n\n switch (values.length) {\n case 4:\n [top, right, bottom, left] = values;\n break;\n case 3:\n [top, right, bottom] = values;\n left = right;\n break;\n case 2:\n [top, right] = values;\n left = right;\n bottom = top;\n break;\n }\n\n this.__margin = { top, right, bottom, left };\n this.__marginOption = marginOption;\n\n return this.__margin;\n }\n\n /**\n * Draggable area bounds.\n */\n get bounds() {\n if (!this.__bounds) {\n const { target, parent, margin } = this;\n const targetSizes = getOffsetSizes(target);\n const parentSizes = getOffsetSizes(parent);\n const xMin = targetSizes.x - parentSizes.x;\n const yMin = targetSizes.y - parentSizes.y;\n const xMax = xMin + targetSizes.width - parentSizes.width;\n const yMax = yMin + targetSizes.height - parentSizes.height;\n\n this.__bounds = {\n yMin: (yMin - margin.top) * -1,\n yMax: (yMax + margin.bottom) * -1,\n xMin: (xMin - margin.left) * -1,\n xMax: (xMax + margin.right) * -1,\n };\n }\n\n return this.__bounds;\n }\n\n /**\n * Resized hook.\n * Reset bounds on resize.\n */\n resized() {\n this.__bounds = null;\n }\n\n /**\n * Drag service hook.\n */\n dragged(props: DragServiceProps) {\n this.$emit(`drag-${props.mode}`, this.props);\n const { fitBounds, strictFitBounds, sensitivity, dropSensitivity } = this.$options;\n const { bounds } = this;\n\n if (props.mode === props.MODES.START) {\n this.props.originX = this.props.x;\n this.props.originY = this.props.y;\n this.dampFactor = sensitivity;\n this.render();\n } else if (\n props.mode === props.MODES.DRAG ||\n (props.mode === props.MODES.INERTIA && !fitBounds)\n ) {\n this.props.x = this.props.originX + props.x - props.origin.x;\n this.props.y = this.props.originY + props.y - props.origin.y;\n\n if (strictFitBounds) {\n this.props.x = clamp(this.props.x, bounds.xMin, bounds.xMax);\n this.props.y = clamp(this.props.y, bounds.yMin, bounds.yMax);\n }\n\n this.render();\n } else if (props.mode === props.MODES.DROP && fitBounds) {\n this.props.x = clamp(\n this.props.originX + props.final.x - props.origin.x,\n bounds.xMin,\n bounds.xMax,\n );\n this.props.y = clamp(\n this.props.originY + props.final.y - props.origin.y,\n bounds.yMin,\n bounds.yMax,\n );\n this.dampFactor = dropSensitivity;\n this.$services.enable('ticked');\n }\n }\n\n ticked() {\n this.$emit(`drag-inertia`, this.props);\n this.render();\n if (this.props.dampedX === this.props.x && this.props.dampedY === this.props.y) {\n this.$services.disable('ticked');\n this.$emit('drag-fit', this.props);\n }\n }\n\n render() {\n const { props } = this;\n props.dampedX = damp(props.x, props.dampedX, this.dampFactor);\n props.dampedY = damp(props.y, props.dampedY, this.dampFactor);\n\n domScheduler.read(() => {\n const { bounds } = this;\n const { x, y } = this.$options;\n\n domScheduler.write(() => {\n props.progressX = map(props.x, bounds.xMin, bounds.xMax, 0, 1);\n props.progressY = map(props.y, bounds.yMin, bounds.yMax, 0, 1);\n\n transform(this.target, {\n x: x ? props.dampedX : 0,\n y: y ? props.dampedY : 0,\n });\n\n this.$emit('drag-render', this.props);\n });\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Base, withDrag } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig, DragServiceProps } from '@studiometa/js-toolkit';\nimport {\n clamp,\n damp,\n domScheduler,\n getOffsetSizes,\n map,\n transform,\n} from '@studiometa/js-toolkit/utils';\n\nexport interface DraggableProps extends BaseProps {\n $refs: {\n target: HTMLElement;\n };\n $options: {\n x: boolean;\n y: boolean;\n fitBounds: boolean;\n strictFitBounds: boolean;\n sensitivity: number;\n dropSensitivity: number;\n margin: string;\n };\n}\n\n/**\n * Draggable class.\n * @link https://ui.studiometa.dev/-/components/Draggable/\n */\nexport class Draggable<T extends BaseProps = BaseProps> extends withDrag(Base, {\n // @ts-expect-error draggable is instance of Draggable.\n target: (draggable) => draggable.target,\n})<T & DraggableProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n name: 'Draggable',\n refs: ['target'],\n emits: [\n 'drag-start',\n 'drag-drag',\n 'drag-drop',\n 'drag-inertia',\n 'drag-stop',\n 'drag-fit',\n 'drag-render',\n ],\n options: {\n x: {\n type: Boolean,\n default: true,\n },\n y: {\n type: Boolean,\n default: true,\n },\n fitBounds: Boolean,\n strictFitBounds: Boolean,\n sensitivity: { type: Number, default: 0.5 },\n dropSensitivity: { type: Number, default: 0.1 },\n margin: { type: String, default: '0' },\n },\n };\n\n /**\n * Props for the target position.\n */\n props = {\n x: 0,\n y: 0,\n progressX: 0,\n progressY: 0,\n originX: 0,\n originY: 0,\n dampedX: 0,\n dampedY: 0,\n };\n\n /**\n * Smooth factor.\n */\n dampFactor = 0.5;\n\n /**\n * The draggable element, defaults to `this.$refs.target`.\n */\n get target(): HTMLElement {\n return this.$refs.target;\n }\n\n /**\n * The bouding element, defaults to `this.$el`.\n */\n get parent(): HTMLElement {\n return this.$el;\n }\n\n /**\n * Draggable area bounds.\n * @private Use the `bounds` getter instead.\n */\n __bounds: {\n yMin: number;\n yMax: number;\n xMin: number;\n xMax: number;\n };\n\n /**\n * Cached margin values.\n * @private\n */\n __margin: { top: number; right: number; bottom: number; left: number };\n\n /**\n * Cached margin option for invalidation.\n * @private\n */\n __marginOption: string;\n\n /**\n * Offset from the bounds.\n */\n get margin() {\n const marginOption = this.$options.margin;\n\n if (this.__margin && this.__marginOption === marginOption) {\n return this.__margin;\n }\n\n const values = marginOption.split(' ').map(Number);\n let [top = 0] = values;\n let right = top;\n let bottom = top;\n let left = top;\n\n switch (values.length) {\n case 4:\n [top, right, bottom, left] = values;\n break;\n case 3:\n [top, right, bottom] = values;\n left = right;\n break;\n case 2:\n [top, right] = values;\n left = right;\n bottom = top;\n break;\n }\n\n this.__margin = { top, right, bottom, left };\n this.__marginOption = marginOption;\n\n return this.__margin;\n }\n\n /**\n * Draggable area bounds.\n */\n get bounds() {\n if (!this.__bounds) {\n const { target, parent, margin } = this;\n const targetSizes = getOffsetSizes(target);\n const parentSizes = getOffsetSizes(parent);\n const xMin = targetSizes.x - parentSizes.x;\n const yMin = targetSizes.y - parentSizes.y;\n const xMax = xMin + targetSizes.width - parentSizes.width;\n const yMax = yMin + targetSizes.height - parentSizes.height;\n\n this.__bounds = {\n yMin: (yMin - margin.top) * -1,\n yMax: (yMax + margin.bottom) * -1,\n xMin: (xMin - margin.left) * -1,\n xMax: (xMax + margin.right) * -1,\n };\n }\n\n return this.__bounds;\n }\n\n /**\n * Resized hook.\n * Reset bounds on resize.\n */\n resized() {\n this.__bounds = null;\n }\n\n /**\n * Drag service hook.\n */\n dragged(props: DragServiceProps) {\n this.$emit(`drag-${props.mode}`, this.props);\n const { fitBounds, strictFitBounds, sensitivity, dropSensitivity } = this.$options;\n const { bounds } = this;\n\n if (props.mode === props.MODES.START) {\n this.props.originX = this.props.x;\n this.props.originY = this.props.y;\n this.dampFactor = sensitivity;\n this.render();\n } else if (\n props.mode === props.MODES.DRAG ||\n (props.mode === props.MODES.INERTIA && !fitBounds)\n ) {\n this.props.x = this.props.originX + props.x - props.origin.x;\n this.props.y = this.props.originY + props.y - props.origin.y;\n\n if (strictFitBounds) {\n this.props.x = clamp(this.props.x, bounds.xMin, bounds.xMax);\n this.props.y = clamp(this.props.y, bounds.yMin, bounds.yMax);\n }\n\n this.render();\n } else if (props.mode === props.MODES.DROP && fitBounds) {\n this.props.x = clamp(\n this.props.originX + props.final.x - props.origin.x,\n bounds.xMin,\n bounds.xMax,\n );\n this.props.y = clamp(\n this.props.originY + props.final.y - props.origin.y,\n bounds.yMin,\n bounds.yMax,\n );\n this.dampFactor = dropSensitivity;\n this.$services.enable('ticked');\n }\n }\n\n ticked() {\n this.$emit(`drag-inertia`, this.props);\n this.render();\n if (this.props.dampedX === this.props.x && this.props.dampedY === this.props.y) {\n this.$services.disable('ticked');\n this.$emit('drag-fit', this.props);\n }\n }\n\n render() {\n const { props } = this;\n props.dampedX = damp(props.x, props.dampedX, this.dampFactor);\n props.dampedY = damp(props.y, props.dampedY, this.dampFactor);\n\n domScheduler.read(() => {\n const { bounds } = this;\n const { x, y } = this.$options;\n\n domScheduler.write(() => {\n props.progressX = map(props.x, bounds.xMin, bounds.xMax, 0, 1);\n props.progressY = map(props.y, bounds.yMin, bounds.yMax, 0, 1);\n\n transform(this.target, {\n x: x ? props.dampedX : 0,\n y: y ? props.dampedY : 0,\n });\n\n this.$emit('drag-render', this.props);\n });\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,133 @@
1
+ import { Base, type BaseConfig, type BaseProps } from '@studiometa/js-toolkit';
2
+ export interface FetchProps extends BaseProps {
3
+ $el: HTMLAnchorElement | HTMLFormElement;
4
+ $refs: {
5
+ headers: HTMLInputElement[];
6
+ };
7
+ $options: {
8
+ history: boolean;
9
+ requestInit: RequestInit;
10
+ headers: Record<string, string>;
11
+ mode: 'replace' | 'prepend' | 'append' | 'morph';
12
+ selector: string;
13
+ };
14
+ }
15
+ export type FetchConstructor<T extends Fetch = Fetch> = {
16
+ new (...args: any[]): T;
17
+ prototype: Fetch;
18
+ } & Pick<typeof Fetch, keyof typeof Fetch>;
19
+ /**
20
+ * Fetch class.
21
+ * @link https://ui.studiometa.dev/-/components/Fetch/
22
+ */
23
+ export declare class Fetch<T extends BaseProps = BaseProps> extends Base<T & FetchProps> {
24
+ /**
25
+ * Declare the `this.constructor` type
26
+ * @link https://github.com/microsoft/TypeScript/issues/3841#issuecomment-2381594311
27
+ */
28
+ ['constructor']: FetchConstructor;
29
+ /**
30
+ * Fetch events enum.
31
+ */
32
+ static FETCH_EVENTS: {
33
+ readonly BEFORE_FETCH: "fetch-before";
34
+ readonly FETCH: "fetch-fetch";
35
+ readonly AFTER_FETCH: "fetch-after";
36
+ readonly BEFORE_UPDATE: "fetch-update-before";
37
+ readonly UPDATE: "fetch-update";
38
+ readonly AFTER_UPDATE: "fetch-update-after";
39
+ readonly ERROR: "fetch-error";
40
+ };
41
+ /**
42
+ * Fetch modes enum.
43
+ */
44
+ static FETCH_MODES: {
45
+ readonly REPLACE: "replace";
46
+ readonly PREPEND: "prepend";
47
+ readonly APPEND: "append";
48
+ readonly MORPH: "morph";
49
+ };
50
+ /**
51
+ * Config.
52
+ */
53
+ static config: BaseConfig;
54
+ /**
55
+ * Header names used by the requestInit property.
56
+ * @internal
57
+ */
58
+ __headerNames: {
59
+ readonly ACCEPT: "accept";
60
+ readonly X_REQUESTED_BY: "x-requested-by";
61
+ readonly X_TRIGGERED_BY: "x-triggered-by";
62
+ readonly USER_AGENT: "user-agent";
63
+ };
64
+ /**
65
+ * DOM Parser to parse the new content to be injected.
66
+ * @internal
67
+ */
68
+ __domParser: DOMParser;
69
+ /**
70
+ * Abort controller to prevent multiple simultaneous fetches.
71
+ * @internal
72
+ */
73
+ __abortController: AbortController;
74
+ /**
75
+ * The client used for the fetch request.
76
+ */
77
+ get client(): typeof fetch;
78
+ /**
79
+ * The URL to use for the request.
80
+ */
81
+ get url(): URL;
82
+ /**
83
+ * Option for the fetch request.
84
+ */
85
+ get requestInit(): RequestInit;
86
+ /**
87
+ * Is the root element a link?
88
+ */
89
+ get isLink(): boolean;
90
+ /**
91
+ * Is the root element a form?
92
+ */
93
+ get isForm(): boolean;
94
+ /**
95
+ * Emit bubbling events.
96
+ * @inheritdoc
97
+ */
98
+ $emit(event: string, ...args: unknown[]): void;
99
+ /**
100
+ * If root element is a link, prevent its default behavior and fetch its URL.
101
+ */
102
+ onClick({ event }: {
103
+ event: MouseEvent;
104
+ }): void;
105
+ /**
106
+ * If root element is a form, prevent its default behavior on submit and fetch its action
107
+ * following the `method` attribute and with the form's data.
108
+ */
109
+ onSubmit({ event }: {
110
+ event: SubmitEvent;
111
+ }): void;
112
+ /**
113
+ * Update content on history back/forward navigation.
114
+ */
115
+ onWindowPopstate(): void;
116
+ /**
117
+ * Fetch given url.
118
+ */
119
+ fetch(url: URL, requestInit?: RequestInit): Promise<void>;
120
+ /**
121
+ * Update the DOM with new content from the fetched HTML.
122
+ * @internal
123
+ */
124
+ __updateDOM(fragment: Document): void;
125
+ /**
126
+ * Dispatch the contents to update to their matching FrameTarget.
127
+ */
128
+ update(url: URL, requestInit: RequestInit, content: string): Promise<void>;
129
+ /**
130
+ * Handle errors.
131
+ */
132
+ error(url: URL, requestInit: RequestInit, error: Error): void;
133
+ }