@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.
- package/dist/components/editor/active-layers.svelte +2 -2
- package/dist/components/editor/design.svelte +92 -0
- package/dist/components/editor/design.svelte.d.ts +8 -0
- package/dist/components/editor/editor.svelte +1 -1
- package/dist/components/editor/editor.svelte.js +14 -2
- package/dist/components/editor/header.svelte +1 -1
- package/dist/components/editor/index.d.ts +2 -1
- package/dist/components/editor/index.js +2 -1
- package/dist/components/editor/layers/active-layer-border.svelte +1 -1
- package/dist/components/editor/layers/buttons/border-button/border-button-colors.svelte +1 -1
- package/dist/components/editor/layers/controls/corner-scale-control/corner-scale-control.svelte +1 -1
- package/dist/components/editor/layers/controls/rotate-control/rotate-control.svelte +1 -1
- package/dist/components/editor/layers/controls/side-scale-control/side-scale-control.svelte +1 -1
- package/dist/components/editor/layers/layer-button.svelte +1 -1
- package/dist/components/editor/layers/types/background/background-layer-buttons.svelte +1 -1
- package/dist/components/editor/layers/types/image/controls/image-rotate-control/image-rotate-control.svelte +1 -1
- package/dist/components/editor/layers/types/image/controls/image-scale-control/image-scale-control.svelte +1 -1
- package/dist/components/editor/layers/types/image/image-layer-crop.svelte +2 -2
- package/dist/components/editor/page-editor.svelte +7 -0
- package/dist/components/editor/{pages-navigation/page-preview.svelte → page-preview.svelte} +4 -4
- package/dist/components/editor/{pages-navigation/page-preview.svelte.d.ts → page-preview.svelte.d.ts} +2 -2
- package/dist/components/editor/page-transition-preview.svelte +34 -0
- package/dist/components/editor/page-transition-preview.svelte.d.ts +9 -0
- package/dist/components/editor/page-with-transition.svelte +48 -0
- package/dist/components/editor/page-with-transition.svelte.d.ts +10 -0
- package/dist/components/editor/page.svelte +12 -19
- package/dist/components/editor/pages-navigation/pages-navigation-item.svelte +80 -20
- package/dist/components/editor/pages-navigation/pages-navigation.svelte +7 -4
- package/dist/components/editor/sidebar/color-sidebar/color-sidebar-color.svelte +2 -2
- package/dist/components/editor/sidebar/color-sidebar/color-sidebar-gradient-picker.svelte +5 -5
- package/dist/components/editor/sidebar/color-sidebar/color-sidebar.svelte +91 -81
- package/dist/components/editor/sidebar/color-sidebar/color-sidebar.svelte.d.ts +5 -1
- package/dist/components/editor/sidebar/font-sidebar/font-sidebar.svelte +10 -6
- package/dist/components/editor/sidebar/font-sidebar/font-sidebar.svelte.d.ts +5 -1
- package/dist/components/editor/sidebar/image-crop-sidebar.svelte +28 -37
- package/dist/components/editor/sidebar/image-crop-sidebar.svelte.d.ts +2 -0
- package/dist/components/editor/sidebar/position-sidebar/index.d.ts +2 -0
- package/dist/components/editor/sidebar/position-sidebar/index.js +2 -0
- package/dist/components/editor/sidebar/position-sidebar/position-sidebar.svelte +130 -0
- package/dist/components/editor/sidebar/position-sidebar/position-sidebar.svelte.d.ts +7 -0
- package/dist/components/editor/sidebar/sidebar-text-tab.svelte +7 -3
- package/dist/components/editor/sidebar/sidebar-text-tab.svelte.d.ts +5 -16
- package/dist/components/editor/sidebar/sidebar-uploads-tab.svelte +10 -8
- package/dist/components/editor/sidebar/sidebar-uploads-tab.svelte.d.ts +5 -1
- package/dist/components/editor/sidebar/sidebar-wrapper.svelte +4 -3
- package/dist/components/editor/sidebar/sidebar-wrapper.svelte.d.ts +1 -0
- package/dist/components/editor/sidebar/sidebar.svelte +20 -13
- package/dist/components/editor/sidebar/transition-sidebar/index.d.ts +2 -0
- package/dist/components/editor/sidebar/transition-sidebar/index.js +2 -0
- package/dist/components/editor/sidebar/transition-sidebar/transition-sidebar.svelte +257 -0
- package/dist/components/editor/sidebar/transition-sidebar/transition-sidebar.svelte.d.ts +7 -0
- package/dist/components/editor/snapping-guides.svelte +3 -3
- package/dist/components/editor/types.d.ts +40 -6
- package/dist/components/editor/utils.d.ts +2 -2
- package/dist/components/editor/utils.js +21 -0
- package/dist/components/ui/button/button.svelte +2 -1
- package/dist/components/ui/button/button.svelte.d.ts +3 -0
- package/dist/components/ui/color-picker/color-picker-alpha-grid.svelte +2 -1
- package/dist/components/ui/color-picker/color-picker.svelte +6 -6
- package/dist/components/ui/context-menu/context-menu-checkbox-item.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-content.svelte +3 -1
- package/dist/components/ui/context-menu/context-menu-group-heading.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-item.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-radio-item.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-separator.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-shortcut.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-sub-content.svelte +1 -1
- package/dist/components/ui/context-menu/context-menu-sub-trigger.svelte +1 -1
- package/dist/components/ui/dialog/dialog-content.svelte +4 -2
- package/dist/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-content.svelte +2 -0
- package/dist/components/ui/dropdown-menu/dropdown-menu-item.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +1 -1
- package/dist/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +1 -1
- package/dist/components/ui/input/input.svelte +1 -1
- package/dist/components/ui/slider/slider.svelte +3 -3
- package/dist/components/ui/tabs/index.d.ts +4 -4
- package/dist/components/ui/tabs/index.js +4 -4
- package/dist/components/ui/tabs/tabs-content.svelte +4 -4
- package/dist/components/ui/tabs/tabs-content.svelte.d.ts +1 -1
- package/dist/components/ui/tabs/tabs-list.svelte +5 -9
- package/dist/components/ui/tabs/tabs-list.svelte.d.ts +1 -1
- package/dist/components/ui/tabs/tabs-trigger.svelte +4 -4
- package/dist/components/ui/tabs/tabs-trigger.svelte.d.ts +1 -1
- package/dist/transitions/circleWipe.d.ts +10 -0
- package/dist/transitions/circleWipe.js +16 -0
- package/dist/transitions/lineWipe.d.ts +9 -0
- package/dist/transitions/lineWipe.js +17 -0
- package/dist/transitions/stack.d.ts +8 -0
- package/dist/transitions/stack.js +13 -0
- package/package.json +19 -19
- package/dist/components/editor/layers/types/image/image-layer-active.svelte +0 -36
- package/dist/components/editor/layers/types/image/image-layer-active.svelte.d.ts +0 -7
- package/dist/components/editor/sidebar/position-sidebar.svelte +0 -136
- 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
|
|
13
|
-
import PagePreview from '
|
|
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-
|
|
28
|
-
|
|
29
|
-
<div class="
|
|
30
|
-
|
|
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="
|
|
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
|
-
<
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
<
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
89
|
-
|
|
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
|
|
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
|
-
</
|
|
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
|
|
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
|
|
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
|
-
'
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
-
|
|
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 {
|
|
9
|
-
import type { HistoryAction, Gradient, ImageLayer, TextLayer, Layer
|
|
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
|
-
|
|
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
|
|
315
|
-
<
|
|
316
|
-
|
|
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
|
-
|
|
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
|
-
<
|
|
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
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
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
|
-
|
|
392
|
-
|
|
383
|
+
{/each}
|
|
384
|
+
</div>
|
|
393
385
|
</div>
|
|
394
386
|
|
|
395
|
-
|
|
396
|
-
<div class="
|
|
397
|
-
|
|
398
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 {
|
|
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
|
-
<
|
|
78
|
-
<div class="flex items-center
|
|
79
|
-
<div class="
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
82
|
+
{min}
|
|
83
|
+
{max}
|
|
84
|
+
{step}
|
|
85
|
+
onValueChange={(value) => setImageRotate(value)}
|
|
86
|
+
onValueCommit={() => (layerCache = null)}
|
|
103
87
|
/>
|
|
104
88
|
</div>
|
|
105
|
-
<
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
</
|
|
103
|
+
</SidebarWrapper>
|