@pixerate/editor-svelte 0.39.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.
@@ -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;AAOjC,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;AAqQH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,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,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
- defs: readonly SvgGradientDef[];
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 === 'radial'}
15
- <radialGradient id={def.id} {...def.attrs}>
16
- {#each def.stops as s, i (i)}<stop offset={s.offset} stop-color={s.stopColor} stop-opacity={s.stopOpacity} />{/each}
17
- </radialGradient>
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
- <linearGradient id={def.id} {...def.attrs}>
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 { SvgGradientDef } from '@pixerate/editor/vector';
1
+ import type { VectorPaintDef } from '@pixerate/editor/vector';
2
2
  interface Props {
3
- defs: readonly SvgGradientDef[];
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,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAG5D,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;CACjC;AA0BH,QAAA,MAAM,kBAAkB,2CAAwC,CAAC;AACjE,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAChE,eAAe,kBAAkB,CAAC"}
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"}
@@ -18,6 +18,7 @@
18
18
  import { vectorStateOf } from './subscribe.svelte.js';
19
19
  import { vectorButtonClass } from './styles.js';
20
20
  import VectorEffectsPanel from './VectorEffectsPanel.svelte';
21
+ import VectorGradientEditor from './VectorGradientEditor.svelte';
21
22
 
22
23
  interface Props {
23
24
  controller: VectorEditorController;
@@ -103,6 +104,7 @@
103
104
  {#if style?.mixed[key]}<span class="text-[11px] text-muted-foreground">Mixed</span>{/if}
104
105
  </div>
105
106
  {/each}
107
+ {#if style}<VectorGradientEditor {controller} />{/if}
106
108
  <label class="flex items-center gap-2 text-xs text-foreground">
107
109
  <span class="w-16">Width</span>
108
110
  <input
@@ -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;AAMjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2JH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,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"}
@@ -9,6 +9,8 @@ export { default as VectorStylePanel } from "./VectorStylePanel.svelte";
9
9
  export { default as VectorEffectsPanel } from "./VectorEffectsPanel.svelte";
10
10
  export { default as VectorSceneNodes } from "./VectorSceneNodes.svelte";
11
11
  export { default as VectorGradientDefs } from "./VectorGradientDefs.svelte";
12
+ export { default as VectorGradientAnnotator } from "./VectorGradientAnnotator.svelte";
13
+ export { default as VectorGradientEditor } from "./VectorGradientEditor.svelte";
12
14
  export * from "./createVectorEditor.svelte.js";
13
15
  export { vectorStateOf } from "./subscribe.svelte.js";
14
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,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,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"}
@@ -6,6 +6,8 @@ export { default as VectorStylePanel } from "./VectorStylePanel.svelte";
6
6
  export { default as VectorEffectsPanel } from "./VectorEffectsPanel.svelte";
7
7
  export { default as VectorSceneNodes } from "./VectorSceneNodes.svelte";
8
8
  export { default as VectorGradientDefs } from "./VectorGradientDefs.svelte";
9
+ export { default as VectorGradientAnnotator } from "./VectorGradientAnnotator.svelte";
10
+ export { default as VectorGradientEditor } from "./VectorGradientEditor.svelte";
9
11
  export * from "./createVectorEditor.svelte.js";
10
12
  export { vectorStateOf } from "./subscribe.svelte.js";
11
13
  export * from "./styles.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.39.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.42.0"
110
+ "@pixerate/editor": "0.43.0"
111
111
  },
112
112
  "peerDependencies": {
113
113
  "@dagrejs/dagre": "^1.1.4",