@peteai/presentation-editor 0.0.8 → 0.0.10

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 (96) hide show
  1. package/dist/components/editor/active-layers.svelte +2 -2
  2. package/dist/components/editor/design.svelte +92 -0
  3. package/dist/components/editor/design.svelte.d.ts +8 -0
  4. package/dist/components/editor/editor.svelte +1 -1
  5. package/dist/components/editor/editor.svelte.js +14 -2
  6. package/dist/components/editor/header.svelte +1 -1
  7. package/dist/components/editor/index.d.ts +2 -1
  8. package/dist/components/editor/index.js +2 -1
  9. package/dist/components/editor/layers/active-layer-border.svelte +1 -1
  10. package/dist/components/editor/layers/buttons/border-button/border-button-colors.svelte +1 -1
  11. package/dist/components/editor/layers/controls/corner-scale-control/corner-scale-control.svelte +1 -1
  12. package/dist/components/editor/layers/controls/rotate-control/rotate-control.svelte +1 -1
  13. package/dist/components/editor/layers/controls/side-scale-control/side-scale-control.svelte +1 -1
  14. package/dist/components/editor/layers/layer-button.svelte +1 -1
  15. package/dist/components/editor/layers/types/background/background-layer-buttons.svelte +1 -1
  16. package/dist/components/editor/layers/types/image/controls/image-rotate-control/image-rotate-control.svelte +1 -1
  17. package/dist/components/editor/layers/types/image/controls/image-scale-control/image-scale-control.svelte +1 -1
  18. package/dist/components/editor/layers/types/image/image-layer-crop.svelte +2 -2
  19. package/dist/components/editor/page-editor.svelte +7 -0
  20. package/dist/components/editor/{pages-navigation/page-preview.svelte → page-preview.svelte} +4 -4
  21. package/dist/components/editor/{pages-navigation/page-preview.svelte.d.ts → page-preview.svelte.d.ts} +2 -2
  22. package/dist/components/editor/page-transition-preview.svelte +34 -0
  23. package/dist/components/editor/page-transition-preview.svelte.d.ts +9 -0
  24. package/dist/components/editor/page-with-transition.svelte +48 -0
  25. package/dist/components/editor/page-with-transition.svelte.d.ts +10 -0
  26. package/dist/components/editor/page.svelte +12 -19
  27. package/dist/components/editor/pages-navigation/pages-navigation-item.svelte +80 -20
  28. package/dist/components/editor/pages-navigation/pages-navigation.svelte +7 -4
  29. package/dist/components/editor/sidebar/color-sidebar/color-sidebar-color.svelte +2 -2
  30. package/dist/components/editor/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte +5 -5
  31. package/dist/components/editor/sidebar/color-sidebar/color-sidebar.svelte +91 -81
  32. package/dist/components/editor/sidebar/color-sidebar/color-sidebar.svelte.d.ts +5 -1
  33. package/dist/components/editor/sidebar/font-sidebar/font-sidebar.svelte +10 -6
  34. package/dist/components/editor/sidebar/font-sidebar/font-sidebar.svelte.d.ts +5 -1
  35. package/dist/components/editor/sidebar/image-crop-sidebar.svelte +28 -37
  36. package/dist/components/editor/sidebar/image-crop-sidebar.svelte.d.ts +2 -0
  37. package/dist/components/editor/sidebar/position-sidebar/index.d.ts +2 -0
  38. package/dist/components/editor/sidebar/position-sidebar/index.js +2 -0
  39. package/dist/components/editor/sidebar/position-sidebar/position-sidebar.svelte +130 -0
  40. package/dist/components/editor/sidebar/position-sidebar/position-sidebar.svelte.d.ts +7 -0
  41. package/dist/components/editor/sidebar/sidebar-text-tab.svelte +7 -3
  42. package/dist/components/editor/sidebar/sidebar-text-tab.svelte.d.ts +5 -16
  43. package/dist/components/editor/sidebar/sidebar-uploads-tab.svelte +10 -8
  44. package/dist/components/editor/sidebar/sidebar-uploads-tab.svelte.d.ts +5 -1
  45. package/dist/components/editor/sidebar/sidebar-wrapper.svelte +4 -3
  46. package/dist/components/editor/sidebar/sidebar-wrapper.svelte.d.ts +1 -0
  47. package/dist/components/editor/sidebar/sidebar.svelte +20 -13
  48. package/dist/components/editor/sidebar/transition-sidebar/index.d.ts +2 -0
  49. package/dist/components/editor/sidebar/transition-sidebar/index.js +2 -0
  50. package/dist/components/editor/sidebar/transition-sidebar/transition-sidebar.svelte +257 -0
  51. package/dist/components/editor/sidebar/transition-sidebar/transition-sidebar.svelte.d.ts +7 -0
  52. package/dist/components/editor/snapping-guides.svelte +3 -3
  53. package/dist/components/editor/types.d.ts +40 -6
  54. package/dist/components/editor/utils.d.ts +2 -2
  55. package/dist/components/editor/utils.js +21 -0
  56. package/dist/components/ui/button/button.svelte +2 -1
  57. package/dist/components/ui/button/button.svelte.d.ts +3 -0
  58. package/dist/components/ui/color-picker/color-picker-alpha-grid.svelte +2 -1
  59. package/dist/components/ui/color-picker/color-picker.svelte +6 -6
  60. package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
  61. package/dist/components/ui/context-menu/context-menu-content.svelte +3 -1
  62. package/dist/components/ui/context-menu/context-menu-group-heading.svelte +1 -1
  63. package/dist/components/ui/context-menu/context-menu-item.svelte +1 -1
  64. package/dist/components/ui/context-menu/context-menu-radio-item.svelte +1 -1
  65. package/dist/components/ui/context-menu/context-menu-separator.svelte +1 -1
  66. package/dist/components/ui/context-menu/context-menu-shortcut.svelte +1 -1
  67. package/dist/components/ui/context-menu/context-menu-sub-content.svelte +1 -1
  68. package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +1 -1
  69. package/dist/components/ui/dialog/dialog-content.svelte +4 -2
  70. package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
  71. package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +2 -0
  72. package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
  73. package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
  74. package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
  75. package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
  76. package/dist/components/ui/input/input.svelte +1 -1
  77. package/dist/components/ui/slider/slider.svelte +3 -3
  78. package/dist/components/ui/tabs/index.d.ts +4 -4
  79. package/dist/components/ui/tabs/index.js +4 -4
  80. package/dist/components/ui/tabs/tabs-content.svelte +4 -4
  81. package/dist/components/ui/tabs/tabs-content.svelte.d.ts +1 -1
  82. package/dist/components/ui/tabs/tabs-list.svelte +5 -9
  83. package/dist/components/ui/tabs/tabs-list.svelte.d.ts +1 -1
  84. package/dist/components/ui/tabs/tabs-trigger.svelte +4 -4
  85. package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +1 -1
  86. package/dist/transitions/circleWipe.d.ts +10 -0
  87. package/dist/transitions/circleWipe.js +16 -0
  88. package/dist/transitions/lineWipe.d.ts +9 -0
  89. package/dist/transitions/lineWipe.js +17 -0
  90. package/dist/transitions/stack.d.ts +8 -0
  91. package/dist/transitions/stack.js +13 -0
  92. package/package.json +19 -19
  93. package/dist/components/editor/layers/types/image/image-layer-active.svelte +0 -36
  94. package/dist/components/editor/layers/types/image/image-layer-active.svelte.d.ts +0 -7
  95. package/dist/components/editor/sidebar/position-sidebar.svelte +0 -136
  96. package/dist/components/editor/sidebar/position-sidebar.svelte.d.ts +0 -3
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { dragHandle } from 'svelte-dnd-action';
3
3
  import PlusIcon from '@lucide/svelte/icons/plus';
4
+ import ArrowBigRightDashIcon from '@lucide/svelte/icons/arrow-big-right-dash';
4
5
  import EllipsisIcon from '@lucide/svelte/icons/ellipsis';
5
6
  import IconLocked from '@lucide/svelte/icons/lock-keyhole';
6
7
  import { Button, buttonVariants } from '../../ui/button/index.js';
@@ -9,8 +10,8 @@
9
10
  import { cn } from '../../../utils.js';
10
11
  import type { Editor } from '../editor.svelte.js';
11
12
  import type { Page } from '../types.js';
12
- import PagePreviewMenuContent from '../menu/page-menu-content.svelte';
13
- import PagePreview from './page-preview.svelte';
13
+ import PageMenuContent from '../menu/page-menu-content.svelte';
14
+ import PagePreview from '../page-preview.svelte';
14
15
 
15
16
  interface Props {
16
17
  editor: Editor;
@@ -24,27 +25,29 @@
24
25
  let menuOpen = $state(false);
25
26
  </script>
26
27
 
27
- <div class="relative flex items-center">
28
- <div class="group h-full">
29
- <div class="absolute -left-2 top-0 z-20 h-full w-4 group-hover:w-16"></div>
30
- <div
31
- class="relative z-30 flex h-full w-0 items-center justify-center transition-all duration-300 group-hover:w-6"
32
- >
28
+ <div class="relative flex items-stretch">
29
+ {#if index === 0}
30
+ <div class="group ml-2 py-2">
31
+ <div class="absolute -left-2 top-0 z-20 h-full w-4 group-hover:w-16"></div>
33
32
  <div
34
- class="absolute inline-flex flex-col opacity-0 transition-opacity duration-500 group-hover:opacity-100"
35
- role="menu"
33
+ class="relative z-30 flex h-full w-0 items-center justify-center transition-all duration-300 group-hover:w-6"
36
34
  >
37
- <Button
38
- variant="outline"
39
- size="icon-xs"
40
- class="my-1 h-6 w-6 rounded-full"
41
- onclick={() => editor.addPage({ index })}
35
+ <div
36
+ class="absolute inline-flex flex-col opacity-0 transition-opacity duration-500 group-hover:opacity-100"
37
+ role="menu"
42
38
  >
43
- <PlusIcon class="h-4 w-4" />
44
- </Button>
39
+ <Button
40
+ variant="outline"
41
+ size="icon-xs"
42
+ class="my-1 h-6 w-6 rounded-full"
43
+ onclick={() => editor.addPage({ index })}
44
+ >
45
+ <PlusIcon class="h-4 w-4" />
46
+ </Button>
47
+ </div>
45
48
  </div>
46
49
  </div>
47
- </div>
50
+ {/if}
48
51
  <div class="group relative mx-2 my-1 transition-transform">
49
52
  <div use:dragHandle role="none">
50
53
  <button class="block" onclick={() => editor.setActivePage(page.id)}>
@@ -73,7 +76,7 @@
73
76
  </div>
74
77
  </ContextMenu.Trigger>
75
78
  <ContextMenu.Content class="w-72">
76
- <PagePreviewMenuContent {editor} {page} />
79
+ <PageMenuContent {editor} {page} />
77
80
  </ContextMenu.Content>
78
81
  </ContextMenu.Root>
79
82
  </button>
@@ -115,9 +118,66 @@
115
118
  </DropdownMenu.Trigger>
116
119
 
117
120
  <DropdownMenu.Content class="w-72" side="top" align="start" trapFocus={false}>
118
- <PagePreviewMenuContent {editor} {page} />
121
+ <PageMenuContent {editor} {page} />
119
122
  </DropdownMenu.Content>
120
123
  </DropdownMenu.Root>
121
124
  </div>
122
125
  </div>
126
+ {#if index < editor.pages.length - 1}
127
+ <div class="group py-2">
128
+ <div class="absolute -right-2 top-0 z-20 h-full w-4 group-hover:w-16"></div>
129
+ <div
130
+ class="relative z-30 flex h-full w-0 items-center justify-center transition-all duration-300 group-hover:w-6"
131
+ >
132
+ <!-- {#if page.transition}
133
+ <div
134
+ class="absolute inline-flex flex-col opacity-100 transition-opacity duration-500 group-hover:opacity-0"
135
+ >
136
+ <Button
137
+ variant="outline"
138
+ size="icon-xs"
139
+ active={page.id === editor.activePage.id}
140
+ class="my-1 h-6 w-6 rounded-full"
141
+ onclick={() => editor.setActivePage(page.id)}
142
+ >
143
+ <ArrowBigRightDashIcon class="h-4 w-4" />
144
+ </Button>
145
+ </div>
146
+ {/if} -->
147
+ <div class="flex h-full flex-col items-center" role="menu">
148
+ <div
149
+ class="flex flex-1 items-center opacity-0 transition-all duration-500 group-hover:opacity-100"
150
+ >
151
+ <Button
152
+ variant="outline"
153
+ size="icon-xs"
154
+ class="h-6 w-6 rounded-full"
155
+ onclick={() => editor.addPage({ index: index + 1 })}
156
+ >
157
+ <PlusIcon class="h-4 w-4" />
158
+ </Button>
159
+ </div>
160
+ <div
161
+ class={cn(
162
+ 'flex flex-1 items-center transition-all group-hover:translate-y-0 group-hover:opacity-100',
163
+ page.transition ? '-translate-y-1/2 duration-300' : 'opacity-0 duration-500',
164
+ )}
165
+ >
166
+ <Button
167
+ variant="outline"
168
+ size="icon-xs"
169
+ class="h-6 w-6 rounded-full"
170
+ active={!!page.transition && page.id === editor.activePage.id}
171
+ onclick={() => {
172
+ editor.setActivePage(page.id);
173
+ editor.activeSidebarPopup = 'transition';
174
+ }}
175
+ >
176
+ <ArrowBigRightDashIcon class="h-4 w-4" />
177
+ </Button>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ </div>
182
+ {/if}
123
183
  </div>
@@ -5,6 +5,7 @@
5
5
  import type { Editor } from '../editor.svelte.js';
6
6
  import type { Page } from '../types.js';
7
7
  import PagesNavigationItem from './pages-navigation-item.svelte';
8
+ import { Button } from '../../ui/button/index.js';
8
9
 
9
10
  interface Props {
10
11
  editor: Editor;
@@ -85,19 +86,21 @@
85
86
  {/each}
86
87
  </section>
87
88
  <div class="relative py-2" role="none">
88
- <button
89
- class="mx-2 my-1 rounded-xl"
89
+ <Button
90
+ variant="outline"
91
+ size="vague"
92
+ class="mx-2 my-1 rounded-lg"
90
93
  aria-label="New Page"
91
94
  onclick={() => editor.addPage({ index: editor.pages.length })}
92
95
  >
93
96
  <div
94
- class="relative flex items-center justify-center overflow-hidden rounded-lg bg-gray-400"
97
+ class="relative flex items-center justify-center"
95
98
  style:width="{editor.width * thumbScale}px"
96
99
  style:height="{editor.height * thumbScale}px"
97
100
  >
98
101
  <PlusIcon class="h-6 w-6" />
99
102
  </div>
100
- </button>
103
+ </Button>
101
104
  </div>
102
105
  </div>
103
106
  </nav>
@@ -30,7 +30,7 @@
30
30
  )}
31
31
  {...restProps}
32
32
  >
33
- <div class="wrapper after:shadow-inner-1 relative h-full w-full after:absolute after:inset-0">
33
+ <div class="wrapper relative h-full w-full after:absolute after:inset-0 after:shadow-inner-1">
34
34
  <ColorPickerAlphaGrid size={12}>
35
35
  <ColorIndicator {color} />
36
36
  </ColorPickerAlphaGrid>
@@ -40,7 +40,7 @@
40
40
  <div
41
41
  class="pointer-events-none absolute inset-0 flex items-center justify-center opacity-0 transition-opacity group-hover:opacity-100"
42
42
  >
43
- <div class="bg-background text-foreground rounded-full p-1">
43
+ <div class="rounded-full bg-background p-1 text-foreground">
44
44
  <SettingsIcon class="h-4 w-4" />
45
45
  </div>
46
46
  </div>
@@ -66,11 +66,11 @@
66
66
  <Popover.Trigger
67
67
  class={cn(
68
68
  buttonVariants({ variant: 'ghost', size: 'icon' }),
69
- 'hover:after:shadow-hover data-[state=open]:after:shadow-active relative h-full w-full shrink-0 overflow-hidden rounded-full after:absolute after:inset-0 after:rounded-full after:transition-shadow',
69
+ 'relative h-full w-full shrink-0 overflow-hidden rounded-full after:absolute after:inset-0 after:rounded-full after:transition-shadow hover:after:shadow-hover data-[state=open]:after:shadow-active',
70
70
  )}
71
71
  >
72
72
  <div
73
- class="wrapper after:shadow-inner-1 relative h-full w-full after:absolute after:inset-0 after:rounded-full"
73
+ class="wrapper relative h-full w-full after:absolute after:inset-0 after:rounded-full after:shadow-inner-1"
74
74
  >
75
75
  <ColorPickerAlphaGrid size={12}>
76
76
  <ColorIndicator {color} />
@@ -105,11 +105,11 @@
105
105
  <Button
106
106
  variant="ghost"
107
107
  size="icon"
108
- class="hover:after:shadow-hover relative shrink-0 p-0 after:absolute after:inset-0 after:rounded-full after:transition-shadow"
108
+ class="relative shrink-0 p-0 after:absolute after:inset-0 after:rounded-full after:transition-shadow hover:after:shadow-hover"
109
109
  onclick={addColor}
110
110
  >
111
111
  <div
112
- class="after:shadow-inner-1 relative h-full w-full after:absolute after:inset-0 after:rounded-full"
112
+ class="relative h-full w-full after:absolute after:inset-0 after:rounded-full after:shadow-inner-1"
113
113
  >
114
114
  <div
115
115
  class="h-full w-full rounded-full"
@@ -117,7 +117,7 @@
117
117
  ></div>
118
118
  <span class="absolute inset-0 flex h-full w-full items-center justify-center">
119
119
  <span
120
- class="bg-background text-foreground flex h-6 w-6 items-center justify-center rounded-full"
120
+ class="flex h-6 w-6 items-center justify-center rounded-full bg-background text-foreground"
121
121
  >
122
122
  <PlusIcon />
123
123
  </span>
@@ -1,12 +1,12 @@
1
1
  <script lang="ts">
2
2
  import PlusIcon from '@lucide/svelte/icons/plus';
3
- // import PaletteIcon from '@lucide/svelte/icons/palette';
3
+ import PaletteIcon from '@lucide/svelte/icons/palette';
4
4
  import { ColorPicker } from '../../../ui/color-picker/index.js';
5
5
  import * as Popover from '../../../ui/popover/index.js';
6
6
  import * as Tabs from '../../../ui/tabs/index.js';
7
7
  import { cn, createDebouncedCallback } from '../../../../utils.js';
8
- import { getEditorContext } from '../../editor.svelte.js';
9
- import type { HistoryAction, Gradient, ImageLayer, TextLayer, Layer, Page } from '../../types.js';
8
+ import type { Editor } from '../../editor.svelte.js';
9
+ import type { HistoryAction, Gradient, ImageLayer, TextLayer, Layer } from '../../types.js';
10
10
  import SidebarWrapper from '../sidebar-wrapper.svelte';
11
11
  import ColorSidebarGradientPicker from './color-sidebar-gradient-picker.svelte';
12
12
  import ColorSidebarColor from './color-sidebar-color.svelte';
@@ -20,7 +20,11 @@
20
20
 
21
21
  let open = $state(false);
22
22
 
23
- const editor = getEditorContext();
23
+ interface Props {
24
+ editor: Editor;
25
+ }
26
+
27
+ const { editor }: Props = $props();
24
28
 
25
29
  const { htmlEditor } = editor;
26
30
 
@@ -311,91 +315,82 @@
311
315
  </script>
312
316
 
313
317
  <SidebarWrapper name="Color">
314
- <div class="flex items-center gap-2 py-2">
315
- <h5 class="text-left text-sm font-bold">Document colors</h5>
316
- </div>
317
- <div class="grid grid-cols-6 items-stretch gap-1">
318
- <div class="relative h-0 w-full" style:padding-top="100%">
319
- <div class="absolute left-0 top-0 h-full w-full">
320
- <Popover.Root bind:open>
321
- <Popover.Trigger
322
- class={cn(
323
- 'relative h-full w-full overflow-hidden rounded-full after:absolute after:inset-0 after:rounded-full after:transition-shadow',
324
- open ? 'after:shadow-active' : 'hover:after:shadow-hover',
325
- )}
326
- >
327
- <div
328
- class="after:shadow-inner-1 relative h-full w-full after:absolute after:inset-0 after:rounded-full"
329
- >
330
- <div
331
- class="h-full w-full rounded-full"
332
- style:background={`conic-gradient(red, orange, yellow, green, blue, indigo, violet, red)`}
333
- ></div>
334
- <span class="absolute inset-0 flex h-full w-full items-center justify-center">
335
- <span
336
- class="bg-background text-foreground flex h-6 w-6 items-center justify-center rounded-full"
337
- >
338
- <PlusIcon />
339
- </span>
340
- </span>
341
- </div>
342
- </Popover.Trigger>
343
- <Popover.Content align="start" sideOffset={2} class="w-80 p-4">
344
- {#if gradientsAllowed}
345
- <Tabs.Root
346
- value={isGradient(currentColor) ? 'gradient' : 'solid'}
347
- class="w-full"
348
- onValueChange={switchType}
349
- >
350
- <Tabs.List class="grid w-full grid-cols-2">
351
- <Tabs.Trigger value="solid">Solid color</Tabs.Trigger>
352
- <Tabs.Trigger value="gradient">Gradient</Tabs.Trigger>
353
- </Tabs.List>
354
- <Tabs.Content value="solid">
355
- {#if !isGradient(currentColor)}
356
- <ColorPicker hex={currentColor} onChange={({ hex }) => setColor(hex, true)} />
357
- {/if}
358
- </Tabs.Content>
359
- <Tabs.Content value="gradient">
360
- {#if isGradient(currentColor)}
361
- <ColorSidebarGradientPicker color={currentColor} {setColor} />
362
- {/if}
363
- </Tabs.Content>
364
- </Tabs.Root>
365
- {:else}
366
- <ColorPicker hex={currentColor} onChange={({ hex }) => setColor(hex, true)} />
367
- {/if}
368
- </Popover.Content>
369
- </Popover.Root>
370
- </div>
318
+ <div>
319
+ <div class="flex items-center gap-2 p-2">
320
+ <h5 class="text-left text-sm font-bold">Document colors</h5>
371
321
  </div>
372
- {#each documentColors as color}
322
+ <div class="grid grid-cols-6 items-stretch gap-1 p-2">
373
323
  <div class="relative h-0 w-full" style:padding-top="100%">
374
324
  <div class="absolute left-0 top-0 h-full w-full">
375
- <ColorSidebarColor {color} {currentColor} onclick={() => setColor(color)} />
325
+ <Popover.Root bind:open>
326
+ <Popover.Trigger
327
+ class={cn(
328
+ 'relative h-full w-full overflow-hidden rounded-full after:absolute after:inset-0 after:rounded-full after:transition-shadow',
329
+ open ? 'after:shadow-active' : 'hover:after:shadow-hover',
330
+ )}
331
+ >
332
+ <div
333
+ class="relative h-full w-full after:absolute after:inset-0 after:rounded-full after:shadow-inner-1"
334
+ >
335
+ <div
336
+ class="h-full w-full rounded-full"
337
+ style:background={`conic-gradient(red, orange, yellow, green, blue, indigo, violet, red)`}
338
+ ></div>
339
+ <span class="absolute inset-0 flex h-full w-full items-center justify-center">
340
+ <span
341
+ class="flex h-6 w-6 items-center justify-center rounded-full bg-background text-foreground"
342
+ >
343
+ <PlusIcon />
344
+ </span>
345
+ </span>
346
+ </div>
347
+ </Popover.Trigger>
348
+ <Popover.Content align="start" sideOffset={2} class="w-80 p-4">
349
+ {#if gradientsAllowed}
350
+ <Tabs.Root
351
+ value={isGradient(currentColor) ? 'gradient' : 'solid'}
352
+ class="w-full"
353
+ onValueChange={switchType}
354
+ >
355
+ <Tabs.List class="grid w-full grid-cols-2">
356
+ <Tabs.Trigger value="solid">Solid color</Tabs.Trigger>
357
+ <Tabs.Trigger value="gradient">Gradient</Tabs.Trigger>
358
+ </Tabs.List>
359
+ <Tabs.Content value="solid">
360
+ {#if !isGradient(currentColor)}
361
+ <ColorPicker hex={currentColor} onChange={({ hex }) => setColor(hex, true)} />
362
+ {/if}
363
+ </Tabs.Content>
364
+ <Tabs.Content value="gradient">
365
+ {#if isGradient(currentColor)}
366
+ <ColorSidebarGradientPicker color={currentColor} {setColor} />
367
+ {/if}
368
+ </Tabs.Content>
369
+ </Tabs.Root>
370
+ {:else}
371
+ <ColorPicker hex={currentColor} onChange={({ hex }) => setColor(hex, true)} />
372
+ {/if}
373
+ </Popover.Content>
374
+ </Popover.Root>
376
375
  </div>
377
376
  </div>
378
- {/each}
379
- </div>
380
- <div class="flex items-center gap-2 py-2">
381
- <!-- <PaletteIcon class="h-5 w-5" /> -->
382
- <h5 class="text-left text-sm font-bold">Default colors</h5>
383
- </div>
384
- <div class="text-muted-foreground text-xs">Solid colors</div>
385
- <div class="grid grid-cols-6 items-stretch gap-1">
386
- {#each Object.keys(defaultSolidColors) as color}
387
- <div class="relative h-0 w-full" style:padding-top="100%">
388
- <div class="absolute left-0 top-0 h-full w-full">
389
- <ColorSidebarColor {color} {currentColor} onclick={() => setColor(color)} />
377
+ {#each documentColors as color}
378
+ <div class="relative h-0 w-full" style:padding-top="100%">
379
+ <div class="absolute left-0 top-0 h-full w-full">
380
+ <ColorSidebarColor {color} {currentColor} onclick={() => setColor(color)} />
381
+ </div>
390
382
  </div>
391
- </div>
392
- {/each}
383
+ {/each}
384
+ </div>
393
385
  </div>
394
386
 
395
- {#if gradientsAllowed}
396
- <div class="text-muted-foreground text-xs">Gradients</div>
397
- <div class="grid grid-cols-6 items-stretch gap-1">
398
- {#each defaultGradients as color}
387
+ <div>
388
+ <div class="flex items-center gap-2 p-2">
389
+ <PaletteIcon class="h-5 w-5" />
390
+ <h5 class="text-left text-sm font-bold">Default solid colors</h5>
391
+ </div>
392
+ <div class="grid grid-cols-6 items-stretch gap-1 p-2">
393
+ {#each Object.keys(defaultSolidColors) as color}
399
394
  <div class="relative h-0 w-full" style:padding-top="100%">
400
395
  <div class="absolute left-0 top-0 h-full w-full">
401
396
  <ColorSidebarColor {color} {currentColor} onclick={() => setColor(color)} />
@@ -403,5 +398,20 @@
403
398
  </div>
404
399
  {/each}
405
400
  </div>
401
+ </div>
402
+
403
+ {#if gradientsAllowed}
404
+ <div>
405
+ <div class="text-xs text-muted-foreground">Gradients</div>
406
+ <div class="grid grid-cols-6 items-stretch gap-1">
407
+ {#each defaultGradients as color}
408
+ <div class="relative h-0 w-full" style:padding-top="100%">
409
+ <div class="absolute left-0 top-0 h-full w-full">
410
+ <ColorSidebarColor {color} {currentColor} onclick={() => setColor(color)} />
411
+ </div>
412
+ </div>
413
+ {/each}
414
+ </div>
415
+ </div>
406
416
  {/if}
407
417
  </SidebarWrapper>
@@ -1,3 +1,7 @@
1
- declare const ColorSidebar: import("svelte").Component<Record<string, never>, {}, "">;
1
+ import type { Editor } from '../../editor.svelte.js';
2
+ interface Props {
3
+ editor: Editor;
4
+ }
5
+ declare const ColorSidebar: import("svelte").Component<Props, {}, "">;
2
6
  type ColorSidebar = ReturnType<typeof ColorSidebar>;
3
7
  export default ColorSidebar;
@@ -8,7 +8,7 @@
8
8
  import { Button } from '../../../ui/button/index.js';
9
9
  import { Separator } from '../../../ui/separator/index.js';
10
10
  import { cn } from '../../../../utils.js';
11
- import { getEditorContext } from '../../editor.svelte.js';
11
+ import type { Editor } from '../../editor.svelte.js';
12
12
  import SidebarWrapper from '../sidebar-wrapper.svelte';
13
13
  import {
14
14
  createEditorNotReactive,
@@ -17,7 +17,11 @@
17
17
  } from '../../layers/types/text/editor/utils.js';
18
18
  import FontSidebarButton from './font-sidebar-button.svelte';
19
19
 
20
- const editor = getEditorContext();
20
+ interface Props {
21
+ editor: Editor;
22
+ }
23
+
24
+ const { editor }: Props = $props();
21
25
 
22
26
  let { htmlEditor } = editor;
23
27
 
@@ -133,7 +137,7 @@
133
137
  </script>
134
138
 
135
139
  <SidebarWrapper name="Font">
136
- <div class="relative flex items-center">
140
+ <div class="relative flex items-center p-2">
137
141
  <div class="pointer-events-none absolute flex w-10 items-center justify-center">
138
142
  {#if search}
139
143
  <Button variant="ghost" size="icon-xs" class="pointer-events-auto" onclick={cancelSearch}>
@@ -150,7 +154,7 @@
150
154
  oninput={() => (searchedPagesLoaded = 1)}
151
155
  />
152
156
  </div>
153
- <div class={cn('flex-1 overflow-y-auto', search && 'hidden')}>
157
+ <div class={cn('flex-1 overflow-y-auto p-2', search && 'hidden')}>
154
158
  <div class="flex items-center gap-2 py-2">
155
159
  <DocumentIcon class="h-6 w-6" />
156
160
  <h5 class="text-left text-sm font-bold">Document fonts</h5>
@@ -184,7 +188,7 @@
184
188
  </div>
185
189
 
186
190
  {#if search}
187
- <div class="flex-1 overflow-y-auto">
191
+ <div class="flex-1 overflow-y-auto p-2">
188
192
  {#if searchedFonts.length}
189
193
  <div class="flex items-center gap-2 py-2">
190
194
  <h5 class="text-left text-sm font-bold">All results</h5>
@@ -202,7 +206,7 @@
202
206
  </InfiniteLoader>
203
207
  </div>
204
208
  {:else}
205
- <p class="text-muted-foreground text-sm">
209
+ <p class="text-sm text-muted-foreground">
206
210
  We couldn't find any results for “{search}”. Try searching for something else.
207
211
  </p>
208
212
  {/if}
@@ -1,3 +1,7 @@
1
- declare const FontSidebar: import("svelte").Component<Record<string, never>, {}, "">;
1
+ import type { Editor } from '../../editor.svelte.js';
2
+ interface Props {
3
+ editor: Editor;
4
+ }
5
+ declare const FontSidebar: import("svelte").Component<Props, {}, "">;
2
6
  type FontSidebar = ReturnType<typeof FontSidebar>;
3
7
  export default FontSidebar;
@@ -1,22 +1,21 @@
1
1
  <script lang="ts">
2
- import XIcon from '@lucide/svelte/icons/x';
3
2
  import { Button } from '../../ui/button/index.js';
4
3
  import { Slider } from '../../ui/slider/index.js';
5
4
  import { Input } from '../../ui/input/index.js';
6
- import { getEditorContext } from '../editor.svelte.js';
5
+ import type { Editor } from '../editor.svelte.js';
7
6
  import {
8
7
  calculateImageLayerPropsForImageRotate,
9
8
  calculateRelativeRects,
10
9
  } from '../layers/utils.js';
11
10
  import type { ImageLayer } from '../types.js';
11
+ import SidebarWrapper from './sidebar-wrapper.svelte';
12
12
 
13
13
  interface Props {
14
+ editor: Editor;
14
15
  layer: ImageLayer;
15
16
  }
16
17
 
17
- let { layer }: Props = $props();
18
-
19
- const editor = $derived(getEditorContext());
18
+ let { editor, layer }: Props = $props();
20
19
 
21
20
  let value = $derived(Math.round(layer.imageRotate * 10) / 10);
22
21
  let originalLayer = $derived(
@@ -74,39 +73,31 @@
74
73
  });
75
74
  </script>
76
75
 
77
- <div class="flex h-full flex-col gap-2">
78
- <div class="flex items-center justify-between">
79
- <div class="text-sm font-bold">Crop</div>
80
- <Button variant="ghost" size="icon" onclick={() => (editor.imageCropLayer = null)}>
81
- <XIcon />
82
- </Button>
83
- </div>
84
- <div class="flex-1 resize-none overflow-y-auto">
85
- <div class="flex items-center gap-2">
86
- <div class="grow">
87
- <Slider
88
- type="single"
89
- {value}
90
- {min}
91
- {max}
92
- {step}
93
- onValueChange={(value) => setImageRotate(value)}
94
- onValueCommit={() => (layerCache = null)}
95
- />
96
- </div>
97
- <Input
98
- class="w-12 bg-transparent p-0 text-center font-semibold leading-none [&::-webkit-inner-spin-button]:appearance-none"
99
- inputmode="decimal"
100
- placeholder="--"
76
+ <SidebarWrapper name="Crop" onclose={() => (editor.imageCropLayer = null)}>
77
+ <div class="flex items-center gap-2 p-2">
78
+ <div class="grow">
79
+ <Slider
80
+ type="single"
101
81
  {value}
102
- onchange={(e) => setImageRotate(e.currentTarget.value)}
82
+ {min}
83
+ {max}
84
+ {step}
85
+ onValueChange={(value) => setImageRotate(value)}
86
+ onValueCommit={() => (layerCache = null)}
103
87
  />
104
88
  </div>
105
- <div class="flex justify-end gap-2 p-2">
106
- <Button class="flex-1" variant="outline" onclick={() => (editor.imageCropLayer = null)}>
107
- Cancel
108
- </Button>
109
- <Button class="flex-1" onclick={applyChanges}>Done</Button>
110
- </div>
89
+ <Input
90
+ class="w-12 bg-transparent p-0 text-center font-semibold leading-none [&::-webkit-inner-spin-button]:appearance-none"
91
+ inputmode="decimal"
92
+ placeholder="--"
93
+ {value}
94
+ onchange={(e) => setImageRotate(e.currentTarget.value)}
95
+ />
96
+ </div>
97
+ <div class="flex justify-end gap-2 p-2">
98
+ <Button class="flex-1" variant="outline" onclick={() => (editor.imageCropLayer = null)}>
99
+ Cancel
100
+ </Button>
101
+ <Button class="flex-1" onclick={applyChanges}>Done</Button>
111
102
  </div>
112
- </div>
103
+ </SidebarWrapper>
@@ -1,5 +1,7 @@
1
+ import type { Editor } from '../editor.svelte.js';
1
2
  import type { ImageLayer } from '../types.js';
2
3
  interface Props {
4
+ editor: Editor;
3
5
  layer: ImageLayer;
4
6
  }
5
7
  declare const ImageCropSidebar: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,2 @@
1
+ import PositionSidebar from './position-sidebar.svelte';
2
+ export { PositionSidebar };
@@ -0,0 +1,2 @@
1
+ import PositionSidebar from './position-sidebar.svelte';
2
+ export { PositionSidebar };