@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,37 +1,72 @@
1
1
  <script lang="ts">
2
2
  import CaseIcon from 'lucide-svelte/icons/case-sensitive';
3
- import type { Editor } from '../../editor/Editor.js';
4
3
  import { Toggle } from '../../../../../../ui/toggle/index.js';
4
+ import { extractUppercase } from '../../editor/utils.js';
5
+ import type { HtmlLayer } from '../../../../../types.js';
6
+ import { getPresentationEditorContext } from '../../../../../presentation-editor.svelte.js';
7
+ import { createEditorNotReactive } from '../../editor/utils.js';
8
+ import { applyHtmlToLayer } from '../../../../utils.js';
5
9
 
6
10
  interface Props {
7
- editor: Editor;
11
+ layers: HtmlLayer[];
8
12
  }
9
13
 
10
- let { editor }: Props = $props();
11
-
12
- const getUppercase = () => {
13
- const selection = editor.view.state.selection;
14
- let uppercase: boolean | null = null;
15
- editor.view.state.doc.nodesBetween(selection.from, selection.to, (node) => {
16
- if (node.type.name !== 'text') {
17
- if (uppercase !== false && node.attrs.textTransform === 'uppercase') {
18
- uppercase = true;
19
- } else {
20
- uppercase = false;
21
- }
14
+ let { layers = $bindable() }: Props = $props();
15
+
16
+ const editor = getPresentationEditorContext();
17
+
18
+ const { htmlEditor } = editor;
19
+
20
+ const editorNotReactive = createEditorNotReactive();
21
+
22
+ const isActive = $derived.by(() => {
23
+ if (editor.activeAction?.type === 'edit') {
24
+ return extractUppercase($htmlEditor);
25
+ } else {
26
+ return layers.every((layer) => {
27
+ editorNotReactive.chain().setContent(layer.html).selectAll().run();
28
+ return extractUppercase(editorNotReactive);
29
+ });
30
+ }
31
+ });
32
+
33
+ const setValue = async (value: boolean) => {
34
+ if (editor.activeAction?.type === 'edit') {
35
+ if (value) {
36
+ $htmlEditor.chain().focus().setTextTransform('uppercase').run();
37
+ } else {
38
+ $htmlEditor.chain().focus().unsetTextTransform().run();
22
39
  }
23
- });
24
- return !!uppercase;
25
- };
40
+ } else {
41
+ editor.historyPush({
42
+ type: 'layersGroup',
43
+ actions: await Promise.all(
44
+ layers.map(async (layer) => {
45
+ let chain = editorNotReactive.chain().setContent(layer.html).selectAll();
46
+ if (value) {
47
+ chain = chain.setTextTransform('uppercase');
48
+ } else {
49
+ chain = chain.unsetTextTransform();
50
+ }
51
+ chain.run();
26
52
 
27
- let uppercase = $derived(editor && getUppercase());
53
+ const undo = { html: layer.html, x: layer.x, y: layer.y, height: layer.height };
54
+ const redo = await applyHtmlToLayer(layer, editorNotReactive.getJSON());
55
+
56
+ return {
57
+ type: 'layer',
58
+ slideId: editor.activeSlide.id,
59
+ layer: { id: layer.id, type: layer.type },
60
+ undo,
61
+ redo,
62
+ };
63
+ }),
64
+ ),
65
+ });
66
+ }
67
+ };
28
68
  </script>
29
69
 
30
- <Toggle
31
- size="xs"
32
- pressed={uppercase}
33
- onPressedChange={(val) =>
34
- val ? editor.commands.setTextTransform('uppercase') : editor.commands.unsetTextTransform()}
35
- >
70
+ <Toggle size="xs" pressed={isActive} onPressedChange={(val) => setValue(val)}>
36
71
  <CaseIcon class="h-6 w-6" />
37
72
  </Toggle>
@@ -1,7 +1,7 @@
1
- import type { Editor } from '../../editor/Editor.js';
1
+ import type { HtmlLayer } from '../../../../../types.js';
2
2
  interface Props {
3
- editor: Editor;
3
+ layers: HtmlLayer[];
4
4
  }
5
- declare const CaseButton: import("svelte").Component<Props, {}, "">;
5
+ declare const CaseButton: import("svelte").Component<Props, {}, "layers">;
6
6
  type CaseButton = ReturnType<typeof CaseButton>;
7
7
  export default CaseButton;
@@ -1,88 +1,39 @@
1
1
  <script lang="ts">
2
- import PaletteIcon from 'lucide-svelte/icons/palette';
3
- import type { Editor } from '../../editor/Editor.js';
4
- import * as Popover from '../../../../../../ui/popover/index.js';
5
- import { Button, buttonVariants } from '../../../../../../ui/button/index.js';
6
- import { cn } from '../../../../../../../utils.js';
2
+ import { Button } from '../../../../../../ui/button/index.js';
3
+ import { getPresentationEditorContext } from '../../../../../presentation-editor.svelte.js';
4
+ import { extractNodeColors, extractSelectionColors } from '../../editor/utils.js';
5
+ import { buildBackgroundCircleStyle } from '../../../../utils.js';
6
+ import type { HtmlLayer } from '../../../../../types.js';
7
7
 
8
8
  interface Props {
9
- editor: Editor;
9
+ layers: HtmlLayer[];
10
10
  }
11
11
 
12
- let { editor }: Props = $props();
12
+ let { layers = $bindable() }: Props = $props();
13
13
 
14
- const defaultColor = '#000000';
14
+ const editor = getPresentationEditorContext();
15
15
 
16
- const colors = [
17
- { value: '#000000', name: 'Black' },
18
- { value: '#545454', name: 'Dark Gray' },
19
- { value: '#737373', name: 'Gray' },
20
- { value: '#a6a6a6', name: 'Gray' },
21
- { value: '#d9d9d9', name: 'Light Gray' },
22
- { value: '#ffffff', name: 'White' },
16
+ const { htmlEditor } = editor;
23
17
 
24
- { value: '#ff3131', name: 'Bright Red' },
25
- { value: '#ff5757', name: 'Coral Red' },
26
- { value: '#ff66c4', name: 'Pink' },
27
- { value: '#cb6ce6', name: 'Magenta' },
28
- { value: '#8c52ff', name: 'Purple' },
29
- { value: '#5e17eb', name: 'Violet' },
30
-
31
- { value: '#0097b2', name: 'Dark Turquoise' },
32
- { value: '#0cc0df', name: 'Aqua Blue' },
33
- { value: '#5ce1e6', name: 'Turquoise Blue' },
34
- { value: '#38b6ff', name: 'Light Blue' },
35
- { value: '#5271ff', name: 'Royal Blue' },
36
- { value: '#004aad', name: 'Cobalt Blue' },
37
-
38
- { value: '#00bf63', name: 'Green' },
39
- { value: '#7ed957', name: 'Grass Green' },
40
- { value: '#c1ff72', name: 'Lime' },
41
- { value: '#ffde59', name: 'Yellow' },
42
- { value: '#ffbd59', name: 'Peach' },
43
- { value: '#ff914d', name: 'Orange' },
44
- ];
45
-
46
- const getColor = () => editor.getAttributes('textStyle').color || defaultColor;
47
-
48
- const setColor = (value: string) => {
49
- if (value === defaultColor) {
50
- editor.chain().focus().unsetColor().run();
18
+ const colors = $derived.by(() => {
19
+ if (editor.activeAction?.type === 'edit') {
20
+ return extractSelectionColors($htmlEditor);
51
21
  } else {
52
- editor.chain().focus().setColor(value).run();
22
+ const set = new Set<string>();
23
+ layers.forEach((layer) => extractNodeColors(layer.html, set));
24
+ return Array.from(set);
53
25
  }
54
- };
26
+ });
55
27
  </script>
56
28
 
57
- <Popover.Root>
58
- <Popover.Trigger class={buttonVariants({ variant: 'ghost', size: 'icon-xs' })}>
59
- <span class="h-6 w-6 rounded-full border border-gray-300" style:background-color={getColor()}
60
- ></span>
61
- </Popover.Trigger>
62
- <Popover.Content align="start" sideOffset={2} class="w-auto p-2">
63
- <div class="flex flex-col gap-2">
64
- <div class="flex items-center gap-2 p-2">
65
- <PaletteIcon class="h-5 w-5" />
66
- <h5 class="text-left text-sm font-bold">Colors</h5>
67
- </div>
68
- <div class="grid grid-cols-6 items-stretch gap-3">
69
- {#each colors as color}
70
- <Button
71
- class={cn(
72
- 'relative h-10 w-10 after:absolute after:inset-0 after:rounded-full after:transition-shadow',
73
- getColor() === color.value && 'after:shadow-active',
74
- )}
75
- variant="ghost"
76
- size="icon"
77
- onclick={() => setColor(color.value)}
78
- >
79
- <span
80
- class="h-full w-full rounded-full after:absolute after:inset-0 after:rounded-full after:shadow-inner"
81
- style:background-color={color.value}
82
- ></span>
83
- </Button>
84
- {/each}
85
- </div>
86
- </div>
87
- </Popover.Content>
88
- </Popover.Root>
29
+ <Button
30
+ variant="ghost"
31
+ size="icon-xs"
32
+ onclick={() => editor.toggleActiveSidebarPopup('textColor')}
33
+ active={editor.activeSidebarPopup === 'textColor'}
34
+ >
35
+ <span
36
+ class="h-6 w-6 rounded-full border border-gray-300"
37
+ style={buildBackgroundCircleStyle(colors)}
38
+ ></span>
39
+ </Button>
@@ -1,7 +1,7 @@
1
- import type { Editor } from '../../editor/Editor.js';
1
+ import type { HtmlLayer } from '../../../../../types.js';
2
2
  interface Props {
3
- editor: Editor;
3
+ layers: HtmlLayer[];
4
4
  }
5
- declare const ColorButton: import("svelte").Component<Props, {}, "">;
5
+ declare const ColorButton: import("svelte").Component<Props, {}, "layers">;
6
6
  type ColorButton = ReturnType<typeof ColorButton>;
7
7
  export default ColorButton;
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import { Button } from '../../../../../../ui/button/index.js';
3
+ import { getPresentationEditorContext } from '../../../../../presentation-editor.svelte.js';
4
+ import { extractNodeFonts, extractSelectionFonts } from '../../editor/utils.js';
5
+ import type { HtmlLayer } from '../../../../../types.js';
6
+
7
+ interface Props {
8
+ layers: HtmlLayer[];
9
+ }
10
+
11
+ let { layers = $bindable() }: Props = $props();
12
+
13
+ const editor = getPresentationEditorContext();
14
+
15
+ const { htmlEditor } = editor;
16
+
17
+ const fonts = $derived.by(() => {
18
+ if (editor.activeAction?.type === 'edit') {
19
+ return extractSelectionFonts($htmlEditor);
20
+ } else {
21
+ const set = new Set<string>();
22
+ layers.forEach((layer) => extractNodeFonts(layer.html, set));
23
+ return Array.from(set);
24
+ }
25
+ });
26
+ </script>
27
+
28
+ <Button
29
+ variant="outline"
30
+ size="xs"
31
+ class="w-40 justify-start"
32
+ onclick={() => (editor.activeSidebarPopup = 'font')}
33
+ active={editor.activeSidebarPopup === 'font'}
34
+ >
35
+ {fonts.length > 1 ? 'Mutliple fonts' : fonts.length ? fonts[0] : 'Default'}
36
+ </Button>
@@ -0,0 +1,7 @@
1
+ import type { HtmlLayer } from '../../../../../types.js';
2
+ interface Props {
3
+ layers: HtmlLayer[];
4
+ }
5
+ declare const FontFamilyButton: import("svelte").Component<Props, {}, "layers">;
6
+ type FontFamilyButton = ReturnType<typeof FontFamilyButton>;
7
+ export default FontFamilyButton;
@@ -0,0 +1,2 @@
1
+ import FontFamilyButton from './font-family-button.svelte';
2
+ export { FontFamilyButton };
@@ -0,0 +1,2 @@
1
+ import FontFamilyButton from './font-family-button.svelte';
2
+ export { FontFamilyButton };
@@ -1,34 +1,33 @@
1
1
  <script lang="ts">
2
2
  import MinusIcon from 'lucide-svelte/icons/minus';
3
3
  import PlusIcon from 'lucide-svelte/icons/plus';
4
- import type { Layer } from '../../../../../types.js';
5
- import type { Editor } from '../../editor/Editor.js';
4
+ import type { HtmlLayer } from '../../../../../types.js';
6
5
  import * as DropdownMenu from '../../../../../../ui/dropdown-menu/index.js';
7
6
  import { Button, buttonVariants } from '../../../../../../ui/button/index.js';
7
+ import { getPresentationEditorContext } from '../../../../../presentation-editor.svelte.js';
8
+ import {
9
+ createEditorNotReactive,
10
+ extractNodeFontSizes,
11
+ extractSelectionFontSizes,
12
+ } from '../../editor/utils.js';
13
+ import { applyHtmlToLayer } from '../../../../utils.js';
8
14
 
9
15
  interface Props {
10
- layer: Layer;
11
- editor: Editor;
16
+ layers: HtmlLayer[];
12
17
  }
13
18
 
14
- let { layer, editor }: Props = $props();
19
+ let { layers = $bindable() }: Props = $props();
20
+
21
+ const editor = getPresentationEditorContext();
22
+
23
+ const { htmlEditor } = editor;
15
24
 
16
25
  let fontSizeInputEl: HTMLInputElement | null = $state(null);
17
26
  let pxToPt = 3 / 4;
18
27
  const min = 1;
19
28
  const max = 800;
20
29
 
21
- const getFontSize = (scale: number) => {
22
- const selection = editor.view.state.selection;
23
- let fontSizes: number[] = [];
24
- editor.view.state.doc.nodesBetween(selection.from, selection.to, (node) => {
25
- if (node.type.name !== 'text') {
26
- if (node.attrs.fontSize) {
27
- fontSizes.push(node.attrs.fontSize);
28
- }
29
- }
30
- });
31
- fontSizes = [...new Set(fontSizes)];
30
+ const getFontSize = (fontSizes: number[], scale: number) => {
32
31
  let fontSizePx;
33
32
  if (fontSizes.length === 1) {
34
33
  fontSizePx = fontSizes[0];
@@ -38,19 +37,63 @@
38
37
  return fontSizePx ? Math.round(fontSizePx * pxToPt * scale * 10) / 10 : null;
39
38
  };
40
39
 
41
- let scale = $derived(layer.scale || 1);
42
- let fontSize = $derived(editor && getFontSize(scale));
40
+ const fontSize = $derived.by(() => {
41
+ if (editor.activeAction?.type === 'edit') {
42
+ const fontSizesPx = extractSelectionFontSizes($htmlEditor);
43
+ return getFontSize(fontSizesPx, layers[0]?.scale || 1);
44
+ } else {
45
+ const set = new Set<number>();
46
+ layers.forEach((layer) => {
47
+ const fontSizesPx = extractNodeFontSizes(layer.html);
48
+ const fontSize = getFontSize(fontSizesPx, layer.scale || 1);
49
+ if (fontSize) {
50
+ set.add(fontSize);
51
+ }
52
+ });
53
+ const fontSizes = Array.from(set);
54
+ return fontSizes.length === 1 ? fontSizes[0] : null;
55
+ }
56
+ });
43
57
 
44
- const updateFontSize = (value: number) => {
58
+ const updateFontSize = async (value: number) => {
45
59
  console.log('updateFontSize', value);
46
- if (editor) {
47
- let fontSizePt = value;
48
- if (fontSizePt < min) {
49
- fontSizePt = min;
50
- } else if (fontSizePt > max) {
51
- fontSizePt = max;
52
- }
53
- editor.commands.setFontSize(fontSizePt / pxToPt / scale);
60
+ let fontSizePt = value;
61
+ if (fontSizePt < min) {
62
+ fontSizePt = min;
63
+ } else if (fontSizePt > max) {
64
+ fontSizePt = max;
65
+ }
66
+ if (editor.activeAction?.type === 'edit') {
67
+ $htmlEditor.commands.setFontSize(fontSizePt / pxToPt / (layers[0]?.scale || 1));
68
+ } else {
69
+ editor.historyPush({
70
+ type: 'layersGroup',
71
+ actions: await Promise.all(
72
+ layers.map(async (layer) => {
73
+ const editorNotReactive = createEditorNotReactive(layer.html);
74
+ const scale = layer.scale || 1;
75
+ const fontSize = fontSizePt / pxToPt / scale;
76
+ editorNotReactive
77
+ .chain()
78
+ .setContent(layer.html)
79
+ .selectAll()
80
+ .setFontSize(fontSize)
81
+ .run();
82
+
83
+ const undo = { html: layer.html, x: layer.x, y: layer.y, height: layer.height };
84
+ const html = editorNotReactive.getJSON();
85
+ const redo = await applyHtmlToLayer(layer, html);
86
+
87
+ return {
88
+ type: 'layer',
89
+ slideId: editor.activeSlide.id,
90
+ layer: { id: layer.id, type: layer.type },
91
+ undo,
92
+ redo,
93
+ };
94
+ }),
95
+ ),
96
+ });
54
97
  }
55
98
  };
56
99
 
@@ -70,7 +113,7 @@
70
113
  class="w-8 rounded-r-none border-r-0"
71
114
  onclick={incrementFontSize(-1)}
72
115
  >
73
- <MinusIcon class="h-6 w-6" />
116
+ <MinusIcon class="h-3 w-3" />
74
117
  </Button>
75
118
  <DropdownMenu.Root>
76
119
  <DropdownMenu.Trigger
@@ -127,6 +170,6 @@
127
170
  class="w-8 rounded-l-none border-l-0"
128
171
  onclick={incrementFontSize()}
129
172
  >
130
- <PlusIcon class="h-6 w-6" />
173
+ <PlusIcon class="h-3 w-3" />
131
174
  </Button>
132
175
  </div>
@@ -1,9 +1,7 @@
1
- import type { Layer } from '../../../../../types.js';
2
- import type { Editor } from '../../editor/Editor.js';
1
+ import type { HtmlLayer } from '../../../../../types.js';
3
2
  interface Props {
4
- layer: Layer;
5
- editor: Editor;
3
+ layers: HtmlLayer[];
6
4
  }
7
- declare const FontSizeButton: import("svelte").Component<Props, {}, "">;
5
+ declare const FontSizeButton: import("svelte").Component<Props, {}, "layers">;
8
6
  type FontSizeButton = ReturnType<typeof FontSizeButton>;
9
7
  export default FontSizeButton;
@@ -1,19 +1,71 @@
1
1
  <script lang="ts">
2
2
  import ItalicIcon from 'lucide-svelte/icons/italic';
3
- import type { Editor } from '../../editor/Editor.js';
4
3
  import { Toggle } from '../../../../../../ui/toggle/index.js';
4
+ import type { HtmlLayer } from '../../../../../types.js';
5
+ import { getPresentationEditorContext } from '../../../../../presentation-editor.svelte.js';
6
+ import { createEditorNotReactive } from '../../editor/utils.js';
7
+ import { applyHtmlToLayer } from '../../../../utils.js';
5
8
 
6
9
  interface Props {
7
- editor: Editor;
10
+ layers: HtmlLayer[];
8
11
  }
9
12
 
10
- let { editor }: Props = $props();
13
+ let { layers = $bindable() }: Props = $props();
14
+
15
+ const editor = getPresentationEditorContext();
16
+
17
+ const { htmlEditor } = editor;
18
+
19
+ const editorNotReactive = createEditorNotReactive();
20
+
21
+ const isActive = $derived.by(() => {
22
+ if (editor.activeAction?.type === 'edit') {
23
+ return $htmlEditor.isActive('italic');
24
+ } else {
25
+ return layers.every((layer) => {
26
+ editorNotReactive.chain().setContent(layer.html).selectAll().run();
27
+ return editorNotReactive.isActive('italic');
28
+ });
29
+ }
30
+ });
31
+
32
+ const setValue = async (value: boolean) => {
33
+ if (editor.activeAction?.type === 'edit') {
34
+ if (value) {
35
+ $htmlEditor.chain().focus().setItalic().run();
36
+ } else {
37
+ $htmlEditor.chain().focus().unsetItalic().run();
38
+ }
39
+ } else {
40
+ editor.historyPush({
41
+ type: 'layersGroup',
42
+ actions: await Promise.all(
43
+ layers.map(async (layer) => {
44
+ let chain = editorNotReactive.chain().setContent(layer.html).selectAll();
45
+ if (value) {
46
+ chain = chain.setItalic();
47
+ } else {
48
+ chain = chain.unsetItalic();
49
+ }
50
+ chain.run();
51
+
52
+ const undo = { html: layer.html, x: layer.x, y: layer.y, height: layer.height };
53
+ const redo = await applyHtmlToLayer(layer, editorNotReactive.getJSON());
54
+
55
+ return {
56
+ type: 'layer',
57
+ slideId: editor.activeSlide.id,
58
+ layer: { id: layer.id, type: layer.type },
59
+ undo,
60
+ redo,
61
+ };
62
+ }),
63
+ ),
64
+ });
65
+ }
66
+ };
11
67
  </script>
12
68
 
13
- <Toggle
14
- size="xs"
15
- pressed={editor.isActive('italic')}
16
- onPressedChange={(val) => (val ? editor.commands.setItalic() : editor.commands.unsetItalic())}
17
- >
69
+ <Toggle size="xs" pressed={isActive} onPressedChange={(val) => setValue(val)}>
18
70
  <ItalicIcon class="h-6 w-6" />
19
71
  </Toggle>
@@ -1,7 +1,7 @@
1
- import type { Editor } from '../../editor/Editor.js';
1
+ import type { HtmlLayer } from '../../../../../types.js';
2
2
  interface Props {
3
- editor: Editor;
3
+ layers: HtmlLayer[];
4
4
  }
5
- declare const ItalicButton: import("svelte").Component<Props, {}, "">;
5
+ declare const ItalicButton: import("svelte").Component<Props, {}, "layers">;
6
6
  type ItalicButton = ReturnType<typeof ItalicButton>;
7
7
  export default ItalicButton;
@@ -1,35 +1,88 @@
1
1
  <script lang="ts">
2
- import { type Editor } from '../../editor/index.js';
3
2
  import BulletListIcon from 'lucide-svelte/icons/list';
4
3
  import OrderedListIcon from 'lucide-svelte/icons/list-ordered';
5
4
  import { Toggle } from '../../../../../../ui/toggle/index.js';
5
+ import { getPresentationEditorContext } from '../../../../../presentation-editor.svelte.js';
6
+ import type { HtmlLayer } from '../../../../../types.js';
7
+ import type { Editor } from '../../editor/index.js';
8
+ import { createEditorNotReactive } from '../../editor/utils.js';
9
+ import { applyHtmlToLayer } from '../../../../utils.js';
6
10
 
7
11
  interface Props {
8
- editor: Editor;
12
+ layers: HtmlLayer[];
9
13
  }
10
14
 
11
- let { editor }: Props = $props();
15
+ let { layers = $bindable() }: Props = $props();
16
+
17
+ const editor = getPresentationEditorContext();
18
+
19
+ const { htmlEditor } = editor;
12
20
 
13
21
  type ListType = 'bulletList' | 'orderedList';
14
22
 
15
- let listType: ListType | false = $derived(
16
- editor &&
17
- ((editor.isActive('bulletList') && 'bulletList') ||
18
- (editor.isActive('orderedList') && 'orderedList')),
19
- );
20
- </script>
23
+ const editorNotReactive = createEditorNotReactive();
24
+
25
+ const getListType = (editor: Editor): ListType | false => {
26
+ const listTypes: ListType[] = ['bulletList', 'orderedList'];
27
+ for (let type of listTypes) {
28
+ if (editor.isActive(type)) {
29
+ return type;
30
+ }
31
+ }
32
+ return false;
33
+ };
34
+
35
+ const currentListType = $derived.by(() => {
36
+ if (editor.activeAction?.type === 'edit') {
37
+ return getListType($htmlEditor);
38
+ } else {
39
+ const set = new Set<ListType | false>();
40
+ layers.forEach((layer) => {
41
+ editorNotReactive.chain().setContent(layer.html).selectAll().run();
42
+ set.add(getListType(editorNotReactive));
43
+ });
44
+ return set.size > 1 ? false : Array.from(set)[0];
45
+ }
46
+ });
21
47
 
22
- <Toggle
23
- size="xs"
24
- pressed={!!listType}
25
- onPressedChange={() =>
26
- !listType
48
+ const setNextListType = (editor: Editor, type: ListType | false) => {
49
+ !type
27
50
  ? editor.commands.toggleBulletList()
28
- : listType === 'bulletList'
51
+ : type === 'bulletList'
29
52
  ? editor.commands.toggleOrderedList()
30
- : editor.commands.toggleUnstyledList()}
31
- >
32
- {#if listType === 'orderedList'}
53
+ : editor.commands.toggleUnstyledList();
54
+ };
55
+
56
+ const switchListType = async () => {
57
+ if (editor.activeAction?.type === 'edit') {
58
+ setNextListType($htmlEditor, currentListType);
59
+ } else {
60
+ editor.historyPush({
61
+ type: 'layersGroup',
62
+ actions: await Promise.all(
63
+ layers.map(async (layer) => {
64
+ editorNotReactive.chain().setContent(layer.html).selectAll().run();
65
+ setNextListType(editorNotReactive, currentListType);
66
+
67
+ const undo = { html: layer.html, x: layer.x, y: layer.y, height: layer.height };
68
+ const redo = await applyHtmlToLayer(layer, editorNotReactive.getJSON());
69
+
70
+ return {
71
+ type: 'layer',
72
+ slideId: editor.activeSlide.id,
73
+ layer: { id: layer.id, type: layer.type },
74
+ undo,
75
+ redo,
76
+ };
77
+ }),
78
+ ),
79
+ });
80
+ }
81
+ };
82
+ </script>
83
+
84
+ <Toggle size="xs" pressed={!!currentListType} onPressedChange={switchListType}>
85
+ {#if currentListType === 'orderedList'}
33
86
  <OrderedListIcon class="h-6 w-6" />
34
87
  {:else}
35
88
  <BulletListIcon class="h-6 w-6" />
@@ -1,7 +1,7 @@
1
- import { type Editor } from '../../editor/index.js';
1
+ import type { HtmlLayer } from '../../../../../types.js';
2
2
  interface Props {
3
- editor: Editor;
3
+ layers: HtmlLayer[];
4
4
  }
5
- declare const ListButton: import("svelte").Component<Props, {}, "">;
5
+ declare const ListButton: import("svelte").Component<Props, {}, "layers">;
6
6
  type ListButton = ReturnType<typeof ListButton>;
7
7
  export default ListButton;