@particle-academy/fancy-sheets 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Spreadsheet/Spreadsheet.context.ts","../src/types/sheet.ts","../src/engine/cell-utils.ts","../src/engine/formula/lexer.ts","../src/engine/formula/parser.ts","../src/engine/formula/functions/registry.ts","../src/engine/formula/functions/math.ts","../src/engine/formula/functions/text.ts","../src/engine/formula/functions/logic.ts","../src/engine/formula/evaluator.ts","../src/engine/formula/references.ts","../src/engine/formula/dependency-graph.ts","../src/hooks/use-spreadsheet-store.ts","../src/components/Grid/ColumnResizeHandle.tsx","../src/components/Grid/ColumnHeaders.tsx","../src/components/Grid/RowHeaders.tsx","../src/components/Grid/Cell.tsx","../src/components/Grid/CellEditor.tsx","../src/components/Grid/SelectionOverlay.tsx","../src/engine/clipboard.ts","../src/components/Grid/SpreadsheetGrid.tsx","../src/components/Toolbar/SpreadsheetToolbar.tsx","../src/components/SheetTabs/SpreadsheetSheetTabs.tsx","../src/components/Spreadsheet/Spreadsheet.tsx","../src/engine/csv.ts"],"names":["createContext","useContext","useReducer","useMemo","useRef","useCallback","jsx","jsxs","getCellDisplayValue","memo","Cell","cn","useEffect","Fragment","_","useState"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { SpreadsheetContextValue } from \"./Spreadsheet.types\";\n\nexport const SpreadsheetContext = createContext<SpreadsheetContextValue | null>(null);\n\nexport function useSpreadsheet(): SpreadsheetContextValue {\n const ctx = useContext(SpreadsheetContext);\n if (!ctx) {\n throw new Error(\"useSpreadsheet must be used within a <Spreadsheet> component\");\n }\n return ctx;\n}\n","import type { CellData } from \"./cell\";\n\n/** Sparse cell map — only stores cells that have data */\nexport type CellMap = Record<string, CellData>;\n\n/** Column width overrides (col index -> px) */\nexport type ColumnWidths = Record<number, number>;\n\n/** Merged region defined by top-left and bottom-right addresses */\nexport interface MergedRegion {\n start: string;\n end: string;\n}\n\n/** A single sheet within a workbook */\nexport interface SheetData {\n id: string;\n name: string;\n cells: CellMap;\n columnWidths: ColumnWidths;\n mergedRegions: MergedRegion[];\n columnFilters: Record<number, string>;\n sortColumn?: number;\n sortDirection?: \"asc\" | \"desc\";\n frozenRows: number;\n frozenCols: number;\n}\n\n/** The complete workbook */\nexport interface WorkbookData {\n sheets: SheetData[];\n activeSheetId: string;\n}\n\n/** Create an empty sheet */\nexport function createEmptySheet(id: string, name: string): SheetData {\n return {\n id,\n name,\n cells: {},\n columnWidths: {},\n mergedRegions: [],\n columnFilters: {},\n frozenRows: 0,\n frozenCols: 0,\n };\n}\n\n/** Create an empty workbook with one sheet */\nexport function createEmptyWorkbook(): WorkbookData {\n const sheet = createEmptySheet(\"sheet-1\", \"Sheet 1\");\n return {\n sheets: [sheet],\n activeSheetId: sheet.id,\n };\n}\n","/** Convert 0-based column index to letter(s): 0=\"A\", 25=\"Z\", 26=\"AA\" */\nexport function columnToLetter(col: number): string {\n let result = \"\";\n let c = col;\n while (c >= 0) {\n result = String.fromCharCode((c % 26) + 65) + result;\n c = Math.floor(c / 26) - 1;\n }\n return result;\n}\n\n/** Convert column letter(s) to 0-based index: \"A\"=0, \"Z\"=25, \"AA\"=26 */\nexport function letterToColumn(letters: string): number {\n let result = 0;\n for (let i = 0; i < letters.length; i++) {\n result = result * 26 + (letters.charCodeAt(i) - 64);\n }\n return result - 1;\n}\n\n/** Parse address string to 0-based row and col: \"B3\" -> { row: 2, col: 1 } */\nexport function parseAddress(addr: string): { row: number; col: number } {\n const match = addr.match(/^([A-Z]+)(\\d+)$/);\n if (!match) return { row: 0, col: 0 };\n return {\n col: letterToColumn(match[1]),\n row: parseInt(match[2], 10) - 1,\n };\n}\n\n/** Convert 0-based row and col to address string: (2, 1) -> \"B3\" */\nexport function toAddress(row: number, col: number): string {\n return columnToLetter(col) + (row + 1);\n}\n\n/** Check if a string is a valid cell address */\nexport function isValidAddress(addr: string): boolean {\n return /^[A-Z]+\\d+$/.test(addr);\n}\n\n/** Expand a range into an array of addresses */\nexport function expandRange(startAddr: string, endAddr: string): string[] {\n const s = parseAddress(startAddr);\n const e = parseAddress(endAddr);\n const minRow = Math.min(s.row, e.row);\n const maxRow = Math.max(s.row, e.row);\n const minCol = Math.min(s.col, e.col);\n const maxCol = Math.max(s.col, e.col);\n const addresses: string[] = [];\n for (let r = minRow; r <= maxRow; r++) {\n for (let c = minCol; c <= maxCol; c++) {\n addresses.push(toAddress(r, c));\n }\n }\n return addresses;\n}\n\n/** Normalize a range so start is top-left and end is bottom-right */\nexport function normalizeRange(startAddr: string, endAddr: string): { start: string; end: string } {\n const s = parseAddress(startAddr);\n const e = parseAddress(endAddr);\n return {\n start: toAddress(Math.min(s.row, e.row), Math.min(s.col, e.col)),\n end: toAddress(Math.max(s.row, e.row), Math.max(s.col, e.col)),\n };\n}\n\n/** Offset an address by row/col deltas */\nexport function offsetAddress(addr: string, rowDelta: number, colDelta: number): string {\n const { row, col } = parseAddress(addr);\n return toAddress(row + rowDelta, col + colDelta);\n}\n","import type { FormulaToken, FormulaTokenType } from \"../../types/formula\";\n\nexport function lexFormula(input: string): FormulaToken[] {\n const tokens: FormulaToken[] = [];\n const len = input.length;\n let i = 0;\n\n while (i < len) {\n const ch = input[i];\n\n // Whitespace\n if (ch === \" \" || ch === \"\\t\") { i++; continue; }\n\n // Number\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && i + 1 < len && input[i + 1] >= \"0\" && input[i + 1] <= \"9\")) {\n const pos = i;\n while (i < len && ((input[i] >= \"0\" && input[i] <= \"9\") || input[i] === \".\")) i++;\n if (i < len && (input[i] === \"e\" || input[i] === \"E\")) {\n i++;\n if (i < len && (input[i] === \"+\" || input[i] === \"-\")) i++;\n while (i < len && input[i] >= \"0\" && input[i] <= \"9\") i++;\n }\n tokens.push({ type: \"number\", value: input.slice(pos, i), position: pos });\n continue;\n }\n\n // String\n if (ch === '\"') {\n const pos = i;\n i++;\n while (i < len && input[i] !== '\"') {\n if (input[i] === \"\\\\\") i++;\n i++;\n }\n i++; // closing quote\n tokens.push({ type: \"string\", value: input.slice(pos + 1, i - 1), position: pos });\n continue;\n }\n\n // Identifier (cell ref, range ref, function name, or boolean)\n if ((ch >= \"A\" && ch <= \"Z\") || (ch >= \"a\" && ch <= \"z\") || ch === \"_\") {\n const pos = i;\n i++;\n while (i < len && ((input[i] >= \"A\" && input[i] <= \"Z\") || (input[i] >= \"a\" && input[i] <= \"z\") || (input[i] >= \"0\" && input[i] <= \"9\") || input[i] === \"_\")) i++;\n const word = input.slice(pos, i);\n\n // Boolean\n if (word.toUpperCase() === \"TRUE\" || word.toUpperCase() === \"FALSE\") {\n tokens.push({ type: \"boolean\", value: word.toUpperCase(), position: pos });\n continue;\n }\n\n // Check for range ref: CELLREF:CELLREF\n if (i < len && input[i] === \":\") {\n const colonPos = i;\n i++;\n const rangeStart = i;\n while (i < len && ((input[i] >= \"A\" && input[i] <= \"Z\") || (input[i] >= \"a\" && input[i] <= \"z\") || (input[i] >= \"0\" && input[i] <= \"9\"))) i++;\n if (i > rangeStart) {\n tokens.push({ type: \"rangeRef\", value: word + \":\" + input.slice(rangeStart, i), position: pos });\n continue;\n }\n // Not a range, backtrack\n i = colonPos;\n }\n\n // Check if it's a function call (followed by parenthesis)\n let j = i;\n while (j < len && input[j] === \" \") j++;\n if (j < len && input[j] === \"(\") {\n tokens.push({ type: \"function\", value: word.toUpperCase(), position: pos });\n continue;\n }\n\n // Cell reference (letters + digits)\n if (/^[A-Z]+\\d+$/i.test(word)) {\n tokens.push({ type: \"cellRef\", value: word.toUpperCase(), position: pos });\n continue;\n }\n\n // Unknown identifier — treat as cell ref\n tokens.push({ type: \"cellRef\", value: word.toUpperCase(), position: pos });\n continue;\n }\n\n // Operators\n if (ch === \"+\" || ch === \"-\" || ch === \"*\" || ch === \"/\" || ch === \"^\" || ch === \"&\") {\n tokens.push({ type: \"operator\", value: ch, position: i });\n i++;\n continue;\n }\n\n // Comparison operators\n if (ch === \"=\" || ch === \"<\" || ch === \">\") {\n const pos = i;\n i++;\n if (i < len && (input[i] === \"=\" || input[i] === \">\")) i++;\n tokens.push({ type: \"operator\", value: input.slice(pos, i), position: pos });\n continue;\n }\n\n // Parentheses\n if (ch === \"(\" || ch === \")\") {\n tokens.push({ type: \"paren\", value: ch, position: i });\n i++;\n continue;\n }\n\n // Comma\n if (ch === \",\") {\n tokens.push({ type: \"comma\", value: \",\", position: i });\n i++;\n continue;\n }\n\n // Skip unknown\n i++;\n }\n\n return tokens;\n}\n","import type { FormulaToken, FormulaASTNode } from \"../../types/formula\";\n\n/**\n * Recursive descent parser for spreadsheet formulas.\n * Operator precedence (low to high):\n * 1. Comparison: =, <>, <, >, <=, >=\n * 2. String concatenation: &\n * 3. Addition/subtraction: +, -\n * 4. Multiplication/division: *, /\n * 5. Exponentiation: ^\n * 6. Unary: -, +\n * 7. Atoms: number, string, boolean, cellRef, rangeRef, function call, (expr)\n */\nexport function parseFormula(tokens: FormulaToken[]): FormulaASTNode {\n let pos = 0;\n\n function peek(): FormulaToken | undefined {\n return tokens[pos];\n }\n\n function advance(): FormulaToken {\n return tokens[pos++];\n }\n\n function expect(type: string, value?: string): FormulaToken {\n const t = advance();\n if (!t || t.type !== type || (value !== undefined && t.value !== value)) {\n throw new Error(`Expected ${type}${value ? ` '${value}'` : \"\"} at position ${t?.position ?? pos}`);\n }\n return t;\n }\n\n // Precedence levels\n function parseExpression(): FormulaASTNode {\n return parseComparison();\n }\n\n function parseComparison(): FormulaASTNode {\n let left = parseConcatenation();\n while (peek() && peek()!.type === \"operator\" && [\"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"].includes(peek()!.value)) {\n const op = advance().value;\n const right = parseConcatenation();\n left = { type: \"binaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n function parseConcatenation(): FormulaASTNode {\n let left = parseAddition();\n while (peek() && peek()!.type === \"operator\" && peek()!.value === \"&\") {\n advance();\n const right = parseAddition();\n left = { type: \"binaryOp\", operator: \"&\", left, right };\n }\n return left;\n }\n\n function parseAddition(): FormulaASTNode {\n let left = parseMultiplication();\n while (peek() && peek()!.type === \"operator\" && (peek()!.value === \"+\" || peek()!.value === \"-\")) {\n const op = advance().value;\n const right = parseMultiplication();\n left = { type: \"binaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n function parseMultiplication(): FormulaASTNode {\n let left = parseExponentiation();\n while (peek() && peek()!.type === \"operator\" && (peek()!.value === \"*\" || peek()!.value === \"/\")) {\n const op = advance().value;\n const right = parseExponentiation();\n left = { type: \"binaryOp\", operator: op, left, right };\n }\n return left;\n }\n\n function parseExponentiation(): FormulaASTNode {\n let left = parseUnary();\n while (peek() && peek()!.type === \"operator\" && peek()!.value === \"^\") {\n advance();\n const right = parseUnary();\n left = { type: \"binaryOp\", operator: \"^\", left, right };\n }\n return left;\n }\n\n function parseUnary(): FormulaASTNode {\n if (peek() && peek()!.type === \"operator\" && (peek()!.value === \"-\" || peek()!.value === \"+\")) {\n const op = advance().value;\n const operand = parseUnary();\n return { type: \"unaryOp\", operator: op, operand };\n }\n return parseAtom();\n }\n\n function parseAtom(): FormulaASTNode {\n const t = peek();\n if (!t) throw new Error(\"Unexpected end of formula\");\n\n // Number\n if (t.type === \"number\") {\n advance();\n return { type: \"number\", value: parseFloat(t.value) };\n }\n\n // String\n if (t.type === \"string\") {\n advance();\n return { type: \"string\", value: t.value };\n }\n\n // Boolean\n if (t.type === \"boolean\") {\n advance();\n return { type: \"boolean\", value: t.value === \"TRUE\" };\n }\n\n // Range reference (A1:B5)\n if (t.type === \"rangeRef\") {\n advance();\n const parts = t.value.split(\":\");\n return { type: \"rangeRef\", start: parts[0], end: parts[1] };\n }\n\n // Function call\n if (t.type === \"function\") {\n const name = advance().value;\n expect(\"paren\", \"(\");\n const args: FormulaASTNode[] = [];\n if (peek() && !(peek()!.type === \"paren\" && peek()!.value === \")\")) {\n args.push(parseExpression());\n while (peek() && peek()!.type === \"comma\") {\n advance();\n args.push(parseExpression());\n }\n }\n expect(\"paren\", \")\");\n return { type: \"functionCall\", name, args };\n }\n\n // Cell reference\n if (t.type === \"cellRef\") {\n advance();\n return { type: \"cellRef\", address: t.value };\n }\n\n // Parenthesized expression\n if (t.type === \"paren\" && t.value === \"(\") {\n advance();\n const expr = parseExpression();\n expect(\"paren\", \")\");\n return expr;\n }\n\n throw new Error(`Unexpected token '${t.value}' at position ${t.position}`);\n }\n\n const ast = parseExpression();\n return ast;\n}\n","import type { CellValue } from \"../../../types/cell\";\n\nexport type FormulaFunction = (...args: CellValue[]) => CellValue;\nexport type FormulaRangeFunction = (args: CellValue[][]) => CellValue;\n\ninterface FunctionEntry {\n fn: FormulaRangeFunction;\n}\n\nconst functionRegistry = new Map<string, FunctionEntry>();\n\nexport function registerFunction(name: string, fn: FormulaRangeFunction): void {\n functionRegistry.set(name.toUpperCase(), { fn });\n}\n\nexport function getFunction(name: string): FunctionEntry | undefined {\n return functionRegistry.get(name.toUpperCase());\n}\n","import { registerFunction } from \"./registry\";\nimport type { CellValue } from \"../../../types/cell\";\n\nfunction toNumbers(args: CellValue[][]): number[] {\n const nums: number[] = [];\n for (const group of args) {\n for (const v of group) {\n if (typeof v === \"number\") nums.push(v);\n else if (typeof v === \"string\" && v !== \"\" && !isNaN(Number(v))) nums.push(Number(v));\n }\n }\n return nums;\n}\n\nregisterFunction(\"SUM\", (args) => {\n return toNumbers(args).reduce((a, b) => a + b, 0);\n});\n\nregisterFunction(\"AVERAGE\", (args) => {\n const nums = toNumbers(args);\n if (nums.length === 0) return 0;\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n});\n\nregisterFunction(\"MIN\", (args) => {\n const nums = toNumbers(args);\n if (nums.length === 0) return 0;\n return Math.min(...nums);\n});\n\nregisterFunction(\"MAX\", (args) => {\n const nums = toNumbers(args);\n if (nums.length === 0) return 0;\n return Math.max(...nums);\n});\n\nregisterFunction(\"COUNT\", (args) => {\n return toNumbers(args).length;\n});\n\nregisterFunction(\"ROUND\", (args) => {\n const flat = args.flat();\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\n const decimals = typeof flat[1] === \"number\" ? flat[1] : (flat[1] != null ? Number(flat[1]) : 0);\n if (isNaN(num)) return \"#VALUE!\";\n return Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals);\n});\n\nregisterFunction(\"ABS\", (args) => {\n const val = args.flat()[0];\n const num = typeof val === \"number\" ? val : Number(val);\n if (isNaN(num)) return \"#VALUE!\";\n return Math.abs(num);\n});\n","import { registerFunction } from \"./registry\";\n\nregisterFunction(\"UPPER\", (args) => {\n const val = args.flat()[0];\n return val != null ? String(val).toUpperCase() : \"\";\n});\n\nregisterFunction(\"LOWER\", (args) => {\n const val = args.flat()[0];\n return val != null ? String(val).toLowerCase() : \"\";\n});\n\nregisterFunction(\"LEN\", (args) => {\n const val = args.flat()[0];\n return val != null ? String(val).length : 0;\n});\n\nregisterFunction(\"TRIM\", (args) => {\n const val = args.flat()[0];\n return val != null ? String(val).trim() : \"\";\n});\n\nregisterFunction(\"CONCAT\", (args) => {\n return args.flat().map((v) => (v != null ? String(v) : \"\")).join(\"\");\n});\n","import { registerFunction } from \"./registry\";\nimport type { CellValue } from \"../../../types/cell\";\n\nfunction toBool(v: CellValue): boolean {\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"number\") return v !== 0;\n if (typeof v === \"string\") return v.toUpperCase() === \"TRUE\";\n return false;\n}\n\nregisterFunction(\"IF\", (args) => {\n const flat = args.flat();\n const condition = toBool(flat[0]);\n const trueVal = flat[1] ?? true;\n const falseVal = flat[2] ?? false;\n return condition ? trueVal : falseVal;\n});\n\nregisterFunction(\"AND\", (args) => {\n return args.flat().every(toBool);\n});\n\nregisterFunction(\"OR\", (args) => {\n return args.flat().some(toBool);\n});\n\nregisterFunction(\"NOT\", (args) => {\n return !toBool(args.flat()[0]);\n});\n","import type { FormulaASTNode } from \"../../types/formula\";\nimport type { CellValue } from \"../../types/cell\";\nimport { getFunction } from \"./functions/registry\";\nimport { parseAddress, toAddress } from \"../cell-utils\";\n\n// Import side-effect function registrations\nimport \"./functions/math\";\nimport \"./functions/text\";\nimport \"./functions/logic\";\n\nexport type CellValueGetter = (address: string) => CellValue;\nexport type RangeValueGetter = (start: string, end: string) => CellValue[];\n\nexport function evaluateAST(\n node: FormulaASTNode,\n getCellValue: CellValueGetter,\n getRangeValues: RangeValueGetter,\n): CellValue {\n switch (node.type) {\n case \"number\":\n return node.value;\n case \"string\":\n return node.value;\n case \"boolean\":\n return node.value;\n\n case \"cellRef\":\n return getCellValue(node.address);\n\n case \"rangeRef\":\n // Ranges by themselves return the first value (used in non-function context)\n const vals = getRangeValues(node.start, node.end);\n return vals[0] ?? null;\n\n case \"functionCall\": {\n const entry = getFunction(node.name);\n if (!entry) return `#NAME?`;\n\n // Evaluate args — range refs pass as arrays, everything else as single-element arrays\n const argValues: CellValue[][] = node.args.map((arg) => {\n if (arg.type === \"rangeRef\") {\n return getRangeValues(arg.start, arg.end);\n }\n const val = evaluateAST(arg, getCellValue, getRangeValues);\n return [val];\n });\n\n try {\n return entry.fn(argValues);\n } catch {\n return \"#ERROR!\";\n }\n }\n\n case \"binaryOp\": {\n const left = evaluateAST(node.left, getCellValue, getRangeValues);\n const right = evaluateAST(node.right, getCellValue, getRangeValues);\n\n const lNum = typeof left === \"number\" ? left : Number(left);\n const rNum = typeof right === \"number\" ? right : Number(right);\n\n switch (node.operator) {\n case \"+\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum + rNum;\n case \"-\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum - rNum;\n case \"*\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum * rNum;\n case \"/\": return rNum === 0 ? \"#DIV/0!\" : (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum / rNum;\n case \"^\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : Math.pow(lNum, rNum);\n case \"&\": return String(left ?? \"\") + String(right ?? \"\");\n case \"=\": return left === right;\n case \"<>\": return left !== right;\n case \"<\": return lNum < rNum;\n case \">\": return lNum > rNum;\n case \"<=\": return lNum <= rNum;\n case \">=\": return lNum >= rNum;\n default: return \"#ERROR!\";\n }\n }\n\n case \"unaryOp\": {\n const operand = evaluateAST(node.operand, getCellValue, getRangeValues);\n const num = typeof operand === \"number\" ? operand : Number(operand);\n if (isNaN(num)) return \"#VALUE!\";\n return node.operator === \"-\" ? -num : num;\n }\n\n default:\n return \"#ERROR!\";\n }\n}\n","import { parseAddress, toAddress } from \"../cell-utils\";\nimport type { FormulaASTNode } from \"../../types/formula\";\n\n/** Extract all cell references from an AST node */\nexport function extractReferences(node: FormulaASTNode): string[] {\n const refs: string[] = [];\n\n function walk(n: FormulaASTNode): void {\n switch (n.type) {\n case \"cellRef\":\n refs.push(n.address);\n break;\n case \"rangeRef\": {\n const s = parseAddress(n.start);\n const e = parseAddress(n.end);\n const minRow = Math.min(s.row, e.row);\n const maxRow = Math.max(s.row, e.row);\n const minCol = Math.min(s.col, e.col);\n const maxCol = Math.max(s.col, e.col);\n for (let r = minRow; r <= maxRow; r++) {\n for (let c = minCol; c <= maxCol; c++) {\n refs.push(toAddress(r, c));\n }\n }\n break;\n }\n case \"functionCall\":\n n.args.forEach(walk);\n break;\n case \"binaryOp\":\n walk(n.left);\n walk(n.right);\n break;\n case \"unaryOp\":\n walk(n.operand);\n break;\n }\n }\n\n walk(node);\n return refs;\n}\n","import type { CellMap } from \"../../types/sheet\";\nimport { lexFormula } from \"./lexer\";\nimport { parseFormula } from \"./parser\";\nimport { extractReferences } from \"./references\";\n\n/** Build a dependency graph: cell -> cells it depends on */\nexport function buildDependencyGraph(cells: CellMap): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n\n for (const [addr, cell] of Object.entries(cells)) {\n if (!cell.formula) continue;\n try {\n const tokens = lexFormula(cell.formula);\n const ast = parseFormula(tokens);\n const refs = extractReferences(ast);\n graph.set(addr, new Set(refs));\n } catch {\n graph.set(addr, new Set());\n }\n }\n\n return graph;\n}\n\n/** Detect circular references using DFS */\nexport function detectCircularRefs(graph: Map<string, Set<string>>): Set<string> {\n const circular = new Set<string>();\n const visited = new Set<string>();\n const inStack = new Set<string>();\n\n function dfs(node: string): boolean {\n if (inStack.has(node)) return true;\n if (visited.has(node)) return false;\n\n visited.add(node);\n inStack.add(node);\n\n const deps = graph.get(node);\n if (deps) {\n for (const dep of deps) {\n if (dfs(dep)) {\n circular.add(node);\n return true;\n }\n }\n }\n\n inStack.delete(node);\n return false;\n }\n\n for (const node of graph.keys()) {\n dfs(node);\n }\n\n return circular;\n}\n\n/** Get cells that need recalculation in topological order */\nexport function getRecalculationOrder(graph: Map<string, Set<string>>): string[] {\n const visited = new Set<string>();\n const order: string[] = [];\n\n function visit(node: string): void {\n if (visited.has(node)) return;\n visited.add(node);\n\n const deps = graph.get(node);\n if (deps) {\n for (const dep of deps) {\n visit(dep);\n }\n }\n\n order.push(node);\n }\n\n for (const node of graph.keys()) {\n visit(node);\n }\n\n return order;\n}\n","import { useReducer, useCallback, useMemo } from \"react\";\nimport type { CellValue, CellData, CellFormat } from \"../types/cell\";\nimport type { WorkbookData, SheetData } from \"../types/sheet\";\nimport type { SelectionState, CellRange } from \"../types/selection\";\nimport { createEmptyWorkbook, createEmptySheet } from \"../types/sheet\";\nimport { parseAddress, toAddress, expandRange } from \"../engine/cell-utils\";\nimport { lexFormula } from \"../engine/formula/lexer\";\nimport { parseFormula } from \"../engine/formula/parser\";\nimport { evaluateAST } from \"../engine/formula/evaluator\";\nimport { buildDependencyGraph, detectCircularRefs, getRecalculationOrder } from \"../engine/formula/dependency-graph\";\n\n// ---------------------------------------------------------------------------\n// State\n// ---------------------------------------------------------------------------\n\nexport interface SpreadsheetState {\n workbook: WorkbookData;\n selection: SelectionState;\n editingCell: string | null;\n editValue: string;\n undoStack: WorkbookData[];\n redoStack: WorkbookData[];\n}\n\nfunction createInitialState(data?: WorkbookData): SpreadsheetState {\n return {\n workbook: data ?? createEmptyWorkbook(),\n selection: { activeCell: \"A1\", ranges: [{ start: \"A1\", end: \"A1\" }] },\n editingCell: null,\n editValue: \"\",\n undoStack: [],\n redoStack: [],\n };\n}\n\n// ---------------------------------------------------------------------------\n// Actions\n// ---------------------------------------------------------------------------\n\ntype Action =\n | { type: \"SET_CELL_VALUE\"; address: string; value: string }\n | { type: \"SET_CELL_FORMAT\"; addresses: string[]; format: Partial<CellFormat> }\n | { type: \"SET_SELECTION\"; cell: string }\n | { type: \"EXTEND_SELECTION\"; cell: string }\n | { type: \"ADD_SELECTION\"; cell: string }\n | { type: \"SELECT_RANGE\"; start: string; end: string }\n | { type: \"NAVIGATE\"; direction: \"up\" | \"down\" | \"left\" | \"right\"; extend?: boolean }\n | { type: \"START_EDIT\"; value?: string }\n | { type: \"UPDATE_EDIT\"; value: string }\n | { type: \"CONFIRM_EDIT\" }\n | { type: \"CANCEL_EDIT\" }\n | { type: \"RESIZE_COLUMN\"; col: number; width: number }\n | { type: \"ADD_SHEET\" }\n | { type: \"RENAME_SHEET\"; sheetId: string; name: string }\n | { type: \"DELETE_SHEET\"; sheetId: string }\n | { type: \"SET_ACTIVE_SHEET\"; sheetId: string }\n | { type: \"UNDO\" }\n | { type: \"REDO\" }\n | { type: \"SET_WORKBOOK\"; workbook: WorkbookData };\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getActiveSheet(state: SpreadsheetState): SheetData {\n return state.workbook.sheets.find((s) => s.id === state.workbook.activeSheetId)!;\n}\n\nfunction updateActiveSheet(state: SpreadsheetState, updater: (sheet: SheetData) => SheetData): WorkbookData {\n return {\n ...state.workbook,\n sheets: state.workbook.sheets.map((s) =>\n s.id === state.workbook.activeSheetId ? updater(s) : s,\n ),\n };\n}\n\nfunction pushUndo(state: SpreadsheetState): { undoStack: WorkbookData[]; redoStack: WorkbookData[] } {\n const stack = [...state.undoStack, state.workbook];\n if (stack.length > 50) stack.shift();\n return { undoStack: stack, redoStack: [] };\n}\n\n/** Recalculate all formula cells in a sheet */\nfunction recalculateSheet(sheet: SheetData): SheetData {\n const graph = buildDependencyGraph(sheet.cells);\n if (graph.size === 0) return sheet;\n\n const circular = detectCircularRefs(graph);\n const order = getRecalculationOrder(graph);\n const cells = { ...sheet.cells };\n\n const getCellValue = (addr: string): CellValue => {\n const c = cells[addr];\n if (!c) return null;\n if (c.formula && c.computedValue !== undefined) return c.computedValue;\n return c.value;\n };\n\n const getRangeValues = (startAddr: string, endAddr: string): CellValue[] => {\n const addresses = expandRange(startAddr, endAddr);\n return addresses.map(getCellValue);\n };\n\n for (const addr of order) {\n const cell = cells[addr];\n if (!cell?.formula) continue;\n\n if (circular.has(addr)) {\n cells[addr] = { ...cell, computedValue: \"#CIRC!\" };\n continue;\n }\n\n try {\n const tokens = lexFormula(cell.formula);\n const ast = parseFormula(tokens);\n const result = evaluateAST(ast, getCellValue, getRangeValues);\n cells[addr] = { ...cell, computedValue: result };\n } catch {\n cells[addr] = { ...cell, computedValue: \"#ERROR!\" };\n }\n }\n\n return { ...sheet, cells };\n}\n\nfunction getCellDisplayValue(cell: CellData | undefined): string {\n if (!cell) return \"\";\n if (cell.computedValue !== undefined) return String(cell.computedValue);\n if (cell.value === null) return \"\";\n return String(cell.value);\n}\n\n// ---------------------------------------------------------------------------\n// Reducer\n// ---------------------------------------------------------------------------\n\nfunction reducer(state: SpreadsheetState, action: Action): SpreadsheetState {\n switch (action.type) {\n case \"SET_CELL_VALUE\": {\n const history = pushUndo(state);\n const isFormula = action.value.startsWith(\"=\");\n const cellData: CellData = isFormula\n ? { value: action.value, formula: action.value.slice(1), computedValue: null }\n : { value: isNaN(Number(action.value)) || action.value === \"\" ? action.value : Number(action.value) };\n\n // Preserve existing format\n const sheet = getActiveSheet(state);\n const existing = sheet.cells[action.address];\n if (existing?.format) cellData.format = existing.format;\n\n const workbook = updateActiveSheet(state, (s) => {\n const updated = { ...s, cells: { ...s.cells, [action.address]: cellData } };\n return recalculateSheet(updated);\n });\n\n return { ...state, workbook, ...history };\n }\n\n case \"SET_CELL_FORMAT\": {\n const history = pushUndo(state);\n const workbook = updateActiveSheet(state, (s) => {\n const cells = { ...s.cells };\n for (const addr of action.addresses) {\n const existing = cells[addr] ?? { value: null };\n cells[addr] = { ...existing, format: { ...existing.format, ...action.format } };\n }\n return { ...s, cells };\n });\n return { ...state, workbook, ...history };\n }\n\n case \"SET_SELECTION\":\n return {\n ...state,\n selection: {\n activeCell: action.cell,\n ranges: [{ start: action.cell, end: action.cell }],\n },\n editingCell: null,\n };\n\n case \"EXTEND_SELECTION\":\n return {\n ...state,\n selection: {\n ...state.selection,\n ranges: [\n { start: state.selection.activeCell, end: action.cell },\n ...state.selection.ranges.slice(1),\n ],\n },\n };\n\n case \"ADD_SELECTION\":\n return {\n ...state,\n selection: {\n activeCell: action.cell,\n ranges: [...state.selection.ranges, { start: action.cell, end: action.cell }],\n },\n };\n\n case \"SELECT_RANGE\":\n return {\n ...state,\n selection: {\n activeCell: action.start,\n ranges: [{ start: action.start, end: action.end }],\n },\n };\n\n case \"NAVIGATE\": {\n const { row, col } = parseAddress(state.selection.activeCell);\n let newRow = row;\n let newCol = col;\n switch (action.direction) {\n case \"up\": newRow = Math.max(0, row - 1); break;\n case \"down\": newRow = row + 1; break;\n case \"left\": newCol = Math.max(0, col - 1); break;\n case \"right\": newCol = col + 1; break;\n }\n const newAddr = toAddress(newRow, newCol);\n if (action.extend) {\n return {\n ...state,\n selection: {\n ...state.selection,\n ranges: [\n { start: state.selection.activeCell, end: newAddr },\n ...state.selection.ranges.slice(1),\n ],\n },\n };\n }\n return {\n ...state,\n selection: { activeCell: newAddr, ranges: [{ start: newAddr, end: newAddr }] },\n editingCell: null,\n };\n }\n\n case \"START_EDIT\": {\n const sheet = getActiveSheet(state);\n const cell = sheet.cells[state.selection.activeCell];\n const initialValue = action.value ?? (cell?.formula ? \"=\" + cell.formula : getCellDisplayValue(cell));\n return { ...state, editingCell: state.selection.activeCell, editValue: initialValue };\n }\n\n case \"UPDATE_EDIT\":\n return { ...state, editValue: action.value };\n\n case \"CONFIRM_EDIT\": {\n if (!state.editingCell) return state;\n const newState = reducer(state, { type: \"SET_CELL_VALUE\", address: state.editingCell, value: state.editValue });\n // Move down after confirm\n const { row, col } = parseAddress(state.editingCell);\n const nextAddr = toAddress(row + 1, col);\n return {\n ...newState,\n editingCell: null,\n editValue: \"\",\n selection: { activeCell: nextAddr, ranges: [{ start: nextAddr, end: nextAddr }] },\n };\n }\n\n case \"CANCEL_EDIT\":\n return { ...state, editingCell: null, editValue: \"\" };\n\n case \"RESIZE_COLUMN\": {\n const workbook = updateActiveSheet(state, (s) => ({\n ...s,\n columnWidths: { ...s.columnWidths, [action.col]: Math.max(30, action.width) },\n }));\n return { ...state, workbook };\n }\n\n case \"ADD_SHEET\": {\n const id = `sheet-${Date.now()}`;\n const num = state.workbook.sheets.length + 1;\n const sheet = createEmptySheet(id, `Sheet ${num}`);\n return {\n ...state,\n workbook: {\n sheets: [...state.workbook.sheets, sheet],\n activeSheetId: id,\n },\n };\n }\n\n case \"RENAME_SHEET\":\n return {\n ...state,\n workbook: {\n ...state.workbook,\n sheets: state.workbook.sheets.map((s) =>\n s.id === action.sheetId ? { ...s, name: action.name } : s,\n ),\n },\n };\n\n case \"DELETE_SHEET\": {\n if (state.workbook.sheets.length <= 1) return state;\n const remaining = state.workbook.sheets.filter((s) => s.id !== action.sheetId);\n const activeId = state.workbook.activeSheetId === action.sheetId\n ? remaining[0].id\n : state.workbook.activeSheetId;\n return {\n ...state,\n workbook: { sheets: remaining, activeSheetId: activeId },\n };\n }\n\n case \"SET_ACTIVE_SHEET\":\n return {\n ...state,\n workbook: { ...state.workbook, activeSheetId: action.sheetId },\n selection: { activeCell: \"A1\", ranges: [{ start: \"A1\", end: \"A1\" }] },\n editingCell: null,\n };\n\n case \"UNDO\": {\n if (state.undoStack.length === 0) return state;\n const prev = state.undoStack[state.undoStack.length - 1];\n return {\n ...state,\n workbook: prev,\n undoStack: state.undoStack.slice(0, -1),\n redoStack: [...state.redoStack, state.workbook],\n };\n }\n\n case \"REDO\": {\n if (state.redoStack.length === 0) return state;\n const next = state.redoStack[state.redoStack.length - 1];\n return {\n ...state,\n workbook: next,\n undoStack: [...state.undoStack, state.workbook],\n redoStack: state.redoStack.slice(0, -1),\n };\n }\n\n case \"SET_WORKBOOK\":\n return { ...state, workbook: action.workbook };\n\n default:\n return state;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useSpreadsheetStore(initialData?: WorkbookData) {\n const [state, dispatch] = useReducer(reducer, initialData, (data) => createInitialState(data));\n\n const actions = useMemo(() => ({\n setCellValue: (address: string, value: string) => dispatch({ type: \"SET_CELL_VALUE\", address, value }),\n setCellFormat: (addresses: string[], format: Partial<CellFormat>) => dispatch({ type: \"SET_CELL_FORMAT\", addresses, format }),\n setSelection: (cell: string) => dispatch({ type: \"SET_SELECTION\", cell }),\n extendSelection: (cell: string) => dispatch({ type: \"EXTEND_SELECTION\", cell }),\n addSelection: (cell: string) => dispatch({ type: \"ADD_SELECTION\", cell }),\n selectRange: (start: string, end: string) => dispatch({ type: \"SELECT_RANGE\", start, end }),\n navigate: (direction: \"up\" | \"down\" | \"left\" | \"right\", extend?: boolean) => dispatch({ type: \"NAVIGATE\", direction, extend }),\n startEdit: (value?: string) => dispatch({ type: \"START_EDIT\", value }),\n updateEdit: (value: string) => dispatch({ type: \"UPDATE_EDIT\", value }),\n confirmEdit: () => dispatch({ type: \"CONFIRM_EDIT\" }),\n cancelEdit: () => dispatch({ type: \"CANCEL_EDIT\" }),\n resizeColumn: (col: number, width: number) => dispatch({ type: \"RESIZE_COLUMN\", col, width }),\n addSheet: () => dispatch({ type: \"ADD_SHEET\" }),\n renameSheet: (sheetId: string, name: string) => dispatch({ type: \"RENAME_SHEET\", sheetId, name }),\n deleteSheet: (sheetId: string) => dispatch({ type: \"DELETE_SHEET\", sheetId }),\n setActiveSheet: (sheetId: string) => dispatch({ type: \"SET_ACTIVE_SHEET\", sheetId }),\n undo: () => dispatch({ type: \"UNDO\" }),\n redo: () => dispatch({ type: \"REDO\" }),\n setWorkbook: (workbook: WorkbookData) => dispatch({ type: \"SET_WORKBOOK\", workbook }),\n }), []);\n\n return { state, actions };\n}\n","import { useCallback, useRef } from \"react\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\n\ninterface ColumnResizeHandleProps {\n colIndex: number;\n}\n\nexport function ColumnResizeHandle({ colIndex }: ColumnResizeHandleProps) {\n const { resizeColumn, getColumnWidth } = useSpreadsheet();\n const startX = useRef(0);\n const startWidth = useRef(0);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX.current = e.clientX;\n startWidth.current = getColumnWidth(colIndex);\n const target = e.currentTarget as HTMLElement;\n target.setPointerCapture(e.pointerId);\n\n const handlePointerMove = (ev: PointerEvent) => {\n const delta = ev.clientX - startX.current;\n resizeColumn(colIndex, startWidth.current + delta);\n };\n\n const handlePointerUp = () => {\n target.removeEventListener(\"pointermove\", handlePointerMove);\n target.removeEventListener(\"pointerup\", handlePointerUp);\n };\n\n target.addEventListener(\"pointermove\", handlePointerMove);\n target.addEventListener(\"pointerup\", handlePointerUp);\n },\n [colIndex, getColumnWidth, resizeColumn],\n );\n\n return (\n <div\n data-fancy-sheets-resize-handle=\"\"\n className=\"absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-blue-500/50\"\n onPointerDown={handlePointerDown}\n />\n );\n}\n\nColumnResizeHandle.displayName = \"ColumnResizeHandle\";\n","import { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { columnToLetter } from \"../../engine/cell-utils\";\nimport { ColumnResizeHandle } from \"./ColumnResizeHandle\";\n\nexport function ColumnHeaders() {\n const { columnCount, rowHeight, getColumnWidth } = useSpreadsheet();\n\n return (\n <div\n data-fancy-sheets-column-headers=\"\"\n className=\"flex border-b border-zinc-300 bg-zinc-100 dark:border-zinc-600 dark:bg-zinc-800\"\n style={{ height: rowHeight }}\n >\n {/* Corner cell */}\n <div\n className=\"flex shrink-0 items-center justify-center border-r border-zinc-300 bg-zinc-100 text-[11px] font-medium text-zinc-400 dark:border-zinc-600 dark:bg-zinc-800\"\n style={{ width: 48, minWidth: 48 }}\n />\n {/* Column letters */}\n {Array.from({ length: columnCount }, (_, i) => (\n <div\n key={i}\n className=\"relative flex shrink-0 items-center justify-center border-r border-zinc-300 text-[11px] font-medium text-zinc-500 select-none dark:border-zinc-600 dark:text-zinc-400\"\n style={{ width: getColumnWidth(i), minWidth: getColumnWidth(i) }}\n >\n {columnToLetter(i)}\n <ColumnResizeHandle colIndex={i} />\n </div>\n ))}\n </div>\n );\n}\n\nColumnHeaders.displayName = \"ColumnHeaders\";\n","import { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\n\ninterface RowHeadersProps {\n rowIndex: number;\n}\n\nexport function RowHeader({ rowIndex }: RowHeadersProps) {\n const { rowHeight } = useSpreadsheet();\n\n return (\n <div\n data-fancy-sheets-row-header=\"\"\n className=\"flex shrink-0 items-center justify-center border-r border-b border-zinc-300 bg-zinc-100 text-[11px] font-medium text-zinc-500 select-none dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-400\"\n style={{ width: 48, minWidth: 48, height: rowHeight }}\n >\n {rowIndex + 1}\n </div>\n );\n}\n\nRowHeader.displayName = \"RowHeader\";\n","import { useCallback, memo } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport type { CellData } from \"../../types/cell\";\n\ninterface CellProps {\n address: string;\n row: number;\n col: number;\n}\n\nfunction getCellDisplayValue(cell: CellData | undefined): string {\n if (!cell) return \"\";\n if (cell.formula && cell.computedValue !== undefined) return String(cell.computedValue ?? \"\");\n if (cell.value === null) return \"\";\n return String(cell.value);\n}\n\nexport const Cell = memo(function Cell({ address, row, col }: CellProps) {\n const {\n activeSheet,\n selection,\n editingCell,\n readOnly,\n setSelection,\n extendSelection,\n addSelection,\n startEdit,\n rowHeight,\n getColumnWidth,\n isCellSelected,\n isCellActive,\n } = useSpreadsheet();\n\n const cell = activeSheet.cells[address];\n const isActive = isCellActive(address);\n const isSelected = isCellSelected(address);\n const isEditing = editingCell === address;\n const displayValue = getCellDisplayValue(cell);\n const width = getColumnWidth(col);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.shiftKey) {\n extendSelection(address);\n } else if (e.ctrlKey || e.metaKey) {\n addSelection(address);\n } else {\n setSelection(address);\n }\n },\n [address, setSelection, extendSelection, addSelection],\n );\n\n const handleDoubleClick = useCallback(() => {\n if (readOnly) return;\n startEdit();\n }, [readOnly, startEdit]);\n\n const formatStyle: React.CSSProperties = {};\n if (cell?.format?.bold) formatStyle.fontWeight = \"bold\";\n if (cell?.format?.italic) formatStyle.fontStyle = \"italic\";\n if (cell?.format?.textAlign) formatStyle.textAlign = cell.format.textAlign;\n\n return (\n <div\n data-fancy-sheets-cell=\"\"\n data-selected={isSelected || undefined}\n data-active={isActive || undefined}\n role=\"gridcell\"\n className={cn(\n \"relative flex items-center truncate border-r border-b border-zinc-200 px-1.5 text-[13px] dark:border-zinc-700\",\n isActive && \"ring-2 ring-inset ring-blue-500\",\n isSelected && !isActive && \"bg-blue-500/10\",\n )}\n style={{ width, minWidth: width, height: rowHeight, ...formatStyle }}\n onMouseDown={handleMouseDown}\n onDoubleClick={handleDoubleClick}\n >\n {!isEditing && <span className=\"truncate\">{displayValue}</span>}\n </div>\n );\n});\n\nCell.displayName = \"Cell\";\n","import { useEffect, useRef } from \"react\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { parseAddress } from \"../../engine/cell-utils\";\n\nexport function CellEditor() {\n const {\n editingCell,\n editValue,\n updateEdit,\n confirmEdit,\n cancelEdit,\n getColumnWidth,\n rowHeight,\n activeSheet,\n } = useSpreadsheet();\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (editingCell && inputRef.current) {\n inputRef.current.focus();\n inputRef.current.select();\n }\n }, [editingCell]);\n\n if (!editingCell) return null;\n\n const { row, col } = parseAddress(editingCell);\n const width = getColumnWidth(col);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n confirmEdit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancelEdit();\n } else if (e.key === \"Tab\") {\n e.preventDefault();\n confirmEdit();\n }\n };\n\n return (\n <input\n ref={inputRef}\n data-fancy-sheets-cell-editor=\"\"\n className=\"absolute z-20 border-2 border-blue-500 bg-white px-1 text-[13px] outline-none dark:bg-zinc-800 dark:text-zinc-100\"\n style={{ width: Math.max(width, 60), height: rowHeight }}\n value={editValue}\n onChange={(e) => updateEdit(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={confirmEdit}\n />\n );\n}\n\nCellEditor.displayName = \"CellEditor\";\n","import { useMemo } from \"react\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { parseAddress, normalizeRange } from \"../../engine/cell-utils\";\n\nexport function SelectionOverlay() {\n const { selection, getColumnWidth, rowHeight } = useSpreadsheet();\n\n const rects = useMemo(() => {\n return selection.ranges.map((range, i) => {\n const norm = normalizeRange(range.start, range.end);\n const s = parseAddress(norm.start);\n const e = parseAddress(norm.end);\n\n let left = 48; // row header width\n for (let c = 0; c < s.col; c++) left += getColumnWidth(c);\n\n let width = 0;\n for (let c = s.col; c <= e.col; c++) width += getColumnWidth(c);\n\n const top = rowHeight + s.row * rowHeight; // column header height + rows\n const height = (e.row - s.row + 1) * rowHeight;\n\n return { left, top, width, height, isPrimary: i === 0 };\n });\n }, [selection.ranges, getColumnWidth, rowHeight]);\n\n return (\n <>\n {rects.map((rect, i) => (\n <div\n key={i}\n data-fancy-sheets-selection=\"\"\n className=\"pointer-events-none absolute border-2 border-blue-500\"\n style={{\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n backgroundColor: rect.isPrimary ? \"rgba(59, 130, 246, 0.08)\" : \"rgba(59, 130, 246, 0.05)\",\n }}\n />\n ))}\n </>\n );\n}\n\nSelectionOverlay.displayName = \"SelectionOverlay\";\n","import type { CellMap } from \"../types/sheet\";\nimport type { CellRange } from \"../types/selection\";\nimport { parseAddress, toAddress, normalizeRange } from \"./cell-utils\";\n\n/** Serialize a cell range to TSV string */\nexport function cellsToTSV(cells: CellMap, range: CellRange): string {\n const norm = normalizeRange(range.start, range.end);\n const s = parseAddress(norm.start);\n const e = parseAddress(norm.end);\n const rows: string[] = [];\n\n for (let r = s.row; r <= e.row; r++) {\n const cols: string[] = [];\n for (let c = s.col; c <= e.col; c++) {\n const addr = toAddress(r, c);\n const cell = cells[addr];\n if (!cell) {\n cols.push(\"\");\n } else if (cell.computedValue !== undefined && cell.computedValue !== null) {\n cols.push(String(cell.computedValue));\n } else if (cell.value !== null) {\n cols.push(String(cell.value));\n } else {\n cols.push(\"\");\n }\n }\n rows.push(cols.join(\"\\t\"));\n }\n\n return rows.join(\"\\n\");\n}\n\n/** Parse TSV string into cell data */\nexport function tsvToCells(tsv: string): { values: string[][]; rows: number; cols: number } {\n const lines = tsv.split(\"\\n\");\n const values = lines.map((line) => line.split(\"\\t\"));\n const rows = values.length;\n const cols = Math.max(...values.map((v) => v.length));\n return { values, rows, cols };\n}\n","import { useCallback, useRef } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { ColumnHeaders } from \"./ColumnHeaders\";\nimport { RowHeader } from \"./RowHeaders\";\nimport { Cell } from \"./Cell\";\nimport { CellEditor } from \"./CellEditor\";\nimport { SelectionOverlay } from \"./SelectionOverlay\";\nimport { toAddress, parseAddress } from \"../../engine/cell-utils\";\nimport { cellsToTSV, tsvToCells } from \"../../engine/clipboard\";\n\ninterface SpreadsheetGridProps {\n className?: string;\n}\n\nexport function SpreadsheetGrid({ className }: SpreadsheetGridProps) {\n const {\n columnCount,\n rowCount,\n rowHeight,\n getColumnWidth,\n selection,\n editingCell,\n readOnly,\n activeSheet,\n navigate,\n startEdit,\n confirmEdit,\n cancelEdit,\n setCellValue,\n undo,\n redo,\n } = useSpreadsheet();\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Don't intercept when editing (CellEditor handles its own keys)\n if (editingCell) return;\n\n // Navigation\n if (e.key === \"ArrowUp\") { e.preventDefault(); navigate(\"up\", e.shiftKey); return; }\n if (e.key === \"ArrowDown\") { e.preventDefault(); navigate(\"down\", e.shiftKey); return; }\n if (e.key === \"ArrowLeft\") { e.preventDefault(); navigate(\"left\", e.shiftKey); return; }\n if (e.key === \"ArrowRight\") { e.preventDefault(); navigate(\"right\", e.shiftKey); return; }\n if (e.key === \"Tab\") { e.preventDefault(); navigate(e.shiftKey ? \"left\" : \"right\"); return; }\n if (e.key === \"Enter\") { e.preventDefault(); if (!readOnly) startEdit(); return; }\n\n // Copy\n if ((e.ctrlKey || e.metaKey) && e.key === \"c\") {\n e.preventDefault();\n const range = selection.ranges[0];\n if (range) {\n const tsv = cellsToTSV(activeSheet.cells, range);\n navigator.clipboard.writeText(tsv);\n }\n return;\n }\n\n // Paste\n if ((e.ctrlKey || e.metaKey) && e.key === \"v\") {\n e.preventDefault();\n navigator.clipboard.readText().then((text) => {\n if (!text) return;\n const { values } = tsvToCells(text);\n const { row: startRow, col: startCol } = parseAddress(selection.activeCell);\n for (let r = 0; r < values.length; r++) {\n for (let c = 0; c < values[r].length; c++) {\n const addr = toAddress(startRow + r, startCol + c);\n setCellValue(addr, values[r][c]);\n }\n }\n });\n return;\n }\n\n // Undo/Redo\n if ((e.ctrlKey || e.metaKey) && e.key === \"z\") { e.preventDefault(); undo(); return; }\n if ((e.ctrlKey || e.metaKey) && e.key === \"y\") { e.preventDefault(); redo(); return; }\n\n // Start editing by typing\n if (!readOnly && !e.ctrlKey && !e.metaKey && !e.altKey && e.key.length === 1) {\n startEdit(e.key);\n }\n\n // Delete/Backspace clears cell\n if (!readOnly && (e.key === \"Delete\" || e.key === \"Backspace\")) {\n e.preventDefault();\n startEdit(\"\");\n // Immediately confirm with empty value\n setTimeout(() => confirmEdit(), 0);\n }\n },\n [editingCell, readOnly, navigate, startEdit, confirmEdit, undo, redo],\n );\n\n // Calculate the position of the editing cell for the overlay editor\n const editorPosition = editingCell\n ? (() => {\n const { row, col } = parseAddress(editingCell);\n let left = 48; // row header width\n for (let c = 0; c < col; c++) left += getColumnWidth(c);\n const top = rowHeight + row * rowHeight; // column header height + row offset\n return { left, top };\n })()\n : null;\n\n return (\n <div\n ref={containerRef}\n data-fancy-sheets-grid=\"\"\n className={cn(\"relative flex-1 overflow-auto bg-white focus:outline-none dark:bg-zinc-900\", className)}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {/* Column headers */}\n <div className=\"sticky top-0 z-10\">\n <ColumnHeaders />\n </div>\n\n {/* Rows */}\n <div className=\"relative\">\n {Array.from({ length: rowCount }, (_, rowIdx) => (\n <div key={rowIdx} className=\"flex\">\n <div className=\"sticky left-0 z-[5]\">\n <RowHeader rowIndex={rowIdx} />\n </div>\n {Array.from({ length: columnCount }, (_, colIdx) => {\n const addr = toAddress(rowIdx, colIdx);\n return <Cell key={addr} address={addr} row={rowIdx} col={colIdx} />;\n })}\n </div>\n ))}\n\n {/* Selection overlay */}\n <SelectionOverlay />\n\n {/* Cell editor overlay */}\n {editorPosition && (\n <div\n className=\"absolute z-20\"\n style={{ left: editorPosition.left, top: editorPosition.top }}\n >\n <CellEditor />\n </div>\n )}\n </div>\n </div>\n );\n}\n\nSpreadsheetGrid.displayName = \"SpreadsheetGrid\";\n","import { cn } from \"@particle-academy/react-fancy\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\n\ninterface SpreadsheetToolbarProps {\n children?: React.ReactNode;\n className?: string;\n}\n\nconst btnClass =\n \"inline-flex items-center justify-center rounded px-2 py-1 text-[12px] font-medium text-zinc-600 transition-colors hover:bg-zinc-100 disabled:opacity-40 dark:text-zinc-300 dark:hover:bg-zinc-800\";\n\nconst activeBtnClass = \"bg-zinc-200 dark:bg-zinc-700\";\n\nfunction DefaultToolbar() {\n const {\n selection,\n activeSheet,\n editingCell,\n editValue,\n updateEdit,\n confirmEdit,\n startEdit,\n setCellFormat,\n undo,\n redo,\n canUndo,\n canRedo,\n readOnly,\n } = useSpreadsheet();\n\n const cell = activeSheet.cells[selection.activeCell];\n const isBold = cell?.format?.bold ?? false;\n const isItalic = cell?.format?.italic ?? false;\n const textAlign = cell?.format?.textAlign ?? \"left\";\n\n const selectedAddresses = [selection.activeCell];\n\n const handleFormulaBarChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (editingCell) {\n updateEdit(e.target.value);\n } else {\n startEdit(e.target.value);\n }\n };\n\n const handleFormulaBarKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n confirmEdit();\n }\n };\n\n const formulaBarValue = editingCell\n ? editValue\n : cell?.formula\n ? \"=\" + cell.formula\n : cell?.value != null\n ? String(cell.value)\n : \"\";\n\n return (\n <>\n {/* Action buttons */}\n <div className=\"flex items-center gap-0.5 border-b border-zinc-200 px-1.5 py-1 dark:border-zinc-700\">\n <button className={btnClass} onClick={undo} disabled={!canUndo || readOnly} title=\"Undo (Ctrl+Z)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"1 4 1 10 7 10\" /><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\" /></svg>\n </button>\n <button className={btnClass} onClick={redo} disabled={!canRedo || readOnly} title=\"Redo (Ctrl+Y)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"23 4 23 10 17 10\" /><path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\" /></svg>\n </button>\n <div className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\n <button\n className={cn(btnClass, isBold && activeBtnClass)}\n onClick={() => setCellFormat(selectedAddresses, { bold: !isBold })}\n disabled={readOnly}\n title=\"Bold\"\n >\n <span className=\"font-bold\">B</span>\n </button>\n <button\n className={cn(btnClass, isItalic && activeBtnClass)}\n onClick={() => setCellFormat(selectedAddresses, { italic: !isItalic })}\n disabled={readOnly}\n title=\"Italic\"\n >\n <span className=\"italic\">I</span>\n </button>\n <div className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\n {([\"left\", \"center\", \"right\"] as const).map((align) => (\n <button\n key={align}\n className={cn(btnClass, textAlign === align && activeBtnClass)}\n onClick={() => setCellFormat(selectedAddresses, { textAlign: align })}\n disabled={readOnly}\n title={`Align ${align}`}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1={align === \"left\" ? \"3\" : align === \"center\" ? \"6\" : \"9\"} y1=\"12\" x2={align === \"left\" ? \"15\" : align === \"center\" ? \"18\" : \"21\"} y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n </button>\n ))}\n </div>\n\n {/* Formula bar */}\n <div data-fancy-sheets-formula-bar=\"\" className=\"flex items-center gap-2 border-b border-zinc-200 px-2 py-1 dark:border-zinc-700\">\n <span className=\"w-12 shrink-0 text-center text-[11px] font-medium text-zinc-500 dark:text-zinc-400\">\n {selection.activeCell}\n </span>\n <div className=\"h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\n <input\n className=\"flex-1 bg-transparent text-[13px] outline-none dark:text-zinc-100\"\n value={formulaBarValue}\n onChange={handleFormulaBarChange}\n onKeyDown={handleFormulaBarKeyDown}\n readOnly={readOnly}\n placeholder=\"Enter value or formula (=SUM(A1:A5))\"\n />\n </div>\n </>\n );\n}\n\nexport function SpreadsheetToolbar({ children, className }: SpreadsheetToolbarProps) {\n return (\n <div data-fancy-sheets-toolbar=\"\" className={cn(\"\", className)}>\n {children ?? <DefaultToolbar />}\n </div>\n );\n}\n\nSpreadsheetToolbar.displayName = \"SpreadsheetToolbar\";\n","import { useState, useCallback } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\n\ninterface SpreadsheetSheetTabsProps {\n className?: string;\n}\n\nexport function SpreadsheetSheetTabs({ className }: SpreadsheetSheetTabsProps) {\n const { workbook, setActiveSheet, addSheet, renameSheet, deleteSheet, readOnly } = useSpreadsheet();\n const [renamingId, setRenamingId] = useState<string | null>(null);\n const [renameValue, setRenameValue] = useState(\"\");\n\n const handleDoubleClick = useCallback(\n (sheetId: string, name: string) => {\n if (readOnly) return;\n setRenamingId(sheetId);\n setRenameValue(name);\n },\n [readOnly],\n );\n\n const handleRenameConfirm = useCallback(() => {\n if (renamingId && renameValue.trim()) {\n renameSheet(renamingId, renameValue.trim());\n }\n setRenamingId(null);\n }, [renamingId, renameValue, renameSheet]);\n\n return (\n <div\n data-fancy-sheets-tabs=\"\"\n className={cn(\n \"flex items-center gap-0.5 border-t border-zinc-200 bg-zinc-50 px-2 py-1 dark:border-zinc-700 dark:bg-zinc-900/50\",\n className,\n )}\n >\n {workbook.sheets.map((sheet) => {\n const isActive = sheet.id === workbook.activeSheetId;\n const isRenaming = renamingId === sheet.id;\n\n return (\n <div key={sheet.id} className=\"relative flex items-center\">\n {isRenaming ? (\n <input\n className=\"rounded border border-blue-500 bg-white px-2 py-0.5 text-[12px] outline-none dark:bg-zinc-800 dark:text-zinc-100\"\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onBlur={handleRenameConfirm}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleRenameConfirm();\n if (e.key === \"Escape\") setRenamingId(null);\n }}\n autoFocus\n />\n ) : (\n <button\n className={cn(\n \"rounded px-3 py-1 text-[12px] font-medium transition-colors\",\n isActive\n ? \"bg-white text-zinc-900 shadow-sm dark:bg-zinc-800 dark:text-zinc-100\"\n : \"text-zinc-500 hover:bg-zinc-100 dark:text-zinc-400 dark:hover:bg-zinc-800\",\n )}\n onClick={() => setActiveSheet(sheet.id)}\n onDoubleClick={() => handleDoubleClick(sheet.id, sheet.name)}\n >\n {sheet.name}\n </button>\n )}\n {!readOnly && workbook.sheets.length > 1 && isActive && !isRenaming && (\n <button\n className=\"ml-0.5 rounded p-0.5 text-zinc-400 hover:bg-zinc-200 hover:text-zinc-600 dark:hover:bg-zinc-700 dark:hover:text-zinc-300\"\n onClick={() => deleteSheet(sheet.id)}\n title=\"Delete sheet\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" /></svg>\n </button>\n )}\n </div>\n );\n })}\n {!readOnly && (\n <button\n className=\"rounded px-2 py-1 text-[12px] font-medium text-zinc-400 transition-colors hover:bg-zinc-100 hover:text-zinc-600 dark:hover:bg-zinc-800 dark:hover:text-zinc-300\"\n onClick={addSheet}\n title=\"Add sheet\"\n >\n +\n </button>\n )}\n </div>\n );\n}\n\nSpreadsheetSheetTabs.displayName = \"SpreadsheetSheetTabs\";\n","import { useMemo, useCallback, useEffect } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { SpreadsheetContext } from \"./Spreadsheet.context\";\nimport { useSpreadsheetStore } from \"../../hooks/use-spreadsheet-store\";\nimport { parseAddress, toAddress, expandRange, normalizeRange } from \"../../engine/cell-utils\";\nimport type { SpreadsheetProps, SpreadsheetContextValue } from \"./Spreadsheet.types\";\n\n// Sub-components (imported for Object.assign)\nimport { SpreadsheetGrid } from \"../Grid/SpreadsheetGrid\";\nimport { SpreadsheetToolbar } from \"../Toolbar/SpreadsheetToolbar\";\nimport { SpreadsheetSheetTabs } from \"../SheetTabs/SpreadsheetSheetTabs\";\n\nfunction SpreadsheetRoot({\n children,\n className,\n data,\n defaultData,\n onChange,\n columnCount = 26,\n rowCount = 100,\n defaultColumnWidth = 100,\n rowHeight = 28,\n readOnly = false,\n}: SpreadsheetProps) {\n const { state, actions } = useSpreadsheetStore(data ?? defaultData);\n\n // Sync controlled data\n useEffect(() => {\n if (data && data !== state.workbook) {\n actions.setWorkbook(data);\n }\n }, [data]);\n\n // Notify parent of changes\n useEffect(() => {\n onChange?.(state.workbook);\n }, [state.workbook]);\n\n const activeSheet = useMemo(\n () => state.workbook.sheets.find((s) => s.id === state.workbook.activeSheetId)!,\n [state.workbook],\n );\n\n const getColumnWidth = useCallback(\n (col: number) => activeSheet.columnWidths[col] ?? defaultColumnWidth,\n [activeSheet.columnWidths, defaultColumnWidth],\n );\n\n const isCellSelected = useCallback(\n (address: string) => {\n const target = parseAddress(address);\n return state.selection.ranges.some((range) => {\n const norm = normalizeRange(range.start, range.end);\n const s = parseAddress(norm.start);\n const e = parseAddress(norm.end);\n return target.row >= s.row && target.row <= e.row && target.col >= s.col && target.col <= e.col;\n });\n },\n [state.selection.ranges],\n );\n\n const isCellActive = useCallback(\n (address: string) => state.selection.activeCell === address,\n [state.selection.activeCell],\n );\n\n const ctx = useMemo<SpreadsheetContextValue>(\n () => ({\n workbook: state.workbook,\n activeSheet,\n columnCount,\n rowCount,\n defaultColumnWidth,\n rowHeight,\n readOnly,\n selection: state.selection,\n editingCell: state.editingCell,\n editValue: state.editValue,\n ...actions,\n canUndo: state.undoStack.length > 0,\n canRedo: state.redoStack.length > 0,\n getColumnWidth,\n isCellSelected,\n isCellActive,\n }),\n [state, activeSheet, columnCount, rowCount, defaultColumnWidth, rowHeight, readOnly, actions, getColumnWidth, isCellSelected, isCellActive],\n );\n\n return (\n <SpreadsheetContext.Provider value={ctx}>\n <div\n data-fancy-sheets=\"\"\n className={cn(\"flex flex-col overflow-hidden\", className)}\n >\n {children}\n </div>\n </SpreadsheetContext.Provider>\n );\n}\n\nSpreadsheetRoot.displayName = \"Spreadsheet\";\n\nexport const Spreadsheet = Object.assign(SpreadsheetRoot, {\n Toolbar: SpreadsheetToolbar,\n Grid: SpreadsheetGrid,\n SheetTabs: SpreadsheetSheetTabs,\n});\n","import type { WorkbookData, SheetData } from \"../types/sheet\";\nimport { createEmptySheet } from \"../types/sheet\";\nimport { toAddress } from \"./cell-utils\";\n\n/** Parse CSV text into a 2D string array */\nexport function parseCSV(text: string): string[][] {\n const rows: string[][] = [];\n let current = \"\";\n let inQuotes = false;\n let row: string[] = [];\n\n for (let i = 0; i < text.length; i++) {\n const ch = text[i];\n\n if (inQuotes) {\n if (ch === '\"' && text[i + 1] === '\"') {\n current += '\"';\n i++;\n } else if (ch === '\"') {\n inQuotes = false;\n } else {\n current += ch;\n }\n } else {\n if (ch === '\"') {\n inQuotes = true;\n } else if (ch === \",\") {\n row.push(current);\n current = \"\";\n } else if (ch === \"\\n\" || (ch === \"\\r\" && text[i + 1] === \"\\n\")) {\n row.push(current);\n current = \"\";\n rows.push(row);\n row = [];\n if (ch === \"\\r\") i++;\n } else {\n current += ch;\n }\n }\n }\n\n row.push(current);\n if (row.some((c) => c !== \"\")) rows.push(row);\n\n return rows;\n}\n\n/** Stringify a 2D array to CSV text */\nexport function stringifyCSV(data: string[][]): string {\n return data\n .map((row) =>\n row\n .map((cell) => {\n if (cell.includes(\",\") || cell.includes('\"') || cell.includes(\"\\n\")) {\n return '\"' + cell.replace(/\"/g, '\"\"') + '\"';\n }\n return cell;\n })\n .join(\",\"),\n )\n .join(\"\\n\");\n}\n\n/** Convert CSV text to a WorkbookData */\nexport function csvToWorkbook(csv: string, sheetName: string = \"Sheet 1\"): WorkbookData {\n const data = parseCSV(csv);\n const sheet = createEmptySheet(\"sheet-1\", sheetName);\n\n for (let r = 0; r < data.length; r++) {\n for (let c = 0; c < data[r].length; c++) {\n const val = data[r][c];\n if (val === \"\") continue;\n const addr = toAddress(r, c);\n const numVal = Number(val);\n sheet.cells[addr] = { value: isNaN(numVal) || val === \"\" ? val : numVal };\n }\n }\n\n return { sheets: [sheet], activeSheetId: sheet.id };\n}\n\n/** Convert WorkbookData active sheet to CSV */\nexport function workbookToCSV(workbook: WorkbookData, sheetId?: string): string {\n const sheet = sheetId\n ? workbook.sheets.find((s) => s.id === sheetId)\n : workbook.sheets.find((s) => s.id === workbook.activeSheetId);\n\n if (!sheet) return \"\";\n\n // Find bounds\n let maxRow = 0;\n let maxCol = 0;\n for (const addr of Object.keys(sheet.cells)) {\n const match = addr.match(/^([A-Z]+)(\\d+)$/);\n if (!match) continue;\n const col = match[1].split(\"\").reduce((acc, ch) => acc * 26 + ch.charCodeAt(0) - 64, 0) - 1;\n const row = parseInt(match[2], 10) - 1;\n maxRow = Math.max(maxRow, row);\n maxCol = Math.max(maxCol, col);\n }\n\n const data: string[][] = [];\n for (let r = 0; r <= maxRow; r++) {\n const row: string[] = [];\n for (let c = 0; c <= maxCol; c++) {\n const addr = toAddress(r, c);\n const cell = sheet.cells[addr];\n if (!cell) {\n row.push(\"\");\n } else if (cell.computedValue !== undefined && cell.computedValue !== null) {\n row.push(String(cell.computedValue));\n } else if (cell.value !== null) {\n row.push(String(cell.value));\n } else {\n row.push(\"\");\n }\n }\n data.push(row);\n }\n\n return stringifyCSV(data);\n}\n"]}
@@ -0,0 +1,189 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ /** Column-letter + row-number string, e.g. "A1", "BC42" */
5
+ type CellAddress = string;
6
+ /** Primitive cell value */
7
+ type CellValue = string | number | boolean | null;
8
+ /** Text alignment */
9
+ type TextAlign = "left" | "center" | "right";
10
+ /** Cell formatting */
11
+ interface CellFormat {
12
+ bold?: boolean;
13
+ italic?: boolean;
14
+ textAlign?: TextAlign;
15
+ }
16
+ /** A single cell's complete data */
17
+ interface CellData {
18
+ /** The raw value (what the user typed) */
19
+ value: CellValue;
20
+ /** Formula string without leading "=", e.g. "SUM(A1:A5)" */
21
+ formula?: string;
22
+ /** Computed value after formula evaluation */
23
+ computedValue?: CellValue;
24
+ /** Display formatting */
25
+ format?: CellFormat;
26
+ }
27
+
28
+ /** Sparse cell map — only stores cells that have data */
29
+ type CellMap = Record<string, CellData>;
30
+ /** Column width overrides (col index -> px) */
31
+ type ColumnWidths = Record<number, number>;
32
+ /** Merged region defined by top-left and bottom-right addresses */
33
+ interface MergedRegion {
34
+ start: string;
35
+ end: string;
36
+ }
37
+ /** A single sheet within a workbook */
38
+ interface SheetData {
39
+ id: string;
40
+ name: string;
41
+ cells: CellMap;
42
+ columnWidths: ColumnWidths;
43
+ mergedRegions: MergedRegion[];
44
+ columnFilters: Record<number, string>;
45
+ sortColumn?: number;
46
+ sortDirection?: "asc" | "desc";
47
+ frozenRows: number;
48
+ frozenCols: number;
49
+ }
50
+ /** The complete workbook */
51
+ interface WorkbookData {
52
+ sheets: SheetData[];
53
+ activeSheetId: string;
54
+ }
55
+ /** Create an empty sheet */
56
+ declare function createEmptySheet(id: string, name: string): SheetData;
57
+ /** Create an empty workbook with one sheet */
58
+ declare function createEmptyWorkbook(): WorkbookData;
59
+
60
+ /** A rectangular range of cells */
61
+ interface CellRange {
62
+ start: string;
63
+ end: string;
64
+ }
65
+ /** Full selection state */
66
+ interface SelectionState {
67
+ /** The anchor cell (where selection started) */
68
+ activeCell: string;
69
+ /** Ranges currently selected (supports multi-select via Ctrl+Click) */
70
+ ranges: CellRange[];
71
+ }
72
+
73
+ interface SpreadsheetProps {
74
+ children: ReactNode;
75
+ className?: string;
76
+ /** Controlled workbook data */
77
+ data?: WorkbookData;
78
+ /** Default data (uncontrolled) */
79
+ defaultData?: WorkbookData;
80
+ /** Called on any data change */
81
+ onChange?: (data: WorkbookData) => void;
82
+ /** Number of columns (default: 26) */
83
+ columnCount?: number;
84
+ /** Number of rows (default: 100) */
85
+ rowCount?: number;
86
+ /** Default column width in px (default: 100) */
87
+ defaultColumnWidth?: number;
88
+ /** Row height in px (default: 28) */
89
+ rowHeight?: number;
90
+ /** Read-only mode */
91
+ readOnly?: boolean;
92
+ }
93
+ interface SpreadsheetContextValue {
94
+ workbook: WorkbookData;
95
+ activeSheet: SheetData;
96
+ columnCount: number;
97
+ rowCount: number;
98
+ defaultColumnWidth: number;
99
+ rowHeight: number;
100
+ readOnly: boolean;
101
+ selection: SelectionState;
102
+ editingCell: string | null;
103
+ editValue: string;
104
+ setCellValue: (address: string, value: string) => void;
105
+ setCellFormat: (addresses: string[], format: Partial<CellFormat>) => void;
106
+ setSelection: (cell: string) => void;
107
+ extendSelection: (cell: string) => void;
108
+ addSelection: (cell: string) => void;
109
+ navigate: (direction: "up" | "down" | "left" | "right", extend?: boolean) => void;
110
+ startEdit: (value?: string) => void;
111
+ updateEdit: (value: string) => void;
112
+ confirmEdit: () => void;
113
+ cancelEdit: () => void;
114
+ resizeColumn: (col: number, width: number) => void;
115
+ addSheet: () => void;
116
+ renameSheet: (sheetId: string, name: string) => void;
117
+ deleteSheet: (sheetId: string) => void;
118
+ setActiveSheet: (sheetId: string) => void;
119
+ undo: () => void;
120
+ redo: () => void;
121
+ canUndo: boolean;
122
+ canRedo: boolean;
123
+ getColumnWidth: (col: number) => number;
124
+ isCellSelected: (address: string) => boolean;
125
+ isCellActive: (address: string) => boolean;
126
+ }
127
+
128
+ interface SpreadsheetGridProps {
129
+ className?: string;
130
+ }
131
+ declare function SpreadsheetGrid({ className }: SpreadsheetGridProps): react_jsx_runtime.JSX.Element;
132
+ declare namespace SpreadsheetGrid {
133
+ var displayName: string;
134
+ }
135
+
136
+ interface SpreadsheetToolbarProps {
137
+ children?: React.ReactNode;
138
+ className?: string;
139
+ }
140
+ declare function SpreadsheetToolbar({ children, className }: SpreadsheetToolbarProps): react_jsx_runtime.JSX.Element;
141
+ declare namespace SpreadsheetToolbar {
142
+ var displayName: string;
143
+ }
144
+
145
+ interface SpreadsheetSheetTabsProps {
146
+ className?: string;
147
+ }
148
+ declare function SpreadsheetSheetTabs({ className }: SpreadsheetSheetTabsProps): react_jsx_runtime.JSX.Element;
149
+ declare namespace SpreadsheetSheetTabs {
150
+ var displayName: string;
151
+ }
152
+
153
+ declare function SpreadsheetRoot({ children, className, data, defaultData, onChange, columnCount, rowCount, defaultColumnWidth, rowHeight, readOnly, }: SpreadsheetProps): react_jsx_runtime.JSX.Element;
154
+ declare namespace SpreadsheetRoot {
155
+ var displayName: string;
156
+ }
157
+ declare const Spreadsheet: typeof SpreadsheetRoot & {
158
+ Toolbar: typeof SpreadsheetToolbar;
159
+ Grid: typeof SpreadsheetGrid;
160
+ SheetTabs: typeof SpreadsheetSheetTabs;
161
+ };
162
+
163
+ declare function useSpreadsheet(): SpreadsheetContextValue;
164
+
165
+ /** Convert 0-based column index to letter(s): 0="A", 25="Z", 26="AA" */
166
+ declare function columnToLetter(col: number): string;
167
+ /** Convert column letter(s) to 0-based index: "A"=0, "Z"=25, "AA"=26 */
168
+ declare function letterToColumn(letters: string): number;
169
+ /** Parse address string to 0-based row and col: "B3" -> { row: 2, col: 1 } */
170
+ declare function parseAddress(addr: string): {
171
+ row: number;
172
+ col: number;
173
+ };
174
+ /** Convert 0-based row and col to address string: (2, 1) -> "B3" */
175
+ declare function toAddress(row: number, col: number): string;
176
+
177
+ /** Parse CSV text into a 2D string array */
178
+ declare function parseCSV(text: string): string[][];
179
+ /** Stringify a 2D array to CSV text */
180
+ declare function stringifyCSV(data: string[][]): string;
181
+ /** Convert CSV text to a WorkbookData */
182
+ declare function csvToWorkbook(csv: string, sheetName?: string): WorkbookData;
183
+ /** Convert WorkbookData active sheet to CSV */
184
+ declare function workbookToCSV(workbook: WorkbookData, sheetId?: string): string;
185
+
186
+ type FormulaRangeFunction = (args: CellValue[][]) => CellValue;
187
+ declare function registerFunction(name: string, fn: FormulaRangeFunction): void;
188
+
189
+ export { type CellAddress, type CellData, type CellFormat, type CellMap, type CellRange, type CellValue, type ColumnWidths, type MergedRegion, type SelectionState, type SheetData, Spreadsheet, type SpreadsheetContextValue, type SpreadsheetProps, type TextAlign, type WorkbookData, columnToLetter, createEmptySheet, createEmptyWorkbook, csvToWorkbook, letterToColumn, parseAddress, parseCSV, registerFunction, stringifyCSV, toAddress, useSpreadsheet, workbookToCSV };