@particle-academy/fancy-sheets 0.1.0 → 0.1.2

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.
@@ -1 +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"]}
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\";\r\nimport type { SpreadsheetContextValue } from \"./Spreadsheet.types\";\r\n\r\nexport const SpreadsheetContext = createContext<SpreadsheetContextValue | null>(null);\r\n\r\nexport function useSpreadsheet(): SpreadsheetContextValue {\r\n const ctx = useContext(SpreadsheetContext);\r\n if (!ctx) {\r\n throw new Error(\"useSpreadsheet must be used within a <Spreadsheet> component\");\r\n }\r\n return ctx;\r\n}\r\n","import type { CellData } from \"./cell\";\r\n\r\n/** Sparse cell map — only stores cells that have data */\r\nexport type CellMap = Record<string, CellData>;\r\n\r\n/** Column width overrides (col index -> px) */\r\nexport type ColumnWidths = Record<number, number>;\r\n\r\n/** Merged region defined by top-left and bottom-right addresses */\r\nexport interface MergedRegion {\r\n start: string;\r\n end: string;\r\n}\r\n\r\n/** A single sheet within a workbook */\r\nexport interface SheetData {\r\n id: string;\r\n name: string;\r\n cells: CellMap;\r\n columnWidths: ColumnWidths;\r\n mergedRegions: MergedRegion[];\r\n columnFilters: Record<number, string>;\r\n sortColumn?: number;\r\n sortDirection?: \"asc\" | \"desc\";\r\n frozenRows: number;\r\n frozenCols: number;\r\n}\r\n\r\n/** The complete workbook */\r\nexport interface WorkbookData {\r\n sheets: SheetData[];\r\n activeSheetId: string;\r\n}\r\n\r\n/** Create an empty sheet */\r\nexport function createEmptySheet(id: string, name: string): SheetData {\r\n return {\r\n id,\r\n name,\r\n cells: {},\r\n columnWidths: {},\r\n mergedRegions: [],\r\n columnFilters: {},\r\n frozenRows: 0,\r\n frozenCols: 0,\r\n };\r\n}\r\n\r\n/** Create an empty workbook with one sheet */\r\nexport function createEmptyWorkbook(): WorkbookData {\r\n const sheet = createEmptySheet(\"sheet-1\", \"Sheet 1\");\r\n return {\r\n sheets: [sheet],\r\n activeSheetId: sheet.id,\r\n };\r\n}\r\n","/** Convert 0-based column index to letter(s): 0=\"A\", 25=\"Z\", 26=\"AA\" */\r\nexport function columnToLetter(col: number): string {\r\n let result = \"\";\r\n let c = col;\r\n while (c >= 0) {\r\n result = String.fromCharCode((c % 26) + 65) + result;\r\n c = Math.floor(c / 26) - 1;\r\n }\r\n return result;\r\n}\r\n\r\n/** Convert column letter(s) to 0-based index: \"A\"=0, \"Z\"=25, \"AA\"=26 */\r\nexport function letterToColumn(letters: string): number {\r\n let result = 0;\r\n for (let i = 0; i < letters.length; i++) {\r\n result = result * 26 + (letters.charCodeAt(i) - 64);\r\n }\r\n return result - 1;\r\n}\r\n\r\n/** Parse address string to 0-based row and col: \"B3\" -> { row: 2, col: 1 } */\r\nexport function parseAddress(addr: string): { row: number; col: number } {\r\n const match = addr.match(/^([A-Z]+)(\\d+)$/);\r\n if (!match) return { row: 0, col: 0 };\r\n return {\r\n col: letterToColumn(match[1]),\r\n row: parseInt(match[2], 10) - 1,\r\n };\r\n}\r\n\r\n/** Convert 0-based row and col to address string: (2, 1) -> \"B3\" */\r\nexport function toAddress(row: number, col: number): string {\r\n return columnToLetter(col) + (row + 1);\r\n}\r\n\r\n/** Check if a string is a valid cell address */\r\nexport function isValidAddress(addr: string): boolean {\r\n return /^[A-Z]+\\d+$/.test(addr);\r\n}\r\n\r\n/** Expand a range into an array of addresses */\r\nexport function expandRange(startAddr: string, endAddr: string): string[] {\r\n const s = parseAddress(startAddr);\r\n const e = parseAddress(endAddr);\r\n const minRow = Math.min(s.row, e.row);\r\n const maxRow = Math.max(s.row, e.row);\r\n const minCol = Math.min(s.col, e.col);\r\n const maxCol = Math.max(s.col, e.col);\r\n const addresses: string[] = [];\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n addresses.push(toAddress(r, c));\r\n }\r\n }\r\n return addresses;\r\n}\r\n\r\n/** Normalize a range so start is top-left and end is bottom-right */\r\nexport function normalizeRange(startAddr: string, endAddr: string): { start: string; end: string } {\r\n const s = parseAddress(startAddr);\r\n const e = parseAddress(endAddr);\r\n return {\r\n start: toAddress(Math.min(s.row, e.row), Math.min(s.col, e.col)),\r\n end: toAddress(Math.max(s.row, e.row), Math.max(s.col, e.col)),\r\n };\r\n}\r\n\r\n/** Offset an address by row/col deltas */\r\nexport function offsetAddress(addr: string, rowDelta: number, colDelta: number): string {\r\n const { row, col } = parseAddress(addr);\r\n return toAddress(row + rowDelta, col + colDelta);\r\n}\r\n","import type { FormulaToken, FormulaTokenType } from \"../../types/formula\";\r\n\r\nexport function lexFormula(input: string): FormulaToken[] {\r\n const tokens: FormulaToken[] = [];\r\n const len = input.length;\r\n let i = 0;\r\n\r\n while (i < len) {\r\n const ch = input[i];\r\n\r\n // Whitespace\r\n if (ch === \" \" || ch === \"\\t\") { i++; continue; }\r\n\r\n // Number\r\n if ((ch >= \"0\" && ch <= \"9\") || (ch === \".\" && i + 1 < len && input[i + 1] >= \"0\" && input[i + 1] <= \"9\")) {\r\n const pos = i;\r\n while (i < len && ((input[i] >= \"0\" && input[i] <= \"9\") || input[i] === \".\")) i++;\r\n if (i < len && (input[i] === \"e\" || input[i] === \"E\")) {\r\n i++;\r\n if (i < len && (input[i] === \"+\" || input[i] === \"-\")) i++;\r\n while (i < len && input[i] >= \"0\" && input[i] <= \"9\") i++;\r\n }\r\n tokens.push({ type: \"number\", value: input.slice(pos, i), position: pos });\r\n continue;\r\n }\r\n\r\n // String\r\n if (ch === '\"') {\r\n const pos = i;\r\n i++;\r\n while (i < len && input[i] !== '\"') {\r\n if (input[i] === \"\\\\\") i++;\r\n i++;\r\n }\r\n i++; // closing quote\r\n tokens.push({ type: \"string\", value: input.slice(pos + 1, i - 1), position: pos });\r\n continue;\r\n }\r\n\r\n // Identifier (cell ref, range ref, function name, or boolean)\r\n if ((ch >= \"A\" && ch <= \"Z\") || (ch >= \"a\" && ch <= \"z\") || ch === \"_\") {\r\n const pos = i;\r\n i++;\r\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++;\r\n const word = input.slice(pos, i);\r\n\r\n // Boolean\r\n if (word.toUpperCase() === \"TRUE\" || word.toUpperCase() === \"FALSE\") {\r\n tokens.push({ type: \"boolean\", value: word.toUpperCase(), position: pos });\r\n continue;\r\n }\r\n\r\n // Check for range ref: CELLREF:CELLREF\r\n if (i < len && input[i] === \":\") {\r\n const colonPos = i;\r\n i++;\r\n const rangeStart = i;\r\n while (i < len && ((input[i] >= \"A\" && input[i] <= \"Z\") || (input[i] >= \"a\" && input[i] <= \"z\") || (input[i] >= \"0\" && input[i] <= \"9\"))) i++;\r\n if (i > rangeStart) {\r\n tokens.push({ type: \"rangeRef\", value: word + \":\" + input.slice(rangeStart, i), position: pos });\r\n continue;\r\n }\r\n // Not a range, backtrack\r\n i = colonPos;\r\n }\r\n\r\n // Check if it's a function call (followed by parenthesis)\r\n let j = i;\r\n while (j < len && input[j] === \" \") j++;\r\n if (j < len && input[j] === \"(\") {\r\n tokens.push({ type: \"function\", value: word.toUpperCase(), position: pos });\r\n continue;\r\n }\r\n\r\n // Cell reference (letters + digits)\r\n if (/^[A-Z]+\\d+$/i.test(word)) {\r\n tokens.push({ type: \"cellRef\", value: word.toUpperCase(), position: pos });\r\n continue;\r\n }\r\n\r\n // Unknown identifier — treat as cell ref\r\n tokens.push({ type: \"cellRef\", value: word.toUpperCase(), position: pos });\r\n continue;\r\n }\r\n\r\n // Operators\r\n if (ch === \"+\" || ch === \"-\" || ch === \"*\" || ch === \"/\" || ch === \"^\" || ch === \"&\") {\r\n tokens.push({ type: \"operator\", value: ch, position: i });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Comparison operators\r\n if (ch === \"=\" || ch === \"<\" || ch === \">\") {\r\n const pos = i;\r\n i++;\r\n if (i < len && (input[i] === \"=\" || input[i] === \">\")) i++;\r\n tokens.push({ type: \"operator\", value: input.slice(pos, i), position: pos });\r\n continue;\r\n }\r\n\r\n // Parentheses\r\n if (ch === \"(\" || ch === \")\") {\r\n tokens.push({ type: \"paren\", value: ch, position: i });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Comma\r\n if (ch === \",\") {\r\n tokens.push({ type: \"comma\", value: \",\", position: i });\r\n i++;\r\n continue;\r\n }\r\n\r\n // Skip unknown\r\n i++;\r\n }\r\n\r\n return tokens;\r\n}\r\n","import type { FormulaToken, FormulaASTNode } from \"../../types/formula\";\r\n\r\n/**\r\n * Recursive descent parser for spreadsheet formulas.\r\n * Operator precedence (low to high):\r\n * 1. Comparison: =, <>, <, >, <=, >=\r\n * 2. String concatenation: &\r\n * 3. Addition/subtraction: +, -\r\n * 4. Multiplication/division: *, /\r\n * 5. Exponentiation: ^\r\n * 6. Unary: -, +\r\n * 7. Atoms: number, string, boolean, cellRef, rangeRef, function call, (expr)\r\n */\r\nexport function parseFormula(tokens: FormulaToken[]): FormulaASTNode {\r\n let pos = 0;\r\n\r\n function peek(): FormulaToken | undefined {\r\n return tokens[pos];\r\n }\r\n\r\n function advance(): FormulaToken {\r\n return tokens[pos++];\r\n }\r\n\r\n function expect(type: string, value?: string): FormulaToken {\r\n const t = advance();\r\n if (!t || t.type !== type || (value !== undefined && t.value !== value)) {\r\n throw new Error(`Expected ${type}${value ? ` '${value}'` : \"\"} at position ${t?.position ?? pos}`);\r\n }\r\n return t;\r\n }\r\n\r\n // Precedence levels\r\n function parseExpression(): FormulaASTNode {\r\n return parseComparison();\r\n }\r\n\r\n function parseComparison(): FormulaASTNode {\r\n let left = parseConcatenation();\r\n while (peek() && peek()!.type === \"operator\" && [\"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"].includes(peek()!.value)) {\r\n const op = advance().value;\r\n const right = parseConcatenation();\r\n left = { type: \"binaryOp\", operator: op, left, right };\r\n }\r\n return left;\r\n }\r\n\r\n function parseConcatenation(): FormulaASTNode {\r\n let left = parseAddition();\r\n while (peek() && peek()!.type === \"operator\" && peek()!.value === \"&\") {\r\n advance();\r\n const right = parseAddition();\r\n left = { type: \"binaryOp\", operator: \"&\", left, right };\r\n }\r\n return left;\r\n }\r\n\r\n function parseAddition(): FormulaASTNode {\r\n let left = parseMultiplication();\r\n while (peek() && peek()!.type === \"operator\" && (peek()!.value === \"+\" || peek()!.value === \"-\")) {\r\n const op = advance().value;\r\n const right = parseMultiplication();\r\n left = { type: \"binaryOp\", operator: op, left, right };\r\n }\r\n return left;\r\n }\r\n\r\n function parseMultiplication(): FormulaASTNode {\r\n let left = parseExponentiation();\r\n while (peek() && peek()!.type === \"operator\" && (peek()!.value === \"*\" || peek()!.value === \"/\")) {\r\n const op = advance().value;\r\n const right = parseExponentiation();\r\n left = { type: \"binaryOp\", operator: op, left, right };\r\n }\r\n return left;\r\n }\r\n\r\n function parseExponentiation(): FormulaASTNode {\r\n let left = parseUnary();\r\n while (peek() && peek()!.type === \"operator\" && peek()!.value === \"^\") {\r\n advance();\r\n const right = parseUnary();\r\n left = { type: \"binaryOp\", operator: \"^\", left, right };\r\n }\r\n return left;\r\n }\r\n\r\n function parseUnary(): FormulaASTNode {\r\n if (peek() && peek()!.type === \"operator\" && (peek()!.value === \"-\" || peek()!.value === \"+\")) {\r\n const op = advance().value;\r\n const operand = parseUnary();\r\n return { type: \"unaryOp\", operator: op, operand };\r\n }\r\n return parseAtom();\r\n }\r\n\r\n function parseAtom(): FormulaASTNode {\r\n const t = peek();\r\n if (!t) throw new Error(\"Unexpected end of formula\");\r\n\r\n // Number\r\n if (t.type === \"number\") {\r\n advance();\r\n return { type: \"number\", value: parseFloat(t.value) };\r\n }\r\n\r\n // String\r\n if (t.type === \"string\") {\r\n advance();\r\n return { type: \"string\", value: t.value };\r\n }\r\n\r\n // Boolean\r\n if (t.type === \"boolean\") {\r\n advance();\r\n return { type: \"boolean\", value: t.value === \"TRUE\" };\r\n }\r\n\r\n // Range reference (A1:B5)\r\n if (t.type === \"rangeRef\") {\r\n advance();\r\n const parts = t.value.split(\":\");\r\n return { type: \"rangeRef\", start: parts[0], end: parts[1] };\r\n }\r\n\r\n // Function call\r\n if (t.type === \"function\") {\r\n const name = advance().value;\r\n expect(\"paren\", \"(\");\r\n const args: FormulaASTNode[] = [];\r\n if (peek() && !(peek()!.type === \"paren\" && peek()!.value === \")\")) {\r\n args.push(parseExpression());\r\n while (peek() && peek()!.type === \"comma\") {\r\n advance();\r\n args.push(parseExpression());\r\n }\r\n }\r\n expect(\"paren\", \")\");\r\n return { type: \"functionCall\", name, args };\r\n }\r\n\r\n // Cell reference\r\n if (t.type === \"cellRef\") {\r\n advance();\r\n return { type: \"cellRef\", address: t.value };\r\n }\r\n\r\n // Parenthesized expression\r\n if (t.type === \"paren\" && t.value === \"(\") {\r\n advance();\r\n const expr = parseExpression();\r\n expect(\"paren\", \")\");\r\n return expr;\r\n }\r\n\r\n throw new Error(`Unexpected token '${t.value}' at position ${t.position}`);\r\n }\r\n\r\n const ast = parseExpression();\r\n return ast;\r\n}\r\n","import type { CellValue } from \"../../../types/cell\";\r\n\r\nexport type FormulaFunction = (...args: CellValue[]) => CellValue;\r\nexport type FormulaRangeFunction = (args: CellValue[][]) => CellValue;\r\n\r\ninterface FunctionEntry {\r\n fn: FormulaRangeFunction;\r\n}\r\n\r\nconst functionRegistry = new Map<string, FunctionEntry>();\r\n\r\nexport function registerFunction(name: string, fn: FormulaRangeFunction): void {\r\n functionRegistry.set(name.toUpperCase(), { fn });\r\n}\r\n\r\nexport function getFunction(name: string): FunctionEntry | undefined {\r\n return functionRegistry.get(name.toUpperCase());\r\n}\r\n","import { registerFunction } from \"./registry\";\r\nimport type { CellValue } from \"../../../types/cell\";\r\n\r\nfunction toNumbers(args: CellValue[][]): number[] {\r\n const nums: number[] = [];\r\n for (const group of args) {\r\n for (const v of group) {\r\n if (typeof v === \"number\") nums.push(v);\r\n else if (typeof v === \"string\" && v !== \"\" && !isNaN(Number(v))) nums.push(Number(v));\r\n }\r\n }\r\n return nums;\r\n}\r\n\r\nregisterFunction(\"SUM\", (args) => {\r\n return toNumbers(args).reduce((a, b) => a + b, 0);\r\n});\r\n\r\nregisterFunction(\"AVERAGE\", (args) => {\r\n const nums = toNumbers(args);\r\n if (nums.length === 0) return 0;\r\n return nums.reduce((a, b) => a + b, 0) / nums.length;\r\n});\r\n\r\nregisterFunction(\"MIN\", (args) => {\r\n const nums = toNumbers(args);\r\n if (nums.length === 0) return 0;\r\n return Math.min(...nums);\r\n});\r\n\r\nregisterFunction(\"MAX\", (args) => {\r\n const nums = toNumbers(args);\r\n if (nums.length === 0) return 0;\r\n return Math.max(...nums);\r\n});\r\n\r\nregisterFunction(\"COUNT\", (args) => {\r\n return toNumbers(args).length;\r\n});\r\n\r\nregisterFunction(\"ROUND\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const decimals = typeof flat[1] === \"number\" ? flat[1] : (flat[1] != null ? Number(flat[1]) : 0);\r\n if (isNaN(num)) return \"#VALUE!\";\r\n return Math.round(num * Math.pow(10, decimals)) / Math.pow(10, decimals);\r\n});\r\n\r\nregisterFunction(\"ABS\", (args) => {\r\n const val = args.flat()[0];\r\n const num = typeof val === \"number\" ? val : Number(val);\r\n if (isNaN(num)) return \"#VALUE!\";\r\n return Math.abs(num);\r\n});\r\n","import { registerFunction } from \"./registry\";\r\n\r\nregisterFunction(\"UPPER\", (args) => {\r\n const val = args.flat()[0];\r\n return val != null ? String(val).toUpperCase() : \"\";\r\n});\r\n\r\nregisterFunction(\"LOWER\", (args) => {\r\n const val = args.flat()[0];\r\n return val != null ? String(val).toLowerCase() : \"\";\r\n});\r\n\r\nregisterFunction(\"LEN\", (args) => {\r\n const val = args.flat()[0];\r\n return val != null ? String(val).length : 0;\r\n});\r\n\r\nregisterFunction(\"TRIM\", (args) => {\r\n const val = args.flat()[0];\r\n return val != null ? String(val).trim() : \"\";\r\n});\r\n\r\nregisterFunction(\"CONCAT\", (args) => {\r\n return args.flat().map((v) => (v != null ? String(v) : \"\")).join(\"\");\r\n});\r\n","import { registerFunction } from \"./registry\";\r\nimport type { CellValue } from \"../../../types/cell\";\r\n\r\nfunction toBool(v: CellValue): boolean {\r\n if (typeof v === \"boolean\") return v;\r\n if (typeof v === \"number\") return v !== 0;\r\n if (typeof v === \"string\") return v.toUpperCase() === \"TRUE\";\r\n return false;\r\n}\r\n\r\nregisterFunction(\"IF\", (args) => {\r\n const flat = args.flat();\r\n const condition = toBool(flat[0]);\r\n const trueVal = flat[1] ?? true;\r\n const falseVal = flat[2] ?? false;\r\n return condition ? trueVal : falseVal;\r\n});\r\n\r\nregisterFunction(\"AND\", (args) => {\r\n return args.flat().every(toBool);\r\n});\r\n\r\nregisterFunction(\"OR\", (args) => {\r\n return args.flat().some(toBool);\r\n});\r\n\r\nregisterFunction(\"NOT\", (args) => {\r\n return !toBool(args.flat()[0]);\r\n});\r\n","import type { FormulaASTNode } from \"../../types/formula\";\r\nimport type { CellValue } from \"../../types/cell\";\r\nimport { getFunction } from \"./functions/registry\";\r\nimport { parseAddress, toAddress } from \"../cell-utils\";\r\n\r\n// Import side-effect function registrations\r\nimport \"./functions/math\";\r\nimport \"./functions/text\";\r\nimport \"./functions/logic\";\r\n\r\nexport type CellValueGetter = (address: string) => CellValue;\r\nexport type RangeValueGetter = (start: string, end: string) => CellValue[];\r\n\r\nexport function evaluateAST(\r\n node: FormulaASTNode,\r\n getCellValue: CellValueGetter,\r\n getRangeValues: RangeValueGetter,\r\n): CellValue {\r\n switch (node.type) {\r\n case \"number\":\r\n return node.value;\r\n case \"string\":\r\n return node.value;\r\n case \"boolean\":\r\n return node.value;\r\n\r\n case \"cellRef\":\r\n return getCellValue(node.address);\r\n\r\n case \"rangeRef\":\r\n // Ranges by themselves return the first value (used in non-function context)\r\n const vals = getRangeValues(node.start, node.end);\r\n return vals[0] ?? null;\r\n\r\n case \"functionCall\": {\r\n const entry = getFunction(node.name);\r\n if (!entry) return `#NAME?`;\r\n\r\n // Evaluate args — range refs pass as arrays, everything else as single-element arrays\r\n const argValues: CellValue[][] = node.args.map((arg) => {\r\n if (arg.type === \"rangeRef\") {\r\n return getRangeValues(arg.start, arg.end);\r\n }\r\n const val = evaluateAST(arg, getCellValue, getRangeValues);\r\n return [val];\r\n });\r\n\r\n try {\r\n return entry.fn(argValues);\r\n } catch {\r\n return \"#ERROR!\";\r\n }\r\n }\r\n\r\n case \"binaryOp\": {\r\n const left = evaluateAST(node.left, getCellValue, getRangeValues);\r\n const right = evaluateAST(node.right, getCellValue, getRangeValues);\r\n\r\n const lNum = typeof left === \"number\" ? left : Number(left);\r\n const rNum = typeof right === \"number\" ? right : Number(right);\r\n\r\n switch (node.operator) {\r\n case \"+\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum + rNum;\r\n case \"-\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum - rNum;\r\n case \"*\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum * rNum;\r\n case \"/\": return rNum === 0 ? \"#DIV/0!\" : (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : lNum / rNum;\r\n case \"^\": return (isNaN(lNum) || isNaN(rNum)) ? \"#VALUE!\" : Math.pow(lNum, rNum);\r\n case \"&\": return String(left ?? \"\") + String(right ?? \"\");\r\n case \"=\": return left === right;\r\n case \"<>\": return left !== right;\r\n case \"<\": return lNum < rNum;\r\n case \">\": return lNum > rNum;\r\n case \"<=\": return lNum <= rNum;\r\n case \">=\": return lNum >= rNum;\r\n default: return \"#ERROR!\";\r\n }\r\n }\r\n\r\n case \"unaryOp\": {\r\n const operand = evaluateAST(node.operand, getCellValue, getRangeValues);\r\n const num = typeof operand === \"number\" ? operand : Number(operand);\r\n if (isNaN(num)) return \"#VALUE!\";\r\n return node.operator === \"-\" ? -num : num;\r\n }\r\n\r\n default:\r\n return \"#ERROR!\";\r\n }\r\n}\r\n","import { parseAddress, toAddress } from \"../cell-utils\";\r\nimport type { FormulaASTNode } from \"../../types/formula\";\r\n\r\n/** Extract all cell references from an AST node */\r\nexport function extractReferences(node: FormulaASTNode): string[] {\r\n const refs: string[] = [];\r\n\r\n function walk(n: FormulaASTNode): void {\r\n switch (n.type) {\r\n case \"cellRef\":\r\n refs.push(n.address);\r\n break;\r\n case \"rangeRef\": {\r\n const s = parseAddress(n.start);\r\n const e = parseAddress(n.end);\r\n const minRow = Math.min(s.row, e.row);\r\n const maxRow = Math.max(s.row, e.row);\r\n const minCol = Math.min(s.col, e.col);\r\n const maxCol = Math.max(s.col, e.col);\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n refs.push(toAddress(r, c));\r\n }\r\n }\r\n break;\r\n }\r\n case \"functionCall\":\r\n n.args.forEach(walk);\r\n break;\r\n case \"binaryOp\":\r\n walk(n.left);\r\n walk(n.right);\r\n break;\r\n case \"unaryOp\":\r\n walk(n.operand);\r\n break;\r\n }\r\n }\r\n\r\n walk(node);\r\n return refs;\r\n}\r\n","import type { CellMap } from \"../../types/sheet\";\r\nimport { lexFormula } from \"./lexer\";\r\nimport { parseFormula } from \"./parser\";\r\nimport { extractReferences } from \"./references\";\r\n\r\n/** Build a dependency graph: cell -> cells it depends on */\r\nexport function buildDependencyGraph(cells: CellMap): Map<string, Set<string>> {\r\n const graph = new Map<string, Set<string>>();\r\n\r\n for (const [addr, cell] of Object.entries(cells)) {\r\n if (!cell.formula) continue;\r\n try {\r\n const tokens = lexFormula(cell.formula);\r\n const ast = parseFormula(tokens);\r\n const refs = extractReferences(ast);\r\n graph.set(addr, new Set(refs));\r\n } catch {\r\n graph.set(addr, new Set());\r\n }\r\n }\r\n\r\n return graph;\r\n}\r\n\r\n/** Detect circular references using DFS */\r\nexport function detectCircularRefs(graph: Map<string, Set<string>>): Set<string> {\r\n const circular = new Set<string>();\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n\r\n function dfs(node: string): boolean {\r\n if (inStack.has(node)) return true;\r\n if (visited.has(node)) return false;\r\n\r\n visited.add(node);\r\n inStack.add(node);\r\n\r\n const deps = graph.get(node);\r\n if (deps) {\r\n for (const dep of deps) {\r\n if (dfs(dep)) {\r\n circular.add(node);\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n inStack.delete(node);\r\n return false;\r\n }\r\n\r\n for (const node of graph.keys()) {\r\n dfs(node);\r\n }\r\n\r\n return circular;\r\n}\r\n\r\n/** Get cells that need recalculation in topological order */\r\nexport function getRecalculationOrder(graph: Map<string, Set<string>>): string[] {\r\n const visited = new Set<string>();\r\n const order: string[] = [];\r\n\r\n function visit(node: string): void {\r\n if (visited.has(node)) return;\r\n visited.add(node);\r\n\r\n const deps = graph.get(node);\r\n if (deps) {\r\n for (const dep of deps) {\r\n visit(dep);\r\n }\r\n }\r\n\r\n order.push(node);\r\n }\r\n\r\n for (const node of graph.keys()) {\r\n visit(node);\r\n }\r\n\r\n return order;\r\n}\r\n","import { useReducer, useCallback, useMemo } from \"react\";\r\nimport type { CellValue, CellData, CellFormat } from \"../types/cell\";\r\nimport type { WorkbookData, SheetData } from \"../types/sheet\";\r\nimport type { SelectionState, CellRange } from \"../types/selection\";\r\nimport { createEmptyWorkbook, createEmptySheet } from \"../types/sheet\";\r\nimport { parseAddress, toAddress, expandRange } from \"../engine/cell-utils\";\r\nimport { lexFormula } from \"../engine/formula/lexer\";\r\nimport { parseFormula } from \"../engine/formula/parser\";\r\nimport { evaluateAST } from \"../engine/formula/evaluator\";\r\nimport { buildDependencyGraph, detectCircularRefs, getRecalculationOrder } from \"../engine/formula/dependency-graph\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// State\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface SpreadsheetState {\r\n workbook: WorkbookData;\r\n selection: SelectionState;\r\n editingCell: string | null;\r\n editValue: string;\r\n undoStack: WorkbookData[];\r\n redoStack: WorkbookData[];\r\n}\r\n\r\nfunction recalculateWorkbook(workbook: WorkbookData): WorkbookData {\r\n return {\r\n ...workbook,\r\n sheets: workbook.sheets.map(recalculateSheet),\r\n };\r\n}\r\n\r\nfunction createInitialState(data?: WorkbookData): SpreadsheetState {\r\n const workbook = data ?? createEmptyWorkbook();\r\n return {\r\n workbook: recalculateWorkbook(workbook),\r\n selection: { activeCell: \"A1\", ranges: [{ start: \"A1\", end: \"A1\" }] },\r\n editingCell: null,\r\n editValue: \"\",\r\n undoStack: [],\r\n redoStack: [],\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Actions\r\n// ---------------------------------------------------------------------------\r\n\r\ntype Action =\r\n | { type: \"SET_CELL_VALUE\"; address: string; value: string }\r\n | { type: \"SET_CELL_FORMAT\"; addresses: string[]; format: Partial<CellFormat> }\r\n | { type: \"SET_SELECTION\"; cell: string }\r\n | { type: \"EXTEND_SELECTION\"; cell: string }\r\n | { type: \"ADD_SELECTION\"; cell: string }\r\n | { type: \"SELECT_RANGE\"; start: string; end: string }\r\n | { type: \"NAVIGATE\"; direction: \"up\" | \"down\" | \"left\" | \"right\"; extend?: boolean }\r\n | { type: \"START_EDIT\"; value?: string }\r\n | { type: \"UPDATE_EDIT\"; value: string }\r\n | { type: \"CONFIRM_EDIT\" }\r\n | { type: \"CANCEL_EDIT\" }\r\n | { type: \"RESIZE_COLUMN\"; col: number; width: number }\r\n | { type: \"ADD_SHEET\" }\r\n | { type: \"RENAME_SHEET\"; sheetId: string; name: string }\r\n | { type: \"DELETE_SHEET\"; sheetId: string }\r\n | { type: \"SET_ACTIVE_SHEET\"; sheetId: string }\r\n | { type: \"UNDO\" }\r\n | { type: \"REDO\" }\r\n | { type: \"SET_WORKBOOK\"; workbook: WorkbookData };\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction getActiveSheet(state: SpreadsheetState): SheetData {\r\n return state.workbook.sheets.find((s) => s.id === state.workbook.activeSheetId)!;\r\n}\r\n\r\nfunction updateActiveSheet(state: SpreadsheetState, updater: (sheet: SheetData) => SheetData): WorkbookData {\r\n return {\r\n ...state.workbook,\r\n sheets: state.workbook.sheets.map((s) =>\r\n s.id === state.workbook.activeSheetId ? updater(s) : s,\r\n ),\r\n };\r\n}\r\n\r\nfunction pushUndo(state: SpreadsheetState): { undoStack: WorkbookData[]; redoStack: WorkbookData[] } {\r\n const stack = [...state.undoStack, state.workbook];\r\n if (stack.length > 50) stack.shift();\r\n return { undoStack: stack, redoStack: [] };\r\n}\r\n\r\n/** Recalculate all formula cells in a sheet */\r\nfunction recalculateSheet(sheet: SheetData): SheetData {\r\n const graph = buildDependencyGraph(sheet.cells);\r\n if (graph.size === 0) return sheet;\r\n\r\n const circular = detectCircularRefs(graph);\r\n const order = getRecalculationOrder(graph);\r\n const cells = { ...sheet.cells };\r\n\r\n const getCellValue = (addr: string): CellValue => {\r\n const c = cells[addr];\r\n if (!c) return null;\r\n if (c.formula && c.computedValue !== undefined) return c.computedValue;\r\n return c.value;\r\n };\r\n\r\n const getRangeValues = (startAddr: string, endAddr: string): CellValue[] => {\r\n const addresses = expandRange(startAddr, endAddr);\r\n return addresses.map(getCellValue);\r\n };\r\n\r\n for (const addr of order) {\r\n const cell = cells[addr];\r\n if (!cell?.formula) continue;\r\n\r\n if (circular.has(addr)) {\r\n cells[addr] = { ...cell, computedValue: \"#CIRC!\" };\r\n continue;\r\n }\r\n\r\n try {\r\n const tokens = lexFormula(cell.formula);\r\n const ast = parseFormula(tokens);\r\n const result = evaluateAST(ast, getCellValue, getRangeValues);\r\n cells[addr] = { ...cell, computedValue: result };\r\n } catch {\r\n cells[addr] = { ...cell, computedValue: \"#ERROR!\" };\r\n }\r\n }\r\n\r\n return { ...sheet, cells };\r\n}\r\n\r\nfunction getCellDisplayValue(cell: CellData | undefined): string {\r\n if (!cell) return \"\";\r\n if (cell.computedValue !== undefined) return String(cell.computedValue);\r\n if (cell.value === null) return \"\";\r\n return String(cell.value);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Reducer\r\n// ---------------------------------------------------------------------------\r\n\r\nfunction reducer(state: SpreadsheetState, action: Action): SpreadsheetState {\r\n switch (action.type) {\r\n case \"SET_CELL_VALUE\": {\r\n const history = pushUndo(state);\r\n const isFormula = action.value.startsWith(\"=\");\r\n const cellData: CellData = isFormula\r\n ? { value: action.value, formula: action.value.slice(1), computedValue: null }\r\n : { value: isNaN(Number(action.value)) || action.value === \"\" ? action.value : Number(action.value) };\r\n\r\n // Preserve existing format\r\n const sheet = getActiveSheet(state);\r\n const existing = sheet.cells[action.address];\r\n if (existing?.format) cellData.format = existing.format;\r\n\r\n const workbook = updateActiveSheet(state, (s) => {\r\n const updated = { ...s, cells: { ...s.cells, [action.address]: cellData } };\r\n return recalculateSheet(updated);\r\n });\r\n\r\n return { ...state, workbook, ...history };\r\n }\r\n\r\n case \"SET_CELL_FORMAT\": {\r\n const history = pushUndo(state);\r\n const workbook = updateActiveSheet(state, (s) => {\r\n const cells = { ...s.cells };\r\n for (const addr of action.addresses) {\r\n const existing = cells[addr] ?? { value: null };\r\n cells[addr] = { ...existing, format: { ...existing.format, ...action.format } };\r\n }\r\n return { ...s, cells };\r\n });\r\n return { ...state, workbook, ...history };\r\n }\r\n\r\n case \"SET_SELECTION\":\r\n return {\r\n ...state,\r\n selection: {\r\n activeCell: action.cell,\r\n ranges: [{ start: action.cell, end: action.cell }],\r\n },\r\n editingCell: null,\r\n };\r\n\r\n case \"EXTEND_SELECTION\":\r\n return {\r\n ...state,\r\n selection: {\r\n ...state.selection,\r\n ranges: [\r\n { start: state.selection.activeCell, end: action.cell },\r\n ...state.selection.ranges.slice(1),\r\n ],\r\n },\r\n };\r\n\r\n case \"ADD_SELECTION\":\r\n return {\r\n ...state,\r\n selection: {\r\n activeCell: action.cell,\r\n ranges: [...state.selection.ranges, { start: action.cell, end: action.cell }],\r\n },\r\n };\r\n\r\n case \"SELECT_RANGE\":\r\n return {\r\n ...state,\r\n selection: {\r\n activeCell: action.start,\r\n ranges: [{ start: action.start, end: action.end }],\r\n },\r\n };\r\n\r\n case \"NAVIGATE\": {\r\n const { row, col } = parseAddress(state.selection.activeCell);\r\n let newRow = row;\r\n let newCol = col;\r\n switch (action.direction) {\r\n case \"up\": newRow = Math.max(0, row - 1); break;\r\n case \"down\": newRow = row + 1; break;\r\n case \"left\": newCol = Math.max(0, col - 1); break;\r\n case \"right\": newCol = col + 1; break;\r\n }\r\n const newAddr = toAddress(newRow, newCol);\r\n if (action.extend) {\r\n return {\r\n ...state,\r\n selection: {\r\n ...state.selection,\r\n ranges: [\r\n { start: state.selection.activeCell, end: newAddr },\r\n ...state.selection.ranges.slice(1),\r\n ],\r\n },\r\n };\r\n }\r\n return {\r\n ...state,\r\n selection: { activeCell: newAddr, ranges: [{ start: newAddr, end: newAddr }] },\r\n editingCell: null,\r\n };\r\n }\r\n\r\n case \"START_EDIT\": {\r\n const sheet = getActiveSheet(state);\r\n const cell = sheet.cells[state.selection.activeCell];\r\n const initialValue = action.value ?? (cell?.formula ? \"=\" + cell.formula : getCellDisplayValue(cell));\r\n return { ...state, editingCell: state.selection.activeCell, editValue: initialValue };\r\n }\r\n\r\n case \"UPDATE_EDIT\":\r\n return { ...state, editValue: action.value };\r\n\r\n case \"CONFIRM_EDIT\": {\r\n if (!state.editingCell) return state;\r\n const newState = reducer(state, { type: \"SET_CELL_VALUE\", address: state.editingCell, value: state.editValue });\r\n // Move down after confirm\r\n const { row, col } = parseAddress(state.editingCell);\r\n const nextAddr = toAddress(row + 1, col);\r\n return {\r\n ...newState,\r\n editingCell: null,\r\n editValue: \"\",\r\n selection: { activeCell: nextAddr, ranges: [{ start: nextAddr, end: nextAddr }] },\r\n };\r\n }\r\n\r\n case \"CANCEL_EDIT\":\r\n return { ...state, editingCell: null, editValue: \"\" };\r\n\r\n case \"RESIZE_COLUMN\": {\r\n const workbook = updateActiveSheet(state, (s) => ({\r\n ...s,\r\n columnWidths: { ...s.columnWidths, [action.col]: Math.max(30, action.width) },\r\n }));\r\n return { ...state, workbook };\r\n }\r\n\r\n case \"ADD_SHEET\": {\r\n const id = `sheet-${Date.now()}`;\r\n const num = state.workbook.sheets.length + 1;\r\n const sheet = createEmptySheet(id, `Sheet ${num}`);\r\n return {\r\n ...state,\r\n workbook: {\r\n sheets: [...state.workbook.sheets, sheet],\r\n activeSheetId: id,\r\n },\r\n };\r\n }\r\n\r\n case \"RENAME_SHEET\":\r\n return {\r\n ...state,\r\n workbook: {\r\n ...state.workbook,\r\n sheets: state.workbook.sheets.map((s) =>\r\n s.id === action.sheetId ? { ...s, name: action.name } : s,\r\n ),\r\n },\r\n };\r\n\r\n case \"DELETE_SHEET\": {\r\n if (state.workbook.sheets.length <= 1) return state;\r\n const remaining = state.workbook.sheets.filter((s) => s.id !== action.sheetId);\r\n const activeId = state.workbook.activeSheetId === action.sheetId\r\n ? remaining[0].id\r\n : state.workbook.activeSheetId;\r\n return {\r\n ...state,\r\n workbook: { sheets: remaining, activeSheetId: activeId },\r\n };\r\n }\r\n\r\n case \"SET_ACTIVE_SHEET\":\r\n return {\r\n ...state,\r\n workbook: { ...state.workbook, activeSheetId: action.sheetId },\r\n selection: { activeCell: \"A1\", ranges: [{ start: \"A1\", end: \"A1\" }] },\r\n editingCell: null,\r\n };\r\n\r\n case \"UNDO\": {\r\n if (state.undoStack.length === 0) return state;\r\n const prev = state.undoStack[state.undoStack.length - 1];\r\n return {\r\n ...state,\r\n workbook: prev,\r\n undoStack: state.undoStack.slice(0, -1),\r\n redoStack: [...state.redoStack, state.workbook],\r\n };\r\n }\r\n\r\n case \"REDO\": {\r\n if (state.redoStack.length === 0) return state;\r\n const next = state.redoStack[state.redoStack.length - 1];\r\n return {\r\n ...state,\r\n workbook: next,\r\n undoStack: [...state.undoStack, state.workbook],\r\n redoStack: state.redoStack.slice(0, -1),\r\n };\r\n }\r\n\r\n case \"SET_WORKBOOK\":\r\n return { ...state, workbook: action.workbook };\r\n\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Hook\r\n// ---------------------------------------------------------------------------\r\n\r\nexport function useSpreadsheetStore(initialData?: WorkbookData) {\r\n const [state, dispatch] = useReducer(reducer, initialData, (data) => createInitialState(data));\r\n\r\n const actions = useMemo(() => ({\r\n setCellValue: (address: string, value: string) => dispatch({ type: \"SET_CELL_VALUE\", address, value }),\r\n setCellFormat: (addresses: string[], format: Partial<CellFormat>) => dispatch({ type: \"SET_CELL_FORMAT\", addresses, format }),\r\n setSelection: (cell: string) => dispatch({ type: \"SET_SELECTION\", cell }),\r\n extendSelection: (cell: string) => dispatch({ type: \"EXTEND_SELECTION\", cell }),\r\n addSelection: (cell: string) => dispatch({ type: \"ADD_SELECTION\", cell }),\r\n selectRange: (start: string, end: string) => dispatch({ type: \"SELECT_RANGE\", start, end }),\r\n navigate: (direction: \"up\" | \"down\" | \"left\" | \"right\", extend?: boolean) => dispatch({ type: \"NAVIGATE\", direction, extend }),\r\n startEdit: (value?: string) => dispatch({ type: \"START_EDIT\", value }),\r\n updateEdit: (value: string) => dispatch({ type: \"UPDATE_EDIT\", value }),\r\n confirmEdit: () => dispatch({ type: \"CONFIRM_EDIT\" }),\r\n cancelEdit: () => dispatch({ type: \"CANCEL_EDIT\" }),\r\n resizeColumn: (col: number, width: number) => dispatch({ type: \"RESIZE_COLUMN\", col, width }),\r\n addSheet: () => dispatch({ type: \"ADD_SHEET\" }),\r\n renameSheet: (sheetId: string, name: string) => dispatch({ type: \"RENAME_SHEET\", sheetId, name }),\r\n deleteSheet: (sheetId: string) => dispatch({ type: \"DELETE_SHEET\", sheetId }),\r\n setActiveSheet: (sheetId: string) => dispatch({ type: \"SET_ACTIVE_SHEET\", sheetId }),\r\n undo: () => dispatch({ type: \"UNDO\" }),\r\n redo: () => dispatch({ type: \"REDO\" }),\r\n setWorkbook: (workbook: WorkbookData) => dispatch({ type: \"SET_WORKBOOK\", workbook }),\r\n }), []);\r\n\r\n return { state, actions };\r\n}\r\n","import { useCallback, useRef } from \"react\";\r\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\n\r\ninterface ColumnResizeHandleProps {\r\n colIndex: number;\r\n}\r\n\r\nexport function ColumnResizeHandle({ colIndex }: ColumnResizeHandleProps) {\r\n const { resizeColumn, getColumnWidth } = useSpreadsheet();\r\n const startX = useRef(0);\r\n const startWidth = useRef(0);\r\n\r\n const handlePointerDown = useCallback(\r\n (e: React.PointerEvent) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n startX.current = e.clientX;\r\n startWidth.current = getColumnWidth(colIndex);\r\n const target = e.currentTarget as HTMLElement;\r\n target.setPointerCapture(e.pointerId);\r\n\r\n const handlePointerMove = (ev: PointerEvent) => {\r\n const delta = ev.clientX - startX.current;\r\n resizeColumn(colIndex, startWidth.current + delta);\r\n };\r\n\r\n const handlePointerUp = () => {\r\n target.removeEventListener(\"pointermove\", handlePointerMove);\r\n target.removeEventListener(\"pointerup\", handlePointerUp);\r\n };\r\n\r\n target.addEventListener(\"pointermove\", handlePointerMove);\r\n target.addEventListener(\"pointerup\", handlePointerUp);\r\n },\r\n [colIndex, getColumnWidth, resizeColumn],\r\n );\r\n\r\n return (\r\n <div\r\n data-fancy-sheets-resize-handle=\"\"\r\n className=\"absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-blue-500/50\"\r\n onPointerDown={handlePointerDown}\r\n />\r\n );\r\n}\r\n\r\nColumnResizeHandle.displayName = \"ColumnResizeHandle\";\r\n","import { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\nimport { columnToLetter } from \"../../engine/cell-utils\";\r\nimport { ColumnResizeHandle } from \"./ColumnResizeHandle\";\r\n\r\nexport function ColumnHeaders() {\r\n const { columnCount, rowHeight, getColumnWidth } = useSpreadsheet();\r\n\r\n return (\r\n <div\r\n data-fancy-sheets-column-headers=\"\"\r\n className=\"flex border-b border-zinc-300 bg-zinc-100 dark:border-zinc-600 dark:bg-zinc-800\"\r\n style={{ height: rowHeight }}\r\n >\r\n {/* Corner cell */}\r\n <div\r\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\"\r\n style={{ width: 48, minWidth: 48 }}\r\n />\r\n {/* Column letters */}\r\n {Array.from({ length: columnCount }, (_, i) => (\r\n <div\r\n key={i}\r\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\"\r\n style={{ width: getColumnWidth(i), minWidth: getColumnWidth(i) }}\r\n >\r\n {columnToLetter(i)}\r\n <ColumnResizeHandle colIndex={i} />\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n}\r\n\r\nColumnHeaders.displayName = \"ColumnHeaders\";\r\n","import { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\n\r\ninterface RowHeadersProps {\r\n rowIndex: number;\r\n}\r\n\r\nexport function RowHeader({ rowIndex }: RowHeadersProps) {\r\n const { rowHeight } = useSpreadsheet();\r\n\r\n return (\r\n <div\r\n data-fancy-sheets-row-header=\"\"\r\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\"\r\n style={{ width: 48, minWidth: 48, height: rowHeight }}\r\n >\r\n {rowIndex + 1}\r\n </div>\r\n );\r\n}\r\n\r\nRowHeader.displayName = \"RowHeader\";\r\n","import { useCallback, memo } from \"react\";\r\nimport { cn } from \"@particle-academy/react-fancy\";\r\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\nimport type { CellData } from \"../../types/cell\";\r\n\r\ninterface CellProps {\r\n address: string;\r\n row: number;\r\n col: number;\r\n}\r\n\r\nfunction getCellDisplayValue(cell: CellData | undefined): string {\r\n if (!cell) return \"\";\r\n if (cell.formula && cell.computedValue !== undefined) return String(cell.computedValue ?? \"\");\r\n if (cell.value === null) return \"\";\r\n return String(cell.value);\r\n}\r\n\r\nexport const Cell = memo(function Cell({ address, row, col }: CellProps) {\r\n const {\r\n activeSheet,\r\n selection,\r\n editingCell,\r\n readOnly,\r\n setSelection,\r\n extendSelection,\r\n addSelection,\r\n startEdit,\r\n rowHeight,\r\n getColumnWidth,\r\n isCellSelected,\r\n isCellActive,\r\n } = useSpreadsheet();\r\n\r\n const cell = activeSheet.cells[address];\r\n const isActive = isCellActive(address);\r\n const isSelected = isCellSelected(address);\r\n const isEditing = editingCell === address;\r\n const displayValue = getCellDisplayValue(cell);\r\n const width = getColumnWidth(col);\r\n\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n if (e.shiftKey) {\r\n extendSelection(address);\r\n } else if (e.ctrlKey || e.metaKey) {\r\n addSelection(address);\r\n } else {\r\n setSelection(address);\r\n }\r\n },\r\n [address, setSelection, extendSelection, addSelection],\r\n );\r\n\r\n const handleDoubleClick = useCallback(() => {\r\n if (readOnly) return;\r\n startEdit();\r\n }, [readOnly, startEdit]);\r\n\r\n const formatStyle: React.CSSProperties = {};\r\n if (cell?.format?.bold) formatStyle.fontWeight = \"bold\";\r\n if (cell?.format?.italic) formatStyle.fontStyle = \"italic\";\r\n if (cell?.format?.textAlign) formatStyle.textAlign = cell.format.textAlign;\r\n\r\n return (\r\n <div\r\n data-fancy-sheets-cell=\"\"\r\n data-selected={isSelected || undefined}\r\n data-active={isActive || undefined}\r\n role=\"gridcell\"\r\n className={cn(\r\n \"relative flex items-center truncate border-r border-b border-zinc-200 px-1.5 text-[13px] dark:border-zinc-700\",\r\n isActive && \"ring-2 ring-inset ring-blue-500\",\r\n isSelected && !isActive && \"bg-blue-500/10\",\r\n )}\r\n style={{ width, minWidth: width, height: rowHeight, ...formatStyle }}\r\n onMouseDown={handleMouseDown}\r\n onDoubleClick={handleDoubleClick}\r\n >\r\n {!isEditing && <span className=\"truncate\">{displayValue}</span>}\r\n </div>\r\n );\r\n});\r\n\r\nCell.displayName = \"Cell\";\r\n","import { useEffect, useRef, useCallback } 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 } = useSpreadsheet();\n\n const inputRef = useRef<HTMLInputElement>(null);\n const mountedAt = useRef(0);\n\n useEffect(() => {\n if (editingCell && inputRef.current) {\n mountedAt.current = Date.now();\n inputRef.current.focus();\n }\n }, [editingCell]);\n\n const handleBlur = useCallback(() => {\n // Ignore blur within 100ms of mount to avoid double-click race condition\n if (Date.now() - mountedAt.current < 100) return;\n confirmEdit();\n }, [confirmEdit]);\n\n if (!editingCell) return null;\n\n const { 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={handleBlur}\n />\n );\n}\n\nCellEditor.displayName = \"CellEditor\";\n","import { useMemo } from \"react\";\r\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\nimport { parseAddress, normalizeRange } from \"../../engine/cell-utils\";\r\n\r\nexport function SelectionOverlay() {\r\n const { selection, getColumnWidth, rowHeight } = useSpreadsheet();\r\n\r\n const rects = useMemo(() => {\r\n return selection.ranges.map((range, i) => {\r\n const norm = normalizeRange(range.start, range.end);\r\n const s = parseAddress(norm.start);\r\n const e = parseAddress(norm.end);\r\n\r\n let left = 48; // row header width\r\n for (let c = 0; c < s.col; c++) left += getColumnWidth(c);\r\n\r\n let width = 0;\r\n for (let c = s.col; c <= e.col; c++) width += getColumnWidth(c);\r\n\r\n const top = s.row * rowHeight;\r\n const height = (e.row - s.row + 1) * rowHeight;\r\n\r\n return { left, top, width, height, isPrimary: i === 0 };\r\n });\r\n }, [selection.ranges, getColumnWidth, rowHeight]);\r\n\r\n return (\r\n <>\r\n {rects.map((rect, i) => (\r\n <div\r\n key={i}\r\n data-fancy-sheets-selection=\"\"\r\n className=\"pointer-events-none absolute border-2 border-blue-500\"\r\n style={{\r\n left: rect.left,\r\n top: rect.top,\r\n width: rect.width,\r\n height: rect.height,\r\n backgroundColor: rect.isPrimary ? \"rgba(59, 130, 246, 0.08)\" : \"rgba(59, 130, 246, 0.05)\",\r\n }}\r\n />\r\n ))}\r\n </>\r\n );\r\n}\r\n\r\nSelectionOverlay.displayName = \"SelectionOverlay\";\r\n","import type { CellMap } from \"../types/sheet\";\r\nimport type { CellRange } from \"../types/selection\";\r\nimport { parseAddress, toAddress, normalizeRange } from \"./cell-utils\";\r\n\r\n/** Serialize a cell range to TSV string */\r\nexport function cellsToTSV(cells: CellMap, range: CellRange): string {\r\n const norm = normalizeRange(range.start, range.end);\r\n const s = parseAddress(norm.start);\r\n const e = parseAddress(norm.end);\r\n const rows: string[] = [];\r\n\r\n for (let r = s.row; r <= e.row; r++) {\r\n const cols: string[] = [];\r\n for (let c = s.col; c <= e.col; c++) {\r\n const addr = toAddress(r, c);\r\n const cell = cells[addr];\r\n if (!cell) {\r\n cols.push(\"\");\r\n } else if (cell.computedValue !== undefined && cell.computedValue !== null) {\r\n cols.push(String(cell.computedValue));\r\n } else if (cell.value !== null) {\r\n cols.push(String(cell.value));\r\n } else {\r\n cols.push(\"\");\r\n }\r\n }\r\n rows.push(cols.join(\"\\t\"));\r\n }\r\n\r\n return rows.join(\"\\n\");\r\n}\r\n\r\n/** Parse TSV string into cell data */\r\nexport function tsvToCells(tsv: string): { values: string[][]; rows: number; cols: number } {\r\n const lines = tsv.split(\"\\n\");\r\n const values = lines.map((line) => line.split(\"\\t\"));\r\n const rows = values.length;\r\n const cols = Math.max(...values.map((v) => v.length));\r\n return { values, rows, cols };\r\n}\r\n","import { useCallback, useRef } from \"react\";\r\nimport { cn } from \"@particle-academy/react-fancy\";\r\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\nimport { ColumnHeaders } from \"./ColumnHeaders\";\r\nimport { RowHeader } from \"./RowHeaders\";\r\nimport { Cell } from \"./Cell\";\r\nimport { CellEditor } from \"./CellEditor\";\r\nimport { SelectionOverlay } from \"./SelectionOverlay\";\r\nimport { toAddress, parseAddress } from \"../../engine/cell-utils\";\r\nimport { cellsToTSV, tsvToCells } from \"../../engine/clipboard\";\r\n\r\ninterface SpreadsheetGridProps {\r\n className?: string;\r\n}\r\n\r\nexport function SpreadsheetGrid({ className }: SpreadsheetGridProps) {\r\n const {\r\n columnCount,\r\n rowCount,\r\n rowHeight,\r\n getColumnWidth,\r\n selection,\r\n editingCell,\r\n readOnly,\r\n activeSheet,\r\n navigate,\r\n startEdit,\r\n confirmEdit,\r\n cancelEdit,\r\n setCellValue,\r\n undo,\r\n redo,\r\n } = useSpreadsheet();\r\n\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent) => {\r\n // Don't intercept when editing (CellEditor handles its own keys)\r\n if (editingCell) return;\r\n\r\n // Navigation\r\n if (e.key === \"ArrowUp\") { e.preventDefault(); navigate(\"up\", e.shiftKey); return; }\r\n if (e.key === \"ArrowDown\") { e.preventDefault(); navigate(\"down\", e.shiftKey); return; }\r\n if (e.key === \"ArrowLeft\") { e.preventDefault(); navigate(\"left\", e.shiftKey); return; }\r\n if (e.key === \"ArrowRight\") { e.preventDefault(); navigate(\"right\", e.shiftKey); return; }\r\n if (e.key === \"Tab\") { e.preventDefault(); navigate(e.shiftKey ? \"left\" : \"right\"); return; }\r\n if (e.key === \"Enter\") { e.preventDefault(); if (!readOnly) startEdit(); return; }\r\n\r\n // Copy\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"c\") {\r\n e.preventDefault();\r\n const range = selection.ranges[0];\r\n if (range) {\r\n const tsv = cellsToTSV(activeSheet.cells, range);\r\n navigator.clipboard.writeText(tsv);\r\n }\r\n return;\r\n }\r\n\r\n // Paste\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"v\") {\r\n e.preventDefault();\r\n navigator.clipboard.readText().then((text) => {\r\n if (!text) return;\r\n const { values } = tsvToCells(text);\r\n const { row: startRow, col: startCol } = parseAddress(selection.activeCell);\r\n for (let r = 0; r < values.length; r++) {\r\n for (let c = 0; c < values[r].length; c++) {\r\n const addr = toAddress(startRow + r, startCol + c);\r\n setCellValue(addr, values[r][c]);\r\n }\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // Undo/Redo\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"z\") { e.preventDefault(); undo(); return; }\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"y\") { e.preventDefault(); redo(); return; }\r\n\r\n // Start editing by typing\r\n if (!readOnly && !e.ctrlKey && !e.metaKey && !e.altKey && e.key.length === 1) {\r\n startEdit(e.key);\r\n }\r\n\r\n // Delete/Backspace clears cell\r\n if (!readOnly && (e.key === \"Delete\" || e.key === \"Backspace\")) {\r\n e.preventDefault();\r\n startEdit(\"\");\r\n // Immediately confirm with empty value\r\n setTimeout(() => confirmEdit(), 0);\r\n }\r\n },\r\n [editingCell, readOnly, navigate, startEdit, confirmEdit, undo, redo],\r\n );\r\n\r\n // Calculate the position of the editing cell for the overlay editor\r\n const editorPosition = editingCell\r\n ? (() => {\r\n const { row, col } = parseAddress(editingCell);\r\n let left = 48; // row header width\r\n for (let c = 0; c < col; c++) left += getColumnWidth(c);\r\n const top = row * rowHeight;\r\n return { left, top };\r\n })()\r\n : null;\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n data-fancy-sheets-grid=\"\"\r\n className={cn(\"relative min-h-0 flex-1 overflow-auto bg-white focus:outline-none dark:bg-zinc-900\", className)}\r\n tabIndex={0}\r\n onKeyDown={handleKeyDown}\r\n >\r\n {/* Column headers */}\r\n <div className=\"sticky top-0 z-10\">\r\n <ColumnHeaders />\r\n </div>\r\n\r\n {/* Rows */}\r\n <div className=\"relative\">\r\n {Array.from({ length: rowCount }, (_, rowIdx) => (\r\n <div key={rowIdx} className=\"flex\">\r\n <div className=\"sticky left-0 z-[5]\">\r\n <RowHeader rowIndex={rowIdx} />\r\n </div>\r\n {Array.from({ length: columnCount }, (_, colIdx) => {\r\n const addr = toAddress(rowIdx, colIdx);\r\n return <Cell key={addr} address={addr} row={rowIdx} col={colIdx} />;\r\n })}\r\n </div>\r\n ))}\r\n\r\n {/* Selection overlay */}\r\n <SelectionOverlay />\r\n\r\n {/* Cell editor overlay */}\r\n {editorPosition && (\r\n <div\r\n className=\"absolute z-20\"\r\n style={{ left: editorPosition.left, top: editorPosition.top }}\r\n >\r\n <CellEditor />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\nSpreadsheetGrid.displayName = \"SpreadsheetGrid\";\r\n","import { cn } from \"@particle-academy/react-fancy\";\r\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\n\r\ninterface SpreadsheetToolbarProps {\r\n children?: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst btnClass =\r\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\";\r\n\r\nconst activeBtnClass = \"bg-zinc-200 dark:bg-zinc-700\";\r\n\r\nfunction DefaultToolbar() {\r\n const {\r\n selection,\r\n activeSheet,\r\n editingCell,\r\n editValue,\r\n updateEdit,\r\n confirmEdit,\r\n startEdit,\r\n setCellFormat,\r\n undo,\r\n redo,\r\n canUndo,\r\n canRedo,\r\n readOnly,\r\n } = useSpreadsheet();\r\n\r\n const cell = activeSheet.cells[selection.activeCell];\r\n const isBold = cell?.format?.bold ?? false;\r\n const isItalic = cell?.format?.italic ?? false;\r\n const textAlign = cell?.format?.textAlign ?? \"left\";\r\n\r\n const selectedAddresses = [selection.activeCell];\r\n\r\n const handleFormulaBarChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n if (editingCell) {\r\n updateEdit(e.target.value);\r\n } else {\r\n startEdit(e.target.value);\r\n }\r\n };\r\n\r\n const handleFormulaBarKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n confirmEdit();\r\n }\r\n };\r\n\r\n const formulaBarValue = editingCell\r\n ? editValue\r\n : cell?.formula\r\n ? \"=\" + cell.formula\r\n : cell?.value != null\r\n ? String(cell.value)\r\n : \"\";\r\n\r\n return (\r\n <>\r\n {/* Action buttons */}\r\n <div className=\"flex items-center gap-0.5 border-b border-zinc-200 px-1.5 py-1 dark:border-zinc-700\">\r\n <button className={btnClass} onClick={undo} disabled={!canUndo || readOnly} title=\"Undo (Ctrl+Z)\">\r\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>\r\n </button>\r\n <button className={btnClass} onClick={redo} disabled={!canRedo || readOnly} title=\"Redo (Ctrl+Y)\">\r\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>\r\n </button>\r\n <div className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\r\n <button\r\n className={cn(btnClass, isBold && activeBtnClass)}\r\n onClick={() => setCellFormat(selectedAddresses, { bold: !isBold })}\r\n disabled={readOnly}\r\n title=\"Bold\"\r\n >\r\n <span className=\"font-bold\">B</span>\r\n </button>\r\n <button\r\n className={cn(btnClass, isItalic && activeBtnClass)}\r\n onClick={() => setCellFormat(selectedAddresses, { italic: !isItalic })}\r\n disabled={readOnly}\r\n title=\"Italic\"\r\n >\r\n <span className=\"italic\">I</span>\r\n </button>\r\n <div className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\r\n {([\"left\", \"center\", \"right\"] as const).map((align) => (\r\n <button\r\n key={align}\r\n className={cn(btnClass, textAlign === align && activeBtnClass)}\r\n onClick={() => setCellFormat(selectedAddresses, { textAlign: align })}\r\n disabled={readOnly}\r\n title={`Align ${align}`}\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1={align === \"left\" ? \"3\" : align === \"center\" ? \"6\" : \"9\"} y1=\"12\" x2={align === \"left\" ? \"15\" : align === \"center\" ? \"18\" : \"21\"} y2=\"12\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n </button>\r\n ))}\r\n </div>\r\n\r\n {/* Formula bar */}\r\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\">\r\n <span className=\"w-12 shrink-0 text-center text-[11px] font-medium text-zinc-500 dark:text-zinc-400\">\r\n {selection.activeCell}\r\n </span>\r\n <div className=\"h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\r\n <input\r\n className=\"flex-1 bg-transparent text-[13px] outline-none dark:text-zinc-100\"\r\n value={formulaBarValue}\r\n onChange={handleFormulaBarChange}\r\n onKeyDown={handleFormulaBarKeyDown}\r\n readOnly={readOnly}\r\n placeholder=\"Enter value or formula (=SUM(A1:A5))\"\r\n />\r\n </div>\r\n </>\r\n );\r\n}\r\n\r\nexport function SpreadsheetToolbar({ children, className }: SpreadsheetToolbarProps) {\r\n return (\r\n <div data-fancy-sheets-toolbar=\"\" className={cn(\"\", className)}>\r\n {children ?? <DefaultToolbar />}\r\n </div>\r\n );\r\n}\r\n\r\nSpreadsheetToolbar.displayName = \"SpreadsheetToolbar\";\r\n","import { useState, useCallback } from \"react\";\r\nimport { cn } from \"@particle-academy/react-fancy\";\r\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\r\n\r\ninterface SpreadsheetSheetTabsProps {\r\n className?: string;\r\n}\r\n\r\nexport function SpreadsheetSheetTabs({ className }: SpreadsheetSheetTabsProps) {\r\n const { workbook, setActiveSheet, addSheet, renameSheet, deleteSheet, readOnly } = useSpreadsheet();\r\n const [renamingId, setRenamingId] = useState<string | null>(null);\r\n const [renameValue, setRenameValue] = useState(\"\");\r\n\r\n const handleDoubleClick = useCallback(\r\n (sheetId: string, name: string) => {\r\n if (readOnly) return;\r\n setRenamingId(sheetId);\r\n setRenameValue(name);\r\n },\r\n [readOnly],\r\n );\r\n\r\n const handleRenameConfirm = useCallback(() => {\r\n if (renamingId && renameValue.trim()) {\r\n renameSheet(renamingId, renameValue.trim());\r\n }\r\n setRenamingId(null);\r\n }, [renamingId, renameValue, renameSheet]);\r\n\r\n return (\r\n <div\r\n data-fancy-sheets-tabs=\"\"\r\n className={cn(\r\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\",\r\n className,\r\n )}\r\n >\r\n {workbook.sheets.map((sheet) => {\r\n const isActive = sheet.id === workbook.activeSheetId;\r\n const isRenaming = renamingId === sheet.id;\r\n\r\n return (\r\n <div key={sheet.id} className=\"relative flex items-center\">\r\n {isRenaming ? (\r\n <input\r\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\"\r\n value={renameValue}\r\n onChange={(e) => setRenameValue(e.target.value)}\r\n onBlur={handleRenameConfirm}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") handleRenameConfirm();\r\n if (e.key === \"Escape\") setRenamingId(null);\r\n }}\r\n autoFocus\r\n />\r\n ) : (\r\n <button\r\n className={cn(\r\n \"rounded px-3 py-1 text-[12px] font-medium transition-colors\",\r\n isActive\r\n ? \"bg-white text-zinc-900 shadow-sm dark:bg-zinc-800 dark:text-zinc-100\"\r\n : \"text-zinc-500 hover:bg-zinc-100 dark:text-zinc-400 dark:hover:bg-zinc-800\",\r\n )}\r\n onClick={() => setActiveSheet(sheet.id)}\r\n onDoubleClick={() => handleDoubleClick(sheet.id, sheet.name)}\r\n >\r\n {sheet.name}\r\n </button>\r\n )}\r\n {!readOnly && workbook.sheets.length > 1 && isActive && !isRenaming && (\r\n <button\r\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\"\r\n onClick={() => deleteSheet(sheet.id)}\r\n title=\"Delete sheet\"\r\n >\r\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>\r\n </button>\r\n )}\r\n </div>\r\n );\r\n })}\r\n {!readOnly && (\r\n <button\r\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\"\r\n onClick={addSheet}\r\n title=\"Add sheet\"\r\n >\r\n +\r\n </button>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nSpreadsheetSheetTabs.displayName = \"SpreadsheetSheetTabs\";\r\n","import { useMemo, useCallback, useEffect, useRef } from \"react\";\r\nimport { cn } from \"@particle-academy/react-fancy\";\r\nimport { SpreadsheetContext } from \"./Spreadsheet.context\";\r\nimport { useSpreadsheetStore } from \"../../hooks/use-spreadsheet-store\";\r\nimport { parseAddress, toAddress, expandRange, normalizeRange } from \"../../engine/cell-utils\";\r\nimport type { SpreadsheetProps, SpreadsheetContextValue } from \"./Spreadsheet.types\";\r\n\r\n// Sub-components (imported for Object.assign)\r\nimport { SpreadsheetGrid } from \"../Grid/SpreadsheetGrid\";\r\nimport { SpreadsheetToolbar } from \"../Toolbar/SpreadsheetToolbar\";\r\nimport { SpreadsheetSheetTabs } from \"../SheetTabs/SpreadsheetSheetTabs\";\r\n\r\nfunction SpreadsheetRoot({\r\n children,\r\n className,\r\n data,\r\n defaultData,\r\n onChange,\r\n columnCount = 26,\r\n rowCount = 100,\r\n defaultColumnWidth = 100,\r\n rowHeight = 28,\r\n readOnly = false,\r\n}: SpreadsheetProps) {\r\n const { state, actions } = useSpreadsheetStore(data ?? defaultData);\r\n const onChangeRef = useRef(onChange);\r\n const isExternalSync = useRef(false);\r\n const prevDataRef = useRef(data);\r\n onChangeRef.current = onChange;\r\n\r\n // Sync controlled data from parent\r\n useEffect(() => {\r\n if (data && data !== prevDataRef.current && data !== state.workbook) {\r\n isExternalSync.current = true;\r\n actions.setWorkbook(data);\r\n prevDataRef.current = data;\r\n }\r\n }, [data]);\r\n\r\n // Notify parent of internal changes only\r\n useEffect(() => {\r\n if (isExternalSync.current) {\r\n isExternalSync.current = false;\r\n return;\r\n }\r\n prevDataRef.current = state.workbook;\r\n onChangeRef.current?.(state.workbook);\r\n }, [state.workbook]);\r\n\r\n const activeSheet = useMemo(\r\n () => state.workbook.sheets.find((s) => s.id === state.workbook.activeSheetId)!,\r\n [state.workbook],\r\n );\r\n\r\n const getColumnWidth = useCallback(\r\n (col: number) => activeSheet.columnWidths[col] ?? defaultColumnWidth,\r\n [activeSheet.columnWidths, defaultColumnWidth],\r\n );\r\n\r\n const isCellSelected = useCallback(\r\n (address: string) => {\r\n const target = parseAddress(address);\r\n return state.selection.ranges.some((range) => {\r\n const norm = normalizeRange(range.start, range.end);\r\n const s = parseAddress(norm.start);\r\n const e = parseAddress(norm.end);\r\n return target.row >= s.row && target.row <= e.row && target.col >= s.col && target.col <= e.col;\r\n });\r\n },\r\n [state.selection.ranges],\r\n );\r\n\r\n const isCellActive = useCallback(\r\n (address: string) => state.selection.activeCell === address,\r\n [state.selection.activeCell],\r\n );\r\n\r\n const ctx = useMemo<SpreadsheetContextValue>(\r\n () => ({\r\n workbook: state.workbook,\r\n activeSheet,\r\n columnCount,\r\n rowCount,\r\n defaultColumnWidth,\r\n rowHeight,\r\n readOnly,\r\n selection: state.selection,\r\n editingCell: state.editingCell,\r\n editValue: state.editValue,\r\n ...actions,\r\n canUndo: state.undoStack.length > 0,\r\n canRedo: state.redoStack.length > 0,\r\n getColumnWidth,\r\n isCellSelected,\r\n isCellActive,\r\n }),\r\n [state, activeSheet, columnCount, rowCount, defaultColumnWidth, rowHeight, readOnly, actions, getColumnWidth, isCellSelected, isCellActive],\r\n );\r\n\r\n return (\r\n <SpreadsheetContext.Provider value={ctx}>\r\n <div\r\n data-fancy-sheets=\"\"\r\n className={cn(\"flex h-full flex-col overflow-hidden\", className)}\r\n >\r\n {children}\r\n </div>\r\n </SpreadsheetContext.Provider>\r\n );\r\n}\r\n\r\nSpreadsheetRoot.displayName = \"Spreadsheet\";\r\n\r\nexport const Spreadsheet = Object.assign(SpreadsheetRoot, {\r\n Toolbar: SpreadsheetToolbar,\r\n Grid: SpreadsheetGrid,\r\n SheetTabs: SpreadsheetSheetTabs,\r\n});\r\n","import type { WorkbookData, SheetData } from \"../types/sheet\";\r\nimport { createEmptySheet } from \"../types/sheet\";\r\nimport { toAddress } from \"./cell-utils\";\r\n\r\n/** Parse CSV text into a 2D string array */\r\nexport function parseCSV(text: string): string[][] {\r\n const rows: string[][] = [];\r\n let current = \"\";\r\n let inQuotes = false;\r\n let row: string[] = [];\r\n\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i];\r\n\r\n if (inQuotes) {\r\n if (ch === '\"' && text[i + 1] === '\"') {\r\n current += '\"';\r\n i++;\r\n } else if (ch === '\"') {\r\n inQuotes = false;\r\n } else {\r\n current += ch;\r\n }\r\n } else {\r\n if (ch === '\"') {\r\n inQuotes = true;\r\n } else if (ch === \",\") {\r\n row.push(current);\r\n current = \"\";\r\n } else if (ch === \"\\n\" || (ch === \"\\r\" && text[i + 1] === \"\\n\")) {\r\n row.push(current);\r\n current = \"\";\r\n rows.push(row);\r\n row = [];\r\n if (ch === \"\\r\") i++;\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n }\r\n\r\n row.push(current);\r\n if (row.some((c) => c !== \"\")) rows.push(row);\r\n\r\n return rows;\r\n}\r\n\r\n/** Stringify a 2D array to CSV text */\r\nexport function stringifyCSV(data: string[][]): string {\r\n return data\r\n .map((row) =>\r\n row\r\n .map((cell) => {\r\n if (cell.includes(\",\") || cell.includes('\"') || cell.includes(\"\\n\")) {\r\n return '\"' + cell.replace(/\"/g, '\"\"') + '\"';\r\n }\r\n return cell;\r\n })\r\n .join(\",\"),\r\n )\r\n .join(\"\\n\");\r\n}\r\n\r\n/** Convert CSV text to a WorkbookData */\r\nexport function csvToWorkbook(csv: string, sheetName: string = \"Sheet 1\"): WorkbookData {\r\n const data = parseCSV(csv);\r\n const sheet = createEmptySheet(\"sheet-1\", sheetName);\r\n\r\n for (let r = 0; r < data.length; r++) {\r\n for (let c = 0; c < data[r].length; c++) {\r\n const val = data[r][c];\r\n if (val === \"\") continue;\r\n const addr = toAddress(r, c);\r\n const numVal = Number(val);\r\n sheet.cells[addr] = { value: isNaN(numVal) || val === \"\" ? val : numVal };\r\n }\r\n }\r\n\r\n return { sheets: [sheet], activeSheetId: sheet.id };\r\n}\r\n\r\n/** Convert WorkbookData active sheet to CSV */\r\nexport function workbookToCSV(workbook: WorkbookData, sheetId?: string): string {\r\n const sheet = sheetId\r\n ? workbook.sheets.find((s) => s.id === sheetId)\r\n : workbook.sheets.find((s) => s.id === workbook.activeSheetId);\r\n\r\n if (!sheet) return \"\";\r\n\r\n // Find bounds\r\n let maxRow = 0;\r\n let maxCol = 0;\r\n for (const addr of Object.keys(sheet.cells)) {\r\n const match = addr.match(/^([A-Z]+)(\\d+)$/);\r\n if (!match) continue;\r\n const col = match[1].split(\"\").reduce((acc, ch) => acc * 26 + ch.charCodeAt(0) - 64, 0) - 1;\r\n const row = parseInt(match[2], 10) - 1;\r\n maxRow = Math.max(maxRow, row);\r\n maxCol = Math.max(maxCol, col);\r\n }\r\n\r\n const data: string[][] = [];\r\n for (let r = 0; r <= maxRow; r++) {\r\n const row: string[] = [];\r\n for (let c = 0; c <= maxCol; c++) {\r\n const addr = toAddress(r, c);\r\n const cell = sheet.cells[addr];\r\n if (!cell) {\r\n row.push(\"\");\r\n } else if (cell.computedValue !== undefined && cell.computedValue !== null) {\r\n row.push(String(cell.computedValue));\r\n } else if (cell.value !== null) {\r\n row.push(String(cell.value));\r\n } else {\r\n row.push(\"\");\r\n }\r\n }\r\n data.push(row);\r\n }\r\n\r\n return stringifyCSV(data);\r\n}\r\n"]}