@pixerate/editor-svelte 0.37.0 → 0.38.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.
@@ -0,0 +1,69 @@
1
+ <script lang="ts">
2
+ import {
3
+ VECTOR_BLEND_SPACINGS,
4
+ VECTOR_BLEND_SPACING_LABELS,
5
+ applyVectorBlendOptions,
6
+ getVectorBlendControls,
7
+ type VectorBlendSpacing,
8
+ type VectorEditorController
9
+ } from '@pixerate/editor/vector';
10
+ import { vectorStateOf } from './subscribe.svelte.js';
11
+ import { vectorButtonClass } from './styles.js';
12
+
13
+ /** Blend buttons and options: they edit the selected blends and the options new blends get. */
14
+ let { controller }: { controller: VectorEditorController } = $props();
15
+
16
+ const store = vectorStateOf(() => controller);
17
+ const blend = $derived(getVectorBlendControls(store.current));
18
+ const o = $derived(blend.options);
19
+ const selected = $derived(blend.ids.length > 0);
20
+ </script>
21
+
22
+ <div class="ml-1 flex items-center gap-1" role="group" aria-label="Blend" data-vector-blend-controls="">
23
+ <button type="button" data-vector-blend-action="make" class={vectorButtonClass} title="Make Blend" aria-label="Make Blend" disabled={!blend.canBlend} onclick={() => controller.blend()}>⧓</button>
24
+ <select
25
+ aria-label="Blend spacing"
26
+ class="h-7 rounded border border-border bg-background px-1 text-xs"
27
+ value={o.spacing}
28
+ onchange={(e) => applyVectorBlendOptions(controller, { spacing: e.currentTarget.value as VectorBlendSpacing })}
29
+ >
30
+ {#each VECTOR_BLEND_SPACINGS as sp (sp)}
31
+ <option value={sp}>{VECTOR_BLEND_SPACING_LABELS[sp]}</option>
32
+ {/each}
33
+ </select>
34
+ {#if o.spacing !== 'smoothColor'}
35
+ <input
36
+ type="number"
37
+ min={o.spacing === 'steps' ? 1 : 0.5}
38
+ step="1"
39
+ aria-label={o.spacing === 'steps' ? 'Blend steps' : 'Blend distance'}
40
+ class="h-7 w-16 rounded border border-border bg-background px-1.5 text-xs"
41
+ value={o.spacing === 'steps' ? o.steps : o.distance}
42
+ oninput={(e) => {
43
+ const n = parseFloat(e.currentTarget.value);
44
+ if (!Number.isFinite(n) || n <= 0) return;
45
+ applyVectorBlendOptions(controller, o.spacing === 'steps' ? { steps: n } : { distance: n });
46
+ }}
47
+ />
48
+ {/if}
49
+ <button
50
+ type="button"
51
+ data-vector-blend-action="orient"
52
+ class={vectorButtonClass}
53
+ aria-pressed={o.orientToSpine}
54
+ title="Orient steps to the spine"
55
+ aria-label="Orient to spine"
56
+ onclick={() => applyVectorBlendOptions(controller, { orientToSpine: !o.orientToSpine })}>⤿</button
57
+ >
58
+ <button
59
+ type="button"
60
+ data-vector-blend-action="spine"
61
+ class={vectorButtonClass}
62
+ title="Replace Spine (select a blend and a path)"
63
+ aria-label="Replace Spine"
64
+ disabled={!blend.canReplaceSpine}
65
+ onclick={() => controller.replaceBlendSpine()}>⌇</button
66
+ >
67
+ <button type="button" data-vector-blend-action="expand" class={vectorButtonClass} title="Expand Blend" aria-label="Expand Blend" disabled={!selected} onclick={() => controller.expandBlend()}>⧉</button>
68
+ <button type="button" data-vector-blend-action="release" class={vectorButtonClass} title="Release Blend" aria-label="Release Blend" disabled={!selected} onclick={() => controller.releaseBlend()}>⧄</button>
69
+ </div>
@@ -0,0 +1,8 @@
1
+ import { type VectorEditorController } from '@pixerate/editor/vector';
2
+ type $$ComponentProps = {
3
+ controller: VectorEditorController;
4
+ };
5
+ declare const VectorBlendControls: import("svelte").Component<$$ComponentProps, {}, "">;
6
+ type VectorBlendControls = ReturnType<typeof VectorBlendControls>;
7
+ export default VectorBlendControls;
8
+ //# sourceMappingURL=VectorBlendControls.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorBlendControls.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorBlendControls.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAMH,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAIlC,KAAK,gBAAgB,GAAI;IAAE,UAAU,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAqCjE,QAAA,MAAM,mBAAmB,sDAAwC,CAAC;AAClE,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAClE,eAAe,mBAAmB,CAAC"}
@@ -228,6 +228,25 @@
228
228
  <circle cx={w.x} cy={w.y} r={1.5} fill={accentColor} />
229
229
  </g>
230
230
  {/each}
231
+ {#each overlay.blend.spines as sp (sp.id)}
232
+ <g data-vector-blend-spine={sp.id} data-replaced={sp.replaced || undefined}>
233
+ <path d={sp.d} fill="none" stroke={accentColor} stroke-dasharray="4 3" />
234
+ {#each sp.keys as k, i (i)}
235
+ <circle cx={k.x} cy={k.y} r={THEME.handleRadius} fill={THEME.handleFill} stroke={accentColor} />
236
+ {/each}
237
+ </g>
238
+ {/each}
239
+ {#if overlay.blend.start}
240
+ <g data-vector-blend-start="">
241
+ <path d={overlay.blend.start.d} fill="none" stroke={accentColor} stroke-width="2" />
242
+ {#if overlay.blend.start.anchor}
243
+ <circle cx={overlay.blend.start.anchor.x} cy={overlay.blend.start.anchor.y} r={THEME.handleRadius + 1} fill={accentColor} />
244
+ {/if}
245
+ </g>
246
+ {/if}
247
+ {#each overlay.blend.anchors as a, i (i)}
248
+ <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
+ {/each}
231
250
  {#if overlay.widthSpot}
232
251
  <g data-vector-width-spot="">
233
252
  <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;AAkPH,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;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"}
@@ -13,6 +13,7 @@
13
13
  } from '@pixerate/editor/vector';
14
14
  import { vectorStateOf } from './subscribe.svelte.js';
15
15
  import { vectorButtonClass } from './styles.js';
16
+ import VectorBlendControls from './VectorBlendControls.svelte';
16
17
 
17
18
  interface Props {
18
19
  controller: VectorEditorController;
@@ -30,10 +31,15 @@
30
31
  * those tools are active (default `true`).
31
32
  */
32
33
  showPathEdit?: boolean;
34
+ /**
35
+ * Blend: Make Blend, spacing (steps, distance or smooth colour), steps / distance, orient to
36
+ * spine, Replace Spine, Expand and Release (default `true`).
37
+ */
38
+ showBlend?: boolean;
33
39
  class?: string;
34
40
  }
35
41
 
36
- let { controller, tools = VECTOR_TOOLS, showHistory = true, showArrange = true, showSnap = true, showPathEdit = true, class: className = '' }: Props = $props();
42
+ let { controller, tools = VECTOR_TOOLS, showHistory = true, showArrange = true, showSnap = true, showPathEdit = true, showBlend = true, class: className = '' }: Props = $props();
37
43
 
38
44
  const snapTitle = 'Snap to objects';
39
45
  const modKey = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform ?? '') ? '⌘' : 'Ctrl';
@@ -182,6 +188,9 @@
182
188
  {/if}
183
189
  </div>
184
190
  {/if}
191
+ {#if showBlend}
192
+ <VectorBlendControls {controller} />
193
+ {/if}
185
194
  {#if showArrange}
186
195
  <div class="ml-1 flex items-center gap-1" role="group" aria-label="Combine">
187
196
  {#each combine as item (item.title)}{@render action(item)}{/each}
@@ -15,6 +15,11 @@ interface Props {
15
15
  * those tools are active (default `true`).
16
16
  */
17
17
  showPathEdit?: boolean;
18
+ /**
19
+ * Blend: Make Blend, spacing (steps, distance or smooth colour), steps / distance, orient to
20
+ * spine, Replace Spine, Expand and Release (default `true`).
21
+ */
22
+ showBlend?: boolean;
18
23
  class?: string;
19
24
  }
20
25
  declare const VectorToolbar: import("svelte").Component<Props, {}, "">;
@@ -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;AAKjC,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,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsHH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
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;AA0HH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.37.0",
3
+ "version": "0.38.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.40.0"
110
+ "@pixerate/editor": "0.41.0"
111
111
  },
112
112
  "peerDependencies": {
113
113
  "@dagrejs/dagre": "^1.1.4",