@pixerate/editor-svelte 0.38.0 → 0.40.0
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/vector/VectorCanvas.svelte +2 -0
- package/dist/vector/VectorCanvas.svelte.d.ts.map +1 -1
- package/dist/vector/VectorEffectsPanel.svelte +160 -0
- package/dist/vector/VectorEffectsPanel.svelte.d.ts +15 -0
- package/dist/vector/VectorEffectsPanel.svelte.d.ts.map +1 -0
- package/dist/vector/VectorGradientAnnotator.svelte +39 -0
- package/dist/vector/VectorGradientAnnotator.svelte.d.ts +10 -0
- package/dist/vector/VectorGradientAnnotator.svelte.d.ts.map +1 -0
- package/dist/vector/VectorGradientDefs.svelte +21 -9
- package/dist/vector/VectorGradientDefs.svelte.d.ts +3 -2
- package/dist/vector/VectorGradientDefs.svelte.d.ts.map +1 -1
- package/dist/vector/VectorGradientEditor.svelte +166 -0
- package/dist/vector/VectorGradientEditor.svelte.d.ts +9 -0
- package/dist/vector/VectorGradientEditor.svelte.d.ts.map +1 -0
- package/dist/vector/VectorStylePanel.svelte +4 -0
- package/dist/vector/VectorStylePanel.svelte.d.ts.map +1 -1
- package/dist/vector/VectorToolbar.svelte +18 -4
- package/dist/vector/VectorToolbar.svelte.d.ts.map +1 -1
- package/dist/vector/index.d.ts +3 -0
- package/dist/vector/index.d.ts.map +1 -1
- package/dist/vector/index.js +3 -0
- package/package.json +2 -2
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
type VectorEditorController
|
|
17
17
|
} from '@pixerate/editor/vector';
|
|
18
18
|
import VectorGradientDefs from './VectorGradientDefs.svelte';
|
|
19
|
+
import VectorGradientAnnotator from './VectorGradientAnnotator.svelte';
|
|
19
20
|
import VectorSceneNodes from './VectorSceneNodes.svelte';
|
|
20
21
|
import VectorWidthPointEditor from './VectorWidthPointEditor.svelte';
|
|
21
22
|
import { vectorStateOf } from './subscribe.svelte.js';
|
|
@@ -247,6 +248,7 @@
|
|
|
247
248
|
{#each overlay.blend.anchors as a, i (i)}
|
|
248
249
|
<rect data-vector-blend-anchor={i} x={a.x - as / 2} y={a.y - as / 2} width={as} height={as} fill={a.hovered ? accentColor : THEME.handleFill} stroke={accentColor} />
|
|
249
250
|
{/each}
|
|
251
|
+
{#if overlay.gradient}<VectorGradientAnnotator annotator={overlay.gradient} {accentColor} />{/if}
|
|
250
252
|
{#if overlay.widthSpot}
|
|
251
253
|
<g data-vector-width-spot="">
|
|
252
254
|
<line x1={overlay.widthSpot.left.x} y1={overlay.widthSpot.left.y} x2={overlay.widthSpot.right.x} y2={overlay.widthSpot.right.y} stroke={accentColor} stroke-dasharray="3 2" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorCanvas.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorCanvas.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,EAQH,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"VectorCanvas.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorCanvas.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,EAQH,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAQjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAuQH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
VECTOR_EFFECT_MENU,
|
|
4
|
+
getVectorEffectsPanel,
|
|
5
|
+
type VectorEditorController,
|
|
6
|
+
type VectorEffectsPanelItem,
|
|
7
|
+
type VectorEffectType
|
|
8
|
+
} from '@pixerate/editor/vector';
|
|
9
|
+
import { vectorStateOf } from './subscribe.svelte.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The live path effects of the selection: add effects (to every selected node), and for one
|
|
13
|
+
* selected node list its stack (applied top to bottom) to turn on and off, reorder, remove and
|
|
14
|
+
* edit. Slider drags and typing are one undo step each. Expand Appearance bakes the effects and
|
|
15
|
+
* live booleans into plain paths.
|
|
16
|
+
*/
|
|
17
|
+
interface Props {
|
|
18
|
+
controller: VectorEditorController;
|
|
19
|
+
class?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let { controller, class: className = '' }: Props = $props();
|
|
23
|
+
|
|
24
|
+
const store = vectorStateOf(() => controller);
|
|
25
|
+
const view = $derived(store.current);
|
|
26
|
+
const panel = $derived(getVectorEffectsPanel(view));
|
|
27
|
+
|
|
28
|
+
const buttonClass =
|
|
29
|
+
'inline-flex h-7 min-w-7 items-center justify-center rounded-md border border-border bg-background px-1.5 text-xs font-medium text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40';
|
|
30
|
+
const numberClass = 'h-7 w-16 rounded border border-border bg-background px-1.5 text-xs';
|
|
31
|
+
const selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';
|
|
32
|
+
/** Parameter names sit on their own line in a narrow panel, the controls below. */
|
|
33
|
+
const labelClass = 'w-full truncate text-[11px] text-muted-foreground';
|
|
34
|
+
|
|
35
|
+
const end = () => controller.endMergedEdit();
|
|
36
|
+
function set(e: VectorEffectsPanelItem, key: string, value: unknown, merge: boolean) {
|
|
37
|
+
if (panel?.nodeId) controller.updateEffect(panel.nodeId, e.id, { params: { [key]: value } }, { merge });
|
|
38
|
+
}
|
|
39
|
+
function setNumber(e: VectorEffectsPanelItem, key: string, raw: string) {
|
|
40
|
+
const n = parseFloat(raw);
|
|
41
|
+
if (Number.isFinite(n)) set(e, key, n, true);
|
|
42
|
+
}
|
|
43
|
+
function setAxis(e: VectorEffectsPanelItem, key: string, axis: 'x' | 'y', raw: string) {
|
|
44
|
+
const n = parseFloat(raw);
|
|
45
|
+
const v = vecOf(e, key);
|
|
46
|
+
if (Number.isFinite(n)) set(e, key, { ...v, [axis]: n }, true);
|
|
47
|
+
}
|
|
48
|
+
const vecOf = (e: VectorEffectsPanelItem, key: string) => (e.params[key] as { x: number; y: number } | undefined) ?? { x: 0, y: 0 };
|
|
49
|
+
const round = (n: number) => Math.round(n * 1000) / 1000;
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
{#if panel}
|
|
53
|
+
<div class="space-y-2 {className}" data-vector-effects="" aria-label="Effects">
|
|
54
|
+
<div class="flex items-center gap-2">
|
|
55
|
+
<span class="w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">Effects</span>
|
|
56
|
+
<select
|
|
57
|
+
aria-label="Add effect"
|
|
58
|
+
class={selectClass}
|
|
59
|
+
value=""
|
|
60
|
+
onchange={(ev) => {
|
|
61
|
+
const type = ev.currentTarget.value;
|
|
62
|
+
ev.currentTarget.value = '';
|
|
63
|
+
if (type) controller.addEffect(type as VectorEffectType);
|
|
64
|
+
}}
|
|
65
|
+
>
|
|
66
|
+
<option value="">Add effect…</option>
|
|
67
|
+
{#each VECTOR_EFFECT_MENU as m (m.type)}<option value={m.type}>{m.label}</option>{/each}
|
|
68
|
+
</select>
|
|
69
|
+
<button type="button" class={buttonClass} title="Expand Appearance" aria-label="Expand Appearance" disabled={!panel.expandable} onclick={() => controller.expandAppearance()}>
|
|
70
|
+
Expand
|
|
71
|
+
</button>
|
|
72
|
+
</div>
|
|
73
|
+
{#if panel.count > 1}<p class="text-[11px] text-muted-foreground">Select one object to edit its effects.</p>{/if}
|
|
74
|
+
{#if panel.nodeId}
|
|
75
|
+
{@const nodeId = panel.nodeId}
|
|
76
|
+
{#each panel.effects as e, i (e.id)}
|
|
77
|
+
<div class="space-y-1 rounded border border-border p-1.5" data-vector-effect={e.id} data-vector-effect-type={e.type}>
|
|
78
|
+
<div class="flex items-center gap-1">
|
|
79
|
+
<label class="flex min-w-0 flex-1 items-center gap-1.5 text-xs font-medium text-foreground">
|
|
80
|
+
<input type="checkbox" aria-label="{e.label} on" checked={e.enabled} onchange={(ev) => controller.updateEffect(nodeId, e.id, { enabled: ev.currentTarget.checked })} />
|
|
81
|
+
<span class="truncate">{e.label}</span>
|
|
82
|
+
</label>
|
|
83
|
+
<button type="button" class={buttonClass} title="Move up" aria-label="Move {e.label} up" disabled={i === 0} onclick={() => controller.moveEffect(nodeId, e.id, i - 1)}>↑</button>
|
|
84
|
+
<button
|
|
85
|
+
type="button"
|
|
86
|
+
class={buttonClass}
|
|
87
|
+
title="Move down"
|
|
88
|
+
aria-label="Move {e.label} down"
|
|
89
|
+
disabled={i === panel.effects.length - 1}
|
|
90
|
+
onclick={() => controller.moveEffect(nodeId, e.id, i + 1)}>↓</button
|
|
91
|
+
>
|
|
92
|
+
<button type="button" class={buttonClass} title="Remove" aria-label="Remove {e.label}" onclick={() => controller.removeEffect(nodeId, e.id)}>×</button>
|
|
93
|
+
</div>
|
|
94
|
+
{#each e.specs as spec (spec.key)}
|
|
95
|
+
{#if spec.kind === 'number'}
|
|
96
|
+
{@const value = Number(e.params[spec.key] ?? 0)}
|
|
97
|
+
<label class="flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground" data-vector-effect-param={spec.key}>
|
|
98
|
+
<span class={labelClass}>{spec.label}</span>
|
|
99
|
+
{#if spec.slider}
|
|
100
|
+
<input
|
|
101
|
+
type="range"
|
|
102
|
+
min={spec.min}
|
|
103
|
+
max={spec.max}
|
|
104
|
+
step={spec.step}
|
|
105
|
+
aria-label="{e.label} {spec.label} slider"
|
|
106
|
+
class="h-4 min-w-0 flex-1 accent-primary"
|
|
107
|
+
{value}
|
|
108
|
+
oninput={(ev) => setNumber(e, spec.key, ev.currentTarget.value)}
|
|
109
|
+
onpointerup={end}
|
|
110
|
+
onkeyup={end}
|
|
111
|
+
onblur={end}
|
|
112
|
+
/>
|
|
113
|
+
{/if}
|
|
114
|
+
<input
|
|
115
|
+
type="number"
|
|
116
|
+
min={spec.min}
|
|
117
|
+
max={spec.max}
|
|
118
|
+
step={spec.step}
|
|
119
|
+
aria-label="{e.label} {spec.label}"
|
|
120
|
+
class={numberClass}
|
|
121
|
+
value={round(value)}
|
|
122
|
+
oninput={(ev) => setNumber(e, spec.key, ev.currentTarget.value)}
|
|
123
|
+
onblur={end}
|
|
124
|
+
/>
|
|
125
|
+
</label>
|
|
126
|
+
{:else if spec.kind === 'vec2'}
|
|
127
|
+
{@const v = vecOf(e, spec.key)}
|
|
128
|
+
<div class="flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground" data-vector-effect-param={spec.key}>
|
|
129
|
+
<span class={labelClass}>{spec.label}</span>
|
|
130
|
+
{#each ['x', 'y'] as const as axis (axis)}
|
|
131
|
+
<input
|
|
132
|
+
type="number"
|
|
133
|
+
step={spec.step}
|
|
134
|
+
aria-label="{e.label} {spec.label} {axis}"
|
|
135
|
+
class={numberClass}
|
|
136
|
+
value={round(v[axis])}
|
|
137
|
+
oninput={(ev) => setAxis(e, spec.key, axis, ev.currentTarget.value)}
|
|
138
|
+
onblur={end}
|
|
139
|
+
/>
|
|
140
|
+
{/each}
|
|
141
|
+
</div>
|
|
142
|
+
{:else if spec.kind === 'boolean'}
|
|
143
|
+
<label class="flex items-center gap-2 text-xs text-foreground" data-vector-effect-param={spec.key}>
|
|
144
|
+
<span class="min-w-0 flex-1 truncate">{spec.label}</span>
|
|
145
|
+
<input type="checkbox" aria-label="{e.label} {spec.label}" checked={!!e.params[spec.key]} onchange={(ev) => set(e, spec.key, ev.currentTarget.checked, false)} />
|
|
146
|
+
</label>
|
|
147
|
+
{:else}
|
|
148
|
+
<label class="flex flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-foreground" data-vector-effect-param={spec.key}>
|
|
149
|
+
<span class={labelClass}>{spec.label}</span>
|
|
150
|
+
<select aria-label="{e.label} {spec.label}" class={selectClass} value={String(e.params[spec.key] ?? '')} onchange={(ev) => set(e, spec.key, ev.currentTarget.value, false)}>
|
|
151
|
+
{#each spec.options as o (o.value)}<option value={o.value}>{o.label}</option>{/each}
|
|
152
|
+
</select>
|
|
153
|
+
</label>
|
|
154
|
+
{/if}
|
|
155
|
+
{/each}
|
|
156
|
+
</div>
|
|
157
|
+
{/each}
|
|
158
|
+
{/if}
|
|
159
|
+
</div>
|
|
160
|
+
{/if}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type VectorEditorController } from '@pixerate/editor/vector';
|
|
2
|
+
/**
|
|
3
|
+
* The live path effects of the selection: add effects (to every selected node), and for one
|
|
4
|
+
* selected node list its stack (applied top to bottom) to turn on and off, reorder, remove and
|
|
5
|
+
* edit. Slider drags and typing are one undo step each. Expand Appearance bakes the effects and
|
|
6
|
+
* live booleans into plain paths.
|
|
7
|
+
*/
|
|
8
|
+
interface Props {
|
|
9
|
+
controller: VectorEditorController;
|
|
10
|
+
class?: string;
|
|
11
|
+
}
|
|
12
|
+
declare const VectorEffectsPanel: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type VectorEffectsPanel = ReturnType<typeof VectorEffectsPanel>;
|
|
14
|
+
export default VectorEffectsPanel;
|
|
15
|
+
//# sourceMappingURL=VectorEffectsPanel.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorEffectsPanel.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorEffectsPanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,KAAK,sBAAsB,EAG5B,MAAM,yBAAyB,CAAC;AAIjC;;;;;GAKG;AACH,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0GH,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { VECTOR_OVERLAY_THEME as THEME, vectorDiamondPath, type VectorRenderGradientAnnotator } from '@pixerate/editor/vector';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
/** The gradient tool's annotator (screen space) from `getVectorOverlayRenderData`. */
|
|
6
|
+
annotator: VectorRenderGradientAnnotator;
|
|
7
|
+
accentColor?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let { annotator: g, accentColor = THEME.accent }: Props = $props();
|
|
11
|
+
const r = THEME.handleRadius + 1.5;
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<g data-vector-gradient-annotator={g.type}>
|
|
15
|
+
{#if g.extent}<path data-vector-gradient-extent="" d={g.extent} fill="none" stroke={accentColor} stroke-dasharray="4 3" />{/if}
|
|
16
|
+
<line x1={g.start.x} y1={g.start.y} x2={g.end.x} y2={g.end.y} stroke="#ffffff" stroke-width="3" />
|
|
17
|
+
<line data-vector-gradient-bar="" x1={g.start.x} y1={g.start.y} x2={g.end.x} y2={g.end.y} stroke={accentColor} />
|
|
18
|
+
{#if g.aspect}<line x1={g.start.x} y1={g.start.y} x2={g.aspect.x} y2={g.aspect.y} stroke={accentColor} stroke-dasharray="2 2" />{/if}
|
|
19
|
+
<circle data-vector-gradient-handle="start" cx={g.start.x} cy={g.start.y} r={r + (g.start.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} stroke-width={g.start.hovered ? 2 : 1} />
|
|
20
|
+
<rect data-vector-gradient-handle={g.end.handle} x={g.end.x - r} y={g.end.y - r} width={2 * r} height={2 * r} fill={THEME.handleFill} stroke={accentColor} stroke-width={g.end.hovered ? 2 : 1} />
|
|
21
|
+
{#if g.aspect}
|
|
22
|
+
<circle data-vector-gradient-handle="aspect" cx={g.aspect.x} cy={g.aspect.y} r={THEME.handleRadius + (g.aspect.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} stroke-width={g.aspect.hovered ? 2 : 1} />
|
|
23
|
+
{/if}
|
|
24
|
+
{#if g.focal}
|
|
25
|
+
<g data-vector-gradient-handle="focal">
|
|
26
|
+
<circle cx={g.focal.x} cy={g.focal.y} r={THEME.handleRadius - 1 + (g.focal.hovered ? 1 : 0)} fill={accentColor} stroke={THEME.handleFill} />
|
|
27
|
+
</g>
|
|
28
|
+
{/if}
|
|
29
|
+
{#each g.midpoints as m (m.index)}
|
|
30
|
+
<path data-vector-gradient-midpoint={m.index} d={vectorDiamondPath(m.x, m.y, 4 + (m.hovered ? 1 : 0))} fill={THEME.handleFill} stroke={accentColor} />
|
|
31
|
+
{/each}
|
|
32
|
+
{#each g.stops as s (s.index)}
|
|
33
|
+
<g data-vector-gradient-stop={s.index} data-selected={s.selected || undefined} opacity={g.removing && s.selected ? 0.35 : 1}>
|
|
34
|
+
<line x1={s.barX} y1={s.barY} x2={s.x} y2={s.y} stroke={accentColor} />
|
|
35
|
+
<rect x={s.x - 5} y={s.y - 5} width="10" height="10" rx="2" fill={s.color} fill-opacity={s.opacity} stroke={s.selected ? accentColor : '#ffffff'} stroke-width={s.selected || s.hovered ? 2 : 1} />
|
|
36
|
+
<rect x={s.x - 6.5} y={s.y - 6.5} width="13" height="13" rx="3" fill="none" stroke={s.selected ? '#ffffff' : accentColor} />
|
|
37
|
+
</g>
|
|
38
|
+
{/each}
|
|
39
|
+
</g>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type VectorRenderGradientAnnotator } from '@pixerate/editor/vector';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** The gradient tool's annotator (screen space) from `getVectorOverlayRenderData`. */
|
|
4
|
+
annotator: VectorRenderGradientAnnotator;
|
|
5
|
+
accentColor?: string;
|
|
6
|
+
}
|
|
7
|
+
declare const VectorGradientAnnotator: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type VectorGradientAnnotator = ReturnType<typeof VectorGradientAnnotator>;
|
|
9
|
+
export default VectorGradientAnnotator;
|
|
10
|
+
//# sourceMappingURL=VectorGradientAnnotator.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorGradientAnnotator.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorGradientAnnotator.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoD,KAAK,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAG7H,UAAU,KAAK;IACb,sFAAsF;IACtF,SAAS,EAAE,6BAA6B,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAsCH,QAAA,MAAM,uBAAuB,2CAAwC,CAAC;AACtE,KAAK,uBAAuB,GAAG,UAAU,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAC1E,eAAe,uBAAuB,CAAC"}
|
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { SvgGradientDef } from '@pixerate/editor/vector';
|
|
2
|
+
import type { SvgGradientDef, VectorPaintDef } from '@pixerate/editor/vector';
|
|
3
3
|
|
|
4
4
|
interface Props {
|
|
5
|
-
|
|
5
|
+
/** Paint servers: gradient descriptors and patterns of gradient tiles (conic, diamond, stroke modes). */
|
|
6
|
+
defs: readonly VectorPaintDef[];
|
|
6
7
|
}
|
|
7
8
|
|
|
8
9
|
let { defs }: Props = $props();
|
|
9
10
|
</script>
|
|
10
11
|
|
|
12
|
+
{#snippet gradient(def: SvgGradientDef)}
|
|
13
|
+
{#if def.type === 'radial'}
|
|
14
|
+
<radialGradient id={def.id} {...def.attrs}>
|
|
15
|
+
{#each def.stops as s, i (i)}<stop offset={s.offset} stop-color={s.stopColor} stop-opacity={s.stopOpacity} />{/each}
|
|
16
|
+
</radialGradient>
|
|
17
|
+
{:else}
|
|
18
|
+
<linearGradient id={def.id} {...def.attrs}>
|
|
19
|
+
{#each def.stops as s, i (i)}<stop offset={s.offset} stop-color={s.stopColor} stop-opacity={s.stopOpacity} />{/each}
|
|
20
|
+
</linearGradient>
|
|
21
|
+
{/if}
|
|
22
|
+
{/snippet}
|
|
23
|
+
|
|
11
24
|
{#if defs.length}
|
|
12
25
|
<defs>
|
|
13
26
|
{#each defs as def (def.id)}
|
|
14
|
-
{#if def.type === '
|
|
15
|
-
<
|
|
16
|
-
{#each def.
|
|
17
|
-
|
|
27
|
+
{#if def.type === 'pattern'}
|
|
28
|
+
<pattern id={def.id} {...def.attrs}>
|
|
29
|
+
{#each def.gradients as g (g.id)}{@render gradient(g)}{/each}
|
|
30
|
+
{#each def.tiles as t, i (i)}<path d={t.d} fill={t.fill} />{/each}
|
|
31
|
+
</pattern>
|
|
18
32
|
{:else}
|
|
19
|
-
|
|
20
|
-
{#each def.stops as s, i (i)}<stop offset={s.offset} stop-color={s.stopColor} stop-opacity={s.stopOpacity} />{/each}
|
|
21
|
-
</linearGradient>
|
|
33
|
+
{@render gradient(def)}
|
|
22
34
|
{/if}
|
|
23
35
|
{/each}
|
|
24
36
|
</defs>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { VectorPaintDef } from '@pixerate/editor/vector';
|
|
2
2
|
interface Props {
|
|
3
|
-
|
|
3
|
+
/** Paint servers: gradient descriptors and patterns of gradient tiles (conic, diamond, stroke modes). */
|
|
4
|
+
defs: readonly VectorPaintDef[];
|
|
4
5
|
}
|
|
5
6
|
declare const VectorGradientDefs: import("svelte").Component<Props, {}, "">;
|
|
6
7
|
type VectorGradientDefs = ReturnType<typeof VectorGradientDefs>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorGradientDefs.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorGradientDefs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"VectorGradientDefs.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorGradientDefs.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG5E,UAAU,KAAK;IACb,yGAAyG;IACzG,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CACjC;AAqCH,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import {
|
|
3
|
+
VECTOR_GRADIENT_TYPES,
|
|
4
|
+
VECTOR_GRADIENT_SPREADS,
|
|
5
|
+
VECTOR_GRADIENT_INTERPOLATIONS,
|
|
6
|
+
VECTOR_STROKE_GRADIENT_MODES,
|
|
7
|
+
VECTOR_GRADIENT_TYPE_LABELS,
|
|
8
|
+
VECTOR_GRADIENT_SPREAD_LABELS,
|
|
9
|
+
VECTOR_GRADIENT_INTERPOLATION_LABELS,
|
|
10
|
+
VECTOR_STROKE_GRADIENT_MODE_LABELS,
|
|
11
|
+
getVectorGradientEditor,
|
|
12
|
+
vectorPaintToHex,
|
|
13
|
+
type VectorEditorController,
|
|
14
|
+
type VectorGradientInterpolation,
|
|
15
|
+
type VectorGradientSpread,
|
|
16
|
+
type VectorGradientType,
|
|
17
|
+
type VectorStrokeGradientMode
|
|
18
|
+
} from '@pixerate/editor/vector';
|
|
19
|
+
import { vectorStateOf } from './subscribe.svelte.js';
|
|
20
|
+
|
|
21
|
+
interface Props {
|
|
22
|
+
controller: VectorEditorController;
|
|
23
|
+
class?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Gradient editor for the selection's fill or stroke: style (or solid), the stop ramp (click it
|
|
28
|
+
* to add a stop, pick a stop to edit its colour, opacity, position and midpoint), interpolation
|
|
29
|
+
* space, smoothness, spread, how it lies on a stroke, and reverse.
|
|
30
|
+
*/
|
|
31
|
+
let { controller, class: className = '' }: Props = $props();
|
|
32
|
+
|
|
33
|
+
const store = vectorStateOf(() => controller);
|
|
34
|
+
const ed = $derived(getVectorGradientEditor(store.current));
|
|
35
|
+
const selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';
|
|
36
|
+
const numberClass = 'h-7 w-14 rounded border border-border bg-background px-1.5 text-xs';
|
|
37
|
+
const buttonClass =
|
|
38
|
+
'inline-flex h-7 min-w-7 items-center justify-center rounded border border-border bg-background px-1.5 text-xs text-foreground hover:bg-muted disabled:cursor-not-allowed disabled:opacity-40 aria-pressed:bg-primary aria-pressed:text-primary-foreground';
|
|
39
|
+
const percent = (v: number) => Math.round(v * 1000) / 10;
|
|
40
|
+
const end = () => controller.endMergedEdit();
|
|
41
|
+
|
|
42
|
+
function setType(value: string) {
|
|
43
|
+
if (!ed) return;
|
|
44
|
+
if (value === 'solid') {
|
|
45
|
+
const first = ed.stops[0];
|
|
46
|
+
controller.setStyle({ [ed.target]: vectorPaintToHex(first?.color) ?? first?.color ?? '#000000' }, undefined, { label: 'Solid Colour' });
|
|
47
|
+
} else controller.setGradient({ type: value as VectorGradientType });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function numberOf(e: Event & { currentTarget: HTMLInputElement }, fn: (n: number) => void) {
|
|
51
|
+
const n = parseFloat(e.currentTarget.value);
|
|
52
|
+
if (Number.isFinite(n)) fn(n);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function addAt(e: MouseEvent & { currentTarget: HTMLElement }) {
|
|
56
|
+
const r = e.currentTarget.getBoundingClientRect();
|
|
57
|
+
controller.addGradientStop(r.width > 0 ? Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) : 0.5);
|
|
58
|
+
}
|
|
59
|
+
</script>
|
|
60
|
+
|
|
61
|
+
{#if ed}
|
|
62
|
+
{@const sel = ed.selected}
|
|
63
|
+
<div class="space-y-1.5 {className}" data-vector-gradient-editor={ed.target} aria-label="Gradient">
|
|
64
|
+
<div class="flex items-center gap-1.5">
|
|
65
|
+
<span class="w-16 text-xs text-foreground">Gradient</span>
|
|
66
|
+
{#each ['fill', 'stroke'] as const as t (t)}
|
|
67
|
+
<button type="button" class={buttonClass} aria-pressed={ed.target === t} onclick={() => controller.setGradientTarget(t)}>{t === 'fill' ? 'Fill' : 'Stroke'}</button>
|
|
68
|
+
{/each}
|
|
69
|
+
{#if ed.mixed}<span class="text-[11px] text-muted-foreground">Mixed</span>{/if}
|
|
70
|
+
</div>
|
|
71
|
+
<div class="flex items-center gap-1.5">
|
|
72
|
+
<span class="w-16 text-xs text-foreground">Type</span>
|
|
73
|
+
<select aria-label="Gradient type" class={selectClass} value={ed.type ?? 'solid'} onchange={(e) => setType(e.currentTarget.value)}>
|
|
74
|
+
<option value="solid">Solid</option>
|
|
75
|
+
{#each VECTOR_GRADIENT_TYPES as t (t)}<option value={t}>{VECTOR_GRADIENT_TYPE_LABELS[t]}</option>{/each}
|
|
76
|
+
</select>
|
|
77
|
+
<button type="button" class={buttonClass} aria-label="Reverse gradient" title="Reverse gradient" disabled={!ed.gradient} onclick={() => controller.reverseGradient()}>⇄</button>
|
|
78
|
+
</div>
|
|
79
|
+
{#if ed.gradient}
|
|
80
|
+
<div class="relative h-8" data-vector-gradient-ramp="">
|
|
81
|
+
<div
|
|
82
|
+
role="button"
|
|
83
|
+
tabindex="-1"
|
|
84
|
+
aria-label="Add gradient stop"
|
|
85
|
+
class="absolute inset-x-1.5 top-0 h-4 cursor-copy rounded border border-border"
|
|
86
|
+
style="background-image: {ed.preview}, repeating-conic-gradient(#ddd 0% 25%, #fff 0% 50%); background-size: auto, 8px 8px"
|
|
87
|
+
onclick={addAt}
|
|
88
|
+
onkeydown={() => {}}
|
|
89
|
+
></div>
|
|
90
|
+
{#each ed.stops as s (s.index)}
|
|
91
|
+
<button
|
|
92
|
+
type="button"
|
|
93
|
+
data-vector-gradient-stop={s.index}
|
|
94
|
+
aria-label="Gradient stop {s.index + 1} at {percent(s.offset)}%"
|
|
95
|
+
aria-pressed={s.selected}
|
|
96
|
+
class="absolute top-4 h-3.5 w-3 -translate-x-1/2 rounded-sm border border-border aria-pressed:ring-2 aria-pressed:ring-primary"
|
|
97
|
+
style="left: calc(6px + (100% - 12px) * {s.offset}); background: {s.color}; opacity: {0.4 + 0.6 * (s.opacity ?? 1)}"
|
|
98
|
+
onclick={() => controller.selectGradientStop(s.selected ? null : s.index)}
|
|
99
|
+
></button>
|
|
100
|
+
{/each}
|
|
101
|
+
</div>
|
|
102
|
+
{#if sel}
|
|
103
|
+
<div class="flex flex-wrap items-center gap-1.5" data-vector-gradient-selected-stop={sel.index}>
|
|
104
|
+
<input
|
|
105
|
+
type="color"
|
|
106
|
+
aria-label="Stop colour"
|
|
107
|
+
class="h-7 w-9 cursor-pointer rounded border border-border bg-background"
|
|
108
|
+
value={vectorPaintToHex(sel.color) ?? '#000000'}
|
|
109
|
+
oninput={(e) => controller.setGradientStop(sel.index, { color: e.currentTarget.value }, { merge: `gradient-stop-color-${sel.index}` })}
|
|
110
|
+
onblur={end}
|
|
111
|
+
/>
|
|
112
|
+
<label class="flex items-center gap-1 text-[11px] text-muted-foreground">
|
|
113
|
+
Opacity
|
|
114
|
+
<input type="number" min="0" max="100" step="5" aria-label="Stop opacity" class={numberClass} value={percent(sel.opacity ?? 1)} oninput={(e) => numberOf(e, (n) => controller.setGradientStop(sel.index, { opacity: n / 100 }))} />
|
|
115
|
+
</label>
|
|
116
|
+
<label class="flex items-center gap-1 text-[11px] text-muted-foreground">
|
|
117
|
+
At
|
|
118
|
+
<input type="number" min="0" max="100" step="1" aria-label="Stop position" class={numberClass} value={percent(sel.offset)} oninput={(e) => numberOf(e, (n) => controller.setGradientStop(sel.index, { offset: n / 100 }))} />
|
|
119
|
+
</label>
|
|
120
|
+
{#if !sel.last}
|
|
121
|
+
<label class="flex items-center gap-1 text-[11px] text-muted-foreground">
|
|
122
|
+
Midpoint
|
|
123
|
+
<input type="number" min="5" max="95" step="1" aria-label="Stop midpoint" class={numberClass} value={percent(sel.midpoint ?? 0.5)} oninput={(e) => numberOf(e, (n) => controller.setGradientStop(sel.index, { midpoint: n / 100 }))} />
|
|
124
|
+
</label>
|
|
125
|
+
{/if}
|
|
126
|
+
<button type="button" class={buttonClass} aria-label="Delete stop" title="Delete stop" disabled={ed.stops.length <= 2} onclick={() => controller.removeGradientStop(sel.index)}>✕</button>
|
|
127
|
+
</div>
|
|
128
|
+
{/if}
|
|
129
|
+
<label class="flex items-center gap-1.5 text-xs text-foreground">
|
|
130
|
+
<span class="w-16">Colours</span>
|
|
131
|
+
<select aria-label="Gradient interpolation" class={selectClass} value={ed.interpolation} onchange={(e) => controller.setGradient({ interpolation: e.currentTarget.value as VectorGradientInterpolation })}>
|
|
132
|
+
{#each VECTOR_GRADIENT_INTERPOLATIONS as i (i)}<option value={i}>{VECTOR_GRADIENT_INTERPOLATION_LABELS[i]}</option>{/each}
|
|
133
|
+
</select>
|
|
134
|
+
</label>
|
|
135
|
+
<label class="flex items-center gap-1.5 text-xs text-foreground">
|
|
136
|
+
<span class="w-16">Smooth</span>
|
|
137
|
+
<input
|
|
138
|
+
type="range"
|
|
139
|
+
min="0"
|
|
140
|
+
max="1"
|
|
141
|
+
step="0.05"
|
|
142
|
+
aria-label="Gradient smoothness"
|
|
143
|
+
class="h-4 flex-1 accent-primary"
|
|
144
|
+
value={ed.smoothness}
|
|
145
|
+
oninput={(e) => controller.setGradient({ smoothness: parseFloat(e.currentTarget.value) }, { merge: 'gradient-smoothness' })}
|
|
146
|
+
onpointerup={end}
|
|
147
|
+
onblur={end}
|
|
148
|
+
/>
|
|
149
|
+
</label>
|
|
150
|
+
<label class="flex items-center gap-1.5 text-xs text-foreground">
|
|
151
|
+
<span class="w-16">Spread</span>
|
|
152
|
+
<select aria-label="Gradient spread" class={selectClass} value={ed.spread} onchange={(e) => controller.setGradient({ spread: e.currentTarget.value as VectorGradientSpread })}>
|
|
153
|
+
{#each VECTOR_GRADIENT_SPREADS as sp (sp)}<option value={sp}>{VECTOR_GRADIENT_SPREAD_LABELS[sp]}</option>{/each}
|
|
154
|
+
</select>
|
|
155
|
+
</label>
|
|
156
|
+
{#if ed.target === 'stroke'}
|
|
157
|
+
<label class="flex items-center gap-1.5 text-xs text-foreground">
|
|
158
|
+
<span class="w-16">On stroke</span>
|
|
159
|
+
<select aria-label="Gradient on stroke" class={selectClass} value={ed.strokeMode} onchange={(e) => controller.setGradient({ strokeMode: e.currentTarget.value as VectorStrokeGradientMode })}>
|
|
160
|
+
{#each VECTOR_STROKE_GRADIENT_MODES as m (m)}<option value={m}>{VECTOR_STROKE_GRADIENT_MODE_LABELS[m]}</option>{/each}
|
|
161
|
+
</select>
|
|
162
|
+
</label>
|
|
163
|
+
{/if}
|
|
164
|
+
{/if}
|
|
165
|
+
</div>
|
|
166
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type VectorEditorController } from '@pixerate/editor/vector';
|
|
2
|
+
interface Props {
|
|
3
|
+
controller: VectorEditorController;
|
|
4
|
+
class?: string;
|
|
5
|
+
}
|
|
6
|
+
declare const VectorGradientEditor: import("svelte").Component<Props, {}, "">;
|
|
7
|
+
type VectorGradientEditor = ReturnType<typeof VectorGradientEditor>;
|
|
8
|
+
export default VectorGradientEditor;
|
|
9
|
+
//# sourceMappingURL=VectorGradientEditor.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VectorGradientEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorGradientEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAWH,KAAK,sBAAsB,EAK5B,MAAM,yBAAyB,CAAC;AAIjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoHH,QAAA,MAAM,oBAAoB,2CAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
|
|
@@ -17,6 +17,8 @@
|
|
|
17
17
|
} from '@pixerate/editor/vector';
|
|
18
18
|
import { vectorStateOf } from './subscribe.svelte.js';
|
|
19
19
|
import { vectorButtonClass } from './styles.js';
|
|
20
|
+
import VectorEffectsPanel from './VectorEffectsPanel.svelte';
|
|
21
|
+
import VectorGradientEditor from './VectorGradientEditor.svelte';
|
|
20
22
|
|
|
21
23
|
interface Props {
|
|
22
24
|
controller: VectorEditorController;
|
|
@@ -102,6 +104,7 @@
|
|
|
102
104
|
{#if style?.mixed[key]}<span class="text-[11px] text-muted-foreground">Mixed</span>{/if}
|
|
103
105
|
</div>
|
|
104
106
|
{/each}
|
|
107
|
+
{#if style}<VectorGradientEditor {controller} />{/if}
|
|
105
108
|
<label class="flex items-center gap-2 text-xs text-foreground">
|
|
106
109
|
<span class="w-16">Width</span>
|
|
107
110
|
<input
|
|
@@ -217,5 +220,6 @@
|
|
|
217
220
|
oninput={(e) => apply({ opacity: parseFloat(e.currentTarget.value) })}
|
|
218
221
|
/>
|
|
219
222
|
</label>
|
|
223
|
+
<VectorEffectsPanel {controller} />
|
|
220
224
|
{/if}
|
|
221
225
|
</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorStylePanel.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorStylePanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAYH,KAAK,sBAAsB,EAG5B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"VectorStylePanel.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorStylePanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAYH,KAAK,sBAAsB,EAG5B,MAAM,yBAAyB,CAAC;AAOjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6JH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
|
|
@@ -50,11 +50,14 @@
|
|
|
50
50
|
const points = $derived(view.tool === 'direct' ? view.selectedAnchors.length : 0);
|
|
51
51
|
const groupSelected = $derived(view.selection.some((id) => controller.getNode(id)?.type === 'group'));
|
|
52
52
|
|
|
53
|
+
// Live booleans keep the operands editable; a lone live group or its operands take the operation too.
|
|
54
|
+
let live = $state(false);
|
|
55
|
+
const booleanDisabled = $derived(live ? count < 1 : count < 2);
|
|
53
56
|
const combine = $derived([
|
|
54
|
-
{ label: '∪', title: 'Union', run: () => controller.booleanOp('union'), disabled:
|
|
55
|
-
{ label: '−', title: 'Subtract', run: () => controller.booleanOp('subtract'), disabled:
|
|
56
|
-
{ label: '∩', title: 'Intersect', run: () => controller.booleanOp('intersect'), disabled:
|
|
57
|
-
{ label: '⊻', title: 'Exclude', run: () => controller.booleanOp('exclude'), disabled:
|
|
57
|
+
{ label: '∪', title: 'Union', run: () => controller.booleanOp('union', { live }), disabled: booleanDisabled },
|
|
58
|
+
{ label: '−', title: 'Subtract', run: () => controller.booleanOp('subtract', { live }), disabled: booleanDisabled },
|
|
59
|
+
{ label: '∩', title: 'Intersect', run: () => controller.booleanOp('intersect', { live }), disabled: booleanDisabled },
|
|
60
|
+
{ label: '⊻', title: 'Exclude', run: () => controller.booleanOp('exclude', { live }), disabled: booleanDisabled },
|
|
58
61
|
{ label: 'G', title: 'Group', run: () => controller.group(), disabled: count < 1 },
|
|
59
62
|
{ label: 'U', title: 'Ungroup', run: () => controller.ungroup(), disabled: !groupSelected }
|
|
60
63
|
]);
|
|
@@ -193,6 +196,17 @@
|
|
|
193
196
|
{/if}
|
|
194
197
|
{#if showArrange}
|
|
195
198
|
<div class="ml-1 flex items-center gap-1" role="group" aria-label="Combine">
|
|
199
|
+
<button
|
|
200
|
+
type="button"
|
|
201
|
+
data-vector-live-boolean=""
|
|
202
|
+
class={vectorButtonClass}
|
|
203
|
+
aria-pressed={live}
|
|
204
|
+
title="Live booleans: keep the shapes editable"
|
|
205
|
+
aria-label="Live booleans"
|
|
206
|
+
onclick={() => (live = !live)}
|
|
207
|
+
>
|
|
208
|
+
Live
|
|
209
|
+
</button>
|
|
196
210
|
{#each combine as item (item.title)}{@render action(item)}{/each}
|
|
197
211
|
</div>
|
|
198
212
|
<div class="ml-1 flex items-center gap-1" role="group" aria-label="Pathfinder">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VectorToolbar.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorToolbar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EASH,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAMjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,oCAAoC;IACpC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"VectorToolbar.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorToolbar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EASH,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAMjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,oCAAoC;IACpC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgIH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
package/dist/vector/index.d.ts
CHANGED
|
@@ -6,8 +6,11 @@ export { default as VectorCanvas } from "./VectorCanvas.svelte";
|
|
|
6
6
|
export { default as VectorWidthPointEditor } from "./VectorWidthPointEditor.svelte";
|
|
7
7
|
export { default as VectorToolbar } from "./VectorToolbar.svelte";
|
|
8
8
|
export { default as VectorStylePanel } from "./VectorStylePanel.svelte";
|
|
9
|
+
export { default as VectorEffectsPanel } from "./VectorEffectsPanel.svelte";
|
|
9
10
|
export { default as VectorSceneNodes } from "./VectorSceneNodes.svelte";
|
|
10
11
|
export { default as VectorGradientDefs } from "./VectorGradientDefs.svelte";
|
|
12
|
+
export { default as VectorGradientAnnotator } from "./VectorGradientAnnotator.svelte";
|
|
13
|
+
export { default as VectorGradientEditor } from "./VectorGradientEditor.svelte";
|
|
11
14
|
export * from "./createVectorEditor.svelte.js";
|
|
12
15
|
export { vectorStateOf } from "./subscribe.svelte.js";
|
|
13
16
|
export * from "./styles.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,cAAc,aAAa,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC7E,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vector/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChF,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,cAAc,aAAa,CAAC;AAE5B,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC7E,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
|
package/dist/vector/index.js
CHANGED
|
@@ -3,8 +3,11 @@ export { default as VectorCanvas } from "./VectorCanvas.svelte";
|
|
|
3
3
|
export { default as VectorWidthPointEditor } from "./VectorWidthPointEditor.svelte";
|
|
4
4
|
export { default as VectorToolbar } from "./VectorToolbar.svelte";
|
|
5
5
|
export { default as VectorStylePanel } from "./VectorStylePanel.svelte";
|
|
6
|
+
export { default as VectorEffectsPanel } from "./VectorEffectsPanel.svelte";
|
|
6
7
|
export { default as VectorSceneNodes } from "./VectorSceneNodes.svelte";
|
|
7
8
|
export { default as VectorGradientDefs } from "./VectorGradientDefs.svelte";
|
|
9
|
+
export { default as VectorGradientAnnotator } from "./VectorGradientAnnotator.svelte";
|
|
10
|
+
export { default as VectorGradientEditor } from "./VectorGradientEditor.svelte";
|
|
8
11
|
export * from "./createVectorEditor.svelte.js";
|
|
9
12
|
export { vectorStateOf } from "./subscribe.svelte.js";
|
|
10
13
|
export * from "./styles.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixerate/editor-svelte",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.40.0",
|
|
4
4
|
"description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
|
|
5
5
|
"author": "Pixerate",
|
|
6
6
|
"license": "MIT",
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
"@tiptap/extension-bubble-menu": "^2.11.5",
|
|
108
108
|
"@tiptap/extension-placeholder": "^2.11.5",
|
|
109
109
|
"@tiptap/starter-kit": "^2.11.5",
|
|
110
|
-
"@pixerate/editor": "0.
|
|
110
|
+
"@pixerate/editor": "0.43.0"
|
|
111
111
|
},
|
|
112
112
|
"peerDependencies": {
|
|
113
113
|
"@dagrejs/dagre": "^1.1.4",
|