@pixerate/editor-svelte 0.29.0 → 0.30.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.
Files changed (36) hide show
  1. package/README.md +1 -0
  2. package/dist/canvas/createCanvasAnimation.svelte.d.ts.map +1 -1
  3. package/dist/canvas/createCanvasArrange.svelte.d.ts.map +1 -1
  4. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts.map +1 -1
  5. package/dist/canvas/createCanvasComponents.svelte.d.ts.map +1 -1
  6. package/dist/vector/VectorCanvas.svelte +237 -0
  7. package/dist/vector/VectorCanvas.svelte.d.ts +20 -0
  8. package/dist/vector/VectorCanvas.svelte.d.ts.map +1 -0
  9. package/dist/vector/VectorEditor.svelte +36 -0
  10. package/dist/vector/VectorEditor.svelte.d.ts +18 -0
  11. package/dist/vector/VectorEditor.svelte.d.ts.map +1 -0
  12. package/dist/vector/VectorGradientDefs.svelte +25 -0
  13. package/dist/vector/VectorGradientDefs.svelte.d.ts +8 -0
  14. package/dist/vector/VectorGradientDefs.svelte.d.ts.map +1 -0
  15. package/dist/vector/VectorSceneNodes.svelte +31 -0
  16. package/dist/vector/VectorSceneNodes.svelte.d.ts +8 -0
  17. package/dist/vector/VectorSceneNodes.svelte.d.ts.map +1 -0
  18. package/dist/vector/VectorStylePanel.svelte +83 -0
  19. package/dist/vector/VectorStylePanel.svelte.d.ts +9 -0
  20. package/dist/vector/VectorStylePanel.svelte.d.ts.map +1 -0
  21. package/dist/vector/VectorToolbar.svelte +87 -0
  22. package/dist/vector/VectorToolbar.svelte.d.ts +15 -0
  23. package/dist/vector/VectorToolbar.svelte.d.ts.map +1 -0
  24. package/dist/vector/createVectorEditor.svelte.d.ts +30 -0
  25. package/dist/vector/createVectorEditor.svelte.d.ts.map +1 -0
  26. package/dist/vector/createVectorEditor.svelte.js +43 -0
  27. package/dist/vector/index.d.ts +15 -0
  28. package/dist/vector/index.d.ts.map +1 -0
  29. package/dist/vector/index.js +9 -0
  30. package/dist/vector/styles.d.ts +3 -0
  31. package/dist/vector/styles.d.ts.map +1 -0
  32. package/dist/vector/styles.js +2 -0
  33. package/dist/vector/subscribe.svelte.d.ts +6 -0
  34. package/dist/vector/subscribe.svelte.d.ts.map +1 -0
  35. package/dist/vector/subscribe.svelte.js +17 -0
  36. package/package.json +10 -2
package/README.md CHANGED
@@ -83,6 +83,7 @@ Tables are on by default in `createRichTextPreset` (`table: false` turns them of
83
83
  | `@pixerate/editor-svelte/commands` | `CommandPalette`, `createCommandPalette` (`hotkey: "Mod+K"`; call `destroy()` when done), `createCommandShortcuts`, `useRegisterCommands` over a `CommandRegistry` from `@pixerate/editor/commands` (also re-exported from the root entry) |
84
84
  | `@pixerate/editor-svelte/persistence` | `createAutosave` (crash-recovery snapshots bound to a history / dirty flag, flushed on `pagehide`; call `destroy()` when done) and `<RecoveryPrompt>` (also re-exported from the root entry) |
85
85
  | `@pixerate/editor-svelte/generation` | `GenerationSettings` (controls generated from a model's capabilities, reference slots by role, plan adjustments; `onchange` / `onaddreference`), `createGenerationPlan(() => request, () => caps)`, `JobProgress`, `createJobProgress` (call `destroy()` when done) over `@pixerate/editor/generation` (also re-exported from the root entry) |
86
+ | `@pixerate/editor-svelte/vector` | `VectorEditor` (toolbar, canvas and style panel), `VectorCanvas` (SVG canvas forwarding pointer, wheel, keyboard and clipboard events), `VectorToolbar`, `VectorStylePanel`, `VectorSceneNodes`, `VectorGradientDefs`, `createVectorEditor` (call `destroy()` when done) and `useVectorCommands` over `@pixerate/editor/vector` (see [the vector editor guide](../../docs/vector-editor.md)) |
86
87
  | `@pixerate/editor-svelte/parameters` | `ParametersPanel` (a whole schema with groups, presets, undo / reset / randomize and keyframe diamonds), `createParameters` (call `destroy()` when done), `useParameterCommands`, and the field controls `ParameterFieldControl`, `ParameterSlider`, `ParameterToggle`, `ParameterSelect`, `ParameterColor`, `ParameterVector`, `ParameterImage`, `ParameterText`, `KeyframeDiamond` over `@pixerate/editor/parameters` (see [the parameters guide](../../docs/parameters.md)) |
87
88
  | `@pixerate/editor-svelte/canvas` | Runes for `@xyflow/svelte`: `createCanvasGraph`, `createCanvasClipboard`, `createCanvasDocking`, `createCanvasShortcuts`, `createCanvasInteractions`, `createCanvasExplosion`, `createCanvasNodeSync`, `createCanvasMultiDrag`, `createStreamingCanvas`, `AgentPresenceLayer`, `FloatingHorizontalScrollbar`, plus layout helpers |
88
89
 
@@ -1 +1 @@
1
- {"version":3,"file":"createCanvasAnimation.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasAnimation.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,KAAK,EACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,4BAA4B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU;IAClF,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,mDAAmD;IACnD,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,+FAA+F;IAC/F,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,4BAA4B,CAAC,KAAK,CAAC;;;;;;;;;;kBA2DnG,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAag+oI,CAAC;;;;;;;;;;;YAAg/C,CAAC;mBAA8B,CAAC;;;;;;;YAAmjB,CAAC;gBAA0B,CAAC;;;EAH5ltI;AAED,MAAM,MAAM,qBAAqB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"createCanvasAnimation.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasAnimation.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,KAAK,EACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,4BAA4B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU;IAClF,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,mDAAmD;IACnD,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAChC,+FAA+F;IAC/F,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC3C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,4BAA4B,CAAC,KAAK,CAAC;;;;;;;;;;kBA2DnG,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAa0rgH,CAAC;;;;;;;;;;;YAAg/C,CAAC;mBAA8B,CAAC;;;;;;;YAAmjB,CAAC;gBAA0B,CAAC;;;EAHtzkH;AAED,MAAM,MAAM,qBAAqB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createCanvasArrange.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasArrange.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,SAAS,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,KAAK,WAAW,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;AAEvD,MAAM,WAAW,0BAA0B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,CAChF,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACrE,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EACxE,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC;;IAkBzC;;;;;OAKG;wBACiB,MAAM;;;;;;;;;;sBAoDu5lF,CAAC;sBAAiE,CAAC;sBAAiE,CAAC;oBAA+D,CAAC;cAAyD,CAAC;gBAAiD,CAAC;;;;;;;;;0BAA8tC,CAAC;;yBAA6kB,CAAC;;0BAAgf,CAAC;;;;;;;;;;EAxCjgrF;AAED,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjH,MAAM,WAAW,6BAA6B;IAC7C,OAAO,EAAE;QAAE,SAAS,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAA;KAAE,CAAC;IACjE,uEAAuE;IACvE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC1D,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,MAAM,IAAI,CAqB/F"}
1
+ {"version":3,"file":"createCanvasArrange.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasArrange.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,SAAS,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,KAAK,WAAW,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;AAEvD,MAAM,WAAW,0BAA0B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,CAChF,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACrE,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EACxE,OAAO,EAAE,0BAA0B,CAAC,KAAK,CAAC;;IAkBzC;;;;;OAKG;wBACiB,MAAM;;;;;;;;;;sBAoDin9D,CAAC;sBAAiE,CAAC;sBAAiE,CAAC;oBAA+D,CAAC;cAAyD,CAAC;gBAAiD,CAAC;;;;;;;;;0BAA8tC,CAAC;;yBAA6kB,CAAC;;0BAAgf,CAAC;;;;;;;;;;EAxC3tiE;AAED,MAAM,MAAM,aAAa,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;AAEjH,MAAM,WAAW,6BAA6B;IAC7C,OAAO,EAAE;QAAE,SAAS,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAA;KAAE,CAAC;IACjE,uEAAuE;IACvE,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IAC1D,aAAa,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,6BAA6B,GAAG,MAAM,IAAI,CAqB/F"}
@@ -1 +1 @@
1
- {"version":3,"file":"createCanvasAutoLayout.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasAutoLayout.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,iCAAiC,EACtC,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,KAAK,WAAW,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC;AAE1D,MAAM,WAAW,6BAA6B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,CACnF,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACrE,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC;;;IA+BzH,2FAA2F;kBAC7E,OAAO,SAAS,kBAAkB,WAAW,OAAO,EAAE,GAAG,OAAO,EAAE;IAKhF,gFAAgF;0BAC1D,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,4EAA4E;iBAC/D,MAAM;IAInB;;;OAGG;wBACiB,MAAM;;;;;;;;aAiBsjjG,CAAC;;;;aAAiX,CAAC;cAAwB,CAAC;;;;;;;;;;gBAAqrD,CAAC;;;;EAHnpnG;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"createCanvasAutoLayout.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasAutoLayout.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,iCAAiC,EACtC,KAAK,SAAS,EACd,KAAK,kBAAkB,EACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,KAAK,WAAW,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC;AAE1D,MAAM,WAAW,6BAA6B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,CACnF,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACrE,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC;;;IA+BzH,2FAA2F;kBAC7E,OAAO,SAAS,kBAAkB,WAAW,OAAO,EAAE,GAAG,OAAO,EAAE;IAKhF,gFAAgF;0BAC1D,QAAQ,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAIjE,4EAA4E;iBAC/D,MAAM;IAInB;;;OAGG;wBACiB,MAAM;;;;;;;;aAiBgx6E,CAAC;;;;aAAiX,CAAC;cAAwB,CAAC;;;;;;;;;;gBAAqrD,CAAC;;;;EAH72+E;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"createCanvasComponents.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasComponents.svelte.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,iCAAiC,EACtC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,KAAK,WAAW,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC;AAE1D,MAAM,WAAW,6BAA6B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,CACnF,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAC/D,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,oFAAoF;IACpF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC;IAazH,gCAAgC;;;;;4BASsl/J,CAAC;;UAAmM,CAAC;YAAsB,CAAC;eAAyB,CAAC;;8BAA8E,CAAC;;;;;;;;;;6BAA4nC,CAAC;;;;;;;;eAA6yB,CAAC;;;;;;;oBAAi7B,CAAC;;;;;;;;;;;;;;gBAA07C,CAAC;;EAHptoK;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"createCanvasComponents.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasComponents.svelte.ts"],"names":[],"mappings":"AACA,OAAO,EAEN,KAAK,iCAAiC,EACtC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,KAAK,WAAW,GAAG,iCAAiC,CAAC,GAAG,CAAC,CAAC;AAE1D,MAAM,WAAW,6BAA6B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,CACnF,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IAC/D,QAAQ,EAAE,MAAM,KAAK,EAAE,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACnC,oFAAoF;IACpF,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,EAAE,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC;IAazH,gCAAgC;;;;;4BASgz2I,CAAC;;UAAmM,CAAC;YAAsB,CAAC;eAAyB,CAAC;;8BAA8E,CAAC;;;;;;;;;;6BAA4nC,CAAC;;;;;;;;eAA6yB,CAAC;;;;;;;oBAAi7B,CAAC;;;;;;;;;;;;;;gBAA07C,CAAC;;EAH96/I;AAED,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -0,0 +1,237 @@
1
+ <script lang="ts" module>
2
+ // A counter keeps gradient ids unique per canvas (`$props.id()` needs Svelte 5.20).
3
+ let nextId = 0;
4
+ </script>
5
+
6
+ <script lang="ts">
7
+ import { untrack } from 'svelte';
8
+ import {
9
+ VECTOR_OVERLAY_THEME as THEME,
10
+ getVectorOverlayRenderData,
11
+ getVectorSceneRenderData,
12
+ isVectorTextTarget,
13
+ toVectorKeyInput,
14
+ toVectorPointerInput,
15
+ type VectorEditorController
16
+ } from '@pixerate/editor/vector';
17
+ import VectorGradientDefs from './VectorGradientDefs.svelte';
18
+ import VectorSceneNodes from './VectorSceneNodes.svelte';
19
+ import { vectorStateOf } from './subscribe.svelte.js';
20
+
21
+ interface Props {
22
+ controller: VectorEditorController;
23
+ /** Fit the artboard into the canvas when it first gets a size (default `true`). */
24
+ fitOnMount?: boolean;
25
+ /** Draw a checkerboard behind a transparent artboard (default `true`). */
26
+ checkerboard?: boolean;
27
+ /** Overlay accent colour (default sky blue). */
28
+ accentColor?: string;
29
+ /** Prefix for gradient ids (keep it unique per page). */
30
+ idPrefix?: string;
31
+ class?: string;
32
+ style?: string;
33
+ /** Accessible label (default "Vector canvas"). */
34
+ 'aria-label'?: string;
35
+ }
36
+
37
+ let {
38
+ controller,
39
+ fitOnMount = true,
40
+ checkerboard = true,
41
+ accentColor = THEME.accent,
42
+ idPrefix = `ve${++nextId}-`,
43
+ class: className = '',
44
+ style = '',
45
+ 'aria-label': ariaLabel = 'Vector canvas'
46
+ }: Props = $props();
47
+
48
+ const store = vectorStateOf(() => controller);
49
+ const view = $derived(store.current);
50
+ const scene = $derived(getVectorSceneRenderData(view, { idPrefix }));
51
+ const overlay = $derived(getVectorOverlayRenderData(view));
52
+ const box = $derived(overlay.selectionBox);
53
+ const closing = $derived(view.tool === 'pen' ? overlay.anchors.find((a) => a.closes && a.hovered) : undefined);
54
+ const hs = THEME.transformHandleSize;
55
+ const as = THEME.anchorSize;
56
+
57
+ let svg: SVGSVGElement | undefined = $state();
58
+ let fitted = untrack(() => !fitOnMount);
59
+
60
+ $effect(() => {
61
+ const el = svg;
62
+ const current = controller;
63
+ if (!el || fitted) return;
64
+ const fit = () => {
65
+ const rect = el.getBoundingClientRect();
66
+ if (fitted || rect.width <= 0 || rect.height <= 0) return;
67
+ fitted = true;
68
+ current.zoomToFit({ width: rect.width, height: rect.height });
69
+ };
70
+ fit();
71
+ if (fitted || typeof ResizeObserver === 'undefined') return;
72
+ const observer = new ResizeObserver(fit);
73
+ observer.observe(el);
74
+ return () => observer.disconnect();
75
+ });
76
+
77
+ // Wheel needs a non-passive listener to stop page scroll / browser zoom.
78
+ $effect(() => {
79
+ const el = svg;
80
+ const current = controller;
81
+ if (!el) return;
82
+ const onWheel = (e: WheelEvent) => {
83
+ e.preventDefault();
84
+ current.wheel(local(e), { x: e.deltaX, y: e.deltaY }, toVectorPointerInput(e));
85
+ };
86
+ el.addEventListener('wheel', onWheel, { passive: false });
87
+ return () => el.removeEventListener('wheel', onWheel);
88
+ });
89
+
90
+ function local(e: { clientX: number; clientY: number }) {
91
+ const rect = svg?.getBoundingClientRect();
92
+ return { x: e.clientX - (rect?.left ?? 0), y: e.clientY - (rect?.top ?? 0) };
93
+ }
94
+
95
+ function onPointerDown(e: PointerEvent) {
96
+ svg?.focus({ preventScroll: true });
97
+ (e.currentTarget as Element).setPointerCapture?.(e.pointerId);
98
+ controller.pointerDown(local(e), toVectorPointerInput(e));
99
+ }
100
+
101
+ function onPointerUp(e: PointerEvent) {
102
+ (e.currentTarget as Element).releasePointerCapture?.(e.pointerId);
103
+ controller.pointerUp(local(e), toVectorPointerInput(e));
104
+ }
105
+
106
+ function onKeyDown(e: KeyboardEvent) {
107
+ if (isVectorTextTarget(e.target)) return;
108
+ if (controller.keyDown(toVectorKeyInput(e))) e.preventDefault();
109
+ }
110
+
111
+ function clipboard(kind: 'copy' | 'cut' | 'paste') {
112
+ return (e: ClipboardEvent) => {
113
+ const data = e.clipboardData;
114
+ if (kind === 'paste') {
115
+ const text = data?.getData('text/plain') ?? '';
116
+ const pasted = text ? controller.paste(text) : controller.paste();
117
+ if (pasted.length) e.preventDefault();
118
+ return;
119
+ }
120
+ const text = kind === 'cut' ? controller.cut() : controller.copy();
121
+ if (text && data) {
122
+ data.setData('text/plain', text);
123
+ e.preventDefault();
124
+ }
125
+ };
126
+ }
127
+
128
+ const handleKey = (h: { ref: { nodeId: string; subpath: number; index: number; handle: string } }) =>
129
+ `${h.ref.nodeId}:${h.ref.subpath}:${h.ref.index}:${h.ref.handle}`;
130
+ const anchorKey = (a: { ref: { nodeId: string; subpath: number; index: number } }) => `${a.ref.nodeId}:${a.ref.subpath}:${a.ref.index}`;
131
+ </script>
132
+
133
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex, a11y_no_noninteractive_element_interactions -->
134
+ <svg
135
+ bind:this={svg}
136
+ role="application"
137
+ aria-label={ariaLabel}
138
+ tabindex="0"
139
+ data-tool={view.tool}
140
+ class={className}
141
+ style="display:block;width:100%;height:100%;outline:none;touch-action:none;user-select:none;cursor:{view.cursor};{style}"
142
+ onpointerdown={onPointerDown}
143
+ onpointermove={(e) => controller.pointerMove(local(e), toVectorPointerInput(e))}
144
+ onpointerup={onPointerUp}
145
+ onpointercancel={() => controller.cancelDrag()}
146
+ onpointerleave={() => controller.pointerLeave()}
147
+ ondblclick={(e) => controller.doubleClick(local(e))}
148
+ onkeydown={onKeyDown}
149
+ onkeyup={(e) => controller.keyUp(toVectorKeyInput(e))}
150
+ oncopy={clipboard('copy')}
151
+ oncut={clipboard('cut')}
152
+ onpaste={clipboard('paste')}
153
+ >
154
+ {#if checkerboard}
155
+ <defs>
156
+ <pattern id="{idPrefix}checker" width="16" height="16" patternUnits="userSpaceOnUse">
157
+ <rect width="16" height="16" fill="#ffffff" />
158
+ <rect width="8" height="8" fill="#e5e7eb" />
159
+ <rect x="8" y="8" width="8" height="8" fill="#e5e7eb" />
160
+ </pattern>
161
+ </defs>
162
+ {/if}
163
+ <VectorGradientDefs defs={scene.defs} />
164
+ <rect
165
+ data-vector-artboard=""
166
+ x={overlay.artboard.x}
167
+ y={overlay.artboard.y}
168
+ width={overlay.artboard.width}
169
+ height={overlay.artboard.height}
170
+ fill={scene.background ?? (checkerboard ? `url(#${idPrefix}checker)` : '#ffffff')}
171
+ stroke="rgba(0,0,0,0.12)"
172
+ />
173
+ <g data-vector-scene="" transform={scene.transform}>
174
+ <VectorSceneNodes nodes={scene.nodes} />
175
+ </g>
176
+ <g data-vector-overlay="" pointer-events="none" fill="none">
177
+ {#each overlay.outlines as o (o.id)}
178
+ <path d={o.d} stroke={accentColor} stroke-width={o.selected ? 1 : 1.5} opacity={o.selected ? 1 : 0.7} />
179
+ {/each}
180
+ {#if overlay.penPreview}
181
+ <path d={overlay.penPreview} stroke={accentColor} stroke-dasharray="4 3" />
182
+ {/if}
183
+ {#if box}
184
+ <g data-vector-selection="">
185
+ <rect x={box.x} y={box.y} width={box.width} height={box.height} stroke={accentColor} />
186
+ <line x1={box.x + box.width / 2} y1={box.y} x2={box.x + box.width / 2} y2={box.y - 24} stroke={accentColor} />
187
+ {#each box.handles as h (h.handle)}
188
+ {#if h.handle === 'rotate'}
189
+ <circle data-handle={h.handle} cx={h.x} cy={h.y} r={hs / 2 + 1} fill={THEME.handleFill} stroke={accentColor} />
190
+ {:else}
191
+ <rect data-handle={h.handle} x={h.x - hs / 2} y={h.y - hs / 2} width={hs} height={hs} fill={THEME.handleFill} stroke={accentColor} />
192
+ {/if}
193
+ {/each}
194
+ </g>
195
+ {/if}
196
+ {#each overlay.handles as h (handleKey(h))}
197
+ <g data-vector-handle={h.ref.handle}>
198
+ <line x1={h.anchorX} y1={h.anchorY} x2={h.x} y2={h.y} stroke={accentColor} />
199
+ <circle cx={h.x} cy={h.y} r={THEME.handleRadius + (h.hovered ? 1 : 0)} fill={THEME.handleFill} stroke={accentColor} />
200
+ </g>
201
+ {/each}
202
+ {#each overlay.anchors as a (anchorKey(a))}
203
+ {@const size = as + (a.hovered ? 2 : 0)}
204
+ {#if a.type === 'corner'}
205
+ <rect
206
+ data-vector-anchor={a.ref.index}
207
+ x={a.x - size / 2}
208
+ y={a.y - size / 2}
209
+ width={size}
210
+ height={size}
211
+ fill={a.selected ? accentColor : THEME.handleFill}
212
+ stroke={accentColor}
213
+ />
214
+ {:else}
215
+ <circle data-vector-anchor={a.ref.index} cx={a.x} cy={a.y} r={size / 2} fill={a.selected ? accentColor : THEME.handleFill} stroke={accentColor} />
216
+ {/if}
217
+ {/each}
218
+ {#if closing}
219
+ <circle cx={closing.x} cy={closing.y} r={as} stroke={accentColor} />
220
+ {/if}
221
+ {#if overlay.marquee}
222
+ <rect
223
+ data-vector-marquee=""
224
+ x={overlay.marquee.x}
225
+ y={overlay.marquee.y}
226
+ width={overlay.marquee.width}
227
+ height={overlay.marquee.height}
228
+ fill={THEME.marqueeFill}
229
+ stroke={accentColor}
230
+ stroke-dasharray="3 2"
231
+ />
232
+ {/if}
233
+ {#if overlay.status}
234
+ <text data-vector-status="" x="8" y="100%" dy="-8" font-size="11" fill={accentColor} style="font-family:system-ui,sans-serif">{overlay.status}</text>
235
+ {/if}
236
+ </g>
237
+ </svg>
@@ -0,0 +1,20 @@
1
+ import { type VectorEditorController } from '@pixerate/editor/vector';
2
+ interface Props {
3
+ controller: VectorEditorController;
4
+ /** Fit the artboard into the canvas when it first gets a size (default `true`). */
5
+ fitOnMount?: boolean;
6
+ /** Draw a checkerboard behind a transparent artboard (default `true`). */
7
+ checkerboard?: boolean;
8
+ /** Overlay accent colour (default sky blue). */
9
+ accentColor?: string;
10
+ /** Prefix for gradient ids (keep it unique per page). */
11
+ idPrefix?: string;
12
+ class?: string;
13
+ style?: string;
14
+ /** Accessible label (default "Vector canvas"). */
15
+ 'aria-label'?: string;
16
+ }
17
+ declare const VectorCanvas: import("svelte").Component<Props, {}, "">;
18
+ type VectorCanvas = ReturnType<typeof VectorCanvas>;
19
+ export default VectorCanvas;
20
+ //# sourceMappingURL=VectorCanvas.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorCanvas.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorCanvas.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,EAOH,KAAK,sBAAsB,EAC5B,MAAM,yBAAyB,CAAC;AAMjC,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,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;AA2KH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,36 @@
1
+ <script lang="ts">
2
+ import type { ComponentProps } from 'svelte';
3
+ import type { VectorEditorController, VectorTool } from '@pixerate/editor/vector';
4
+ import VectorCanvas from './VectorCanvas.svelte';
5
+ import VectorStylePanel from './VectorStylePanel.svelte';
6
+ import VectorToolbar from './VectorToolbar.svelte';
7
+
8
+ interface Props {
9
+ controller: VectorEditorController;
10
+ /** Tools in the toolbar (default: all). */
11
+ tools?: readonly VectorTool[];
12
+ /** The style sidebar (default `true`). */
13
+ showStylePanel?: boolean;
14
+ /** Canvas height (default 520px). */
15
+ height?: number | string;
16
+ canvasProps?: Omit<ComponentProps<typeof VectorCanvas>, 'controller'>;
17
+ class?: string;
18
+ }
19
+
20
+ let { controller, tools, showStylePanel = true, height = 520, canvasProps = {}, class: className = '' }: Props = $props();
21
+ </script>
22
+
23
+ <div class="flex flex-col gap-2 {className}" data-vector-editor="">
24
+ <VectorToolbar {controller} {tools} />
25
+ <div class="flex min-h-0 flex-col gap-2 md:flex-row">
26
+ <div
27
+ class="relative min-h-[320px] flex-1 overflow-hidden rounded-md border border-border bg-muted/40"
28
+ style="height:{typeof height === 'number' ? `${height}px` : height}"
29
+ >
30
+ <VectorCanvas {controller} {...canvasProps} />
31
+ </div>
32
+ {#if showStylePanel}
33
+ <VectorStylePanel {controller} class="w-full shrink-0 rounded-md border border-border p-3 md:w-56" />
34
+ {/if}
35
+ </div>
36
+ </div>
@@ -0,0 +1,18 @@
1
+ import type { ComponentProps } from 'svelte';
2
+ import type { VectorEditorController, VectorTool } from '@pixerate/editor/vector';
3
+ import VectorCanvas from './VectorCanvas.svelte';
4
+ interface Props {
5
+ controller: VectorEditorController;
6
+ /** Tools in the toolbar (default: all). */
7
+ tools?: readonly VectorTool[];
8
+ /** The style sidebar (default `true`). */
9
+ showStylePanel?: boolean;
10
+ /** Canvas height (default 520px). */
11
+ height?: number | string;
12
+ canvasProps?: Omit<ComponentProps<typeof VectorCanvas>, 'controller'>;
13
+ class?: string;
14
+ }
15
+ declare const VectorEditor: import("svelte").Component<Props, {}, "">;
16
+ type VectorEditor = ReturnType<typeof VectorEditor>;
17
+ export default VectorEditor;
18
+ //# sourceMappingURL=VectorEditor.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAK/C,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,2CAA2C;IAC3C,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,0CAA0C;IAC1C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA0BH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,25 @@
1
+ <script lang="ts">
2
+ import type { SvgGradientDef } from '@pixerate/editor/vector';
3
+
4
+ interface Props {
5
+ defs: readonly SvgGradientDef[];
6
+ }
7
+
8
+ let { defs }: Props = $props();
9
+ </script>
10
+
11
+ {#if defs.length}
12
+ <defs>
13
+ {#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>
18
+ {: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>
22
+ {/if}
23
+ {/each}
24
+ </defs>
25
+ {/if}
@@ -0,0 +1,8 @@
1
+ import type { SvgGradientDef } from '@pixerate/editor/vector';
2
+ interface Props {
3
+ defs: readonly SvgGradientDef[];
4
+ }
5
+ declare const VectorGradientDefs: import("svelte").Component<Props, {}, "">;
6
+ type VectorGradientDefs = ReturnType<typeof VectorGradientDefs>;
7
+ export default VectorGradientDefs;
8
+ //# sourceMappingURL=VectorGradientDefs.svelte.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import type { VectorRenderNode } from '@pixerate/editor/vector';
3
+ import Self from './VectorSceneNodes.svelte';
4
+
5
+ interface Props {
6
+ nodes: readonly VectorRenderNode[];
7
+ }
8
+
9
+ let { nodes }: Props = $props();
10
+ </script>
11
+
12
+ {#each nodes as node (node.id)}
13
+ {#if node.kind === 'group'}
14
+ <g data-vector-id={node.id} opacity={node.opacity < 1 ? node.opacity : undefined}>
15
+ <Self nodes={node.children} />
16
+ </g>
17
+ {:else}
18
+ <path
19
+ data-vector-id={node.id}
20
+ d={node.d}
21
+ fill={node.fill}
22
+ fill-rule={node.fillRule}
23
+ stroke={node.stroke}
24
+ stroke-width={node.stroke === 'none' ? undefined : node.strokeWidth}
25
+ stroke-linecap={node.strokeLinecap as any}
26
+ stroke-linejoin={node.strokeLinejoin as any}
27
+ stroke-dasharray={node.strokeDasharray}
28
+ opacity={node.opacity < 1 ? node.opacity : undefined}
29
+ />
30
+ {/if}
31
+ {/each}
@@ -0,0 +1,8 @@
1
+ import type { VectorRenderNode } from '@pixerate/editor/vector';
2
+ interface Props {
3
+ nodes: readonly VectorRenderNode[];
4
+ }
5
+ declare const VectorSceneNodes: import("svelte").Component<Props, {}, "">;
6
+ type VectorSceneNodes = ReturnType<typeof VectorSceneNodes>;
7
+ export default VectorSceneNodes;
8
+ //# sourceMappingURL=VectorSceneNodes.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorSceneNodes.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorSceneNodes.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI9D,UAAU,KAAK;IACb,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACpC;AAqBH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,83 @@
1
+ <script lang="ts">
2
+ import { getVectorSelectionStyle, vectorPaintToHex, type VectorEditorController } from '@pixerate/editor/vector';
3
+ import { vectorStateOf } from './subscribe.svelte.js';
4
+
5
+ interface Props {
6
+ controller: VectorEditorController;
7
+ class?: string;
8
+ }
9
+
10
+ let { controller, class: className = '' }: Props = $props();
11
+
12
+ const store = vectorStateOf(() => controller);
13
+ const view = $derived(store.current);
14
+ const style = $derived(getVectorSelectionStyle(view));
15
+ const source = $derived(
16
+ style ?? { fill: view.defaults.fill ?? null, stroke: view.defaults.stroke ?? null, strokeWidth: view.defaults.strokeWidth ?? 1, opacity: 1 }
17
+ );
18
+
19
+ function apply(patch: Record<string, unknown>) {
20
+ if (style) controller.setStyle(patch);
21
+ else controller.setDefaults(patch);
22
+ }
23
+
24
+ const paints = [
25
+ { key: 'fill' as const, label: 'Fill' },
26
+ { key: 'stroke' as const, label: 'Stroke' }
27
+ ];
28
+ </script>
29
+
30
+ <div class="space-y-2 {className}" aria-label={style ? 'Selection style' : 'New shape style'}>
31
+ <p class="text-[11px] font-medium uppercase tracking-wide text-muted-foreground">{style ? 'Selection' : 'New shapes'}</p>
32
+ {#each paints as { key, label } (key)}
33
+ {@const paint = source[key]}
34
+ {@const hex = vectorPaintToHex(paint)}
35
+ {@const on = paint !== null && paint !== 'none'}
36
+ <div class="flex items-center gap-2" data-vector-style={key}>
37
+ <label class="flex w-16 items-center gap-1.5 text-xs text-foreground">
38
+ <input type="checkbox" checked={on} aria-label="{label} on" onchange={(e) => apply({ [key]: e.currentTarget.checked ? (hex ?? '#000000') : null })} />
39
+ {label}
40
+ </label>
41
+ <input
42
+ type="color"
43
+ aria-label="{label} colour"
44
+ class="h-7 w-10 cursor-pointer rounded border border-border bg-background disabled:opacity-40"
45
+ disabled={!on}
46
+ value={hex ?? '#000000'}
47
+ oninput={(e) => apply({ [key]: e.currentTarget.value })}
48
+ />
49
+ {#if on && !hex}<span class="truncate text-[11px] text-muted-foreground">{typeof paint === 'string' ? paint : 'Gradient'}</span>{/if}
50
+ {#if style?.mixed[key]}<span class="text-[11px] text-muted-foreground">Mixed</span>{/if}
51
+ </div>
52
+ {/each}
53
+ <label class="flex items-center gap-2 text-xs text-foreground">
54
+ <span class="w-16">Width</span>
55
+ <input
56
+ type="number"
57
+ min="0"
58
+ step="0.5"
59
+ aria-label="Stroke width"
60
+ class="h-7 w-20 rounded border border-border bg-background px-1.5 text-xs"
61
+ value={source.strokeWidth}
62
+ oninput={(e) => {
63
+ const n = parseFloat(e.currentTarget.value);
64
+ if (Number.isFinite(n) && n >= 0) apply({ strokeWidth: n });
65
+ }}
66
+ />
67
+ </label>
68
+ {#if style}
69
+ <label class="flex items-center gap-2 text-xs text-foreground">
70
+ <span class="w-16">Opacity</span>
71
+ <input
72
+ type="range"
73
+ min="0"
74
+ max="1"
75
+ step="0.05"
76
+ aria-label="Opacity"
77
+ class="h-4 flex-1 accent-primary"
78
+ value={source.opacity}
79
+ oninput={(e) => apply({ opacity: parseFloat(e.currentTarget.value) })}
80
+ />
81
+ </label>
82
+ {/if}
83
+ </div>
@@ -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 VectorStylePanel: import("svelte").Component<Props, {}, "">;
7
+ type VectorStylePanel = ReturnType<typeof VectorStylePanel>;
8
+ export default VectorStylePanel;
9
+ //# sourceMappingURL=VectorStylePanel.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStylePanel.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorStylePanel.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6C,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAI/G,UAAU,KAAK;IACb,UAAU,EAAE,sBAAsB,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA2DH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,87 @@
1
+ <script lang="ts">
2
+ import {
3
+ VECTOR_TOOLS,
4
+ VECTOR_TOOL_GLYPHS,
5
+ VECTOR_TOOL_SHORTCUTS,
6
+ vectorToolLabel,
7
+ type VectorEditorController,
8
+ type VectorTool
9
+ } from '@pixerate/editor/vector';
10
+ import { vectorStateOf } from './subscribe.svelte.js';
11
+ import { vectorButtonClass } from './styles.js';
12
+
13
+ interface Props {
14
+ controller: VectorEditorController;
15
+ /** Tools to show (default: all). */
16
+ tools?: readonly VectorTool[];
17
+ /** Undo / redo buttons (default `true`). */
18
+ showHistory?: boolean;
19
+ /** Boolean, group, arrange and align buttons (default `true`). */
20
+ showArrange?: boolean;
21
+ class?: string;
22
+ }
23
+
24
+ let { controller, tools = VECTOR_TOOLS, showHistory = true, showArrange = true, class: className = '' }: Props = $props();
25
+
26
+ const store = vectorStateOf(() => controller);
27
+ const view = $derived(store.current);
28
+ const count = $derived(view.selection.length);
29
+ const groupSelected = $derived(view.selection.some((id) => controller.getNode(id)?.type === 'group'));
30
+
31
+ const combine = $derived([
32
+ { label: '∪', title: 'Union', run: () => controller.booleanOp('union'), disabled: count < 2 },
33
+ { label: '−', title: 'Subtract', run: () => controller.booleanOp('subtract'), disabled: count < 2 },
34
+ { label: '∩', title: 'Intersect', run: () => controller.booleanOp('intersect'), disabled: count < 2 },
35
+ { label: '⊻', title: 'Exclude', run: () => controller.booleanOp('exclude'), disabled: count < 2 },
36
+ { label: 'G', title: 'Group', run: () => controller.group(), disabled: count < 1 },
37
+ { label: 'U', title: 'Ungroup', run: () => controller.ungroup(), disabled: !groupSelected }
38
+ ]);
39
+ const arrange = $derived([
40
+ { label: '⇈', title: 'Bring to Front', run: () => controller.arrange('front'), disabled: count < 1 },
41
+ { label: '⇊', title: 'Send to Back', run: () => controller.arrange('back'), disabled: count < 1 },
42
+ { label: '⇤', title: 'Align Left', run: () => controller.align('left'), disabled: count < 1 },
43
+ { label: '↔', title: 'Align Center', run: () => controller.align('center'), disabled: count < 1 },
44
+ { label: '⇥', title: 'Align Right', run: () => controller.align('right'), disabled: count < 1 },
45
+ { label: '⤒', title: 'Align Top', run: () => controller.align('top'), disabled: count < 1 },
46
+ { label: '↕', title: 'Align Middle', run: () => controller.align('middle'), disabled: count < 1 },
47
+ { label: '⤓', title: 'Align Bottom', run: () => controller.align('bottom'), disabled: count < 1 }
48
+ ]);
49
+ </script>
50
+
51
+ {#snippet action(item: { label: string; title: string; run: () => unknown; disabled: boolean })}
52
+ <button type="button" class={vectorButtonClass} title={item.title} aria-label={item.title} disabled={item.disabled} onclick={() => void item.run()}>
53
+ {item.label}
54
+ </button>
55
+ {/snippet}
56
+
57
+ <div role="toolbar" aria-label="Vector tools" class="flex flex-wrap items-center gap-1 {className}">
58
+ <div class="flex items-center gap-1" role="group" aria-label="Tools">
59
+ {#each tools as tool (tool)}
60
+ <button
61
+ type="button"
62
+ data-vector-tool={tool}
63
+ class={vectorButtonClass}
64
+ aria-pressed={view.tool === tool}
65
+ title="{vectorToolLabel(tool)} ({VECTOR_TOOL_SHORTCUTS[tool]})"
66
+ aria-label={vectorToolLabel(tool)}
67
+ onclick={() => controller.setTool(tool)}
68
+ >
69
+ {VECTOR_TOOL_GLYPHS[tool]}
70
+ </button>
71
+ {/each}
72
+ </div>
73
+ {#if showHistory}
74
+ <div class="ml-1 flex items-center gap-1" role="group" aria-label="History">
75
+ {@render action({ label: '↶', title: view.canUndo ? `Undo ${view.undoLabel}` : 'Undo', run: () => controller.undo(), disabled: !view.canUndo })}
76
+ {@render action({ label: '↷', title: view.canRedo ? `Redo ${view.redoLabel}` : 'Redo', run: () => controller.redo(), disabled: !view.canRedo })}
77
+ </div>
78
+ {/if}
79
+ {#if showArrange}
80
+ <div class="ml-1 flex items-center gap-1" role="group" aria-label="Combine">
81
+ {#each combine as item (item.title)}{@render action(item)}{/each}
82
+ </div>
83
+ <div class="ml-1 flex items-center gap-1" role="group" aria-label="Arrange">
84
+ {#each arrange as item (item.title)}{@render action(item)}{/each}
85
+ </div>
86
+ {/if}
87
+ </div>
@@ -0,0 +1,15 @@
1
+ import { type VectorEditorController, type VectorTool } from '@pixerate/editor/vector';
2
+ interface Props {
3
+ controller: VectorEditorController;
4
+ /** Tools to show (default: all). */
5
+ tools?: readonly VectorTool[];
6
+ /** Undo / redo buttons (default `true`). */
7
+ showHistory?: boolean;
8
+ /** Boolean, group, arrange and align buttons (default `true`). */
9
+ showArrange?: boolean;
10
+ class?: string;
11
+ }
12
+ declare const VectorToolbar: import("svelte").Component<Props, {}, "">;
13
+ type VectorToolbar = ReturnType<typeof VectorToolbar>;
14
+ export default VectorToolbar;
15
+ //# sourceMappingURL=VectorToolbar.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorToolbar.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/VectorToolbar.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAKH,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,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkEH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { VectorEditorController, type VectorCommandOptions, type VectorEditorOptions, type VectorEditorState, type VectorTool } from "@pixerate/editor/vector";
2
+ export interface SvelteVectorEditor {
3
+ readonly controller: VectorEditorController;
4
+ /** The controller's state (reactive). */
5
+ readonly state: VectorEditorState;
6
+ setTool(tool: VectorTool): void;
7
+ undo(): void;
8
+ redo(): void;
9
+ deleteSelection(): void;
10
+ toSvg(): string;
11
+ /** Stops listening to the controller (and destroys it when this rune created it). */
12
+ destroy(): void;
13
+ }
14
+ /**
15
+ * Svelte 5 rune: subscribes to a `VectorEditorController` (or creates one from options) and
16
+ * exposes its state reactively with bound actions.
17
+ */
18
+ export declare function createVectorEditor(controllerOrOptions?: VectorEditorController | VectorEditorOptions): SvelteVectorEditor;
19
+ /** Anything with `register(specs) → unregister` (a `CommandRegistry`). */
20
+ export interface VectorCommandTarget {
21
+ register(specs: any): () => void;
22
+ }
23
+ /**
24
+ * Registers the controller's palette / agent commands (`vector.addShape`, `vector.boolean`, …)
25
+ * for the lifetime of the calling component (call it during initialisation), so
26
+ * `createCommandToolProvider` exposes them to agents. Pass a getter to follow a changing
27
+ * registry.
28
+ */
29
+ export declare function useVectorCommands(registry: VectorCommandTarget | null | undefined | (() => VectorCommandTarget | null | undefined), controller: VectorEditorController, options?: VectorCommandOptions): void;
30
+ //# sourceMappingURL=createVectorEditor.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createVectorEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/createVectorEditor.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,eAAe,IAAI,IAAI,CAAC;IACxB,KAAK,IAAI,MAAM,CAAC;IAChB,qFAAqF;IACrF,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,mBAAmB,GAAE,sBAAsB,GAAG,mBAAwB,GAAG,kBAAkB,CAuB7H;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,GAAG,CAAC,MAAM,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC,EACjG,UAAU,EAAE,sBAAsB,EAClC,OAAO,GAAE,oBAAyB,GACjC,IAAI,CAMN"}
@@ -0,0 +1,43 @@
1
+ import { VectorEditorController, createVectorCommands, } from "@pixerate/editor/vector";
2
+ /**
3
+ * Svelte 5 rune: subscribes to a `VectorEditorController` (or creates one from options) and
4
+ * exposes its state reactively with bound actions.
5
+ */
6
+ export function createVectorEditor(controllerOrOptions = {}) {
7
+ const owned = !(controllerOrOptions instanceof VectorEditorController);
8
+ const controller = controllerOrOptions instanceof VectorEditorController ? controllerOrOptions : new VectorEditorController(controllerOrOptions);
9
+ let state = $state.raw(controller.getState());
10
+ const unsubscribe = controller.subscribe((next) => {
11
+ state = next;
12
+ });
13
+ return {
14
+ controller,
15
+ get state() {
16
+ return state;
17
+ },
18
+ setTool: (tool) => controller.setTool(tool),
19
+ undo: () => void controller.undo(),
20
+ redo: () => void controller.redo(),
21
+ deleteSelection: () => void controller.deleteSelection(),
22
+ toSvg: () => controller.toSvg(),
23
+ destroy: () => {
24
+ unsubscribe();
25
+ if (owned)
26
+ controller.destroy();
27
+ },
28
+ };
29
+ }
30
+ /**
31
+ * Registers the controller's palette / agent commands (`vector.addShape`, `vector.boolean`, …)
32
+ * for the lifetime of the calling component (call it during initialisation), so
33
+ * `createCommandToolProvider` exposes them to agents. Pass a getter to follow a changing
34
+ * registry.
35
+ */
36
+ export function useVectorCommands(registry, controller, options = {}) {
37
+ $effect(() => {
38
+ const target = typeof registry === "function" ? registry() : registry;
39
+ if (!target)
40
+ return;
41
+ return target.register(createVectorCommands(controller, options));
42
+ });
43
+ }
@@ -0,0 +1,15 @@
1
+ import type { ComponentProps } from "svelte";
2
+ import type VectorCanvasComponent from "./VectorCanvas.svelte";
3
+ import type VectorEditorComponent from "./VectorEditor.svelte";
4
+ export { default as VectorEditor } from "./VectorEditor.svelte";
5
+ export { default as VectorCanvas } from "./VectorCanvas.svelte";
6
+ export { default as VectorToolbar } from "./VectorToolbar.svelte";
7
+ export { default as VectorStylePanel } from "./VectorStylePanel.svelte";
8
+ export { default as VectorSceneNodes } from "./VectorSceneNodes.svelte";
9
+ export { default as VectorGradientDefs } from "./VectorGradientDefs.svelte";
10
+ export * from "./createVectorEditor.svelte.js";
11
+ export { vectorStateOf } from "./subscribe.svelte.js";
12
+ export * from "./styles.js";
13
+ export type VectorCanvasProps = ComponentProps<typeof VectorCanvasComponent>;
14
+ export type VectorEditorProps = ComponentProps<typeof VectorEditorComponent>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,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"}
@@ -0,0 +1,9 @@
1
+ export { default as VectorEditor } from "./VectorEditor.svelte";
2
+ export { default as VectorCanvas } from "./VectorCanvas.svelte";
3
+ export { default as VectorToolbar } from "./VectorToolbar.svelte";
4
+ export { default as VectorStylePanel } from "./VectorStylePanel.svelte";
5
+ export { default as VectorSceneNodes } from "./VectorSceneNodes.svelte";
6
+ export { default as VectorGradientDefs } from "./VectorGradientDefs.svelte";
7
+ export * from "./createVectorEditor.svelte.js";
8
+ export { vectorStateOf } from "./subscribe.svelte.js";
9
+ export * from "./styles.js";
@@ -0,0 +1,3 @@
1
+ /** Tailwind classes shared by the vector toolbar and style panel (same as the React package). */
2
+ export declare const vectorButtonClass = "inline-flex h-8 min-w-8 items-center justify-center rounded-md border border-border bg-background px-2 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";
3
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/vector/styles.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,2QAC4O,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** Tailwind classes shared by the vector toolbar and style panel (same as the React package). */
2
+ export const vectorButtonClass = "inline-flex h-8 min-w-8 items-center justify-center rounded-md border border-border bg-background px-2 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";
@@ -0,0 +1,6 @@
1
+ import type { VectorEditorController, VectorEditorState } from "@pixerate/editor/vector";
2
+ /** Reactive state of a (possibly replaced) controller prop, for use inside components. */
3
+ export declare function vectorStateOf(getController: () => VectorEditorController): {
4
+ readonly current: VectorEditorState;
5
+ };
6
+ //# sourceMappingURL=subscribe.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribe.svelte.d.ts","sourceRoot":"","sources":["../../src/vector/subscribe.svelte.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEzF,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,aAAa,EAAE,MAAM,sBAAsB,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAgBlH"}
@@ -0,0 +1,17 @@
1
+ import { untrack } from "svelte";
2
+ /** Reactive state of a (possibly replaced) controller prop, for use inside components. */
3
+ export function vectorStateOf(getController) {
4
+ let view = $state.raw(untrack(() => getController().getState()));
5
+ $effect(() => {
6
+ const controller = getController();
7
+ view = controller.getState();
8
+ return untrack(() => controller.subscribe((next) => {
9
+ view = next;
10
+ }));
11
+ });
12
+ return {
13
+ get current() {
14
+ return view;
15
+ },
16
+ };
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
4
4
  "description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -58,6 +58,11 @@
58
58
  "svelte": "./dist/parameters/index.js",
59
59
  "default": "./dist/parameters/index.js"
60
60
  },
61
+ "./vector": {
62
+ "types": "./dist/vector/index.d.ts",
63
+ "svelte": "./dist/vector/index.js",
64
+ "default": "./dist/vector/index.js"
65
+ },
61
66
  "./package.json": "./package.json"
62
67
  },
63
68
  "typesVersions": {
@@ -85,6 +90,9 @@
85
90
  ],
86
91
  "parameters": [
87
92
  "./dist/parameters/index.d.ts"
93
+ ],
94
+ "vector": [
95
+ "./dist/vector/index.d.ts"
88
96
  ]
89
97
  }
90
98
  },
@@ -99,7 +107,7 @@
99
107
  "@tiptap/extension-bubble-menu": "^2.11.5",
100
108
  "@tiptap/extension-placeholder": "^2.11.5",
101
109
  "@tiptap/starter-kit": "^2.11.5",
102
- "@pixerate/editor": "0.31.0"
110
+ "@pixerate/editor": "0.32.0"
103
111
  },
104
112
  "peerDependencies": {
105
113
  "@dagrejs/dagre": "^1.1.4",