@peteai/presentation-editor 0.0.2 → 0.0.4

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 (211) hide show
  1. package/README.md +2 -2
  2. package/dist/components/presentation-editor/active-layers-buttons.svelte +53 -0
  3. package/dist/components/presentation-editor/active-layers-buttons.svelte.d.ts +3 -0
  4. package/dist/components/presentation-editor/active-layers.svelte +181 -0
  5. package/dist/components/presentation-editor/active-layers.svelte.d.ts +3 -0
  6. package/dist/components/presentation-editor/color-indicator/color-indicator-gradient-def.svelte +81 -0
  7. package/dist/components/presentation-editor/color-indicator/color-indicator-gradient-def.svelte.d.ts +9 -0
  8. package/dist/components/presentation-editor/color-indicator/color-indicator-gradient.svelte +21 -0
  9. package/dist/components/presentation-editor/color-indicator/color-indicator-gradient.svelte.d.ts +8 -0
  10. package/dist/components/presentation-editor/color-indicator/color-indicator.svelte +23 -0
  11. package/dist/components/presentation-editor/color-indicator/color-indicator.svelte.d.ts +6 -0
  12. package/dist/components/presentation-editor/color-indicator/index.d.ts +4 -0
  13. package/dist/components/presentation-editor/color-indicator/index.js +6 -0
  14. package/dist/components/presentation-editor/cursor-tooltip.svelte +1 -1
  15. package/dist/components/presentation-editor/dragged.svelte +21 -11
  16. package/dist/components/presentation-editor/fonts.d.ts +3 -0
  17. package/dist/components/presentation-editor/fonts.js +1278 -0
  18. package/dist/components/presentation-editor/header.svelte +21 -33
  19. package/dist/components/presentation-editor/header.svelte.d.ts +16 -6
  20. package/dist/components/presentation-editor/hotkeys.svelte +85 -0
  21. package/dist/components/presentation-editor/{sidebar/layers.svelte.d.ts → hotkeys.svelte.d.ts} +3 -3
  22. package/dist/components/presentation-editor/layers/active-background-border.svelte +3 -7
  23. package/dist/components/presentation-editor/layers/active-layer-border.svelte +2 -5
  24. package/dist/components/presentation-editor/layers/active-layer-border.svelte.d.ts +0 -1
  25. package/dist/components/presentation-editor/layers/buttons/border-button/border-button.svelte +113 -129
  26. package/dist/components/presentation-editor/layers/buttons/border-button/border-button.svelte.d.ts +2 -2
  27. package/dist/components/presentation-editor/layers/buttons/corner-radius-button/corner-radius-button.svelte +51 -32
  28. package/dist/components/presentation-editor/layers/buttons/corner-radius-button/corner-radius-button.svelte.d.ts +2 -2
  29. package/dist/components/presentation-editor/layers/buttons/flip-button/flip-button.svelte +30 -7
  30. package/dist/components/presentation-editor/layers/buttons/flip-button/flip-button.svelte.d.ts +3 -3
  31. package/dist/components/presentation-editor/layers/buttons/opacity-button/opacity-button.svelte +76 -33
  32. package/dist/components/presentation-editor/layers/buttons/opacity-button/opacity-button.svelte.d.ts +3 -3
  33. package/dist/components/presentation-editor/layers/controls/corner-scale-control/corner-scale-control.svelte +89 -59
  34. package/dist/components/presentation-editor/layers/controls/corner-scale-control/corner-scale-control.svelte.d.ts +5 -100
  35. package/dist/components/presentation-editor/layers/controls/group-resize-control/group-resize-control.svelte +337 -0
  36. package/dist/components/presentation-editor/layers/controls/group-resize-control/group-resize-control.svelte.d.ts +104 -0
  37. package/dist/components/presentation-editor/layers/controls/group-resize-control/index.d.ts +2 -0
  38. package/dist/components/presentation-editor/layers/controls/group-resize-control/index.js +4 -0
  39. package/dist/components/presentation-editor/layers/controls/rotate-control/rotate-control.svelte +128 -43
  40. package/dist/components/presentation-editor/layers/controls/rotate-control/rotate-control.svelte.d.ts +1 -5
  41. package/dist/components/presentation-editor/layers/controls/side-resize-control/side-resize-control.svelte +68 -57
  42. package/dist/components/presentation-editor/layers/controls/side-resize-control/side-resize-control.svelte.d.ts +2 -110
  43. package/dist/components/presentation-editor/layers/controls/side-scale-control/side-scale-control.svelte +45 -32
  44. package/dist/components/presentation-editor/layers/controls/side-scale-control/side-scale-control.svelte.d.ts +2 -54
  45. package/dist/components/presentation-editor/layers/index.d.ts +4 -5
  46. package/dist/components/presentation-editor/layers/index.js +7 -8
  47. package/dist/components/presentation-editor/layers/layer-button.svelte +25 -7
  48. package/dist/components/presentation-editor/layers/layer-wrapper.svelte +212 -162
  49. package/dist/components/presentation-editor/layers/layer-wrapper.svelte.d.ts +2 -2
  50. package/dist/components/presentation-editor/layers/types/background/background-content-image.svelte +41 -0
  51. package/dist/components/presentation-editor/layers/types/background/background-content-image.svelte.d.ts +8 -0
  52. package/dist/components/presentation-editor/layers/types/background/background-layer-buttons.svelte +28 -74
  53. package/dist/components/presentation-editor/layers/types/background/background-layer-buttons.svelte.d.ts +2 -17
  54. package/dist/components/presentation-editor/layers/types/background/background-layer-content.svelte +19 -0
  55. package/dist/components/presentation-editor/layers/types/background/background-layer-content.svelte.d.ts +8 -0
  56. package/dist/components/presentation-editor/layers/types/background/background-layer.svelte +69 -61
  57. package/dist/components/presentation-editor/layers/types/background/background-layer.svelte.d.ts +2 -3
  58. package/dist/components/presentation-editor/layers/types/background/index.d.ts +2 -3
  59. package/dist/components/presentation-editor/layers/types/background/index.js +2 -3
  60. package/dist/components/presentation-editor/layers/types/html/buttons/alignment-button/alignment-button.svelte +55 -12
  61. package/dist/components/presentation-editor/layers/types/html/buttons/alignment-button/alignment-button.svelte.d.ts +3 -3
  62. package/dist/components/presentation-editor/layers/types/html/buttons/bold-button/bold-button.svelte +60 -8
  63. package/dist/components/presentation-editor/layers/types/html/buttons/bold-button/bold-button.svelte.d.ts +3 -3
  64. package/dist/components/presentation-editor/layers/types/html/buttons/case-button/case-button.svelte +59 -24
  65. package/dist/components/presentation-editor/layers/types/html/buttons/case-button/case-button.svelte.d.ts +3 -3
  66. package/dist/components/presentation-editor/layers/types/html/buttons/color-button/color-button.svelte +27 -76
  67. package/dist/components/presentation-editor/layers/types/html/buttons/color-button/color-button.svelte.d.ts +3 -3
  68. package/dist/components/presentation-editor/layers/types/html/buttons/font-family-button/font-family-button.svelte +36 -0
  69. package/dist/components/presentation-editor/layers/types/html/buttons/font-family-button/font-family-button.svelte.d.ts +7 -0
  70. package/dist/components/presentation-editor/layers/types/html/buttons/font-family-button/index.d.ts +2 -0
  71. package/dist/components/presentation-editor/layers/types/html/buttons/font-family-button/index.js +2 -0
  72. package/dist/components/presentation-editor/layers/types/html/buttons/font-size-button/font-size-button.svelte +72 -29
  73. package/dist/components/presentation-editor/layers/types/html/buttons/font-size-button/font-size-button.svelte.d.ts +3 -5
  74. package/dist/components/presentation-editor/layers/types/html/buttons/italic-button/italic-button.svelte +60 -8
  75. package/dist/components/presentation-editor/layers/types/html/buttons/italic-button/italic-button.svelte.d.ts +3 -3
  76. package/dist/components/presentation-editor/layers/types/html/buttons/list-button/list-button.svelte +71 -18
  77. package/dist/components/presentation-editor/layers/types/html/buttons/list-button/list-button.svelte.d.ts +3 -3
  78. package/dist/components/presentation-editor/layers/types/html/buttons/strikethrough-button/strikethrough-button.svelte +54 -8
  79. package/dist/components/presentation-editor/layers/types/html/buttons/strikethrough-button/strikethrough-button.svelte.d.ts +3 -3
  80. package/dist/components/presentation-editor/layers/types/html/buttons/underline-button/underline-button.svelte +54 -9
  81. package/dist/components/presentation-editor/layers/types/html/buttons/underline-button/underline-button.svelte.d.ts +3 -3
  82. package/dist/components/presentation-editor/layers/types/html/editor/createEditor.js +2 -2
  83. package/dist/components/presentation-editor/layers/types/html/editor/utils.d.ts +11 -0
  84. package/dist/components/presentation-editor/layers/types/html/editor/utils.js +88 -0
  85. package/dist/components/presentation-editor/layers/types/html/extensions/font-family/font-family.d.ts +27 -0
  86. package/dist/components/presentation-editor/layers/types/html/extensions/font-family/font-family.js +40 -0
  87. package/dist/components/presentation-editor/layers/types/html/extensions/font-family/index.d.ts +3 -0
  88. package/dist/components/presentation-editor/layers/types/html/extensions/font-family/index.js +3 -0
  89. package/dist/components/presentation-editor/layers/types/html/extensions/font-size/font-size.d.ts +5 -1
  90. package/dist/components/presentation-editor/layers/types/html/extensions/font-size/font-size.js +3 -7
  91. package/dist/components/presentation-editor/layers/types/html/extensions.d.ts +1 -0
  92. package/dist/components/presentation-editor/layers/types/html/extensions.js +56 -0
  93. package/dist/components/presentation-editor/layers/types/html/html-content.svelte +26 -5
  94. package/dist/components/presentation-editor/layers/types/html/html-layer-content.svelte +26 -0
  95. package/dist/components/presentation-editor/layers/types/html/html-layer-content.svelte.d.ts +9 -0
  96. package/dist/components/presentation-editor/layers/types/html/html-layer-edit.svelte +103 -0
  97. package/dist/components/presentation-editor/layers/types/html/html-layer-edit.svelte.d.ts +8 -0
  98. package/dist/components/presentation-editor/layers/types/html/html-layer.svelte +61 -53
  99. package/dist/components/presentation-editor/layers/types/html/index.d.ts +3 -5
  100. package/dist/components/presentation-editor/layers/types/html/index.js +3 -56
  101. package/dist/components/presentation-editor/layers/types/image/{image-content.svelte → image-layer-content.svelte} +11 -3
  102. package/dist/components/presentation-editor/layers/types/image/image-layer-content.svelte.d.ts +8 -0
  103. package/dist/components/presentation-editor/layers/types/image/image-layer.svelte +51 -21
  104. package/dist/components/presentation-editor/layers/types/image/index.d.ts +2 -4
  105. package/dist/components/presentation-editor/layers/types/image/index.js +2 -4
  106. package/dist/components/presentation-editor/layers/utils.d.ts +68 -9
  107. package/dist/components/presentation-editor/layers/utils.js +260 -25
  108. package/dist/components/presentation-editor/menu/background-menu-content.svelte +80 -0
  109. package/dist/components/presentation-editor/menu/background-menu-content.svelte.d.ts +9 -0
  110. package/dist/components/presentation-editor/menu/layer-menu-content.svelte +183 -0
  111. package/dist/components/presentation-editor/menu/layer-menu-content.svelte.d.ts +3 -0
  112. package/dist/components/presentation-editor/menu/slide-menu-content.svelte +67 -0
  113. package/dist/components/presentation-editor/menu/slide-menu-content.svelte.d.ts +9 -0
  114. package/dist/components/presentation-editor/presentation-editor.svelte +119 -175
  115. package/dist/components/presentation-editor/presentation-editor.svelte.js +597 -136
  116. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-color.svelte +58 -0
  117. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-color.svelte.d.ts +10 -0
  118. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte +144 -0
  119. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte.d.ts +7 -0
  120. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar.svelte +404 -0
  121. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar.svelte.d.ts +3 -0
  122. package/dist/components/presentation-editor/sidebar/color-sidebar/index.d.ts +2 -0
  123. package/dist/components/presentation-editor/sidebar/color-sidebar/index.js +2 -0
  124. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar-button.svelte +26 -0
  125. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar-button.svelte.d.ts +8 -0
  126. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar.svelte +216 -0
  127. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar.svelte.d.ts +3 -0
  128. package/dist/components/presentation-editor/sidebar/font-sidebar/index.d.ts +2 -0
  129. package/dist/components/presentation-editor/sidebar/font-sidebar/index.js +2 -0
  130. package/dist/components/presentation-editor/sidebar/position-slidebar.svelte +130 -0
  131. package/dist/components/presentation-editor/sidebar/position-slidebar.svelte.d.ts +18 -0
  132. package/dist/components/presentation-editor/sidebar/sidebar-text-tab-button.svelte +90 -0
  133. package/dist/components/presentation-editor/sidebar/sidebar-text-tab-button.svelte.d.ts +7 -0
  134. package/dist/components/presentation-editor/sidebar/sidebar-text-tab.svelte +82 -0
  135. package/dist/components/presentation-editor/sidebar/sidebar-text-tab.svelte.d.ts +18 -0
  136. package/dist/components/presentation-editor/sidebar/{images-library.svelte → sidebar-uploads-tab.svelte} +0 -1
  137. package/dist/components/presentation-editor/sidebar/sidebar-uploads-tab.svelte.d.ts +3 -0
  138. package/dist/components/presentation-editor/sidebar/sidebar-wrapper.svelte +25 -0
  139. package/dist/components/presentation-editor/sidebar/sidebar-wrapper.svelte.d.ts +7 -0
  140. package/dist/components/presentation-editor/sidebar/sidebar.svelte +71 -15
  141. package/dist/components/presentation-editor/sidebar/sidebar.svelte.d.ts +16 -5
  142. package/dist/components/presentation-editor/sidebar/uploads-image.svelte +28 -11
  143. package/dist/components/presentation-editor/slide-editor.svelte +20 -22
  144. package/dist/components/presentation-editor/slide-inner.svelte +19 -18
  145. package/dist/components/presentation-editor/slides-navigation/slide-preview.svelte +61 -52
  146. package/dist/components/presentation-editor/slides-navigation/slides-navigation.svelte +6 -8
  147. package/dist/components/presentation-editor/snapping-guides.svelte +3 -3
  148. package/dist/components/presentation-editor/types.d.ts +67 -27
  149. package/dist/components/presentation-editor/utils.d.ts +50 -1
  150. package/dist/components/presentation-editor/utils.js +101 -6
  151. package/dist/components/ui/button/button.svelte +3 -2
  152. package/dist/components/ui/button/button.svelte.d.ts +5 -82
  153. package/dist/components/ui/color-picker/color-picker-alpha-grid.svelte +43 -0
  154. package/dist/components/ui/color-picker/color-picker-alpha-grid.svelte.d.ts +8 -0
  155. package/dist/components/ui/color-picker/color-picker.svelte +344 -0
  156. package/dist/components/ui/color-picker/color-picker.svelte.d.ts +13 -0
  157. package/dist/components/ui/color-picker/index.d.ts +3 -0
  158. package/dist/components/ui/color-picker/index.js +5 -0
  159. package/dist/components/ui/context-menu/context-menu-shortcut.svelte +6 -3
  160. package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +1 -1
  161. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  162. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +6 -3
  163. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  164. package/dist/components/ui/infinite-loader/index.d.ts +4 -0
  165. package/dist/components/ui/infinite-loader/index.js +4 -0
  166. package/dist/components/ui/infinite-loader/infinite-loader-loop-tracker.d.ts +13 -0
  167. package/dist/components/ui/infinite-loader/infinite-loader-loop-tracker.js +44 -0
  168. package/dist/components/ui/infinite-loader/infinite-loader-state.svelte.d.ts +15 -0
  169. package/dist/components/ui/infinite-loader/infinite-loader-state.svelte.js +28 -0
  170. package/dist/components/ui/infinite-loader/infinite-loader.svelte +149 -0
  171. package/dist/components/ui/infinite-loader/infinite-loader.svelte.d.ts +17 -0
  172. package/dist/components/ui/input/input.svelte +1 -1
  173. package/dist/components/ui/slider/slider.svelte +20 -18
  174. package/dist/components/ui/tabs/index.d.ts +6 -0
  175. package/dist/components/ui/tabs/index.js +8 -0
  176. package/dist/components/ui/tabs/tabs-content.svelte +19 -0
  177. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
  178. package/dist/components/ui/tabs/tabs-list.svelte +19 -0
  179. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
  180. package/dist/components/ui/tabs/tabs-trigger.svelte +19 -0
  181. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
  182. package/dist/components/ui/toggle/toggle.svelte +3 -2
  183. package/dist/components/ui/toggle/toggle.svelte.d.ts +2 -46
  184. package/dist/plugin.js +3 -2
  185. package/dist/utils.d.ts +1 -0
  186. package/dist/utils.js +1 -0
  187. package/package.json +28 -25
  188. package/dist/components/presentation-editor/app.css +0 -12
  189. package/dist/components/presentation-editor/layers/hovered-layer.svelte +0 -34
  190. package/dist/components/presentation-editor/layers/hovered-layer.svelte.d.ts +0 -7
  191. package/dist/components/presentation-editor/layers/types/background/background-content.svelte +0 -11
  192. package/dist/components/presentation-editor/layers/types/background/background-content.svelte.d.ts +0 -7
  193. package/dist/components/presentation-editor/layers/types/background/background-layer-thumb.svelte +0 -12
  194. package/dist/components/presentation-editor/layers/types/background/background-layer-thumb.svelte.d.ts +0 -7
  195. package/dist/components/presentation-editor/layers/types/html/html-layer-active.svelte +0 -159
  196. package/dist/components/presentation-editor/layers/types/html/html-layer-active.svelte.d.ts +0 -8
  197. package/dist/components/presentation-editor/layers/types/html/html-layer-buttons.svelte +0 -42
  198. package/dist/components/presentation-editor/layers/types/html/html-layer-buttons.svelte.d.ts +0 -10
  199. package/dist/components/presentation-editor/layers/types/html/html-layer-thumb.svelte +0 -24
  200. package/dist/components/presentation-editor/layers/types/html/html-layer-thumb.svelte.d.ts +0 -8
  201. package/dist/components/presentation-editor/layers/types/image/image-content.svelte.d.ts +0 -8
  202. package/dist/components/presentation-editor/layers/types/image/image-layer-buttons.svelte +0 -21
  203. package/dist/components/presentation-editor/layers/types/image/image-layer-buttons.svelte.d.ts +0 -7
  204. package/dist/components/presentation-editor/layers/types/image/image-layer-thumb.svelte +0 -13
  205. package/dist/components/presentation-editor/layers/types/image/image-layer-thumb.svelte.d.ts +0 -8
  206. package/dist/components/presentation-editor/sidebar/images-library.svelte.d.ts +0 -3
  207. package/dist/components/presentation-editor/sidebar/layers.svelte +0 -94
  208. package/dist/components/presentation-editor/slides-navigation/buttons/slide-delete-button.svelte +0 -32
  209. package/dist/components/presentation-editor/slides-navigation/buttons/slide-delete-button.svelte.d.ts +0 -10
  210. package/dist/components/presentation-editor/slides-navigation/buttons/slide-duplicate-button.svelte +0 -34
  211. package/dist/components/presentation-editor/slides-navigation/buttons/slide-duplicate-button.svelte.d.ts +0 -10
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
- import { onMount } from 'svelte';
2
+ import { tick } from 'svelte';
3
3
  import type { HtmlLayer } from '../../../types.js';
4
4
  import { getPresentationEditorContext } from '../../../presentation-editor.svelte.js';
5
- import { cn } from '../../../../../utils.js';
6
- import { HtmlContent } from './index.js';
5
+ import { HtmlLayerContent } from './index.js';
6
+ import { calculateBoundingBox, calculateLayerTransform } from '../../utils.js';
7
7
 
8
8
  interface Props {
9
9
  layer: HtmlLayer;
@@ -13,85 +13,93 @@
13
13
 
14
14
  const editor = getPresentationEditorContext();
15
15
 
16
- let ref: HTMLElement;
16
+ let ref: HTMLElement | null = $state(null);
17
17
 
18
- let scale = $derived(layer.scale || 1);
19
-
20
- onMount(() => {
21
- layer.height = ref.offsetHeight;
18
+ $effect(() => {
19
+ if (!ref) return;
20
+ tick().then(() => {
21
+ if (!ref) return;
22
+ layer.height = ref.offsetHeight;
23
+ });
22
24
  });
23
25
 
24
- const onMouseDown = () => {
25
- console.log('mousedown', layer.id);
26
- if (editor.activeLayer?.id === layer.id && !editor.activeAction) {
26
+ const onMouseDown = (e: MouseEvent) => {
27
+ if (e.button !== 0) return;
28
+ console.log('mousedown', layer.id, e);
29
+ if (
30
+ !editor.activeSlide.locked &&
31
+ !layer.locked &&
32
+ editor.activeLayerIds.has(layer.id) &&
33
+ !editor.activeAction
34
+ ) {
27
35
  addEventListener('mouseup', onMouseUp);
28
36
  }
29
37
  };
30
38
 
31
39
  const onMouseUp = (e: MouseEvent) => {
32
- console.log('mouseup', layer.id);
33
- if (editor.activeLayer?.id === layer.id && !editor.activeAction) {
40
+ console.log('mouseup', layer.id, e);
41
+ if (
42
+ editor.activeLayerIds.has(layer.id) &&
43
+ editor.activeLayerIds.size === 1 &&
44
+ !editor.activeAction
45
+ ) {
34
46
  console.log('edit layer', layer.id);
35
- editor.activeAction = {
36
- type: 'edit',
37
- clientX: e.clientX,
38
- clientY: e.clientY,
39
- layer: { ...layer },
40
- };
47
+ editor.activeAction = { id: layer.id, type: 'edit' };
41
48
  }
42
49
  removeEventListener('mouseup', onMouseUp);
43
50
  };
44
51
 
45
52
  const onDragEnter = (e: DragEvent) => {
46
53
  console.log('dragenter html layer', e);
47
- e.preventDefault();
48
- e.stopPropagation();
49
54
 
50
55
  if (editor.dragged) {
51
- editor.dragged = { ...editor.dragged, hidden: false, scale: editor.zoom, sticky: true };
56
+ e.preventDefault();
57
+ e.stopPropagation();
58
+ editor.dragged = {
59
+ ...editor.dragged,
60
+ hidden: false,
61
+ inside: true,
62
+ sticky: true,
63
+ customScale: null,
64
+ };
65
+ }
66
+ };
67
+
68
+ const onDragOver = (e: DragEvent) => {
69
+ // console.log('dragover html layer', e);
70
+ if (editor.dragged) {
71
+ e.preventDefault();
72
+ e.stopPropagation();
52
73
  }
53
74
  };
54
75
 
55
76
  const onDrop = (e: DragEvent) => {
77
+ if (!ref) return;
56
78
  console.log('drop html layer', e);
57
- e.preventDefault();
58
79
 
59
80
  const { dragged } = editor;
60
81
  if (dragged) {
61
- editor.addImageLayer({
62
- x: e.offsetX - dragged.offsetX / editor.zoom + layer.x,
63
- y: e.offsetY - dragged.offsetY / editor.zoom + layer.y,
64
- width: dragged.image.width,
65
- height: dragged.image.height,
66
- image: {
67
- id: dragged.image.id,
68
- src: dragged.image.src,
69
- width: dragged.image.width,
70
- height: dragged.image.height,
71
- },
72
- });
82
+ e.preventDefault();
83
+ e.stopPropagation();
84
+ const bbox = calculateBoundingBox(calculateLayerTransform(layer));
85
+ const rect = ref.getBoundingClientRect();
86
+ const x = (e.clientX - rect.left - dragged.offsetX) / editor.zoom + bbox.x;
87
+ const y = (e.clientY - rect.top - dragged.offsetY) / editor.zoom + bbox.y;
88
+ editor.dropDragged(x, y);
73
89
  }
74
90
  };
75
91
  </script>
76
92
 
93
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
77
94
  <div
78
- class={cn('h-full', { 'origin-top-left': scale !== 1 })}
79
- style:width="{layer.width}px"
80
- style:height="{layer.height}px"
81
- style:transform={scale !== 1 ? `scale(${layer.scale})` : ''}
95
+ class="h-full w-full"
96
+ style:opacity={editor.activeAction?.id === layer.id && editor.activeAction?.type === 'edit'
97
+ ? 0
98
+ : null}
99
+ onmousedown={onMouseDown}
100
+ ondragenter={onDragEnter}
101
+ ondragover={onDragOver}
102
+ ondrop={onDrop}
82
103
  >
83
- <!-- svelte-ignore a11y_no_static_element_interactions -->
84
- <div
85
- class="whitespace-pre-wrap break-words p-0 text-left text-base font-normal normal-case not-italic text-black"
86
- bind:this={ref}
87
- id="layer-content-{layer.id}"
88
- style:opacity={editor.activeLayer?.id === layer.id && editor.activeAction?.type === 'edit'
89
- ? 0
90
- : null}
91
- onmousedown={onMouseDown}
92
- ondragenter={onDragEnter}
93
- ondrop={onDrop}
94
- >
95
- <HtmlContent html={layer.html} />
96
- </div>
104
+ <HtmlLayerContent {layer} bind:ref />
97
105
  </div>
@@ -1,7 +1,5 @@
1
1
  import Root from './html-layer.svelte';
2
- import HtmlLayerThumb from './html-layer-thumb.svelte';
2
+ import HtmlLayerContent from './html-layer-content.svelte';
3
3
  import HtmlContent from './html-content.svelte';
4
- import HtmlLayerButtons from './html-layer-buttons.svelte';
5
- import HtmlLayerActive from './html-layer-active.svelte';
6
- declare const extensions: (import("@tiptap/core").Extension<any, any> | import("@tiptap/core").Node<any, any> | import("@tiptap/core").Mark<import("@tiptap/extension-bold").BoldOptions, any>)[];
7
- export { Root, Root as HtmlLayer, HtmlLayerThumb, HtmlContent, HtmlLayerButtons, HtmlLayerActive, extensions, };
4
+ import HtmlLayerEdit from './html-layer-edit.svelte';
5
+ export { Root, Root as HtmlLayer, HtmlLayerContent, HtmlContent, HtmlLayerEdit };
@@ -1,58 +1,5 @@
1
- import { Document } from '@tiptap/extension-document';
2
- import { Paragraph } from '@tiptap/extension-paragraph';
3
- import { Text } from '@tiptap/extension-text';
4
- import { ListItem } from '@tiptap/extension-list-item';
5
- import { BulletList } from '@tiptap/extension-bullet-list';
6
- import { OrderedList } from '@tiptap/extension-ordered-list';
7
- import { UnstyledList } from './extensions/unstyled-list/index.js';
8
- import { TextStyle } from '@tiptap/extension-text-style';
9
- import { TextAlign } from '@tiptap/extension-text-align';
10
- import { LineHeight } from './extensions/line-height/index.js';
11
- import { TextTransform } from './extensions/text-transform/index.js';
12
- import { FontSize } from './extensions/font-size/index.js';
13
- import { Color } from '@tiptap/extension-color';
14
- import { Bold } from '@tiptap/extension-bold';
15
- import { Italic } from '@tiptap/extension-italic';
16
- import { Underline } from '@tiptap/extension-underline';
17
- import { Strike } from '@tiptap/extension-strike';
18
- import { Selection } from './extensions/selection/index.js';
19
1
  import Root from './html-layer.svelte';
20
- import HtmlLayerThumb from './html-layer-thumb.svelte';
2
+ import HtmlLayerContent from './html-layer-content.svelte';
21
3
  import HtmlContent from './html-content.svelte';
22
- import HtmlLayerButtons from './html-layer-buttons.svelte';
23
- import HtmlLayerActive from './html-layer-active.svelte';
24
- const extensions = [
25
- Document,
26
- Paragraph,
27
- Text,
28
- ListItem.configure({
29
- HTMLAttributes: { style: 'margin-left: calc(var(--list-item-ident)*1em)' },
30
- }),
31
- BulletList.configure({
32
- HTMLAttributes: { class: 'list-disc', style: '--list-item-ident: 1.7' },
33
- keepAttributes: true,
34
- keepMarks: true,
35
- }),
36
- OrderedList.configure({
37
- HTMLAttributes: { class: 'list-decimal', style: '--list-item-ident: 1.7' },
38
- keepAttributes: true,
39
- keepMarks: true,
40
- }),
41
- UnstyledList.configure({
42
- HTMLAttributes: { class: 'list-none', style: '--list-item-ident: 0' },
43
- keepAttributes: true,
44
- keepMarks: true,
45
- }),
46
- TextStyle,
47
- TextAlign.configure({ types: ['paragraph', 'listItem'] }),
48
- LineHeight.configure({ types: ['paragraph', 'listItem'] }),
49
- TextTransform.configure({ types: ['paragraph', 'listItem'] }),
50
- FontSize.configure({ types: ['paragraph', 'listItem'] }),
51
- Color.configure({ types: ['paragraph', 'listItem', 'textStyle'] }),
52
- Bold,
53
- Italic,
54
- Underline,
55
- Strike,
56
- Selection,
57
- ];
58
- export { Root, Root as HtmlLayer, HtmlLayerThumb, HtmlContent, HtmlLayerButtons, HtmlLayerActive, extensions, };
4
+ import HtmlLayerEdit from './html-layer-edit.svelte';
5
+ export { Root, Root as HtmlLayer, HtmlLayerContent, HtmlContent, HtmlLayerEdit };
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { ImageLayer } from '../../../types.js';
3
+ import ColorIndicatorGradientDef from '../../../color-indicator/color-indicator-gradient-def.svelte';
3
4
  import { generateId } from '../../../../../utils.js';
4
5
 
5
6
  interface Props {
@@ -7,7 +8,7 @@
7
8
  thumbScale?: number;
8
9
  }
9
10
 
10
- let { layer = $bindable(), thumbScale = 1 }: Props = $props();
11
+ let { layer, thumbScale = 1 }: Props = $props();
11
12
 
12
13
  let imageLoaded = $state(false);
13
14
  const image = new Image();
@@ -16,6 +17,10 @@
16
17
  image.onload = () => (imageLoaded = true);
17
18
 
18
19
  const layerBorderId = generateId();
20
+ const gradientId = generateId();
21
+
22
+ let borderColor = $derived(layer.borderColor || '#000000');
23
+ let isGradient = $derived(~borderColor.indexOf(':'));
19
24
 
20
25
  let scale = $derived(layer.scale || 1);
21
26
  let width = $derived(layer.width * scale * thumbScale);
@@ -57,7 +62,7 @@
57
62
  </div>
58
63
  </div>
59
64
 
60
- {#if layer.borderWidth}
65
+ {#if layer.borderStyle && layer.borderWidth}
61
66
  {@const borderWidth = layer.borderWidth * thumbScale}
62
67
  {@const path = `M0,0L0,${height}L${width},${height}L${width},0L0,0`}
63
68
  <div
@@ -73,13 +78,16 @@
73
78
  style:height="{height}px"
74
79
  >
75
80
  <defs>
81
+ {#if isGradient}
82
+ <ColorIndicatorGradientDef id={gradientId} color={borderColor} {width} {height} />
83
+ {/if}
76
84
  <clipPath id={layerBorderId}>
77
85
  <path d={path}></path>
78
86
  </clipPath>
79
87
  </defs>
80
88
  <path
81
89
  d={roundedClipPath || path}
82
- stroke={layer.borderColor || '#000000'}
90
+ stroke={isGradient ? `url(#${gradientId})` : borderColor}
83
91
  stroke-width={borderWidth * 2}
84
92
  stroke-linecap="butt"
85
93
  clip-path="url(#{layerBorderId})"
@@ -0,0 +1,8 @@
1
+ import type { ImageLayer } from '../../../types.js';
2
+ interface Props {
3
+ layer: ImageLayer;
4
+ thumbScale?: number;
5
+ }
6
+ declare const ImageLayerContent: import("svelte").Component<Props, {}, "">;
7
+ type ImageLayerContent = ReturnType<typeof ImageLayerContent>;
8
+ export default ImageLayerContent;
@@ -1,8 +1,12 @@
1
1
  <script lang="ts">
2
2
  import type { Image, ImageLayer } from '../../../types.js';
3
3
  import { getPresentationEditorContext } from '../../../presentation-editor.svelte.js';
4
- import ImageContent from './image-content.svelte';
5
- import { calculateImageFill } from '../../utils.js';
4
+ import ImageLayerContent from './image-layer-content.svelte';
5
+ import {
6
+ calculateBoundingBox,
7
+ calculateImageCover,
8
+ calculateLayerTransform,
9
+ } from '../../utils.js';
6
10
 
7
11
  interface Props {
8
12
  layer: ImageLayer;
@@ -17,31 +21,42 @@
17
21
  let ref: HTMLDivElement;
18
22
 
19
23
  const buildImageDropChanges = (image: Image) => {
20
- const layerScale = layer.scale || 1;
24
+ const scale = layer.scale || 1;
21
25
 
22
26
  return {
23
27
  image,
24
- ...calculateImageFill(image, {
25
- width: layer.width * layerScale,
26
- height: layer.height * layerScale,
28
+ ...calculateImageCover(image, {
29
+ width: layer.width * scale,
30
+ height: layer.height * scale,
27
31
  }),
28
32
  };
29
33
  };
30
34
 
31
35
  const onDragEnter = (e: DragEvent) => {
32
36
  console.log('dragenter image layer', e);
33
- e.preventDefault();
34
- e.stopPropagation();
35
37
 
36
38
  if (editor.dragged) {
37
- editor.dragged.hidden = true;
38
- layerSubstitute = { ...layer, ...buildImageDropChanges(editor.dragged.image) };
39
+ e.preventDefault();
40
+ e.stopPropagation();
41
+ editor.dragged = {
42
+ ...editor.dragged,
43
+ hidden: false,
44
+ inside: true,
45
+ sticky: true,
46
+ customScale: null,
47
+ };
48
+ if ('image' in editor.dragged) {
49
+ editor.dragged.hidden = true;
50
+ layerSubstitute = { ...layer, ...buildImageDropChanges(editor.dragged.image) };
51
+ }
39
52
  }
40
53
  };
41
54
 
42
55
  const onDragOver = (e: DragEvent) => {
43
56
  // console.log('dragover image layer', e);
44
- e.preventDefault();
57
+ if (editor.dragged) {
58
+ e.preventDefault();
59
+ }
45
60
  };
46
61
 
47
62
  const onDragLeave = (e: DragEvent) => {
@@ -53,15 +68,30 @@
53
68
  };
54
69
 
55
70
  const onDrop = (e: DragEvent) => {
56
- e.preventDefault();
57
-
58
- if (editor.dragged) {
59
- const redo = buildImageDropChanges(editor.dragged.image);
60
- const undo = Object.fromEntries(
61
- Object.keys(redo).map((key) => [key, layer[key as keyof ImageLayer]]),
62
- );
63
- Object.assign(layer, redo);
64
- editor.historyPush({ type: 'layer', layer: { id: layer.id, type: layer.type }, undo, redo });
71
+ const { dragged } = editor;
72
+ if (dragged) {
73
+ e.preventDefault();
74
+ e.stopPropagation();
75
+ if ('image' in dragged) {
76
+ const redo = buildImageDropChanges(dragged.image);
77
+ const undo = Object.fromEntries(
78
+ Object.keys(redo).map((key) => [key, layer[key as keyof ImageLayer]]),
79
+ );
80
+ Object.assign(layer, redo);
81
+ editor.historyPush({
82
+ type: 'layer',
83
+ slideId: editor.activeSlide.id,
84
+ layer: { id: layer.id, type: layer.type },
85
+ undo,
86
+ redo,
87
+ });
88
+ } else {
89
+ const bbox = calculateBoundingBox(calculateLayerTransform(layer));
90
+ const rect = ref.getBoundingClientRect();
91
+ const x = (e.clientX - rect.left - dragged.offsetX) / editor.zoom + bbox.x;
92
+ const y = (e.clientY - rect.top - dragged.offsetY) / editor.zoom + bbox.y;
93
+ editor.dropDragged(x, y);
94
+ }
65
95
  }
66
96
  layerSubstitute = null;
67
97
  };
@@ -76,5 +106,5 @@
76
106
  ondragleave={onDragLeave}
77
107
  ondrop={onDrop}
78
108
  >
79
- <ImageContent layer={layerSubstitute ?? layer} />
109
+ <ImageLayerContent layer={layerSubstitute ?? layer} />
80
110
  </div>
@@ -1,5 +1,3 @@
1
1
  import Root from './image-layer.svelte';
2
- import ImageLayerThumb from './image-layer-thumb.svelte';
3
- import ImageLayerButtons from './image-layer-buttons.svelte';
4
- import ImageLayerActive from './image-layer-active.svelte';
5
- export { Root, Root as ImageLayer, ImageLayerThumb, ImageLayerButtons, ImageLayerActive };
2
+ import ImageLayerContent from './image-layer-content.svelte';
3
+ export { Root, Root as ImageLayer, ImageLayerContent };
@@ -1,5 +1,3 @@
1
1
  import Root from './image-layer.svelte';
2
- import ImageLayerThumb from './image-layer-thumb.svelte';
3
- import ImageLayerButtons from './image-layer-buttons.svelte';
4
- import ImageLayerActive from './image-layer-active.svelte';
5
- export { Root, Root as ImageLayer, ImageLayerThumb, ImageLayerButtons, ImageLayerActive };
2
+ import ImageLayerContent from './image-layer-content.svelte';
3
+ export { Root, Root as ImageLayer, ImageLayerContent };
@@ -1,32 +1,91 @@
1
+ import type { HtmlLayer, ImageLayer, Layer } from '../types.js';
1
2
  type Origin = 'top-left' | 'top-right' | 'center-left' | 'center-right' | 'bottom-left' | 'bottom-right' | 'left' | 'right' | 'top' | 'bottom';
2
- interface ElementProps {
3
+ export type Point = {
4
+ x: number;
5
+ y: number;
6
+ };
7
+ export type Transform = {
3
8
  x: number;
4
9
  y: number;
5
10
  width: number;
6
11
  height: number;
7
- rotate: number | null;
8
- }
9
- export declare const calculateNewPosition: (origin: Origin, element: ElementProps, newWidth: number, newHeight: number) => {
12
+ rotate: number;
13
+ };
14
+ export declare const rotatePointOld: (point: {
15
+ x: number;
16
+ y: number;
17
+ }, angleRad: number) => {
18
+ x: number;
19
+ y: number;
20
+ };
21
+ export declare const calculateLayerTransform: (layer: Layer) => Transform;
22
+ export declare const calculateNewPosition: (origin: Origin, transform: Transform, newWidth: number, newHeight: number) => {
10
23
  newX: number;
11
24
  newY: number;
12
25
  };
13
- export declare function calculateBoundingBox(element: ElementProps): {
26
+ export declare function calculateBoundingBox(transform: Transform): {
27
+ x: number;
28
+ y: number;
29
+ width: number;
30
+ height: number;
31
+ };
32
+ export declare function degToRad(deg: number): number;
33
+ export declare function rotatePoint(p: Point, origin: Point, angleRad: number): Point;
34
+ export declare function getRotatedCorners(rect: Transform): Point[];
35
+ export declare function calculateBoundingBoxSize(width: number, height: number, rotate: number): {
36
+ width: number;
37
+ height: number;
38
+ };
39
+ export declare function isRotatedVertically(rotate: number): boolean;
40
+ interface ScaleResult {
41
+ width: number;
42
+ height: number;
43
+ scaled: 'width' | 'height';
44
+ }
45
+ export declare function calculateNewSize(width: number, height: number, rotate: number, scale: number, isHorizontal: boolean): ScaleResult;
46
+ export declare function getRotatedBoundingBox(center: Point, width: number, height: number, rotate: number): {
47
+ x: number;
48
+ y: number;
49
+ width: number;
50
+ height: number;
51
+ };
52
+ export declare function calculateGroupRotatedBoundingBox(rects: Transform[], groupRotate?: number): Transform;
53
+ export declare function calculateRelativeRects(bbox: Transform, rects: Transform[]): {
54
+ x: number;
55
+ y: number;
56
+ width: number;
57
+ height: number;
58
+ rotate: number;
59
+ }[];
60
+ export declare const checkPolygonsIntersect: (a: {
61
+ x: number;
62
+ y: number;
63
+ }[], b: {
64
+ x: number;
65
+ y: number;
66
+ }[]) => boolean;
67
+ export declare function calculateGroupBoundingBox(transforms: Transform[]): {
14
68
  x: number;
15
69
  y: number;
16
70
  width: number;
17
71
  height: number;
18
72
  };
19
- export declare function calculateImageFill(image: {
73
+ export declare function calculateImageCover(image: {
20
74
  width: number;
21
75
  height: number;
22
- }, bBox: {
76
+ rotate?: number | null;
77
+ }, bbox: {
23
78
  width: number;
24
79
  height: number;
25
80
  }): {
26
- offsetX: number;
27
- offsetY: number;
28
81
  width: number;
29
82
  height: number;
30
83
  scale: number;
84
+ offsetX: number;
85
+ offsetY: number;
31
86
  };
87
+ export declare const defaultColor = "#000000";
88
+ export declare function extractBorderColors(layers: ImageLayer[]): string[] | undefined;
89
+ export declare function buildBackgroundCircleStyle(colors: string[]): string;
90
+ export declare function applyHtmlToLayer(layer: HtmlLayer, html: HtmlLayer['html']): Promise<Pick<HtmlLayer, 'html' | 'x' | 'y' | 'height'>>;
32
91
  export {};