@pixerate/editor-svelte 0.2.5 → 0.3.1

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 CHANGED
@@ -78,3 +78,66 @@ 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
+ readOnly?: boolean;
98
+ showFormulaBar?: boolean;
99
+ class?: string;
100
+ customCellRenderer?:
101
+ | ((cell: CellData, col: SpreadsheetColumn, row: SpreadsheetRow) => any)
102
+ | ((args: { cell: CellData; col: SpreadsheetColumn; row: SpreadsheetRow }) => any)
103
+ | ((args: { row: SpreadsheetRow; col: SpreadsheetColumn; cell: CellData }) => any);
104
+ onAddColumnClick?: () => void;
105
+ onColumnHeaderClick?: (col: SpreadsheetColumn) => void;
106
+ }
107
+
108
+ export interface FormulaBarProps {
109
+ sheetState: ReturnType<typeof createReactiveSpreadsheet>;
110
+ class?: string;
111
+ }
112
+
113
+ export declare const SpreadsheetEditor: Component<SpreadsheetEditorProps>;
114
+ export declare const FormulaBar: Component<FormulaBarProps>;
115
+
116
+ export declare function createReactiveSpreadsheet(options?: SpreadsheetControllerOptions): {
117
+ readonly document: SpreadsheetDocument;
118
+ readonly activeCell: CellCoordinate | null;
119
+ readonly selectedRange: CellRange | null;
120
+ readonly editingCell: CellCoordinate | null;
121
+ draftValue: string;
122
+ controller: SpreadsheetController;
123
+ getCell(rowId: string, colId: string): CellData;
124
+ setCellValue(rowId: string, colId: string, raw: string): void;
125
+ selectCell(row: number, col: number, extendSelection?: boolean): void;
126
+ selectRange(range: CellRange): void;
127
+ startEditing(row?: number, col?: number, initialVal?: string): void;
128
+ commitEditing(val?: string): void;
129
+ cancelEditing(): void;
130
+ moveCursor(dir: 'up' | 'down' | 'left' | 'right', extend?: boolean): void;
131
+ insertColumn(index: number, config?: Partial<SpreadsheetColumn>): void;
132
+ deleteColumn(colId: string): void;
133
+ insertRow(index: number, config?: Partial<SpreadsheetRow>): void;
134
+ deleteRow(rowId: string): void;
135
+ setColumnWidth(colId: string, width: number): void;
136
+ registerDataSource(ds: SpreadsheetDataSource): void;
137
+ setPrimaryDataSource(id: string | undefined): void;
138
+ recalculateAll(): void;
139
+ exportToTsv(): string;
140
+ importFromTsv(data: string): void;
141
+ undo(): void;
142
+ redo(): void;
143
+ };
package/dist/index.js CHANGED
@@ -217,6 +217,489 @@ 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><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 sheetState = $5.prop($$props, "sheetState", 7), activeCoord = $5.prop($$props, "activeCoord", 3, null), value = $5.prop($$props, "value", 15, ""), className = $5.prop($$props, "class", 3, "");
233
+ let effectiveCoord = $5.derived(() => {
234
+ if (sheetState()) return sheetState().activeCell;
235
+ return activeCoord();
236
+ });
237
+ let coordLabel = $5.derived(() => {
238
+ if (!$5.get(effectiveCoord)) return "--";
239
+ const colName = indexToColName($5.get(effectiveCoord).col);
240
+ return `${colName}${$5.get(effectiveCoord).row + 1}`;
241
+ });
242
+ let effectiveValue = $5.derived(() => {
243
+ if (sheetState()) {
244
+ if (sheetState().editingCell) return sheetState().draftValue;
245
+ if (!sheetState().activeCell) return "";
246
+ const row = sheetState().document.rows[sheetState().activeCell.row];
247
+ const col = sheetState().document.columns[sheetState().activeCell.col];
248
+ if (!row || !col) return "";
249
+ return sheetState().getCell(row.id, col.id).raw || "";
250
+ }
251
+ return value();
252
+ });
253
+ function handleKeyDown(e) {
254
+ if (e.key === "Enter") {
255
+ e.preventDefault();
256
+ if (sheetState() && sheetState().activeCell) {
257
+ const row = sheetState().document.rows[sheetState().activeCell.row];
258
+ const col = sheetState().document.columns[sheetState().activeCell.col];
259
+ if (row && col) {
260
+ sheetState().setCellValue(row.id, col.id, $5.get(effectiveValue));
261
+ }
262
+ sheetState().commitEditing();
263
+ }
264
+ $$props.onCommit?.($5.get(effectiveValue));
265
+ } else if (e.key === "Escape") {
266
+ e.preventDefault();
267
+ if (sheetState()) {
268
+ sheetState().cancelEditing();
269
+ }
270
+ $$props.onCancel?.();
271
+ }
272
+ }
273
+ function handleInput(e) {
274
+ const target = e.target;
275
+ if (sheetState()) {
276
+ sheetState().draftValue = target.value;
277
+ if (sheetState().activeCell && !sheetState().editingCell) {
278
+ sheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, target.value);
279
+ }
280
+ } else {
281
+ value(target.value);
282
+ }
283
+ $$props.onChange?.(target.value);
284
+ }
285
+ var div = root4();
286
+ var div_1 = $5.child(div);
287
+ var text = $5.only_child(div_1, true);
288
+ var input = $5.sibling(div_1, 4);
289
+ $5.remove_input_defaults(input);
290
+ $5.reset(div);
291
+ $5.template_effect(() => {
292
+ $5.set_class(div, 1, `flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono ${className() ?? ""}`);
293
+ $5.set_text(text, $5.get(coordLabel));
294
+ $5.set_value(input, $5.get(effectiveValue));
295
+ });
296
+ $5.delegated("input", input, handleInput);
297
+ $5.delegated("keydown", input, handleKeyDown);
298
+ $5.append($$anchor, div);
299
+ $5.pop();
300
+ }
301
+ $5.delegate(["input", "keydown"]);
302
+
303
+ // src/spreadsheet/spreadsheet.svelte.ts
304
+ import * as $6 from "svelte/internal/client";
305
+ import { SpreadsheetController } from "@pixerate/editor";
306
+ function createReactiveSpreadsheet(options = {}) {
307
+ let doc = $6.state($6.proxy({
308
+ id: options.document?.id || `sheet_${Date.now()}`,
309
+ name: options.document?.name || "Sheet 1",
310
+ columns: options.document?.columns || [],
311
+ rows: options.document?.rows || [],
312
+ cells: options.document?.cells || {},
313
+ createdAt: options.document?.createdAt || Date.now(),
314
+ updatedAt: options.document?.updatedAt || Date.now()
315
+ }));
316
+ let activeCell = $6.state(null);
317
+ let selectedRange = $6.state(null);
318
+ let editingCell = $6.state(null);
319
+ let draftValue = $6.state("");
320
+ const controller = new SpreadsheetController({
321
+ ...options,
322
+ document: options.document,
323
+ onDocumentChange: (updated) => {
324
+ $6.set(doc, { ...updated }, true);
325
+ options.onDocumentChange?.(updated);
326
+ },
327
+ onSelectionChange: (active, range) => {
328
+ $6.set(activeCell, active, true);
329
+ $6.set(selectedRange, range, true);
330
+ options.onSelectionChange?.(active, range);
331
+ },
332
+ onCellCommit: (rowId, colId, raw, value) => {
333
+ options.onCellCommit?.(rowId, colId, raw, value);
334
+ }
335
+ });
336
+ $6.set(doc, { ...controller.document }, true);
337
+ $6.set(activeCell, controller.activeCell, true);
338
+ $6.set(selectedRange, controller.selectedRange, true);
339
+ return {
340
+ get document() {
341
+ return $6.get(doc);
342
+ },
343
+ get activeCell() {
344
+ return $6.get(activeCell);
345
+ },
346
+ get selectedRange() {
347
+ return $6.get(selectedRange);
348
+ },
349
+ get editingCell() {
350
+ return $6.get(editingCell);
351
+ },
352
+ get draftValue() {
353
+ return $6.get(draftValue);
354
+ },
355
+ set draftValue(val) {
356
+ $6.set(draftValue, val, true);
357
+ controller.draftValue = val;
358
+ },
359
+ controller,
360
+ getCell(rowId, colId) {
361
+ return controller.getCell(rowId, colId);
362
+ },
363
+ setCellValue(rowId, colId, raw) {
364
+ controller.setCellValue(rowId, colId, raw);
365
+ $6.set(doc, { ...controller.document }, true);
366
+ },
367
+ selectCell(row, col, extendSelection = false) {
368
+ controller.selectCell(row, col, extendSelection);
369
+ $6.set(activeCell, controller.activeCell, true);
370
+ $6.set(selectedRange, controller.selectedRange, true);
371
+ },
372
+ selectRange(range) {
373
+ controller.selectRange(range);
374
+ $6.set(selectedRange, controller.selectedRange, true);
375
+ },
376
+ startEditing(row, col, initialVal) {
377
+ controller.startEditing(row, col, initialVal);
378
+ $6.set(activeCell, controller.activeCell, true);
379
+ $6.set(editingCell, controller.editingCell, true);
380
+ $6.set(draftValue, controller.draftValue, true);
381
+ },
382
+ commitEditing(val) {
383
+ controller.commitEditing(val);
384
+ $6.set(editingCell, null);
385
+ $6.set(draftValue, "");
386
+ $6.set(doc, { ...controller.document }, true);
387
+ },
388
+ cancelEditing() {
389
+ controller.cancelEditing();
390
+ $6.set(editingCell, null);
391
+ $6.set(draftValue, "");
392
+ },
393
+ moveCursor(dir, extend = false) {
394
+ controller.moveCursor(dir, extend);
395
+ $6.set(activeCell, controller.activeCell, true);
396
+ $6.set(selectedRange, controller.selectedRange, true);
397
+ },
398
+ insertColumn(index2, config) {
399
+ controller.insertColumn(index2, config);
400
+ $6.set(doc, { ...controller.document }, true);
401
+ },
402
+ deleteColumn(colId) {
403
+ controller.deleteColumn(colId);
404
+ $6.set(doc, { ...controller.document }, true);
405
+ },
406
+ insertRow(index2, config) {
407
+ controller.insertRow(index2, config);
408
+ $6.set(doc, { ...controller.document }, true);
409
+ },
410
+ deleteRow(rowId) {
411
+ controller.deleteRow(rowId);
412
+ $6.set(doc, { ...controller.document }, true);
413
+ },
414
+ setColumnWidth(colId, width) {
415
+ controller.setColumnWidth(colId, width);
416
+ $6.set(doc, { ...controller.document }, true);
417
+ },
418
+ registerDataSource(ds) {
419
+ controller.registerDataSource(ds);
420
+ $6.set(doc, { ...controller.document }, true);
421
+ },
422
+ setPrimaryDataSource(id) {
423
+ controller.setPrimaryDataSource(id);
424
+ $6.set(doc, { ...controller.document }, true);
425
+ },
426
+ recalculateAll() {
427
+ controller.recalculateAll();
428
+ $6.set(doc, { ...controller.document }, true);
429
+ },
430
+ exportToTsv() {
431
+ return controller.exportToTsv();
432
+ },
433
+ importFromTsv(data) {
434
+ controller.importFromTsv(data);
435
+ $6.set(doc, { ...controller.document }, true);
436
+ },
437
+ undo() {
438
+ controller.undo();
439
+ $6.set(doc, { ...controller.document }, true);
440
+ },
441
+ redo() {
442
+ controller.redo();
443
+ $6.set(doc, { ...controller.document }, true);
444
+ }
445
+ };
446
+ }
447
+
448
+ // src/spreadsheet/SpreadsheetEditor.svelte
449
+ 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" tabindex="-1"></div></th>`);
450
+ 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>`);
451
+ 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"/>`);
452
+ var root_32 = $7.from_html(`<span> </span>`);
453
+ var root_42 = $7.from_html(`<td><!></td>`);
454
+ var root_5 = $7.from_html(`<td class="w-10 min-w-[2.5rem] bg-muted/10 border-r border-border"></td>`);
455
+ 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>`);
456
+ var root_7 = $7.from_html(`<div 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>`);
457
+ function SpreadsheetEditor($$anchor, $$props) {
458
+ $7.push($$props, true);
459
+ let sheetState = $7.prop($$props, "sheetState", 23, createReactiveSpreadsheet), readOnly = $7.prop($$props, "readOnly", 3, false), readonly = $7.prop($$props, "readonly", 3, false), showFormulaBar = $7.prop($$props, "showFormulaBar", 3, true), className = $7.prop($$props, "class", 3, "");
460
+ let isReadOnly = $7.derived(() => readOnly() || readonly());
461
+ let gridContainer = $7.state(null);
462
+ let resizingColId = $7.state(null);
463
+ let resizeStartX = $7.state(0);
464
+ let resizeStartWidth = $7.state(0);
465
+ function handleCellClick(rIdx, cIdx, e) {
466
+ if (sheetState().editingCell && (sheetState().editingCell.row !== rIdx || sheetState().editingCell.col !== cIdx)) {
467
+ sheetState().commitEditing();
468
+ }
469
+ sheetState().selectCell(rIdx, cIdx, e.shiftKey);
470
+ }
471
+ function handleCellDblClick(rIdx, cIdx) {
472
+ if ($7.get(isReadOnly)) return;
473
+ const col = sheetState().document.columns[cIdx];
474
+ if (col?.readOnly) return;
475
+ sheetState().startEditing(rIdx, cIdx);
476
+ }
477
+ function handleKeyDown(e) {
478
+ if (sheetState().editingCell) {
479
+ if (e.key === "Escape") {
480
+ sheetState().cancelEditing();
481
+ } else if (e.key === "Enter") {
482
+ sheetState().commitEditing();
483
+ sheetState().moveCursor("down");
484
+ } else if (e.key === "Tab") {
485
+ e.preventDefault();
486
+ sheetState().commitEditing();
487
+ sheetState().moveCursor(e.shiftKey ? "left" : "right");
488
+ }
489
+ return;
490
+ }
491
+ if (!sheetState().activeCell) return;
492
+ if (e.key === "ArrowUp") {
493
+ e.preventDefault();
494
+ sheetState().moveCursor("up", e.shiftKey);
495
+ } else if (e.key === "ArrowDown") {
496
+ e.preventDefault();
497
+ sheetState().moveCursor("down", e.shiftKey);
498
+ } else if (e.key === "ArrowLeft") {
499
+ e.preventDefault();
500
+ sheetState().moveCursor("left", e.shiftKey);
501
+ } else if (e.key === "ArrowRight") {
502
+ e.preventDefault();
503
+ sheetState().moveCursor("right", e.shiftKey);
504
+ } else if (e.key === "Tab") {
505
+ e.preventDefault();
506
+ sheetState().moveCursor(e.shiftKey ? "left" : "right");
507
+ } else if (e.key === "Enter") {
508
+ e.preventDefault();
509
+ const col = sheetState().document.columns[sheetState().activeCell.col];
510
+ if (!$7.get(isReadOnly) && !col?.readOnly) {
511
+ sheetState().startEditing();
512
+ }
513
+ } else if (e.key === "Backspace" || e.key === "Delete") {
514
+ if ($7.get(isReadOnly)) return;
515
+ const row = sheetState().document.rows[sheetState().activeCell.row];
516
+ const col = sheetState().document.columns[sheetState().activeCell.col];
517
+ if (row && col && !col.readOnly) {
518
+ e.preventDefault();
519
+ sheetState().setCellValue(row.id, col.id, "");
520
+ }
521
+ } else if ((e.metaKey || e.ctrlKey) && e.key === "z") {
522
+ e.preventDefault();
523
+ if (e.shiftKey) {
524
+ sheetState().redo();
525
+ } else {
526
+ sheetState().undo();
527
+ }
528
+ } else if ((e.metaKey || e.ctrlKey) && e.key === "c") {
529
+ e.preventDefault();
530
+ const tsv = sheetState().exportToTsv();
531
+ navigator.clipboard?.writeText(tsv);
532
+ } else if (!$7.get(isReadOnly) && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {
533
+ const col = sheetState().document.columns[sheetState().activeCell.col];
534
+ if (!col?.readOnly) {
535
+ sheetState().startEditing(sheetState().activeCell.row, sheetState().activeCell.col, e.key);
536
+ }
537
+ }
538
+ }
539
+ function handleResizeStart(colId, width, e) {
540
+ e.preventDefault();
541
+ e.stopPropagation();
542
+ $7.set(resizingColId, colId, true);
543
+ $7.set(resizeStartX, e.clientX, true);
544
+ $7.set(resizeStartWidth, width, true);
545
+ const handleMouseMove = (moveEvent) => {
546
+ if (!$7.get(resizingColId)) return;
547
+ const delta = moveEvent.clientX - $7.get(resizeStartX);
548
+ sheetState().setColumnWidth($7.get(resizingColId), Math.max(60, $7.get(resizeStartWidth) + delta));
549
+ };
550
+ const handleMouseUp = () => {
551
+ $7.set(resizingColId, null);
552
+ window.removeEventListener("mousemove", handleMouseMove);
553
+ window.removeEventListener("mouseup", handleMouseUp);
554
+ };
555
+ window.addEventListener("mousemove", handleMouseMove);
556
+ window.addEventListener("mouseup", handleMouseUp);
557
+ }
558
+ function isCellSelected(rIdx, cIdx) {
559
+ if (!sheetState().selectedRange) return false;
560
+ const minR = Math.min(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);
561
+ const maxR = Math.max(sheetState().selectedRange.startRow, sheetState().selectedRange.endRow);
562
+ const minC = Math.min(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);
563
+ const maxC = Math.max(sheetState().selectedRange.startCol, sheetState().selectedRange.endCol);
564
+ return rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;
565
+ }
566
+ function isActiveCell(rIdx, cIdx) {
567
+ return sheetState().activeCell?.row === rIdx && sheetState().activeCell?.col === cIdx;
568
+ }
569
+ var div = root_7();
570
+ var node = $7.child(div);
571
+ {
572
+ var consequent = ($$anchor2) => {
573
+ FormulaBar($$anchor2, {
574
+ get sheetState() {
575
+ return sheetState();
576
+ }
577
+ });
578
+ };
579
+ $7.if(node, ($$render) => {
580
+ if (showFormulaBar()) $$render(consequent);
581
+ });
582
+ }
583
+ var div_1 = $7.sibling(node, 2);
584
+ var table = $7.child(div_1);
585
+ var thead = $7.child(table);
586
+ var tr = $7.child(thead);
587
+ var node_1 = $7.sibling($7.child(tr));
588
+ $7.each(node_1, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor2, col) => {
589
+ var th = root5();
590
+ var div_2 = $7.child(th);
591
+ var span = $7.child(div_2);
592
+ var text = $7.only_child(span, true);
593
+ var span_1 = $7.sibling(span, 2);
594
+ var text_1 = $7.only_child(span_1);
595
+ $7.reset(div_2);
596
+ var div_3 = $7.sibling(div_2, 2);
597
+ $7.reset(th);
598
+ $7.template_effect(() => {
599
+ $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;`);
600
+ $7.set_text(text, $7.get(col).title);
601
+ $7.set_text(text_1, `(${$7.get(col).key ?? ""})`);
602
+ });
603
+ $7.delegated("click", th, () => $$props.onColumnHeaderClick?.($7.get(col)));
604
+ $7.delegated("mousedown", div_3, (e) => handleResizeStart($7.get(col).id, $7.get(col).width || 130, e));
605
+ $7.append($$anchor2, th);
606
+ });
607
+ var node_2 = $7.sibling(node_1);
608
+ {
609
+ var consequent_1 = ($$anchor2) => {
610
+ var th_1 = root_13();
611
+ $7.delegated("click", th_1, function(...$$args) {
612
+ $$props.onAddColumnClick?.apply(this, $$args);
613
+ });
614
+ $7.append($$anchor2, th_1);
615
+ };
616
+ $7.if(node_2, ($$render) => {
617
+ if ($$props.onAddColumnClick) $$render(consequent_1);
618
+ });
619
+ }
620
+ $7.reset(tr);
621
+ $7.reset(thead);
622
+ var tbody = $7.sibling(thead);
623
+ $7.each(tbody, 23, () => sheetState().document.rows, (row) => row.id, ($$anchor2, row, rIdx) => {
624
+ var tr_1 = root_6();
625
+ var td = $7.child(tr_1);
626
+ var text_2 = $7.only_child(td, true);
627
+ var node_3 = $7.sibling(td);
628
+ $7.each(node_3, 19, () => sheetState().document.columns, (col) => col.id, ($$anchor3, col, cIdx) => {
629
+ const cell = $7.derived(() => sheetState().getCell($7.get(row).id, $7.get(col).id));
630
+ const selected = $7.derived(() => isCellSelected($7.get(rIdx), $7.get(cIdx)));
631
+ const active = $7.derived(() => isActiveCell($7.get(rIdx), $7.get(cIdx)));
632
+ const isEditing = $7.derived(() => sheetState().editingCell?.row === $7.get(rIdx) && sheetState().editingCell?.col === $7.get(cIdx));
633
+ var td_1 = root_42();
634
+ var node_4 = $7.child(td_1);
635
+ {
636
+ var consequent_2 = ($$anchor4) => {
637
+ var input = root_22();
638
+ $7.remove_input_defaults(input);
639
+ $7.event("blur", input, () => sheetState().commitEditing());
640
+ $7.bind_value(input, () => sheetState().draftValue, ($$value) => sheetState().draftValue = $$value);
641
+ $7.append($$anchor4, input);
642
+ };
643
+ var consequent_3 = ($$anchor4) => {
644
+ const cellArg = $7.derived(() => Object.assign({ row: $7.get(row), col: $7.get(col), cell: $7.get(cell) }, $7.get(cell)));
645
+ var fragment_1 = $7.comment();
646
+ var node_5 = $7.first_child(fragment_1);
647
+ $7.snippet(node_5, () => $$props.customCellRenderer, () => $7.get(cellArg), () => $7.get(col), () => $7.get(row));
648
+ $7.append($$anchor4, fragment_1);
649
+ };
650
+ var alternate = ($$anchor4) => {
651
+ var span_2 = root_32();
652
+ var text_3 = $7.only_child(span_2, true);
653
+ $7.template_effect(() => {
654
+ $7.set_class(span_2, 1, `truncate block ${$7.get(cell).error ? "text-destructive font-semibold" : ""}`);
655
+ $7.set_text(text_3, $7.get(cell).error || ($7.get(cell).value ?? ""));
656
+ });
657
+ $7.append($$anchor4, span_2);
658
+ };
659
+ $7.if(node_4, ($$render) => {
660
+ if ($7.get(isEditing)) $$render(consequent_2);
661
+ else if ($$props.customCellRenderer) $$render(consequent_3, 1);
662
+ else $$render(alternate, -1);
663
+ });
664
+ }
665
+ $7.reset(td_1);
666
+ $7.template_effect(() => {
667
+ $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" : ""}`);
668
+ $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;`);
669
+ });
670
+ $7.delegated("click", td_1, (e) => handleCellClick($7.get(rIdx), $7.get(cIdx), e));
671
+ $7.delegated("dblclick", td_1, () => handleCellDblClick($7.get(rIdx), $7.get(cIdx)));
672
+ $7.append($$anchor3, td_1);
673
+ });
674
+ var node_6 = $7.sibling(node_3);
675
+ {
676
+ var consequent_4 = ($$anchor3) => {
677
+ var td_2 = root_5();
678
+ $7.append($$anchor3, td_2);
679
+ };
680
+ $7.if(node_6, ($$render) => {
681
+ if ($$props.onAddColumnClick) $$render(consequent_4);
682
+ });
683
+ }
684
+ $7.reset(tr_1);
685
+ $7.template_effect(() => {
686
+ $7.set_style(tr_1, `height: ${($7.get(row).height || 32) ?? ""}px;`);
687
+ $7.set_text(text_2, $7.get(rIdx) + 1);
688
+ });
689
+ $7.append($$anchor2, tr_1);
690
+ });
691
+ $7.reset(tbody);
692
+ $7.reset(table);
693
+ $7.reset(div_1);
694
+ $7.reset(div);
695
+ $7.bind_this(div, ($$value) => $7.set(gridContainer, $$value), () => $7.get(gridContainer));
696
+ $7.template_effect(() => $7.set_class(div, 1, `flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs ${className() ?? ""}`));
697
+ $7.delegated("keydown", div, handleKeyDown);
698
+ $7.append($$anchor, div);
699
+ $7.pop();
700
+ }
701
+ $7.delegate(["keydown", "click", "mousedown", "dblclick"]);
702
+
220
703
  // src/index.ts
221
704
  var EditableTextNodeEditor2 = EditableTextNodeEditor;
222
705
  var BubbleMenu2 = BubbleMenu;
@@ -224,8 +707,11 @@ var TemplateRenderer2 = TemplateRenderer;
224
707
  export {
225
708
  BubbleMenu2 as BubbleMenu,
226
709
  EditableTextNodeEditor2 as EditableTextNodeEditor,
710
+ FormulaBar,
711
+ SpreadsheetEditor,
227
712
  TemplateRenderer2 as TemplateRenderer,
228
713
  createReactiveEditor,
714
+ createReactiveSpreadsheet,
229
715
  initiateEditor
230
716
  };
231
717
  //# sourceMappingURL=index.js.map