@peteai/presentation-editor 0.0.6 → 0.0.7

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 (310) hide show
  1. package/README.md +38 -38
  2. package/dist/components/editor/active-layers-buttons.svelte +56 -0
  3. package/dist/components/{presentation-editor → editor}/active-layers.svelte +89 -48
  4. package/dist/components/{presentation-editor/cognition-slides.d.ts → editor/cognition-pages.d.ts} +1 -1
  5. package/dist/components/{presentation-editor/cognition-slides.js → editor/cognition-pages.js} +1 -1
  6. package/dist/components/{presentation-editor → editor}/cursor-tooltip.svelte +6 -2
  7. package/dist/components/editor/cursor-tooltip.svelte.d.ts +7 -0
  8. package/dist/components/{presentation-editor → editor}/dragged.svelte +7 -3
  9. package/dist/components/editor/dragged.svelte.d.ts +7 -0
  10. package/dist/components/{presentation-editor/presentation-editor.svelte → editor/editor.svelte} +53 -48
  11. package/dist/components/editor/editor.svelte.d.ts +4 -0
  12. package/dist/components/editor/editor.svelte.js +1167 -0
  13. package/dist/components/{presentation-editor → editor}/header.svelte +11 -7
  14. package/dist/components/editor/header.svelte.d.ts +7 -0
  15. package/dist/components/{presentation-editor → editor}/hotkeys.svelte +41 -16
  16. package/dist/components/editor/index.d.ts +3 -0
  17. package/dist/components/editor/index.js +3 -0
  18. package/dist/components/{presentation-editor → editor}/layers/active-background-border.svelte +2 -2
  19. package/dist/components/{presentation-editor → editor}/layers/active-layer-border.svelte +5 -8
  20. package/dist/components/editor/layers/buttons/border-button/border-button-colors.svelte +59 -0
  21. package/dist/components/editor/layers/buttons/border-button/border-button-colors.svelte.d.ts +9 -0
  22. package/dist/components/{presentation-editor → editor}/layers/buttons/border-button/border-button.svelte +47 -65
  23. package/dist/components/{presentation-editor → editor}/layers/buttons/corner-radius-button/corner-radius-button.svelte +24 -28
  24. package/dist/components/{presentation-editor → editor}/layers/buttons/flip-button/flip-button.svelte +11 -12
  25. package/dist/components/{presentation-editor → editor}/layers/buttons/opacity-button/opacity-button.svelte +32 -38
  26. package/dist/components/{presentation-editor → editor}/layers/controls/corner-scale-control/corner-scale-control.svelte +27 -32
  27. package/dist/components/editor/layers/controls/group-resize-control/group-resize-control.svelte +418 -0
  28. package/dist/components/{presentation-editor → editor}/layers/controls/rotate-control/rotate-control.svelte +27 -34
  29. package/dist/components/{presentation-editor → editor}/layers/controls/side-resize-control/side-resize-control.svelte +9 -13
  30. package/dist/components/{presentation-editor → editor}/layers/controls/side-scale-control/side-scale-control.svelte +13 -15
  31. package/dist/components/{presentation-editor → editor}/layers/controls/side-scale-control/side-scale-control.svelte.d.ts +2 -2
  32. package/dist/components/{presentation-editor → editor}/layers/index.d.ts +3 -2
  33. package/dist/components/{presentation-editor → editor}/layers/index.js +6 -3
  34. package/dist/components/{presentation-editor → editor}/layers/layer-button.svelte +14 -8
  35. package/dist/components/{presentation-editor → editor}/layers/layer-thumb-wrapper.svelte +5 -6
  36. package/dist/components/{presentation-editor → editor}/layers/layer-wrapper.svelte +46 -57
  37. package/dist/components/{presentation-editor → editor}/layers/types/background/background-content-image.svelte +2 -2
  38. package/dist/components/{presentation-editor → editor}/layers/types/background/background-layer-buttons.svelte +6 -6
  39. package/dist/components/editor/layers/types/background/background-layer-content.svelte +21 -0
  40. package/dist/components/{presentation-editor → editor}/layers/types/background/background-layer-content.svelte.d.ts +2 -2
  41. package/dist/components/{presentation-editor → editor}/layers/types/background/background-layer.svelte +5 -7
  42. package/dist/components/editor/layers/types/group/group-child-wrapper.svelte +44 -0
  43. package/dist/components/editor/layers/types/group/group-child-wrapper.svelte.d.ts +9 -0
  44. package/dist/components/editor/layers/types/group/group-layer-content.svelte +45 -0
  45. package/dist/components/editor/layers/types/group/group-layer-content.svelte.d.ts +9 -0
  46. package/dist/components/editor/layers/types/group/group-layer.svelte +33 -0
  47. package/dist/components/editor/layers/types/group/group-layer.svelte.d.ts +8 -0
  48. package/dist/components/editor/layers/types/group/index.d.ts +3 -0
  49. package/dist/components/editor/layers/types/group/index.js +3 -0
  50. package/dist/components/{presentation-editor → editor}/layers/types/image/image-layer-active.svelte +10 -13
  51. package/dist/components/{presentation-editor → editor}/layers/types/image/image-layer-content.svelte +14 -11
  52. package/dist/components/{presentation-editor → editor}/layers/types/image/image-layer.svelte +8 -14
  53. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/alignment-button/alignment-button.svelte +13 -14
  54. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/alignment-button/alignment-button.svelte.d.ts +2 -2
  55. package/dist/components/editor/layers/types/text/buttons/bold-button/bold-button.svelte +65 -0
  56. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/bold-button/bold-button.svelte.d.ts +2 -2
  57. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/case-button/case-button.svelte +24 -30
  58. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/case-button/case-button.svelte.d.ts +2 -2
  59. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/color-button/color-button.svelte +4 -4
  60. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/color-button/color-button.svelte.d.ts +2 -2
  61. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-family-button/font-family-button.svelte +4 -4
  62. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-family-button/font-family-button.svelte.d.ts +2 -2
  63. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-size-button/font-size-button.svelte +33 -40
  64. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-size-button/font-size-button.svelte.d.ts +2 -2
  65. package/dist/components/editor/layers/types/text/buttons/italic-button/italic-button.svelte +65 -0
  66. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/italic-button/italic-button.svelte.d.ts +2 -2
  67. package/dist/components/editor/layers/types/text/buttons/list-button/list-button.svelte +113 -0
  68. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/list-button/list-button.svelte.d.ts +2 -2
  69. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/strikethrough-button/strikethrough-button.svelte +10 -11
  70. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/strikethrough-button/strikethrough-button.svelte.d.ts +2 -2
  71. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/underline-button/underline-button.svelte +10 -11
  72. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/underline-button/underline-button.svelte.d.ts +2 -2
  73. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/utils.d.ts +2 -0
  74. package/dist/components/editor/layers/types/text/editor/utils.js +166 -0
  75. package/dist/components/editor/layers/types/text/extensions/list/index.d.ts +3 -0
  76. package/dist/components/editor/layers/types/text/extensions/list/index.js +3 -0
  77. package/dist/components/editor/layers/types/text/extensions/list/list.d.ts +67 -0
  78. package/dist/components/editor/layers/types/text/extensions/list/list.js +237 -0
  79. package/dist/components/editor/layers/types/text/extensions/list-item/index.d.ts +3 -0
  80. package/dist/components/editor/layers/types/text/extensions/list-item/index.js +3 -0
  81. package/dist/components/editor/layers/types/text/extensions/list-item/list-item.d.ts +13 -0
  82. package/dist/components/editor/layers/types/text/extensions/list-item/list-item.js +264 -0
  83. package/dist/components/editor/layers/types/text/extensions/list-item-paragraph/index.d.ts +3 -0
  84. package/dist/components/editor/layers/types/text/extensions/list-item-paragraph/index.js +3 -0
  85. package/dist/components/editor/layers/types/text/extensions/list-item-paragraph/list-item-paragraph.d.ts +14 -0
  86. package/dist/components/editor/layers/types/text/extensions/list-item-paragraph/list-item-paragraph.js +27 -0
  87. package/dist/components/editor/layers/types/text/extensions/paragraph/index.d.ts +3 -0
  88. package/dist/components/editor/layers/types/text/extensions/paragraph/index.js +3 -0
  89. package/dist/components/editor/layers/types/text/extensions/paragraph/paragraph.d.ts +6 -0
  90. package/dist/components/editor/layers/types/text/extensions/paragraph/paragraph.js +28 -0
  91. package/dist/components/editor/layers/types/text/extensions/preserve-formatting-on-clear/index.d.ts +3 -0
  92. package/dist/components/editor/layers/types/text/extensions/preserve-formatting-on-clear/index.js +3 -0
  93. package/dist/components/editor/layers/types/text/extensions/preserve-formatting-on-clear/preserve-formatting-on-clear.d.ts +2 -0
  94. package/dist/components/editor/layers/types/text/extensions/preserve-formatting-on-clear/preserve-formatting-on-clear.js +74 -0
  95. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/text-transform/text-transform.js +1 -4
  96. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions.js +13 -23
  97. package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/html-content.svelte +0 -9
  98. package/dist/components/editor/layers/types/text/index.d.ts +5 -0
  99. package/dist/components/editor/layers/types/text/index.js +5 -0
  100. package/dist/components/{presentation-editor/layers/types/html/html-layer-content.svelte → editor/layers/types/text/text-layer-content.svelte} +2 -2
  101. package/dist/components/editor/layers/types/text/text-layer-content.svelte.d.ts +9 -0
  102. package/dist/components/editor/layers/types/text/text-layer-edit.svelte +114 -0
  103. package/dist/components/editor/layers/types/text/text-layer-edit.svelte.d.ts +9 -0
  104. package/dist/components/editor/layers/types/text/text-layer.svelte +125 -0
  105. package/dist/components/editor/layers/types/text/text-layer.svelte.d.ts +7 -0
  106. package/dist/components/{presentation-editor → editor}/layers/utils.d.ts +9 -16
  107. package/dist/components/{presentation-editor → editor}/layers/utils.js +65 -68
  108. package/dist/components/{presentation-editor → editor}/menu/background-menu-content.svelte +24 -24
  109. package/dist/components/{presentation-editor → editor}/menu/background-menu-content.svelte.d.ts +4 -4
  110. package/dist/components/{presentation-editor → editor}/menu/layer-menu-content.svelte +62 -38
  111. package/dist/components/{presentation-editor/menu/slide-menu-content.svelte → editor/menu/page-menu-content.svelte} +19 -19
  112. package/dist/components/editor/menu/page-menu-content.svelte.d.ts +9 -0
  113. package/dist/components/{presentation-editor/slide-editor.svelte → editor/page-editor.svelte} +25 -24
  114. package/dist/components/editor/page-editor.svelte.d.ts +7 -0
  115. package/dist/components/{presentation-editor/slide-inner.svelte → editor/page-inner.svelte} +5 -5
  116. package/dist/components/{presentation-editor/sidebar/sidebar.svelte.d.ts → editor/page-inner.svelte.d.ts} +3 -3
  117. package/dist/components/editor/page.svelte +69 -0
  118. package/dist/components/editor/page.svelte.d.ts +4 -0
  119. package/dist/components/editor/pages-navigation/page-preview.svelte +36 -0
  120. package/dist/components/editor/pages-navigation/page-preview.svelte.d.ts +8 -0
  121. package/dist/components/{presentation-editor/slides-navigation/slide-preview.svelte → editor/pages-navigation/pages-navigation-item.svelte} +21 -41
  122. package/dist/components/editor/pages-navigation/pages-navigation-item.svelte.d.ts +11 -0
  123. package/dist/components/{presentation-editor/slides-navigation/slides-navigation.svelte → editor/pages-navigation/pages-navigation.svelte} +26 -21
  124. package/dist/components/editor/pages-navigation/pages-navigation.svelte.d.ts +7 -0
  125. package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/color-sidebar-color.svelte +1 -1
  126. package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte +2 -2
  127. package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/color-sidebar.svelte +92 -89
  128. package/dist/components/{presentation-editor → editor}/sidebar/font-sidebar/font-sidebar-button.svelte +3 -3
  129. package/dist/components/{presentation-editor → editor}/sidebar/font-sidebar/font-sidebar.svelte +34 -39
  130. package/dist/components/{presentation-editor/sidebar/position-slidebar.svelte → editor/sidebar/position-sidebar.svelte} +28 -20
  131. package/dist/components/editor/sidebar/position-sidebar.svelte.d.ts +3 -0
  132. package/dist/components/{presentation-editor → editor}/sidebar/sidebar-text-tab-button.svelte +5 -5
  133. package/dist/components/{presentation-editor → editor}/sidebar/sidebar-text-tab.svelte +5 -5
  134. package/dist/components/{presentation-editor → editor}/sidebar/sidebar-uploads-tab.svelte +4 -4
  135. package/dist/components/{presentation-editor → editor}/sidebar/sidebar-wrapper.svelte +6 -4
  136. package/dist/components/{presentation-editor → editor}/sidebar/sidebar.svelte +11 -7
  137. package/dist/components/editor/sidebar/sidebar.svelte.d.ts +7 -0
  138. package/dist/components/{presentation-editor → editor}/sidebar/uploads-image.svelte +3 -3
  139. package/dist/components/editor/types.d.ts +282 -0
  140. package/dist/components/{presentation-editor → editor}/utils.d.ts +14 -6
  141. package/dist/components/{presentation-editor → editor}/utils.js +97 -63
  142. package/dist/components/ui/color-picker/color-picker.svelte +2 -2
  143. package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte +2 -2
  144. package/dist/components/ui/context-menu/context-menu-radio-item.svelte +1 -1
  145. package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +1 -1
  146. package/dist/components/ui/dialog/dialog-content.svelte +3 -3
  147. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +3 -3
  148. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +2 -2
  149. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  150. package/dist/components/ui/dropdown-menu/index.d.ts +1 -0
  151. package/dist/components/ui/slider/slider.svelte +28 -20
  152. package/dist/index.d.ts +12 -6
  153. package/dist/index.js +5 -3
  154. package/package.json +42 -38
  155. package/dist/components/presentation-editor/active-layers-buttons.svelte +0 -53
  156. package/dist/components/presentation-editor/cursor-tooltip.svelte.d.ts +0 -18
  157. package/dist/components/presentation-editor/dragged.svelte.d.ts +0 -18
  158. package/dist/components/presentation-editor/header.svelte.d.ts +0 -18
  159. package/dist/components/presentation-editor/index.d.ts +0 -2
  160. package/dist/components/presentation-editor/index.js +0 -2
  161. package/dist/components/presentation-editor/layers/controls/group-resize-control/group-resize-control.svelte +0 -337
  162. package/dist/components/presentation-editor/layers/types/background/background-layer-content.svelte +0 -19
  163. package/dist/components/presentation-editor/layers/types/html/buttons/bold-button/bold-button.svelte +0 -71
  164. package/dist/components/presentation-editor/layers/types/html/buttons/italic-button/italic-button.svelte +0 -71
  165. package/dist/components/presentation-editor/layers/types/html/buttons/list-button/list-button.svelte +0 -90
  166. package/dist/components/presentation-editor/layers/types/html/editor/utils.js +0 -88
  167. package/dist/components/presentation-editor/layers/types/html/extensions/unstyled-list/index.d.ts +0 -3
  168. package/dist/components/presentation-editor/layers/types/html/extensions/unstyled-list/index.js +0 -3
  169. package/dist/components/presentation-editor/layers/types/html/extensions/unstyled-list/unstyled-list.d.ts +0 -47
  170. package/dist/components/presentation-editor/layers/types/html/extensions/unstyled-list/unstyled-list.js +0 -74
  171. package/dist/components/presentation-editor/layers/types/html/html-layer-content.svelte.d.ts +0 -9
  172. package/dist/components/presentation-editor/layers/types/html/html-layer-edit.svelte +0 -103
  173. package/dist/components/presentation-editor/layers/types/html/html-layer-edit.svelte.d.ts +0 -8
  174. package/dist/components/presentation-editor/layers/types/html/html-layer.svelte +0 -105
  175. package/dist/components/presentation-editor/layers/types/html/html-layer.svelte.d.ts +0 -7
  176. package/dist/components/presentation-editor/layers/types/html/index.d.ts +0 -5
  177. package/dist/components/presentation-editor/layers/types/html/index.js +0 -5
  178. package/dist/components/presentation-editor/menu/slide-menu-content.svelte.d.ts +0 -9
  179. package/dist/components/presentation-editor/presentation-editor.svelte.d.ts +0 -4
  180. package/dist/components/presentation-editor/presentation-editor.svelte.js +0 -813
  181. package/dist/components/presentation-editor/sidebar/position-slidebar.svelte.d.ts +0 -18
  182. package/dist/components/presentation-editor/slide-editor.svelte.d.ts +0 -7
  183. package/dist/components/presentation-editor/slide-inner.svelte.d.ts +0 -18
  184. package/dist/components/presentation-editor/slides-navigation/slide-preview.svelte.d.ts +0 -11
  185. package/dist/components/presentation-editor/slides-navigation/slides-navigation.svelte.d.ts +0 -3
  186. package/dist/components/presentation-editor/types.d.ts +0 -158
  187. /package/dist/components/{presentation-editor → editor}/active-layers-buttons.svelte.d.ts +0 -0
  188. /package/dist/components/{presentation-editor → editor}/active-layers.svelte.d.ts +0 -0
  189. /package/dist/components/{presentation-editor → editor}/color-indicator/color-indicator-gradient-def.svelte +0 -0
  190. /package/dist/components/{presentation-editor → editor}/color-indicator/color-indicator-gradient-def.svelte.d.ts +0 -0
  191. /package/dist/components/{presentation-editor → editor}/color-indicator/color-indicator-gradient.svelte +0 -0
  192. /package/dist/components/{presentation-editor → editor}/color-indicator/color-indicator-gradient.svelte.d.ts +0 -0
  193. /package/dist/components/{presentation-editor → editor}/color-indicator/color-indicator.svelte +0 -0
  194. /package/dist/components/{presentation-editor → editor}/color-indicator/color-indicator.svelte.d.ts +0 -0
  195. /package/dist/components/{presentation-editor → editor}/color-indicator/index.d.ts +0 -0
  196. /package/dist/components/{presentation-editor → editor}/color-indicator/index.js +0 -0
  197. /package/dist/components/{presentation-editor → editor}/fonts.d.ts +0 -0
  198. /package/dist/components/{presentation-editor → editor}/fonts.js +0 -0
  199. /package/dist/components/{presentation-editor → editor}/hotkeys.svelte.d.ts +0 -0
  200. /package/dist/components/{presentation-editor → editor}/layers/active-background-border.svelte.d.ts +0 -0
  201. /package/dist/components/{presentation-editor → editor}/layers/active-layer-border.svelte.d.ts +0 -0
  202. /package/dist/components/{presentation-editor → editor}/layers/buttons/border-button/border-button.svelte.d.ts +0 -0
  203. /package/dist/components/{presentation-editor → editor}/layers/buttons/border-button/index.d.ts +0 -0
  204. /package/dist/components/{presentation-editor → editor}/layers/buttons/border-button/index.js +0 -0
  205. /package/dist/components/{presentation-editor → editor}/layers/buttons/corner-radius-button/corner-radius-button.svelte.d.ts +0 -0
  206. /package/dist/components/{presentation-editor → editor}/layers/buttons/corner-radius-button/index.d.ts +0 -0
  207. /package/dist/components/{presentation-editor → editor}/layers/buttons/corner-radius-button/index.js +0 -0
  208. /package/dist/components/{presentation-editor → editor}/layers/buttons/flip-button/flip-button.svelte.d.ts +0 -0
  209. /package/dist/components/{presentation-editor → editor}/layers/buttons/flip-button/index.d.ts +0 -0
  210. /package/dist/components/{presentation-editor → editor}/layers/buttons/flip-button/index.js +0 -0
  211. /package/dist/components/{presentation-editor → editor}/layers/buttons/opacity-button/index.d.ts +0 -0
  212. /package/dist/components/{presentation-editor → editor}/layers/buttons/opacity-button/index.js +0 -0
  213. /package/dist/components/{presentation-editor → editor}/layers/buttons/opacity-button/opacity-button.svelte.d.ts +0 -0
  214. /package/dist/components/{presentation-editor → editor}/layers/controls/corner-scale-control/corner-scale-control.svelte.d.ts +0 -0
  215. /package/dist/components/{presentation-editor → editor}/layers/controls/corner-scale-control/index.d.ts +0 -0
  216. /package/dist/components/{presentation-editor → editor}/layers/controls/corner-scale-control/index.js +0 -0
  217. /package/dist/components/{presentation-editor → editor}/layers/controls/group-resize-control/group-resize-control.svelte.d.ts +0 -0
  218. /package/dist/components/{presentation-editor → editor}/layers/controls/group-resize-control/index.d.ts +0 -0
  219. /package/dist/components/{presentation-editor → editor}/layers/controls/group-resize-control/index.js +0 -0
  220. /package/dist/components/{presentation-editor → editor}/layers/controls/rotate-control/index.d.ts +0 -0
  221. /package/dist/components/{presentation-editor → editor}/layers/controls/rotate-control/index.js +0 -0
  222. /package/dist/components/{presentation-editor → editor}/layers/controls/rotate-control/rotate-control.svelte.d.ts +0 -0
  223. /package/dist/components/{presentation-editor → editor}/layers/controls/side-resize-control/index.d.ts +0 -0
  224. /package/dist/components/{presentation-editor → editor}/layers/controls/side-resize-control/index.js +0 -0
  225. /package/dist/components/{presentation-editor → editor}/layers/controls/side-resize-control/side-resize-control.svelte.d.ts +0 -0
  226. /package/dist/components/{presentation-editor → editor}/layers/controls/side-scale-control/index.d.ts +0 -0
  227. /package/dist/components/{presentation-editor → editor}/layers/controls/side-scale-control/index.js +0 -0
  228. /package/dist/components/{presentation-editor → editor}/layers/layer-button.svelte.d.ts +0 -0
  229. /package/dist/components/{presentation-editor → editor}/layers/layer-thumb-wrapper.svelte.d.ts +0 -0
  230. /package/dist/components/{presentation-editor → editor}/layers/layer-wrapper.svelte.d.ts +0 -0
  231. /package/dist/components/{presentation-editor → editor}/layers/types/background/background-content-image.svelte.d.ts +0 -0
  232. /package/dist/components/{presentation-editor → editor}/layers/types/background/background-layer-buttons.svelte.d.ts +0 -0
  233. /package/dist/components/{presentation-editor → editor}/layers/types/background/background-layer.svelte.d.ts +0 -0
  234. /package/dist/components/{presentation-editor → editor}/layers/types/background/index.d.ts +0 -0
  235. /package/dist/components/{presentation-editor → editor}/layers/types/background/index.js +0 -0
  236. /package/dist/components/{presentation-editor → editor}/layers/types/image/image-layer-active.svelte.d.ts +0 -0
  237. /package/dist/components/{presentation-editor → editor}/layers/types/image/image-layer-content.svelte.d.ts +0 -0
  238. /package/dist/components/{presentation-editor → editor}/layers/types/image/image-layer.svelte.d.ts +0 -0
  239. /package/dist/components/{presentation-editor → editor}/layers/types/image/index.d.ts +0 -0
  240. /package/dist/components/{presentation-editor → editor}/layers/types/image/index.js +0 -0
  241. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/alignment-button/index.d.ts +0 -0
  242. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/alignment-button/index.js +0 -0
  243. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/bold-button/index.d.ts +0 -0
  244. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/bold-button/index.js +0 -0
  245. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/case-button/index.d.ts +0 -0
  246. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/case-button/index.js +0 -0
  247. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/color-button/index.d.ts +0 -0
  248. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/color-button/index.js +0 -0
  249. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-family-button/index.d.ts +0 -0
  250. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-family-button/index.js +0 -0
  251. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-size-button/index.d.ts +0 -0
  252. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/font-size-button/index.js +0 -0
  253. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/italic-button/index.d.ts +0 -0
  254. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/italic-button/index.js +0 -0
  255. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/list-button/index.d.ts +0 -0
  256. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/list-button/index.js +0 -0
  257. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/strikethrough-button/index.d.ts +0 -0
  258. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/strikethrough-button/index.js +0 -0
  259. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/underline-button/index.d.ts +0 -0
  260. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/buttons/underline-button/index.js +0 -0
  261. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/Editor.d.ts +0 -0
  262. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/Editor.js +0 -0
  263. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/createEditor.d.ts +0 -0
  264. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/createEditor.js +0 -0
  265. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/editor-content.svelte +0 -0
  266. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/editor-content.svelte.d.ts +0 -0
  267. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/index.d.ts +0 -0
  268. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/index.js +0 -0
  269. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/types.d.ts +0 -0
  270. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor/types.js +0 -0
  271. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/editor.css +0 -0
  272. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-family/font-family.d.ts +0 -0
  273. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-family/font-family.js +0 -0
  274. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-family/index.d.ts +0 -0
  275. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-family/index.js +0 -0
  276. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-size/font-size.d.ts +0 -0
  277. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-size/font-size.js +0 -0
  278. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-size/index.d.ts +0 -0
  279. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/font-size/index.js +0 -0
  280. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/line-height/index.d.ts +0 -0
  281. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/line-height/index.js +0 -0
  282. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/line-height/line-height.d.ts +0 -0
  283. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/line-height/line-height.js +0 -0
  284. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/selection/index.d.ts +0 -0
  285. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/selection/index.js +0 -0
  286. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/selection/selection.d.ts +0 -0
  287. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/selection/selection.js +0 -0
  288. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/text-transform/index.d.ts +0 -0
  289. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/text-transform/index.js +0 -0
  290. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions/text-transform/text-transform.d.ts +0 -0
  291. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/extensions.d.ts +0 -0
  292. /package/dist/components/{presentation-editor/layers/types/html → editor/layers/types/text}/html-content.svelte.d.ts +0 -0
  293. /package/dist/components/{presentation-editor → editor}/menu/layer-menu-content.svelte.d.ts +0 -0
  294. /package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/color-sidebar-color.svelte.d.ts +0 -0
  295. /package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte.d.ts +0 -0
  296. /package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/color-sidebar.svelte.d.ts +0 -0
  297. /package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/index.d.ts +0 -0
  298. /package/dist/components/{presentation-editor → editor}/sidebar/color-sidebar/index.js +0 -0
  299. /package/dist/components/{presentation-editor → editor}/sidebar/font-sidebar/font-sidebar-button.svelte.d.ts +0 -0
  300. /package/dist/components/{presentation-editor → editor}/sidebar/font-sidebar/font-sidebar.svelte.d.ts +0 -0
  301. /package/dist/components/{presentation-editor → editor}/sidebar/font-sidebar/index.d.ts +0 -0
  302. /package/dist/components/{presentation-editor → editor}/sidebar/font-sidebar/index.js +0 -0
  303. /package/dist/components/{presentation-editor → editor}/sidebar/sidebar-text-tab-button.svelte.d.ts +0 -0
  304. /package/dist/components/{presentation-editor → editor}/sidebar/sidebar-text-tab.svelte.d.ts +0 -0
  305. /package/dist/components/{presentation-editor → editor}/sidebar/sidebar-uploads-tab.svelte.d.ts +0 -0
  306. /package/dist/components/{presentation-editor → editor}/sidebar/sidebar-wrapper.svelte.d.ts +0 -0
  307. /package/dist/components/{presentation-editor → editor}/sidebar/uploads-image.svelte.d.ts +0 -0
  308. /package/dist/components/{presentation-editor → editor}/snapping-guides.svelte +0 -0
  309. /package/dist/components/{presentation-editor → editor}/snapping-guides.svelte.d.ts +0 -0
  310. /package/dist/components/{presentation-editor → editor}/types.js +0 -0
@@ -0,0 +1,1167 @@
1
+ import uniqid from 'uniqid';
2
+ import { getContext, setContext, tick } from 'svelte';
3
+ import { defaultFonts } from './fonts.js';
4
+ import { cognitionImages, cognitionPages } from './cognition-pages.js';
5
+ import { cognitionPageToJson } from './utils.js';
6
+ import { calculateBoundingBox, calculateImageCover, checkPolygonsIntersect, getRotatedCorners, calculateGroupBoundingBox, calculateGroupRotatedBoundingBox, calculateRelativeRects, calculateNewPosition, degToRad, rotatePoint, } from './layers/utils.js';
7
+ import createEditor from './layers/types/text/editor/createEditor.js';
8
+ import { extensions } from './layers/types/text/extensions.js';
9
+ import { SvelteSet } from 'svelte/reactivity';
10
+ export class Editor {
11
+ mode = 'multiple';
12
+ fonts = defaultFonts;
13
+ images = $state(cognitionImages);
14
+ pages = $state(cognitionPages.map(cognitionPageToJson)); // getPages()
15
+ width = 1920;
16
+ height = 1080;
17
+ zoom = $state(0.4);
18
+ generateId = () => uniqid();
19
+ loadFont = async (family) => {
20
+ const font = this.fonts[family];
21
+ if (!font)
22
+ return;
23
+ const WebFont = await import('webfontloader');
24
+ return new Promise((resolve, reject) => {
25
+ WebFont.load({
26
+ [font.type]: { families: [family] },
27
+ fontactive: () => resolve(null),
28
+ fontinactive: reject,
29
+ });
30
+ });
31
+ };
32
+ searchFonts = (q, limit) => {
33
+ const terms = q
34
+ .trim()
35
+ .split(/\W/g)
36
+ .map((term) => term.toLowerCase());
37
+ return Object.keys(this.fonts)
38
+ .filter((family) => terms.some((term) => ~family.toLowerCase().indexOf(term)))
39
+ .slice(0, limit);
40
+ };
41
+ onImageUpload;
42
+ onUpdate;
43
+ activeSidebarTab = $state(null);
44
+ activeSidebarPopup = $state(null);
45
+ toggleActiveSidebarTab(tab) {
46
+ this.activeSidebarTab = !this.activeSidebarPopup && this.activeSidebarTab === tab ? null : tab;
47
+ if (this.activeSidebarTab) {
48
+ this.activeSidebarPopup = null;
49
+ }
50
+ }
51
+ toggleActiveSidebarPopup(popup) {
52
+ this.activeSidebarPopup = this.activeSidebarPopup === popup ? null : popup;
53
+ }
54
+ zoomSnapping = $state(null);
55
+ findPage(pageId) {
56
+ return this.pages.find((p) => p.id === pageId);
57
+ }
58
+ getRootLayers(page) {
59
+ return page.layers.filter((l) => l.type === 'group' || !l.groupId);
60
+ }
61
+ findLayer(page, layerId) {
62
+ return page.layers.find((l) => l.id === layerId);
63
+ }
64
+ findGroupChildren(page, groupId) {
65
+ return page.layers
66
+ .filter((l) => l.type !== 'group')
67
+ .filter((l) => l.groupId === groupId)
68
+ .toSorted((a, b) => a.sortOrder - b.sortOrder);
69
+ }
70
+ /**
71
+ * Finds root layers in a page based on their IDs.
72
+ *
73
+ * @param page The page to search for layers.
74
+ * @param layerIds The IDs of the layers to find. Can be a single ID or an array of IDs.
75
+ * @returns An array of layers that match the provided IDs.
76
+ */
77
+ findRootLayers(page, layerIds) {
78
+ // Normalize the input to ensure it's always an array of IDs
79
+ const ids = Array.isArray(layerIds) ? layerIds : [layerIds];
80
+ // Filter the page's layers to only include those with IDs in the provided list
81
+ return this.getRootLayers(page).filter((l) => ids.includes(l.id));
82
+ }
83
+ sortedPages = $derived(this.pages.toSorted((a, b) => a.sortOrder - b.sortOrder));
84
+ activePage = $state();
85
+ rootLayers = $derived(this.activePage.layers
86
+ .filter((l) => l.type === 'group' || !l.groupId)
87
+ .toSorted((a, b) => a.sortOrder - b.sortOrder));
88
+ activeSelection = $state({ type: 'empty' });
89
+ activeGroupAndChild = $derived.by(() => {
90
+ if (this.activeSelection.type === 'child-layer') {
91
+ const childLayer = this.findLayer(this.activePage, this.activeSelection.childId);
92
+ if (!childLayer)
93
+ return;
94
+ if (childLayer.type === 'group' || !childLayer.groupId)
95
+ return;
96
+ const groupLayer = this.findLayer(this.activePage, childLayer.groupId);
97
+ if (!groupLayer)
98
+ return;
99
+ if (groupLayer.type !== 'group')
100
+ return;
101
+ return { groupLayer, childLayer };
102
+ }
103
+ });
104
+ activeLayers = $derived.by(() => {
105
+ if (this.activeSelection.type === 'root-layers') {
106
+ const layerIds = this.activeSelection.layerIds;
107
+ return this.rootLayers.filter((l) => layerIds.has(l.id));
108
+ }
109
+ else if (this.activeSelection.type === 'child-layer' && this.activeGroupAndChild) {
110
+ return [this.activeGroupAndChild.groupLayer];
111
+ }
112
+ return [];
113
+ });
114
+ selectedLayers = $derived.by(() => {
115
+ if (this.activeSelection.type === 'root-layers') {
116
+ const layerIds = this.activeSelection.layerIds;
117
+ return this.rootLayers.filter((l) => layerIds.has(l.id));
118
+ }
119
+ else if (this.activeSelection.type === 'child-layer' && this.activeGroupAndChild) {
120
+ return [this.activeGroupAndChild.childLayer];
121
+ }
122
+ return [];
123
+ });
124
+ selectedLayersNotLocked = $derived(this.selectedLayers.filter((layer) => !layer.locked));
125
+ selectedSimpleLayersNotLocked = $derived(this.selectedLayersNotLocked.flatMap((l) => l.type === 'group' ? this.findGroupChildren(this.activePage, l.id) : l));
126
+ activeGroupRotate = $state(0);
127
+ pageSelected = $state(false);
128
+ clipboard = null;
129
+ htmlEditor = createEditor({
130
+ extensions,
131
+ injectCSS: false,
132
+ editorProps: { attributes: { class: 'whitespace-pre-wrap focus:outline-none' } },
133
+ });
134
+ activeAction = $state(null);
135
+ historyActions = $state([]);
136
+ historyIndex = $state(-1);
137
+ dragged = $state();
138
+ fileDragged = $state(false);
139
+ constructor(options = {}) {
140
+ if (options.mode === 'single') {
141
+ const { page, ...rest } = options;
142
+ Object.assign(this, { ...rest });
143
+ if (page) {
144
+ Object.assign(this, { pages: [page] });
145
+ }
146
+ }
147
+ else {
148
+ Object.assign(this, options);
149
+ }
150
+ if (!this.pages.length) {
151
+ this.addPage();
152
+ }
153
+ this.activePage = this.pages[0];
154
+ setEditorContext(this);
155
+ }
156
+ buildEmptyPage(sortOrder = 1) {
157
+ return {
158
+ id: this.generateId(),
159
+ sortOrder,
160
+ locked: false,
161
+ backgroundColor: null,
162
+ backgroundImage: null,
163
+ backgroundLocked: false,
164
+ layers: [],
165
+ };
166
+ }
167
+ addPage({ page, index } = {}) {
168
+ if (this.mode !== 'multiple')
169
+ return false;
170
+ index ??= this.sortedPages.findIndex((l) => l.id === this.activePage.id) + 1;
171
+ console.log('index', index);
172
+ if (!page) {
173
+ page = this.buildEmptyPage();
174
+ const inheritedPage = this.sortedPages[index > 0 ? index - 1 : 0];
175
+ if (inheritedPage) {
176
+ Object.assign(page, { backgroundColor: inheritedPage.backgroundColor });
177
+ }
178
+ }
179
+ const prevPage = this.sortedPages[index - 1];
180
+ const nextPage = this.sortedPages[index];
181
+ if (!prevPage && !nextPage)
182
+ return false;
183
+ const sortOrder = nextPage && prevPage
184
+ ? (prevPage.sortOrder + nextPage.sortOrder) / 2
185
+ : prevPage
186
+ ? prevPage.sortOrder + 1
187
+ : nextPage.sortOrder - 1;
188
+ return this.historyPush({ type: 'pageAdd', page: { ...page, sortOrder } });
189
+ }
190
+ removePage(pageId) {
191
+ if (this.mode !== 'multiple')
192
+ return false;
193
+ const page = this.findPage(pageId);
194
+ if (!page || page.locked)
195
+ return false;
196
+ this.historyPush({ type: 'pageRemove', page });
197
+ }
198
+ copyPage(pageId) {
199
+ const page = this.findPage(pageId);
200
+ if (!page)
201
+ return;
202
+ this.clipboard = $state.snapshot(page);
203
+ }
204
+ togglePageLocked(pageId) {
205
+ if (this.mode !== 'multiple')
206
+ return false;
207
+ const page = this.findPage(pageId);
208
+ if (!page)
209
+ return false;
210
+ return this.historyPush({
211
+ type: 'pageUpdate',
212
+ pageId,
213
+ undo: { locked: page.locked },
214
+ redo: { locked: !page.locked },
215
+ });
216
+ }
217
+ removeBackground(pageId) {
218
+ const page = this.findPage(pageId);
219
+ if (!page || page.locked)
220
+ return;
221
+ this.historyPush({
222
+ pageId: page.id,
223
+ type: 'pageUpdate',
224
+ ...(page.backgroundImage
225
+ ? { undo: { backgroundImage: page.backgroundImage }, redo: { backgroundImage: null } }
226
+ : { undo: { backgroundColor: page.backgroundColor }, redo: { backgroundColor: null } }),
227
+ });
228
+ }
229
+ backgroundImageToLayer(pageId) {
230
+ const page = this.findPage(pageId);
231
+ if (!page || page.locked)
232
+ return;
233
+ if (!page.backgroundImage)
234
+ return;
235
+ this.historyPush([
236
+ {
237
+ type: 'backgroundImageRemove',
238
+ pageId: page.id,
239
+ previousBackgroundImage: page.backgroundImage,
240
+ },
241
+ {
242
+ type: 'layerAdd',
243
+ pageId: page.id,
244
+ layer: this.buildImageLayer({
245
+ ...page.backgroundImage,
246
+ sortOrder: this.generateLayersSortOrder()[0],
247
+ // clean some background props
248
+ scale: 1,
249
+ opacity: 1,
250
+ // clean offset to avoid wrong positioning
251
+ offsetX: 0,
252
+ offsetY: 0,
253
+ }),
254
+ },
255
+ ]);
256
+ }
257
+ backgroundToggleLocked(pageId) {
258
+ const page = this.findPage(pageId);
259
+ if (!page || page.locked)
260
+ return false;
261
+ return this.historyPush({
262
+ type: 'pageUpdate',
263
+ pageId,
264
+ undo: { backgroundLocked: page.backgroundLocked },
265
+ redo: { backgroundLocked: !page.backgroundLocked },
266
+ });
267
+ }
268
+ buildLayerDuplicate(layer, groupId) {
269
+ return {
270
+ ...layer,
271
+ id: this.generateId(),
272
+ ...(groupId && { groupId }),
273
+ };
274
+ }
275
+ duplicatePage(page) {
276
+ if (this.mode !== 'multiple')
277
+ return false;
278
+ const { layers, ...rest } = page;
279
+ const duplicates = this.buildLayersDuplicates(layers);
280
+ const duplicate = {
281
+ ...rest,
282
+ id: this.generateId(),
283
+ layers: duplicates,
284
+ };
285
+ return this.addPage({
286
+ page: duplicate,
287
+ index: this.sortedPages.findIndex((l) => l.id === page.id) + 1,
288
+ });
289
+ }
290
+ generateLayersSortOrder(amount = 1, index) {
291
+ const rootLayers = this.getRootLayers(this.activePage);
292
+ index ??= rootLayers.length;
293
+ index = Math.min(index, rootLayers.length);
294
+ const prev = rootLayers[index - 1];
295
+ const next = rootLayers[index];
296
+ let startingOrder = 0;
297
+ let increment = 1;
298
+ if (next && prev) {
299
+ increment = (next.sortOrder - prev.sortOrder) / (amount + 1);
300
+ startingOrder = prev.sortOrder;
301
+ }
302
+ else if (prev) {
303
+ startingOrder = prev.sortOrder;
304
+ }
305
+ else if (next) {
306
+ startingOrder = next.sortOrder - (amount + 1);
307
+ }
308
+ return Array.from({ length: amount }, (_, i) => startingOrder + increment * (i + 1));
309
+ }
310
+ buildTextLayer({ html, width, height, ...rest }) {
311
+ const scale = rest.scale ?? 1;
312
+ const x = rest.x ?? (this.width - width * scale) / 2;
313
+ const y = rest.y ?? (this.height - height * scale) / 2;
314
+ const layer = {
315
+ id: this.generateId(),
316
+ groupId: null,
317
+ type: 'text',
318
+ x,
319
+ y,
320
+ width,
321
+ height,
322
+ html,
323
+ sortOrder: 1,
324
+ locked: false,
325
+ rotate: 0,
326
+ opacity: 1,
327
+ scale,
328
+ ...rest,
329
+ };
330
+ console.log('textLayer', layer);
331
+ return layer;
332
+ }
333
+ getMaxScale({ width, height }) {
334
+ return Math.min(this.width / 2 / width, this.height / 2 / height);
335
+ }
336
+ buildImageLayer({ image, ...rest }) {
337
+ const width = rest.width ?? image.width;
338
+ const height = rest.height ?? image.height;
339
+ const inputScale = rest.scale ?? 1;
340
+ const scale = rest.scale ?? Math.min(this.getMaxScale({ width, height }), 1);
341
+ if (scale !== 1) {
342
+ rest.scale = scale;
343
+ }
344
+ // adjust x and y according to scale if set or center image
345
+ const x = rest.x == null
346
+ ? (this.width - width * scale) / 2
347
+ : rest.x + (width * inputScale - width * scale) / 2;
348
+ const y = rest.y == null
349
+ ? (this.height - height * scale) / 2
350
+ : rest.y + (height * inputScale - height * scale) / 2;
351
+ const layer = {
352
+ id: this.generateId(),
353
+ groupId: null,
354
+ type: 'image',
355
+ width,
356
+ height,
357
+ image: { ...image },
358
+ sortOrder: 1,
359
+ locked: false,
360
+ rotate: 0,
361
+ opacity: 1,
362
+ scale: 1,
363
+ offsetX: 0,
364
+ offsetY: 0,
365
+ cornerRadius: 0,
366
+ flipX: false,
367
+ flipY: false,
368
+ borderStyle: 'solid',
369
+ borderWidth: 0,
370
+ borderColor: '#000000',
371
+ ...rest,
372
+ x,
373
+ y,
374
+ };
375
+ console.log('imageLayer', layer);
376
+ return layer;
377
+ }
378
+ addLayers(pageId, layers, index) {
379
+ const page = this.findPage(pageId);
380
+ if (!page || page.locked)
381
+ return;
382
+ layers = Array.isArray(layers) ? layers : [layers];
383
+ const layersSortOrder = this.generateLayersSortOrder(layers.length, index);
384
+ this.historyPush(layers.map((layer, i) => ({
385
+ type: 'layerAdd',
386
+ pageId: page.id,
387
+ layer: { ...layer, sortOrder: layersSortOrder[i] },
388
+ })));
389
+ this.setActiveLayers(layers.map((l) => l.id));
390
+ }
391
+ copyLayers(pageId, layerIds) {
392
+ const page = this.findPage(pageId);
393
+ if (!page || page.locked)
394
+ return;
395
+ const layers = this.findRootLayers(page, layerIds);
396
+ if (!layers.length)
397
+ return;
398
+ this.clipboard = $state.snapshot([
399
+ ...layers,
400
+ ...layers
401
+ .filter((l) => l.type === 'group')
402
+ .flatMap((g) => this.findGroupChildren(page, g.id)),
403
+ ]);
404
+ }
405
+ buildGroupChildrenDuplicates(layers, oldGroupId, newGroupId) {
406
+ return layers
407
+ .filter((l) => l.type !== 'group' && l.groupId === oldGroupId)
408
+ .map((l) => this.buildLayerDuplicate(l, newGroupId));
409
+ }
410
+ buildLayersDuplicates(layers) {
411
+ const rootLayers = layers.filter((l) => l.type === 'group' || !l.groupId);
412
+ const duplicates = rootLayers.flatMap((l) => {
413
+ const duplicate = this.buildLayerDuplicate(l);
414
+ return l.type === 'group'
415
+ ? [duplicate, ...this.buildGroupChildrenDuplicates(layers, l.id, duplicate.id)]
416
+ : duplicate;
417
+ });
418
+ return duplicates;
419
+ }
420
+ duplicateLayers(layers) {
421
+ const duplicates = this.buildLayersDuplicates(layers);
422
+ const rootDuplicates = duplicates.filter((l) => l.type === 'group' || !l.groupId);
423
+ const increment = 50;
424
+ const groupBbox = calculateGroupBoundingBox(layers);
425
+ const xIncrement = groupBbox.x + groupBbox.width / 2 > this.width / 2 ? -increment : increment;
426
+ const yIncrement = groupBbox.y + groupBbox.height / 2 > this.height / 2 ? -increment : increment;
427
+ let xAdjust = 0;
428
+ let iteration = 0;
429
+ const tryToDuplicate = () => {
430
+ rootDuplicates.forEach((duplicate, i) => {
431
+ const layer = layers[i];
432
+ Object.assign(duplicate, {
433
+ x: layer.x + xAdjust + xIncrement * iteration,
434
+ y: layer.y + yIncrement * iteration,
435
+ });
436
+ });
437
+ const occupied = rootDuplicates.every((duplicate) => this.activePage.layers.some((l) => l.type === duplicate.type &&
438
+ l.x === duplicate.x &&
439
+ l.y === duplicate.y &&
440
+ l.scale === duplicate.scale &&
441
+ l.rotate === duplicate.rotate));
442
+ if (occupied) {
443
+ iteration++;
444
+ tryToDuplicate();
445
+ }
446
+ else if (!rootDuplicates.some((duplicate) => this.isLayerOutOfBounds(duplicate))) {
447
+ this.addLayers(this.activePage.id, duplicates);
448
+ }
449
+ else {
450
+ xAdjust += xIncrement;
451
+ iteration = 0;
452
+ const newX = groupBbox.x + xAdjust;
453
+ if (newX >= 0 && newX < this.width) {
454
+ tryToDuplicate();
455
+ }
456
+ }
457
+ };
458
+ tryToDuplicate();
459
+ }
460
+ getAbsoluteGroupLayers(groupLayer, children) {
461
+ const theta = degToRad(groupLayer.rotate);
462
+ const groupCenter = {
463
+ x: groupLayer.x + (groupLayer.width * groupLayer.scale) / 2,
464
+ y: groupLayer.y + (groupLayer.height * groupLayer.scale) / 2,
465
+ };
466
+ return children.map((l) => {
467
+ const relativeCenter = {
468
+ x: groupLayer.x + (l.x + (l.width * l.scale) / 2) * groupLayer.scale,
469
+ y: groupLayer.y + (l.y + (l.height * l.scale) / 2) * groupLayer.scale,
470
+ };
471
+ const center = rotatePoint(relativeCenter, groupCenter, theta);
472
+ return {
473
+ ...l,
474
+ x: center.x - (l.width * l.scale * groupLayer.scale) / 2,
475
+ y: center.y - (l.height * l.scale * groupLayer.scale) / 2,
476
+ rotate: l.rotate + groupLayer.rotate,
477
+ scale: l.scale * groupLayer.scale,
478
+ opacity: l.opacity * groupLayer.opacity,
479
+ };
480
+ });
481
+ }
482
+ groupLayers(pageId, layerIds) {
483
+ const page = this.findPage(pageId);
484
+ if (!page || page.locked)
485
+ return;
486
+ const layers = this.findRootLayers(page, layerIds);
487
+ if (layers.length < 2 || layers.some(({ locked }) => locked))
488
+ return;
489
+ const absoluteLayers = layers.flatMap((layer) => layer.type === 'group'
490
+ ? this.getAbsoluteGroupLayers(layer, this.findGroupChildren(page, layer.id))
491
+ : layer);
492
+ const bbox = calculateGroupRotatedBoundingBox(absoluteLayers, this.activeGroupRotate);
493
+ const relativeRects = calculateRelativeRects(bbox, absoluteLayers);
494
+ const groupLayer = {
495
+ id: this.generateId(),
496
+ type: 'group',
497
+ ...bbox,
498
+ opacity: 1,
499
+ sortOrder: Math.max(...layers.map(({ sortOrder }) => sortOrder)),
500
+ locked: false,
501
+ };
502
+ const groupLayers = absoluteLayers.map((l, i) => {
503
+ return {
504
+ ...l,
505
+ id: this.generateId(),
506
+ groupId: groupLayer.id,
507
+ x: relativeRects[i].x,
508
+ y: relativeRects[i].y,
509
+ rotate: relativeRects[i].rotate,
510
+ };
511
+ });
512
+ this.historyPush([
513
+ ...$state.snapshot(layers).map((layer) => ({
514
+ type: 'layerRemove',
515
+ pageId,
516
+ layer,
517
+ })),
518
+ {
519
+ type: 'layerAdd',
520
+ pageId,
521
+ layer: groupLayer,
522
+ },
523
+ ...groupLayers.map((layer) => ({
524
+ type: 'layerAdd',
525
+ pageId,
526
+ layer,
527
+ })),
528
+ ]);
529
+ this.setActiveLayers(groupLayer.id);
530
+ }
531
+ ungroupLayers(pageId, layerIds) {
532
+ const page = this.findPage(pageId);
533
+ if (!page || page.locked)
534
+ return;
535
+ const layers = this.findRootLayers(page, layerIds);
536
+ if (!layers.length || layers.some(({ locked }) => locked))
537
+ return;
538
+ if (!layers.every((layer) => layer.type === 'group'))
539
+ return;
540
+ const absoluteLayers = layers
541
+ .flatMap((l) => this.getAbsoluteGroupLayers(l, this.findGroupChildren(page, l.id)))
542
+ .map((l) => ({
543
+ ...l,
544
+ id: this.generateId(),
545
+ groupId: null,
546
+ }));
547
+ this.historyPush([
548
+ ...$state.snapshot(layers).map((layer) => ({
549
+ type: 'layerRemove',
550
+ pageId,
551
+ layer,
552
+ })),
553
+ ...absoluteLayers.map((layer) => ({
554
+ type: 'layerAdd',
555
+ pageId,
556
+ layer,
557
+ })),
558
+ ]);
559
+ this.setActiveLayers(absoluteLayers.map((l) => l.id));
560
+ }
561
+ removeRootLayers(pageId, layerIds) {
562
+ const page = this.findPage(pageId);
563
+ if (!page || page.locked)
564
+ return;
565
+ const layers = this.findRootLayers(page, layerIds).filter(({ locked }) => !locked);
566
+ if (!layers.length)
567
+ return;
568
+ this.historyPush($state.snapshot(layers).map((layer) => ({
569
+ type: 'layerRemove',
570
+ pageId,
571
+ layer,
572
+ })));
573
+ }
574
+ removeLayers(pageId, layerIds) {
575
+ const page = this.findPage(pageId);
576
+ if (!page || page.locked)
577
+ return;
578
+ const layers = this.findRootLayers(page, layerIds).filter(({ locked }) => !locked);
579
+ if (layers.length) {
580
+ this.removeRootLayers(pageId, layers.map((l) => l.id));
581
+ }
582
+ else {
583
+ const layerId = Array.isArray(layerIds) ? layerIds[0] : layerIds;
584
+ const layer = this.findLayer(this.activePage, layerId);
585
+ if (!layer || layer.type === 'group' || !layer.groupId)
586
+ return;
587
+ const groupLayer = this.findLayer(this.activePage, layer.groupId);
588
+ if (!groupLayer || groupLayer.type !== 'group')
589
+ return;
590
+ const children = this.findGroupChildren(page, groupLayer.id);
591
+ const restChildren = children.filter((l) => l.id !== layer.id);
592
+ const restAbsoluteChildren = this.getAbsoluteGroupLayers(groupLayer, restChildren);
593
+ if (children.length <= 2) {
594
+ const newLayers = restAbsoluteChildren.map((l) => ({
595
+ ...l,
596
+ id: this.generateId(),
597
+ groupId: null,
598
+ }));
599
+ this.historyPush([
600
+ {
601
+ type: 'layerRemove',
602
+ pageId,
603
+ layer: groupLayer,
604
+ },
605
+ ...newLayers.map((layer) => ({
606
+ type: 'layerAdd',
607
+ pageId,
608
+ layer,
609
+ })),
610
+ ]);
611
+ this.setActiveLayers(newLayers.map((l) => l.id));
612
+ }
613
+ else {
614
+ const newGroupBbox = calculateGroupRotatedBoundingBox(restAbsoluteChildren, groupLayer.rotate);
615
+ const relativeLayers = calculateRelativeRects(newGroupBbox, restAbsoluteChildren);
616
+ this.historyPush([
617
+ {
618
+ type: 'layerUpdate',
619
+ pageId,
620
+ layer: { id: groupLayer.id, type: groupLayer.type },
621
+ undo: {
622
+ x: groupLayer.x,
623
+ y: groupLayer.y,
624
+ width: groupLayer.width,
625
+ height: groupLayer.height,
626
+ },
627
+ redo: {
628
+ x: newGroupBbox.x,
629
+ y: newGroupBbox.y,
630
+ width: newGroupBbox.width / groupLayer.scale,
631
+ height: newGroupBbox.height / groupLayer.scale,
632
+ },
633
+ },
634
+ {
635
+ type: 'layerRemove',
636
+ pageId,
637
+ layer: $state.snapshot(layer),
638
+ },
639
+ ...restChildren.map((layer, i) => {
640
+ return {
641
+ type: 'layerUpdate',
642
+ pageId,
643
+ layer: { id: layer.id, type: layer.type },
644
+ undo: { x: layer.x, y: layer.y },
645
+ redo: {
646
+ x: relativeLayers[i].x / groupLayer.scale,
647
+ y: relativeLayers[i].y / groupLayer.scale,
648
+ },
649
+ };
650
+ }),
651
+ ]);
652
+ if (this.activePage.id === pageId) {
653
+ this.setActiveLayers(groupLayer.id);
654
+ }
655
+ }
656
+ }
657
+ }
658
+ checkOverlap(corners, layer) {
659
+ const layerCorners = getRotatedCorners(layer);
660
+ return checkPolygonsIntersect(corners, layerCorners);
661
+ }
662
+ getLayerOverlaps(page, layers) {
663
+ const rootLayers = this.getRootLayers(page);
664
+ const indexes = layers.map((layer) => rootLayers.findIndex(({ id }) => id === layer.id));
665
+ const minIndex = Math.min(...indexes);
666
+ const maxIndex = Math.max(...indexes);
667
+ const corners = getRotatedCorners(layers.length === 1 ? layers[0] : calculateGroupBoundingBox(layers));
668
+ const overlapsIndexes = rootLayers
669
+ .map((l, i) => ({ l, i }))
670
+ .filter(({ l }) => !layers.includes(l) && this.checkOverlap(corners, l))
671
+ .map(({ i }) => i);
672
+ const overlaps = {
673
+ forward: overlapsIndexes.find((i) => i > maxIndex),
674
+ front: overlapsIndexes.findLast((i) => i > maxIndex),
675
+ backward: overlapsIndexes.findLast((i) => i < minIndex),
676
+ back: overlapsIndexes.find((i) => i < minIndex),
677
+ };
678
+ if (overlaps.forward === undefined) {
679
+ const forwardIndex = overlapsIndexes.findLast((i) => i > minIndex);
680
+ overlaps.forward = forwardIndex;
681
+ overlaps.front = forwardIndex;
682
+ }
683
+ if (overlaps.backward === undefined) {
684
+ const backwardIndex = overlapsIndexes.find((i) => i < maxIndex);
685
+ overlaps.backward = backwardIndex;
686
+ overlaps.back = backwardIndex;
687
+ }
688
+ return overlaps.backward !== undefined || overlaps.forward !== undefined ? overlaps : null;
689
+ }
690
+ moveLayers(pageId, layerIds, direction) {
691
+ const page = this.findPage(pageId);
692
+ if (!page || page.locked)
693
+ return;
694
+ const layers = this.findRootLayers(page, layerIds);
695
+ if (!layers.length || layers.some(({ locked }) => locked))
696
+ return;
697
+ const overlaps = this.getLayerOverlaps(page, layers);
698
+ if (!overlaps)
699
+ return;
700
+ const newIndex = overlaps[direction];
701
+ if (newIndex === undefined)
702
+ return;
703
+ const sortOrders = this.generateLayersSortOrder(layers.length, ['forward', 'front'].includes(direction) ? newIndex + 1 : newIndex);
704
+ this.historyPush(layers.map((layer, i) => {
705
+ return {
706
+ type: 'layerUpdate',
707
+ pageId,
708
+ layer: { id: layer.id, type: layer.type },
709
+ undo: { sortOrder: layer.sortOrder },
710
+ redo: { sortOrder: sortOrders[i] },
711
+ };
712
+ }));
713
+ }
714
+ alignLayers(pageId, layerIds, origin) {
715
+ const page = this.findPage(pageId);
716
+ if (!page || page.locked)
717
+ return;
718
+ const layers = this.findRootLayers(page, layerIds);
719
+ if (!layers.length || layers.some(({ locked }) => locked))
720
+ return;
721
+ const bbox = layers.length === 1
722
+ ? { x: 0, y: 0, width: this.width, height: this.height }
723
+ : calculateBoundingBox(calculateGroupRotatedBoundingBox(layers, this.activeGroupRotate));
724
+ this.historyPush(layers.map((layer) => {
725
+ const layerBbox = calculateBoundingBox(layer);
726
+ const { x, y, width, height, scale } = layer;
727
+ const alignment = {
728
+ left: {
729
+ undo: { x },
730
+ redo: { x: bbox.x + (layerBbox.width - width * scale) / 2 },
731
+ },
732
+ center: {
733
+ undo: { x },
734
+ redo: { x: bbox.x + (bbox.width - width * scale) / 2 },
735
+ },
736
+ right: {
737
+ undo: { x },
738
+ redo: {
739
+ x: bbox.x + bbox.width - width * scale - (layerBbox.width - width * scale) / 2,
740
+ },
741
+ },
742
+ top: {
743
+ undo: { y },
744
+ redo: { y: bbox.y + (layerBbox.height - height * scale) / 2 },
745
+ },
746
+ middle: {
747
+ undo: { y },
748
+ redo: { y: bbox.y + (bbox.height - height * scale) / 2 },
749
+ },
750
+ bottom: {
751
+ undo: { y },
752
+ redo: {
753
+ y: bbox.y + bbox.height - height * scale - (layerBbox.height - height * scale) / 2,
754
+ },
755
+ },
756
+ }[origin];
757
+ return {
758
+ type: 'layerUpdate',
759
+ pageId,
760
+ layer: { id: layer.id, type: layer.type },
761
+ ...alignment,
762
+ };
763
+ }));
764
+ }
765
+ imageLayerToBackground(pageId, layerId) {
766
+ const page = this.findPage(pageId);
767
+ if (!page || page.locked)
768
+ return false;
769
+ if (page.backgroundLocked)
770
+ return false;
771
+ const layer = this.findLayer(page, layerId);
772
+ if (!layer || layer.locked)
773
+ return false;
774
+ if (layer.type !== 'image')
775
+ return false;
776
+ const { width, height, rotate, image, opacity, flipX, flipY, offsetX, offsetY } = layer;
777
+ const cover = calculateImageCover({ width, height, rotate }, { width: this.width, height: this.height });
778
+ const backgroundImage = {
779
+ image: { ...image },
780
+ scale: cover.scale,
781
+ offsetX: (offsetX || 0) + cover.offsetX,
782
+ offsetY: (offsetY || 0) + cover.offsetY,
783
+ rotate,
784
+ opacity,
785
+ flipX,
786
+ flipY,
787
+ };
788
+ return this.historyPush([
789
+ {
790
+ type: 'layerRemove',
791
+ pageId: page.id,
792
+ layer: layer,
793
+ },
794
+ {
795
+ type: 'backgroundImageAdd',
796
+ pageId: page.id,
797
+ backgroundImage,
798
+ previousBackgroundImage: $state.snapshot(page.backgroundImage),
799
+ },
800
+ ]);
801
+ }
802
+ toggleLayersLocked(pageId, layerIds, locked) {
803
+ const page = this.findPage(pageId);
804
+ if (!page || page.locked)
805
+ return false;
806
+ const layers = this.findRootLayers(page, layerIds);
807
+ if (!layers.length)
808
+ return false;
809
+ return this.historyPush(layers.map((layer) => ({
810
+ type: 'layerUpdate',
811
+ pageId,
812
+ layer: { id: layer.id, type: layer.type },
813
+ undo: { locked: layer.locked },
814
+ redo: { locked },
815
+ })));
816
+ }
817
+ clipboardPaste() {
818
+ if (this.clipboard) {
819
+ if (Array.isArray(this.clipboard)) {
820
+ this.duplicateLayers(this.clipboard);
821
+ }
822
+ else if ('layers' in this.clipboard) {
823
+ this.duplicatePage(this.clipboard);
824
+ }
825
+ }
826
+ }
827
+ dropDragged(x, y, index) {
828
+ if (this.dragged) {
829
+ if ('image' in this.dragged) {
830
+ const { image, scale } = this.dragged;
831
+ const { width, height } = image;
832
+ const layer = this.buildImageLayer({ x, y, width, height, image, scale });
833
+ this.addLayers(this.activePage.id, layer, index);
834
+ }
835
+ else if (this.dragged?.ref) {
836
+ const { ref, html, scale } = this.dragged;
837
+ const rect = ref.getBoundingClientRect();
838
+ const width = rect.width / scale / this.zoom;
839
+ const height = rect.height / scale / this.zoom;
840
+ const layer = this.buildTextLayer({ x, y, width, height, scale, html });
841
+ this.addLayers(this.activePage.id, layer, index);
842
+ }
843
+ }
844
+ }
845
+ setActivePage(pageId) {
846
+ if (this.mode !== 'multiple')
847
+ return;
848
+ const page = this.findPage(pageId);
849
+ if (!page)
850
+ return;
851
+ this.clearActiveLayer();
852
+ // this.historyReset();
853
+ this.activePage = page;
854
+ this.pageSelected = true;
855
+ return page;
856
+ }
857
+ setActiveLayers(layerIds, action) {
858
+ layerIds = Array.isArray(layerIds) ? layerIds : [layerIds];
859
+ // Reset the active action, background, and page selection
860
+ this.activeAction = null;
861
+ if (this.activeSelection.type !== 'root-layers') {
862
+ const set = new SvelteSet(layerIds);
863
+ if (this.activeSelection.type === 'child-layer' && this.activeGroupAndChild) {
864
+ set.add(this.activeGroupAndChild.groupLayer.id);
865
+ }
866
+ this.activeSelection = { type: 'root-layers', layerIds: set };
867
+ }
868
+ this.pageSelected = false;
869
+ const ids = this.activeSelection.layerIds;
870
+ // If the action is 'delete', remove the layer from the active layer ids
871
+ if (action === 'delete') {
872
+ layerIds.forEach((layerId) => ids.delete(layerId));
873
+ }
874
+ else {
875
+ // If no action is provided, clear the active layer ids
876
+ if (!action) {
877
+ ids.clear();
878
+ this.activeGroupRotate = 0;
879
+ }
880
+ // Add the layers to the active layer ids
881
+ layerIds.forEach((layerId) => ids.add(layerId));
882
+ }
883
+ }
884
+ setActiveGroupChild(childId) {
885
+ this.activeAction = null;
886
+ this.activeSelection = { type: 'child-layer', childId };
887
+ this.pageSelected = false;
888
+ this.activeGroupRotate = 0;
889
+ }
890
+ clearActiveLayer() {
891
+ this.activeAction = null;
892
+ this.activeSelection = { type: 'empty' };
893
+ this.pageSelected = false;
894
+ this.activeGroupRotate = 0;
895
+ }
896
+ setActiveBackground(value) {
897
+ this.activeAction = null;
898
+ this.activeSelection = { type: value ? 'background' : 'empty' };
899
+ this.pageSelected = false;
900
+ this.activeGroupRotate = 0;
901
+ }
902
+ applyChanges(actions, type) {
903
+ console.log('applyChanges', $state.snapshot(actions), type);
904
+ const events = [];
905
+ (type === 'undo' ? actions.reverse() : actions).forEach((action) => {
906
+ if (this.mode === 'multiple' && (action.type === 'pageAdd' || action.type === 'pageRemove')) {
907
+ if ((action.type === 'pageAdd' && type === 'redo') ||
908
+ (action.type === 'pageRemove' && type === 'undo')) {
909
+ let page = { ...action.page };
910
+ events.push({ type: 'pageAdd', data: { page } });
911
+ this.pages.push(page);
912
+ this.setActivePage(page.id);
913
+ if (action.type === 'pageRemove' && action.newPage) {
914
+ const pageId = action.newPage.id;
915
+ const index = this.pages.findIndex(({ id }) => id === pageId);
916
+ if (~index) {
917
+ this.pages.splice(index, 1);
918
+ events.push({ type: 'pageRemove', data: { pageId } });
919
+ }
920
+ }
921
+ }
922
+ else {
923
+ const index = this.pages.findIndex(({ id }) => id === action.page.id);
924
+ if (~index) {
925
+ this.pages.splice(index, 1);
926
+ events.push({ type: 'pageRemove', data: { pageId: action.page.id } });
927
+ if (!this.pages.length && action.type === 'pageRemove') {
928
+ let page = this.buildEmptyPage();
929
+ events.push({ type: 'pageAdd', data: { page } });
930
+ this.pages.push(page);
931
+ this.setActivePage(page.id);
932
+ action.newPage = page;
933
+ }
934
+ else {
935
+ const prevPage = this.sortedPages.findLast((l) => l.sortOrder < action.page.sortOrder);
936
+ this.setActivePage((prevPage ?? this.pages[0]).id);
937
+ }
938
+ }
939
+ }
940
+ }
941
+ else if ('pageId' in action) {
942
+ const page = this.pages.find(({ id }) => id === action.pageId);
943
+ if (!page)
944
+ return false;
945
+ if (action.type === 'pageUpdate') {
946
+ Object.assign(page, action[type]);
947
+ events.push({ type: 'pageUpdate', data: { pageId: page.id, diff: action[type] } });
948
+ }
949
+ else if (action.type === 'layerAdd' || action.type === 'layerRemove') {
950
+ if ((action.type === 'layerAdd' && type === 'redo') ||
951
+ (action.type === 'layerRemove' && type === 'undo')) {
952
+ page.layers.push(action.layer);
953
+ events.push({ type: 'layerAdd', data: { pageId: page.id, layer: action.layer } });
954
+ }
955
+ else {
956
+ const index = page.layers.findIndex(({ id }) => id === action.layer.id);
957
+ if (!~index)
958
+ return;
959
+ page.layers.splice(index, 1);
960
+ events.push({
961
+ type: 'layerRemove',
962
+ data: {
963
+ pageId: page.id,
964
+ layerId: action.layer.id,
965
+ layerType: action.layer.type,
966
+ },
967
+ });
968
+ }
969
+ }
970
+ else if (action.type === 'layerUpdate') {
971
+ const layer = this.findLayer(page, action.layer.id);
972
+ if (!layer)
973
+ return false;
974
+ Object.assign(layer, action[type]);
975
+ events.push({
976
+ type: 'layerUpdate',
977
+ data: {
978
+ pageId: page.id,
979
+ layerId: layer.id,
980
+ layerType: layer.type,
981
+ diff: action[type],
982
+ },
983
+ });
984
+ }
985
+ else if (action.type === 'backgroundImageAdd' ||
986
+ action.type === 'backgroundImageRemove') {
987
+ if (action.type === 'backgroundImageAdd' && type === 'redo') {
988
+ Object.assign(page, { backgroundImage: action.backgroundImage });
989
+ events.push({
990
+ type: 'backgroundImageAdd',
991
+ data: { pageId: page.id, backgroundImage: action.backgroundImage },
992
+ });
993
+ }
994
+ else {
995
+ Object.assign(page, { backgroundImage: action.previousBackgroundImage });
996
+ events.push({
997
+ type: 'backgroundImageRemove',
998
+ data: { pageId: page.id },
999
+ });
1000
+ }
1001
+ }
1002
+ else if (action.type === 'backgroundImageUpdate') {
1003
+ if (!page.backgroundImage)
1004
+ return;
1005
+ Object.assign(page.backgroundImage, action[type]);
1006
+ events.push({
1007
+ type: 'backgroundImageUpdate',
1008
+ data: { pageId: page.id, diff: action[type] },
1009
+ });
1010
+ }
1011
+ }
1012
+ });
1013
+ console.log('events', events);
1014
+ this.onUpdate?.(events, this.pages);
1015
+ return true;
1016
+ }
1017
+ historyReset() {
1018
+ this.historyActions = [];
1019
+ this.historyIndex = -1;
1020
+ }
1021
+ historyPush(actions) {
1022
+ actions = Array.isArray(actions) ? actions : [actions];
1023
+ const done = this.applyChanges(actions, 'redo');
1024
+ if (done) {
1025
+ this.historyActions = [...this.historyActions.slice(0, this.historyIndex + 1), actions];
1026
+ this.historyIndex = this.historyActions.length - 1;
1027
+ }
1028
+ return done;
1029
+ }
1030
+ historyUndo() {
1031
+ if (this.historyIndex >= 0) {
1032
+ const action = this.historyActions[this.historyIndex];
1033
+ this.historyIndex--;
1034
+ this.applyChanges(action, 'undo');
1035
+ }
1036
+ }
1037
+ historyRedo() {
1038
+ if (this.historyIndex < this.historyActions.length - 1) {
1039
+ this.historyIndex++;
1040
+ const action = this.historyActions[this.historyIndex];
1041
+ this.applyChanges(action, 'redo');
1042
+ }
1043
+ }
1044
+ isLayerOutOfBounds(layer) {
1045
+ const bbox = calculateBoundingBox(layer);
1046
+ return (bbox.x > this.width ||
1047
+ bbox.y > this.height ||
1048
+ bbox.x + bbox.width < 0 ||
1049
+ bbox.y + bbox.height < 0);
1050
+ }
1051
+ createTextLayerInitial(page, layer) {
1052
+ if (layer.groupId) {
1053
+ const groupLayer = this.findLayer(page, layer.groupId);
1054
+ const children = this.findGroupChildren(page, layer.groupId);
1055
+ return {
1056
+ layer: { initial: $state.snapshot(layer), state: layer },
1057
+ groupLayer: {
1058
+ initial: $state.snapshot(groupLayer),
1059
+ state: groupLayer,
1060
+ childrenInitial: $state.snapshot(children),
1061
+ childrenState: children,
1062
+ },
1063
+ };
1064
+ }
1065
+ return {
1066
+ layer: { initial: $state.snapshot(layer), state: layer },
1067
+ };
1068
+ }
1069
+ async applyHtmlToLayer(initial, html) {
1070
+ const { layer, groupLayer } = initial;
1071
+ layer.state.html = html;
1072
+ await tick();
1073
+ const layerContent = document.getElementById(`layer-content-${layer.initial.id}`);
1074
+ if (layerContent && layerContent.offsetHeight !== layer.initial.height) {
1075
+ const newHeight = layerContent.offsetHeight;
1076
+ if (groupLayer) {
1077
+ const absoluteChildren = this.getAbsoluteGroupLayers(groupLayer.initial, groupLayer.childrenInitial);
1078
+ const absoluteLayer = absoluteChildren.find((l) => l.id === layer.initial.id);
1079
+ const { newX, newY } = calculateNewPosition(`top-left`, absoluteLayer, absoluteLayer.width * absoluteLayer.scale, newHeight * absoluteLayer.scale);
1080
+ Object.assign(absoluteLayer, { x: newX, y: newY, height: newHeight });
1081
+ const groupScale = groupLayer.initial.scale;
1082
+ const groupRotate = groupLayer.initial.rotate;
1083
+ const newGroupBbox = calculateGroupRotatedBoundingBox(absoluteChildren, groupRotate);
1084
+ const groupAction = {
1085
+ type: 'layerUpdate',
1086
+ pageId: this.activePage.id,
1087
+ layer: { id: groupLayer.initial.id, type: groupLayer.initial.type },
1088
+ undo: {
1089
+ x: groupLayer.initial.x,
1090
+ y: groupLayer.initial.y,
1091
+ width: groupLayer.initial.width,
1092
+ height: groupLayer.initial.height,
1093
+ },
1094
+ redo: {
1095
+ x: newGroupBbox.x,
1096
+ y: newGroupBbox.y,
1097
+ width: newGroupBbox.width / groupScale,
1098
+ height: newGroupBbox.height / groupScale,
1099
+ },
1100
+ };
1101
+ Object.assign(groupLayer.state, groupAction.redo);
1102
+ Object.assign(layer.state, { height: newHeight });
1103
+ const relativeLayers = calculateRelativeRects(newGroupBbox, absoluteChildren);
1104
+ return [
1105
+ groupAction,
1106
+ ...groupLayer.childrenState.map((state, i) => {
1107
+ const initialChild = groupLayer.childrenInitial[i];
1108
+ const isCurrentLayer = state.id === layer.initial.id;
1109
+ const relativeLayer = relativeLayers[i];
1110
+ const action = {
1111
+ type: 'layerUpdate',
1112
+ pageId: this.activePage.id,
1113
+ layer: { id: state.id, type: state.type },
1114
+ undo: {
1115
+ x: initialChild.x,
1116
+ y: initialChild.y,
1117
+ ...(isCurrentLayer && { html: layer.initial.html, height: layer.initial.height }),
1118
+ },
1119
+ redo: {
1120
+ x: relativeLayer.x / groupScale,
1121
+ y: relativeLayer.y / groupScale,
1122
+ ...(isCurrentLayer && { html, height: newHeight }),
1123
+ },
1124
+ };
1125
+ Object.assign(state, action.redo);
1126
+ return action;
1127
+ }),
1128
+ ];
1129
+ }
1130
+ else {
1131
+ const { newX, newY } = calculateNewPosition(`top-left`, layer.initial, layer.initial.width * layer.initial.scale, newHeight * layer.initial.scale);
1132
+ const redo = { html, x: newX, y: newY, height: newHeight };
1133
+ Object.assign(layer.state, redo);
1134
+ return [
1135
+ {
1136
+ type: 'layerUpdate',
1137
+ pageId: this.activePage.id,
1138
+ layer: { id: layer.initial.id, type: layer.initial.type },
1139
+ undo: {
1140
+ html: layer.initial.html,
1141
+ x: layer.initial.x,
1142
+ y: layer.initial.y,
1143
+ height: layer.initial.height,
1144
+ },
1145
+ redo,
1146
+ },
1147
+ ];
1148
+ }
1149
+ }
1150
+ return [
1151
+ {
1152
+ type: 'layerUpdate',
1153
+ pageId: this.activePage.id,
1154
+ layer: { id: layer.initial.id, type: layer.initial.type },
1155
+ undo: { html: layer.initial.html },
1156
+ redo: { html },
1157
+ },
1158
+ ];
1159
+ }
1160
+ }
1161
+ const editorKey = {};
1162
+ export function setEditorContext(editor) {
1163
+ return setContext(editorKey, editor);
1164
+ }
1165
+ export function getEditorContext() {
1166
+ return getContext(editorKey);
1167
+ }