@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
package/dist/index.js CHANGED
@@ -5,12 +5,18 @@ export * from "./history/index.js";
5
5
  export * from "./fileImport.svelte.js";
6
6
  export * from "./agentTools.svelte.js";
7
7
  export * from "./outline.svelte.js";
8
- export { DirtyTracker, createDirtyTracker, defaultIsEqual, HistoryManager, createHistoryManager, } from "@pixerate/editor";
8
+ export * from "./merge.svelte.js";
9
+ export { DirtyTracker, createDirtyTracker, defaultIsEqual, HistoryManager, createHistoryManager, bindDirtyToHistory, withoutDirty, } from "@pixerate/editor";
9
10
  export { default as EditableTextNodeEditor } from "./EditableTextNodeEditor.svelte";
10
11
  export { default as BubbleMenu } from "./BubbleMenu.svelte";
11
12
  export { default as TemplateRenderer } from "./TemplateRenderer.svelte";
12
13
  export { default as VariableForm } from "./VariableForm.svelte";
14
+ export { default as MergePreview } from "./MergePreview.svelte";
13
15
  export { default as OutlinePanel } from "./OutlinePanel.svelte";
14
16
  export * from "./spreadsheet/index.js";
15
17
  export * from "./image-editor/index.js";
16
18
  export * from "./review/index.js";
19
+ export * from "./commands/index.js";
20
+ export * from "./persistence/index.js";
21
+ export * from "./generation/index.js";
22
+ export * from "./find-replace/index.js";
@@ -0,0 +1,51 @@
1
+ import { type MergeRecordsOptions, type MergeRecordsResult, type ParseDataSourceOptions, type Template } from "@pixerate/editor";
2
+ export interface MergePreviewOptions {
3
+ /** The prompt merged with each record. */
4
+ template: string;
5
+ templates?: Template[];
6
+ bindings?: Record<string, string>;
7
+ /** How to read the data source text. */
8
+ parseOptions?: ParseDataSourceOptions;
9
+ /** Passed to `mergeRecords` by `merge()`. */
10
+ skipIf?: MergeRecordsOptions["skipIf"];
11
+ separator?: string;
12
+ maxOutputs?: number;
13
+ }
14
+ /**
15
+ * Reactive mail-merge preview state for Svelte 5 (the counterpart of React's
16
+ * `useMergePreview`): parses a pasted or loaded data source, matches its
17
+ * fields to the template's variables (editable), steps through records and
18
+ * merges them all with `mergeRecords`.
19
+ *
20
+ * `getOptions` is read reactively, so pass `() => ({ template, templates })`
21
+ * built from props or state.
22
+ */
23
+ export declare function createMergePreview(getOptions: () => MergePreviewOptions, initialSource?: string): {
24
+ sourceText: string;
25
+ setSourceText: (text: string) => void;
26
+ /** Reads a picked file (CSV, TSV or JSON) into `sourceText`. */
27
+ loadFile(file: Blob): Promise<void>;
28
+ readonly source: import("@pixerate/editor").MergeDataSource;
29
+ /** Variable names the template uses, in order. */
30
+ readonly variables: string[];
31
+ /** Variable → field: automatic matches with the user's overrides applied. */
32
+ readonly mapping: Record<string, string | null>;
33
+ setFieldMapping(variable: string, field: string | null): void;
34
+ resetMapping(): void;
35
+ /** 0-based index of the previewed record. */
36
+ readonly index: number;
37
+ readonly count: number;
38
+ setIndex: (next: number) => void;
39
+ next(): void;
40
+ prev(): void;
41
+ readonly record: import("@pixerate/editor").MergeRecord;
42
+ /** Prompt values for the previewed record. */
43
+ readonly values: import("@pixerate/editor").PromptValues;
44
+ /** Merges every record with the current mapping and stores the result. */
45
+ merge(): MergeRecordsResult;
46
+ readonly result: MergeRecordsResult | null;
47
+ /** The last merge's outputs as text or JSON. */
48
+ serialize(format: "text" | "json"): string;
49
+ };
50
+ export type MergePreviewState = ReturnType<typeof createMergePreview>;
51
+ //# sourceMappingURL=merge.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.svelte.d.ts","sourceRoot":"","sources":["../src/merge.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,wCAAwC;IACxC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,6CAA6C;IAC7C,MAAM,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,mBAAmB,EACrC,aAAa,SAAK;gBA4CK,MAAM;0BAbA,MAAM;IAiBjC,gEAAgE;mBAC3C,IAAI;;IAMzB,kDAAkD;;IAIlD,6EAA6E;;8BAInD,MAAM,SAAS,MAAM,GAAG,IAAI;;IAOtD,6CAA6C;;;qBAlCvB,MAAM;;;;IAmD5B,8CAA8C;;IAI9C,0EAA0E;aACjE,kBAAkB;;IAe3B,gDAAgD;sBAC9B,MAAM,GAAG,MAAM,GAAG,MAAM;EAI7C;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { extractVariables, matchFields, mergeRecords, parseDataSource, recordToValues, serializeMergeOutputs, } from "@pixerate/editor";
2
+ /**
3
+ * Reactive mail-merge preview state for Svelte 5 (the counterpart of React's
4
+ * `useMergePreview`): parses a pasted or loaded data source, matches its
5
+ * fields to the template's variables (editable), steps through records and
6
+ * merges them all with `mergeRecords`.
7
+ *
8
+ * `getOptions` is read reactively, so pass `() => ({ template, templates })`
9
+ * built from props or state.
10
+ */
11
+ export function createMergePreview(getOptions, initialSource = "") {
12
+ let sourceText = $state(initialSource);
13
+ let overrides = $state.raw({});
14
+ let index = $state(0);
15
+ let result = $state.raw(null);
16
+ const options = $derived(getOptions());
17
+ const source = $derived(parseDataSource(sourceText, options.parseOptions));
18
+ const variables = $derived(extractVariables(options.template, {
19
+ templates: options.templates,
20
+ bindings: options.bindings,
21
+ }).map((v) => v.name));
22
+ const mapping = $derived.by(() => {
23
+ const merged = {
24
+ ...matchFields(variables, source.fields).mapping,
25
+ };
26
+ for (const [variable, field] of Object.entries(overrides)) {
27
+ if (variables.includes(variable) && (field === null || source.fields.includes(field))) {
28
+ merged[variable] = field;
29
+ }
30
+ }
31
+ return merged;
32
+ });
33
+ const count = $derived(source.records.length);
34
+ const current = $derived(count === 0 ? 0 : Math.min(index, count - 1));
35
+ const record = $derived(source.records[current]);
36
+ const values = $derived(record ? recordToValues(record, mapping) : {});
37
+ function setSourceText(text) {
38
+ sourceText = text;
39
+ index = 0;
40
+ result = null;
41
+ }
42
+ function setIndex(next) {
43
+ index = Math.max(0, Math.min(next, count - 1));
44
+ }
45
+ return {
46
+ get sourceText() {
47
+ return sourceText;
48
+ },
49
+ set sourceText(text) {
50
+ setSourceText(text);
51
+ },
52
+ setSourceText,
53
+ /** Reads a picked file (CSV, TSV or JSON) into `sourceText`. */
54
+ async loadFile(file) {
55
+ setSourceText(await file.text());
56
+ },
57
+ get source() {
58
+ return source;
59
+ },
60
+ /** Variable names the template uses, in order. */
61
+ get variables() {
62
+ return variables;
63
+ },
64
+ /** Variable → field: automatic matches with the user's overrides applied. */
65
+ get mapping() {
66
+ return mapping;
67
+ },
68
+ setFieldMapping(variable, field) {
69
+ overrides = { ...overrides, [variable]: field };
70
+ result = null;
71
+ },
72
+ resetMapping() {
73
+ overrides = {};
74
+ },
75
+ /** 0-based index of the previewed record. */
76
+ get index() {
77
+ return current;
78
+ },
79
+ get count() {
80
+ return count;
81
+ },
82
+ setIndex,
83
+ next() {
84
+ setIndex(current + 1);
85
+ },
86
+ prev() {
87
+ setIndex(current - 1);
88
+ },
89
+ get record() {
90
+ return record;
91
+ },
92
+ /** Prompt values for the previewed record. */
93
+ get values() {
94
+ return values;
95
+ },
96
+ /** Merges every record with the current mapping and stores the result. */
97
+ merge() {
98
+ const merged = mergeRecords(options.template, source, {
99
+ templates: options.templates,
100
+ bindings: options.bindings,
101
+ mapping,
102
+ skipIf: options.skipIf,
103
+ separator: options.separator,
104
+ maxOutputs: options.maxOutputs,
105
+ });
106
+ result = merged;
107
+ return merged;
108
+ },
109
+ get result() {
110
+ return result;
111
+ },
112
+ /** The last merge's outputs as text or JSON. */
113
+ serialize(format) {
114
+ return result ? serializeMergeOutputs(result.outputs, format, options.separator) : "";
115
+ },
116
+ };
117
+ }
@@ -0,0 +1,57 @@
1
+ <script lang="ts">
2
+ import { formatRecoveryMessage, type RecoveryMeta } from '@pixerate/editor/persistence';
3
+
4
+ interface Props {
5
+ /** `createAutosave(...).recovery`; nothing renders while it is `null`. */
6
+ recovery: { meta: RecoveryMeta } | null;
7
+ onRestore: () => void;
8
+ onDiscard: () => void;
9
+ /** Formats the snapshot time (default `toLocaleString`). */
10
+ formatTime?: (time: number) => string;
11
+ restoreLabel?: string;
12
+ discardLabel?: string;
13
+ class?: string;
14
+ }
15
+
16
+ let {
17
+ recovery,
18
+ onRestore,
19
+ onDiscard,
20
+ formatTime,
21
+ restoreLabel = 'Restore',
22
+ discardLabel = 'Discard',
23
+ class: className = ''
24
+ }: Props = $props();
25
+ </script>
26
+
27
+ {#if recovery}
28
+ <div
29
+ role="alertdialog"
30
+ aria-label="Unsaved changes found"
31
+ data-recovery-prompt=""
32
+ class="flex flex-wrap items-center gap-3 rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground shadow-sm {className}"
33
+ >
34
+ <span class="min-w-0 flex-1">
35
+ {formatRecoveryMessage(recovery.meta, formatTime)}
36
+ {#if recovery.meta.name}
37
+ <span class="ml-1 text-xs text-muted-foreground">({recovery.meta.name})</span>
38
+ {/if}
39
+ </span>
40
+ <button
41
+ type="button"
42
+ data-recovery-restore=""
43
+ onclick={onRestore}
44
+ class="rounded-md bg-primary px-3 py-1 text-xs font-medium text-primary-foreground hover:opacity-90"
45
+ >
46
+ {restoreLabel}
47
+ </button>
48
+ <button
49
+ type="button"
50
+ data-recovery-discard=""
51
+ onclick={onDiscard}
52
+ class="rounded-md border border-border px-3 py-1 text-xs font-medium hover:bg-muted"
53
+ >
54
+ {discardLabel}
55
+ </button>
56
+ </div>
57
+ {/if}
@@ -0,0 +1,18 @@
1
+ import { type RecoveryMeta } from '@pixerate/editor/persistence';
2
+ interface Props {
3
+ /** `createAutosave(...).recovery`; nothing renders while it is `null`. */
4
+ recovery: {
5
+ meta: RecoveryMeta;
6
+ } | null;
7
+ onRestore: () => void;
8
+ onDiscard: () => void;
9
+ /** Formats the snapshot time (default `toLocaleString`). */
10
+ formatTime?: (time: number) => string;
11
+ restoreLabel?: string;
12
+ discardLabel?: string;
13
+ class?: string;
14
+ }
15
+ declare const RecoveryPrompt: import("svelte").Component<Props, {}, "">;
16
+ type RecoveryPrompt = ReturnType<typeof RecoveryPrompt>;
17
+ export default RecoveryPrompt;
18
+ //# sourceMappingURL=RecoveryPrompt.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecoveryPrompt.svelte.d.ts","sourceRoot":"","sources":["../../src/persistence/RecoveryPrompt.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGtF,UAAU,KAAK;IACb,0EAA0E;IAC1E,QAAQ,EAAE;QAAE,IAAI,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,4DAA4D;IAC5D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmCH,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { type AutosaveController, type AutosaveRecovery, type AutosaveStatusInfo, type DirtyFlagSource, type RevisionChangeSource, type StorageAdapter } from "@pixerate/editor/persistence";
2
+ export interface CreateAutosaveOptions<T> {
3
+ storage: StorageAdapter;
4
+ /** Snapshot key (the meta lives at `<key>:meta`). */
5
+ key: string;
6
+ /** Reads the current document. */
7
+ getSnapshot: () => T;
8
+ serialize?: (snapshot: T) => string;
9
+ deserialize?: (text: string) => T;
10
+ /** Document name stored with the snapshot. */
11
+ name?: string | (() => string | undefined);
12
+ /** Change notifications, e.g. `createHistory().manager`. */
13
+ history?: RevisionChangeSource;
14
+ /** Saved-vs-current flag, e.g. `createHistoryDirty(...).tracker` or a `bindDirtyToHistory` binding. */
15
+ dirty?: DirtyFlagSource;
16
+ interval?: number;
17
+ debounceMs?: number;
18
+ retryBaseMs?: number;
19
+ retryMaxMs?: number;
20
+ /**
21
+ * Whether the document has finished loading (default `true`). With `false`,
22
+ * call `ready()` once it has. Snapshots also wait for any recovered snapshot
23
+ * to be restored or discarded.
24
+ */
25
+ ready?: boolean;
26
+ /** Look for an earlier session's snapshot (default `true`). */
27
+ recover?: boolean;
28
+ /** Write pending changes on `pagehide` and when the tab is hidden (default `true`). */
29
+ flushOnHide?: boolean;
30
+ }
31
+ export interface SvelteAutosave<T> {
32
+ /** Reactive status. */
33
+ readonly status: AutosaveStatusInfo;
34
+ /** An earlier session's unsaved snapshot, until restored or discarded (reactive). */
35
+ readonly recovery: AutosaveRecovery<T> | null;
36
+ /** True while the recovery check runs or a recovered snapshot awaits a decision (reactive). */
37
+ readonly pendingRecovery: boolean;
38
+ /** Takes the recovered snapshot (apply it to the editor) and starts autosaving. */
39
+ restore(): T | undefined;
40
+ /** Deletes the recovered snapshot and starts autosaving. */
41
+ discard(): Promise<void>;
42
+ /** Marks the document loaded (with `ready: false`). */
43
+ ready(): void;
44
+ /** Writes pending changes now. */
45
+ flushNow(): Promise<void>;
46
+ /** Call after an explicit save: marks the current revision saved and retires this session's snapshot. */
47
+ markClean(): Promise<void>;
48
+ /** Records a change made outside `history`. */
49
+ notifyChange(): void;
50
+ /** Resolves once the recovery check finished. */
51
+ readonly checked: Promise<void>;
52
+ readonly controller: AutosaveController<T>;
53
+ /** Stops timers and listeners. */
54
+ destroy(): void;
55
+ }
56
+ /**
57
+ * Svelte 5 rune: crash-recovery autosave bound to a history and dirty flag,
58
+ * with page lifecycle flushing and a recovery check (see
59
+ * `createAutosaveController` in `@pixerate/editor/persistence`). Render
60
+ * `<RecoveryPrompt>` with `recovery`, `restore` and `discard`.
61
+ */
62
+ export declare function createAutosave<T>(options: CreateAutosaveOptions<T>): SvelteAutosave<T>;
63
+ //# sourceMappingURL=autosave.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autosave.svelte.d.ts","sourceRoot":"","sources":["../../src/persistence/autosave.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,OAAO,EAAE,cAAc,CAAC;IACxB,qDAAqD;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,MAAM,CAAC;IACpC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC;IAClC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3C,4DAA4D;IAC5D,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,uGAAuG;IACvG,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,kBAAkB,CAAC;IACpC,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAC9C,+FAA+F;IAC/F,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,mFAAmF;IACnF,OAAO,IAAI,CAAC,GAAG,SAAS,CAAC;IACzB,4DAA4D;IAC5D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,uDAAuD;IACvD,KAAK,IAAI,IAAI,CAAC;IACd,kCAAkC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,yGAAyG;IACzG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,+CAA+C;IAC/C,YAAY,IAAI,IAAI,CAAC;IACrB,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC3C,kCAAkC;IAClC,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAyGtF"}
@@ -0,0 +1,110 @@
1
+ import { createAutosaveController, createRevisionTracker, } from "@pixerate/editor/persistence";
2
+ /**
3
+ * Svelte 5 rune: crash-recovery autosave bound to a history and dirty flag,
4
+ * with page lifecycle flushing and a recovery check (see
5
+ * `createAutosaveController` in `@pixerate/editor/persistence`). Render
6
+ * `<RecoveryPrompt>` with `recovery`, `restore` and `discard`.
7
+ */
8
+ export function createAutosave(options) {
9
+ const revisions = createRevisionTracker({ history: options.history, dirty: options.dirty });
10
+ const controller = createAutosaveController({
11
+ storage: options.storage,
12
+ key: options.key,
13
+ getSnapshot: options.getSnapshot,
14
+ serialize: options.serialize,
15
+ deserialize: options.deserialize,
16
+ name: options.name,
17
+ revision: revisions.revision,
18
+ savedRevision: revisions.savedRevision,
19
+ interval: options.interval,
20
+ debounceMs: options.debounceMs,
21
+ retryBaseMs: options.retryBaseMs,
22
+ retryMaxMs: options.retryMaxMs,
23
+ });
24
+ const recover = options.recover !== false;
25
+ let status = $state.raw(controller.getStatus());
26
+ let recovery = $state.raw(null);
27
+ let pendingRecovery = $state(recover);
28
+ let loaded = options.ready !== false;
29
+ let destroyed = false;
30
+ const maybeReady = () => {
31
+ if (!destroyed && loaded && !pendingRecovery)
32
+ controller.ready();
33
+ };
34
+ const unsubscribeStatus = controller.subscribe((info) => {
35
+ status = info;
36
+ });
37
+ const unsubscribeRevisions = revisions.subscribe(() => controller.notify());
38
+ const checked = recover
39
+ ? controller
40
+ .checkRecovery()
41
+ .catch(() => null)
42
+ .then((found) => {
43
+ if (destroyed)
44
+ return;
45
+ recovery = found;
46
+ pendingRecovery = found !== null;
47
+ maybeReady();
48
+ })
49
+ : Promise.resolve();
50
+ maybeReady();
51
+ let removeListeners = () => { };
52
+ if (options.flushOnHide !== false && typeof window !== "undefined") {
53
+ const flush = () => void controller.flushNow();
54
+ const onVisibility = () => {
55
+ if (document.visibilityState === "hidden")
56
+ flush();
57
+ };
58
+ window.addEventListener("pagehide", flush);
59
+ document.addEventListener("visibilitychange", onVisibility);
60
+ removeListeners = () => {
61
+ window.removeEventListener("pagehide", flush);
62
+ document.removeEventListener("visibilitychange", onVisibility);
63
+ };
64
+ }
65
+ return {
66
+ get status() {
67
+ return status;
68
+ },
69
+ get recovery() {
70
+ return recovery;
71
+ },
72
+ get pendingRecovery() {
73
+ return pendingRecovery;
74
+ },
75
+ restore() {
76
+ const snapshot = recovery?.snapshot;
77
+ recovery = null;
78
+ pendingRecovery = false;
79
+ // Deferred so the caller can apply the snapshot first.
80
+ queueMicrotask(maybeReady);
81
+ return snapshot;
82
+ },
83
+ async discard() {
84
+ await controller.discardRecovery();
85
+ recovery = null;
86
+ pendingRecovery = false;
87
+ maybeReady();
88
+ },
89
+ ready() {
90
+ loaded = true;
91
+ maybeReady();
92
+ },
93
+ flushNow: () => controller.flushNow(),
94
+ async markClean() {
95
+ revisions.markSaved();
96
+ await controller.markClean();
97
+ },
98
+ notifyChange: () => revisions.bump(),
99
+ checked,
100
+ controller,
101
+ destroy() {
102
+ destroyed = true;
103
+ removeListeners();
104
+ unsubscribeStatus();
105
+ unsubscribeRevisions();
106
+ revisions.destroy();
107
+ controller.destroy();
108
+ },
109
+ };
110
+ }
@@ -0,0 +1,6 @@
1
+ import type { ComponentProps } from "svelte";
2
+ import type RecoveryPromptComponent from "./RecoveryPrompt.svelte";
3
+ export { default as RecoveryPrompt } from "./RecoveryPrompt.svelte";
4
+ export * from "./autosave.svelte.js";
5
+ export type RecoveryPromptProps = ComponentProps<typeof RecoveryPromptComponent>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/persistence/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,uBAAuB,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,cAAc,sBAAsB,CAAC;AAErC,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,OAAO,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as RecoveryPrompt } from "./RecoveryPrompt.svelte";
2
+ export * from "./autosave.svelte.js";
@@ -0,0 +1,21 @@
1
+ import type { Editor } from "@tiptap/core";
2
+ import { type CompareSource, type CompareSummary, type EditorCompareOptions } from "@pixerate/editor";
3
+ export type { CompareSource, CompareSummary, EditorCompareOptions } from "@pixerate/editor";
4
+ export interface SvelteDocumentCompare {
5
+ /** Summary of the last comparison, or `null` (reactive). */
6
+ readonly summary: CompareSummary | null;
7
+ /**
8
+ * Replaces the editor content with the comparison of two versions (nodes,
9
+ * JSON or HTML) as tracked changes, ready to review with `ReviewToolbar`.
10
+ * Returns the summary, or `null` without an editor.
11
+ */
12
+ compare(original: CompareSource, revised: CompareSource, options?: EditorCompareOptions): CompareSummary | null;
13
+ /** Forgets the last summary. */
14
+ clear(): void;
15
+ }
16
+ /**
17
+ * Compare two document versions into an editor using `TrackChanges`.
18
+ * `options` are defaults for every comparison.
19
+ */
20
+ export declare function createDocumentCompare(editor: Editor | null | undefined, options?: EditorCompareOptions): SvelteDocumentCompare;
21
+ //# sourceMappingURL=documentCompare.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"documentCompare.svelte.d.ts","sourceRoot":"","sources":["../../src/review/documentCompare.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE5F,MAAM,WAAW,qBAAqB;IACpC,4DAA4D;IAC5D,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC;;;;OAIG;IACH,OAAO,CACL,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,aAAa,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,cAAc,GAAG,IAAI,CAAC;IACzB,gCAAgC;IAChC,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,qBAAqB,CAgBvB"}
@@ -0,0 +1,23 @@
1
+ import { applyDocumentComparison, } from "@pixerate/editor";
2
+ /**
3
+ * Compare two document versions into an editor using `TrackChanges`.
4
+ * `options` are defaults for every comparison.
5
+ */
6
+ export function createDocumentCompare(editor, options) {
7
+ let summary = $state.raw(null);
8
+ return {
9
+ get summary() {
10
+ return summary;
11
+ },
12
+ compare(original, revised, overrides) {
13
+ if (!editor || editor.isDestroyed)
14
+ return null;
15
+ const result = applyDocumentComparison(editor, original, revised, { ...options, ...overrides });
16
+ summary = result.summary;
17
+ return result.summary;
18
+ },
19
+ clear() {
20
+ summary = null;
21
+ },
22
+ };
23
+ }
@@ -6,6 +6,7 @@ export { default as CommentsPanel } from "./CommentsPanel.svelte";
6
6
  export { default as ReviewToolbar } from "./ReviewToolbar.svelte";
7
7
  export { default as CommentButton } from "./CommentButton.svelte";
8
8
  export * from "./review.svelte.js";
9
+ export * from "./documentCompare.svelte.js";
9
10
  export type CommentsPanelProps = ComponentProps<typeof CommentsPanelComponent>;
10
11
  export type ReviewToolbarProps = ComponentProps<typeof ReviewToolbarComponent>;
11
12
  export type CommentButtonProps = ComponentProps<typeof CommentButtonComponent>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/review/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,cAAc,oBAAoB,CAAC;AAEnC,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC/E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC/E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/review/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,sBAAsB,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAE5C,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC/E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC/E,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
@@ -2,3 +2,4 @@ export { default as CommentsPanel } from "./CommentsPanel.svelte";
2
2
  export { default as ReviewToolbar } from "./ReviewToolbar.svelte";
3
3
  export { default as CommentButton } from "./CommentButton.svelte";
4
4
  export * from "./review.svelte.js";
5
+ export * from "./documentCompare.svelte.js";
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { clampMenuPosition, type SpreadsheetMenuItem } from '@pixerate/editor/spreadsheet';
2
+ import { clampMenuPosition, runSpreadsheetMenuItem, type SpreadsheetMenuItem } from '@pixerate/editor/spreadsheet';
3
3
 
4
4
  // Gap kept between the menu and the viewport edges.
5
5
  const VIEWPORT_MARGIN = 4;
@@ -66,11 +66,14 @@
66
66
  type="button"
67
67
  role="menuitem"
68
68
  data-action={item.id}
69
+ data-checked={item.checked ? '' : undefined}
69
70
  disabled={item.disabled}
70
- class="block w-full px-3 py-1 text-left hover:bg-muted disabled:cursor-default disabled:opacity-40 disabled:hover:bg-transparent"
71
+ class="block w-full px-3 py-1 text-left hover:bg-muted disabled:cursor-default disabled:opacity-40 disabled:hover:bg-transparent {item.checked
72
+ ? 'font-semibold'
73
+ : ''}"
71
74
  onclick={() => {
72
75
  onClose();
73
- item.run();
76
+ runSpreadsheetMenuItem(item);
74
77
  }}
75
78
  >
76
79
  {item.label}
@@ -1 +1 @@
1
- {"version":3,"file":"SpreadsheetContextMenu.svelte.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/SpreadsheetContextMenu.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGzF,UAAU,KAAK;IACb,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA6DH,QAAA,MAAM,sBAAsB,2CAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"SpreadsheetContextMenu.svelte.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/SpreadsheetContextMenu.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6C,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGjH,UAAU,KAAK;IACb,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA+DH,QAAA,MAAM,sBAAsB,2CAAwC,CAAC;AACrE,KAAK,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACxE,eAAe,sBAAsB,CAAC"}
@@ -12,7 +12,9 @@
12
12
  type CellRange,
13
13
  type SpreadsheetMenuItem,
14
14
  type SpreadsheetViewColumn,
15
- type SpreadsheetViewRow
15
+ type SpreadsheetViewRow,
16
+ formatCellForDisplay,
17
+ numberFormatColorToCss
16
18
  } from '@pixerate/editor/spreadsheet';
17
19
  import FormulaBar from './FormulaBar.svelte';
18
20
  import SpreadsheetContextMenu from './SpreadsheetContextMenu.svelte';
@@ -585,11 +587,14 @@
585
587
  {@const cellArg = Object.assign({ row, col, cell }, cell)}
586
588
  {@render (customCellRenderer as any)(cellArg, col, row)}
587
589
  {:else}
590
+ {@const shown = formatCellForDisplay(cell)}
588
591
  <span
589
592
  class="truncate block max-w-full {cell.error ? 'text-destructive font-semibold' : ''}"
590
593
  title={cell.error ? (cell.errorMessage ?? cell.error) : undefined}
594
+ data-numeric={shown.numeric ? '' : undefined}
595
+ style="{shown.numeric ? 'text-align: right;' : ''}{shown.color ? ` color: ${numberFormatColorToCss(shown.color)};` : ''}"
591
596
  >
592
- {cell.error || (cell.value ?? '')}
597
+ {shown.text}
593
598
  </span>
594
599
  {/if}
595
600
  {#if activeSpill && rangeContains(activeSpill.range, rIdx, cIdx)}
@@ -1 +1 @@
1
- {"version":3,"file":"SpreadsheetEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/SpreadsheetEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAMH,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,QAAQ,EAKd,MAAM,8BAA8B,CAAC;AAKxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,UAAU,KAAK;IACb,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EACf,OAAO,CAAC,CAAC,QAAQ,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC,GACtD,OAAO,CAAC,CAAC;QAAE,GAAG,EAAE,cAAc,CAAC;QAAC,GAAG,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC,CAAC;IAC/E,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AA+hBH,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"SpreadsheetEditor.svelte.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/SpreadsheetEditor.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAMH,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,QAAQ,EAOd,MAAM,8BAA8B,CAAC;AAKxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAIlE,UAAU,KAAK;IACb,UAAU,CAAC,EAAE,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EACf,OAAO,CAAC,CAAC,QAAQ,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAAC,GACtD,OAAO,CAAC,CAAC;QAAE,GAAG,EAAE,cAAc,CAAC;QAAC,GAAG,EAAE,iBAAiB,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC,CAAC;IAC/E,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACvD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzD;AAgiBH,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -33,6 +33,8 @@ export declare function createReactiveSpreadsheet(options?: SpreadsheetControlle
33
33
  toggleGroupCollapsed: (key: string) => void;
34
34
  getGroups: () => import("@pixerate/editor").SpreadsheetRowGroup[];
35
35
  transposeRange: (range?: CellRange | null) => boolean;
36
+ setCellNumberFormat: (range: CellRange | null, code: string | null) => boolean;
37
+ setColumnNumberFormat: (colId: string, code: string | null) => void;
36
38
  exportToCsv: (options?: import("@pixerate/editor").CsvExportOptions) => string;
37
39
  importFromCsv: (csv: string, options?: import("@pixerate/editor").CsvImportOptions) => void;
38
40
  copyToClipboardData: (range?: CellRange | null) => import("@pixerate/editor").SpreadsheetClipboardData;
@@ -1 +1 @@
1
- {"version":3,"file":"spreadsheet.svelte.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/spreadsheet.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,4BAAiC;;aAmL8zuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA/G33uB,MAAM;;mBAMX,MAAM,SAAS,MAAM,GAAG,QAAQ;wBAG3B,MAAM,SAAS,MAAM,OAAO,MAAM;oBAItC,MAAM,OAAO,MAAM;uBAKhB,SAAS;uBAIT,MAAM,QAAQ,MAAM,eAAe,MAAM;wBAMxC,MAAM;;oBAWV,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;wBAK5B,MAAM,WAAW,OAAO,CAAC,iBAAiB,CAAC;wBAI3C,MAAM;qBAIT,MAAM,WAAW,OAAO,CAAC,cAAc,CAAC;qBAIxC,MAAM;0BAID,MAAM,SAAS,MAAM;8BAIjB,MAAM,gBAAgB,MAAM;2BAI/B,mBAAmB;;2BAanB,qBAAqB;6BAInB,MAAM,GAAG,SAAS;;wBAQvB,SAAS,GAAG,IAAI;wBAGhB,MAAM;;;EAc7B"}
1
+ {"version":3,"file":"spreadsheet.svelte.d.ts","sourceRoot":"","sources":["../../src/spreadsheet/spreadsheet.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAErB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,4BAAiC;;aAmLoz2B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBA/Gj32B,MAAM;;mBAMX,MAAM,SAAS,MAAM,GAAG,QAAQ;wBAG3B,MAAM,SAAS,MAAM,OAAO,MAAM;oBAItC,MAAM,OAAO,MAAM;uBAKhB,SAAS;uBAIT,MAAM,QAAQ,MAAM,eAAe,MAAM;wBAMxC,MAAM;;oBAWV,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;wBAK5B,MAAM,WAAW,OAAO,CAAC,iBAAiB,CAAC;wBAI3C,MAAM;qBAIT,MAAM,WAAW,OAAO,CAAC,cAAc,CAAC;qBAIxC,MAAM;0BAID,MAAM,SAAS,MAAM;8BAIjB,MAAM,gBAAgB,MAAM;2BAI/B,mBAAmB;;2BAanB,qBAAqB;6BAInB,MAAM,GAAG,SAAS;;wBAQvB,SAAS,GAAG,IAAI;wBAGhB,MAAM;;;EAc7B"}