@studiometa/ui 0.2.23 → 0.2.24

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 (192) hide show
  1. package/README.md +2 -12
  2. package/atoms/AnchorScrollTo/AnchorScrollTo.cjs +11 -0
  3. package/atoms/AnchorScrollTo/AnchorScrollTo.cjs.map +2 -2
  4. package/atoms/AnchorScrollTo/AnchorScrollTo.js +11 -0
  5. package/atoms/AnchorScrollTo/AnchorScrollTo.js.map +2 -2
  6. package/atoms/Button/StyledButton.twig +6 -4
  7. package/atoms/Button/StyledButtonRounded.twig +65 -0
  8. package/atoms/Cursor/Cursor.cjs +12 -0
  9. package/atoms/Cursor/Cursor.cjs.map +2 -2
  10. package/atoms/Cursor/Cursor.js +12 -0
  11. package/atoms/Cursor/Cursor.js.map +2 -2
  12. package/atoms/Figure/Figure.cjs +27 -3
  13. package/atoms/Figure/Figure.cjs.map +2 -2
  14. package/atoms/Figure/Figure.js +27 -3
  15. package/atoms/Figure/Figure.js.map +2 -2
  16. package/atoms/Figure/Figure.twig +6 -1
  17. package/atoms/Figure/FigureTwicpics.cjs +21 -0
  18. package/atoms/Figure/FigureTwicpics.cjs.map +1 -1
  19. package/atoms/Figure/FigureTwicpics.js +21 -0
  20. package/atoms/Figure/FigureTwicpics.js.map +1 -1
  21. package/atoms/LargeText/LargeText.cjs +27 -0
  22. package/atoms/LargeText/LargeText.cjs.map +2 -2
  23. package/atoms/LargeText/LargeText.js +27 -0
  24. package/atoms/LargeText/LargeText.js.map +2 -2
  25. package/atoms/LazyInclude/LazyInclude.cjs +15 -0
  26. package/atoms/LazyInclude/LazyInclude.cjs.map +2 -2
  27. package/atoms/LazyInclude/LazyInclude.js +15 -0
  28. package/atoms/LazyInclude/LazyInclude.js.map +2 -2
  29. package/atoms/Prefetch/AbstractPrefetch.cjs +12 -0
  30. package/atoms/Prefetch/AbstractPrefetch.cjs.map +2 -2
  31. package/atoms/Prefetch/AbstractPrefetch.js +12 -0
  32. package/atoms/Prefetch/AbstractPrefetch.js.map +2 -2
  33. package/atoms/Prefetch/PrefetchWhenOver.cjs +6 -0
  34. package/atoms/Prefetch/PrefetchWhenOver.cjs.map +2 -2
  35. package/atoms/Prefetch/PrefetchWhenOver.js +6 -0
  36. package/atoms/Prefetch/PrefetchWhenOver.js.map +2 -2
  37. package/atoms/Prefetch/PrefetchWhenVisible.cjs +6 -0
  38. package/atoms/Prefetch/PrefetchWhenVisible.cjs.map +2 -2
  39. package/atoms/Prefetch/PrefetchWhenVisible.js +6 -0
  40. package/atoms/Prefetch/PrefetchWhenVisible.js.map +2 -2
  41. package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs +12 -0
  42. package/atoms/ScrollAnimation/AbstractScrollAnimation.cjs.map +2 -2
  43. package/atoms/ScrollAnimation/AbstractScrollAnimation.js +12 -0
  44. package/atoms/ScrollAnimation/AbstractScrollAnimation.js.map +2 -2
  45. package/atoms/ScrollAnimation/ScrollAnimation.cjs +6 -0
  46. package/atoms/ScrollAnimation/ScrollAnimation.cjs.map +1 -1
  47. package/atoms/ScrollAnimation/ScrollAnimation.js +6 -0
  48. package/atoms/ScrollAnimation/ScrollAnimation.js.map +1 -1
  49. package/atoms/ScrollAnimation/ScrollAnimationChild.cjs +18 -1
  50. package/atoms/ScrollAnimation/ScrollAnimationChild.cjs.map +2 -2
  51. package/atoms/ScrollAnimation/ScrollAnimationChild.js +18 -1
  52. package/atoms/ScrollAnimation/ScrollAnimationChild.js.map +2 -2
  53. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs +3 -0
  54. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.cjs.map +1 -1
  55. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.js +3 -0
  56. package/atoms/ScrollAnimation/ScrollAnimationChildWithEase.js.map +1 -1
  57. package/atoms/ScrollAnimation/ScrollAnimationParent.cjs +6 -0
  58. package/atoms/ScrollAnimation/ScrollAnimationParent.cjs.map +1 -1
  59. package/atoms/ScrollAnimation/ScrollAnimationParent.js +6 -0
  60. package/atoms/ScrollAnimation/ScrollAnimationParent.js.map +1 -1
  61. package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs +3 -0
  62. package/atoms/ScrollAnimation/ScrollAnimationWithEase.cjs.map +1 -1
  63. package/atoms/ScrollAnimation/ScrollAnimationWithEase.js +3 -0
  64. package/atoms/ScrollAnimation/ScrollAnimationWithEase.js.map +1 -1
  65. package/atoms/ScrollAnimation/animationScrollWithEase.cjs +6 -0
  66. package/atoms/ScrollAnimation/animationScrollWithEase.cjs.map +2 -2
  67. package/atoms/ScrollAnimation/animationScrollWithEase.js +6 -0
  68. package/atoms/ScrollAnimation/animationScrollWithEase.js.map +2 -2
  69. package/atoms/ScrollReveal/ScrollReveal.cjs +12 -0
  70. package/atoms/ScrollReveal/ScrollReveal.cjs.map +1 -1
  71. package/atoms/ScrollReveal/ScrollReveal.js +12 -0
  72. package/atoms/ScrollReveal/ScrollReveal.js.map +1 -1
  73. package/decorators/withTransition.cjs +16 -2
  74. package/decorators/withTransition.cjs.map +2 -2
  75. package/decorators/withTransition.js +16 -2
  76. package/decorators/withTransition.js.map +2 -2
  77. package/molecules/Accordion/AccordionCore.cjs +9 -0
  78. package/molecules/Accordion/AccordionCore.cjs.map +2 -2
  79. package/molecules/Accordion/AccordionCore.js +9 -0
  80. package/molecules/Accordion/AccordionCore.js.map +2 -2
  81. package/molecules/Accordion/AccordionItem.cjs +33 -1
  82. package/molecules/Accordion/AccordionItem.cjs.map +2 -2
  83. package/molecules/Accordion/AccordionItem.d.ts +1 -1
  84. package/molecules/Accordion/AccordionItem.js +29 -1
  85. package/molecules/Accordion/AccordionItem.js.map +2 -2
  86. package/molecules/Menu/Menu.cjs +47 -0
  87. package/molecules/Menu/Menu.cjs.map +1 -1
  88. package/molecules/Menu/Menu.js +47 -0
  89. package/molecules/Menu/Menu.js.map +1 -1
  90. package/molecules/Menu/MenuBtn.cjs +24 -0
  91. package/molecules/Menu/MenuBtn.cjs.map +1 -1
  92. package/molecules/Menu/MenuBtn.js +24 -0
  93. package/molecules/Menu/MenuBtn.js.map +1 -1
  94. package/molecules/Menu/MenuList.cjs +39 -0
  95. package/molecules/Menu/MenuList.cjs.map +2 -2
  96. package/molecules/Menu/MenuList.js +39 -0
  97. package/molecules/Menu/MenuList.js.map +2 -2
  98. package/molecules/Modal/Modal.cjs +50 -1
  99. package/molecules/Modal/Modal.cjs.map +2 -2
  100. package/molecules/Modal/Modal.d.ts +3 -3
  101. package/molecules/Modal/Modal.js +50 -1
  102. package/molecules/Modal/Modal.js.map +2 -2
  103. package/molecules/Modal/ModalWithTransition.cjs +6 -0
  104. package/molecules/Modal/ModalWithTransition.cjs.map +2 -2
  105. package/molecules/Modal/ModalWithTransition.js +6 -0
  106. package/molecules/Modal/ModalWithTransition.js.map +2 -2
  107. package/molecules/Panel/Panel.cjs +19 -0
  108. package/molecules/Panel/Panel.cjs.map +2 -2
  109. package/molecules/Panel/Panel.js +19 -0
  110. package/molecules/Panel/Panel.js.map +2 -2
  111. package/molecules/Slider/AbstractSliderChild.cjs +24 -0
  112. package/molecules/Slider/AbstractSliderChild.cjs.map +2 -2
  113. package/molecules/Slider/AbstractSliderChild.js +24 -0
  114. package/molecules/Slider/AbstractSliderChild.js.map +2 -2
  115. package/molecules/Slider/Slider.cjs +97 -0
  116. package/molecules/Slider/Slider.cjs.map +2 -2
  117. package/molecules/Slider/Slider.d.ts +3 -2
  118. package/molecules/Slider/Slider.js +97 -0
  119. package/molecules/Slider/Slider.js.map +2 -2
  120. package/molecules/Slider/SliderBtn.cjs +22 -2
  121. package/molecules/Slider/SliderBtn.cjs.map +2 -2
  122. package/molecules/Slider/SliderBtn.d.ts +1 -0
  123. package/molecules/Slider/SliderBtn.js +22 -2
  124. package/molecules/Slider/SliderBtn.js.map +2 -2
  125. package/molecules/Slider/SliderCount.cjs +9 -0
  126. package/molecules/Slider/SliderCount.cjs.map +2 -2
  127. package/molecules/Slider/SliderCount.js +9 -0
  128. package/molecules/Slider/SliderCount.js.map +2 -2
  129. package/molecules/Slider/SliderDots.cjs +19 -0
  130. package/molecules/Slider/SliderDots.cjs.map +2 -2
  131. package/molecules/Slider/SliderDots.js +19 -0
  132. package/molecules/Slider/SliderDots.js.map +2 -2
  133. package/molecules/Slider/SliderDrag.cjs +15 -0
  134. package/molecules/Slider/SliderDrag.cjs.map +2 -2
  135. package/molecules/Slider/SliderDrag.js +15 -0
  136. package/molecules/Slider/SliderDrag.js.map +2 -2
  137. package/molecules/Slider/SliderItem.cjs +75 -14
  138. package/molecules/Slider/SliderItem.cjs.map +2 -2
  139. package/molecules/Slider/SliderItem.d.ts +12 -11
  140. package/molecules/Slider/SliderItem.js +75 -14
  141. package/molecules/Slider/SliderItem.js.map +2 -2
  142. package/molecules/Slider/SliderProgress.cjs +6 -0
  143. package/molecules/Slider/SliderProgress.cjs.map +2 -2
  144. package/molecules/Slider/SliderProgress.js +6 -0
  145. package/molecules/Slider/SliderProgress.js.map +2 -2
  146. package/molecules/Sticky/Sticky.cjs +56 -0
  147. package/molecules/Sticky/Sticky.cjs.map +2 -2
  148. package/molecules/Sticky/Sticky.js +56 -0
  149. package/molecules/Sticky/Sticky.js.map +2 -2
  150. package/molecules/TableOfContent/TableOfContent.cjs +13 -0
  151. package/molecules/TableOfContent/TableOfContent.cjs.map +1 -1
  152. package/molecules/TableOfContent/TableOfContent.js +13 -0
  153. package/molecules/TableOfContent/TableOfContent.js.map +1 -1
  154. package/molecules/TableOfContent/TableOfContentAnchor.cjs +16 -0
  155. package/molecules/TableOfContent/TableOfContentAnchor.cjs.map +2 -2
  156. package/molecules/TableOfContent/TableOfContentAnchor.js +16 -0
  157. package/molecules/TableOfContent/TableOfContentAnchor.js.map +2 -2
  158. package/molecules/Tabs/Tabs.cjs +16 -0
  159. package/molecules/Tabs/Tabs.cjs.map +2 -2
  160. package/molecules/Tabs/Tabs.d.ts +3 -3
  161. package/molecules/Tabs/Tabs.js +16 -0
  162. package/molecules/Tabs/Tabs.js.map +2 -2
  163. package/organisms/Frame/Frame.cjs +30 -0
  164. package/organisms/Frame/Frame.cjs.map +2 -2
  165. package/organisms/Frame/Frame.js +30 -0
  166. package/organisms/Frame/Frame.js.map +2 -2
  167. package/organisms/Frame/FrameAnchor.cjs +6 -0
  168. package/organisms/Frame/FrameAnchor.cjs.map +1 -1
  169. package/organisms/Frame/FrameAnchor.js +6 -0
  170. package/organisms/Frame/FrameAnchor.js.map +1 -1
  171. package/organisms/Frame/FrameForm.cjs +6 -0
  172. package/organisms/Frame/FrameForm.cjs.map +1 -1
  173. package/organisms/Frame/FrameForm.js +6 -0
  174. package/organisms/Frame/FrameForm.js.map +1 -1
  175. package/organisms/Frame/FrameTarget.cjs +25 -2
  176. package/organisms/Frame/FrameTarget.cjs.map +2 -2
  177. package/organisms/Frame/FrameTarget.js +25 -2
  178. package/organisms/Frame/FrameTarget.js.map +2 -2
  179. package/organisms/Hero/Hero.twig +151 -0
  180. package/package.json +2 -2
  181. package/primitives/Draggable/Draggable.cjs +18 -0
  182. package/primitives/Draggable/Draggable.cjs.map +2 -2
  183. package/primitives/Draggable/Draggable.js +18 -0
  184. package/primitives/Draggable/Draggable.js.map +2 -2
  185. package/primitives/Sentinel/Sentinel.cjs +3 -0
  186. package/primitives/Sentinel/Sentinel.cjs.map +2 -2
  187. package/primitives/Sentinel/Sentinel.js +3 -0
  188. package/primitives/Sentinel/Sentinel.js.map +2 -2
  189. package/primitives/Transition/Transition.cjs +3 -0
  190. package/primitives/Transition/Transition.cjs.map +1 -1
  191. package/primitives/Transition/Transition.js +3 -0
  192. package/primitives/Transition/Transition.js.map +1 -1
package/README.md CHANGED
@@ -53,20 +53,10 @@ cd ui/
53
53
 
54
54
  # Install root dependencies
55
55
  npm install
56
- composer install
57
56
  ddev start
58
57
 
59
- # Install back-end dependencies
60
- cd packages/docs/.symfony
61
- composer install
62
-
63
58
  # Launch the dev environment
64
- cd ..
65
- npm run dev
66
- ```
67
-
68
- You can also [open the repository in GitPod](https://gitpod.io/#https://github.com/studiometa/ui) and start the dev server with the following command in the root of the project:
69
-
70
- ```
71
59
  npm run docs:dev
72
60
  ```
61
+
62
+ You can also [open the repository in GitPod](https://gitpod.io/#https://github.com/studiometa/ui) and start the dev environment there.
@@ -30,9 +30,20 @@ module.exports = __toCommonJS(AnchorScrollTo_exports);
30
30
  var import_js_toolkit = require("@studiometa/js-toolkit");
31
31
  var import_utils = require("@studiometa/js-toolkit/utils");
32
32
  var AnchorScrollTo = class extends import_js_toolkit.Base {
33
+ /**
34
+ * Get the target selector.
35
+ *
36
+ * @returns {string}
37
+ */
33
38
  get targetSelector() {
34
39
  return this.$el.hash;
35
40
  }
41
+ /**
42
+ * Scroll to the target selector on click.
43
+ *
44
+ * @param {MouseEvent} event
45
+ * @returns {void}
46
+ */
36
47
  onClick(event) {
37
48
  try {
38
49
  (0, import_utils.scrollTo)(this.targetSelector);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/AnchorScrollTo/AnchorScrollTo.ts"],
4
- "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { scrollTo } from '@studiometa/js-toolkit/utils';\n\nexport interface AnchorScrollToProps extends BaseProps {\n $el: HTMLAnchorElement;\n}\n\n/**\n * AncorScrollTo class.\n */\nexport class AnchorScrollTo<T extends BaseProps = BaseProps> extends Base<\n AnchorScrollToProps & T\n> {\n static config: BaseConfig = {\n name: 'AnchorScrollTo',\n };\n\n /**\n * Get the target selector.\n *\n * @returns {string}\n */\n get targetSelector() {\n return this.$el.hash;\n }\n\n /**\n * Scroll to the target selector on click.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n try {\n scrollTo(this.targetSelector);\n event.preventDefault();\n } catch {\n // Silence is golden.\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AAErB,mBAAyB;AASlB,IAAM,iBAAN,cAA8D,uBAEnE;AAAA,EAUA,IAAI,iBAAiB;AACnB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAQA,QAAQ,OAAO;AACb,QAAI;AACF,iCAAS,KAAK,cAAc;AAC5B,YAAM,eAAe;AAAA,IACvB,QAAE;AAAA,IAEF;AAAA,EACF;AACF;AA3BE,cAHW,gBAGJ,UAAqB;AAAA,EAC1B,MAAM;AACR;",
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 * @returns {string}\n */\n get targetSelector() {\n return this.$el.hash;\n }\n\n /**\n * Scroll to the target selector on click.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n try {\n scrollTo(this.targetSelector);\n event.preventDefault();\n } catch {\n // Silence is golden.\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAqB;AAErB,mBAAyB;AASlB,IAAM,iBAAN,cAA8D,uBAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjG,IAAI,iBAAiB;AACnB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,OAAO;AACb,QAAI;AACF,iCAAS,KAAK,cAAc;AAC5B,YAAM,eAAe;AAAA,IACvB,QAAE;AAAA,IAEF;AAAA,EACF;AACF;AA3BE,cADW,gBACJ,UAAqB;AAAA,EAC1B,MAAM;AACR;",
6
6
  "names": []
7
7
  }
@@ -4,9 +4,20 @@ class AnchorScrollTo extends Base {
4
4
  static config = {
5
5
  name: "AnchorScrollTo"
6
6
  };
7
+ /**
8
+ * Get the target selector.
9
+ *
10
+ * @returns {string}
11
+ */
7
12
  get targetSelector() {
8
13
  return this.$el.hash;
9
14
  }
15
+ /**
16
+ * Scroll to the target selector on click.
17
+ *
18
+ * @param {MouseEvent} event
19
+ * @returns {void}
20
+ */
10
21
  onClick(event) {
11
22
  try {
12
23
  scrollTo(this.targetSelector);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/AnchorScrollTo/AnchorScrollTo.ts"],
4
- "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { scrollTo } from '@studiometa/js-toolkit/utils';\n\nexport interface AnchorScrollToProps extends BaseProps {\n $el: HTMLAnchorElement;\n}\n\n/**\n * AncorScrollTo class.\n */\nexport class AnchorScrollTo<T extends BaseProps = BaseProps> extends Base<\n AnchorScrollToProps & T\n> {\n static config: BaseConfig = {\n name: 'AnchorScrollTo',\n };\n\n /**\n * Get the target selector.\n *\n * @returns {string}\n */\n get targetSelector() {\n return this.$el.hash;\n }\n\n /**\n * Scroll to the target selector on click.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n try {\n scrollTo(this.targetSelector);\n event.preventDefault();\n } catch {\n // Silence is golden.\n }\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,gBAAgB;AASlB,MAAM,uBAAwD,KAEnE;AAAA,EACA,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA,EAOA,IAAI,iBAAiB;AACnB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAQA,QAAQ,OAAO;AACb,QAAI;AACF,eAAS,KAAK,cAAc;AAC5B,YAAM,eAAe;AAAA,IACvB,QAAE;AAAA,IAEF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import { Base } from '@studiometa/js-toolkit';\nimport type { BaseProps, BaseConfig } from '@studiometa/js-toolkit';\nimport { scrollTo } from '@studiometa/js-toolkit/utils';\n\nexport interface AnchorScrollToProps extends BaseProps {\n $el: HTMLAnchorElement;\n}\n\n/**\n * AncorScrollTo class.\n */\nexport class AnchorScrollTo<T extends BaseProps = BaseProps> extends Base<AnchorScrollToProps & T> {\n static config: BaseConfig = {\n name: 'AnchorScrollTo',\n };\n\n /**\n * Get the target selector.\n *\n * @returns {string}\n */\n get targetSelector() {\n return this.$el.hash;\n }\n\n /**\n * Scroll to the target selector on click.\n *\n * @param {MouseEvent} event\n * @returns {void}\n */\n onClick(event) {\n try {\n scrollTo(this.targetSelector);\n event.preventDefault();\n } catch {\n // Silence is golden.\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,YAAY;AAErB,SAAS,gBAAgB;AASlB,MAAM,uBAAwD,KAA8B;AAAA,EACjG,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,iBAAiB;AACnB,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,OAAO;AACb,QAAI;AACF,eAAS,KAAK,cAAc;AAC5B,YAAM,eAAe;AAAA,IACvB,QAAE;AAAA,IAEF;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -35,13 +35,15 @@
35
35
  ] %}
36
36
 
37
37
  {% set attr =
38
- attr
39
- |default({})
40
- |merge({
38
+ merge_html_attributes(
39
+ attr ?? null,
40
+ null,
41
+ {
41
42
  class: [
42
43
  theme_shared,
43
44
  theme == 'primary' ? theme_primary : '',
44
45
  theme == 'secondary' ? theme_secondary : ''
45
46
  ]
46
- })
47
+ }
48
+ )
47
49
  %}
@@ -0,0 +1,65 @@
1
+ {#
2
+ /**
3
+ * @file
4
+ * Styled button rounded.
5
+ *
6
+ * @param 'primary' $theme
7
+ * @param $icon_class
8
+ */
9
+ #}
10
+
11
+ {% extends '@ui/atoms/Button/Button.twig' %}
12
+
13
+ {% set icon_only = icon_only|default(false) %}
14
+
15
+ {% set theme = theme|default('primary') %}
16
+
17
+ {% set theme_shared = [
18
+ 'rounded-full cursor-pointer transition',
19
+ 'disabled:cursor-not-allowed leading-6',
20
+ {
21
+ 'inline-block': icon is not defined,
22
+ 'inline-flex items-center': icon is defined,
23
+ 'px-6 py-4': not icon_only,
24
+ 'w-14 relative p-4': icon_only
25
+ }
26
+ ] %}
27
+
28
+ {% set theme_primary = ['text-white bg-black', 'hover:bg-opacity-75 disabled:bg-opacity-50'] %}
29
+
30
+ {% set theme_secondary = [
31
+ 'ring ring-inset ring-2 ring-black ring-opacity-25',
32
+ {
33
+ 'hover:ring-opacity-100': (attr is defined and attr.disabled is not defined)
34
+ or attr is not defined
35
+ }
36
+ ] %}
37
+
38
+ {% set attr =
39
+ merge_html_attributes(
40
+ attr ?? null,
41
+ null,
42
+ {
43
+ class: [
44
+ theme_shared,
45
+ theme == 'primary' ? theme_primary : '',
46
+ theme == 'secondary' ? theme_secondary : ''
47
+ ]
48
+ }
49
+ )
50
+ %}
51
+ {% set icon_class = icon_class|default({}) %}
52
+ {% if icon_only %}
53
+ {% set icon_classes =
54
+ icon_classes
55
+ |default(['absolute top-1/2 left-1/2 -translate-y-1/2 -translate-x-1/2'])
56
+ |merge(icon_class)
57
+ %}
58
+ {% endif %}
59
+
60
+ {% block icon %}
61
+ {{ parent() }}
62
+ {% if icon_only %}
63
+ &nbsp;
64
+ {% endif %}
65
+ {% endblock %}
@@ -36,6 +36,9 @@ var Cursor = class extends import_js_toolkit.Base {
36
36
  pointerX = 0;
37
37
  pointerY = 0;
38
38
  pointerScale = 0;
39
+ /**
40
+ * Mounted hook.
41
+ */
39
42
  mounted() {
40
43
  this.x = 0;
41
44
  this.y = 0;
@@ -45,6 +48,9 @@ var Cursor = class extends import_js_toolkit.Base {
45
48
  this.pointerScale = 0;
46
49
  this.render({ x: this.x, y: this.y, scale: this.scale });
47
50
  }
51
+ /**
52
+ * Moved hook.
53
+ */
48
54
  moved({ event, x, y, isDown }) {
49
55
  if (!this.$services.has("ticked")) {
50
56
  this.$services.enable("ticked");
@@ -66,6 +72,9 @@ var Cursor = class extends import_js_toolkit.Base {
66
72
  }
67
73
  this.pointerScale = scale;
68
74
  }
75
+ /**
76
+ * RequestAnimationFrame hook.
77
+ */
69
78
  ticked() {
70
79
  this.x = (0, import_utils.damp)(this.pointerX, this.x, this.$options.translateDampFactor);
71
80
  this.y = (0, import_utils.damp)(this.pointerY, this.y, this.$options.translateDampFactor);
@@ -79,6 +88,9 @@ var Cursor = class extends import_js_toolkit.Base {
79
88
  this.$services.disable("ticked");
80
89
  }
81
90
  }
91
+ /**
92
+ * Render the cursor.
93
+ */
82
94
  render({ x, y, scale }) {
83
95
  const transform = (0, import_utils.matrix)({
84
96
  translateX: x,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/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<\n CursorProps & T\n> {\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 */\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
  }
@@ -44,6 +44,9 @@ class Cursor extends Base {
44
44
  pointerX = 0;
45
45
  pointerY = 0;
46
46
  pointerScale = 0;
47
+ /**
48
+ * Mounted hook.
49
+ */
47
50
  mounted() {
48
51
  this.x = 0;
49
52
  this.y = 0;
@@ -53,6 +56,9 @@ class Cursor extends Base {
53
56
  this.pointerScale = 0;
54
57
  this.render({ x: this.x, y: this.y, scale: this.scale });
55
58
  }
59
+ /**
60
+ * Moved hook.
61
+ */
56
62
  moved({ event, x, y, isDown }) {
57
63
  if (!this.$services.has("ticked")) {
58
64
  this.$services.enable("ticked");
@@ -74,6 +80,9 @@ class Cursor extends Base {
74
80
  }
75
81
  this.pointerScale = scale;
76
82
  }
83
+ /**
84
+ * RequestAnimationFrame hook.
85
+ */
77
86
  ticked() {
78
87
  this.x = damp(this.pointerX, this.x, this.$options.translateDampFactor);
79
88
  this.y = damp(this.pointerY, this.y, this.$options.translateDampFactor);
@@ -87,6 +96,9 @@ class Cursor extends Base {
87
96
  this.$services.disable("ticked");
88
97
  }
89
98
  }
99
+ /**
100
+ * Render the cursor.
101
+ */
90
102
  render({ x, y, scale }) {
91
103
  const transform = matrix({
92
104
  translateX: x,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/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<\n CursorProps & T\n> {\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": "AAAA,SAAS,YAAY;AAErB,SAAS,MAAM,cAAc;AAkBtB,MAAM,eAAgD,KAE3D;AAAA,EACA,OAAO,SAAqB;AAAA,IAC1B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,eAAe;AAAA,QACb,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,UAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,qBAAqB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,MACA,kBAAkB;AAAA,QAChB,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,EAEJ,IAAI;AAAA,EAEJ,QAAQ;AAAA,EAER,WAAW;AAAA,EAEX,WAAW;AAAA,EAEX,eAAe;AAAA,EAKf,UAAU;AACR,SAAK,IAAI;AACT,SAAK,IAAI;AACT,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,SAAK,OAAO,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,MAAM,CAAC;AAAA,EACzD;AAAA,EAKA,MAAM,EAAE,OAAO,GAAG,GAAG,OAAO,GAAwB;AAClD,QAAI,CAAC,KAAK,UAAU,IAAI,QAAQ,GAAG;AACjC,WAAK,UAAU,OAAO,QAAQ;AAAA,IAChC;AAEA,SAAK,WAAW;AAChB,SAAK,WAAW;AAEhB,QAAI,EAAE,MAAM,IAAI,KAAK;AAErB,QAAI,CAAC,OAAO;AACV,WAAK,eAAe;AACpB;AAAA,IACF;AAEA,UAAM,aACH,MAAM,kBAAkB,WAAW,MAAM,OAAO,QAAQ,KAAK,SAAS,aAAa,KACpF;AACF,UAAM,eACJ,UACC,MAAM,kBAAkB,WAAW,MAAM,OAAO,QAAQ,KAAK,SAAS,eAAe,KACtF;AAEF,QAAI,YAAY;AACd,cAAQ,KAAK,SAAS;AAAA,IACxB;AAEA,QAAI,cAAc;AAChB,cAAQ,KAAK,SAAS;AAAA,IACxB;AAEA,SAAK,eAAe;AAAA,EACtB;AAAA,EAKA,SAAS;AACP,SAAK,IAAI,KAAK,KAAK,UAAU,KAAK,GAAG,KAAK,SAAS,mBAAmB;AACtE,SAAK,IAAI,KAAK,KAAK,UAAU,KAAK,GAAG,KAAK,SAAS,mBAAmB;AACtE,SAAK,QAAQ;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,eAAe,KAAK,QACrB,KAAK,SAAS,mBACd,KAAK,SAAS;AAAA,IACpB;AAEA,SAAK,OAAO,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,MAAM,CAAC;AAEvD,QAAI,KAAK,MAAM,KAAK,YAAY,KAAK,MAAM,KAAK,YAAY,KAAK,UAAU,KAAK,cAAc;AAC5F,WAAK,UAAU,QAAQ,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAKA,OAAO,EAAE,GAAG,GAAG,MAAM,GAA4C;AAC/D,UAAM,YAAY,OAAO;AAAA,MACvB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AACD,SAAK,IAAI,MAAM,YAAY,iBAAiB;AAAA,EAC9C;AACF;",
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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",
6
6
  "names": []
7
7
  }
@@ -29,21 +29,39 @@ __export(Figure_exports, {
29
29
  module.exports = __toCommonJS(Figure_exports);
30
30
  var import_js_toolkit = require("@studiometa/js-toolkit");
31
31
  var import_primitives = require("../../primitives/index.cjs");
32
- var Figure = class extends (0, import_js_toolkit.withMountWhenInView)(import_primitives.Transition, {
33
- threshold: [0, 1]
34
- }) {
32
+ var Figure = class extends (0, import_js_toolkit.withMountWhenInView)(
33
+ import_primitives.Transition,
34
+ {
35
+ threshold: [0, 1]
36
+ }
37
+ ) {
38
+ /**
39
+ * Get the transition target.
40
+ */
35
41
  get target() {
36
42
  return this.$refs.img;
37
43
  }
44
+ /**
45
+ * Get the image source.
46
+ */
38
47
  get src() {
39
48
  return this.$refs.img.src;
40
49
  }
50
+ /**
51
+ * Set the image source.
52
+ */
41
53
  set src(value) {
42
54
  this.$refs.img.src = value;
43
55
  }
56
+ /**
57
+ * Get the original source.
58
+ */
44
59
  get original() {
45
60
  return this.$refs.img.dataset.src;
46
61
  }
62
+ /**
63
+ * Load on mount.
64
+ */
47
65
  mounted() {
48
66
  const { img } = this.$refs;
49
67
  if (!img) {
@@ -68,10 +86,16 @@ var Figure = class extends (0, import_js_toolkit.withMountWhenInView)(import_pri
68
86
  tempImg.src = src;
69
87
  }
70
88
  }
89
+ /**
90
+ * Terminate the component on load.
91
+ */
71
92
  onLoad() {
72
93
  this.$terminate();
73
94
  }
74
95
  };
96
+ /**
97
+ * Config.
98
+ */
75
99
  __publicField(Figure, "config", {
76
100
  ...import_primitives.Transition.config,
77
101
  name: "Figure",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Figure/Figure.ts"],
4
- "sourcesContent": ["import { withMountWhenInView } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nexport interface FigureProps extends BaseProps {\n $refs: {\n img: HTMLImageElement;\n };\n $options: {\n lazy: boolean;\n };\n}\n\n/**\n * Figure class.\n */\nexport class Figure<T extends BaseProps = BaseProps> extends withMountWhenInView<Transition>(Transition, {\n threshold: [0, 1],\n})<T & FigureProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Transition.config,\n name: 'Figure',\n emits: ['load'],\n refs: ['img'],\n options: {\n ...Transition.config.options,\n lazy: Boolean,\n },\n };\n\n /**\n * Get the transition target.\n */\n get target() {\n return this.$refs.img;\n }\n\n /**\n * Get the image source.\n */\n get src() {\n return this.$refs.img.src;\n }\n\n /**\n * Set the image source.\n */\n set src(value:string) {\n this.$refs.img.src = value;\n }\n\n /**\n * Get the original source.\n */\n get original() {\n return this.$refs.img.dataset.src;\n }\n\n /**\n * Load on mount.\n */\n mounted() {\n const { img } = this.$refs;\n\n if (!img) {\n throw new Error('[Figure] The `img` ref is required.');\n }\n\n if (!(img instanceof HTMLImageElement)) {\n throw new Error('[Figure] The `img` ref must be an `<img>` element.');\n }\n\n const src = this.original;\n\n if (this.$options.lazy && src && src !== this.src) {\n let tempImg = new Image();\n tempImg.addEventListener(\n 'load',\n async () => {\n this.src = src;\n tempImg = null;\n this.enter();\n this.$emit('load');\n },\n { once: true },\n );\n tempImg.src = src;\n }\n }\n\n /**\n * Terminate the component on load.\n */\n onLoad() {\n this.$terminate();\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAoC;AAEpC,wBAA2B;AAcpB,IAAM,SAAN,kBAAsD,uCAAgC,8BAAY;AAAA,EACvG,WAAW,CAAC,GAAG,CAAC;AAClB,CAAC,EAAmB;AAAA,EAkBlB,IAAI,SAAS;AACX,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAKA,IAAI,MAAM;AACR,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA,EAKA,IAAI,IAAI,OAAc;AACpB,SAAK,MAAM,IAAI,MAAM;AAAA,EACvB;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,EAChC;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,IAAI,IAAI,KAAK;AAErB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,QAAI,EAAE,eAAe,mBAAmB;AACtC,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,MAAM,KAAK;AAEjB,QAAI,KAAK,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAK;AACjD,UAAI,UAAU,IAAI,MAAM;AACxB,cAAQ;AAAA,QACN;AAAA,QACA,YAAY;AACV,eAAK,MAAM;AACX,oBAAU;AACV,eAAK,MAAM;AACX,eAAK,MAAM,MAAM;AAAA,QACnB;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EAKA,SAAS;AACP,SAAK,WAAW;AAAA,EAClB;AACF;AA7EE,cANW,QAMJ,UAAqB;AAAA,EAC1B,GAAG,6BAAW;AAAA,EACd,MAAM;AAAA,EACN,OAAO,CAAC,MAAM;AAAA,EACd,MAAM,CAAC,KAAK;AAAA,EACZ,SAAS;AAAA,IACP,GAAG,6BAAW,OAAO;AAAA,IACrB,MAAM;AAAA,EACR;AACF;",
4
+ "sourcesContent": ["import { withMountWhenInView } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nexport interface FigureProps extends BaseProps {\n $refs: {\n img: HTMLImageElement;\n };\n $options: {\n lazy: boolean;\n };\n}\n\n/**\n * Figure class.\n */\nexport class Figure<T extends BaseProps = BaseProps> extends withMountWhenInView<Transition>(\n Transition,\n {\n threshold: [0, 1],\n },\n)<T & FigureProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Transition.config,\n name: 'Figure',\n emits: ['load'],\n refs: ['img'],\n options: {\n ...Transition.config.options,\n lazy: Boolean,\n },\n };\n\n /**\n * Get the transition target.\n */\n get target() {\n return this.$refs.img;\n }\n\n /**\n * Get the image source.\n */\n get src() {\n return this.$refs.img.src;\n }\n\n /**\n * Set the image source.\n */\n set src(value: string) {\n this.$refs.img.src = value;\n }\n\n /**\n * Get the original source.\n */\n get original() {\n return this.$refs.img.dataset.src;\n }\n\n /**\n * Load on mount.\n */\n mounted() {\n const { img } = this.$refs;\n\n if (!img) {\n throw new Error('[Figure] The `img` ref is required.');\n }\n\n if (!(img instanceof HTMLImageElement)) {\n throw new Error('[Figure] The `img` ref must be an `<img>` element.');\n }\n\n const src = this.original;\n\n if (this.$options.lazy && src && src !== this.src) {\n let tempImg = new Image();\n tempImg.addEventListener(\n 'load',\n async () => {\n this.src = src;\n tempImg = null;\n this.enter();\n this.$emit('load');\n },\n { once: true },\n );\n tempImg.src = src;\n }\n }\n\n /**\n * Terminate the component on load.\n */\n onLoad() {\n this.$terminate();\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAoC;AAEpC,wBAA2B;AAcpB,IAAM,SAAN,kBAAsD;AAAA,EAC3D;AAAA,EACA;AAAA,IACE,WAAW,CAAC,GAAG,CAAC;AAAA,EAClB;AACF,EAAmB;AAAA;AAAA;AAAA;AAAA,EAkBjB,IAAI,SAAS;AACX,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAM;AACR,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI,OAAe;AACrB,SAAK,MAAM,IAAI,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,IAAI,IAAI,KAAK;AAErB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,QAAI,EAAE,eAAe,mBAAmB;AACtC,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,MAAM,KAAK;AAEjB,QAAI,KAAK,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAK;AACjD,UAAI,UAAU,IAAI,MAAM;AACxB,cAAQ;AAAA,QACN;AAAA,QACA,YAAY;AACV,eAAK,MAAM;AACX,oBAAU;AACV,eAAK,MAAM;AACX,eAAK,MAAM,MAAM;AAAA,QACnB;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,WAAW;AAAA,EAClB;AACF;AAAA;AAAA;AAAA;AA7EE,cATW,QASJ,UAAqB;AAAA,EAC1B,GAAG,6BAAW;AAAA,EACd,MAAM;AAAA,EACN,OAAO,CAAC,MAAM;AAAA,EACd,MAAM,CAAC,KAAK;AAAA,EACZ,SAAS;AAAA,IACP,GAAG,6BAAW,OAAO;AAAA,IACrB,MAAM;AAAA,EACR;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,14 @@
1
1
  import { withMountWhenInView } from "@studiometa/js-toolkit";
2
2
  import { Transition } from "../../primitives/index.js";
3
- class Figure extends withMountWhenInView(Transition, {
4
- threshold: [0, 1]
5
- }) {
3
+ class Figure extends withMountWhenInView(
4
+ Transition,
5
+ {
6
+ threshold: [0, 1]
7
+ }
8
+ ) {
9
+ /**
10
+ * Config.
11
+ */
6
12
  static config = {
7
13
  ...Transition.config,
8
14
  name: "Figure",
@@ -13,18 +19,33 @@ class Figure extends withMountWhenInView(Transition, {
13
19
  lazy: Boolean
14
20
  }
15
21
  };
22
+ /**
23
+ * Get the transition target.
24
+ */
16
25
  get target() {
17
26
  return this.$refs.img;
18
27
  }
28
+ /**
29
+ * Get the image source.
30
+ */
19
31
  get src() {
20
32
  return this.$refs.img.src;
21
33
  }
34
+ /**
35
+ * Set the image source.
36
+ */
22
37
  set src(value) {
23
38
  this.$refs.img.src = value;
24
39
  }
40
+ /**
41
+ * Get the original source.
42
+ */
25
43
  get original() {
26
44
  return this.$refs.img.dataset.src;
27
45
  }
46
+ /**
47
+ * Load on mount.
48
+ */
28
49
  mounted() {
29
50
  const { img } = this.$refs;
30
51
  if (!img) {
@@ -49,6 +70,9 @@ class Figure extends withMountWhenInView(Transition, {
49
70
  tempImg.src = src;
50
71
  }
51
72
  }
73
+ /**
74
+ * Terminate the component on load.
75
+ */
52
76
  onLoad() {
53
77
  this.$terminate();
54
78
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Figure/Figure.ts"],
4
- "sourcesContent": ["import { withMountWhenInView } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nexport interface FigureProps extends BaseProps {\n $refs: {\n img: HTMLImageElement;\n };\n $options: {\n lazy: boolean;\n };\n}\n\n/**\n * Figure class.\n */\nexport class Figure<T extends BaseProps = BaseProps> extends withMountWhenInView<Transition>(Transition, {\n threshold: [0, 1],\n})<T & FigureProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Transition.config,\n name: 'Figure',\n emits: ['load'],\n refs: ['img'],\n options: {\n ...Transition.config.options,\n lazy: Boolean,\n },\n };\n\n /**\n * Get the transition target.\n */\n get target() {\n return this.$refs.img;\n }\n\n /**\n * Get the image source.\n */\n get src() {\n return this.$refs.img.src;\n }\n\n /**\n * Set the image source.\n */\n set src(value:string) {\n this.$refs.img.src = value;\n }\n\n /**\n * Get the original source.\n */\n get original() {\n return this.$refs.img.dataset.src;\n }\n\n /**\n * Load on mount.\n */\n mounted() {\n const { img } = this.$refs;\n\n if (!img) {\n throw new Error('[Figure] The `img` ref is required.');\n }\n\n if (!(img instanceof HTMLImageElement)) {\n throw new Error('[Figure] The `img` ref must be an `<img>` element.');\n }\n\n const src = this.original;\n\n if (this.$options.lazy && src && src !== this.src) {\n let tempImg = new Image();\n tempImg.addEventListener(\n 'load',\n async () => {\n this.src = src;\n tempImg = null;\n this.enter();\n this.$emit('load');\n },\n { once: true },\n );\n tempImg.src = src;\n }\n }\n\n /**\n * Terminate the component on load.\n */\n onLoad() {\n this.$terminate();\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,2BAA2B;AAEpC,SAAS,kBAAkB;AAcpB,MAAM,eAAgD,oBAAgC,YAAY;AAAA,EACvG,WAAW,CAAC,GAAG,CAAC;AAClB,CAAC,EAAmB;AAAA,EAIlB,OAAO,SAAqB;AAAA,IAC1B,GAAG,WAAW;AAAA,IACd,MAAM;AAAA,IACN,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,CAAC,KAAK;AAAA,IACZ,SAAS;AAAA,MACP,GAAG,WAAW,OAAO;AAAA,MACrB,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAKA,IAAI,SAAS;AACX,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAKA,IAAI,MAAM;AACR,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA,EAKA,IAAI,IAAI,OAAc;AACpB,SAAK,MAAM,IAAI,MAAM;AAAA,EACvB;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,EAChC;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,IAAI,IAAI,KAAK;AAErB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,QAAI,EAAE,eAAe,mBAAmB;AACtC,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,MAAM,KAAK;AAEjB,QAAI,KAAK,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAK;AACjD,UAAI,UAAU,IAAI,MAAM;AACxB,cAAQ;AAAA,QACN;AAAA,QACA,YAAY;AACV,eAAK,MAAM;AACX,oBAAU;AACV,eAAK,MAAM;AACX,eAAK,MAAM,MAAM;AAAA,QACnB;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAAA,EAKA,SAAS;AACP,SAAK,WAAW;AAAA,EAClB;AACF;",
4
+ "sourcesContent": ["import { withMountWhenInView } from '@studiometa/js-toolkit';\nimport type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { Transition } from '../../primitives/index.js';\n\nexport interface FigureProps extends BaseProps {\n $refs: {\n img: HTMLImageElement;\n };\n $options: {\n lazy: boolean;\n };\n}\n\n/**\n * Figure class.\n */\nexport class Figure<T extends BaseProps = BaseProps> extends withMountWhenInView<Transition>(\n Transition,\n {\n threshold: [0, 1],\n },\n)<T & FigureProps> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Transition.config,\n name: 'Figure',\n emits: ['load'],\n refs: ['img'],\n options: {\n ...Transition.config.options,\n lazy: Boolean,\n },\n };\n\n /**\n * Get the transition target.\n */\n get target() {\n return this.$refs.img;\n }\n\n /**\n * Get the image source.\n */\n get src() {\n return this.$refs.img.src;\n }\n\n /**\n * Set the image source.\n */\n set src(value: string) {\n this.$refs.img.src = value;\n }\n\n /**\n * Get the original source.\n */\n get original() {\n return this.$refs.img.dataset.src;\n }\n\n /**\n * Load on mount.\n */\n mounted() {\n const { img } = this.$refs;\n\n if (!img) {\n throw new Error('[Figure] The `img` ref is required.');\n }\n\n if (!(img instanceof HTMLImageElement)) {\n throw new Error('[Figure] The `img` ref must be an `<img>` element.');\n }\n\n const src = this.original;\n\n if (this.$options.lazy && src && src !== this.src) {\n let tempImg = new Image();\n tempImg.addEventListener(\n 'load',\n async () => {\n this.src = src;\n tempImg = null;\n this.enter();\n this.$emit('load');\n },\n { once: true },\n );\n tempImg.src = src;\n }\n }\n\n /**\n * Terminate the component on load.\n */\n onLoad() {\n this.$terminate();\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,2BAA2B;AAEpC,SAAS,kBAAkB;AAcpB,MAAM,eAAgD;AAAA,EAC3D;AAAA,EACA;AAAA,IACE,WAAW,CAAC,GAAG,CAAC;AAAA,EAClB;AACF,EAAmB;AAAA;AAAA;AAAA;AAAA,EAIjB,OAAO,SAAqB;AAAA,IAC1B,GAAG,WAAW;AAAA,IACd,MAAM;AAAA,IACN,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,CAAC,KAAK;AAAA,IACZ,SAAS;AAAA,MACP,GAAG,WAAW,OAAO;AAAA,MACrB,MAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS;AACX,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAM;AACR,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,IAAI,OAAe;AACrB,SAAK,MAAM,IAAI,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,UAAM,EAAE,IAAI,IAAI,KAAK;AAErB,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,QAAI,EAAE,eAAe,mBAAmB;AACtC,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACtE;AAEA,UAAM,MAAM,KAAK;AAEjB,QAAI,KAAK,SAAS,QAAQ,OAAO,QAAQ,KAAK,KAAK;AACjD,UAAI,UAAU,IAAI,MAAM;AACxB,cAAQ;AAAA,QACN;AAAA,QACA,YAAY;AACV,eAAK,MAAM;AACX,oBAAU;AACV,eAAK,MAAM;AACX,eAAK,MAAM,MAAM;AAAA,QACnB;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,WAAW;AAAA,EAClB;AACF;",
6
6
  "names": []
7
7
  }
@@ -18,6 +18,10 @@
18
18
  * @param boolean $inline
19
19
  * Wether to enable the display of the figure inline or not. When `inline`, the root element
20
20
  * will have a max-width set corresponding to the `width` given. Use with caution.
21
+ * @param string $placeholder
22
+ * Use a custom placeholder.
23
+ * @param string $placeholder_color
24
+ * Set an hexadecimal custom color for the generic placeholder.
21
25
  * @param array $attr
22
26
  * Custom attributes for the root element.
23
27
  * @param array $inner_attr
@@ -44,12 +48,13 @@
44
48
  {% set width = width|default(100) %}
45
49
  {% set lazy = lazy ?? true %}
46
50
 
51
+ {% set placeholder_color = placeholder_color|default('#eee') %}
47
52
  {%- set placeholder_markup -%}
48
53
  <svg xmlns="http://www.w3.org/2000/svg"
49
54
  viewbox="0 0 {{ width }} {{ height }}"
50
55
  width="{{ width }}"
51
56
  height="{{ height }}">
52
- <rect x="0" y="0" width="{{ width }}" height="{{ height }}" fill="#eee" />
57
+ <rect x="0" y="0" width="{{ width }}" height="{{ height }}" fill="{{ placeholder_color }}" />
53
58
  </svg>
54
59
  {%- endset -%}
55
60
  {% set generic_placeholder = 'data:image/svg+xml,%s'|format(placeholder_markup|url_encode) %}
@@ -34,16 +34,28 @@ function normalizeSize(that, prop) {
34
34
  return Math.ceil(that.$refs.img[prop] / step) * step;
35
35
  }
36
36
  var FigureTwicpics = class extends import_Figure.Figure {
37
+ /**
38
+ * Get the Twicpics path.
39
+ */
37
40
  get path() {
38
41
  return (0, import_utils.withoutTrailingSlash)((0, import_utils.withoutLeadingSlash)(this.$options.path));
39
42
  }
43
+ /**
44
+ * Get the Twicpics domain.
45
+ */
40
46
  get domain() {
41
47
  const url = new URL(this.$refs.img.dataset.src);
42
48
  return url.host;
43
49
  }
50
+ /**
51
+ * Get formattted original source.
52
+ */
44
53
  get original() {
45
54
  return this.formatSrc(super.original);
46
55
  }
56
+ /**
57
+ * Format the source for Twicpics.
58
+ */
47
59
  formatSrc(src) {
48
60
  const url = new URL(src, "https://localhost");
49
61
  url.host = this.domain;
@@ -60,12 +72,21 @@ var FigureTwicpics = class extends import_Figure.Figure {
60
72
  url.search = decodeURIComponent(url.search);
61
73
  return url.toString();
62
74
  }
75
+ /**
76
+ * Reassign the source from the original on resize.
77
+ */
63
78
  resized() {
64
79
  this.src = this.original;
65
80
  }
81
+ /**
82
+ * Do not terminate on image load as we need to set the src on resize.
83
+ */
66
84
  onLoad() {
67
85
  }
68
86
  };
87
+ /**
88
+ * Config.
89
+ */
69
90
  __publicField(FigureTwicpics, "config", {
70
91
  ...import_Figure.Figure.config,
71
92
  name: "FigureTwicpics",
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../packages/ui/atoms/Figure/FigureTwicpics.ts"],
4
4
  "sourcesContent": ["import type { BaseConfig, BaseProps } from '@studiometa/js-toolkit';\nimport { withoutLeadingSlash, withoutTrailingSlash } from '@studiometa/js-toolkit/utils';\nimport { Figure } from './Figure.js';\n\nexport interface FigureTwicpicsProps extends BaseProps {\n $options: {\n transform: string;\n domain: string;\n path: string;\n step: number;\n mode: string;\n };\n}\n\n/**\n * Normalize the given size to the step option.\n */\n// eslint-disable-next-line no-use-before-define\nfunction normalizeSize(that: FigureTwicpics, prop: string): number {\n const { step } = that.$options;\n return Math.ceil(that.$refs.img[prop] / step) * step;\n}\n\n/**\n * Figure class.\n *\n * Manager lazyloading image sources.\n */\nexport class FigureTwicpics<T extends BaseProps = BaseProps> extends Figure<\n T & FigureTwicpicsProps\n> {\n /**\n * Config.\n */\n static config: BaseConfig = {\n ...Figure.config,\n name: 'FigureTwicpics',\n options: {\n ...Figure.config.options,\n transform: String,\n domain: String,\n path: String,\n step: {\n type: Number,\n default: 50,\n },\n mode: {\n type: String,\n default: 'cover',\n },\n },\n };\n\n /**\n * Get the Twicpics path.\n */\n get path(): string {\n return withoutTrailingSlash(withoutLeadingSlash(this.$options.path));\n }\n\n /**\n * Get the Twicpics domain.\n */\n get domain(): string {\n const url = new URL(this.$refs.img.dataset.src);\n return url.host;\n }\n\n /**\n * Get formattted original source.\n */\n get original() {\n return this.formatSrc(super.original);\n }\n\n /**\n * Format the source for Twicpics.\n */\n formatSrc(src: string): string {\n const url = new URL(src, 'https://localhost');\n url.host = this.domain;\n url.port = '';\n\n if (this.path) {\n url.pathname = `/${this.path}${url.pathname}`;\n }\n\n const width = normalizeSize(this, 'offsetWidth');\n const height = normalizeSize(this, 'offsetHeight');\n\n url.searchParams.set(\n 'twic',\n ['v1', this.$options.transform, `${this.$options.mode}=${width}x${height}`]\n .filter(Boolean)\n .join('/'),\n );\n\n url.search = decodeURIComponent(url.search);\n\n return url.toString();\n }\n\n /**\n * Reassign the source from the original on resize.\n */\n resized() {\n this.src = this.original;\n }\n\n /**\n * Do not terminate on image load as we need to set the src on resize.\n */\n onLoad() {\n // Do not terminate on image load as we need.\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA0D;AAC1D,oBAAuB;AAgBvB,SAAS,cAAc,MAAsB,MAAsB;AACjE,QAAM,EAAE,KAAK,IAAI,KAAK;AACtB,SAAO,KAAK,KAAK,KAAK,MAAM,IAAI,QAAQ,IAAI,IAAI;AAClD;AAOO,IAAM,iBAAN,cAA8D,qBAEnE;AAAA,EA0BA,IAAI,OAAe;AACjB,eAAO,uCAAqB,kCAAoB,KAAK,SAAS,IAAI,CAAC;AAAA,EACrE;AAAA,EAKA,IAAI,SAAiB;AACnB,UAAM,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,QAAQ,GAAG;AAC9C,WAAO,IAAI;AAAA,EACb;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,EACtC;AAAA,EAKA,UAAU,KAAqB;AAC7B,UAAM,MAAM,IAAI,IAAI,KAAK,mBAAmB;AAC5C,QAAI,OAAO,KAAK;AAChB,QAAI,OAAO;AAEX,QAAI,KAAK,MAAM;AACb,UAAI,WAAW,IAAI,KAAK,OAAO,IAAI;AAAA,IACrC;AAEA,UAAM,QAAQ,cAAc,MAAM,aAAa;AAC/C,UAAM,SAAS,cAAc,MAAM,cAAc;AAEjD,QAAI,aAAa;AAAA,MACf;AAAA,MACA,CAAC,MAAM,KAAK,SAAS,WAAW,GAAG,KAAK,SAAS,QAAQ,SAAS,QAAQ,EACvE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACb;AAEA,QAAI,SAAS,mBAAmB,IAAI,MAAM;AAE1C,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAKA,UAAU;AACR,SAAK,MAAM,KAAK;AAAA,EAClB;AAAA,EAKA,SAAS;AAAA,EAET;AACF;AAjFE,cANW,gBAMJ,UAAqB;AAAA,EAC1B,GAAG,qBAAO;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,IACP,GAAG,qBAAO,OAAO;AAAA,IACjB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA0D;AAC1D,oBAAuB;AAgBvB,SAAS,cAAc,MAAsB,MAAsB;AACjE,QAAM,EAAE,KAAK,IAAI,KAAK;AACtB,SAAO,KAAK,KAAK,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,IAAI;AAClD;AAOO,IAAM,iBAAN,cAA8D,qBAEnE;AAAA;AAAA;AAAA;AAAA,EA0BA,IAAI,OAAe;AACjB,eAAO,uCAAqB,kCAAoB,KAAK,SAAS,IAAI,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAiB;AACnB,UAAM,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,QAAQ,GAAG;AAC9C,WAAO,IAAI;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,UAAU,MAAM,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,KAAqB;AAC7B,UAAM,MAAM,IAAI,IAAI,KAAK,mBAAmB;AAC5C,QAAI,OAAO,KAAK;AAChB,QAAI,OAAO;AAEX,QAAI,KAAK,MAAM;AACb,UAAI,WAAW,IAAI,KAAK,OAAO,IAAI;AAAA,IACrC;AAEA,UAAM,QAAQ,cAAc,MAAM,aAAa;AAC/C,UAAM,SAAS,cAAc,MAAM,cAAc;AAEjD,QAAI,aAAa;AAAA,MACf;AAAA,MACA,CAAC,MAAM,KAAK,SAAS,WAAW,GAAG,KAAK,SAAS,QAAQ,SAAS,QAAQ,EACvE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACb;AAEA,QAAI,SAAS,mBAAmB,IAAI,MAAM;AAE1C,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,MAAM,KAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AAAA,EAET;AACF;AAAA;AAAA;AAAA;AAjFE,cANW,gBAMJ,UAAqB;AAAA,EAC1B,GAAG,qBAAO;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,IACP,GAAG,qBAAO,OAAO;AAAA,IACjB,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -5,6 +5,9 @@ function normalizeSize(that, prop) {
5
5
  return Math.ceil(that.$refs.img[prop] / step) * step;
6
6
  }
7
7
  class FigureTwicpics extends Figure {
8
+ /**
9
+ * Config.
10
+ */
8
11
  static config = {
9
12
  ...Figure.config,
10
13
  name: "FigureTwicpics",
@@ -23,16 +26,28 @@ class FigureTwicpics extends Figure {
23
26
  }
24
27
  }
25
28
  };
29
+ /**
30
+ * Get the Twicpics path.
31
+ */
26
32
  get path() {
27
33
  return withoutTrailingSlash(withoutLeadingSlash(this.$options.path));
28
34
  }
35
+ /**
36
+ * Get the Twicpics domain.
37
+ */
29
38
  get domain() {
30
39
  const url = new URL(this.$refs.img.dataset.src);
31
40
  return url.host;
32
41
  }
42
+ /**
43
+ * Get formattted original source.
44
+ */
33
45
  get original() {
34
46
  return this.formatSrc(super.original);
35
47
  }
48
+ /**
49
+ * Format the source for Twicpics.
50
+ */
36
51
  formatSrc(src) {
37
52
  const url = new URL(src, "https://localhost");
38
53
  url.host = this.domain;
@@ -49,9 +64,15 @@ class FigureTwicpics extends Figure {
49
64
  url.search = decodeURIComponent(url.search);
50
65
  return url.toString();
51
66
  }
67
+ /**
68
+ * Reassign the source from the original on resize.
69
+ */
52
70
  resized() {
53
71
  this.src = this.original;
54
72
  }
73
+ /**
74
+ * Do not terminate on image load as we need to set the src on resize.
75
+ */
55
76
  onLoad() {
56
77
  }
57
78
  }