@pixerate/editor-svelte 0.2.4 → 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 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
@@ -99,21 +99,30 @@ function EditableTextNodeEditor($$anchor, $$props) {
99
99
  // src/BubbleMenu.svelte
100
100
  import "svelte/internal/disclose-version";
101
101
  import * as $3 from "svelte/internal/client";
102
- import BubbleMenuPlugin from "@tiptap/extension-bubble-menu";
103
- import { onMount as onMount2, onDestroy as onDestroy2 } from "svelte";
104
- var root2 = $3.from_html(`<div><!></div>`);
102
+ import { BubbleMenuPlugin } from "@tiptap/extension-bubble-menu";
103
+ var root2 = $3.from_html(`<div style="visibility: hidden;"><!></div>`);
105
104
  function BubbleMenu($$anchor, $$props) {
106
105
  $3.push($$props, true);
107
- let className = $3.prop($$props, "class", 3, "flex items-center gap-1 bg-white border border-gray-200 shadow-md rounded-md p-1");
106
+ let className = $3.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"), pluginKey = $3.prop($$props, "pluginKey", 3, "bubbleMenu"), shouldShow = $3.prop($$props, "shouldShow", 3, null), updateDelay = $3.prop($$props, "updateDelay", 3, 250), tippyOptions = $3.prop($$props, "tippyOptions", 19, () => ({}));
108
107
  let menuElement = $3.state(void 0);
109
- onMount2(() => {
108
+ $3.user_effect(() => {
110
109
  if ($$props.editor && $3.get(menuElement)) {
111
- $$props.editor.registerPlugin(BubbleMenuPlugin.configure({ element: $3.get(menuElement), tippyOptions: { duration: 100 } }));
112
- }
113
- });
114
- onDestroy2(() => {
115
- if ($$props.editor) {
116
- $$props.editor.unregisterPlugin("bubbleMenu");
110
+ const plugin = BubbleMenuPlugin({
111
+ pluginKey: pluginKey(),
112
+ editor: $$props.editor,
113
+ element: $3.get(menuElement),
114
+ tippyOptions: {
115
+ duration: 100,
116
+ appendTo: () => document.body,
117
+ ...tippyOptions()
118
+ },
119
+ shouldShow: shouldShow(),
120
+ updateDelay: updateDelay()
121
+ });
122
+ $$props.editor.registerPlugin(plugin);
123
+ return () => {
124
+ $$props.editor.unregisterPlugin(pluginKey());
125
+ };
117
126
  }
118
127
  });
119
128
  var div = root2();
@@ -208,6 +217,477 @@ function TemplateRenderer($$anchor, $$props) {
208
217
  }
209
218
  $4.delegate(["click"]);
210
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
+
211
691
  // src/index.ts
212
692
  var EditableTextNodeEditor2 = EditableTextNodeEditor;
213
693
  var BubbleMenu2 = BubbleMenu;
@@ -215,8 +695,11 @@ var TemplateRenderer2 = TemplateRenderer;
215
695
  export {
216
696
  BubbleMenu2 as BubbleMenu,
217
697
  EditableTextNodeEditor2 as EditableTextNodeEditor,
698
+ FormulaBar,
699
+ SpreadsheetEditor,
218
700
  TemplateRenderer2 as TemplateRenderer,
219
701
  createReactiveEditor,
702
+ createReactiveSpreadsheet,
220
703
  initiateEditor
221
704
  };
222
705
  //# sourceMappingURL=index.js.map