@peteai/presentation-editor 0.0.1 → 0.0.3

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 (214) hide show
  1. package/README.md +172 -38
  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 +120 -176
  115. package/dist/components/presentation-editor/presentation-editor.svelte.d.ts +1 -4
  116. package/dist/components/presentation-editor/presentation-editor.svelte.js +597 -136
  117. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-color.svelte +58 -0
  118. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-color.svelte.d.ts +10 -0
  119. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte +144 -0
  120. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte.d.ts +7 -0
  121. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar.svelte +404 -0
  122. package/dist/components/presentation-editor/sidebar/color-sidebar/color-sidebar.svelte.d.ts +3 -0
  123. package/dist/components/presentation-editor/sidebar/color-sidebar/index.d.ts +2 -0
  124. package/dist/components/presentation-editor/sidebar/color-sidebar/index.js +2 -0
  125. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar-button.svelte +26 -0
  126. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar-button.svelte.d.ts +8 -0
  127. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar.svelte +216 -0
  128. package/dist/components/presentation-editor/sidebar/font-sidebar/font-sidebar.svelte.d.ts +3 -0
  129. package/dist/components/presentation-editor/sidebar/font-sidebar/index.d.ts +2 -0
  130. package/dist/components/presentation-editor/sidebar/font-sidebar/index.js +2 -0
  131. package/dist/components/presentation-editor/sidebar/position-slidebar.svelte +130 -0
  132. package/dist/components/presentation-editor/sidebar/position-slidebar.svelte.d.ts +18 -0
  133. package/dist/components/presentation-editor/sidebar/sidebar-text-tab-button.svelte +90 -0
  134. package/dist/components/presentation-editor/sidebar/sidebar-text-tab-button.svelte.d.ts +7 -0
  135. package/dist/components/presentation-editor/sidebar/sidebar-text-tab.svelte +82 -0
  136. package/dist/components/presentation-editor/sidebar/sidebar-text-tab.svelte.d.ts +18 -0
  137. package/dist/components/presentation-editor/sidebar/{images-library.svelte → sidebar-uploads-tab.svelte} +0 -1
  138. package/dist/components/presentation-editor/sidebar/sidebar-uploads-tab.svelte.d.ts +3 -0
  139. package/dist/components/presentation-editor/sidebar/sidebar-wrapper.svelte +25 -0
  140. package/dist/components/presentation-editor/sidebar/sidebar-wrapper.svelte.d.ts +7 -0
  141. package/dist/components/presentation-editor/sidebar/sidebar.svelte +71 -15
  142. package/dist/components/presentation-editor/sidebar/sidebar.svelte.d.ts +16 -5
  143. package/dist/components/presentation-editor/sidebar/uploads-image.svelte +28 -11
  144. package/dist/components/presentation-editor/slide-editor.svelte +20 -22
  145. package/dist/components/presentation-editor/slide-inner.svelte +19 -18
  146. package/dist/components/presentation-editor/slides-navigation/slide-preview.svelte +61 -52
  147. package/dist/components/presentation-editor/slides-navigation/slides-navigation.svelte +6 -8
  148. package/dist/components/presentation-editor/snapping-guides.svelte +3 -3
  149. package/dist/components/presentation-editor/types.d.ts +67 -27
  150. package/dist/components/presentation-editor/utils.d.ts +50 -1
  151. package/dist/components/presentation-editor/utils.js +101 -6
  152. package/dist/components/ui/button/button.svelte +3 -2
  153. package/dist/components/ui/button/button.svelte.d.ts +5 -82
  154. package/dist/components/ui/color-picker/color-picker-alpha-grid.svelte +43 -0
  155. package/dist/components/ui/color-picker/color-picker-alpha-grid.svelte.d.ts +8 -0
  156. package/dist/components/ui/color-picker/color-picker.svelte +344 -0
  157. package/dist/components/ui/color-picker/color-picker.svelte.d.ts +13 -0
  158. package/dist/components/ui/color-picker/index.d.ts +3 -0
  159. package/dist/components/ui/color-picker/index.js +5 -0
  160. package/dist/components/ui/context-menu/context-menu-shortcut.svelte +6 -3
  161. package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +1 -1
  162. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  163. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +6 -3
  164. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  165. package/dist/components/ui/infinite-loader/index.d.ts +4 -0
  166. package/dist/components/ui/infinite-loader/index.js +4 -0
  167. package/dist/components/ui/infinite-loader/infinite-loader-loop-tracker.d.ts +13 -0
  168. package/dist/components/ui/infinite-loader/infinite-loader-loop-tracker.js +44 -0
  169. package/dist/components/ui/infinite-loader/infinite-loader-state.svelte.d.ts +15 -0
  170. package/dist/components/ui/infinite-loader/infinite-loader-state.svelte.js +28 -0
  171. package/dist/components/ui/infinite-loader/infinite-loader.svelte +149 -0
  172. package/dist/components/ui/infinite-loader/infinite-loader.svelte.d.ts +17 -0
  173. package/dist/components/ui/input/input.svelte +1 -1
  174. package/dist/components/ui/slider/slider.svelte +20 -18
  175. package/dist/components/ui/tabs/index.d.ts +6 -0
  176. package/dist/components/ui/tabs/index.js +8 -0
  177. package/dist/components/ui/tabs/tabs-content.svelte +19 -0
  178. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +4 -0
  179. package/dist/components/ui/tabs/tabs-list.svelte +19 -0
  180. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +4 -0
  181. package/dist/components/ui/tabs/tabs-trigger.svelte +19 -0
  182. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +4 -0
  183. package/dist/components/ui/toggle/toggle.svelte +3 -2
  184. package/dist/components/ui/toggle/toggle.svelte.d.ts +2 -46
  185. package/dist/index.d.ts +5 -6
  186. package/dist/index.js +1 -4
  187. package/dist/plugin.js +3 -2
  188. package/dist/utils.d.ts +1 -0
  189. package/dist/utils.js +1 -0
  190. package/package.json +28 -25
  191. package/dist/components/presentation-editor/app.css +0 -12
  192. package/dist/components/presentation-editor/layers/hovered-layer.svelte +0 -34
  193. package/dist/components/presentation-editor/layers/hovered-layer.svelte.d.ts +0 -7
  194. package/dist/components/presentation-editor/layers/types/background/background-content.svelte +0 -11
  195. package/dist/components/presentation-editor/layers/types/background/background-content.svelte.d.ts +0 -7
  196. package/dist/components/presentation-editor/layers/types/background/background-layer-thumb.svelte +0 -12
  197. package/dist/components/presentation-editor/layers/types/background/background-layer-thumb.svelte.d.ts +0 -7
  198. package/dist/components/presentation-editor/layers/types/html/html-layer-active.svelte +0 -159
  199. package/dist/components/presentation-editor/layers/types/html/html-layer-active.svelte.d.ts +0 -8
  200. package/dist/components/presentation-editor/layers/types/html/html-layer-buttons.svelte +0 -42
  201. package/dist/components/presentation-editor/layers/types/html/html-layer-buttons.svelte.d.ts +0 -10
  202. package/dist/components/presentation-editor/layers/types/html/html-layer-thumb.svelte +0 -24
  203. package/dist/components/presentation-editor/layers/types/html/html-layer-thumb.svelte.d.ts +0 -8
  204. package/dist/components/presentation-editor/layers/types/image/image-content.svelte.d.ts +0 -8
  205. package/dist/components/presentation-editor/layers/types/image/image-layer-buttons.svelte +0 -21
  206. package/dist/components/presentation-editor/layers/types/image/image-layer-buttons.svelte.d.ts +0 -7
  207. package/dist/components/presentation-editor/layers/types/image/image-layer-thumb.svelte +0 -13
  208. package/dist/components/presentation-editor/layers/types/image/image-layer-thumb.svelte.d.ts +0 -8
  209. package/dist/components/presentation-editor/sidebar/images-library.svelte.d.ts +0 -3
  210. package/dist/components/presentation-editor/sidebar/layers.svelte +0 -94
  211. package/dist/components/presentation-editor/slides-navigation/buttons/slide-delete-button.svelte +0 -32
  212. package/dist/components/presentation-editor/slides-navigation/buttons/slide-delete-button.svelte.d.ts +0 -10
  213. package/dist/components/presentation-editor/slides-navigation/buttons/slide-duplicate-button.svelte +0 -34
  214. package/dist/components/presentation-editor/slides-navigation/buttons/slide-duplicate-button.svelte.d.ts +0 -10
@@ -1,20 +1,76 @@
1
1
  <script lang="ts">
2
- import type { ActiveSidebar } from '../types.js';
3
- import ImagesLibrary from './images-library.svelte';
4
- import Layers from './layers.svelte';
2
+ import type { Icon as LucideIcon } from 'lucide-svelte';
3
+ import TextIcon from 'lucide-svelte/icons/type';
4
+ import UploadIcon from 'lucide-svelte/icons/cloud-upload';
5
+ import Button from '../../ui/button/button.svelte';
6
+ import SidebarTextTab from './sidebar-text-tab.svelte';
7
+ import SidebarUploadsTab from './sidebar-uploads-tab.svelte';
8
+ import { getPresentationEditorContext } from '../presentation-editor.svelte.js';
9
+ import type { ActiveSidebarTab } from '../types.js';
10
+ import PositionSlidebar from './position-slidebar.svelte';
11
+ import { ColorSidebar } from './color-sidebar/index.js';
12
+ import { FontSidebar } from './font-sidebar/index.js';
5
13
 
6
- interface Props {
7
- activeSidebarTab: ActiveSidebar;
8
- }
9
- let { activeSidebarTab }: Props = $props();
14
+ const editor = getPresentationEditorContext();
15
+
16
+ const tabs: { id: ActiveSidebarTab; name: string; icon: typeof LucideIcon }[] = [
17
+ // {
18
+ // name: 'Template',
19
+ // icon: <LayoutIcon />,
20
+ // },
21
+ {
22
+ id: 'text',
23
+ name: 'Text',
24
+ icon: TextIcon,
25
+ },
26
+ // {
27
+ // name: 'Image',
28
+ // icon: <ImageIcon />,
29
+ // },
30
+ // {
31
+ // name: 'Shape',
32
+ // icon: <ElementsIcon />,
33
+ // },
34
+ // {
35
+ // name: 'Frame',
36
+ // icon: <FrameIcon />,
37
+ // },
38
+ {
39
+ id: 'uploads',
40
+ name: 'Uploads',
41
+ icon: UploadIcon,
42
+ },
43
+ ];
10
44
  </script>
11
45
 
12
- {#if activeSidebarTab}
13
- <div class="w-80 shrink-0 border-r border-gray-200 bg-background p-2">
14
- {#if activeSidebarTab === 'layers'}
15
- <Layers />
16
- {:else if activeSidebarTab === 'images'}
17
- <ImagesLibrary />
18
- {/if}
46
+ <div class="flex">
47
+ <div class="flex h-full flex-col gap-1 overflow-y-auto border-r border-gray-200 p-1">
48
+ {#each tabs as tab}
49
+ <Button
50
+ variant="ghost"
51
+ class="flex h-16 w-16 flex-col gap-1 text-xs"
52
+ onclick={() => editor.toggleActiveSidebarTab(tab.id)}
53
+ active={!editor.activeSidebarPopup && editor.activeSidebarTab === tab.id}
54
+ >
55
+ <tab.icon />
56
+ {tab.name}
57
+ </Button>
58
+ {/each}
19
59
  </div>
20
- {/if}
60
+
61
+ {#if editor.activeSidebarPopup || editor.activeSidebarTab}
62
+ <div class="bg-background h-full w-80 shrink-0 overflow-y-auto border-r border-gray-200 p-2">
63
+ {#if editor.activeSidebarPopup === 'position'}
64
+ <PositionSlidebar />
65
+ {:else if editor.activeSidebarPopup === 'font'}
66
+ <FontSidebar />
67
+ {:else if editor.activeSidebarPopup}
68
+ <ColorSidebar />
69
+ {:else if editor.activeSidebarTab === 'text'}
70
+ <SidebarTextTab />
71
+ {:else if editor.activeSidebarTab === 'uploads'}
72
+ <SidebarUploadsTab />
73
+ {/if}
74
+ </div>
75
+ {/if}
76
+ </div>
@@ -1,7 +1,18 @@
1
- import type { ActiveSidebar } from '../types.js';
2
- interface Props {
3
- activeSidebarTab: ActiveSidebar;
1
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
4
13
  }
5
- declare const Sidebar: import("svelte").Component<Props, {}, "">;
6
- type Sidebar = ReturnType<typeof Sidebar>;
14
+ declare const Sidebar: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type Sidebar = InstanceType<typeof Sidebar>;
7
18
  export default Sidebar;
@@ -1,17 +1,25 @@
1
1
  <script lang="ts">
2
2
  import { getPresentationEditorContext } from '../presentation-editor.svelte.js';
3
- import { generateId } from '../../../utils.js';
4
3
 
5
4
  let { image } = $props();
6
5
 
7
6
  const editor = getPresentationEditorContext();
8
7
 
9
- const id = generateId();
8
+ const height = 80;
9
+ const initialScale = height / image.height;
10
+
11
+ let dragging = $state(false);
10
12
 
11
13
  const onDocumentDragEnter = (e: DragEvent) => {
12
14
  console.log('document dragenter', e);
13
15
  if (editor.dragged) {
14
- editor.dragged = { ...editor.dragged, hidden: false, scale: null, sticky: true };
16
+ editor.dragged = {
17
+ ...editor.dragged,
18
+ hidden: false,
19
+ inside: false,
20
+ sticky: true,
21
+ customScale: null,
22
+ };
15
23
  }
16
24
  };
17
25
 
@@ -20,25 +28,28 @@
20
28
  return null;
21
29
  }
22
30
 
23
- console.log('dragstart', e, $state.snapshot(image));
24
31
  e.dataTransfer.effectAllowed = 'move';
25
32
  editor.dragged = {
26
- id,
27
33
  hidden: false,
28
34
  sticky: true,
29
35
  image,
36
+ opacity: 0.5,
37
+ inside: false,
38
+ scale: Math.min(editor.getMaxScale(image), 1),
30
39
  x: e.clientX,
31
40
  y: e.clientY,
32
41
  offsetX: e.offsetX,
33
42
  offsetY: e.offsetY,
34
- initialScale: (e.target as HTMLElement).clientHeight / image.height,
43
+ initialScale,
35
44
  };
36
45
  addEventListener('dragenter', onDocumentDragEnter);
46
+ dragging = true;
37
47
  };
38
48
 
39
49
  const onDragEnd = (e: DragEvent) => {
40
50
  console.log('dragend', e);
41
- removeEventListener('dragend', onDocumentDragEnter);
51
+ removeEventListener('dragenter', onDocumentDragEnter);
52
+ dragging = false;
42
53
  editor.dragged = null;
43
54
  };
44
55
 
@@ -49,16 +60,22 @@
49
60
  editor.dragged = { ...dragged, x: e.clientX, y: e.clientY };
50
61
  }
51
62
  };
63
+
64
+ const createLayer = () => {
65
+ editor.addLayers(editor.activeSlide.id, editor.buildImageLayer({ image }));
66
+ };
52
67
  </script>
53
68
 
54
69
  <!-- svelte-ignore a11y_no_static_element_interactions -->
55
- <div
56
- class="m-1 inline-block h-20"
70
+ <button
71
+ class="m-1 inline-block"
72
+ style:height="{height}px"
73
+ onclick={createLayer}
57
74
  draggable={true}
58
75
  ondragstart={onDragStart}
59
76
  ondragend={onDragEnd}
60
77
  ondrag={onDrag}
61
- style:opacity={editor.dragged?.id === id ? 0 : null}
78
+ style:opacity={dragging ? 0 : null}
62
79
  >
63
80
  <img src={image.src} alt="" crossorigin="anonymous" class="h-full" draggable={false} />
64
- </div>
81
+ </button>
@@ -3,19 +3,17 @@
3
3
  import { cn } from '../../utils.js';
4
4
  import {
5
5
  ActiveLayerBorder,
6
- HoveredLayer,
7
6
  LayerWrapper,
8
7
  BackgroundLayer,
9
8
  HtmlLayer,
10
9
  ImageLayer,
11
- HtmlLayerActive,
12
- ImageLayerActive,
13
10
  ActiveBackgroundBorder,
14
11
  } from './layers/index.js';
15
- import type { ActiveLayerGuide, Layer } from './types.js';
16
- import SnappingGuides from './snapping-guides.svelte';
17
- import SlideInner from './slide-inner.svelte';
12
+ import type { ActiveLayerGuide } from './types.js';
18
13
  import { getPresentationEditorContext } from './presentation-editor.svelte.js';
14
+ import SlideInner from './slide-inner.svelte';
15
+ import ActiveLayers from './active-layers.svelte';
16
+ import SnappingGuides from './snapping-guides.svelte';
19
17
 
20
18
  interface Props {
21
19
  viewportRef: HTMLDivElement | null;
@@ -28,7 +26,7 @@
28
26
 
29
27
  let activeLayerGuides: ActiveLayerGuide[] = $state([]);
30
28
 
31
- let hoveredLayer: Layer | 'background' | null = $state(null);
29
+ let hoveredLayerId: string | null = $state(null);
32
30
 
33
31
  let scaledWidth = $derived(editor.width * editor.zoom);
34
32
  let scaledHeight = $derived(editor.height * editor.zoom);
@@ -36,7 +34,7 @@
36
34
 
37
35
  <div class="relative min-h-0 flex-1">
38
36
  <ScrollArea orientation="both" class="h-full" bind:viewportRef>
39
- <div class="pointer-events-none flex min-h-full flex-1">
37
+ <div class="flex min-h-full flex-1">
40
38
  <div class="box-border flex w-full shrink-0 items-center justify-center p-0">
41
39
  <div bind:this={wrapperRef} class="translate-x-0 translate-y-0 p-4 transition-transform">
42
40
  <div class="relative flex flex-col items-center" data-slide-container>
@@ -56,12 +54,12 @@
56
54
  style:width="{editor.width}px"
57
55
  style:height="{editor.height}px"
58
56
  >
59
- <BackgroundLayer bind:hoveredLayer />
57
+ <BackgroundLayer bind:hoveredLayerId />
60
58
  <SlideInner />
61
59
  {#each editor.activeSlide.layers as layer, i (layer.id)}
62
60
  <LayerWrapper
63
61
  bind:layer={editor.activeSlide.layers[i]}
64
- bind:hoveredLayer
62
+ bind:hoveredLayerId
65
63
  bind:activeLayerGuides
66
64
  >
67
65
  {#if editor.activeSlide.layers[i].type === 'html'}
@@ -75,23 +73,23 @@
75
73
  </div>
76
74
  </div>
77
75
  <div
78
- class="absolute z-10 m-0"
76
+ class="pointer-events-none absolute z-10 m-0"
79
77
  style:width="{scaledWidth}px"
80
78
  style:height="{scaledHeight}px"
81
79
  >
82
- {#if hoveredLayer && (hoveredLayer === 'background' || hoveredLayer.id !== editor.activeLayer?.id)}
83
- <HoveredLayer layer={hoveredLayer} />
84
- {/if}
85
- {#if editor.activeBackground}
86
- <ActiveBackgroundBorder />
87
- {:else if editor.activeLayer}
88
- <ActiveLayerBorder layer={editor.activeLayer} />
89
- {#if editor.activeLayer.type === 'html'}
90
- <HtmlLayerActive bind:layer={editor.activeLayer} />
91
- {:else if editor.activeLayer.type === 'image'}
92
- <ImageLayerActive bind:layer={editor.activeLayer} />
80
+ {#if hoveredLayerId === 'background'}
81
+ {#if !editor.activeBackground}
82
+ <ActiveBackgroundBorder />
83
+ {/if}
84
+ {:else if hoveredLayerId && !editor.activeLayerIds.has(hoveredLayerId)}
85
+ {@const layer = editor.activeSlide.layers.find(({ id }) => id === hoveredLayerId)}
86
+ {#if layer}
87
+ <ActiveLayerBorder {layer} />
93
88
  {/if}
94
89
  {/if}
90
+
91
+ <ActiveLayers />
92
+
95
93
  <SnappingGuides zoom={editor.zoom} guides={activeLayerGuides} />
96
94
  </div>
97
95
  </div>
@@ -8,44 +8,45 @@
8
8
 
9
9
  const onDragEnter = (e: DragEvent) => {
10
10
  console.log('dragenter slide inner', e);
11
- e.preventDefault();
12
- e.stopPropagation();
13
11
 
14
12
  if (editor.dragged) {
15
- editor.dragged = { ...editor.dragged, hidden: false, scale: editor.zoom, sticky: true };
13
+ e.preventDefault();
14
+ e.stopPropagation();
15
+ editor.dragged = {
16
+ ...editor.dragged,
17
+ hidden: false,
18
+ customScale: null,
19
+ inside: true,
20
+ sticky: true,
21
+ };
16
22
  }
17
23
  };
18
24
 
19
25
  const onDragOver = (e: DragEvent) => {
20
26
  // console.log('dragover slide inner', e);
21
- e.preventDefault();
27
+ if (editor.dragged) {
28
+ e.preventDefault();
29
+ e.stopPropagation();
30
+ }
22
31
  };
23
32
 
24
33
  const onDrop = (e: DragEvent) => {
25
34
  console.log('drop slide inner', e);
26
- e.preventDefault();
27
35
 
28
36
  const { dragged } = editor;
29
37
  if (dragged) {
30
- editor.addImageLayer({
31
- x: e.offsetX - dragged.offsetX / editor.zoom + inset,
32
- y: e.offsetY - dragged.offsetY / editor.zoom + inset,
33
- width: dragged.image.width,
34
- height: dragged.image.height,
35
- image: {
36
- id: dragged.image.id,
37
- src: dragged.image.src,
38
- width: dragged.image.width,
39
- height: dragged.image.height,
40
- },
41
- });
38
+ e.preventDefault();
39
+ e.stopPropagation();
40
+ const x = e.offsetX - dragged.offsetX / editor.zoom + inset;
41
+ const y = e.offsetY - dragged.offsetY / editor.zoom + inset;
42
+ editor.dropDragged(x, y);
42
43
  }
43
44
  };
44
45
  </script>
45
46
 
46
47
  <!-- svelte-ignore a11y_no_static_element_interactions -->
47
48
  <div
48
- class={cn('absolute', { 'pointer-events-auto': !!editor.dragged })}
49
+ class={cn('absolute', { 'pointer-events-none': !editor.dragged })}
49
50
  style:inset="{inset}px"
50
51
  ondragenter={onDragEnter}
51
52
  ondragover={onDragOver}
@@ -2,20 +2,20 @@
2
2
  import { dragHandle } from 'svelte-dnd-action';
3
3
  import PlusIcon from 'lucide-svelte/icons/plus';
4
4
  import EllipsisIcon from 'lucide-svelte/icons/ellipsis';
5
+ import IconLocked from 'lucide-svelte/icons/lock-keyhole';
5
6
  import { Button, buttonVariants } from '../../ui/button/index.js';
6
7
  import * as ContextMenu from '../../ui/context-menu/index.js';
7
8
  import * as DropdownMenu from '../../ui/dropdown-menu/index.js';
8
9
  import {
9
- BackgroundLayerThumb,
10
- HtmlLayerThumb,
11
- ImageLayerThumb,
10
+ BackgroundLayerContent,
11
+ HtmlLayerContent,
12
+ ImageLayerContent,
12
13
  LayerThumbWrapper,
13
14
  } from '../layers/index.js';
14
15
  import { cn } from '../../../utils.js';
15
- import SlideDeleteButton from './buttons/slide-delete-button.svelte';
16
- import SlideDuplicateButton from './buttons/slide-duplicate-button.svelte';
17
16
  import type { PresentationEditor } from '../presentation-editor.svelte.js';
18
17
  import type { Slide } from '../types.js';
18
+ import SlidePreviewMenuContent from '../menu/slide-menu-content.svelte';
19
19
 
20
20
  interface Props {
21
21
  editor: PresentationEditor;
@@ -29,7 +29,7 @@
29
29
  let menuOpen = $state(false);
30
30
  </script>
31
31
 
32
- <div class="flex items-center">
32
+ <div class="relative flex items-center">
33
33
  <div class="group h-full">
34
34
  <div class="absolute -left-2 top-0 z-20 h-full w-4 group-hover:w-16"></div>
35
35
  <div
@@ -50,62 +50,72 @@
50
50
  </div>
51
51
  </div>
52
52
  </div>
53
- <div use:dragHandle class="group relative mx-2 my-1 transition-transform" role="none">
54
- <button class="block" onclick={() => editor.setActiveSlide(slide.id)}>
55
- <ContextMenu.Root>
56
- <ContextMenu.Trigger>
57
- <div
58
- class={cn(
59
- 'relative',
60
- {
61
- 'after:absolute after:inset-0 after:rounded-xl after:border-2':
62
- editor.activeSlide === slide,
63
- },
64
- editor.slideSelected ? 'after:border-purple-500' : 'after:border-gray-400',
65
- )}
66
- >
53
+ <div class="group relative mx-2 my-1 transition-transform">
54
+ <div use:dragHandle role="none">
55
+ <button class="block" onclick={() => editor.setActiveSlide(slide.id)}>
56
+ <ContextMenu.Root>
57
+ <ContextMenu.Trigger>
67
58
  <div
68
- class="relative overflow-hidden rounded-lg bg-white"
69
- style:clip-path={editor.activeSlide === slide
70
- ? 'inset(5px round 8px)'
71
- : 'inset(0px round 10px)'}
72
- style:width="{editor.width * thumbScale}px"
73
- style:height="{editor.height * thumbScale}px"
59
+ class={cn(
60
+ 'relative',
61
+ {
62
+ 'after:absolute after:inset-0 after:rounded-xl after:border-2':
63
+ editor.activeSlide.id === slide.id,
64
+ },
65
+ editor.slideSelected ? 'after:border-primary' : 'after:border-gray-400',
66
+ )}
74
67
  >
75
- <BackgroundLayerThumb {slide} />
76
- {#each slide.layers as layer (layer.id)}
77
- <LayerThumbWrapper {layer} thumb={thumbScale}>
78
- {#snippet children({ thumbScale })}
79
- {#if layer.type === 'html'}
80
- <HtmlLayerThumb {layer} {thumbScale} />
81
- {:else if layer.type === 'image'}
82
- <ImageLayerThumb {layer} {thumbScale} />
83
- {/if}
84
- {/snippet}
85
- </LayerThumbWrapper>
86
- {/each}
68
+ <div
69
+ class="relative overflow-hidden rounded-lg bg-white"
70
+ style:clip-path={editor.activeSlide.id === slide.id
71
+ ? 'inset(5px round 8px)'
72
+ : 'inset(0px round 10px)'}
73
+ style:width="{editor.width * thumbScale}px"
74
+ style:height="{editor.height * thumbScale}px"
75
+ >
76
+ <div class="absolute inset-0 overflow-hidden">
77
+ <div class="h-full w-full">
78
+ <BackgroundLayerContent {slide} {thumbScale} />
79
+ </div>
80
+ </div>
81
+ {#each slide.layers as layer (layer.id)}
82
+ <LayerThumbWrapper {layer} thumb={thumbScale}>
83
+ {#snippet children({ thumbScale })}
84
+ {#if layer.type === 'html'}
85
+ <HtmlLayerContent {layer} {thumbScale} />
86
+ {:else if layer.type === 'image'}
87
+ <ImageLayerContent {layer} {thumbScale} />
88
+ {/if}
89
+ {/snippet}
90
+ </LayerThumbWrapper>
91
+ {/each}
92
+ </div>
87
93
  </div>
88
- </div>
89
- </ContextMenu.Trigger>
90
- <ContextMenu.Content class="w-72">
91
- <SlideDuplicateButton {editor} {slide} />
92
- <SlideDeleteButton {editor} {slide} context={true} />
93
- </ContextMenu.Content>
94
- </ContextMenu.Root>
95
- </button>
94
+ </ContextMenu.Trigger>
95
+ <ContextMenu.Content class="w-72">
96
+ <SlidePreviewMenuContent {editor} {slide} />
97
+ </ContextMenu.Content>
98
+ </ContextMenu.Root>
99
+ </button>
100
+ </div>
96
101
  <div
97
102
  class={cn(
98
103
  'pointer-events-none absolute z-10 flex flex-col-reverse flex-wrap overflow-hidden',
99
104
  )}
100
- style:inset={editor.activeSlide === slide ? '5px' : '0'}
101
- style:border-radius={editor.activeSlide === slide ? '8px' : '10px'}
105
+ style:inset={editor.activeSlide.id === slide.id ? '5px' : '0'}
106
+ style:border-radius={editor.activeSlide.id === slide.id ? '8px' : '10px'}
102
107
  >
103
108
  <div
104
- class="flex h-8 min-h-5 w-8 max-w-full items-end overflow-hidden rounded-bl-md rounded-br-md"
109
+ class="flex h-8 min-h-5 w-fit max-w-full items-end overflow-hidden rounded-bl-md rounded-br-md"
105
110
  style:background={`radial-gradient(100% 120% at 0% 120%, rgba(255, 255, 255, 0.8) 55%, rgba(0, 0, 0, 0))`}
106
111
  >
107
112
  <div class="relative flex h-5 items-center px-2">
113
+ {#if slide.locked}
114
+ <IconLocked class="mr-1 size-4" />
115
+ {/if}
108
116
  <p class="text-xs font-semibold">{index + 1}</p>
117
+ <p class="mx-0.5"></p>
118
+ <div class="pointer-events-auto flex h-full min-w-2"></div>
109
119
  </div>
110
120
  </div>
111
121
  </div>
@@ -124,9 +134,8 @@
124
134
  <EllipsisIcon />
125
135
  </DropdownMenu.Trigger>
126
136
 
127
- <DropdownMenu.Content side="top" align="start" class="w-72">
128
- <SlideDuplicateButton {editor} {slide} />
129
- <SlideDeleteButton {editor} {slide} />
137
+ <DropdownMenu.Content class="w-72" side="top" align="start" trapFocus={false}>
138
+ <SlidePreviewMenuContent {editor} {slide} />
130
139
  </DropdownMenu.Content>
131
140
  </DropdownMenu.Root>
132
141
  </div>
@@ -50,14 +50,12 @@
50
50
  }
51
51
 
52
52
  if (redo) {
53
- editor.historyPush(
54
- {
55
- type: 'slide',
56
- undo: { sortOrder: item.sortOrder },
57
- redo,
58
- },
59
- item.id,
60
- );
53
+ editor.historyPush({
54
+ type: 'slide',
55
+ slideId: item.id,
56
+ undo: { sortOrder: item.sortOrder },
57
+ redo,
58
+ });
61
59
  }
62
60
  }
63
61
  </script>
@@ -13,11 +13,11 @@
13
13
  <div class="absolute h-full w-full">
14
14
  {#each guides as guide (guide.id)}
15
15
  {#if guide.type === 'box'}
16
- <div class="absolute border border-purple-500" style:inset="{guide.inset * zoom}px"></div>
16
+ <div class="border-primary absolute border" style:inset="{guide.inset * zoom}px"></div>
17
17
  {:else if guide.type === 'vertical'}
18
18
  <div
19
19
  class={cn(
20
- 'absolute h-full border-l border-purple-500',
20
+ 'border-primary absolute h-full border-l',
21
21
  guide.style === 'dashed' && 'border-dashed',
22
22
  guide.style === 'dotted' && 'border-dotted',
23
23
  )}
@@ -28,7 +28,7 @@
28
28
  {:else if guide.type === 'horizontal'}
29
29
  <div
30
30
  class={cn(
31
- 'absolute w-full border-t border-purple-500',
31
+ 'border-primary absolute w-full border-t',
32
32
  guide.style === 'dashed' && 'border-dashed',
33
33
  guide.style === 'dotted' && 'border-dotted',
34
34
  )}