@pixerate/editor-svelte 0.21.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 (117) hide show
  1. package/README.md +6 -1
  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/CanvasGuidesLayer.svelte +32 -2
  8. package/dist/canvas/CanvasGuidesLayer.svelte.d.ts +2 -0
  9. package/dist/canvas/CanvasGuidesLayer.svelte.d.ts.map +1 -1
  10. package/dist/canvas/createCanvasArrange.svelte.d.ts +16 -1
  11. package/dist/canvas/createCanvasArrange.svelte.d.ts.map +1 -1
  12. package/dist/canvas/createCanvasArrange.svelte.js +19 -2
  13. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts +68 -0
  14. package/dist/canvas/createCanvasAutoLayout.svelte.d.ts.map +1 -0
  15. package/dist/canvas/createCanvasAutoLayout.svelte.js +78 -0
  16. package/dist/canvas/createCanvasMeasure.svelte.d.ts +53 -0
  17. package/dist/canvas/createCanvasMeasure.svelte.d.ts.map +1 -0
  18. package/dist/canvas/createCanvasMeasure.svelte.js +80 -0
  19. package/dist/canvas/index.d.ts +4 -0
  20. package/dist/canvas/index.d.ts.map +1 -1
  21. package/dist/canvas/index.js +6 -0
  22. package/dist/commands/CommandPalette.svelte +129 -0
  23. package/dist/commands/CommandPalette.svelte.d.ts +13 -0
  24. package/dist/commands/CommandPalette.svelte.d.ts.map +1 -0
  25. package/dist/commands/commandShortcuts.svelte.d.ts +30 -0
  26. package/dist/commands/commandShortcuts.svelte.d.ts.map +1 -0
  27. package/dist/commands/commandShortcuts.svelte.js +37 -0
  28. package/dist/commands/index.d.ts +7 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +3 -0
  31. package/dist/commands/palette.svelte.d.ts +34 -0
  32. package/dist/commands/palette.svelte.d.ts.map +1 -0
  33. package/dist/commands/palette.svelte.js +61 -0
  34. package/dist/find-replace/FindReplaceBar.svelte +203 -0
  35. package/dist/find-replace/FindReplaceBar.svelte.d.ts +15 -0
  36. package/dist/find-replace/FindReplaceBar.svelte.d.ts.map +1 -0
  37. package/dist/find-replace/findReplace.svelte.d.ts +27 -0
  38. package/dist/find-replace/findReplace.svelte.d.ts.map +1 -0
  39. package/dist/find-replace/findReplace.svelte.js +79 -0
  40. package/dist/find-replace/index.d.ts +6 -0
  41. package/dist/find-replace/index.d.ts.map +1 -0
  42. package/dist/find-replace/index.js +2 -0
  43. package/dist/generation/GenerationSettings.svelte +174 -0
  44. package/dist/generation/GenerationSettings.svelte.d.ts +23 -0
  45. package/dist/generation/GenerationSettings.svelte.d.ts.map +1 -0
  46. package/dist/generation/JobProgress.svelte +53 -0
  47. package/dist/generation/JobProgress.svelte.d.ts +17 -0
  48. package/dist/generation/JobProgress.svelte.d.ts.map +1 -0
  49. package/dist/generation/index.d.ts +10 -0
  50. package/dist/generation/index.d.ts.map +1 -0
  51. package/dist/generation/index.js +4 -0
  52. package/dist/generation/plan.svelte.d.ts +16 -0
  53. package/dist/generation/plan.svelte.d.ts.map +1 -0
  54. package/dist/generation/plan.svelte.js +26 -0
  55. package/dist/generation/progress.svelte.d.ts +25 -0
  56. package/dist/generation/progress.svelte.d.ts.map +1 -0
  57. package/dist/generation/progress.svelte.js +36 -0
  58. package/dist/history/createHistoryShortcuts.d.ts +1 -1
  59. package/dist/history/createHistoryShortcuts.d.ts.map +1 -1
  60. package/dist/history/createHistoryShortcuts.js +10 -32
  61. package/dist/history/history.svelte.d.ts +13 -4
  62. package/dist/history/history.svelte.d.ts.map +1 -1
  63. package/dist/history/history.svelte.js +10 -0
  64. package/dist/history/historyDirty.svelte.d.ts +31 -0
  65. package/dist/history/historyDirty.svelte.d.ts.map +1 -0
  66. package/dist/history/historyDirty.svelte.js +30 -0
  67. package/dist/history/index.d.ts +1 -0
  68. package/dist/history/index.d.ts.map +1 -1
  69. package/dist/history/index.js +1 -0
  70. package/dist/image-editor/AdjustmentLayersPanel.svelte +309 -0
  71. package/dist/image-editor/AdjustmentLayersPanel.svelte.d.ts +11 -0
  72. package/dist/image-editor/AdjustmentLayersPanel.svelte.d.ts.map +1 -0
  73. package/dist/image-editor/ControlSlider.svelte +39 -0
  74. package/dist/image-editor/ControlSlider.svelte.d.ts +13 -0
  75. package/dist/image-editor/ControlSlider.svelte.d.ts.map +1 -0
  76. package/dist/image-editor/CurvesEditor.svelte +105 -0
  77. package/dist/image-editor/CurvesEditor.svelte.d.ts +13 -0
  78. package/dist/image-editor/CurvesEditor.svelte.d.ts.map +1 -0
  79. package/dist/image-editor/Histogram.svelte +49 -0
  80. package/dist/image-editor/Histogram.svelte.d.ts +12 -0
  81. package/dist/image-editor/Histogram.svelte.d.ts.map +1 -0
  82. package/dist/image-editor/ImageEditor.svelte +38 -107
  83. package/dist/image-editor/ImageEditor.svelte.d.ts.map +1 -1
  84. package/dist/image-editor/imageEditorState.svelte.d.ts +16 -1
  85. package/dist/image-editor/imageEditorState.svelte.d.ts.map +1 -1
  86. package/dist/image-editor/imageEditorState.svelte.js +44 -0
  87. package/dist/image-editor/index.d.ts +12 -0
  88. package/dist/image-editor/index.d.ts.map +1 -1
  89. package/dist/image-editor/index.js +4 -0
  90. package/dist/index.d.ts +11 -3
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +7 -1
  93. package/dist/merge.svelte.d.ts +51 -0
  94. package/dist/merge.svelte.d.ts.map +1 -0
  95. package/dist/merge.svelte.js +117 -0
  96. package/dist/persistence/RecoveryPrompt.svelte +57 -0
  97. package/dist/persistence/RecoveryPrompt.svelte.d.ts +18 -0
  98. package/dist/persistence/RecoveryPrompt.svelte.d.ts.map +1 -0
  99. package/dist/persistence/autosave.svelte.d.ts +63 -0
  100. package/dist/persistence/autosave.svelte.d.ts.map +1 -0
  101. package/dist/persistence/autosave.svelte.js +110 -0
  102. package/dist/persistence/index.d.ts +6 -0
  103. package/dist/persistence/index.d.ts.map +1 -0
  104. package/dist/persistence/index.js +2 -0
  105. package/dist/review/documentCompare.svelte.d.ts +21 -0
  106. package/dist/review/documentCompare.svelte.d.ts.map +1 -0
  107. package/dist/review/documentCompare.svelte.js +23 -0
  108. package/dist/review/index.d.ts +1 -0
  109. package/dist/review/index.d.ts.map +1 -1
  110. package/dist/review/index.js +1 -0
  111. package/dist/spreadsheet/SpreadsheetContextMenu.svelte +6 -3
  112. package/dist/spreadsheet/SpreadsheetContextMenu.svelte.d.ts.map +1 -1
  113. package/dist/spreadsheet/SpreadsheetEditor.svelte +7 -2
  114. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts.map +1 -1
  115. package/dist/spreadsheet/spreadsheet.svelte.d.ts +2 -0
  116. package/dist/spreadsheet/spreadsheet.svelte.d.ts.map +1 -1
  117. package/package.json +26 -2
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ import type { ControlSpec } from '@pixerate/editor/image-editor';
3
+ import { controlTrackBackground, formatControlValue } from '@pixerate/editor/image-editor';
4
+
5
+ interface Props {
6
+ spec: ControlSpec;
7
+ value: number;
8
+ onchange: (value: number) => void;
9
+ disabled?: boolean;
10
+ /** Overrides `spec.label` (also the accessible name). */
11
+ label?: string;
12
+ }
13
+
14
+ let { spec, value, onchange, disabled = false, label }: Props = $props();
15
+
16
+ const name = $derived(label ?? spec.label);
17
+ const track = $derived(controlTrackBackground(spec));
18
+ </script>
19
+
20
+ <div data-control-id={spec.id}>
21
+ <div class="flex justify-between text-slate-400 mb-1">
22
+ <span>{name}</span>
23
+ <span class="font-mono">{formatControlValue(spec, value)}</span>
24
+ </div>
25
+ <input
26
+ type="range"
27
+ min={spec.min}
28
+ max={spec.max}
29
+ step={spec.step}
30
+ aria-label={name}
31
+ {disabled}
32
+ {value}
33
+ oninput={(e) => onchange(Number((e.target as HTMLInputElement).value))}
34
+ class="w-full accent-indigo-500 disabled:opacity-40"
35
+ />
36
+ {#if track}
37
+ <div class="h-0.5 rounded-full opacity-70" style="background: {track}"></div>
38
+ {/if}
39
+ </div>
@@ -0,0 +1,13 @@
1
+ import type { ControlSpec } from '@pixerate/editor/image-editor';
2
+ interface Props {
3
+ spec: ControlSpec;
4
+ value: number;
5
+ onchange: (value: number) => void;
6
+ disabled?: boolean;
7
+ /** Overrides `spec.label` (also the accessible name). */
8
+ label?: string;
9
+ }
10
+ declare const ControlSlider: import("svelte").Component<Props, {}, "">;
11
+ type ControlSlider = ReturnType<typeof ControlSlider>;
12
+ export default ControlSlider;
13
+ //# sourceMappingURL=ControlSlider.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ControlSlider.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/ControlSlider.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAI/D,UAAU,KAAK;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyBH,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -0,0 +1,105 @@
1
+ <script lang="ts">
2
+ import type { CurvePoint, ImageHistogram } from '@pixerate/editor/image-editor';
3
+ import {
4
+ boxToCurvePoint,
5
+ curvePointToBox,
6
+ curveSvgPath,
7
+ hitTestCurvePoint,
8
+ histogramPath,
9
+ insertCurvePoint,
10
+ moveCurvePoint,
11
+ removeCurvePoint,
12
+ } from '@pixerate/editor/image-editor';
13
+
14
+ interface Props {
15
+ points: CurvePoint[];
16
+ /** `commit` is true for the first change of a gesture (one undo step), false for the drag moves. */
17
+ onchange: (points: CurvePoint[], commit: boolean) => void;
18
+ histogram?: ImageHistogram | null;
19
+ channel?: 'master' | 'red' | 'green' | 'blue';
20
+ size?: number;
21
+ }
22
+
23
+ let { points, onchange, histogram = null, channel = 'master', size = 200 }: Props = $props();
24
+
25
+ const BOX = 256;
26
+ const STROKE = { master: '#e2e8f0', red: '#ef4444', green: '#22c55e', blue: '#3b82f6' };
27
+
28
+ let svgEl: SVGSVGElement | undefined = $state();
29
+ let drag: number | null = $state(null);
30
+
31
+ function toBox(e: MouseEvent) {
32
+ const rect = svgEl?.getBoundingClientRect();
33
+ if (!rect || !rect.width || !rect.height) return { x: 0, y: 0 };
34
+ return { x: ((e.clientX - rect.left) / rect.width) * BOX, y: ((e.clientY - rect.top) / rect.height) * BOX };
35
+ }
36
+
37
+ function onpointerdown(e: PointerEvent) {
38
+ const { x, y } = toBox(e);
39
+ let index = hitTestCurvePoint(points, x, y, BOX, BOX, 10);
40
+ if (index === -1) {
41
+ const inserted = insertCurvePoint(points, boxToCurvePoint(x, y, BOX, BOX));
42
+ onchange(inserted.points, true);
43
+ index = inserted.index;
44
+ } else {
45
+ onchange(points, true);
46
+ }
47
+ drag = index;
48
+ (e.target as Element).setPointerCapture?.(e.pointerId);
49
+ }
50
+
51
+ function onpointermove(e: PointerEvent) {
52
+ if (drag === null) return;
53
+ const { x, y } = toBox(e);
54
+ onchange(moveCurvePoint(points, drag, boxToCurvePoint(x, y, BOX, BOX)), false);
55
+ }
56
+
57
+ function ondblclick(e: MouseEvent) {
58
+ const { x, y } = toBox(e);
59
+ const index = hitTestCurvePoint(points, x, y, BOX, BOX, 10);
60
+ if (index !== -1 && points.length > 2) onchange(removeCurvePoint(points, index), true);
61
+ }
62
+
63
+ const histChannel = $derived(channel === 'master' ? 'luminance' : channel);
64
+ </script>
65
+
66
+ <!-- Curves editor over the histogram: click to add a point, drag to move it, double-click to remove it. -->
67
+ <svg
68
+ bind:this={svgEl}
69
+ viewBox="0 0 {BOX} {BOX}"
70
+ width={size}
71
+ height={size}
72
+ role="application"
73
+ aria-label="{channel} curve"
74
+ data-testid="curves-editor"
75
+ class="rounded bg-slate-950/70 touch-none select-none cursor-crosshair"
76
+ {onpointerdown}
77
+ {onpointermove}
78
+ onpointerup={() => (drag = null)}
79
+ onpointercancel={() => (drag = null)}
80
+ {ondblclick}
81
+ >
82
+ {#if histogram && histogram.samples > 0}
83
+ <path d={histogramPath(histogram, histChannel, BOX, BOX)} fill="rgba(148, 163, 184, 0.25)" />
84
+ {/if}
85
+ {#each [64, 128, 192] as v (v)}
86
+ <g stroke="rgba(148, 163, 184, 0.2)" stroke-width="1">
87
+ <line x1={v} y1="0" x2={v} y2={BOX} />
88
+ <line x1="0" y1={v} x2={BOX} y2={v} />
89
+ </g>
90
+ {/each}
91
+ <line x1="0" y1={BOX} x2={BOX} y2="0" stroke="rgba(148, 163, 184, 0.35)" stroke-dasharray="4 4" />
92
+ <path d={curveSvgPath(points, BOX, BOX)} fill="none" stroke={STROKE[channel]} stroke-width="2" />
93
+ {#each points as p, i (i)}
94
+ {@const b = curvePointToBox(p, BOX, BOX)}
95
+ <circle
96
+ cx={b.x}
97
+ cy={b.y}
98
+ r="5"
99
+ fill={drag === i ? STROKE[channel] : '#0f172a'}
100
+ stroke={STROKE[channel]}
101
+ stroke-width="2"
102
+ aria-label="Point {p.input} to {p.output}"
103
+ />
104
+ {/each}
105
+ </svg>
@@ -0,0 +1,13 @@
1
+ import type { CurvePoint, ImageHistogram } from '@pixerate/editor/image-editor';
2
+ interface Props {
3
+ points: CurvePoint[];
4
+ /** `commit` is true for the first change of a gesture (one undo step), false for the drag moves. */
5
+ onchange: (points: CurvePoint[], commit: boolean) => void;
6
+ histogram?: ImageHistogram | null;
7
+ channel?: 'master' | 'red' | 'green' | 'blue';
8
+ size?: number;
9
+ }
10
+ declare const CurvesEditor: import("svelte").Component<Props, {}, "">;
11
+ type CurvesEditor = ReturnType<typeof CurvesEditor>;
12
+ export default CurvesEditor;
13
+ //# sourceMappingURL=CurvesEditor.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurvesEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/CurvesEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAa9E,UAAU,KAAK;IACb,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,oGAAoG;IACpG,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAsEH,QAAA,MAAM,YAAY,2CAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,49 @@
1
+ <script lang="ts">
2
+ import type { ImageHistogram } from '@pixerate/editor/image-editor';
3
+ import { histogramPath } from '@pixerate/editor/image-editor';
4
+
5
+ interface Props {
6
+ histogram: ImageHistogram | null;
7
+ /** `rgb` overlays the three channels on the luminance; a single channel draws just that one. */
8
+ channel?: 'rgb' | 'luminance' | 'red' | 'green' | 'blue';
9
+ height?: number;
10
+ class?: string;
11
+ }
12
+
13
+ let { histogram, channel = 'rgb', height = 64, class: className = '' }: Props = $props();
14
+
15
+ const W = 256;
16
+ const FILL: Record<'luminance' | 'red' | 'green' | 'blue', string> = {
17
+ luminance: 'rgba(148, 163, 184, 0.45)',
18
+ red: 'rgba(239, 68, 68, 0.45)',
19
+ green: 'rgba(34, 197, 94, 0.45)',
20
+ blue: 'rgba(59, 130, 246, 0.45)',
21
+ };
22
+
23
+ const channels = $derived(channel === 'rgb' ? (['luminance', 'red', 'green', 'blue'] as const) : ([channel] as const));
24
+ const paths = $derived(
25
+ histogram && histogram.samples > 0 ? channels.map((c) => ({ c, d: histogramPath(histogram, c, W, height) })) : []
26
+ );
27
+ const clipLow = $derived(histogram && histogram.samples ? Math.max(...histogram.shadows) / histogram.samples : 0);
28
+ const clipHigh = $derived(histogram && histogram.samples ? Math.max(...histogram.highlights) / histogram.samples : 0);
29
+ </script>
30
+
31
+ <svg
32
+ viewBox="0 0 {W} {height}"
33
+ preserveAspectRatio="none"
34
+ role="img"
35
+ aria-label={histogram ? `Histogram of ${histogram.samples} pixels` : 'Histogram (no data)'}
36
+ data-testid="image-editor-histogram"
37
+ class="w-full rounded bg-slate-950/60 {className}"
38
+ style="height: {height}px"
39
+ >
40
+ {#each paths as p (p.c)}
41
+ <path d={p.d} fill={FILL[p.c]} stroke="none" />
42
+ {/each}
43
+ {#if clipLow > 0.005}
44
+ <rect x="0" y="0" width="3" {height} fill="#3b82f6" data-testid="histogram-clip-shadows" />
45
+ {/if}
46
+ {#if clipHigh > 0.005}
47
+ <rect x={W - 3} y="0" width="3" {height} fill="#ef4444" data-testid="histogram-clip-highlights" />
48
+ {/if}
49
+ </svg>
@@ -0,0 +1,12 @@
1
+ import type { ImageHistogram } from '@pixerate/editor/image-editor';
2
+ interface Props {
3
+ histogram: ImageHistogram | null;
4
+ /** `rgb` overlays the three channels on the luminance; a single channel draws just that one. */
5
+ channel?: 'rgb' | 'luminance' | 'red' | 'green' | 'blue';
6
+ height?: number;
7
+ class?: string;
8
+ }
9
+ declare const Histogram: import("svelte").Component<Props, {}, "">;
10
+ type Histogram = ReturnType<typeof Histogram>;
11
+ export default Histogram;
12
+ //# sourceMappingURL=Histogram.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Histogram.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/Histogram.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAIlE,UAAU,KAAK;IACb,SAAS,EAAE,cAAc,GAAG,IAAI,CAAC;IACjC,gGAAgG;IAChG,OAAO,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsCH,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -16,7 +16,14 @@
16
16
  getCropCursor,
17
17
  calculateCropDrag,
18
18
  hitTestAnnotation,
19
+ normalizeProcessVersion,
20
+ LATEST_PROCESS_VERSION,
21
+ IMAGE_ADJUSTMENT_CONTROLS,
22
+ readAdjustmentControls,
19
23
  } from '@pixerate/editor/image-editor';
24
+ import ControlSlider from './ControlSlider.svelte';
25
+ import Histogram from './Histogram.svelte';
26
+ import AdjustmentLayersPanel from './AdjustmentLayersPanel.svelte';
20
27
  import { onDestroy, untrack } from 'svelte';
21
28
  import { createReactiveImageEditor, type ReactiveImageEditor } from './imageEditorState.svelte.js';
22
29
 
@@ -47,6 +54,9 @@
47
54
  const internalEditor = createReactiveImageEditor();
48
55
  const editor = $derived(propEditor || internalEditor);
49
56
  onDestroy(() => internalEditor.destroy());
57
+ const legacyProcess = $derived(
58
+ normalizeProcessVersion(editor.state.adjustments.process) < LATEST_PROCESS_VERSION
59
+ );
50
60
 
51
61
  let canvasEl = $state<HTMLCanvasElement | null>(null);
52
62
  let containerEl = $state<HTMLDivElement | null>(null);
@@ -881,116 +891,37 @@
881
891
  </button>
882
892
  </div>
883
893
 
884
- <!-- Brightness -->
885
- <div>
886
- <div class="flex justify-between text-slate-400 mb-1">
887
- <span>Brightness</span>
888
- <span class="font-mono">{editor.state.adjustments.brightness}</span>
889
- </div>
890
- <input
891
- type="range"
892
- min="-100"
893
- max="100"
894
- value={editor.state.adjustments.brightness}
895
- oninput={(e) => editor.setAdjustments({ brightness: Number((e.target as HTMLInputElement).value) })}
896
- class="w-full accent-indigo-500"
897
- />
898
- </div>
899
-
900
- <!-- Contrast -->
901
- <div>
902
- <div class="flex justify-between text-slate-400 mb-1">
903
- <span>Contrast</span>
904
- <span class="font-mono">{editor.state.adjustments.contrast}</span>
905
- </div>
906
- <input
907
- type="range"
908
- min="-100"
909
- max="100"
910
- value={editor.state.adjustments.contrast}
911
- oninput={(e) => editor.setAdjustments({ contrast: Number((e.target as HTMLInputElement).value) })}
912
- class="w-full accent-indigo-500"
913
- />
914
- </div>
915
-
916
- <!-- Saturation -->
917
- <div>
918
- <div class="flex justify-between text-slate-400 mb-1">
919
- <span>Saturation</span>
920
- <span class="font-mono">{editor.state.adjustments.saturation}</span>
921
- </div>
922
- <input
923
- type="range"
924
- min="-100"
925
- max="100"
926
- value={editor.state.adjustments.saturation}
927
- oninput={(e) => editor.setAdjustments({ saturation: Number((e.target as HTMLInputElement).value) })}
928
- class="w-full accent-indigo-500"
929
- />
930
- </div>
931
-
932
- <!-- Exposure -->
933
- <div>
934
- <div class="flex justify-between text-slate-400 mb-1">
935
- <span>Exposure</span>
936
- <span class="font-mono">{editor.state.adjustments.exposure}</span>
937
- </div>
938
- <input
939
- type="range"
940
- min="-100"
941
- max="100"
942
- value={editor.state.adjustments.exposure}
943
- oninput={(e) => editor.setAdjustments({ exposure: Number((e.target as HTMLInputElement).value) })}
944
- class="w-full accent-indigo-500"
945
- />
946
- </div>
894
+ <Histogram histogram={editor.histogram} />
947
895
 
948
- <!-- Temperature / Warmth -->
949
- <div>
950
- <div class="flex justify-between text-slate-400 mb-1">
951
- <span>Warmth / Temperature</span>
952
- <span class="font-mono">{editor.state.adjustments.temperature}</span>
953
- </div>
954
- <input
955
- type="range"
956
- min="-100"
957
- max="100"
958
- value={editor.state.adjustments.temperature}
959
- oninput={(e) => editor.setAdjustments({ temperature: Number((e.target as HTMLInputElement).value) })}
960
- class="w-full accent-indigo-500"
896
+ {#each IMAGE_ADJUSTMENT_CONTROLS as spec (spec.id)}
897
+ <ControlSlider
898
+ {spec}
899
+ value={readAdjustmentControls(editor.state.adjustments)[spec.id]}
900
+ disabled={spec.requiresProcess !== undefined && legacyProcess}
901
+ onchange={(v) => editor.setAdjustments({ [spec.id]: v })}
961
902
  />
962
- </div>
963
-
964
- <!-- Blur -->
965
- <div>
966
- <div class="flex justify-between text-slate-400 mb-1">
967
- <span>Blur</span>
968
- <span class="font-mono">{editor.state.adjustments.blur}px</span>
969
- </div>
970
- <input
971
- type="range"
972
- min="0"
973
- max="30"
974
- value={editor.state.adjustments.blur}
975
- oninput={(e) => editor.setAdjustments({ blur: Number((e.target as HTMLInputElement).value) })}
976
- class="w-full accent-indigo-500"
977
- />
978
- </div>
903
+ {#if spec.id === 'tint' && legacyProcess}
904
+ <div
905
+ class="flex items-center justify-between gap-2 rounded border border-amber-500/30 bg-amber-500/10 px-2 py-1.5 text-[10px] text-amber-200"
906
+ data-testid="image-editor-process-notice"
907
+ >
908
+ <span>Legacy rendering (process 1). Tint needs the current process.</span>
909
+ <button
910
+ type="button"
911
+ onclick={() => editor.upgradeProcess()}
912
+ class="shrink-0 rounded bg-amber-500/20 px-2 py-0.5 hover:bg-amber-500/30"
913
+ >
914
+ Update
915
+ </button>
916
+ </div>
917
+ {/if}
918
+ {/each}
979
919
 
980
- <!-- Opacity -->
981
- <div>
982
- <div class="flex justify-between text-slate-400 mb-1">
983
- <span>Opacity</span>
984
- <span class="font-mono">{Math.round(editor.state.adjustments.opacity * 100)}%</span>
985
- </div>
986
- <input
987
- type="range"
988
- min="0"
989
- max="1"
990
- step="0.05"
991
- value={editor.state.adjustments.opacity}
992
- oninput={(e) => editor.setAdjustments({ opacity: Number((e.target as HTMLInputElement).value) })}
993
- class="w-full accent-indigo-500"
920
+ <div class="border-t border-slate-700/60 pt-3">
921
+ <AdjustmentLayersPanel
922
+ controller={editor.controller}
923
+ layers={editor.state.adjustments.layers}
924
+ histogram={editor.histogram}
994
925
  />
995
926
  </div>
996
927
  </div>
@@ -1 +1 @@
1
- {"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/ImageEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIR,aAAa,EAGb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AASzC,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGjG,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AA+hCH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ImageEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/ImageEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAIR,aAAa,EAGb,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,+BAA+B,CAAC;AAgBzC,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGjG,UAAU,KAAK;IACb,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,kBAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1C,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAw/BH,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -1,8 +1,10 @@
1
- import { ImageEditorController, type ImageEditorOptions, type ImageEditorState, type ImageEditorTool, type CropBox, type AspectRatio, type ImageAdjustments, type DepthMaskOptions, type Annotation, type CreateAnnotationPayload, type ExportOptions, type SerializedImageEditorState, type ImagePoint } from '@pixerate/editor/image-editor';
1
+ import { ImageEditorController, type ImageEditorOptions, type ImageEditorState, type ImageEditorTool, type CropBox, type AspectRatio, type ImageAdjustments, type DepthMaskOptions, type Annotation, type CreateAnnotationPayload, type ExportOptions, type SerializedImageEditorState, type ImagePoint, type AdjustmentKind, type AdjustmentLayerInit, type AdjustmentLayerUpdate, type ImageHistogram } from '@pixerate/editor/image-editor';
2
2
  export declare function createReactiveImageEditor(options?: ImageEditorOptions): {
3
3
  readonly controller: ImageEditorController;
4
4
  readonly state: ImageEditorState;
5
5
  readonly canUndo: boolean;
6
+ /** Histogram of the last rendered preview (after adjustments and layers); null before a render. */
7
+ readonly histogram: ImageHistogram | null;
6
8
  readonly canRedo: boolean;
7
9
  setTool(tool: ImageEditorTool): void;
8
10
  setCrop(crop: CropBox | null, addToHistory?: boolean): void;
@@ -14,6 +16,14 @@ export declare function createReactiveImageEditor(options?: ImageEditorOptions):
14
16
  flipVertical(): void;
15
17
  setAdjustments(partial: Partial<ImageAdjustments>, commitToHistory?: boolean): void;
16
18
  resetAdjustments(): void;
19
+ /** Update to Current Process: re-render the adjustments with the latest process (one undo step). */
20
+ upgradeProcess(): boolean;
21
+ /** Adds an adjustment layer (one undo step) and returns its id. */
22
+ addAdjustmentLayer(init: AdjustmentKind | AdjustmentLayerInit, index?: number): string;
23
+ updateAdjustmentLayer(id: string, update: AdjustmentLayerUpdate, commitToHistory?: boolean): boolean;
24
+ removeAdjustmentLayer(id: string): boolean;
25
+ moveAdjustmentLayer(id: string, toIndex: number): boolean;
26
+ toggleAdjustmentLayer(id: string, enabled?: boolean): boolean;
17
27
  setDepthMask(partial: Partial<DepthMaskOptions>): void;
18
28
  resetDepthMask(): void;
19
29
  addAnnotation(ann: CreateAnnotationPayload): string;
@@ -50,4 +60,9 @@ export declare function createReactiveImageEditor(options?: ImageEditorOptions):
50
60
  destroy(): void;
51
61
  };
52
62
  export type ReactiveImageEditor = ReturnType<typeof createReactiveImageEditor>;
63
+ /** The preview histogram of an image editor controller as a rune (`current`), updated after every render. */
64
+ export declare function createImageHistogram(controller: ImageEditorController): {
65
+ readonly current: ImageHistogram | null;
66
+ destroy(): void;
67
+ };
53
68
  //# sourceMappingURL=imageEditorState.svelte.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"imageEditorState.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/imageEditorState.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAC;AAEvC,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB;;;;;kBA0BxD,eAAe;kBAGf,OAAO,GAAG,IAAI;2BAGL,WAAW;;oBAMlB,MAAM;yBAGD,MAAM;;;4BASH,OAAO,CAAC,gBAAgB,CAAC;;0BAM3B,OAAO,CAAC,gBAAgB,CAAC;;uBAM5B,uBAAuB;yBAGrB,MAAM,WAAW,OAAO,CAAC,UAAU,CAAC;yBAGpC,MAAM;;yBAMN,MAAM,GAAG,IAAI;;;;oBAYlB,MAAM;qBAGL,MAAM;;kBAMT,MAAM;gBAGR,UAAU;4BAGE,OAAO;mBAGhB,MAAM,GAAG,gBAAgB;qBAGvB,aAAa;kBAGhB,aAAa;;mBAMZ,0BAA0B;sBAGvB;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;yBAG5C;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;2BAG7C,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAC;oCAGhC,MAAM;4CAGE,MAAM;IAG9C,8EAA8E;;EAKjF;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC"}
1
+ {"version":3,"file":"imageEditorState.svelte.d.ts","sourceRoot":"","sources":["../../src/image-editor/imageEditorState.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAEvC,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,kBAAuB;;;;IA2BtE,mGAAmG;;;kBAQrF,eAAe;kBAGf,OAAO,GAAG,IAAI;2BAGL,WAAW;;oBAMlB,MAAM;yBAGD,MAAM;;;4BASH,OAAO,CAAC,gBAAgB,CAAC;;IAMjD,oGAAoG;;IAIpG,mEAAmE;6BAC1C,cAAc,GAAG,mBAAmB,UAAU,MAAM;8BAGnD,MAAM,UAAU,qBAAqB;8BAGrC,MAAM;4BAGR,MAAM,WAAW,MAAM;8BAGrB,MAAM,YAAY,OAAO;0BAG7B,OAAO,CAAC,gBAAgB,CAAC;;uBAM5B,uBAAuB;yBAGrB,MAAM,WAAW,OAAO,CAAC,UAAU,CAAC;yBAGpC,MAAM;;yBAMN,MAAM,GAAG,IAAI;;;;oBAYlB,MAAM;qBAGL,MAAM;;kBAMT,MAAM;gBAGR,UAAU;4BAGE,OAAO;mBAGhB,MAAM,GAAG,gBAAgB;qBAGvB,aAAa;kBAGhB,aAAa;;mBAMZ,0BAA0B;sBAGvB;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;yBAG5C;QAAE,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE;2BAG7C,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,SAAS,CAAC;oCAGhC,MAAM;4CAGE,MAAM;IAG9C,8EAA8E;;EAMjF;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE/E,6GAA6G;AAC7G,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,qBAAqB;;;EAarE"}
@@ -3,10 +3,14 @@ export function createReactiveImageEditor(options = {}) {
3
3
  const controller = new ImageEditorController(options);
4
4
  let state = $state(controller.getState());
5
5
  let historyTicks = $state(0);
6
+ let histogram = $state.raw(controller.getHistogram());
6
7
  const unsubscribe = controller.subscribe((updated) => {
7
8
  state = { ...updated };
8
9
  historyTicks++;
9
10
  });
11
+ const unsubscribeHistogram = controller.subscribeHistogram((h) => {
12
+ histogram = h;
13
+ });
10
14
  return {
11
15
  get controller() {
12
16
  return controller;
@@ -19,6 +23,10 @@ export function createReactiveImageEditor(options = {}) {
19
23
  void historyTicks;
20
24
  return controller.canUndo;
21
25
  },
26
+ /** Histogram of the last rendered preview (after adjustments and layers); null before a render. */
27
+ get histogram() {
28
+ return histogram;
29
+ },
22
30
  get canRedo() {
23
31
  void historyTicks;
24
32
  return controller.canRedo;
@@ -53,6 +61,26 @@ export function createReactiveImageEditor(options = {}) {
53
61
  resetAdjustments() {
54
62
  controller.resetAdjustments();
55
63
  },
64
+ /** Update to Current Process: re-render the adjustments with the latest process (one undo step). */
65
+ upgradeProcess() {
66
+ return controller.upgradeProcess();
67
+ },
68
+ /** Adds an adjustment layer (one undo step) and returns its id. */
69
+ addAdjustmentLayer(init, index) {
70
+ return controller.addAdjustmentLayer(init, index);
71
+ },
72
+ updateAdjustmentLayer(id, update, commitToHistory = true) {
73
+ return controller.updateAdjustmentLayer(id, update, commitToHistory);
74
+ },
75
+ removeAdjustmentLayer(id) {
76
+ return controller.removeAdjustmentLayer(id);
77
+ },
78
+ moveAdjustmentLayer(id, toIndex) {
79
+ return controller.moveAdjustmentLayer(id, toIndex);
80
+ },
81
+ toggleAdjustmentLayer(id, enabled) {
82
+ return controller.toggleAdjustmentLayer(id, enabled);
83
+ },
56
84
  setDepthMask(partial) {
57
85
  controller.setDepthMask(partial);
58
86
  },
@@ -132,6 +160,22 @@ export function createReactiveImageEditor(options = {}) {
132
160
  return controller.applyBackgroundRemovedImage(newDataUrl);
133
161
  },
134
162
  /** Stops syncing controller state; call when the editor is no longer used. */
163
+ destroy() {
164
+ unsubscribe();
165
+ unsubscribeHistogram();
166
+ },
167
+ };
168
+ }
169
+ /** The preview histogram of an image editor controller as a rune (`current`), updated after every render. */
170
+ export function createImageHistogram(controller) {
171
+ let current = $state.raw(controller.getHistogram());
172
+ const unsubscribe = controller.subscribeHistogram((h) => {
173
+ current = h;
174
+ });
175
+ return {
176
+ get current() {
177
+ return current;
178
+ },
135
179
  destroy() {
136
180
  unsubscribe();
137
181
  },
@@ -1,6 +1,18 @@
1
1
  import type { ComponentProps } from "svelte";
2
2
  import type ImageEditorComponent from "./ImageEditor.svelte";
3
+ import type HistogramComponent from "./Histogram.svelte";
4
+ import type AdjustmentLayersPanelComponent from "./AdjustmentLayersPanel.svelte";
5
+ import type CurvesEditorComponent from "./CurvesEditor.svelte";
6
+ import type ControlSliderComponent from "./ControlSlider.svelte";
3
7
  export { default as ImageEditor } from './ImageEditor.svelte';
8
+ export { default as Histogram } from './Histogram.svelte';
9
+ export { default as AdjustmentLayersPanel } from './AdjustmentLayersPanel.svelte';
10
+ export { default as CurvesEditor } from './CurvesEditor.svelte';
11
+ export { default as ControlSlider } from './ControlSlider.svelte';
4
12
  export * from './imageEditorState.svelte.js';
5
13
  export type ImageEditorProps = ComponentProps<typeof ImageEditorComponent>;
14
+ export type HistogramProps = ComponentProps<typeof HistogramComponent>;
15
+ export type AdjustmentLayersPanelProps = ComponentProps<typeof AdjustmentLayersPanelComponent>;
16
+ export type CurvesEditorProps = ComponentProps<typeof CurvesEditorComponent>;
17
+ export type ControlSliderProps = ComponentProps<typeof ControlSliderComponent>;
6
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/image-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,cAAc,8BAA8B,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/image-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,oBAAoB,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,kBAAkB,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,8BAA8B,MAAM,gCAAgC,CAAC;AACjF,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,cAAc,8BAA8B,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAC3E,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACvE,MAAM,MAAM,0BAA0B,GAAG,cAAc,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAC/F,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC7E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -1,2 +1,6 @@
1
1
  export { default as ImageEditor } from './ImageEditor.svelte';
2
+ export { default as Histogram } from './Histogram.svelte';
3
+ export { default as AdjustmentLayersPanel } from './AdjustmentLayersPanel.svelte';
4
+ export { default as CurvesEditor } from './CurvesEditor.svelte';
5
+ export { default as ControlSlider } from './ControlSlider.svelte';
2
6
  export * from './imageEditorState.svelte.js';
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import type BubbleMenuComponent from "./BubbleMenu.svelte";
4
4
  import type TemplateRendererComponent from "./TemplateRenderer.svelte";
5
5
  import type VariableFormComponent from "./VariableForm.svelte";
6
6
  import type OutlinePanelComponent from "./OutlinePanel.svelte";
7
+ import type MergePreviewComponent from "./MergePreview.svelte";
7
8
  export * from "./editor.svelte.js";
8
9
  export * from "./navigationGuard.js";
9
10
  export * from "./createNavigationGuard.svelte.js";
@@ -11,8 +12,9 @@ export * from "./history/index.js";
11
12
  export * from "./fileImport.svelte.js";
12
13
  export * from "./agentTools.svelte.js";
13
14
  export * from "./outline.svelte.js";
14
- export { DirtyTracker, createDirtyTracker, defaultIsEqual, HistoryManager, createHistoryManager, } from "@pixerate/editor";
15
- export type { DirtyTrackerOptions, Command, HistoryState, HistoryManagerOptions, } from "@pixerate/editor";
15
+ export * from "./merge.svelte.js";
16
+ export { DirtyTracker, createDirtyTracker, defaultIsEqual, HistoryManager, createHistoryManager, bindDirtyToHistory, withoutDirty, } from "@pixerate/editor";
17
+ export type { DirtyTrackerOptions, Command, HistoryState, HistoryManagerOptions, HistoryEntry, HistoryMark, MergedExecutionOptions, HistoryDirtyBinding, BindDirtyToHistoryOptions, } from "@pixerate/editor";
16
18
  export type EditableTextNodeEditorProps = ComponentProps<typeof EditableTextNodeEditorComponent>;
17
19
  export type BubbleMenuProps = ComponentProps<typeof BubbleMenuComponent>;
18
20
  export type TemplateRendererProps = ComponentProps<typeof TemplateRendererComponent>;
@@ -21,11 +23,17 @@ export { default as EditableTextNodeEditor } from "./EditableTextNodeEditor.svel
21
23
  export { default as BubbleMenu } from "./BubbleMenu.svelte";
22
24
  export { default as TemplateRenderer } from "./TemplateRenderer.svelte";
23
25
  export { default as VariableForm } from "./VariableForm.svelte";
26
+ export type MergePreviewProps = ComponentProps<typeof MergePreviewComponent>;
27
+ export { default as MergePreview } from "./MergePreview.svelte";
24
28
  export type OutlinePanelProps = ComponentProps<typeof OutlinePanelComponent>;
25
29
  export { default as OutlinePanel } from "./OutlinePanel.svelte";
26
30
  export type { Template, TemplateVersion, Token, TokenType, ColorGradient, RichTextPresetOptions, ImageOptions, } from "@pixerate/editor";
27
- export type { PromptValues, PromptDiagnostic, VariableFormField, } from "@pixerate/editor";
31
+ export type { PromptValues, PromptDiagnostic, VariableFormField, MergeDataSource, MergeRecord, MergeRecordsResult, MergeOutput, } from "@pixerate/editor";
28
32
  export * from "./spreadsheet/index.js";
29
33
  export * from "./image-editor/index.js";
30
34
  export * from "./review/index.js";
35
+ export * from "./commands/index.js";
36
+ export * from "./persistence/index.js";
37
+ export * from "./generation/index.js";
38
+ export * from "./find-replace/index.js";
31
39
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,KAAK,+BAA+B,MAAM,iCAAiC,CAAC;AACnF,OAAO,KAAK,mBAAmB,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,yBAAyB,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAE/D,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAEpC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,2BAA2B,GAAG,cAAc,CACtD,OAAO,+BAA+B,CACvC,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACzE,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAChD,OAAO,yBAAyB,CACjC,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE7E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EACV,QAAQ,EACR,eAAe,EACf,KAAK,EACL,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,OAAO,KAAK,+BAA+B,MAAM,iCAAiC,CAAC;AACnF,OAAO,KAAK,mBAAmB,MAAM,qBAAqB,CAAC;AAC3D,OAAO,KAAK,yBAAyB,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,qBAAqB,MAAM,uBAAuB,CAAC;AAE/D,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAElC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,qBAAqB,EACrB,YAAY,EACZ,WAAW,EACX,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,MAAM,MAAM,2BAA2B,GAAG,cAAc,CACtD,OAAO,+BAA+B,CACvC,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACzE,MAAM,MAAM,qBAAqB,GAAG,cAAc,CAChD,OAAO,yBAAyB,CACjC,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE7E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAChE,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAEhE,YAAY,EACV,QAAQ,EACR,eAAe,EACf,KAAK,EACL,SAAS,EACT,aAAa,EACb,qBAAqB,EACrB,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAE1B,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}