@pixerate/editor-svelte 0.2.5 → 0.3.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.
- package/dist/index.d.ts +56 -0
- package/dist/index.js +474 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/index.d.ts +56 -0
- package/src/index.ts +2 -0
- package/src/spreadsheet/FormulaBar.svelte +58 -0
- package/src/spreadsheet/SpreadsheetEditor.svelte +271 -0
- package/src/spreadsheet/index.ts +3 -0
- package/src/spreadsheet/spreadsheet.svelte.ts +159 -0
package/dist/index.d.ts
CHANGED
|
@@ -78,3 +78,59 @@ export type {
|
|
|
78
78
|
ColorGradient,
|
|
79
79
|
RichTextPresetOptions,
|
|
80
80
|
};
|
|
81
|
+
|
|
82
|
+
import type {
|
|
83
|
+
SpreadsheetController,
|
|
84
|
+
SpreadsheetControllerOptions,
|
|
85
|
+
SpreadsheetDocument,
|
|
86
|
+
SpreadsheetColumn,
|
|
87
|
+
SpreadsheetRow,
|
|
88
|
+
CellCoordinate,
|
|
89
|
+
CellRange,
|
|
90
|
+
CellData,
|
|
91
|
+
SpreadsheetDataSource
|
|
92
|
+
} from '@pixerate/editor';
|
|
93
|
+
|
|
94
|
+
export interface SpreadsheetEditorProps {
|
|
95
|
+
sheetState: ReturnType<typeof createReactiveSpreadsheet>;
|
|
96
|
+
readonly?: boolean;
|
|
97
|
+
class?: string;
|
|
98
|
+
customCellRenderer?: (cell: CellData, col: SpreadsheetColumn, row: SpreadsheetRow) => any;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface FormulaBarProps {
|
|
102
|
+
sheetState: ReturnType<typeof createReactiveSpreadsheet>;
|
|
103
|
+
class?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export declare const SpreadsheetEditor: Component<SpreadsheetEditorProps>;
|
|
107
|
+
export declare const FormulaBar: Component<FormulaBarProps>;
|
|
108
|
+
|
|
109
|
+
export declare function createReactiveSpreadsheet(options?: SpreadsheetControllerOptions): {
|
|
110
|
+
readonly document: SpreadsheetDocument;
|
|
111
|
+
readonly activeCell: CellCoordinate | null;
|
|
112
|
+
readonly selectedRange: CellRange | null;
|
|
113
|
+
readonly editingCell: CellCoordinate | null;
|
|
114
|
+
draftValue: string;
|
|
115
|
+
controller: SpreadsheetController;
|
|
116
|
+
getCell(rowId: string, colId: string): CellData;
|
|
117
|
+
setCellValue(rowId: string, colId: string, raw: string): void;
|
|
118
|
+
selectCell(row: number, col: number, extendSelection?: boolean): void;
|
|
119
|
+
selectRange(range: CellRange): void;
|
|
120
|
+
startEditing(row?: number, col?: number, initialVal?: string): void;
|
|
121
|
+
commitEditing(val?: string): void;
|
|
122
|
+
cancelEditing(): void;
|
|
123
|
+
moveCursor(dir: 'up' | 'down' | 'left' | 'right', extend?: boolean): void;
|
|
124
|
+
insertColumn(index: number, config?: Partial<SpreadsheetColumn>): void;
|
|
125
|
+
deleteColumn(colId: string): void;
|
|
126
|
+
insertRow(index: number, config?: Partial<SpreadsheetRow>): void;
|
|
127
|
+
deleteRow(rowId: string): void;
|
|
128
|
+
setColumnWidth(colId: string, width: number): void;
|
|
129
|
+
registerDataSource(ds: SpreadsheetDataSource): void;
|
|
130
|
+
setPrimaryDataSource(id: string | undefined): void;
|
|
131
|
+
recalculateAll(): void;
|
|
132
|
+
exportToTsv(): string;
|
|
133
|
+
importFromTsv(data: string): void;
|
|
134
|
+
undo(): void;
|
|
135
|
+
redo(): void;
|
|
136
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -217,6 +217,477 @@ function TemplateRenderer($$anchor, $$props) {
|
|
|
217
217
|
}
|
|
218
218
|
$4.delegate(["click"]);
|
|
219
219
|
|
|
220
|
+
// src/spreadsheet/SpreadsheetEditor.svelte
|
|
221
|
+
import "svelte/internal/disclose-version";
|
|
222
|
+
import * as $7 from "svelte/internal/client";
|
|
223
|
+
import { indexToColName as indexToColName2 } from "@pixerate/editor";
|
|
224
|
+
|
|
225
|
+
// src/spreadsheet/FormulaBar.svelte
|
|
226
|
+
import "svelte/internal/disclose-version";
|
|
227
|
+
import * as $5 from "svelte/internal/client";
|
|
228
|
+
import { indexToColName } from "@pixerate/editor";
|
|
229
|
+
var root4 = $5.from_html(`<div class="flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono"><div class="flex h-6 min-w-[3rem] items-center justify-center rounded border border-border bg-background px-1.5 font-semibold text-foreground"> </div> <div class="flex items-center text-muted-foreground select-none"><span class="italic font-serif font-bold text-sm text-primary">fx</span></div> <input type="text" class="flex-1 bg-transparent px-2 py-0.5 outline-none font-sans text-xs text-foreground placeholder:text-muted-foreground/60 focus:bg-background focus:ring-1 focus:ring-primary rounded" placeholder="Enter a value or formula (e.g. =SUM(A1:A5))"/></div>`);
|
|
230
|
+
function FormulaBar($$anchor, $$props) {
|
|
231
|
+
$5.push($$props, true);
|
|
232
|
+
let activeCoord = $5.prop($$props, "activeCoord", 3, null), value = $5.prop($$props, "value", 15, "");
|
|
233
|
+
let coordLabel = $5.derived(() => {
|
|
234
|
+
if (!activeCoord()) return "--";
|
|
235
|
+
const colName = indexToColName(activeCoord().col);
|
|
236
|
+
return `${colName}${activeCoord().row + 1}`;
|
|
237
|
+
});
|
|
238
|
+
function handleKeyDown(e) {
|
|
239
|
+
if (e.key === "Enter") {
|
|
240
|
+
e.preventDefault();
|
|
241
|
+
$$props.onCommit?.(value());
|
|
242
|
+
} else if (e.key === "Escape") {
|
|
243
|
+
e.preventDefault();
|
|
244
|
+
$$props.onCancel?.();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function handleInput(e) {
|
|
248
|
+
const target = e.target;
|
|
249
|
+
value(target.value);
|
|
250
|
+
$$props.onChange?.(target.value);
|
|
251
|
+
}
|
|
252
|
+
var div = root4();
|
|
253
|
+
var div_1 = $5.child(div);
|
|
254
|
+
var text = $5.only_child(div_1, true);
|
|
255
|
+
var input = $5.sibling(div_1, 4);
|
|
256
|
+
$5.remove_input_defaults(input);
|
|
257
|
+
$5.reset(div);
|
|
258
|
+
$5.template_effect(() => {
|
|
259
|
+
$5.set_text(text, $5.get(coordLabel));
|
|
260
|
+
$5.set_value(input, value());
|
|
261
|
+
});
|
|
262
|
+
$5.delegated("input", input, handleInput);
|
|
263
|
+
$5.delegated("keydown", input, handleKeyDown);
|
|
264
|
+
$5.append($$anchor, div);
|
|
265
|
+
$5.pop();
|
|
266
|
+
}
|
|
267
|
+
$5.delegate(["input", "keydown"]);
|
|
268
|
+
|
|
269
|
+
// src/spreadsheet/spreadsheet.svelte.ts
|
|
270
|
+
import * as $6 from "svelte/internal/client";
|
|
271
|
+
import { SpreadsheetController } from "@pixerate/editor";
|
|
272
|
+
function createReactiveSpreadsheet(options = {}) {
|
|
273
|
+
let doc = $6.state($6.proxy({
|
|
274
|
+
id: options.document?.id || `sheet_${Date.now()}`,
|
|
275
|
+
name: options.document?.name || "Sheet 1",
|
|
276
|
+
columns: options.document?.columns || [],
|
|
277
|
+
rows: options.document?.rows || [],
|
|
278
|
+
cells: options.document?.cells || {},
|
|
279
|
+
createdAt: options.document?.createdAt || Date.now(),
|
|
280
|
+
updatedAt: options.document?.updatedAt || Date.now()
|
|
281
|
+
}));
|
|
282
|
+
let activeCell = $6.state(null);
|
|
283
|
+
let selectedRange = $6.state(null);
|
|
284
|
+
let editingCell = $6.state(null);
|
|
285
|
+
let draftValue = $6.state("");
|
|
286
|
+
const controller = new SpreadsheetController({
|
|
287
|
+
...options,
|
|
288
|
+
document: options.document,
|
|
289
|
+
onDocumentChange: (updated) => {
|
|
290
|
+
$6.set(doc, { ...updated }, true);
|
|
291
|
+
options.onDocumentChange?.(updated);
|
|
292
|
+
},
|
|
293
|
+
onSelectionChange: (active, range) => {
|
|
294
|
+
$6.set(activeCell, active, true);
|
|
295
|
+
$6.set(selectedRange, range, true);
|
|
296
|
+
options.onSelectionChange?.(active, range);
|
|
297
|
+
},
|
|
298
|
+
onCellCommit: (rowId, colId, raw, value) => {
|
|
299
|
+
options.onCellCommit?.(rowId, colId, raw, value);
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
$6.set(doc, { ...controller.document }, true);
|
|
303
|
+
$6.set(activeCell, controller.activeCell, true);
|
|
304
|
+
$6.set(selectedRange, controller.selectedRange, true);
|
|
305
|
+
return {
|
|
306
|
+
get document() {
|
|
307
|
+
return $6.get(doc);
|
|
308
|
+
},
|
|
309
|
+
get activeCell() {
|
|
310
|
+
return $6.get(activeCell);
|
|
311
|
+
},
|
|
312
|
+
get selectedRange() {
|
|
313
|
+
return $6.get(selectedRange);
|
|
314
|
+
},
|
|
315
|
+
get editingCell() {
|
|
316
|
+
return $6.get(editingCell);
|
|
317
|
+
},
|
|
318
|
+
get draftValue() {
|
|
319
|
+
return $6.get(draftValue);
|
|
320
|
+
},
|
|
321
|
+
set draftValue(val) {
|
|
322
|
+
$6.set(draftValue, val, true);
|
|
323
|
+
controller.draftValue = val;
|
|
324
|
+
},
|
|
325
|
+
controller,
|
|
326
|
+
getCell(rowId, colId) {
|
|
327
|
+
return controller.getCell(rowId, colId);
|
|
328
|
+
},
|
|
329
|
+
setCellValue(rowId, colId, raw) {
|
|
330
|
+
controller.setCellValue(rowId, colId, raw);
|
|
331
|
+
$6.set(doc, { ...controller.document }, true);
|
|
332
|
+
},
|
|
333
|
+
selectCell(row, col, extendSelection = false) {
|
|
334
|
+
controller.selectCell(row, col, extendSelection);
|
|
335
|
+
$6.set(activeCell, controller.activeCell, true);
|
|
336
|
+
$6.set(selectedRange, controller.selectedRange, true);
|
|
337
|
+
},
|
|
338
|
+
selectRange(range) {
|
|
339
|
+
controller.selectRange(range);
|
|
340
|
+
$6.set(selectedRange, controller.selectedRange, true);
|
|
341
|
+
},
|
|
342
|
+
startEditing(row, col, initialVal) {
|
|
343
|
+
controller.startEditing(row, col, initialVal);
|
|
344
|
+
$6.set(activeCell, controller.activeCell, true);
|
|
345
|
+
$6.set(editingCell, controller.editingCell, true);
|
|
346
|
+
$6.set(draftValue, controller.draftValue, true);
|
|
347
|
+
},
|
|
348
|
+
commitEditing(val) {
|
|
349
|
+
controller.commitEditing(val);
|
|
350
|
+
$6.set(editingCell, null);
|
|
351
|
+
$6.set(draftValue, "");
|
|
352
|
+
$6.set(doc, { ...controller.document }, true);
|
|
353
|
+
},
|
|
354
|
+
cancelEditing() {
|
|
355
|
+
controller.cancelEditing();
|
|
356
|
+
$6.set(editingCell, null);
|
|
357
|
+
$6.set(draftValue, "");
|
|
358
|
+
},
|
|
359
|
+
moveCursor(dir, extend = false) {
|
|
360
|
+
controller.moveCursor(dir, extend);
|
|
361
|
+
$6.set(activeCell, controller.activeCell, true);
|
|
362
|
+
$6.set(selectedRange, controller.selectedRange, true);
|
|
363
|
+
},
|
|
364
|
+
insertColumn(index2, config) {
|
|
365
|
+
controller.insertColumn(index2, config);
|
|
366
|
+
$6.set(doc, { ...controller.document }, true);
|
|
367
|
+
},
|
|
368
|
+
deleteColumn(colId) {
|
|
369
|
+
controller.deleteColumn(colId);
|
|
370
|
+
$6.set(doc, { ...controller.document }, true);
|
|
371
|
+
},
|
|
372
|
+
insertRow(index2, config) {
|
|
373
|
+
controller.insertRow(index2, config);
|
|
374
|
+
$6.set(doc, { ...controller.document }, true);
|
|
375
|
+
},
|
|
376
|
+
deleteRow(rowId) {
|
|
377
|
+
controller.deleteRow(rowId);
|
|
378
|
+
$6.set(doc, { ...controller.document }, true);
|
|
379
|
+
},
|
|
380
|
+
setColumnWidth(colId, width) {
|
|
381
|
+
controller.setColumnWidth(colId, width);
|
|
382
|
+
$6.set(doc, { ...controller.document }, true);
|
|
383
|
+
},
|
|
384
|
+
registerDataSource(ds) {
|
|
385
|
+
controller.registerDataSource(ds);
|
|
386
|
+
$6.set(doc, { ...controller.document }, true);
|
|
387
|
+
},
|
|
388
|
+
setPrimaryDataSource(id) {
|
|
389
|
+
controller.setPrimaryDataSource(id);
|
|
390
|
+
$6.set(doc, { ...controller.document }, true);
|
|
391
|
+
},
|
|
392
|
+
recalculateAll() {
|
|
393
|
+
controller.recalculateAll();
|
|
394
|
+
$6.set(doc, { ...controller.document }, true);
|
|
395
|
+
},
|
|
396
|
+
exportToTsv() {
|
|
397
|
+
return controller.exportToTsv();
|
|
398
|
+
},
|
|
399
|
+
importFromTsv(data) {
|
|
400
|
+
controller.importFromTsv(data);
|
|
401
|
+
$6.set(doc, { ...controller.document }, true);
|
|
402
|
+
},
|
|
403
|
+
undo() {
|
|
404
|
+
controller.undo();
|
|
405
|
+
$6.set(doc, { ...controller.document }, true);
|
|
406
|
+
},
|
|
407
|
+
redo() {
|
|
408
|
+
controller.redo();
|
|
409
|
+
$6.set(doc, { ...controller.document }, true);
|
|
410
|
+
}
|
|
411
|
+
};
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// src/spreadsheet/SpreadsheetEditor.svelte
|
|
415
|
+
var root5 = $7.from_html(`<th class="relative border-r border-border px-2 text-left font-medium text-muted-foreground hover:bg-muted/90 transition-colors group cursor-pointer"><div class="flex items-center justify-between gap-1 truncate"><span class="truncate font-semibold text-foreground text-xs"> </span> <span class="text-[10px] text-muted-foreground/70 font-mono font-normal"> </span></div> <div class="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-primary/50 group-hover:bg-primary/20 z-10" role="separator" aria-orientation="vertical"></div></th>`);
|
|
416
|
+
var root_13 = $7.from_html(`<th class="w-10 min-w-[2.5rem] px-1 text-center bg-muted/40 hover:bg-muted cursor-pointer transition-colors" title="Add Column"><span class="text-xs font-bold text-muted-foreground">+</span></th>`);
|
|
417
|
+
var root_22 = $7.from_html(`<input type="text" class="absolute inset-0 w-full h-full px-2 py-1 bg-background text-foreground outline-none font-sans text-xs border-2 border-primary z-20"/>`);
|
|
418
|
+
var root_32 = $7.from_html(`<span> </span>`);
|
|
419
|
+
var root_42 = $7.from_html(`<td><!></td>`);
|
|
420
|
+
var root_5 = $7.from_html(`<td class="w-10 min-w-[2.5rem] bg-muted/10 border-r border-border"></td>`);
|
|
421
|
+
var root_6 = $7.from_html(`<tr class="border-b border-border hover:bg-muted/10 transition-colors"><td class="w-12 min-w-[3rem] sticky left-0 z-10 bg-muted/50 border-r border-border text-center text-[10px] text-muted-foreground font-mono select-none"> </td><!><!></tr>`);
|
|
422
|
+
var root_7 = $7.from_html(`<div class="flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs" tabindex="0" role="grid" aria-label="Spreadsheet"><!> <div class="relative flex-1 overflow-auto"><table class="border-collapse table-fixed w-max min-w-full"><thead><tr class="h-7 bg-muted/60 sticky top-0 z-20 border-b border-border shadow-xs"><th class="w-12 min-w-[3rem] sticky left-0 z-30 bg-muted/90 border-r border-border text-center text-[10px] text-muted-foreground font-medium">#</th><!><!></tr></thead><tbody></tbody></table></div></div>`);
|
|
423
|
+
function SpreadsheetEditor($$anchor, $$props) {
|
|
424
|
+
$7.push($$props, true);
|
|
425
|
+
let sheetState = $7.prop($$props, "sheetState", 23, createReactiveSpreadsheet), readOnly = $7.prop($$props, "readOnly", 3, false);
|
|
426
|
+
let gridContainer = $7.state(null);
|
|
427
|
+
let resizingColId = $7.state(null);
|
|
428
|
+
let resizeStartX = $7.state(0);
|
|
429
|
+
let resizeStartWidth = $7.state(0);
|
|
430
|
+
let activeRawValue = $7.derived(() => {
|
|
431
|
+
if (!sheetState().activeCell) return "";
|
|
432
|
+
const row = sheetState().document.rows[sheetState().activeCell.row];
|
|
433
|
+
const col = sheetState().document.columns[sheetState().activeCell.col];
|
|
434
|
+
if (!row || !col) return "";
|
|
435
|
+
return sheetState().getCell(row.id, col.id).raw;
|
|
436
|
+
});
|
|
437
|
+
function handleCellClick(rIdx, cIdx, e) {
|
|
438
|
+
if (sheetState().editingCell && (sheetState().editingCell.row !== rIdx || sheetState().editingCell.col !== cIdx)) {
|
|
439
|
+
sheetState().commitEditing();
|
|
440
|
+
}
|
|
441
|
+
sheetState().selectCell(rIdx, cIdx, e.shiftKey);
|
|
442
|
+
}
|
|
443
|
+
function handleCellDblClick(rIdx, cIdx) {
|
|
444
|
+
if (readOnly()) return;
|
|
445
|
+
const col = sheetState().document.columns[cIdx];
|
|
446
|
+
if (col?.readOnly) return;
|
|
447
|
+
sheetState().startEditing(rIdx, cIdx);
|
|
448
|
+
}
|
|
449
|
+
function handleKeyDown(e) {
|
|
450
|
+
if (sheetState().editingCell) {
|
|
451
|
+
if (e.key === "Enter") {
|
|
452
|
+
e.preventDefault();
|
|
453
|
+
sheetState().commitEditing();
|
|
454
|
+
sheetState().moveCursor("down");
|
|
455
|
+
} else if (e.key === "Escape") {
|
|
456
|
+
e.preventDefault();
|
|
457
|
+
sheetState().cancelEditing();
|
|
458
|
+
} else if (e.key === "Tab") {
|
|
459
|
+
e.preventDefault();
|
|
460
|
+
sheetState().commitEditing();
|
|
461
|
+
sheetState().moveCursor(e.shiftKey ? "left" : "right");
|
|
462
|
+
}
|
|
463
|
+
return;
|
|
464
|
+
}
|
|
465
|
+
if (!sheetState().activeCell) return;
|
|
466
|
+
if (e.key === "ArrowUp") {
|
|
467
|
+
e.preventDefault();
|
|
468
|
+
sheetState().moveCursor("up", e.shiftKey);
|
|
469
|
+
} else if (e.key === "ArrowDown") {
|
|
470
|
+
e.preventDefault();
|
|
471
|
+
sheetState().moveCursor("down", e.shiftKey);
|
|
472
|
+
} else if (e.key === "ArrowLeft") {
|
|
473
|
+
e.preventDefault();
|
|
474
|
+
sheetState().moveCursor("left", e.shiftKey);
|
|
475
|
+
} else if (e.key === "ArrowRight") {
|
|
476
|
+
e.preventDefault();
|
|
477
|
+
sheetState().moveCursor("right", e.shiftKey);
|
|
478
|
+
} else if (e.key === "Tab") {
|
|
479
|
+
e.preventDefault();
|
|
480
|
+
sheetState().moveCursor(e.shiftKey ? "left" : "right");
|
|
481
|
+
} else if (e.key === "Enter") {
|
|
482
|
+
e.preventDefault();
|
|
483
|
+
const col = sheetState().document.columns[sheetState().activeCell.col];
|
|
484
|
+
if (!readOnly() && !col?.readOnly) {
|
|
485
|
+
sheetState().startEditing();
|
|
486
|
+
}
|
|
487
|
+
} else if (e.key === "Backspace" || e.key === "Delete") {
|
|
488
|
+
if (readOnly()) return;
|
|
489
|
+
const row = sheetState().document.rows[sheetState().activeCell.row];
|
|
490
|
+
const col = sheetState().document.columns[sheetState().activeCell.col];
|
|
491
|
+
if (row && col && !col.readOnly) {
|
|
492
|
+
e.preventDefault();
|
|
493
|
+
sheetState().setCellValue(row.id, col.id, "");
|
|
494
|
+
}
|
|
495
|
+
} else if ((e.metaKey || e.ctrlKey) && e.key === "z") {
|
|
496
|
+
e.preventDefault();
|
|
497
|
+
if (e.shiftKey) {
|
|
498
|
+
sheetState().redo();
|
|
499
|
+
} else {
|
|
500
|
+
sheetState().undo();
|
|
501
|
+
}
|
|
502
|
+
} else if ((e.metaKey || e.ctrlKey) && e.key === "c") {
|
|
503
|
+
e.preventDefault();
|
|
504
|
+
const tsv = sheetState().exportToTsv();
|
|
505
|
+
navigator.clipboard?.writeText(tsv);
|
|
506
|
+
} else if (!readOnly() && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
|
|
507
|
+
const col = sheetState().document.columns[sheetState().activeCell.col];
|
|
508
|
+
if (!col?.readOnly) {
|
|
509
|
+
sheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, e.key);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
function handleResizeStart(colId, width, e) {
|
|
514
|
+
e.preventDefault();
|
|
515
|
+
e.stopPropagation();
|
|
516
|
+
$7.set(resizingColId, colId, true);
|
|
517
|
+
$7.set(resizeStartX, e.clientX, true);
|
|
518
|
+
$7.set(resizeStartWidth, width, true);
|
|
519
|
+
const handleMouseMove = (moveEvent) => {
|
|
520
|
+
if (!$7.get(resizingColId)) return;
|
|
521
|
+
const delta = moveEvent.clientX - $7.get(resizeStartX);
|
|
522
|
+
sheetState().setColumnWidth($7.get(resizingColId), Math.max(60, $7.get(resizeStartWidth) + delta));
|
|
523
|
+
};
|
|
524
|
+
const handleMouseUp = () => {
|
|
525
|
+
$7.set(resizingColId, null);
|
|
526
|
+
window.removeEventListener("mousemove", handleMouseMove);
|
|
527
|
+
window.removeEventListener("mouseup", handleMouseUp);
|
|
528
|
+
};
|
|
529
|
+
window.addEventListener("mousemove", handleMouseMove);
|
|
530
|
+
window.addEventListener("mouseup", handleMouseUp);
|
|
531
|
+
}
|
|
532
|
+
function isCellSelected(rIdx, cIdx) {
|
|
533
|
+
if (!sheetState().selectedRange) return false;
|
|
534
|
+
const minR = Math.min(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);
|
|
535
|
+
const maxR = Math.max(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);
|
|
536
|
+
const minC = Math.min(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);
|
|
537
|
+
const maxC = Math.max(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);
|
|
538
|
+
return rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;
|
|
539
|
+
}
|
|
540
|
+
function isActiveCell(rIdx, cIdx) {
|
|
541
|
+
return sheetState().activeCell?.row === rIdx && sheetState().activeCell?.col === cIdx;
|
|
542
|
+
}
|
|
543
|
+
var div = root_7();
|
|
544
|
+
var node = $7.child(div);
|
|
545
|
+
{
|
|
546
|
+
let $0 = $7.derived(() => sheetState().editingCell ? sheetState().draftValue : $7.get(activeRawValue));
|
|
547
|
+
FormulaBar(node, {
|
|
548
|
+
get activeCoord() {
|
|
549
|
+
return sheetState().activeCell;
|
|
550
|
+
},
|
|
551
|
+
get value() {
|
|
552
|
+
return $7.get($0);
|
|
553
|
+
},
|
|
554
|
+
onChange: (val) => {
|
|
555
|
+
if (sheetState().activeCell) {
|
|
556
|
+
sheetState().draftValue = val;
|
|
557
|
+
}
|
|
558
|
+
},
|
|
559
|
+
onCommit: (val) => {
|
|
560
|
+
if (sheetState().activeCell) {
|
|
561
|
+
const row = sheetState().document.rows[sheetState().activeCell.row];
|
|
562
|
+
const col = sheetState().document.columns[sheetState().activeCell.col];
|
|
563
|
+
if (row && col) {
|
|
564
|
+
sheetState().setCellValue(row.id, col.id, val);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
},
|
|
568
|
+
onCancel: () => {
|
|
569
|
+
sheetState().cancelEditing();
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
var div_1 = $7.sibling(node, 2);
|
|
574
|
+
var table = $7.child(div_1);
|
|
575
|
+
var thead = $7.child(table);
|
|
576
|
+
var tr = $7.child(thead);
|
|
577
|
+
var node_1 = $7.sibling($7.child(tr));
|
|
578
|
+
$7.each(node_1, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor2, col) => {
|
|
579
|
+
var th = root5();
|
|
580
|
+
var div_2 = $7.child(th);
|
|
581
|
+
var span = $7.child(div_2);
|
|
582
|
+
var text = $7.only_child(span, true);
|
|
583
|
+
var span_1 = $7.sibling(span, 2);
|
|
584
|
+
var text_1 = $7.only_child(span_1);
|
|
585
|
+
$7.reset(div_2);
|
|
586
|
+
var div_3 = $7.sibling(div_2, 2);
|
|
587
|
+
$7.reset(th);
|
|
588
|
+
$7.template_effect(() => {
|
|
589
|
+
$7.set_style(th, `width: ${($7.get(col).width || 130) ?? ""}px; min-width: ${($7.get(col).width || 130) ?? ""}px; max-width: ${($7.get(col).width || 130) ?? ""}px;`);
|
|
590
|
+
$7.set_text(text, $7.get(col).title);
|
|
591
|
+
$7.set_text(text_1, `(${$7.get(col).key ?? ""})`);
|
|
592
|
+
});
|
|
593
|
+
$7.delegated("click", th, () => $$props.onColumnHeaderClick?.($7.get(col)));
|
|
594
|
+
$7.delegated("mousedown", div_3, (e) => handleResizeStart($7.get(col).id, $7.get(col).width || 130, e));
|
|
595
|
+
$7.append($$anchor2, th);
|
|
596
|
+
});
|
|
597
|
+
var node_2 = $7.sibling(node_1);
|
|
598
|
+
{
|
|
599
|
+
var consequent = ($$anchor2) => {
|
|
600
|
+
var th_1 = root_13();
|
|
601
|
+
$7.delegated("click", th_1, function(...$$args) {
|
|
602
|
+
$$props.onAddColumnClick?.apply(this, $$args);
|
|
603
|
+
});
|
|
604
|
+
$7.append($$anchor2, th_1);
|
|
605
|
+
};
|
|
606
|
+
$7.if(node_2, ($$render) => {
|
|
607
|
+
if ($$props.onAddColumnClick) $$render(consequent);
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
$7.reset(tr);
|
|
611
|
+
$7.reset(thead);
|
|
612
|
+
var tbody = $7.sibling(thead);
|
|
613
|
+
$7.each(tbody, 23, () => sheetState().document.rows, (row) => row.id, ($$anchor2, row, rIdx) => {
|
|
614
|
+
var tr_1 = root_6();
|
|
615
|
+
var td = $7.child(tr_1);
|
|
616
|
+
var text_2 = $7.only_child(td, true);
|
|
617
|
+
var node_3 = $7.sibling(td);
|
|
618
|
+
$7.each(node_3, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor3, col, cIdx) => {
|
|
619
|
+
const cell = $7.derived(() => sheetState().getCell($7.get(row).id, $7.get(col).id));
|
|
620
|
+
const selected = $7.derived(() => isCellSelected($7.get(rIdx), $7.get(cIdx)));
|
|
621
|
+
const active = $7.derived(() => isActiveCell($7.get(rIdx), $7.get(cIdx)));
|
|
622
|
+
const isEditing = $7.derived(() => sheetState().editingCell?.row === $7.get(rIdx) && sheetState().editingCell?.col === $7.get(cIdx));
|
|
623
|
+
var td_1 = root_42();
|
|
624
|
+
var node_4 = $7.child(td_1);
|
|
625
|
+
{
|
|
626
|
+
var consequent_1 = ($$anchor4) => {
|
|
627
|
+
var input = root_22();
|
|
628
|
+
$7.remove_input_defaults(input);
|
|
629
|
+
$7.event("blur", input, () => sheetState().commitEditing());
|
|
630
|
+
$7.bind_value(input, () => sheetState().draftValue, ($$value) => sheetState().draftValue = $$value);
|
|
631
|
+
$7.append($$anchor4, input);
|
|
632
|
+
};
|
|
633
|
+
var consequent_2 = ($$anchor4) => {
|
|
634
|
+
var fragment = $7.comment();
|
|
635
|
+
var node_5 = $7.first_child(fragment);
|
|
636
|
+
$7.snippet(node_5, () => $$props.customCellRenderer, () => ({ row: $7.get(row), col: $7.get(col), cell: $7.get(cell) }));
|
|
637
|
+
$7.append($$anchor4, fragment);
|
|
638
|
+
};
|
|
639
|
+
var alternate = ($$anchor4) => {
|
|
640
|
+
var span_2 = root_32();
|
|
641
|
+
var text_3 = $7.only_child(span_2, true);
|
|
642
|
+
$7.template_effect(() => {
|
|
643
|
+
$7.set_class(span_2, 1, `truncate block ${$7.get(cell).error ? "text-destructive font-semibold" : ""}`);
|
|
644
|
+
$7.set_text(text_3, $7.get(cell).error || ($7.get(cell).value ?? ""));
|
|
645
|
+
});
|
|
646
|
+
$7.append($$anchor4, span_2);
|
|
647
|
+
};
|
|
648
|
+
$7.if(node_4, ($$render) => {
|
|
649
|
+
if ($7.get(isEditing)) $$render(consequent_1);
|
|
650
|
+
else if ($$props.customCellRenderer) $$render(consequent_2, 1);
|
|
651
|
+
else $$render(alternate, -1);
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
$7.reset(td_1);
|
|
655
|
+
$7.template_effect(() => {
|
|
656
|
+
$7.set_class(td_1, 1, `relative border-r border-border px-2 py-1 truncate text-foreground transition-all ${$7.get(selected) ? "bg-primary/10" : ""} ${$7.get(active) ? "ring-2 ring-primary ring-inset z-10" : ""}`);
|
|
657
|
+
$7.set_style(td_1, `width: ${($7.get(col).width || 130) ?? ""}px; min-width: ${($7.get(col).width || 130) ?? ""}px; max-width: ${($7.get(col).width || 130) ?? ""}px;`);
|
|
658
|
+
});
|
|
659
|
+
$7.delegated("click", td_1, (e) => handleCellClick($7.get(rIdx), $7.get(cIdx), e));
|
|
660
|
+
$7.delegated("dblclick", td_1, () => handleCellDblClick($7.get(rIdx), $7.get(cIdx)));
|
|
661
|
+
$7.append($$anchor3, td_1);
|
|
662
|
+
});
|
|
663
|
+
var node_6 = $7.sibling(node_3);
|
|
664
|
+
{
|
|
665
|
+
var consequent_3 = ($$anchor3) => {
|
|
666
|
+
var td_2 = root_5();
|
|
667
|
+
$7.append($$anchor3, td_2);
|
|
668
|
+
};
|
|
669
|
+
$7.if(node_6, ($$render) => {
|
|
670
|
+
if ($$props.onAddColumnClick) $$render(consequent_3);
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
$7.reset(tr_1);
|
|
674
|
+
$7.template_effect(() => {
|
|
675
|
+
$7.set_style(tr_1, `height: ${($7.get(row).height || 32) ?? ""}px;`);
|
|
676
|
+
$7.set_text(text_2, $7.get(rIdx) + 1);
|
|
677
|
+
});
|
|
678
|
+
$7.append($$anchor2, tr_1);
|
|
679
|
+
});
|
|
680
|
+
$7.reset(tbody);
|
|
681
|
+
$7.reset(table);
|
|
682
|
+
$7.reset(div_1);
|
|
683
|
+
$7.reset(div);
|
|
684
|
+
$7.bind_this(div, ($$value) => $7.set(gridContainer, $$value), () => $7.get(gridContainer));
|
|
685
|
+
$7.delegated("keydown", div, handleKeyDown);
|
|
686
|
+
$7.append($$anchor, div);
|
|
687
|
+
$7.pop();
|
|
688
|
+
}
|
|
689
|
+
$7.delegate(["keydown", "click", "mousedown", "dblclick"]);
|
|
690
|
+
|
|
220
691
|
// src/index.ts
|
|
221
692
|
var EditableTextNodeEditor2 = EditableTextNodeEditor;
|
|
222
693
|
var BubbleMenu2 = BubbleMenu;
|
|
@@ -224,8 +695,11 @@ var TemplateRenderer2 = TemplateRenderer;
|
|
|
224
695
|
export {
|
|
225
696
|
BubbleMenu2 as BubbleMenu,
|
|
226
697
|
EditableTextNodeEditor2 as EditableTextNodeEditor,
|
|
698
|
+
FormulaBar,
|
|
699
|
+
SpreadsheetEditor,
|
|
227
700
|
TemplateRenderer2 as TemplateRenderer,
|
|
228
701
|
createReactiveEditor,
|
|
702
|
+
createReactiveSpreadsheet,
|
|
229
703
|
initiateEditor
|
|
230
704
|
};
|
|
231
705
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/EditableTextNodeEditor.svelte","../src/editor.svelte.ts","../src/BubbleMenu.svelte","../src/TemplateRenderer.svelte","../src/index.ts"],"sourcesContent":["import 'EditableTextNodeEditor.svelte.css';import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { onDestroy, onMount } from \"svelte\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { initiateEditor } from \"./editor.svelte\";\n\nvar root = $.from_html(`<div class=\"flex items-center justify-center p-4 text-sm text-gray-500\">Loading editor...</div>`);\nvar root_1 = $.from_html(`<div draggable=\"false\"><!> <div class=\"pixerate-editor-content prose w-full max-w-none focus:outline-none\"></div></div>`);\n\nexport default function EditableTextNodeEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"\"),\n\t\tcontent = $.prop($$props, 'content', 3, undefined),\n\t\tshowMenu = $.prop($$props, 'showMenu', 3, true),\n\t\teditable = $.prop($$props, 'editable', 3, true),\n\t\teditor = $.prop($$props, 'editor', 15),\n\t\textensions = $.prop($$props, 'extensions', 19, () => []),\n\t\tplaceholder = $.prop($$props, 'placeholder', 3, \"\");\n\n\tlet element = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif (editor() && editor().isEditable !== editable()) {\n\t\t\teditor().setEditable(editable());\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\teditor(initiateEditor(\n\t\t\t$.get(element),\n\t\t\tcontent(),\n\t\t\t[\n\t\t\t\tPlaceholder.configure({ placeholder: placeholder() }),\n\t\t\t\t...extensions()\n\t\t\t],\n\t\t\t{\n\t\t\t\teditable: editable(),\n\t\t\t\tonCreate: $$props.onCreate,\n\t\t\t\tonUpdate: $$props.onUpdate,\n\t\t\t\tonFocus() {\n\t\t\t\t\tif ($$props.onFocus) $$props.onFocus();\n\t\t\t\t},\n\n\t\t\t\tonBlur() {\n\t\t\t\t\tif ($$props.onBlur) $$props.onBlur();\n\t\t\t\t}\n\t\t\t}\n\t\t));\n\t});\n\n\tonDestroy(() => {\n\t\tif (editor()) {\n\t\t\teditor().destroy();\n\t\t}\n\t});\n\n\tvar div = root_1();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar div_1 = root();\n\n\t\t\t$.append($$anchor, div_1);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif (!editor()) $$render(consequent);\n\t\t});\n\t}\n\n\tvar div_2 = $.sibling(node, 2);\n\n\t$.bind_this(div_2, ($$value) => $.set(element, $$value), () => $.get(element));\n\t$.reset(div);\n\t$.template_effect(() => $.set_class(div, 1, `pixerate-editor-container ${className()}`));\n\t$.append($$anchor, div);\n\t$.pop();\n}","import { Editor } from \"@tiptap/core\";\nimport { createRichTextPreset } from \"@pixerate/editor\";\nexport const initiateEditor = (element, content, extensions, options) => {\n const { richTextOptions, ...editorOptions } = options || {};\n const defaultPreset = createRichTextPreset(richTextOptions);\n const editor = new Editor({\n element,\n content,\n extensions: [\n ...defaultPreset,\n ...extensions ?? []\n ],\n autofocus: true,\n ...editorOptions\n });\n return editor;\n};\nexport function createReactiveEditor(initialContent = \"\", extensions = [], options = {}) {\n let editorInstance;\n return {\n get current() {\n return editorInstance;\n },\n mount(element) {\n editorInstance = initiateEditor(element, initialContent, extensions, options);\n return editorInstance;\n },\n destroy() {\n if (editorInstance) {\n editorInstance.destroy();\n editorInstance = void 0;\n }\n }\n };\n}\n","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\n\nvar root = $.from_html(`<div style=\"visibility: hidden;\"><!></div>`);\n\nexport default function BubbleMenu($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"flex h-fit w-fit items-center gap-1 rounded-md border border-gray-200 bg-white p-1 shadow-md\"),\n\t\tpluginKey = $.prop($$props, 'pluginKey', 3, \"bubbleMenu\"),\n\t\tshouldShow = $.prop($$props, 'shouldShow', 3, null),\n\t\tupdateDelay = $.prop($$props, 'updateDelay', 3, 250),\n\t\ttippyOptions = $.prop($$props, 'tippyOptions', 19, () => ({}));\n\n\tlet menuElement = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif ($$props.editor && $.get(menuElement)) {\n\t\t\tconst plugin = BubbleMenuPlugin({\n\t\t\t\tpluginKey: pluginKey(),\n\t\t\t\teditor: $$props.editor,\n\t\t\t\telement: $.get(menuElement),\n\t\t\t\ttippyOptions: {\n\t\t\t\t\tduration: 100,\n\t\t\t\t\tappendTo: () => document.body,\n\t\t\t\t\t...tippyOptions()\n\t\t\t\t},\n\t\t\t\tshouldShow: shouldShow(),\n\t\t\t\tupdateDelay: updateDelay()\n\t\t\t});\n\n\t\t\t$$props.editor.registerPlugin(plugin);\n\n\t\t\treturn () => {\n\t\t\t\t$$props.editor.unregisterPlugin(pluginKey());\n\t\t\t};\n\t\t}\n\t});\n\n\tvar div = root();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar fragment = $.comment();\n\t\t\tvar node_1 = $.first_child(fragment);\n\n\t\t\t$.snippet(node_1, () => $$props.children);\n\t\t\t$.append($$anchor, fragment);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif ($$props.children) $$render(consequent);\n\t\t});\n\t}\n\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(menuElement, $$value), () => $.get(menuElement));\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { tokenizePrompt, resolveTemplates } from \"@pixerate/editor\";\n\nvar root = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-semibold rounded-md border border-[var(--color-to)]/40 bg-gradient-to-r from-[var(--color-from)]/15 to-[var(--color-to)]/15 text-[var(--color-to)] hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_1 = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-medium rounded-md border border-violet-400/40 bg-violet-400/15 text-violet-600 hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_2 = $.from_html(`<span 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\"> </span>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<div></div>`);\n\nexport default function TemplateRenderer($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet templates = $.prop($$props, 'templates', 19, () => []),\n\t\tresolve = $.prop($$props, 'resolve', 3, false),\n\t\tclassName = $.prop($$props, 'class', 3, \"font-mono text-sm leading-relaxed whitespace-pre-wrap break-words\");\n\n\tlet displayText = $.derived(() => resolve() && templates().length > 0\n\t\t? resolveTemplates($$props.content, templates())\n\t\t: $$props.content);\n\n\tlet tokens = $.derived(() => tokenizePrompt($.get(displayText)));\n\tvar div = root_4();\n\n\t$.each(div, 21, () => $.get(tokens), $.index, ($$anchor, token) => {\n\t\tvar fragment = $.comment();\n\t\tvar node = $.first_child(fragment);\n\n\t\t{\n\t\t\tvar consequent = ($$anchor) => {\n\t\t\t\tconst colors = $.derived(() => $$props.templateColorMap?.get($.get(token).value) || { from: \"#f43f5e\", to: \"#8b5cf6\" });\n\t\t\t\tvar span = root();\n\t\t\t\tvar text = $.only_child(span, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_style(span, `--color-from: ${$.get(colors).from}; --color-to: ${$.get(colors).to};`);\n\t\t\t\t\t$.set_attribute(span, 'title', `Template: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text, `{{${$.get(token).value}}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span, () => $$props.onTemplateClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span);\n\t\t\t};\n\n\t\t\tvar consequent_1 = ($$anchor) => {\n\t\t\t\tvar span_1 = root_1();\n\t\t\t\tvar text_1 = $.only_child(span_1, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_1, 'title', `Variable: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_1, `{${$.get(token).value}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span_1, () => $$props.onVariableClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span_1);\n\t\t\t};\n\n\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\tvar span_2 = root_2();\n\t\t\t\tvar text_2 = $.only_child(span_2, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_2, 'title', `Instruction: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_2, `__${$.get(token).value}__`);\n\t\t\t\t});\n\n\t\t\t\t$.append($$anchor, span_2);\n\t\t\t};\n\n\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\tvar span_3 = root_3();\n\t\t\t\tvar text_3 = $.only_child(span_3, true);\n\n\t\t\t\t$.template_effect(() => $.set_text(text_3, $.get(token).value));\n\t\t\t\t$.append($$anchor, span_3);\n\t\t\t};\n\n\t\t\t$.if(node, ($$render) => {\n\t\t\t\tif ($.get(token).type === \"template\") $$render(consequent); else if ($.get(token).type === \"variable\") $$render(consequent_1, 1); else if ($.get(token).type === \"instruction\") $$render(consequent_2, 2); else $$render(alternate, -1);\n\t\t\t});\n\t\t}\n\n\t\t$.append($$anchor, fragment);\n\t});\n\n\t$.reset(div);\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['click']);","import type { Component } from \"svelte\";\nimport type { Editor, Content, Extensions } from \"@tiptap/core\";\nimport type { Template, ColorGradient } from \"@pixerate/editor\";\n\nimport EditableTextNodeEditorComponent from \"./EditableTextNodeEditor.svelte\";\nimport BubbleMenuComponent from \"./BubbleMenu.svelte\";\nimport TemplateRendererComponent from \"./TemplateRenderer.svelte\";\n\nexport * from \"./editor.svelte\";\n\nexport interface EditableTextNodeEditorProps {\n class?: string;\n content?: Content;\n showMenu?: boolean;\n editable?: boolean;\n editor?: Editor;\n extensions?: Extensions;\n onUpdate?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onCreate?: () => void;\n placeholder?: string;\n}\n\nexport interface BubbleMenuProps {\n editor?: Editor;\n class?: string;\n children?: any;\n}\n\nexport interface TemplateRendererProps {\n content: string;\n templates?: Template[];\n templateColorMap?: Map<string, ColorGradient>;\n resolve?: boolean;\n class?: string;\n onTemplateClick?: (templateName: string) => void;\n onVariableClick?: (variableName: string) => void;\n}\n\nexport const EditableTextNodeEditor = EditableTextNodeEditorComponent as unknown as Component<EditableTextNodeEditorProps>;\nexport const BubbleMenu = BubbleMenuComponent as unknown as Component<BubbleMenuProps>;\nexport const TemplateRenderer = TemplateRendererComponent as unknown as Component<TemplateRendererProps>;\n\nexport type {\n Template,\n TemplateVersion,\n Token,\n TokenType,\n ColorGradient,\n RichTextPresetOptions,\n} from \"@pixerate/editor\";\n"],"mappings":"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","names":["$","$$anchor","$","root","$$anchor","$","root","root_1","$$anchor","EditableTextNodeEditor","BubbleMenu","TemplateRenderer"]}
|
|
1
|
+
{"version":3,"sources":["../src/EditableTextNodeEditor.svelte","../src/editor.svelte.ts","../src/BubbleMenu.svelte","../src/TemplateRenderer.svelte","../src/spreadsheet/SpreadsheetEditor.svelte","../src/spreadsheet/FormulaBar.svelte","../src/spreadsheet/spreadsheet.svelte.ts","../src/index.ts"],"sourcesContent":["import 'EditableTextNodeEditor.svelte.css';import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { onDestroy, onMount } from \"svelte\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport { initiateEditor } from \"./editor.svelte\";\n\nvar root = $.from_html(`<div class=\"flex items-center justify-center p-4 text-sm text-gray-500\">Loading editor...</div>`);\nvar root_1 = $.from_html(`<div draggable=\"false\"><!> <div class=\"pixerate-editor-content prose w-full max-w-none focus:outline-none\"></div></div>`);\n\nexport default function EditableTextNodeEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"\"),\n\t\tcontent = $.prop($$props, 'content', 3, undefined),\n\t\tshowMenu = $.prop($$props, 'showMenu', 3, true),\n\t\teditable = $.prop($$props, 'editable', 3, true),\n\t\teditor = $.prop($$props, 'editor', 15),\n\t\textensions = $.prop($$props, 'extensions', 19, () => []),\n\t\tplaceholder = $.prop($$props, 'placeholder', 3, \"\");\n\n\tlet element = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif (editor() && editor().isEditable !== editable()) {\n\t\t\teditor().setEditable(editable());\n\t\t}\n\t});\n\n\tonMount(() => {\n\t\teditor(initiateEditor(\n\t\t\t$.get(element),\n\t\t\tcontent(),\n\t\t\t[\n\t\t\t\tPlaceholder.configure({ placeholder: placeholder() }),\n\t\t\t\t...extensions()\n\t\t\t],\n\t\t\t{\n\t\t\t\teditable: editable(),\n\t\t\t\tonCreate: $$props.onCreate,\n\t\t\t\tonUpdate: $$props.onUpdate,\n\t\t\t\tonFocus() {\n\t\t\t\t\tif ($$props.onFocus) $$props.onFocus();\n\t\t\t\t},\n\n\t\t\t\tonBlur() {\n\t\t\t\t\tif ($$props.onBlur) $$props.onBlur();\n\t\t\t\t}\n\t\t\t}\n\t\t));\n\t});\n\n\tonDestroy(() => {\n\t\tif (editor()) {\n\t\t\teditor().destroy();\n\t\t}\n\t});\n\n\tvar div = root_1();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar div_1 = root();\n\n\t\t\t$.append($$anchor, div_1);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif (!editor()) $$render(consequent);\n\t\t});\n\t}\n\n\tvar div_2 = $.sibling(node, 2);\n\n\t$.bind_this(div_2, ($$value) => $.set(element, $$value), () => $.get(element));\n\t$.reset(div);\n\t$.template_effect(() => $.set_class(div, 1, `pixerate-editor-container ${className()}`));\n\t$.append($$anchor, div);\n\t$.pop();\n}","import { Editor } from \"@tiptap/core\";\nimport { createRichTextPreset } from \"@pixerate/editor\";\nexport const initiateEditor = (element, content, extensions, options) => {\n const { richTextOptions, ...editorOptions } = options || {};\n const defaultPreset = createRichTextPreset(richTextOptions);\n const editor = new Editor({\n element,\n content,\n extensions: [\n ...defaultPreset,\n ...extensions ?? []\n ],\n autofocus: true,\n ...editorOptions\n });\n return editor;\n};\nexport function createReactiveEditor(initialContent = \"\", extensions = [], options = {}) {\n let editorInstance;\n return {\n get current() {\n return editorInstance;\n },\n mount(element) {\n editorInstance = initiateEditor(element, initialContent, extensions, options);\n return editorInstance;\n },\n destroy() {\n if (editorInstance) {\n editorInstance.destroy();\n editorInstance = void 0;\n }\n }\n };\n}\n","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { BubbleMenuPlugin } from \"@tiptap/extension-bubble-menu\";\n\nvar root = $.from_html(`<div style=\"visibility: hidden;\"><!></div>`);\n\nexport default function BubbleMenu($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet className = $.prop($$props, 'class', 3, \"flex h-fit w-fit items-center gap-1 rounded-md border border-gray-200 bg-white p-1 shadow-md\"),\n\t\tpluginKey = $.prop($$props, 'pluginKey', 3, \"bubbleMenu\"),\n\t\tshouldShow = $.prop($$props, 'shouldShow', 3, null),\n\t\tupdateDelay = $.prop($$props, 'updateDelay', 3, 250),\n\t\ttippyOptions = $.prop($$props, 'tippyOptions', 19, () => ({}));\n\n\tlet menuElement = $.state(void 0);\n\n\t$.user_effect(() => {\n\t\tif ($$props.editor && $.get(menuElement)) {\n\t\t\tconst plugin = BubbleMenuPlugin({\n\t\t\t\tpluginKey: pluginKey(),\n\t\t\t\teditor: $$props.editor,\n\t\t\t\telement: $.get(menuElement),\n\t\t\t\ttippyOptions: {\n\t\t\t\t\tduration: 100,\n\t\t\t\t\tappendTo: () => document.body,\n\t\t\t\t\t...tippyOptions()\n\t\t\t\t},\n\t\t\t\tshouldShow: shouldShow(),\n\t\t\t\tupdateDelay: updateDelay()\n\t\t\t});\n\n\t\t\t$$props.editor.registerPlugin(plugin);\n\n\t\t\treturn () => {\n\t\t\t\t$$props.editor.unregisterPlugin(pluginKey());\n\t\t\t};\n\t\t}\n\t});\n\n\tvar div = root();\n\tvar node = $.child(div);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar fragment = $.comment();\n\t\t\tvar node_1 = $.first_child(fragment);\n\n\t\t\t$.snippet(node_1, () => $$props.children);\n\t\t\t$.append($$anchor, fragment);\n\t\t};\n\n\t\t$.if(node, ($$render) => {\n\t\t\tif ($$props.children) $$render(consequent);\n\t\t});\n\t}\n\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(menuElement, $$value), () => $.get(menuElement));\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { tokenizePrompt, resolveTemplates } from \"@pixerate/editor\";\n\nvar root = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-semibold rounded-md border border-[var(--color-to)]/40 bg-gradient-to-r from-[var(--color-from)]/15 to-[var(--color-to)]/15 text-[var(--color-to)] hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_1 = $.from_html(`<span class=\"inline-flex items-center px-1.5 py-0.5 mx-0.5 text-xs font-medium rounded-md border border-violet-400/40 bg-violet-400/15 text-violet-600 hover:brightness-110 cursor-pointer transition-all\"> </span>`);\nvar root_2 = $.from_html(`<span 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\"> </span>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<div></div>`);\n\nexport default function TemplateRenderer($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet templates = $.prop($$props, 'templates', 19, () => []),\n\t\tresolve = $.prop($$props, 'resolve', 3, false),\n\t\tclassName = $.prop($$props, 'class', 3, \"font-mono text-sm leading-relaxed whitespace-pre-wrap break-words\");\n\n\tlet displayText = $.derived(() => resolve() && templates().length > 0\n\t\t? resolveTemplates($$props.content, templates())\n\t\t: $$props.content);\n\n\tlet tokens = $.derived(() => tokenizePrompt($.get(displayText)));\n\tvar div = root_4();\n\n\t$.each(div, 21, () => $.get(tokens), $.index, ($$anchor, token) => {\n\t\tvar fragment = $.comment();\n\t\tvar node = $.first_child(fragment);\n\n\t\t{\n\t\t\tvar consequent = ($$anchor) => {\n\t\t\t\tconst colors = $.derived(() => $$props.templateColorMap?.get($.get(token).value) || { from: \"#f43f5e\", to: \"#8b5cf6\" });\n\t\t\t\tvar span = root();\n\t\t\t\tvar text = $.only_child(span, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_style(span, `--color-from: ${$.get(colors).from}; --color-to: ${$.get(colors).to};`);\n\t\t\t\t\t$.set_attribute(span, 'title', `Template: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text, `{{${$.get(token).value}}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span, () => $$props.onTemplateClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span);\n\t\t\t};\n\n\t\t\tvar consequent_1 = ($$anchor) => {\n\t\t\t\tvar span_1 = root_1();\n\t\t\t\tvar text_1 = $.only_child(span_1, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_1, 'title', `Variable: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_1, `{${$.get(token).value}}`);\n\t\t\t\t});\n\n\t\t\t\t$.delegated('click', span_1, () => $$props.onVariableClick?.($.get(token).value));\n\t\t\t\t$.append($$anchor, span_1);\n\t\t\t};\n\n\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\tvar span_2 = root_2();\n\t\t\t\tvar text_2 = $.only_child(span_2, true);\n\n\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t$.set_attribute(span_2, 'title', `Instruction: ${$.get(token).value}`);\n\t\t\t\t\t$.set_text(text_2, `__${$.get(token).value}__`);\n\t\t\t\t});\n\n\t\t\t\t$.append($$anchor, span_2);\n\t\t\t};\n\n\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\tvar span_3 = root_3();\n\t\t\t\tvar text_3 = $.only_child(span_3, true);\n\n\t\t\t\t$.template_effect(() => $.set_text(text_3, $.get(token).value));\n\t\t\t\t$.append($$anchor, span_3);\n\t\t\t};\n\n\t\t\t$.if(node, ($$render) => {\n\t\t\t\tif ($.get(token).type === \"template\") $$render(consequent); else if ($.get(token).type === \"variable\") $$render(consequent_1, 1); else if ($.get(token).type === \"instruction\") $$render(consequent_2, 2); else $$render(alternate, -1);\n\t\t\t});\n\t\t}\n\n\t\t$.append($$anchor, fragment);\n\t});\n\n\t$.reset(div);\n\t$.template_effect(() => $.set_class(div, 1, $.clsx(className())));\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['click']);","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { indexToColName } from '@pixerate/editor';\nimport FormulaBar from './FormulaBar.svelte';\nimport { createReactiveSpreadsheet } from './spreadsheet.svelte';\n\nvar root = $.from_html(`<th class=\"relative border-r border-border px-2 text-left font-medium text-muted-foreground hover:bg-muted/90 transition-colors group cursor-pointer\"><div class=\"flex items-center justify-between gap-1 truncate\"><span class=\"truncate font-semibold text-foreground text-xs\"> </span> <span class=\"text-[10px] text-muted-foreground/70 font-mono font-normal\"> </span></div> <div class=\"absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-primary/50 group-hover:bg-primary/20 z-10\" role=\"separator\" aria-orientation=\"vertical\"></div></th>`);\nvar root_1 = $.from_html(`<th class=\"w-10 min-w-[2.5rem] px-1 text-center bg-muted/40 hover:bg-muted cursor-pointer transition-colors\" title=\"Add Column\"><span class=\"text-xs font-bold text-muted-foreground\">+</span></th>`);\nvar root_2 = $.from_html(`<input type=\"text\" class=\"absolute inset-0 w-full h-full px-2 py-1 bg-background text-foreground outline-none font-sans text-xs border-2 border-primary z-20\"/>`);\nvar root_3 = $.from_html(`<span> </span>`);\nvar root_4 = $.from_html(`<td><!></td>`);\nvar root_5 = $.from_html(`<td class=\"w-10 min-w-[2.5rem] bg-muted/10 border-r border-border\"></td>`);\nvar root_6 = $.from_html(`<tr class=\"border-b border-border hover:bg-muted/10 transition-colors\"><td class=\"w-12 min-w-[3rem] sticky left-0 z-10 bg-muted/50 border-r border-border text-center text-[10px] text-muted-foreground font-mono select-none\"> </td><!><!></tr>`);\nvar root_7 = $.from_html(`<div class=\"flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs\" tabindex=\"0\" role=\"grid\" aria-label=\"Spreadsheet\"><!> <div class=\"relative flex-1 overflow-auto\"><table class=\"border-collapse table-fixed w-max min-w-full\"><thead><tr class=\"h-7 bg-muted/60 sticky top-0 z-20 border-b border-border shadow-xs\"><th class=\"w-12 min-w-[3rem] sticky left-0 z-30 bg-muted/90 border-r border-border text-center text-[10px] text-muted-foreground font-medium\">#</th><!><!></tr></thead><tbody></tbody></table></div></div>`);\n\nexport default function SpreadsheetEditor($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet sheetState = $.prop($$props, 'sheetState', 23, createReactiveSpreadsheet),\n\t\treadOnly = $.prop($$props, 'readOnly', 3, false);\n\n\tlet gridContainer = $.state(null);\n\tlet resizingColId = $.state(null);\n\tlet resizeStartX = $.state(0);\n\tlet resizeStartWidth = $.state(0);\n\n\t// Active cell formula bar binding\n\tlet activeRawValue = $.derived(() => {\n\t\tif (!sheetState().activeCell) return '';\n\n\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\tif (!row || !col) return '';\n\n\t\treturn sheetState().getCell(row.id, col.id).raw;\n\t});\n\n\tfunction handleCellClick(rIdx, cIdx, e) {\n\t\tif (sheetState().editingCell && (sheetState().editingCell.row !== rIdx || sheetState().editingCell.col !== cIdx)) {\n\t\t\tsheetState().commitEditing();\n\t\t}\n\n\t\tsheetState().selectCell(rIdx, cIdx, e.shiftKey);\n\t}\n\n\tfunction handleCellDblClick(rIdx, cIdx) {\n\t\tif (readOnly()) return;\n\n\t\tconst col = sheetState().document.columns[cIdx];\n\n\t\tif (col?.readOnly) return;\n\n\t\tsheetState().startEditing(rIdx, cIdx);\n\t}\n\n\tfunction handleKeyDown(e) {\n\t\tif (sheetState().editingCell) {\n\t\t\tif (e.key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().commitEditing();\n\t\t\t\tsheetState().moveCursor('down');\n\t\t\t} else if (e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().cancelEditing();\n\t\t\t} else if (e.key === 'Tab') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().commitEditing();\n\t\t\t\tsheetState().moveCursor(e.shiftKey ? 'left' : 'right');\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!sheetState().activeCell) return;\n\n\t\tif (e.key === 'ArrowUp') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('up', e.shiftKey);\n\t\t} else if (e.key === 'ArrowDown') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('down', e.shiftKey);\n\t\t} else if (e.key === 'ArrowLeft') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('left', e.shiftKey);\n\t\t} else if (e.key === 'ArrowRight') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor('right', e.shiftKey);\n\t\t} else if (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tsheetState().moveCursor(e.shiftKey ? 'left' : 'right');\n\t\t} else if (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!readOnly() && !col?.readOnly) {\n\t\t\t\tsheetState().startEditing();\n\t\t\t}\n\t\t} else if (e.key === 'Backspace' || e.key === 'Delete') {\n\t\t\tif (readOnly()) return;\n\n\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (row && col && !col.readOnly) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsheetState().setCellValue(row.id, col.id, '');\n\t\t\t}\n\t\t} else if ((e.metaKey || e.ctrlKey) && e.key === 'z') {\n\t\t\te.preventDefault();\n\n\t\t\tif (e.shiftKey) {\n\t\t\t\tsheetState().redo();\n\t\t\t} else {\n\t\t\t\tsheetState().undo();\n\t\t\t}\n\t\t} else if ((e.metaKey || e.ctrlKey) && e.key === 'c') {\n\t\t\te.preventDefault();\n\n\t\t\tconst tsv = sheetState().exportToTsv();\n\n\t\t\tnavigator.clipboard?.writeText(tsv);\n\t\t} else if (!readOnly() && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n\t\t\t// Direct typing into cell starts editing\n\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\tif (!col?.readOnly) {\n\t\t\t\tsheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, e.key);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleResizeStart(colId, width, e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\t$.set(resizingColId, colId, true);\n\t\t$.set(resizeStartX, e.clientX, true);\n\t\t$.set(resizeStartWidth, width, true);\n\n\t\tconst handleMouseMove = (moveEvent) => {\n\t\t\tif (!$.get(resizingColId)) return;\n\n\t\t\tconst delta = moveEvent.clientX - $.get(resizeStartX);\n\n\t\t\tsheetState().setColumnWidth($.get(resizingColId), Math.max(60, $.get(resizeStartWidth) + delta));\n\t\t};\n\n\t\tconst handleMouseUp = () => {\n\t\t\t$.set(resizingColId, null);\n\t\t\twindow.removeEventListener('mousemove', handleMouseMove);\n\t\t\twindow.removeEventListener('mouseup', handleMouseUp);\n\t\t};\n\n\t\twindow.addEventListener('mousemove', handleMouseMove);\n\t\twindow.addEventListener('mouseup', handleMouseUp);\n\t}\n\n\tfunction isCellSelected(rIdx, cIdx) {\n\t\tif (!sheetState().selectedRange) return false;\n\n\t\tconst minR = Math.min(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);\n\t\tconst maxR = Math.max(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);\n\t\tconst minC = Math.min(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);\n\t\tconst maxC = Math.max(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);\n\n\t\treturn rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;\n\t}\n\n\tfunction isActiveCell(rIdx, cIdx) {\n\t\treturn sheetState().activeCell?.row === rIdx && sheetState().activeCell?.col === cIdx;\n\t}\n\n\tvar div = root_7();\n\tvar node = $.child(div);\n\n\t{\n\t\tlet $0 = $.derived(() => sheetState().editingCell ? sheetState().draftValue : $.get(activeRawValue));\n\n\t\tFormulaBar(node, {\n\t\t\tget activeCoord() {\n\t\t\t\treturn sheetState().activeCell;\n\t\t\t},\n\n\t\t\tget value() {\n\t\t\t\treturn $.get($0);\n\t\t\t},\n\n\t\t\tonChange: (val) => {\n\t\t\t\tif (sheetState().activeCell) {\n\t\t\t\t\tsheetState().draftValue = val;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonCommit: (val) => {\n\t\t\t\tif (sheetState().activeCell) {\n\t\t\t\t\tconst row = sheetState().document.rows[sheetState().activeCell.row];\n\t\t\t\t\tconst col = sheetState().document.columns[sheetState().activeCell.col];\n\n\t\t\t\t\tif (row && col) {\n\t\t\t\t\t\tsheetState().setCellValue(row.id, col.id, val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonCancel: () => {\n\t\t\t\tsheetState().cancelEditing();\n\t\t\t}\n\t\t});\n\t}\n\n\tvar div_1 = $.sibling(node, 2);\n\tvar table = $.child(div_1);\n\tvar thead = $.child(table);\n\tvar tr = $.child(thead);\n\tvar node_1 = $.sibling($.child(tr));\n\n\t$.each(node_1, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor, col) => {\n\t\tvar th = root();\n\t\tvar div_2 = $.child(th);\n\t\tvar span = $.child(div_2);\n\t\tvar text = $.only_child(span, true);\n\t\tvar span_1 = $.sibling(span, 2);\n\t\tvar text_1 = $.only_child(span_1);\n\n\t\t$.reset(div_2);\n\n\t\tvar div_3 = $.sibling(div_2, 2);\n\n\t\t$.reset(th);\n\n\t\t$.template_effect(() => {\n\t\t\t$.set_style(th, `width: ${($.get(col).width || 130) ?? ''}px; min-width: ${($.get(col).width || 130) ?? ''}px; max-width: ${($.get(col).width || 130) ?? ''}px;`);\n\t\t\t$.set_text(text, $.get(col).title);\n\t\t\t$.set_text(text_1, `(${$.get(col).key ?? ''})`);\n\t\t});\n\n\t\t$.delegated('click', th, () => $$props.onColumnHeaderClick?.($.get(col)));\n\t\t$.delegated('mousedown', div_3, (e) => handleResizeStart($.get(col).id, $.get(col).width || 130, e));\n\t\t$.append($$anchor, th);\n\t});\n\n\tvar node_2 = $.sibling(node_1);\n\n\t{\n\t\tvar consequent = ($$anchor) => {\n\t\t\tvar th_1 = root_1();\n\n\t\t\t$.delegated('click', th_1, function (...$$args) {\n\t\t\t\t$$props.onAddColumnClick?.apply(this, $$args);\n\t\t\t});\n\n\t\t\t$.append($$anchor, th_1);\n\t\t};\n\n\t\t$.if(node_2, ($$render) => {\n\t\t\tif ($$props.onAddColumnClick) $$render(consequent);\n\t\t});\n\t}\n\n\t$.reset(tr);\n\t$.reset(thead);\n\n\tvar tbody = $.sibling(thead);\n\n\t$.each(tbody, 23, () => sheetState().document.rows, (row) => row.id, ($$anchor, row, rIdx) => {\n\t\tvar tr_1 = root_6();\n\t\tvar td = $.child(tr_1);\n\t\tvar text_2 = $.only_child(td, true);\n\t\tvar node_3 = $.sibling(td);\n\n\t\t$.each(node_3, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor, col, cIdx) => {\n\t\t\tconst cell = $.derived(() => sheetState().getCell($.get(row).id, $.get(col).id));\n\t\t\tconst selected = $.derived(() => isCellSelected($.get(rIdx), $.get(cIdx)));\n\t\t\tconst active = $.derived(() => isActiveCell($.get(rIdx), $.get(cIdx)));\n\t\t\tconst isEditing = $.derived(() => sheetState().editingCell?.row === $.get(rIdx) && sheetState().editingCell?.col === $.get(cIdx));\n\t\t\tvar td_1 = root_4();\n\t\t\tvar node_4 = $.child(td_1);\n\n\t\t\t{\n\t\t\t\tvar consequent_1 = ($$anchor) => {\n\t\t\t\t\tvar input = root_2();\n\n\t\t\t\t\t$.remove_input_defaults(input);\n\t\t\t\t\t$.event('blur', input, () => sheetState().commitEditing());\n\t\t\t\t\t$.bind_value(input, () => sheetState().draftValue, ($$value) => sheetState().draftValue = $$value);\n\t\t\t\t\t$.append($$anchor, input);\n\t\t\t\t};\n\n\t\t\t\tvar consequent_2 = ($$anchor) => {\n\t\t\t\t\tvar fragment = $.comment();\n\t\t\t\t\tvar node_5 = $.first_child(fragment);\n\n\t\t\t\t\t$.snippet(node_5, () => $$props.customCellRenderer, () => ({ row: $.get(row), col: $.get(col), cell: $.get(cell) }));\n\t\t\t\t\t$.append($$anchor, fragment);\n\t\t\t\t};\n\n\t\t\t\tvar alternate = ($$anchor) => {\n\t\t\t\t\tvar span_2 = root_3();\n\t\t\t\t\tvar text_3 = $.only_child(span_2, true);\n\n\t\t\t\t\t$.template_effect(() => {\n\t\t\t\t\t\t$.set_class(span_2, 1, `truncate block ${$.get(cell).error ? 'text-destructive font-semibold' : ''}`);\n\t\t\t\t\t\t$.set_text(text_3, $.get(cell).error || ($.get(cell).value ?? ''));\n\t\t\t\t\t});\n\n\t\t\t\t\t$.append($$anchor, span_2);\n\t\t\t\t};\n\n\t\t\t\t$.if(node_4, ($$render) => {\n\t\t\t\t\tif ($.get(isEditing)) $$render(consequent_1); else if ($$props.customCellRenderer) $$render(consequent_2, 1); else $$render(alternate, -1);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t$.reset(td_1);\n\n\t\t\t$.template_effect(() => {\n\t\t\t\t$.set_class(td_1, 1, `relative border-r border-border px-2 py-1 truncate text-foreground transition-all ${$.get(selected) ? 'bg-primary/10' : ''} ${$.get(active) ? 'ring-2 ring-primary ring-inset z-10' : ''}`);\n\t\t\t\t$.set_style(td_1, `width: ${($.get(col).width || 130) ?? ''}px; min-width: ${($.get(col).width || 130) ?? ''}px; max-width: ${($.get(col).width || 130) ?? ''}px;`);\n\t\t\t});\n\n\t\t\t$.delegated('click', td_1, (e) => handleCellClick($.get(rIdx), $.get(cIdx), e));\n\t\t\t$.delegated('dblclick', td_1, () => handleCellDblClick($.get(rIdx), $.get(cIdx)));\n\t\t\t$.append($$anchor, td_1);\n\t\t});\n\n\t\tvar node_6 = $.sibling(node_3);\n\n\t\t{\n\t\t\tvar consequent_3 = ($$anchor) => {\n\t\t\t\tvar td_2 = root_5();\n\n\t\t\t\t$.append($$anchor, td_2);\n\t\t\t};\n\n\t\t\t$.if(node_6, ($$render) => {\n\t\t\t\tif ($$props.onAddColumnClick) $$render(consequent_3);\n\t\t\t});\n\t\t}\n\n\t\t$.reset(tr_1);\n\n\t\t$.template_effect(() => {\n\t\t\t$.set_style(tr_1, `height: ${($.get(row).height || 32) ?? ''}px;`);\n\t\t\t$.set_text(text_2, $.get(rIdx) + 1);\n\t\t});\n\n\t\t$.append($$anchor, tr_1);\n\t});\n\n\t$.reset(tbody);\n\t$.reset(table);\n\t$.reset(div_1);\n\t$.reset(div);\n\t$.bind_this(div, ($$value) => $.set(gridContainer, $$value), () => $.get(gridContainer));\n\t$.delegated('keydown', div, handleKeyDown);\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['keydown', 'click', 'mousedown', 'dblclick']);","import 'svelte/internal/disclose-version';\nimport * as $ from 'svelte/internal/client';\nimport { indexToColName } from '@pixerate/editor';\n\nvar root = $.from_html(`<div class=\"flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono\"><div class=\"flex h-6 min-w-[3rem] items-center justify-center rounded border border-border bg-background px-1.5 font-semibold text-foreground\"> </div> <div class=\"flex items-center text-muted-foreground select-none\"><span class=\"italic font-serif font-bold text-sm text-primary\">fx</span></div> <input type=\"text\" class=\"flex-1 bg-transparent px-2 py-0.5 outline-none font-sans text-xs text-foreground placeholder:text-muted-foreground/60 focus:bg-background focus:ring-1 focus:ring-primary rounded\" placeholder=\"Enter a value or formula (e.g. =SUM(A1:A5))\"/></div>`);\n\nexport default function FormulaBar($$anchor, $$props) {\n\t$.push($$props, true);\n\n\tlet activeCoord = $.prop($$props, 'activeCoord', 3, null),\n\t\tvalue = $.prop($$props, 'value', 15, '');\n\n\tlet coordLabel = $.derived(() => {\n\t\tif (!activeCoord()) return '--';\n\n\t\tconst colName = indexToColName(activeCoord().col);\n\n\t\treturn `${colName}${activeCoord().row + 1}`;\n\t});\n\n\tfunction handleKeyDown(e) {\n\t\tif (e.key === 'Enter') {\n\t\t\te.preventDefault();\n\t\t\t$$props.onCommit?.(value());\n\t\t} else if (e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\t$$props.onCancel?.();\n\t\t}\n\t}\n\n\tfunction handleInput(e) {\n\t\tconst target = e.target;\n\n\t\tvalue(target.value);\n\t\t$$props.onChange?.(target.value);\n\t}\n\n\tvar div = root();\n\tvar div_1 = $.child(div);\n\tvar text = $.only_child(div_1, true);\n\tvar input = $.sibling(div_1, 4);\n\n\t$.remove_input_defaults(input);\n\t$.reset(div);\n\n\t$.template_effect(() => {\n\t\t$.set_text(text, $.get(coordLabel));\n\t\t$.set_value(input, value());\n\t});\n\n\t$.delegated('input', input, handleInput);\n\t$.delegated('keydown', input, handleKeyDown);\n\t$.append($$anchor, div);\n\t$.pop();\n}\n\n$.delegate(['input', 'keydown']);","import {\n SpreadsheetController\n} from \"@pixerate/editor\";\nexport function createReactiveSpreadsheet(options = {}) {\n let doc = $state({\n id: options.document?.id || `sheet_${Date.now()}`,\n name: options.document?.name || \"Sheet 1\",\n columns: options.document?.columns || [],\n rows: options.document?.rows || [],\n cells: options.document?.cells || {},\n createdAt: options.document?.createdAt || Date.now(),\n updatedAt: options.document?.updatedAt || Date.now()\n });\n let activeCell = $state(null);\n let selectedRange = $state(null);\n let editingCell = $state(null);\n let draftValue = $state(\"\");\n const controller = new SpreadsheetController({\n ...options,\n document: options.document,\n onDocumentChange: (updated) => {\n doc = { ...updated };\n options.onDocumentChange?.(updated);\n },\n onSelectionChange: (active, range) => {\n activeCell = active;\n selectedRange = range;\n options.onSelectionChange?.(active, range);\n },\n onCellCommit: (rowId, colId, raw, value) => {\n options.onCellCommit?.(rowId, colId, raw, value);\n }\n });\n doc = { ...controller.document };\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n return {\n get document() {\n return doc;\n },\n get activeCell() {\n return activeCell;\n },\n get selectedRange() {\n return selectedRange;\n },\n get editingCell() {\n return editingCell;\n },\n get draftValue() {\n return draftValue;\n },\n set draftValue(val) {\n draftValue = val;\n controller.draftValue = val;\n },\n controller,\n getCell(rowId, colId) {\n return controller.getCell(rowId, colId);\n },\n setCellValue(rowId, colId, raw) {\n controller.setCellValue(rowId, colId, raw);\n doc = { ...controller.document };\n },\n selectCell(row, col, extendSelection = false) {\n controller.selectCell(row, col, extendSelection);\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n },\n selectRange(range) {\n controller.selectRange(range);\n selectedRange = controller.selectedRange;\n },\n startEditing(row, col, initialVal) {\n controller.startEditing(row, col, initialVal);\n activeCell = controller.activeCell;\n editingCell = controller.editingCell;\n draftValue = controller.draftValue;\n },\n commitEditing(val) {\n controller.commitEditing(val);\n editingCell = null;\n draftValue = \"\";\n doc = { ...controller.document };\n },\n cancelEditing() {\n controller.cancelEditing();\n editingCell = null;\n draftValue = \"\";\n },\n moveCursor(dir, extend = false) {\n controller.moveCursor(dir, extend);\n activeCell = controller.activeCell;\n selectedRange = controller.selectedRange;\n },\n insertColumn(index, config) {\n controller.insertColumn(index, config);\n doc = { ...controller.document };\n },\n deleteColumn(colId) {\n controller.deleteColumn(colId);\n doc = { ...controller.document };\n },\n insertRow(index, config) {\n controller.insertRow(index, config);\n doc = { ...controller.document };\n },\n deleteRow(rowId) {\n controller.deleteRow(rowId);\n doc = { ...controller.document };\n },\n setColumnWidth(colId, width) {\n controller.setColumnWidth(colId, width);\n doc = { ...controller.document };\n },\n registerDataSource(ds) {\n controller.registerDataSource(ds);\n doc = { ...controller.document };\n },\n setPrimaryDataSource(id) {\n controller.setPrimaryDataSource(id);\n doc = { ...controller.document };\n },\n recalculateAll() {\n controller.recalculateAll();\n doc = { ...controller.document };\n },\n exportToTsv() {\n return controller.exportToTsv();\n },\n importFromTsv(data) {\n controller.importFromTsv(data);\n doc = { ...controller.document };\n },\n undo() {\n controller.undo();\n doc = { ...controller.document };\n },\n redo() {\n controller.redo();\n doc = { ...controller.document };\n }\n };\n}\n","import type { Component } from \"svelte\";\nimport type { Editor, Content, Extensions } from \"@tiptap/core\";\nimport type { Template, ColorGradient } from \"@pixerate/editor\";\n\nimport EditableTextNodeEditorComponent from \"./EditableTextNodeEditor.svelte\";\nimport BubbleMenuComponent from \"./BubbleMenu.svelte\";\nimport TemplateRendererComponent from \"./TemplateRenderer.svelte\";\n\nexport * from \"./editor.svelte\";\n\nexport interface EditableTextNodeEditorProps {\n class?: string;\n content?: Content;\n showMenu?: boolean;\n editable?: boolean;\n editor?: Editor;\n extensions?: Extensions;\n onUpdate?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onCreate?: () => void;\n placeholder?: string;\n}\n\nexport interface BubbleMenuProps {\n editor?: Editor;\n class?: string;\n children?: any;\n}\n\nexport interface TemplateRendererProps {\n content: string;\n templates?: Template[];\n templateColorMap?: Map<string, ColorGradient>;\n resolve?: boolean;\n class?: string;\n onTemplateClick?: (templateName: string) => void;\n onVariableClick?: (variableName: string) => void;\n}\n\nexport const EditableTextNodeEditor = EditableTextNodeEditorComponent as unknown as Component<EditableTextNodeEditorProps>;\nexport const BubbleMenu = BubbleMenuComponent as unknown as Component<BubbleMenuProps>;\nexport const TemplateRenderer = TemplateRendererComponent as unknown as Component<TemplateRendererProps>;\n\nexport type {\n Template,\n TemplateVersion,\n Token,\n TokenType,\n ColorGradient,\n RichTextPresetOptions,\n} from \"@pixerate/editor\";\n\nexport * from \"./spreadsheet\";\n"],"mappings":"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","names":["$","$$anchor","$","root","$$anchor","$","root","root_1","$$anchor","$","indexToColName","$","root","index","root","root_1","root_2","root_3","root_4","$$anchor","EditableTextNodeEditor","BubbleMenu","TemplateRenderer"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pixerate/editor-svelte",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
|
|
5
5
|
"author": "Pixerate",
|
|
6
6
|
"license": "MIT",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"@tiptap/extension-placeholder": "^2.11.5",
|
|
33
33
|
"@tiptap/pm": "^2.11.5",
|
|
34
34
|
"@tiptap/starter-kit": "^2.11.5",
|
|
35
|
-
"@pixerate/editor": "0.
|
|
35
|
+
"@pixerate/editor": "0.4.0"
|
|
36
36
|
},
|
|
37
37
|
"peerDependencies": {
|
|
38
38
|
"svelte": "^4.0.0 || ^5.0.0"
|
package/src/index.d.ts
CHANGED
|
@@ -78,3 +78,59 @@ export type {
|
|
|
78
78
|
ColorGradient,
|
|
79
79
|
RichTextPresetOptions,
|
|
80
80
|
};
|
|
81
|
+
|
|
82
|
+
import type {
|
|
83
|
+
SpreadsheetController,
|
|
84
|
+
SpreadsheetControllerOptions,
|
|
85
|
+
SpreadsheetDocument,
|
|
86
|
+
SpreadsheetColumn,
|
|
87
|
+
SpreadsheetRow,
|
|
88
|
+
CellCoordinate,
|
|
89
|
+
CellRange,
|
|
90
|
+
CellData,
|
|
91
|
+
SpreadsheetDataSource
|
|
92
|
+
} from '@pixerate/editor';
|
|
93
|
+
|
|
94
|
+
export interface SpreadsheetEditorProps {
|
|
95
|
+
sheetState: ReturnType<typeof createReactiveSpreadsheet>;
|
|
96
|
+
readonly?: boolean;
|
|
97
|
+
class?: string;
|
|
98
|
+
customCellRenderer?: (cell: CellData, col: SpreadsheetColumn, row: SpreadsheetRow) => any;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface FormulaBarProps {
|
|
102
|
+
sheetState: ReturnType<typeof createReactiveSpreadsheet>;
|
|
103
|
+
class?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export declare const SpreadsheetEditor: Component<SpreadsheetEditorProps>;
|
|
107
|
+
export declare const FormulaBar: Component<FormulaBarProps>;
|
|
108
|
+
|
|
109
|
+
export declare function createReactiveSpreadsheet(options?: SpreadsheetControllerOptions): {
|
|
110
|
+
readonly document: SpreadsheetDocument;
|
|
111
|
+
readonly activeCell: CellCoordinate | null;
|
|
112
|
+
readonly selectedRange: CellRange | null;
|
|
113
|
+
readonly editingCell: CellCoordinate | null;
|
|
114
|
+
draftValue: string;
|
|
115
|
+
controller: SpreadsheetController;
|
|
116
|
+
getCell(rowId: string, colId: string): CellData;
|
|
117
|
+
setCellValue(rowId: string, colId: string, raw: string): void;
|
|
118
|
+
selectCell(row: number, col: number, extendSelection?: boolean): void;
|
|
119
|
+
selectRange(range: CellRange): void;
|
|
120
|
+
startEditing(row?: number, col?: number, initialVal?: string): void;
|
|
121
|
+
commitEditing(val?: string): void;
|
|
122
|
+
cancelEditing(): void;
|
|
123
|
+
moveCursor(dir: 'up' | 'down' | 'left' | 'right', extend?: boolean): void;
|
|
124
|
+
insertColumn(index: number, config?: Partial<SpreadsheetColumn>): void;
|
|
125
|
+
deleteColumn(colId: string): void;
|
|
126
|
+
insertRow(index: number, config?: Partial<SpreadsheetRow>): void;
|
|
127
|
+
deleteRow(rowId: string): void;
|
|
128
|
+
setColumnWidth(colId: string, width: number): void;
|
|
129
|
+
registerDataSource(ds: SpreadsheetDataSource): void;
|
|
130
|
+
setPrimaryDataSource(id: string | undefined): void;
|
|
131
|
+
recalculateAll(): void;
|
|
132
|
+
exportToTsv(): string;
|
|
133
|
+
importFromTsv(data: string): void;
|
|
134
|
+
undo(): void;
|
|
135
|
+
redo(): void;
|
|
136
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { indexToColName } from '@pixerate/editor';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
activeCoord?: { row: number; col: number } | null;
|
|
6
|
+
value: string;
|
|
7
|
+
onChange?: (val: string) => void;
|
|
8
|
+
onCommit?: (val: string) => void;
|
|
9
|
+
onCancel?: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
activeCoord = null,
|
|
14
|
+
value = $bindable(''),
|
|
15
|
+
onChange,
|
|
16
|
+
onCommit,
|
|
17
|
+
onCancel
|
|
18
|
+
}: Props = $props();
|
|
19
|
+
|
|
20
|
+
let coordLabel = $derived.by(() => {
|
|
21
|
+
if (!activeCoord) return '--';
|
|
22
|
+
const colName = indexToColName(activeCoord.col);
|
|
23
|
+
return `${colName}${activeCoord.row + 1}`;
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
function handleKeyDown(e: KeyboardEvent) {
|
|
27
|
+
if (e.key === 'Enter') {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
onCommit?.(value);
|
|
30
|
+
} else if (e.key === 'Escape') {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
onCancel?.();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function handleInput(e: Event) {
|
|
37
|
+
const target = e.target as HTMLInputElement;
|
|
38
|
+
value = target.value;
|
|
39
|
+
onChange?.(target.value);
|
|
40
|
+
}
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<div class="flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono">
|
|
44
|
+
<div class="flex h-6 min-w-[3rem] items-center justify-center rounded border border-border bg-background px-1.5 font-semibold text-foreground">
|
|
45
|
+
{coordLabel}
|
|
46
|
+
</div>
|
|
47
|
+
<div class="flex items-center text-muted-foreground select-none">
|
|
48
|
+
<span class="italic font-serif font-bold text-sm text-primary">fx</span>
|
|
49
|
+
</div>
|
|
50
|
+
<input
|
|
51
|
+
type="text"
|
|
52
|
+
class="flex-1 bg-transparent px-2 py-0.5 outline-none font-sans text-xs text-foreground placeholder:text-muted-foreground/60 focus:bg-background focus:ring-1 focus:ring-primary rounded"
|
|
53
|
+
placeholder="Enter a value or formula (e.g. =SUM(A1:A5))"
|
|
54
|
+
{value}
|
|
55
|
+
oninput={handleInput}
|
|
56
|
+
onkeydown={handleKeyDown}
|
|
57
|
+
/>
|
|
58
|
+
</div>
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import { indexToColName, type SpreadsheetColumn, type SpreadsheetRow, type CellData } from '@pixerate/editor';
|
|
4
|
+
import FormulaBar from './FormulaBar.svelte';
|
|
5
|
+
import { createReactiveSpreadsheet } from './spreadsheet.svelte';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
sheetState?: ReturnType<typeof createReactiveSpreadsheet>;
|
|
9
|
+
readOnly?: boolean;
|
|
10
|
+
customCellRenderer?: Snippet<[{ row: SpreadsheetRow; col: SpreadsheetColumn; cell: CellData }]>;
|
|
11
|
+
onAddColumnClick?: () => void;
|
|
12
|
+
onColumnHeaderClick?: (col: SpreadsheetColumn) => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
sheetState = createReactiveSpreadsheet(),
|
|
17
|
+
readOnly = false,
|
|
18
|
+
customCellRenderer,
|
|
19
|
+
onAddColumnClick,
|
|
20
|
+
onColumnHeaderClick
|
|
21
|
+
}: Props = $props();
|
|
22
|
+
|
|
23
|
+
let gridContainer = $state<HTMLDivElement | null>(null);
|
|
24
|
+
let resizingColId = $state<string | null>(null);
|
|
25
|
+
let resizeStartX = $state(0);
|
|
26
|
+
let resizeStartWidth = $state(0);
|
|
27
|
+
|
|
28
|
+
// Active cell formula bar binding
|
|
29
|
+
let activeRawValue = $derived.by(() => {
|
|
30
|
+
if (!sheetState.activeCell) return '';
|
|
31
|
+
const row = sheetState.document.rows[sheetState.activeCell.row];
|
|
32
|
+
const col = sheetState.document.columns[sheetState.activeCell.col];
|
|
33
|
+
if (!row || !col) return '';
|
|
34
|
+
return sheetState.getCell(row.id, col.id).raw;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
function handleCellClick(rIdx: number, cIdx: number, e: MouseEvent) {
|
|
38
|
+
if (sheetState.editingCell && (sheetState.editingCell.row !== rIdx || sheetState.editingCell.col !== cIdx)) {
|
|
39
|
+
sheetState.commitEditing();
|
|
40
|
+
}
|
|
41
|
+
sheetState.selectCell(rIdx, cIdx, e.shiftKey);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function handleCellDblClick(rIdx: number, cIdx: number) {
|
|
45
|
+
if (readOnly) return;
|
|
46
|
+
const col = sheetState.document.columns[cIdx];
|
|
47
|
+
if (col?.readOnly) return;
|
|
48
|
+
sheetState.startEditing(rIdx, cIdx);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function handleKeyDown(e: KeyboardEvent) {
|
|
52
|
+
if (sheetState.editingCell) {
|
|
53
|
+
if (e.key === 'Enter') {
|
|
54
|
+
e.preventDefault();
|
|
55
|
+
sheetState.commitEditing();
|
|
56
|
+
sheetState.moveCursor('down');
|
|
57
|
+
} else if (e.key === 'Escape') {
|
|
58
|
+
e.preventDefault();
|
|
59
|
+
sheetState.cancelEditing();
|
|
60
|
+
} else if (e.key === 'Tab') {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
sheetState.commitEditing();
|
|
63
|
+
sheetState.moveCursor(e.shiftKey ? 'left' : 'right');
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!sheetState.activeCell) return;
|
|
69
|
+
|
|
70
|
+
if (e.key === 'ArrowUp') {
|
|
71
|
+
e.preventDefault();
|
|
72
|
+
sheetState.moveCursor('up', e.shiftKey);
|
|
73
|
+
} else if (e.key === 'ArrowDown') {
|
|
74
|
+
e.preventDefault();
|
|
75
|
+
sheetState.moveCursor('down', e.shiftKey);
|
|
76
|
+
} else if (e.key === 'ArrowLeft') {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
sheetState.moveCursor('left', e.shiftKey);
|
|
79
|
+
} else if (e.key === 'ArrowRight') {
|
|
80
|
+
e.preventDefault();
|
|
81
|
+
sheetState.moveCursor('right', e.shiftKey);
|
|
82
|
+
} else if (e.key === 'Tab') {
|
|
83
|
+
e.preventDefault();
|
|
84
|
+
sheetState.moveCursor(e.shiftKey ? 'left' : 'right');
|
|
85
|
+
} else if (e.key === 'Enter') {
|
|
86
|
+
e.preventDefault();
|
|
87
|
+
const col = sheetState.document.columns[sheetState.activeCell.col];
|
|
88
|
+
if (!readOnly && !col?.readOnly) {
|
|
89
|
+
sheetState.startEditing();
|
|
90
|
+
}
|
|
91
|
+
} else if (e.key === 'Backspace' || e.key === 'Delete') {
|
|
92
|
+
if (readOnly) return;
|
|
93
|
+
const row = sheetState.document.rows[sheetState.activeCell.row];
|
|
94
|
+
const col = sheetState.document.columns[sheetState.activeCell.col];
|
|
95
|
+
if (row && col && !col.readOnly) {
|
|
96
|
+
e.preventDefault();
|
|
97
|
+
sheetState.setCellValue(row.id, col.id, '');
|
|
98
|
+
}
|
|
99
|
+
} else if ((e.metaKey || e.ctrlKey) && e.key === 'z') {
|
|
100
|
+
e.preventDefault();
|
|
101
|
+
if (e.shiftKey) {
|
|
102
|
+
sheetState.redo();
|
|
103
|
+
} else {
|
|
104
|
+
sheetState.undo();
|
|
105
|
+
}
|
|
106
|
+
} else if ((e.metaKey || e.ctrlKey) && e.key === 'c') {
|
|
107
|
+
e.preventDefault();
|
|
108
|
+
const tsv = sheetState.exportToTsv();
|
|
109
|
+
navigator.clipboard?.writeText(tsv);
|
|
110
|
+
} else if (!readOnly && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
|
|
111
|
+
// Direct typing into cell starts editing
|
|
112
|
+
const col = sheetState.document.columns[sheetState.activeCell.col];
|
|
113
|
+
if (!col?.readOnly) {
|
|
114
|
+
sheetState.startEditing(sheetState.activeCell.row, sheetState.activeCell.col, e.key);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function handleResizeStart(colId: string, width: number, e: MouseEvent) {
|
|
120
|
+
e.preventDefault();
|
|
121
|
+
e.stopPropagation();
|
|
122
|
+
resizingColId = colId;
|
|
123
|
+
resizeStartX = e.clientX;
|
|
124
|
+
resizeStartWidth = width;
|
|
125
|
+
|
|
126
|
+
const handleMouseMove = (moveEvent: MouseEvent) => {
|
|
127
|
+
if (!resizingColId) return;
|
|
128
|
+
const delta = moveEvent.clientX - resizeStartX;
|
|
129
|
+
sheetState.setColumnWidth(resizingColId, Math.max(60, resizeStartWidth + delta));
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
const handleMouseUp = () => {
|
|
133
|
+
resizingColId = null;
|
|
134
|
+
window.removeEventListener('mousemove', handleMouseMove);
|
|
135
|
+
window.removeEventListener('mouseup', handleMouseUp);
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
window.addEventListener('mousemove', handleMouseMove);
|
|
139
|
+
window.addEventListener('mouseup', handleMouseUp);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function isCellSelected(rIdx: number, cIdx: number): boolean {
|
|
143
|
+
if (!sheetState.selectedRange) return false;
|
|
144
|
+
const minR = Math.min(sheetState.selectedRange.startRow, sheetState.selectedRange.endRow);
|
|
145
|
+
const maxR = Math.max(sheetState.selectedRange.startRow, sheetState.selectedRange.endRow);
|
|
146
|
+
const minC = Math.min(sheetState.selectedRange.startCol, sheetState.selectedRange.endCol);
|
|
147
|
+
const maxC = Math.max(sheetState.selectedRange.startCol, sheetState.selectedRange.endCol);
|
|
148
|
+
return rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function isActiveCell(rIdx: number, cIdx: number): boolean {
|
|
152
|
+
return sheetState.activeCell?.row === rIdx && sheetState.activeCell?.col === cIdx;
|
|
153
|
+
}
|
|
154
|
+
</script>
|
|
155
|
+
|
|
156
|
+
<div
|
|
157
|
+
bind:this={gridContainer}
|
|
158
|
+
class="flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs"
|
|
159
|
+
tabindex="0"
|
|
160
|
+
onkeydown={handleKeyDown}
|
|
161
|
+
role="grid"
|
|
162
|
+
aria-label="Spreadsheet"
|
|
163
|
+
>
|
|
164
|
+
<!-- Formula Bar -->
|
|
165
|
+
<FormulaBar
|
|
166
|
+
activeCoord={sheetState.activeCell}
|
|
167
|
+
value={sheetState.editingCell ? sheetState.draftValue : activeRawValue}
|
|
168
|
+
onChange={(val) => {
|
|
169
|
+
if (sheetState.activeCell) {
|
|
170
|
+
sheetState.draftValue = val;
|
|
171
|
+
}
|
|
172
|
+
}}
|
|
173
|
+
onCommit={(val) => {
|
|
174
|
+
if (sheetState.activeCell) {
|
|
175
|
+
const row = sheetState.document.rows[sheetState.activeCell.row];
|
|
176
|
+
const col = sheetState.document.columns[sheetState.activeCell.col];
|
|
177
|
+
if (row && col) {
|
|
178
|
+
sheetState.setCellValue(row.id, col.id, val);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}}
|
|
182
|
+
onCancel={() => {
|
|
183
|
+
sheetState.cancelEditing();
|
|
184
|
+
}}
|
|
185
|
+
/>
|
|
186
|
+
|
|
187
|
+
<!-- Main Scrollable Grid -->
|
|
188
|
+
<div class="relative flex-1 overflow-auto">
|
|
189
|
+
<table class="border-collapse table-fixed w-max min-w-full">
|
|
190
|
+
<!-- Table Header Columns -->
|
|
191
|
+
<thead>
|
|
192
|
+
<tr class="h-7 bg-muted/60 sticky top-0 z-20 border-b border-border shadow-xs">
|
|
193
|
+
<!-- Top Left Corner Cell -->
|
|
194
|
+
<th class="w-12 min-w-[3rem] sticky left-0 z-30 bg-muted/90 border-r border-border text-center text-[10px] text-muted-foreground font-medium">
|
|
195
|
+
#
|
|
196
|
+
</th>
|
|
197
|
+
{#each sheetState.document.columns as col, cIdx (col.id)}
|
|
198
|
+
<th
|
|
199
|
+
class="relative border-r border-border px-2 text-left font-medium text-muted-foreground hover:bg-muted/90 transition-colors group cursor-pointer"
|
|
200
|
+
style="width: {col.width || 130}px; min-width: {col.width || 130}px; max-width: {col.width || 130}px;"
|
|
201
|
+
onclick={() => onColumnHeaderClick?.(col)}
|
|
202
|
+
>
|
|
203
|
+
<div class="flex items-center justify-between gap-1 truncate">
|
|
204
|
+
<span class="truncate font-semibold text-foreground text-xs">{col.title}</span>
|
|
205
|
+
<span class="text-[10px] text-muted-foreground/70 font-mono font-normal">({col.key})</span>
|
|
206
|
+
</div>
|
|
207
|
+
<!-- Column Resize Handle -->
|
|
208
|
+
<div
|
|
209
|
+
class="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-primary/50 group-hover:bg-primary/20 z-10"
|
|
210
|
+
onmousedown={(e) => handleResizeStart(col.id, col.width || 130, e)}
|
|
211
|
+
role="separator"
|
|
212
|
+
aria-orientation="vertical"
|
|
213
|
+
></div>
|
|
214
|
+
</th>
|
|
215
|
+
{/each}
|
|
216
|
+
{#if onAddColumnClick}
|
|
217
|
+
<th class="w-10 min-w-[2.5rem] px-1 text-center bg-muted/40 hover:bg-muted cursor-pointer transition-colors" onclick={onAddColumnClick} title="Add Column">
|
|
218
|
+
<span class="text-xs font-bold text-muted-foreground">+</span>
|
|
219
|
+
</th>
|
|
220
|
+
{/if}
|
|
221
|
+
</tr>
|
|
222
|
+
</thead>
|
|
223
|
+
|
|
224
|
+
<!-- Table Body Rows -->
|
|
225
|
+
<tbody>
|
|
226
|
+
{#each sheetState.document.rows as row, rIdx (row.id)}
|
|
227
|
+
<tr class="border-b border-border hover:bg-muted/10 transition-colors" style="height: {row.height || 32}px;">
|
|
228
|
+
<!-- Row Header Index -->
|
|
229
|
+
<td class="w-12 min-w-[3rem] sticky left-0 z-10 bg-muted/50 border-r border-border text-center text-[10px] text-muted-foreground font-mono select-none">
|
|
230
|
+
{rIdx + 1}
|
|
231
|
+
</td>
|
|
232
|
+
|
|
233
|
+
<!-- Cells -->
|
|
234
|
+
{#each sheetState.document.columns as col, cIdx (col.id)}
|
|
235
|
+
{@const cell = sheetState.getCell(row.id, col.id)}
|
|
236
|
+
{@const selected = isCellSelected(rIdx, cIdx)}
|
|
237
|
+
{@const active = isActiveCell(rIdx, cIdx)}
|
|
238
|
+
{@const isEditing = sheetState.editingCell?.row === rIdx && sheetState.editingCell?.col === cIdx}
|
|
239
|
+
|
|
240
|
+
<td
|
|
241
|
+
class="relative border-r border-border px-2 py-1 truncate text-foreground transition-all {selected ? 'bg-primary/10' : ''} {active ? 'ring-2 ring-primary ring-inset z-10' : ''}"
|
|
242
|
+
style="width: {col.width || 130}px; min-width: {col.width || 130}px; max-width: {col.width || 130}px;"
|
|
243
|
+
onclick={(e) => handleCellClick(rIdx, cIdx, e)}
|
|
244
|
+
ondblclick={() => handleCellDblClick(rIdx, cIdx)}
|
|
245
|
+
>
|
|
246
|
+
{#if isEditing}
|
|
247
|
+
<input
|
|
248
|
+
type="text"
|
|
249
|
+
class="absolute inset-0 w-full h-full px-2 py-1 bg-background text-foreground outline-none font-sans text-xs border-2 border-primary z-20"
|
|
250
|
+
bind:value={sheetState.draftValue}
|
|
251
|
+
onblur={() => sheetState.commitEditing()}
|
|
252
|
+
|
|
253
|
+
/>
|
|
254
|
+
{:else if customCellRenderer}
|
|
255
|
+
{@render customCellRenderer({ row, col, cell })}
|
|
256
|
+
{:else}
|
|
257
|
+
<span class="truncate block {cell.error ? 'text-destructive font-semibold' : ''}">
|
|
258
|
+
{cell.error || (cell.value ?? '')}
|
|
259
|
+
</span>
|
|
260
|
+
{/if}
|
|
261
|
+
</td>
|
|
262
|
+
{/each}
|
|
263
|
+
{#if onAddColumnClick}
|
|
264
|
+
<td class="w-10 min-w-[2.5rem] bg-muted/10 border-r border-border"></td>
|
|
265
|
+
{/if}
|
|
266
|
+
</tr>
|
|
267
|
+
{/each}
|
|
268
|
+
</tbody>
|
|
269
|
+
</table>
|
|
270
|
+
</div>
|
|
271
|
+
</div>
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SpreadsheetController,
|
|
3
|
+
type SpreadsheetControllerOptions,
|
|
4
|
+
type SpreadsheetDocument,
|
|
5
|
+
type CellCoordinate,
|
|
6
|
+
type CellRange,
|
|
7
|
+
type CellData,
|
|
8
|
+
type SpreadsheetColumn,
|
|
9
|
+
type SpreadsheetRow,
|
|
10
|
+
type SpreadsheetDataSource
|
|
11
|
+
} from '@pixerate/editor';
|
|
12
|
+
|
|
13
|
+
export function createReactiveSpreadsheet(options: SpreadsheetControllerOptions = {}) {
|
|
14
|
+
let doc = $state<SpreadsheetDocument>({
|
|
15
|
+
id: options.document?.id || `sheet_${Date.now()}`,
|
|
16
|
+
name: options.document?.name || 'Sheet 1',
|
|
17
|
+
columns: options.document?.columns || [],
|
|
18
|
+
rows: options.document?.rows || [],
|
|
19
|
+
cells: options.document?.cells || {},
|
|
20
|
+
createdAt: options.document?.createdAt || Date.now(),
|
|
21
|
+
updatedAt: options.document?.updatedAt || Date.now()
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
let activeCell = $state<CellCoordinate | null>(null);
|
|
25
|
+
let selectedRange = $state<CellRange | null>(null);
|
|
26
|
+
let editingCell = $state<CellCoordinate | null>(null);
|
|
27
|
+
let draftValue = $state<string>('');
|
|
28
|
+
|
|
29
|
+
const controller = new SpreadsheetController({
|
|
30
|
+
...options,
|
|
31
|
+
document: options.document,
|
|
32
|
+
onDocumentChange: (updated) => {
|
|
33
|
+
doc = { ...updated };
|
|
34
|
+
options.onDocumentChange?.(updated);
|
|
35
|
+
},
|
|
36
|
+
onSelectionChange: (active, range) => {
|
|
37
|
+
activeCell = active;
|
|
38
|
+
selectedRange = range;
|
|
39
|
+
options.onSelectionChange?.(active, range);
|
|
40
|
+
},
|
|
41
|
+
onCellCommit: (rowId, colId, raw, value) => {
|
|
42
|
+
options.onCellCommit?.(rowId, colId, raw, value);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Keep initial states aligned
|
|
47
|
+
doc = { ...controller.document };
|
|
48
|
+
activeCell = controller.activeCell;
|
|
49
|
+
selectedRange = controller.selectedRange;
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
get document() {
|
|
53
|
+
return doc;
|
|
54
|
+
},
|
|
55
|
+
get activeCell() {
|
|
56
|
+
return activeCell;
|
|
57
|
+
},
|
|
58
|
+
get selectedRange() {
|
|
59
|
+
return selectedRange;
|
|
60
|
+
},
|
|
61
|
+
get editingCell() {
|
|
62
|
+
return editingCell;
|
|
63
|
+
},
|
|
64
|
+
get draftValue() {
|
|
65
|
+
return draftValue;
|
|
66
|
+
},
|
|
67
|
+
set draftValue(val: string) {
|
|
68
|
+
draftValue = val;
|
|
69
|
+
controller.draftValue = val;
|
|
70
|
+
},
|
|
71
|
+
controller,
|
|
72
|
+
|
|
73
|
+
getCell(rowId: string, colId: string): CellData {
|
|
74
|
+
return controller.getCell(rowId, colId);
|
|
75
|
+
},
|
|
76
|
+
setCellValue(rowId: string, colId: string, raw: string) {
|
|
77
|
+
controller.setCellValue(rowId, colId, raw);
|
|
78
|
+
doc = { ...controller.document };
|
|
79
|
+
},
|
|
80
|
+
selectCell(row: number, col: number, extendSelection = false) {
|
|
81
|
+
controller.selectCell(row, col, extendSelection);
|
|
82
|
+
activeCell = controller.activeCell;
|
|
83
|
+
selectedRange = controller.selectedRange;
|
|
84
|
+
},
|
|
85
|
+
selectRange(range: CellRange) {
|
|
86
|
+
controller.selectRange(range);
|
|
87
|
+
selectedRange = controller.selectedRange;
|
|
88
|
+
},
|
|
89
|
+
startEditing(row?: number, col?: number, initialVal?: string) {
|
|
90
|
+
controller.startEditing(row, col, initialVal);
|
|
91
|
+
activeCell = controller.activeCell;
|
|
92
|
+
editingCell = controller.editingCell;
|
|
93
|
+
draftValue = controller.draftValue;
|
|
94
|
+
},
|
|
95
|
+
commitEditing(val?: string) {
|
|
96
|
+
controller.commitEditing(val);
|
|
97
|
+
editingCell = null;
|
|
98
|
+
draftValue = '';
|
|
99
|
+
doc = { ...controller.document };
|
|
100
|
+
},
|
|
101
|
+
cancelEditing() {
|
|
102
|
+
controller.cancelEditing();
|
|
103
|
+
editingCell = null;
|
|
104
|
+
draftValue = '';
|
|
105
|
+
},
|
|
106
|
+
moveCursor(dir: 'up' | 'down' | 'left' | 'right', extend = false) {
|
|
107
|
+
controller.moveCursor(dir, extend);
|
|
108
|
+
activeCell = controller.activeCell;
|
|
109
|
+
selectedRange = controller.selectedRange;
|
|
110
|
+
},
|
|
111
|
+
insertColumn(index: number, config?: Partial<SpreadsheetColumn>) {
|
|
112
|
+
controller.insertColumn(index, config);
|
|
113
|
+
doc = { ...controller.document };
|
|
114
|
+
},
|
|
115
|
+
deleteColumn(colId: string) {
|
|
116
|
+
controller.deleteColumn(colId);
|
|
117
|
+
doc = { ...controller.document };
|
|
118
|
+
},
|
|
119
|
+
insertRow(index: number, config?: Partial<SpreadsheetRow>) {
|
|
120
|
+
controller.insertRow(index, config);
|
|
121
|
+
doc = { ...controller.document };
|
|
122
|
+
},
|
|
123
|
+
deleteRow(rowId: string) {
|
|
124
|
+
controller.deleteRow(rowId);
|
|
125
|
+
doc = { ...controller.document };
|
|
126
|
+
},
|
|
127
|
+
setColumnWidth(colId: string, width: number) {
|
|
128
|
+
controller.setColumnWidth(colId, width);
|
|
129
|
+
doc = { ...controller.document };
|
|
130
|
+
},
|
|
131
|
+
registerDataSource(ds: SpreadsheetDataSource) {
|
|
132
|
+
controller.registerDataSource(ds);
|
|
133
|
+
doc = { ...controller.document };
|
|
134
|
+
},
|
|
135
|
+
setPrimaryDataSource(id: string | undefined) {
|
|
136
|
+
controller.setPrimaryDataSource(id);
|
|
137
|
+
doc = { ...controller.document };
|
|
138
|
+
},
|
|
139
|
+
recalculateAll() {
|
|
140
|
+
controller.recalculateAll();
|
|
141
|
+
doc = { ...controller.document };
|
|
142
|
+
},
|
|
143
|
+
exportToTsv() {
|
|
144
|
+
return controller.exportToTsv();
|
|
145
|
+
},
|
|
146
|
+
importFromTsv(data: string) {
|
|
147
|
+
controller.importFromTsv(data);
|
|
148
|
+
doc = { ...controller.document };
|
|
149
|
+
},
|
|
150
|
+
undo() {
|
|
151
|
+
controller.undo();
|
|
152
|
+
doc = { ...controller.document };
|
|
153
|
+
},
|
|
154
|
+
redo() {
|
|
155
|
+
controller.redo();
|
|
156
|
+
doc = { ...controller.document };
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
}
|