@pixerate/editor-svelte 0.93.0 → 0.94.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.
@@ -490,6 +490,17 @@
490
490
  {/each}
491
491
  </g>
492
492
  {/each}
493
+ {#if overlay.perspective}
494
+ <g data-vector-perspective-grid="" fill="none" pointer-events="none">
495
+ {#each overlay.perspective.planes as pl (pl.plane)}
496
+ <path data-vector-perspective-plane={pl.plane} data-active={pl.active || undefined} d={pl.d} stroke={pl.active ? accentColor : guideColor} stroke-width={pl.active ? 1 : 0.75} opacity={pl.active ? 0.55 : 0.25} />
497
+ {/each}
498
+ {#each overlay.perspective.vanishingPoints as v, i (i)}
499
+ <circle data-vector-vanishing-point={i} cx={v.x} cy={v.y} r="4" stroke={accentColor} stroke-width="1.5" />
500
+ {/each}
501
+ <circle data-vector-perspective-origin="" cx={overlay.perspective.origin.x} cy={overlay.perspective.origin.y} r="3" fill={accentColor} />
502
+ </g>
503
+ {/if}
493
504
  {#each overlay.symmetry as sy (sy.nodeId)}
494
505
  <g data-vector-symmetry-axes={sy.nodeId} stroke={accentColor} stroke-dasharray={sy.drawing ? undefined : '6 4'} opacity={sy.drawing ? 0.9 : 0.6}>
495
506
  {#each sy.lines as l, i (i)}<line x1={l.x1} y1={l.y1} x2={l.x2} y2={l.y2} />{/each}
@@ -1 +1 @@
1
- {"version":3,"file":"VectorCanvas.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorCanvas.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,EASH,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AASjC,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;AAgcH,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,EASH,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AASjC,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;AA2cH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,61 @@
1
+ <script lang="ts">
2
+ import { vectorPerspectivePlanes, vectorPerspectivePreset, type VectorEditorController, type VectorPerspectivePlane } from '@pixerate/editor/vector';
3
+ import { vectorStateOf } from './subscribe.svelte.js';
4
+
5
+ /**
6
+ * Perspective drawing: add a 1-, 2- or 3-point grid, pick the plane new shapes are drawn on, lay
7
+ * the selection onto it, show or hide the grid, or remove it. Grid changes and attaching are one
8
+ * undo step each.
9
+ */
10
+ interface Props {
11
+ controller: VectorEditorController;
12
+ class?: string;
13
+ }
14
+
15
+ let { controller, class: className = '' }: Props = $props();
16
+
17
+ const store = vectorStateOf(() => controller);
18
+ const view = $derived(store.current);
19
+ const grid = $derived(view.document.perspective ?? null);
20
+ const planes = $derived(grid ? vectorPerspectivePlanes(grid) : []);
21
+ let attachTo = $state<VectorPerspectivePlane | ''>('');
22
+ const target = $derived((view.perspectivePlane ?? attachTo) || planes[0]);
23
+ const PLANE_LABELS: Record<VectorPerspectivePlane, string> = { floor: 'Floor', left: 'Left wall', right: 'Right wall', side: 'Side wall', front: 'Front' };
24
+ const add = (n: 1 | 2 | 3) => controller.setPerspective(vectorPerspectivePreset(n, view.document.width, view.document.height));
25
+
26
+ const buttonClass =
27
+ '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 aria-pressed:bg-primary aria-pressed:text-primary-foreground';
28
+ const selectClass = 'h-7 min-w-0 flex-1 rounded border border-border bg-background px-1 text-xs';
29
+ </script>
30
+
31
+ <div class="space-y-2 {className}" data-vector-perspective-panel="" aria-label="Perspective">
32
+ <div class="flex flex-wrap items-center gap-1">
33
+ <span class="w-16 text-[11px] font-medium uppercase tracking-wide text-muted-foreground">Perspective</span>
34
+ {#each [1, 2, 3] as const as n (n)}
35
+ <button type="button" class={buttonClass} aria-pressed={grid?.vanishingPoints.length === n} data-vector-perspective-preset={n} title={`A ${n}-point perspective grid for the page`} onclick={() => add(n)}>{n}-pt</button>
36
+ {/each}
37
+ </div>
38
+ {#if grid}
39
+ <div class="flex flex-wrap items-center gap-1">
40
+ <span class="w-16"></span>
41
+ <select aria-label="Draw on plane" title="New rectangles, ellipses, polygons and stars are drawn on this plane" class={selectClass} value={view.perspectivePlane ?? ''} onchange={(e) => controller.setPerspectivePlane((e.currentTarget.value || null) as VectorPerspectivePlane | null)}>
42
+ <option value="">Draw flat</option>
43
+ {#each planes as p (p)}<option value={p}>Draw on {PLANE_LABELS[p].toLowerCase()}</option>{/each}
44
+ </select>
45
+ </div>
46
+ <div class="flex flex-wrap items-center gap-1">
47
+ <span class="w-16"></span>
48
+ {#if !view.perspectivePlane}
49
+ <select aria-label="Attach to plane" class="h-7 w-24 rounded border border-border bg-background px-1 text-xs" value={attachTo || planes[0]} onchange={(e) => (attachTo = e.currentTarget.value as VectorPerspectivePlane)}>
50
+ {#each planes as p (p)}<option value={p}>{PLANE_LABELS[p]}</option>{/each}
51
+ </select>
52
+ {/if}
53
+ <button type="button" class={buttonClass} disabled={!view.selection.length} title="Lay the selection onto the plane (read flat from the grid's origin)" onclick={() => controller.attachToPerspective(target)}>Attach</button>
54
+ <label class="flex items-center gap-1 text-xs text-foreground" title="Show the grid on the canvas">
55
+ <input type="checkbox" aria-label="Show perspective grid" checked={grid.visible !== false} onchange={(e) => grid && controller.setPerspective({ ...grid, visible: e.currentTarget.checked })} />
56
+ Show
57
+ </label>
58
+ <button type="button" class={buttonClass} title="Remove the grid (art on it stays)" onclick={() => controller.setPerspective(null)}>Remove</button>
59
+ </div>
60
+ {/if}
61
+ </div>
@@ -0,0 +1,14 @@
1
+ import { type VectorEditorController } from '@pixerate/editor/vector';
2
+ /**
3
+ * Perspective drawing: add a 1-, 2- or 3-point grid, pick the plane new shapes are drawn on, lay
4
+ * the selection onto it, show or hide the grid, or remove it. Grid changes and attaching are one
5
+ * undo step each.
6
+ */
7
+ interface Props {
8
+ controller: VectorEditorController;
9
+ class?: string;
10
+ }
11
+ declare const VectorPerspectivePanel: import("svelte").Component<Props, {}, "">;
12
+ type VectorPerspectivePanel = ReturnType<typeof VectorPerspectivePanel>;
13
+ export default VectorPerspectivePanel;
14
+ //# sourceMappingURL=VectorPerspectivePanel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorPerspectivePanel.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorPerspectivePanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoD,KAAK,sBAAsB,EAA+B,MAAM,yBAAyB,CAAC;AAInJ;;;;GAIG;AACH,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwDH,QAAA,MAAM,sBAAsB,2CAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
@@ -29,6 +29,7 @@
29
29
  import VectorShadingPanel from './VectorShadingPanel.svelte';
30
30
  import VectorTracePanel from './VectorTracePanel.svelte';
31
31
  import VectorSymmetryPanel from './VectorSymmetryPanel.svelte';
32
+ import VectorPerspectivePanel from './VectorPerspectivePanel.svelte';
32
33
  import VectorLensPanel from './VectorLensPanel.svelte';
33
34
  import VectorGradientEditor from './VectorGradientEditor.svelte';
34
35
 
@@ -259,6 +260,7 @@
259
260
  <VectorConnectorPanel {controller} />
260
261
  <VectorShadingPanel {controller} />
261
262
  <VectorSymmetryPanel {controller} />
263
+ <VectorPerspectivePanel {controller} />
262
264
  <VectorLensPanel {controller} />
263
265
  <VectorTracePanel {controller} />
264
266
  <VectorConstraintsPanel {controller} />
@@ -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;AAmBjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4LH,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;AAoBjC,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8LH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -17,6 +17,7 @@ export { default as VectorConnectorPanel } from "./VectorConnectorPanel.svelte";
17
17
  export { default as VectorShadingPanel } from "./VectorShadingPanel.svelte";
18
18
  export { default as VectorTracePanel } from "./VectorTracePanel.svelte";
19
19
  export { default as VectorSymmetryPanel } from "./VectorSymmetryPanel.svelte";
20
+ export { default as VectorPerspectivePanel } from "./VectorPerspectivePanel.svelte";
20
21
  export { default as VectorLensPanel } from "./VectorLensPanel.svelte";
21
22
  export { default as VectorTextElement } from "./VectorTextElement.svelte";
22
23
  export { default as VectorMaskedNodes } from "./VectorMaskedNodes.svelte";
@@ -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,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,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,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAC5F,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,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,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,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAC5F,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"}
@@ -14,6 +14,7 @@ export { default as VectorConnectorPanel } from "./VectorConnectorPanel.svelte";
14
14
  export { default as VectorShadingPanel } from "./VectorShadingPanel.svelte";
15
15
  export { default as VectorTracePanel } from "./VectorTracePanel.svelte";
16
16
  export { default as VectorSymmetryPanel } from "./VectorSymmetryPanel.svelte";
17
+ export { default as VectorPerspectivePanel } from "./VectorPerspectivePanel.svelte";
17
18
  export { default as VectorLensPanel } from "./VectorLensPanel.svelte";
18
19
  export { default as VectorTextElement } from "./VectorTextElement.svelte";
19
20
  export { default as VectorMaskedNodes } from "./VectorMaskedNodes.svelte";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.93.0",
3
+ "version": "0.94.0",
4
4
  "description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -144,7 +144,7 @@
144
144
  "@tiptap/extension-bubble-menu": "^2.11.5",
145
145
  "@tiptap/extension-placeholder": "^2.11.5",
146
146
  "@tiptap/starter-kit": "^2.11.5",
147
- "@pixerate/editor": "0.131.0"
147
+ "@pixerate/editor": "0.133.0"
148
148
  },
149
149
  "peerDependencies": {
150
150
  "@dagrejs/dagre": "^1.1.4",