@pixerate/editor-svelte 0.22.0 → 0.23.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 (85) hide show
  1. package/README.md +4 -0
  2. package/dist/MergePreview.svelte +201 -0
  3. package/dist/MergePreview.svelte.d.ts +25 -0
  4. package/dist/MergePreview.svelte.d.ts.map +1 -0
  5. package/dist/TemplateRenderer.svelte +4 -10
  6. package/dist/TemplateRenderer.svelte.d.ts.map +1 -1
  7. package/dist/canvas/createCanvasArrange.svelte.d.ts.map +1 -1
  8. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts +68 -0
  9. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts.map +1 -0
  10. package/dist/canvas/createCanvasAutoLayout.svelte.js +78 -0
  11. package/dist/canvas/index.d.ts +2 -0
  12. package/dist/canvas/index.d.ts.map +1 -1
  13. package/dist/canvas/index.js +3 -0
  14. package/dist/find-replace/FindReplaceBar.svelte +203 -0
  15. package/dist/find-replace/FindReplaceBar.svelte.d.ts +15 -0
  16. package/dist/find-replace/FindReplaceBar.svelte.d.ts.map +1 -0
  17. package/dist/find-replace/findReplace.svelte.d.ts +27 -0
  18. package/dist/find-replace/findReplace.svelte.d.ts.map +1 -0
  19. package/dist/find-replace/findReplace.svelte.js +79 -0
  20. package/dist/find-replace/index.d.ts +6 -0
  21. package/dist/find-replace/index.d.ts.map +1 -0
  22. package/dist/find-replace/index.js +2 -0
  23. package/dist/generation/GenerationSettings.svelte +174 -0
  24. package/dist/generation/GenerationSettings.svelte.d.ts +23 -0
  25. package/dist/generation/GenerationSettings.svelte.d.ts.map +1 -0
  26. package/dist/generation/JobProgress.svelte +53 -0
  27. package/dist/generation/JobProgress.svelte.d.ts +17 -0
  28. package/dist/generation/JobProgress.svelte.d.ts.map +1 -0
  29. package/dist/generation/index.d.ts +10 -0
  30. package/dist/generation/index.d.ts.map +1 -0
  31. package/dist/generation/index.js +4 -0
  32. package/dist/generation/plan.svelte.d.ts +16 -0
  33. package/dist/generation/plan.svelte.d.ts.map +1 -0
  34. package/dist/generation/plan.svelte.js +26 -0
  35. package/dist/generation/progress.svelte.d.ts +25 -0
  36. package/dist/generation/progress.svelte.d.ts.map +1 -0
  37. package/dist/generation/progress.svelte.js +36 -0
  38. package/dist/image-editor/AdjustmentLayersPanel.svelte +309 -0
  39. package/dist/image-editor/AdjustmentLayersPanel.svelte.d.ts +11 -0
  40. package/dist/image-editor/AdjustmentLayersPanel.svelte.d.ts.map +1 -0
  41. package/dist/image-editor/ControlSlider.svelte +39 -0
  42. package/dist/image-editor/ControlSlider.svelte.d.ts +13 -0
  43. package/dist/image-editor/ControlSlider.svelte.d.ts.map +1 -0
  44. package/dist/image-editor/CurvesEditor.svelte +105 -0
  45. package/dist/image-editor/CurvesEditor.svelte.d.ts +13 -0
  46. package/dist/image-editor/CurvesEditor.svelte.d.ts.map +1 -0
  47. package/dist/image-editor/Histogram.svelte +49 -0
  48. package/dist/image-editor/Histogram.svelte.d.ts +12 -0
  49. package/dist/image-editor/Histogram.svelte.d.ts.map +1 -0
  50. package/dist/image-editor/ImageEditor.svelte +32 -140
  51. package/dist/image-editor/ImageEditor.svelte.d.ts.map +1 -1
  52. package/dist/image-editor/imageEditorState.svelte.d.ts +14 -1
  53. package/dist/image-editor/imageEditorState.svelte.d.ts.map +1 -1
  54. package/dist/image-editor/imageEditorState.svelte.js +40 -0
  55. package/dist/image-editor/index.d.ts +12 -0
  56. package/dist/image-editor/index.d.ts.map +1 -1
  57. package/dist/image-editor/index.js +4 -0
  58. package/dist/index.d.ts +8 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +5 -0
  61. package/dist/merge.svelte.d.ts +51 -0
  62. package/dist/merge.svelte.d.ts.map +1 -0
  63. package/dist/merge.svelte.js +117 -0
  64. package/dist/persistence/RecoveryPrompt.svelte +57 -0
  65. package/dist/persistence/RecoveryPrompt.svelte.d.ts +18 -0
  66. package/dist/persistence/RecoveryPrompt.svelte.d.ts.map +1 -0
  67. package/dist/persistence/autosave.svelte.d.ts +63 -0
  68. package/dist/persistence/autosave.svelte.d.ts.map +1 -0
  69. package/dist/persistence/autosave.svelte.js +110 -0
  70. package/dist/persistence/index.d.ts +6 -0
  71. package/dist/persistence/index.d.ts.map +1 -0
  72. package/dist/persistence/index.js +2 -0
  73. package/dist/review/documentCompare.svelte.d.ts +21 -0
  74. package/dist/review/documentCompare.svelte.d.ts.map +1 -0
  75. package/dist/review/documentCompare.svelte.js +23 -0
  76. package/dist/review/index.d.ts +1 -0
  77. package/dist/review/index.d.ts.map +1 -1
  78. package/dist/review/index.js +1 -0
  79. package/dist/spreadsheet/SpreadsheetContextMenu.svelte +6 -3
  80. package/dist/spreadsheet/SpreadsheetContextMenu.svelte.d.ts.map +1 -1
  81. package/dist/spreadsheet/SpreadsheetEditor.svelte +6 -2
  82. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts.map +1 -1
  83. package/dist/spreadsheet/spreadsheet.svelte.d.ts +2 -0
  84. package/dist/spreadsheet/spreadsheet.svelte.d.ts.map +1 -1
  85. package/package.json +18 -2
package/README.md CHANGED
@@ -69,6 +69,8 @@ Requires **Svelte 5** (the components use runes). Components ship as `.svelte` s
69
69
 
70
70
  `ReviewToolbar` steps through insertions, deletions, formatting and block changes and shows the current one's author and description (e.g. "Ada: Formatted: Bold"); hide it with `showDescription={false}` or restyle it with `descriptionClass`. Put `<CommentButton {editor} />` inside a `BubbleMenu` to comment on the selection. `createComments(editorOrStore)` and `createTrackChanges(editor)` are rune (and Svelte store) adapters for custom UIs.
71
71
 
72
+ `<FindReplaceBar {editor} />` is a Word-style find bar for editors with the `FindReplace` extension (`createRichTextPreset({ findReplace: true })`): it appears on Mod+F / Mod+H (or `editor.commands.openFindReplace()`), with find and replace fields, option toggles, a "3 of 12" counter, previous/next, Replace and Replace all; Enter / Shift+Enter step, Mod+Enter in the replace field replaces all, Escape closes (`onclose`). `createFindReplace(editor)` is the rune (and Svelte store) adapter for custom UIs.
73
+
72
74
  ## More exports
73
75
 
74
76
  | Import | Exports |
@@ -77,6 +79,8 @@ Requires **Svelte 5** (the components use runes). Components ship as `.svelte` s
77
79
  | `@pixerate/editor-svelte/spreadsheet` | `SpreadsheetEditor`, `FormulaBar`, `FormulaHints`, `SpreadsheetContextMenu`, `SpreadsheetGroupRow`, `createReactiveSpreadsheet` (also re-exported from the root entry) |
78
80
  | `@pixerate/editor-svelte/image-editor` | `ImageEditor`, `createReactiveImageEditor`: crop, rotate/flip, adjustments, annotations, depth masks, and `onInpaint` / `onRemoveBackground` AI hooks |
79
81
  | `@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) |
82
+ | `@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) |
83
+ | `@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) |
80
84
  | `@pixerate/editor-svelte/canvas` | Runes for `@xyflow/svelte`: `createCanvasGraph`, `createCanvasClipboard`, `createCanvasDocking`, `createCanvasShortcuts`, `createCanvasInteractions`, `createCanvasExplosion`, `createCanvasNodeSync`, `createCanvasMultiDrag`, `createStreamingCanvas`, `AgentPresenceLayer`, `FloatingHorizontalScrollbar`, plus layout helpers |
81
85
 
82
86
  Prop types are exported alongside each component, for example `EditableTextNodeEditorProps`, `BubbleMenuProps`, `ImageEditorProps` and `SpreadsheetEditorProps`.
@@ -0,0 +1,201 @@
1
+ <!--
2
+ Mail-merge preview: paste or pick a CSV / JSON data source, check the
3
+ automatic field mapping, step through records with the resolved prompt shown
4
+ by TemplateRenderer, and merge every record into text or JSON.
5
+ Inputs are nested in their labels, which associates them without ids.
6
+ -->
7
+ <script lang="ts">
8
+ import type {
9
+ ColorGradient,
10
+ MergeRecordsOptions,
11
+ MergeRecordsResult,
12
+ ParseDataSourceOptions,
13
+ Template,
14
+ } from "@pixerate/editor";
15
+ import TemplateRenderer from "./TemplateRenderer.svelte";
16
+ import { createMergePreview } from "./merge.svelte.js";
17
+
18
+ interface Props {
19
+ /** The prompt merged with each record. */
20
+ content: string;
21
+ templates?: Template[];
22
+ bindings?: Record<string, string>;
23
+ templateColorMap?: Map<string, ColorGradient>;
24
+ /** Initial CSV / TSV / JSON data source text. */
25
+ defaultSource?: string;
26
+ parseOptions?: ParseDataSourceOptions;
27
+ /** Drop records matching this condition (e.g. `"status=void"`) when merging. */
28
+ skipIf?: MergeRecordsOptions["skipIf"];
29
+ /** Separator between merged outputs (default a blank line; `"none"` for nothing). */
30
+ separator?: string;
31
+ maxOutputs?: number;
32
+ /** Called after "Merge all". */
33
+ onMerge?: (result: MergeRecordsResult) => void;
34
+ /** Base file name for downloads (default `merged`). */
35
+ downloadName?: string;
36
+ class?: string;
37
+ }
38
+
39
+ let {
40
+ content,
41
+ templates,
42
+ bindings,
43
+ templateColorMap,
44
+ defaultSource = "",
45
+ parseOptions,
46
+ skipIf,
47
+ separator,
48
+ maxOutputs,
49
+ onMerge,
50
+ downloadName = "merged",
51
+ class: className = "flex flex-col gap-3 text-sm",
52
+ }: Props = $props();
53
+
54
+ // svelte-ignore state_referenced_locally
55
+ const merge = createMergePreview(
56
+ () => ({ template: content, templates, bindings, parseOptions, skipIf, separator, maxOutputs }),
57
+ defaultSource,
58
+ );
59
+ let copied = $state(false);
60
+
61
+ const plural = (n: number, word: string) => `${n} ${word}${n === 1 ? "" : "s"}`;
62
+
63
+ function downloadText(text: string, fileName: string, type: string) {
64
+ if (typeof document === "undefined" || typeof URL.createObjectURL !== "function") return;
65
+ const url = URL.createObjectURL(new Blob([text], { type }));
66
+ const link = document.createElement("a");
67
+ link.href = url;
68
+ link.download = fileName;
69
+ link.click();
70
+ setTimeout(() => URL.revokeObjectURL(url), 0);
71
+ }
72
+
73
+ async function copy() {
74
+ try {
75
+ await navigator.clipboard.writeText(merge.serialize("text"));
76
+ copied = true;
77
+ } catch {
78
+ copied = false;
79
+ }
80
+ }
81
+
82
+ function mergeAll() {
83
+ const result = merge.merge();
84
+ copied = false;
85
+ onMerge?.(result);
86
+ }
87
+ </script>
88
+
89
+ <div class={className} data-merge-preview="">
90
+ <label class="flex flex-col gap-1">
91
+ <span class="font-medium">Data source (CSV, TSV or JSON)</span>
92
+ <textarea
93
+ data-merge-source=""
94
+ value={merge.sourceText}
95
+ rows={5}
96
+ spellcheck={false}
97
+ oninput={(event) => merge.setSourceText(event.currentTarget.value)}
98
+ class="px-2 py-1 font-mono text-xs rounded-md border border-violet-400/40 bg-transparent"
99
+ ></textarea>
100
+ </label>
101
+ <div class="flex flex-wrap items-center gap-2">
102
+ <input
103
+ type="file"
104
+ accept=".csv,.tsv,.txt,.json,text/csv,application/json"
105
+ aria-label="Load data source file"
106
+ data-merge-file=""
107
+ onchange={(event) => {
108
+ const file = event.currentTarget.files?.[0];
109
+ if (file) void merge.loadFile(file);
110
+ }}
111
+ />
112
+ <span data-merge-summary="" class="opacity-70"
113
+ >{`${plural(merge.source.records.length, "record")} · ${plural(merge.source.fields.length, "field")}`}</span
114
+ >
115
+ </div>
116
+ {#if merge.source.warnings.length > 0 && merge.sourceText.trim() !== ""}
117
+ <ul data-merge-warnings="" class="text-amber-600 text-xs">
118
+ {#each merge.source.warnings as warning}
119
+ <li>{warning.message}</li>
120
+ {/each}
121
+ </ul>
122
+ {/if}
123
+
124
+ {#if merge.variables.length > 0}
125
+ <fieldset class="flex flex-col gap-1">
126
+ <legend class="font-medium">Field mapping</legend>
127
+ {#each merge.variables as variable (variable)}
128
+ <label class="flex items-center gap-2" data-merge-mapping={variable}>
129
+ <span class="min-w-24 font-mono">{`{${variable}}`}</span>
130
+ <select
131
+ value={merge.mapping[variable] ?? ""}
132
+ aria-label={`Field for ${variable}`}
133
+ onchange={(event) => merge.setFieldMapping(variable, event.currentTarget.value || null)}
134
+ class="px-1 py-0.5 rounded-md border border-violet-400/40 bg-transparent"
135
+ >
136
+ <option value="">(none)</option>
137
+ {#each merge.source.fields as field (field)}
138
+ <option value={field}>{field}</option>
139
+ {/each}
140
+ </select>
141
+ </label>
142
+ {/each}
143
+ </fieldset>
144
+ {/if}
145
+
146
+ <div class="flex items-center gap-2">
147
+ <button type="button" data-merge-prev="" onclick={merge.prev} disabled={merge.index <= 0}>Prev</button>
148
+ <span data-merge-position=""
149
+ >{merge.count === 0 ? "No records" : `Record ${merge.index + 1} of ${merge.count}`}</span
150
+ >
151
+ <button
152
+ type="button"
153
+ data-merge-next=""
154
+ onclick={merge.next}
155
+ disabled={merge.index >= merge.count - 1}>Next</button
156
+ >
157
+ </div>
158
+
159
+ <div data-merge-output="">
160
+ <TemplateRenderer
161
+ {content}
162
+ templates={templates ?? []}
163
+ {bindings}
164
+ {templateColorMap}
165
+ resolve={!!templates && templates.length > 0}
166
+ values={merge.values}
167
+ />
168
+ </div>
169
+
170
+ <div class="flex flex-wrap items-center gap-2">
171
+ <button type="button" data-merge-all="" disabled={merge.count === 0} onclick={mergeAll}>Merge all</button>
172
+ {#if merge.result}
173
+ <span data-merge-result=""
174
+ >{`${merge.result.outputs.length} merged${merge.result.skipped.length ? `, ${merge.result.skipped.length} skipped` : ""}${merge.result.truncated ? " (stopped early)" : ""}`}</span
175
+ >
176
+ <button type="button" data-merge-copy="" onclick={copy}>{copied ? "Copied" : "Copy"}</button>
177
+ <button
178
+ type="button"
179
+ data-merge-download="text"
180
+ onclick={() => downloadText(merge.serialize("text"), `${downloadName}.txt`, "text/plain")}
181
+ >Download .txt</button
182
+ >
183
+ <button
184
+ type="button"
185
+ data-merge-download="json"
186
+ onclick={() => downloadText(merge.serialize("json"), `${downloadName}.json`, "application/json")}
187
+ >Download .json</button
188
+ >
189
+ {/if}
190
+ </div>
191
+ {#if merge.result}
192
+ <textarea
193
+ readonly
194
+ aria-label="Merged output"
195
+ data-merge-text=""
196
+ rows={6}
197
+ value={merge.serialize("text")}
198
+ class="px-2 py-1 font-mono text-xs rounded-md border border-violet-400/40 bg-transparent"
199
+ ></textarea>
200
+ {/if}
201
+ </div>
@@ -0,0 +1,25 @@
1
+ import type { ColorGradient, MergeRecordsOptions, MergeRecordsResult, ParseDataSourceOptions, Template } from "@pixerate/editor";
2
+ interface Props {
3
+ /** The prompt merged with each record. */
4
+ content: string;
5
+ templates?: Template[];
6
+ bindings?: Record<string, string>;
7
+ templateColorMap?: Map<string, ColorGradient>;
8
+ /** Initial CSV / TSV / JSON data source text. */
9
+ defaultSource?: string;
10
+ parseOptions?: ParseDataSourceOptions;
11
+ /** Drop records matching this condition (e.g. `"status=void"`) when merging. */
12
+ skipIf?: MergeRecordsOptions["skipIf"];
13
+ /** Separator between merged outputs (default a blank line; `"none"` for nothing). */
14
+ separator?: string;
15
+ maxOutputs?: number;
16
+ /** Called after "Merge all". */
17
+ onMerge?: (result: MergeRecordsResult) => void;
18
+ /** Base file name for downloads (default `merged`). */
19
+ downloadName?: string;
20
+ class?: string;
21
+ }
22
+ declare const MergePreview: import("svelte").Component<Props, {}, "">;
23
+ type MergePreview = ReturnType<typeof MergePreview>;
24
+ export default MergePreview;
25
+ //# sourceMappingURL=MergePreview.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MergePreview.svelte.d.ts","sourceRoot":"","sources":["../src/MergePreview.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,QAAQ,EACT,MAAM,kBAAkB,CAAC;AAK1B,UAAU,KAAK;IACb,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,gFAAgF;IAChF,MAAM,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyHH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -1,6 +1,8 @@
1
1
  <script lang="ts">
2
2
  import {
3
3
  evaluatePromptTokens,
4
+ describeConditionalTag,
5
+ formatConditionalTag,
4
6
  resolveTemplates,
5
7
  type Template,
6
8
  type ColorGradient,
@@ -36,8 +38,6 @@
36
38
  onVariableClick,
37
39
  }: Props = $props();
38
40
 
39
- const CONDITIONAL_PREFIX = { if: "?", unless: "!", end: "/" } as const;
40
-
41
41
  let displayText = $derived(
42
42
  resolve && templates.length > 0
43
43
  ? resolveTemplates(content, templates, { bindings })
@@ -58,12 +58,6 @@
58
58
  .join("\n");
59
59
  }
60
60
 
61
- function conditionalTitle(token: (typeof tokens)[number]): string {
62
- if (token.conditional === "end") return `End of section: ${token.value}`;
63
- return token.conditional === "if"
64
- ? `Shown when "${token.value}" has a value`
65
- : `Shown when "${token.value}" is empty`;
66
- }
67
61
  </script>
68
62
 
69
63
  <div class={className}>
@@ -102,8 +96,8 @@
102
96
  <span
103
97
  data-conditional={token.conditional}
104
98
  class="inline-flex items-center px-1 py-0.5 mx-0.5 text-xs font-medium rounded-md border border-amber-400/40 bg-amber-400/15 text-amber-700"
105
- title={conditionalTitle(token)}
106
- >{`{${CONDITIONAL_PREFIX[token.conditional]}${token.value}}`}</span>
99
+ title={describeConditionalTag(token)}
100
+ >{formatConditionalTag(token)}</span>
107
101
  {:else if token.type === "instruction"}
108
102
  <span
109
103
  class="inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs italic font-medium rounded-md border border-rose-400/40 bg-rose-400/15 text-rose-600"
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateRenderer.svelte.d.ts","sourceRoot":"","sources":["../src/TemplateRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAGH,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAG1B,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AA6EH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"TemplateRenderer.svelte.d.ts","sourceRoot":"","sources":["../src/TemplateRenderer.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAKH,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAG1B,UAAU,KAAK;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,eAAe,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAqEH,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,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;;;;;;;;;;sBAoD+j/C,CAAC;sBAAiE,CAAC;sBAAiE,CAAC;oBAA+D,CAAC;cAAyD,CAAC;gBAAiD,CAAC;;;;;;;;;0BAA8tC,CAAC;;;;;;;;;;EAxC1miD;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;;;;;;;;;;sBAoDwv0D,CAAC;sBAAiE,CAAC;sBAAiE,CAAC;oBAA+D,CAAC;cAAyD,CAAC;gBAAiD,CAAC;;;;;;;;;0BAA8tC,CAAC;;;;;;;;;;EAxCny3D;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"}
@@ -0,0 +1,68 @@
1
+ import { type CanvasAutoLayoutControllerOptions, type GuideLine, type PositionChangeLike } from '@pixerate/editor/canvas';
2
+ import type { CanvasNode } from './types.js';
3
+ type CoreOptions = CanvasAutoLayoutControllerOptions<any>;
4
+ export interface CreateCanvasAutoLayoutOptions<TNode extends CanvasNode = CanvasNode> extends Omit<CoreOptions, 'getNodes' | 'setNodes' | 'onGuidesChange'> {
5
+ getNodes: () => TNode[];
6
+ setNodes: (nodes: TNode[]) => void;
7
+ onGuidesChange?: (guides: GuideLine[]) => void;
8
+ }
9
+ /**
10
+ * Headless Svelte 5 rune for Figma-style auto layout on SvelteFlow sub-flows. Frames are
11
+ * nodes with `data.layout`; their children (`parentId`) are stacked, wrapped or placed on a
12
+ * grid, with hug / fill / fixed sizing, min / max, padding, alignment and constraints.
13
+ *
14
+ * Its actions (`addNode`, `removeNodes`, `resizeNode`, `moveChild`, `applyAutoLayout`) relayout
15
+ * in the same undoable step when a `HistoryManager` is passed. Wire the flow's own edits with
16
+ * `onnodedrag={({ targetNode }) => autoLayout.dragReorder(targetNode.id)}`,
17
+ * `onnodedragstop={({ targetNode }) => autoLayout.endReorderDrag(targetNode.id)}`,
18
+ * `ondelete={({ nodes }) => autoLayout.nodesDeleted(nodes)}`,
19
+ * `<NodeResizer {...autoLayout.resizerHandlers(id)} />` and call `autoLayout.measured(id)` when
20
+ * a node's content size changes. Render `guides` (the drop marker) with `<CanvasGuidesLayer>`.
21
+ */
22
+ export declare function createCanvasAutoLayout<TNode extends CanvasNode = CanvasNode>(options: CreateCanvasAutoLayoutOptions<TNode>): {
23
+ guides: GuideLine[];
24
+ hasPending: boolean;
25
+ /** Notes node changes (see the core controller) and flushes them on the next microtask. */
26
+ handleChanges<TChange extends PositionChangeLike>(changes: TChange[]): TChange[];
27
+ /** For SvelteFlow's `ondelete`: relayouts the frames the deleted nodes left. */
28
+ nodesDeleted(removed: Iterable<{
29
+ id: string;
30
+ parentId?: string;
31
+ }>): void;
32
+ /** Relayouts around node `id` after its measured (content) size changed. */
33
+ measured(id: string): void;
34
+ /**
35
+ * Handlers for SvelteFlow's `<NodeResizer>`: children follow their constraints and the
36
+ * frames around the node relayout when the resize ends.
37
+ */
38
+ resizerHandlers(id: string): {
39
+ onResizeStart: () => void;
40
+ onResizeEnd: () => void;
41
+ };
42
+ applyAutoLayout(frameId?: string): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
43
+ layoutUpdates(ids: Iterable<string>): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
44
+ relayout(ids: Iterable<string>): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
45
+ addNode(node: any, addOptions?: {
46
+ index?: number;
47
+ }): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
48
+ removeNodes(ids: Iterable<string>): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
49
+ resizeNode(id: string, size: {
50
+ width?: number;
51
+ height?: number;
52
+ }): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
53
+ moveChild(childId: string, index: number): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
54
+ getInsertTarget(id: string, point?: import("@pixerate/editor/canvas").XYPosition): import("@pixerate/editor/canvas").AutoLayoutInsertTarget | undefined;
55
+ beginReorderDrag(id: string): void;
56
+ dragReorder(id: string, point?: import("@pixerate/editor/canvas").XYPosition): import("@pixerate/editor/canvas").AutoLayoutInsertTarget | undefined;
57
+ endReorderDrag(id: string, point?: import("@pixerate/editor/canvas").XYPosition): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
58
+ noteChanges<TChange extends PositionChangeLike>(changes: TChange[]): TChange[];
59
+ noteRemoved(removed: Iterable<{
60
+ id: string;
61
+ parentId?: string;
62
+ }>): void;
63
+ flush(): import("@pixerate/editor/canvas").CanvasNodeUpdate[];
64
+ isFrame: (id: string) => boolean;
65
+ };
66
+ export type CanvasAutoLayout<TNode extends CanvasNode = CanvasNode> = ReturnType<typeof createCanvasAutoLayout<TNode>>;
67
+ export {};
68
+ //# sourceMappingURL=createCanvasAutoLayout.svelte.d.ts.map
@@ -0,0 +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;;;;;;;;aAiBw1vE,CAAC;;;;aAAiX,CAAC;cAAwB,CAAC;;;;;;;;;;gBAAqrD,CAAC;;;;EAHr7zE;AAED,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU,IAAI,UAAU,CAAC,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { createCanvasAutoLayoutController } from '@pixerate/editor/canvas';
2
+ /**
3
+ * Headless Svelte 5 rune for Figma-style auto layout on SvelteFlow sub-flows. Frames are
4
+ * nodes with `data.layout`; their children (`parentId`) are stacked, wrapped or placed on a
5
+ * grid, with hug / fill / fixed sizing, min / max, padding, alignment and constraints.
6
+ *
7
+ * Its actions (`addNode`, `removeNodes`, `resizeNode`, `moveChild`, `applyAutoLayout`) relayout
8
+ * in the same undoable step when a `HistoryManager` is passed. Wire the flow's own edits with
9
+ * `onnodedrag={({ targetNode }) => autoLayout.dragReorder(targetNode.id)}`,
10
+ * `onnodedragstop={({ targetNode }) => autoLayout.endReorderDrag(targetNode.id)}`,
11
+ * `ondelete={({ nodes }) => autoLayout.nodesDeleted(nodes)}`,
12
+ * `<NodeResizer {...autoLayout.resizerHandlers(id)} />` and call `autoLayout.measured(id)` when
13
+ * a node's content size changes. Render `guides` (the drop marker) with `<CanvasGuidesLayer>`.
14
+ */
15
+ export function createCanvasAutoLayout(options) {
16
+ let guides = $state.raw([]);
17
+ let scheduled = false;
18
+ const controller = createCanvasAutoLayoutController({
19
+ ...options,
20
+ onGuidesChange: (next) => {
21
+ guides = next;
22
+ options.onGuidesChange?.(next);
23
+ }
24
+ });
25
+ // SvelteFlow writes its own changes after its callbacks run, so the flush waits a microtask.
26
+ const schedule = () => {
27
+ if (scheduled)
28
+ return;
29
+ scheduled = true;
30
+ queueMicrotask(() => {
31
+ scheduled = false;
32
+ controller.flush();
33
+ });
34
+ };
35
+ return {
36
+ ...controller,
37
+ /** Drop marker of the active reorder drag (flow coordinates); empty otherwise. */
38
+ get guides() {
39
+ return guides;
40
+ },
41
+ get hasPending() {
42
+ return controller.hasPending;
43
+ },
44
+ /** Notes node changes (see the core controller) and flushes them on the next microtask. */
45
+ handleChanges(changes) {
46
+ controller.noteChanges(changes);
47
+ schedule();
48
+ return changes;
49
+ },
50
+ /** For SvelteFlow's `ondelete`: relayouts the frames the deleted nodes left. */
51
+ nodesDeleted(removed) {
52
+ controller.noteRemoved(removed);
53
+ schedule();
54
+ },
55
+ /** Relayouts around node `id` after its measured (content) size changed. */
56
+ measured(id) {
57
+ controller.noteChanges([{ type: 'dimensions', id }]);
58
+ schedule();
59
+ },
60
+ /**
61
+ * Handlers for SvelteFlow's `<NodeResizer>`: children follow their constraints and the
62
+ * frames around the node relayout when the resize ends.
63
+ */
64
+ resizerHandlers(id) {
65
+ return {
66
+ onResizeStart: () => {
67
+ controller.noteChanges([{ type: 'dimensions', id, resizing: true }]);
68
+ },
69
+ onResizeEnd: () => {
70
+ queueMicrotask(() => {
71
+ controller.noteChanges([{ type: 'dimensions', id, resizing: false }]);
72
+ controller.flush();
73
+ });
74
+ }
75
+ };
76
+ }
77
+ };
78
+ }
@@ -23,4 +23,6 @@ export { alignNodes, distributeNodes, matchSize, reorderNodes, applyNodeUpdates,
23
23
  export { default as ShapeNode } from './ShapeNode.svelte';
24
24
  export { combineShapeNodes, canCombineShapeNodes, applyShapeCombination, revertShapeCombination, shapeNodeToPolygon, isShapeNode, getNodeShape, SHAPE_DATA_KEY, SHAPE_NODE_TYPE, SHAPE_OPERATIONS, SHAPE_KINDS, isShapeDescription, shapeToPolygon, getShapeSvg, getShapeRenderData, parseSvgPath, flattenSvgPath, polygonToSvgPath, simplifyRing, polygonBoolean, unionPolygons, intersectPolygons, subtractPolygons, xorPolygons, dividePolygons, polygonArea, multiPolygonArea, multiPolygonBounds, ringSignedArea, pointInRings, pointInMultiPolygon, type ShapeOperation, type ShapeDescription, type ShapeKind, type ShapePaint, type ShapeSize, type ShapeRenderData, type RectShape, type EllipseShape, type RegularPolygonShape, type StarShape, type PathShape, type PathCommand, type FlattenOptions, type PolygonToPathOptions, type CombineShapeNodesOptions, type CombineShapeNodesResult, type CombineShapeNodesRefusal, type ShapeNodePolygonOptions, type MultiPolygon, type PolygonWithHoles, type PolygonRing, type PolygonFillRule, type PolygonOperand, type PolygonInput, type PolygonPiece, type PolygonBooleanOperation, type PolygonBooleanOptions } from '@pixerate/editor/canvas';
25
25
  export { realClock, ManualClock, layoutBounds, canvasHeight, estimateCanvasHeight, blendLayout, connectedOnly, type Clock, type CanvasHeightOptions } from '@pixerate/editor/canvas';
26
+ export { layoutFrame, layoutAll, layoutUp, layoutUpMany, applyConstraints, getAutoLayout, getChildLayout, getLayoutSizing, getAutoLayoutGrid, getAutoLayoutInsertTarget, getFlowChildren, getLayoutParent, isAutoLayoutFrame, makeSizingCoherent, moveLayoutChild, mergeNodeUpdates, relayoutUpdates, resolvePadding, clampLayoutSize, createCanvasAutoLayoutController, AUTO_LAYOUT_DATA_KEY, CHILD_LAYOUT_DATA_KEY, type AutoLayout, type AutoLayoutChild, type AutoLayoutMode, type AutoLayoutSizing, type AutoLayoutSizingPair, type AutoLayoutSize, type AutoLayoutAlignMain, type AutoLayoutAlignCross, type AutoLayoutAlignContent, type AutoLayoutPadding, type AutoLayoutGrid, type AutoLayoutGridTrack, type AutoLayoutGridArea, type AutoLayoutGridCell, type AutoLayoutGridGeometry, type AutoLayoutCellAlign, type AutoLayoutConstraints, type AutoLayoutHorizontalConstraint, type AutoLayoutVerticalConstraint, type AutoLayoutMeasure, type AutoLayoutOptions, type AutoLayoutInsertTarget, type CanvasAutoLayoutController, type CanvasAutoLayoutControllerOptions } from '@pixerate/editor/canvas';
27
+ export { createCanvasAutoLayout, type CanvasAutoLayout, type CreateCanvasAutoLayoutOptions } from './createCanvasAutoLayout.svelte.js';
26
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canvas/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/canvas/index.ts"],"names":[],"mappings":"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"}
@@ -43,3 +43,6 @@ export { default as ShapeNode } from './ShapeNode.svelte';
43
43
  export { combineShapeNodes, canCombineShapeNodes, applyShapeCombination, revertShapeCombination, shapeNodeToPolygon, isShapeNode, getNodeShape, SHAPE_DATA_KEY, SHAPE_NODE_TYPE, SHAPE_OPERATIONS, SHAPE_KINDS, isShapeDescription, shapeToPolygon, getShapeSvg, getShapeRenderData, parseSvgPath, flattenSvgPath, polygonToSvgPath, simplifyRing, polygonBoolean, unionPolygons, intersectPolygons, subtractPolygons, xorPolygons, dividePolygons, polygonArea, multiPolygonArea, multiPolygonBounds, ringSignedArea, pointInRings, pointInMultiPolygon } from '@pixerate/editor/canvas';
44
44
  // Clock and view helpers from core
45
45
  export { realClock, ManualClock, layoutBounds, canvasHeight, estimateCanvasHeight, blendLayout, connectedOnly } from '@pixerate/editor/canvas';
46
+ // Auto layout (Figma-style stacks, wrap, grid, hug / fill / fixed) and constraints
47
+ export { layoutFrame, layoutAll, layoutUp, layoutUpMany, applyConstraints, getAutoLayout, getChildLayout, getLayoutSizing, getAutoLayoutGrid, getAutoLayoutInsertTarget, getFlowChildren, getLayoutParent, isAutoLayoutFrame, makeSizingCoherent, moveLayoutChild, mergeNodeUpdates, relayoutUpdates, resolvePadding, clampLayoutSize, createCanvasAutoLayoutController, AUTO_LAYOUT_DATA_KEY, CHILD_LAYOUT_DATA_KEY } from '@pixerate/editor/canvas';
48
+ export { createCanvasAutoLayout } from './createCanvasAutoLayout.svelte.js';