@peteai/presentation-editor 0.0.2 → 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 (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,16 +1,11 @@
1
1
  <script lang="ts">
2
2
  import UndoIcon from 'lucide-svelte/icons/undo-2';
3
3
  import RedoIcon from 'lucide-svelte/icons/redo-2';
4
+ import { Separator } from '../ui/separator/index.js';
4
5
  import { Button } from '../ui/button/index.js';
5
- import type { ActiveSidebar } from './types.js';
6
6
  import { getPresentationEditorContext } from './presentation-editor.svelte.js';
7
- import { BackgroundLayerButtons, HtmlLayerButtons, ImageLayerButtons } from './layers/index.js';
8
-
9
- interface Props {
10
- activeSidebarTab: ActiveSidebar;
11
- onChange: (tab: ActiveSidebar) => void;
12
- }
13
- let { activeSidebarTab, onChange }: Props = $props();
7
+ import { BackgroundLayerButtons } from './layers/index.js';
8
+ import ActiveLayersButtons from './active-layers-buttons.svelte';
14
9
 
15
10
  const editor = getPresentationEditorContext();
16
11
  </script>
@@ -18,22 +13,6 @@
18
13
  <div class="bg-background h-12 w-full border-b border-gray-200 px-2">
19
14
  <div class="flex h-full items-center justify-between">
20
15
  <div class="grid grid-flow-col items-center gap-2">
21
- <Button
22
- variant="ghost"
23
- size="xs"
24
- active={activeSidebarTab === 'layers'}
25
- onclick={() => onChange('layers')}
26
- >
27
- Layers
28
- </Button>
29
- <Button
30
- variant="ghost"
31
- size="xs"
32
- active={activeSidebarTab === 'images'}
33
- onclick={() => onChange('images')}
34
- >
35
- Images
36
- </Button>
37
16
  <Button
38
17
  variant="ghost"
39
18
  size="icon-xs"
@@ -50,17 +29,26 @@
50
29
  >
51
30
  <RedoIcon class="h-6 w-6" />
52
31
  </Button>
53
- {#if editor.activeBackground}
54
- <BackgroundLayerButtons />
55
- {:else if editor.activeLayer}
56
- {#if editor.activeLayer.type === 'html'}
57
- {#if editor.htmlEditor}
58
- <HtmlLayerButtons bind:layer={editor.activeLayer} htmlEditor={editor.htmlEditor} />
32
+ <div class="grid grid-flow-col items-center gap-2 overflow-x-auto">
33
+ {#if !editor.activeSlide.locked}
34
+ {#if editor.activeBackground}
35
+ {#if !editor.activeSlide.backgroundLocked}
36
+ <BackgroundLayerButtons />
37
+ {/if}
38
+ {:else if editor.activeLayers.length}
39
+ <ActiveLayersButtons />
59
40
  {/if}
60
- {:else if editor.activeLayer.type === 'image'}
61
- <ImageLayerButtons bind:layer={editor.activeLayer} />
62
41
  {/if}
63
- {/if}
42
+ </div>
43
+ <Separator orientation="vertical" />
44
+ <Button
45
+ variant="ghost"
46
+ size="xs"
47
+ active={editor.activeSidebarPopup === 'position'}
48
+ onclick={() => editor.toggleActiveSidebarPopup('position')}
49
+ >
50
+ Position
51
+ </Button>
64
52
  </div>
65
53
  </div>
66
54
  </div>
@@ -1,8 +1,18 @@
1
- import type { ActiveSidebar } from './types.js';
2
- interface Props {
3
- activeSidebarTab: ActiveSidebar;
4
- onChange: (tab: ActiveSidebar) => void;
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;
5
13
  }
6
- declare const Header: import("svelte").Component<Props, {}, "">;
7
- type Header = ReturnType<typeof Header>;
14
+ declare const Header: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type Header = InstanceType<typeof Header>;
8
18
  export default Header;
@@ -0,0 +1,85 @@
1
+ <script lang="ts">
2
+ import { getPresentationEditorContext } from './presentation-editor.svelte.js';
3
+
4
+ const editor = getPresentationEditorContext();
5
+
6
+ const onKeyDown = (e: KeyboardEvent) => {
7
+ console.log('keydown hotkey', e);
8
+
9
+ if (
10
+ e.target &&
11
+ (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement)
12
+ )
13
+ return;
14
+
15
+ if (e.code === 'Escape') {
16
+ if (editor.activeAction) {
17
+ editor.activeAction = null;
18
+ } else {
19
+ editor.setActiveBackground(!!editor.activeLayers.length);
20
+ }
21
+ } else if (!editor.activeAction) {
22
+ if (e.code === 'Enter' && (e.metaKey || e.ctrlKey)) {
23
+ editor.addSlide();
24
+ e.preventDefault();
25
+ } else if (['Delete', 'Backspace'].includes(e.code)) {
26
+ if (editor.activeLayers.length) {
27
+ editor.removeLayers(
28
+ editor.activeSlide.id,
29
+ editor.activeLayers.map(({ id }) => id),
30
+ );
31
+ } else if (editor.activeBackground) {
32
+ editor.removeBackground(editor.activeSlide.id);
33
+ } else if (editor.slideSelected) {
34
+ editor.removeSlide(editor.activeSlide.id);
35
+ }
36
+ } else if (e.code === 'KeyZ') {
37
+ if (e.metaKey || e.ctrlKey) {
38
+ if (e.shiftKey) {
39
+ editor.historyRedo();
40
+ } else {
41
+ editor.historyUndo();
42
+ }
43
+ }
44
+ } else if (e.code === 'KeyY' && (e.metaKey || e.ctrlKey)) {
45
+ editor.historyRedo();
46
+ } else if (e.code === 'KeyD' && (e.metaKey || e.ctrlKey)) {
47
+ if (editor.slideSelected) {
48
+ editor.duplicateSlide(editor.activeSlide);
49
+ e.preventDefault();
50
+ }
51
+ } else if (e.code === 'KeyC' && (e.metaKey || e.ctrlKey)) {
52
+ if (editor.activeLayers.length) {
53
+ editor.copyLayers(
54
+ editor.activeSlide.id,
55
+ editor.activeLayers.map(({ id }) => id),
56
+ );
57
+ } else if (editor.slideSelected) {
58
+ editor.copySlide(editor.activeSlide.id);
59
+ }
60
+ } else if (e.code === 'KeyV' && (e.metaKey || e.ctrlKey)) {
61
+ editor.clipboardPaste();
62
+ } else if (e.code === 'BracketLeft' && (e.metaKey || e.ctrlKey)) {
63
+ if (editor.activeLayers.length) {
64
+ editor.moveLayers(
65
+ editor.activeSlide.id,
66
+ editor.activeLayers.map(({ id }) => id),
67
+ e.altKey ? 'back' : 'backward',
68
+ );
69
+ e.preventDefault();
70
+ }
71
+ } else if (e.code === 'BracketRight' && (e.metaKey || e.ctrlKey)) {
72
+ if (editor.activeLayers.length) {
73
+ editor.moveLayers(
74
+ editor.activeSlide.id,
75
+ editor.activeLayers.map(({ id }) => id),
76
+ e.altKey ? 'front' : 'forward',
77
+ );
78
+ e.preventDefault();
79
+ }
80
+ }
81
+ }
82
+ };
83
+ </script>
84
+
85
+ <svelte:window onkeydown={onKeyDown} />
@@ -11,8 +11,8 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
11
11
  };
12
12
  z_$$bindings?: Bindings;
13
13
  }
14
- declare const Layers: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
14
+ declare const Hotkeys: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
15
  [evt: string]: CustomEvent<any>;
16
16
  }, {}, {}, string>;
17
- type Layers = InstanceType<typeof Layers>;
18
- export default Layers;
17
+ type Hotkeys = InstanceType<typeof Hotkeys>;
18
+ export default Hotkeys;
@@ -5,12 +5,8 @@
5
5
  </script>
6
6
 
7
7
  <div
8
- class="pointer-events-none absolute left-0 top-0 h-full w-full"
8
+ class="pointer-events-none absolute left-0 top-0 -m-px box-content p-px"
9
9
  style:width={`${editor.width * editor.zoom}px`}
10
10
  style:height={`${editor.height * editor.zoom}px`}
11
- >
12
- <div
13
- class="absolute -inset-px border-2 border-purple-500"
14
- style:box-shadow="0 0 0 1px hsla(0, 0%, 100%, .07), inset 0 0 0 1px hsla(0, 0%, 100%, .07)"
15
- ></div>
16
- </div>
11
+ style:box-shadow="0 0 0 1px hsl(var(--background)), 0 0 0 3px hsl(var(--primary))"
12
+ ></div>
@@ -4,10 +4,9 @@
4
4
 
5
5
  interface Props {
6
6
  layer: Layer;
7
- children?: import('svelte').Snippet;
8
7
  }
9
8
 
10
- let { layer, children }: Props = $props();
9
+ let { layer }: Props = $props();
11
10
 
12
11
  const editor = getPresentationEditorContext();
13
12
 
@@ -22,9 +21,7 @@
22
21
  style:transform={`translate(${layer.x * editor.zoom}px, ${layer.y * editor.zoom}px) rotate(${rotate}deg)`}
23
22
  >
24
23
  <div
25
- class="absolute -inset-px border-2 border-purple-500"
24
+ class="border-primary absolute -inset-px border-2"
26
25
  style:box-shadow="0 0 0 1px hsla(0, 0%, 100%, .07), inset 0 0 0 1px hsla(0, 0%, 100%, .07)"
27
26
  ></div>
28
27
  </div>
29
-
30
- {@render children?.()}
@@ -1,7 +1,6 @@
1
1
  import type { Layer } from '../types.js';
2
2
  interface Props {
3
3
  layer: Layer;
4
- children?: import('svelte').Snippet;
5
4
  }
6
5
  declare const ActiveLayerBorder: import("svelte").Component<Props, {}, "">;
7
6
  type ActiveLayerBorder = ReturnType<typeof ActiveLayerBorder>;
@@ -4,49 +4,80 @@
4
4
  import BorderSolidIcon from 'svelte-radix/BorderSolid.svelte';
5
5
  import BorderDashedIcon from 'svelte-radix/BorderDashed.svelte';
6
6
  import BorderDottedIcon from 'svelte-radix/BorderDotted.svelte';
7
- import PaletteIcon from 'lucide-svelte/icons/palette';
8
7
  import type {
9
8
  ImageLayer,
10
9
  LayerBorder,
11
- LayerChangesAction,
10
+ HistoryAction,
12
11
  } from '../../../types.js';
13
12
  import { getPresentationEditorContext } from '../../../presentation-editor.svelte.js';
14
13
  import * as Popover from '../../../../ui/popover/index.js';
15
14
  import { Button } from '../../../../ui/button/index.js';
16
15
  import { Slider } from '../../../../ui/slider/index.js';
17
- import { cn, createDebouncedCallback } from '../../../../../utils.js';
16
+ import { Input } from '../../../../ui/input/index.js';
17
+ import { createDebouncedCallback } from '../../../../../utils.js';
18
+ import { buildBackgroundCircleStyle, extractBorderColors } from '../../utils.js';
18
19
 
19
20
  interface Props {
20
- layer: ImageLayer;
21
+ layers: ImageLayer[];
21
22
  }
22
23
 
23
- let { layer = $bindable() }: Props = $props();
24
+ let { layers = $bindable() }: Props = $props();
24
25
 
25
26
  const editor = getPresentationEditorContext();
26
27
 
27
- let selectedColor = $state(layer.borderColor || '#000000');
28
+ const getLayerBorderWidth = (layer: ImageLayer) =>
29
+ layer.borderStyle ? layer.borderWidth || 0 : 0;
30
+
31
+ const borderWidth = $derived.by(() => {
32
+ if (!layers.length) return;
33
+
34
+ const firstLayerBorderWidth = getLayerBorderWidth(layers[0]);
35
+ const allSame = layers.every((layer) => getLayerBorderWidth(layer) === firstLayerBorderWidth);
36
+
37
+ return allSame ? firstLayerBorderWidth : undefined;
38
+ });
39
+
40
+ const borderStyle = $derived.by(() => {
41
+ if (!layers.length) return;
42
+
43
+ const firstLayerBorderWidth = layers[0].borderStyle;
44
+ const allSame = layers.every((layer) => layer.borderStyle === firstLayerBorderWidth);
45
+
46
+ return allSame ? firstLayerBorderWidth : undefined;
47
+ });
48
+
49
+ const borderColors = $derived(extractBorderColors(layers));
28
50
 
29
51
  const setStyle = (value: LayerBorder['borderStyle']) => {
30
- if (value === layer.borderStyle) return;
52
+ if (value === borderStyle) return;
31
53
 
32
- const undo = {
33
- borderStyle: layer.borderStyle,
34
- borderWidth: layer.borderWidth,
35
- borderColor: layer.borderColor,
36
- };
37
- const redo = {
38
- borderStyle: value,
39
- borderWidth: layer.borderWidth ?? 10,
40
- borderColor: selectedColor,
41
- };
42
- Object.assign(layer, redo);
43
- editor.historyPush({ type: 'layer', layer: { id: layer.id, type: layer.type }, undo, redo });
54
+ editor.historyPush({
55
+ type: 'layersGroup',
56
+ actions: layers.map((layer) => {
57
+ const undo = {
58
+ borderStyle: layer.borderStyle,
59
+ borderWidth: layer.borderWidth,
60
+ };
61
+ const redo = {
62
+ borderStyle: value,
63
+ borderWidth: layer.borderWidth ?? 10,
64
+ };
65
+ Object.assign(layer, redo);
66
+ return {
67
+ type: 'layer',
68
+ slideId: editor.activeSlide.id,
69
+ layer: { id: layer.id, type: layer.type },
70
+ undo,
71
+ redo,
72
+ };
73
+ }),
74
+ });
44
75
  };
45
76
 
46
- let undo: LayerBorder | null = null;
47
- const debouncedHistoryPush = createDebouncedCallback((action: LayerChangesAction) => {
77
+ let initial: (ImageLayer & { state: ImageLayer })[] | null = null;
78
+ const debouncedHistoryPush = createDebouncedCallback((action: HistoryAction) => {
48
79
  editor.historyPush(action);
49
- undo = null;
80
+ initial = null;
50
81
  }, 500);
51
82
 
52
83
  let min = 0;
@@ -58,79 +89,36 @@
58
89
  } else if (borderWidth < min) {
59
90
  borderWidth = min;
60
91
  }
61
- if (!undo) {
62
- undo = {
63
- borderStyle: layer.borderStyle,
64
- borderWidth: layer.borderWidth,
65
- borderColor: layer.borderColor,
66
- };
92
+ if (!initial) {
93
+ initial = layers.map((layer) => ({ ...layer, state: layer }));
67
94
  }
68
- const redo = {
69
- borderStyle: layer.borderStyle ?? 'solid',
70
- borderWidth: borderWidth,
71
- borderColor: selectedColor,
72
- };
73
- Object.assign(layer, redo);
74
- const action: LayerChangesAction = {
75
- type: 'layer',
76
- layer: { id: layer.id, type: layer.type },
77
- undo,
78
- redo,
95
+ const action: HistoryAction = {
96
+ type: 'layersGroup',
97
+ actions: initial.map((layerWithState) => {
98
+ const { state, ...layer } = layerWithState;
99
+ const undo = {
100
+ borderStyle: layer.borderStyle,
101
+ borderWidth: layer.borderWidth,
102
+ };
103
+ const redo = {
104
+ borderStyle: layer.borderStyle ?? 'solid',
105
+ borderWidth: borderWidth,
106
+ };
107
+ Object.assign(state, redo);
108
+ return {
109
+ type: 'layer',
110
+ slideId: editor.activeSlide.id,
111
+ layer: { id: layer.id, type: layer.type },
112
+ undo,
113
+ redo,
114
+ };
115
+ }),
79
116
  };
80
117
  if (debounce) {
81
118
  debouncedHistoryPush(action);
82
119
  } else {
83
120
  editor.historyPush(action);
84
- undo = null;
85
- }
86
- };
87
-
88
- const colors = [
89
- { value: '#000000', name: 'Black' },
90
- { value: '#545454', name: 'Dark Gray' },
91
- { value: '#737373', name: 'Gray' },
92
- { value: '#a6a6a6', name: 'Gray' },
93
- { value: '#d9d9d9', name: 'Light Gray' },
94
- { value: '#ffffff', name: 'White' },
95
-
96
- { value: '#ff3131', name: 'Bright Red' },
97
- { value: '#ff5757', name: 'Coral Red' },
98
- { value: '#ff66c4', name: 'Pink' },
99
- { value: '#cb6ce6', name: 'Magenta' },
100
- { value: '#8c52ff', name: 'Purple' },
101
- { value: '#5e17eb', name: 'Violet' },
102
-
103
- { value: '#0097b2', name: 'Dark Turquoise' },
104
- { value: '#0cc0df', name: 'Aqua Blue' },
105
- { value: '#5ce1e6', name: 'Turquoise Blue' },
106
- { value: '#38b6ff', name: 'Light Blue' },
107
- { value: '#5271ff', name: 'Royal Blue' },
108
- { value: '#004aad', name: 'Cobalt Blue' },
109
-
110
- { value: '#00bf63', name: 'Green' },
111
- { value: '#7ed957', name: 'Grass Green' },
112
- { value: '#c1ff72', name: 'Lime' },
113
- { value: '#ffde59', name: 'Yellow' },
114
- { value: '#ffbd59', name: 'Peach' },
115
- { value: '#ff914d', name: 'Orange' },
116
- ];
117
-
118
- const setColor = (value: string) => () => {
119
- if (value === selectedColor) return;
120
- selectedColor = value;
121
- if (layer.borderWidth) {
122
- const undo = {
123
- borderStyle: layer.borderStyle,
124
- borderWidth: layer.borderWidth,
125
- borderColor: layer.borderColor,
126
- };
127
- const redo = {
128
- borderStyle: layer.borderStyle,
129
- borderWidth: layer.borderWidth,
130
- borderColor: selectedColor,
131
- };
132
- Object.assign(layer, redo);
133
- editor.historyPush({ type: 'layer', layer: { id: layer.id, type: layer.type }, undo, redo });
121
+ initial = null;
134
122
  }
135
123
  };
136
124
  </script>
@@ -150,7 +138,7 @@
150
138
  <Button
151
139
  variant="outline"
152
140
  class="w-12 p-2"
153
- active={!layer.borderWidth}
141
+ active={borderStyle === null}
154
142
  onclick={() => setStyle(null)}
155
143
  >
156
144
  <BorderNoneIcon class="h-6 w-6" />
@@ -158,7 +146,7 @@
158
146
  <Button
159
147
  variant="outline"
160
148
  class="w-12 p-2"
161
- active={layer.borderStyle === 'solid'}
149
+ active={borderStyle === 'solid'}
162
150
  onclick={() => setStyle('solid')}
163
151
  >
164
152
  <BorderSolidIcon class="h-6 w-6" />
@@ -166,7 +154,7 @@
166
154
  <Button
167
155
  variant="outline"
168
156
  class="w-12 p-2"
169
- active={layer.borderStyle === 'dashed'}
157
+ active={borderStyle === 'dashed'}
170
158
  onclick={() => setStyle('dashed')}
171
159
  >
172
160
  <BorderDashedIcon class="h-6 w-6" />
@@ -174,7 +162,7 @@
174
162
  <Button
175
163
  variant="outline"
176
164
  class="w-12 p-2"
177
- active={layer.borderStyle === 'dotted'}
165
+ active={borderStyle === 'dotted'}
178
166
  onclick={() => setStyle('dotted')}
179
167
  >
180
168
  <BorderDottedIcon class="h-6 w-6" />
@@ -183,49 +171,45 @@
183
171
  </div>
184
172
  <div class="flex flex-col">
185
173
  <div class="text-sm font-medium text-gray-500">Border width</div>
186
- <div class="flex gap-4">
187
- <Slider
188
- type="single"
189
- value={layer.borderWidth || 0}
190
- {min}
191
- {max}
192
- step={1}
193
- onValueChange={(value) => setWidth(value, true)}
194
- />
195
- <input
196
- class="border-input m-0 h-10 w-10 rounded-md bg-transparent p-0 pb-1 text-center text-sm font-semibold leading-none focus:ring-0 [&::-webkit-inner-spin-button]:appearance-none"
174
+ <div class="flex items-center gap-2">
175
+ <div class="grow">
176
+ <Slider
177
+ type="single"
178
+ value={borderWidth || 0}
179
+ {min}
180
+ {max}
181
+ step={1}
182
+ onValueChange={(value) => setWidth(value, true)}
183
+ />
184
+ </div>
185
+ <Input
186
+ class="w-10 bg-transparent p-0 text-center font-semibold leading-none [&::-webkit-inner-spin-button]:appearance-none"
197
187
  type="text"
198
188
  inputmode="decimal"
199
189
  placeholder="--"
200
- value={layer.borderWidth || 0}
190
+ value={borderWidth}
201
191
  onchange={(e) => setWidth(e.target.value)}
202
192
  />
203
193
  </div>
204
194
  </div>
205
- <div class="flex flex-col gap-2">
206
- <div class="flex items-center gap-2 py-2">
207
- <PaletteIcon class="h-5 w-5" />
208
- <h5 class="text-left text-sm font-bold">Colors</h5>
209
- </div>
210
- <div class="grid grid-cols-6 items-stretch gap-3">
211
- {#each colors as color}
212
- <Button
213
- class={cn(
214
- 'relative h-10 w-10 after:absolute after:inset-0 after:rounded-full after:transition-shadow',
215
- (layer.borderColor || selectedColor) === color.value && 'after:shadow-active',
216
- )}
217
- variant="ghost"
218
- size="icon"
219
- onclick={setColor(color.value)}
220
- >
221
- <span
222
- class="h-full w-full rounded-full after:absolute after:inset-0 after:rounded-full after:shadow-inner"
223
- style:background-color={color.value}
224
- ></span>
225
- </Button>
226
- {/each}
227
- </div>
228
- </div>
229
195
  </div>
230
196
  </Popover.Content>
231
197
  </Popover.Root>
198
+
199
+ {#if borderColors}
200
+ <Button
201
+ variant="ghost"
202
+ size="icon-xs"
203
+ onclick={() => editor.toggleActiveSidebarPopup('borderColor')}
204
+ active={editor.activeSidebarPopup === 'borderColor'}
205
+ >
206
+ <span
207
+ class="relative h-6 w-6 rounded-full border border-gray-300"
208
+ style={buildBackgroundCircleStyle(borderColors)}
209
+ >
210
+ <span
211
+ class="bg-background absolute left-1/2 top-1/2 h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full"
212
+ ></span>
213
+ </span>
214
+ </Button>
215
+ {/if}
@@ -1,7 +1,7 @@
1
1
  import type { ImageLayer } from '../../../types.js';
2
2
  interface Props {
3
- layer: ImageLayer;
3
+ layers: ImageLayer[];
4
4
  }
5
- declare const BorderButton: import("svelte").Component<Props, {}, "layer">;
5
+ declare const BorderButton: import("svelte").Component<Props, {}, "layers">;
6
6
  type BorderButton = ReturnType<typeof BorderButton>;
7
7
  export default BorderButton;