@particle-academy/fancy-sheets 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +97 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +97 -30
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -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/functions/conditional.ts","../src/engine/formula/functions/lookup.ts","../src/engine/formula/functions/datetime.ts","../src/engine/formula/functions/info.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","num","useReducer","useMemo","useRef","useCallback","jsx","jsxs","EXCEL_EPOCH","getCellDisplayValue","memo","Cell","cn","useEffect","Fragment","ContextMenu","_","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, sheet 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 // Allow spaces in sheet names when followed by !\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] === \"_\" || input[i] === \" \")) {\r\n // Only allow spaces if they're part of a sheet name (followed eventually by !)\r\n if (input[i] === \" \") {\r\n let lookAhead = i + 1;\r\n while (lookAhead < len && input[lookAhead] === \" \") lookAhead++;\r\n // Check if after the spaces there's more identifier chars followed by !\r\n if (lookAhead < len && ((input[lookAhead] >= \"A\" && input[lookAhead] <= \"Z\") || (input[lookAhead] >= \"a\" && input[lookAhead] <= \"z\") || (input[lookAhead] >= \"0\" && input[lookAhead] <= \"9\") || input[lookAhead] === \"!\")) {\r\n i++;\r\n continue;\r\n }\r\n break;\r\n }\r\n i++;\r\n }\r\n let word = input.slice(pos, i).trimEnd();\r\n i = pos + word.length;\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 // Cross-sheet reference: SheetName!CellRef or SheetName!Range\r\n if (i < len && input[i] === \"!\") {\r\n const sheetName = word;\r\n i++; // skip !\r\n const refStart = 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 const ref1 = input.slice(refStart, i);\r\n\r\n if (i < len && input[i] === \":\") {\r\n // Sheet range ref: Sheet1!A1:B5\r\n i++;\r\n const ref2Start = 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 const ref2 = input.slice(ref2Start, i);\r\n tokens.push({ type: \"sheetRangeRef\", value: sheetName + \"!\" + ref1 + \":\" + ref2, position: pos });\r\n } else {\r\n // Sheet cell ref: Sheet1!A1\r\n tokens.push({ type: \"sheetCellRef\", value: sheetName + \"!\" + ref1.toUpperCase(), position: pos });\r\n }\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 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 // Cross-sheet cell reference (Sheet1!A1)\r\n if (t.type === \"sheetCellRef\") {\r\n advance();\r\n const bangIdx = t.value.indexOf(\"!\");\r\n return { type: \"sheetCellRef\", sheet: t.value.slice(0, bangIdx), address: t.value.slice(bangIdx + 1).toUpperCase() };\r\n }\r\n\r\n // Cross-sheet range reference (Sheet1!A1:B5)\r\n if (t.type === \"sheetRangeRef\") {\r\n advance();\r\n const bangIdx = t.value.indexOf(\"!\");\r\n const sheetName = t.value.slice(0, bangIdx);\r\n const rangePart = t.value.slice(bangIdx + 1);\r\n const parts = rangePart.split(\":\");\r\n return { type: \"sheetRangeRef\", sheet: sheetName, start: parts[0].toUpperCase(), end: parts[1].toUpperCase() };\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\r\nfunction toNum(args: CellValue[][]): number {\r\n const val = args.flat()[0];\r\n const n = typeof val === \"number\" ? val : Number(val);\r\n return isNaN(n) ? NaN : n;\r\n}\r\n\r\nregisterFunction(\"SQRT\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : n < 0 ? \"#NUM!\" : Math.sqrt(n);\r\n});\r\n\r\nregisterFunction(\"POWER\", (args) => {\r\n const flat = args.flat();\r\n const base = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const exp = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(base) || isNaN(exp)) return \"#VALUE!\";\r\n return Math.pow(base, exp);\r\n});\r\n\r\nregisterFunction(\"MOD\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const div = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(num) || isNaN(div) || div === 0) return \"#VALUE!\";\r\n return num % div;\r\n});\r\n\r\nregisterFunction(\"INT\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : Math.floor(n);\r\n});\r\n\r\nregisterFunction(\"TRUNC\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const decimals = flat[1] != null ? (typeof flat[1] === \"number\" ? flat[1] : Number(flat[1])) : 0;\r\n if (isNaN(num)) return \"#VALUE!\";\r\n const factor = Math.pow(10, decimals);\r\n return Math.trunc(num * factor) / factor;\r\n});\r\n\r\nregisterFunction(\"FLOOR\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const sig = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(num) || isNaN(sig) || sig === 0) return \"#VALUE!\";\r\n return Math.floor(num / sig) * sig;\r\n});\r\n\r\nregisterFunction(\"CEILING\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const sig = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(num) || isNaN(sig) || sig === 0) return \"#VALUE!\";\r\n return Math.ceil(num / sig) * sig;\r\n});\r\n\r\nregisterFunction(\"SIGN\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : Math.sign(n);\r\n});\r\n\r\nregisterFunction(\"PRODUCT\", (args) => {\r\n const nums = toNumbers(args);\r\n if (nums.length === 0) return 0;\r\n return nums.reduce((a, b) => a * b, 1);\r\n});\r\n\r\nregisterFunction(\"PI\", () => Math.PI);\r\n\r\nregisterFunction(\"EXP\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : Math.exp(n);\r\n});\r\n\r\nregisterFunction(\"LN\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) || n <= 0 ? \"#NUM!\" : Math.log(n);\r\n});\r\n\r\nregisterFunction(\"LOG\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const base = flat[1] != null ? (typeof flat[1] === \"number\" ? flat[1] : Number(flat[1])) : 10;\r\n if (isNaN(num) || num <= 0 || isNaN(base) || base <= 0 || base === 1) return \"#NUM!\";\r\n return Math.log(num) / Math.log(base);\r\n});\r\n\r\nregisterFunction(\"LOG10\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) || n <= 0 ? \"#NUM!\" : Math.log10(n);\r\n});\r\n\r\nregisterFunction(\"RAND\", () => Math.random());\r\n\r\nregisterFunction(\"RANDBETWEEN\", (args) => {\r\n const flat = args.flat();\r\n const low = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const high = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(low) || isNaN(high)) return \"#VALUE!\";\r\n return Math.floor(Math.random() * (high - low + 1)) + low;\r\n});\r\n\r\nregisterFunction(\"MEDIAN\", (args) => {\r\n const nums = toNumbers(args).sort((a, b) => a - b);\r\n if (nums.length === 0) return 0;\r\n const mid = Math.floor(nums.length / 2);\r\n return nums.length % 2 === 0 ? (nums[mid - 1] + nums[mid]) / 2 : nums[mid];\r\n});\r\n\r\nregisterFunction(\"FACT\", (args) => {\r\n const n = toNum(args);\r\n if (isNaN(n) || n < 0 || n !== Math.floor(n)) return \"#VALUE!\";\r\n let result = 1;\r\n for (let i = 2; i <= n; i++) result *= i;\r\n return result;\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\r\nregisterFunction(\"LEFT\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const chars = flat[1] != null ? Number(flat[1]) : 1;\r\n return text.slice(0, chars);\r\n});\r\n\r\nregisterFunction(\"RIGHT\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const chars = flat[1] != null ? Number(flat[1]) : 1;\r\n return text.slice(-chars);\r\n});\r\n\r\nregisterFunction(\"MID\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const start = Number(flat[1]) - 1; // 1-based to 0-based\r\n const chars = Number(flat[2]);\r\n if (isNaN(start) || isNaN(chars)) return \"#VALUE!\";\r\n return text.slice(start, start + chars);\r\n});\r\n\r\nregisterFunction(\"FIND\", (args) => {\r\n const flat = args.flat();\r\n const search = flat[0] != null ? String(flat[0]) : \"\";\r\n const text = flat[1] != null ? String(flat[1]) : \"\";\r\n const startPos = flat[2] != null ? Number(flat[2]) - 1 : 0;\r\n const idx = text.indexOf(search, startPos);\r\n return idx === -1 ? \"#VALUE!\" : idx + 1; // 1-based\r\n});\r\n\r\nregisterFunction(\"SEARCH\", (args) => {\r\n const flat = args.flat();\r\n const search = flat[0] != null ? String(flat[0]).toLowerCase() : \"\";\r\n const text = flat[1] != null ? String(flat[1]).toLowerCase() : \"\";\r\n const startPos = flat[2] != null ? Number(flat[2]) - 1 : 0;\r\n const idx = text.indexOf(search, startPos);\r\n return idx === -1 ? \"#VALUE!\" : idx + 1;\r\n});\r\n\r\nregisterFunction(\"SUBSTITUTE\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const oldText = flat[1] != null ? String(flat[1]) : \"\";\r\n const newText = flat[2] != null ? String(flat[2]) : \"\";\r\n const nth = flat[3] != null ? Number(flat[3]) : 0;\r\n if (nth === 0) return text.split(oldText).join(newText);\r\n let count = 0;\r\n return text.replace(new RegExp(oldText.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), \"g\"), (match) => {\r\n count++;\r\n return count === nth ? newText : match;\r\n });\r\n});\r\n\r\nregisterFunction(\"REPLACE\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const start = Number(flat[1]) - 1;\r\n const chars = Number(flat[2]);\r\n const newText = flat[3] != null ? String(flat[3]) : \"\";\r\n if (isNaN(start) || isNaN(chars)) return \"#VALUE!\";\r\n return text.slice(0, start) + newText + text.slice(start + chars);\r\n});\r\n\r\nregisterFunction(\"REPT\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const times = Number(flat[1]);\r\n if (isNaN(times) || times < 0) return \"#VALUE!\";\r\n return text.repeat(times);\r\n});\r\n\r\nregisterFunction(\"EXACT\", (args) => {\r\n const flat = args.flat();\r\n return String(flat[0] ?? \"\") === String(flat[1] ?? \"\");\r\n});\r\n\r\nregisterFunction(\"PROPER\", (args) => {\r\n const val = args.flat()[0];\r\n const text = val != null ? String(val) : \"\";\r\n return text.replace(/\\w\\S*/g, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());\r\n});\r\n\r\nregisterFunction(\"VALUE\", (args) => {\r\n const val = args.flat()[0];\r\n const num = Number(val);\r\n return isNaN(num) ? \"#VALUE!\" : num;\r\n});\r\n\r\nregisterFunction(\"TEXT\", (args) => {\r\n const flat = args.flat();\r\n const val = flat[0];\r\n const fmt = flat[1] != null ? String(flat[1]) : \"\";\r\n if (val == null) return \"\";\r\n const num = Number(val);\r\n if (isNaN(num)) return String(val);\r\n // Basic format support: 0, 0.00, #,##0, %\r\n if (fmt.includes(\"%\")) return (num * 100).toFixed(fmt.split(\".\")[1]?.length ?? 0) + \"%\";\r\n if (fmt.includes(\".\")) {\r\n const decimals = fmt.split(\".\")[1]?.replace(/[^0#]/g, \"\").length ?? 0;\r\n return num.toFixed(decimals);\r\n }\r\n return String(num);\r\n});\r\n\r\nregisterFunction(\"CHAR\", (args) => {\r\n const code = Number(args.flat()[0]);\r\n if (isNaN(code)) return \"#VALUE!\";\r\n return String.fromCharCode(code);\r\n});\r\n\r\nregisterFunction(\"CODE\", (args) => {\r\n const text = String(args.flat()[0] ?? \"\");\r\n return text.length > 0 ? text.charCodeAt(0) : \"#VALUE!\";\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\r\nregisterFunction(\"IFERROR\", (args) => {\r\n const flat = args.flat();\r\n const val = flat[0];\r\n if (typeof val === \"string\" && val.startsWith(\"#\")) return flat[1] ?? \"\";\r\n return val;\r\n});\r\n\r\nregisterFunction(\"IFBLANK\", (args) => {\r\n const flat = args.flat();\r\n const val = flat[0];\r\n if (val === null || val === undefined || val === \"\") return flat[1] ?? \"\";\r\n return val;\r\n});\r\n\r\nregisterFunction(\"SWITCH\", (args) => {\r\n const flat = args.flat();\r\n const expr = flat[0];\r\n for (let i = 1; i < flat.length - 1; i += 2) {\r\n if (flat[i] === expr) return flat[i + 1];\r\n }\r\n // Last arg is default if odd number of remaining args\r\n return flat.length % 2 === 0 ? flat[flat.length - 1] : \"#N/A\";\r\n});\r\n\r\nregisterFunction(\"CHOOSE\", (args) => {\r\n const flat = args.flat();\r\n const index = Number(flat[0]);\r\n if (isNaN(index) || index < 1 || index >= flat.length) return \"#VALUE!\";\r\n return flat[index];\r\n});\r\n","import { registerFunction } from \"./registry\";\nimport type { CellValue } from \"../../../types/cell\";\n\n/** Match a value against a criteria string like \">5\", \"<>abc\", \"=text\", or plain value */\nfunction matchesCriteria(value: CellValue, criteria: CellValue): boolean {\n if (criteria === null || criteria === undefined) return false;\n const critStr = String(criteria);\n\n // Comparison operators\n if (critStr.startsWith(\"<>\")) {\n const target = critStr.slice(2);\n const num = Number(target);\n if (!isNaN(num) && typeof value === \"number\") return value !== num;\n return String(value) !== target;\n }\n if (critStr.startsWith(\">=\")) {\n const num = Number(critStr.slice(2));\n return typeof value === \"number\" && value >= num;\n }\n if (critStr.startsWith(\"<=\")) {\n const num = Number(critStr.slice(2));\n return typeof value === \"number\" && value <= num;\n }\n if (critStr.startsWith(\">\")) {\n const num = Number(critStr.slice(1));\n return typeof value === \"number\" && value > num;\n }\n if (critStr.startsWith(\"<\")) {\n const num = Number(critStr.slice(1));\n return typeof value === \"number\" && value < num;\n }\n if (critStr.startsWith(\"=\")) {\n const target = critStr.slice(1);\n const num = Number(target);\n if (!isNaN(num) && typeof value === \"number\") return value === num;\n return String(value).toLowerCase() === target.toLowerCase();\n }\n\n // Wildcard matching\n if (critStr.includes(\"*\") || critStr.includes(\"?\")) {\n const pattern = critStr\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(\"^\" + pattern + \"$\", \"i\").test(String(value));\n }\n\n // Exact match\n if (typeof criteria === \"number\") return value === criteria;\n const num = Number(critStr);\n if (!isNaN(num) && typeof value === \"number\") return value === num;\n return String(value).toLowerCase() === critStr.toLowerCase();\n}\n\nregisterFunction(\"SUMIF\", (args) => {\n const range = args[0] ?? [];\n const criteria = (args[1] ?? [])[0];\n const sumRange = args[2] ?? range;\n let total = 0;\n for (let i = 0; i < range.length; i++) {\n if (matchesCriteria(range[i], criteria)) {\n const val = Number(sumRange[i] ?? 0);\n if (!isNaN(val)) total += val;\n }\n }\n return total;\n});\n\nregisterFunction(\"SUMIFS\", (args) => {\n const sumRange = args[0] ?? [];\n let total = 0;\n for (let i = 0; i < sumRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(sumRange[i] ?? 0);\n if (!isNaN(val)) total += val;\n }\n }\n return total;\n});\n\nregisterFunction(\"COUNTIF\", (args) => {\n const range = args[0] ?? [];\n const criteria = (args[1] ?? [])[0];\n let count = 0;\n for (const val of range) {\n if (matchesCriteria(val, criteria)) count++;\n }\n return count;\n});\n\nregisterFunction(\"COUNTIFS\", (args) => {\n if (args.length < 2) return 0;\n const len = (args[0] ?? []).length;\n let count = 0;\n for (let i = 0; i < len; i++) {\n let allMatch = true;\n for (let p = 0; p < args.length - 1; p += 2) {\n const range = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(range[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) count++;\n }\n return count;\n});\n\nregisterFunction(\"AVERAGEIF\", (args) => {\n const range = args[0] ?? [];\n const criteria = (args[1] ?? [])[0];\n const avgRange = args[2] ?? range;\n let total = 0;\n let count = 0;\n for (let i = 0; i < range.length; i++) {\n if (matchesCriteria(range[i], criteria)) {\n const val = Number(avgRange[i] ?? 0);\n if (!isNaN(val)) { total += val; count++; }\n }\n }\n return count === 0 ? \"#DIV/0!\" : total / count;\n});\n\nregisterFunction(\"AVERAGEIFS\", (args) => {\n const avgRange = args[0] ?? [];\n let total = 0;\n let count = 0;\n for (let i = 0; i < avgRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(avgRange[i] ?? 0);\n if (!isNaN(val)) { total += val; count++; }\n }\n }\n return count === 0 ? \"#DIV/0!\" : total / count;\n});\n\nregisterFunction(\"MINIFS\", (args) => {\n const minRange = args[0] ?? [];\n let result = Infinity;\n for (let i = 0; i < minRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(minRange[i]);\n if (!isNaN(val) && val < result) result = val;\n }\n }\n return result === Infinity ? 0 : result;\n});\n\nregisterFunction(\"MAXIFS\", (args) => {\n const maxRange = args[0] ?? [];\n let result = -Infinity;\n for (let i = 0; i < maxRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(maxRange[i]);\n if (!isNaN(val) && val > result) result = val;\n }\n }\n return result === -Infinity ? 0 : result;\n});\n","import { registerFunction } from \"./registry\";\nimport type { CellValue } from \"../../../types/cell\";\n\nregisterFunction(\"VLOOKUP\", (args) => {\n const flat = args.flat();\n const key = flat[0];\n const range = args[1] ?? []; // The lookup range as flat array\n const colIdx = Number(flat[2] ?? flat[args[1]?.length ?? 0]); // Column index (1-based)\n // Approximate match not implemented — always exact\n if (key === null || isNaN(colIdx)) return \"#VALUE!\";\n\n // We receive the range as a flat array. We need to figure out dimensions.\n // For now, VLOOKUP works with the range as a single column lookup.\n // Look for the key in the range, return offset value.\n for (let i = 0; i < range.length; i++) {\n if (range[i] === key || (typeof range[i] === \"string\" && typeof key === \"string\" && range[i].toLowerCase() === key.toLowerCase())) {\n return range[i] ?? \"#N/A\";\n }\n }\n return \"#N/A\";\n});\n\nregisterFunction(\"HLOOKUP\", (args) => {\n const flat = args.flat();\n const key = flat[0];\n const range = args[1] ?? [];\n for (let i = 0; i < range.length; i++) {\n if (range[i] === key || (typeof range[i] === \"string\" && typeof key === \"string\" && range[i].toLowerCase() === key.toLowerCase())) {\n return range[i] ?? \"#N/A\";\n }\n }\n return \"#N/A\";\n});\n\nregisterFunction(\"INDEX\", (args) => {\n const range = args[0] ?? [];\n const flat = args.flat();\n const row = Number(flat[range.length] ?? flat[1]);\n if (isNaN(row) || row < 1 || row > range.length) return \"#REF!\";\n return range[row - 1] ?? null;\n});\n\nregisterFunction(\"MATCH\", (args) => {\n const flat = args.flat();\n const key = flat[0];\n const range = args[1] ?? [];\n for (let i = 0; i < range.length; i++) {\n if (range[i] === key || (typeof range[i] === \"number\" && typeof key === \"number\" && range[i] === key)) {\n return i + 1; // 1-based\n }\n if (typeof range[i] === \"string\" && typeof key === \"string\" && range[i].toLowerCase() === key.toLowerCase()) {\n return i + 1;\n }\n }\n return \"#N/A\";\n});\n\nregisterFunction(\"ROWS\", (args) => {\n // Range length represents total cells; without dimension info, return count\n return (args[0] ?? []).length;\n});\n\nregisterFunction(\"COLUMNS\", (args) => {\n // Without 2D dimension metadata, return 1\n return 1;\n});\n\nregisterFunction(\"ROW\", (args) => {\n // Without cell address metadata, return the numeric value if it looks like a row\n const val = args.flat()[0];\n if (typeof val === \"number\") return val;\n return \"#VALUE!\";\n});\n\nregisterFunction(\"COLUMN\", (args) => {\n const val = args.flat()[0];\n if (typeof val === \"number\") return val;\n return \"#VALUE!\";\n});\n","import { registerFunction } from \"./registry\";\n\n// Excel serial date: days since 1900-01-01 (with the 1900 leap year bug)\nconst EXCEL_EPOCH = new Date(1899, 11, 30).getTime(); // Dec 30, 1899\n\nfunction dateToSerial(d: Date): number {\n const ms = d.getTime() - EXCEL_EPOCH;\n return Math.floor(ms / 86400000);\n}\n\nfunction serialToDate(serial: number): Date {\n return new Date(EXCEL_EPOCH + serial * 86400000);\n}\n\nfunction toSerial(val: unknown): number {\n if (typeof val === \"number\") return val;\n if (typeof val === \"string\") {\n const d = new Date(val);\n if (!isNaN(d.getTime())) return dateToSerial(d);\n }\n return NaN;\n}\n\nregisterFunction(\"TODAY\", () => {\n return dateToSerial(new Date());\n});\n\nregisterFunction(\"NOW\", () => {\n const now = new Date();\n const serial = dateToSerial(now);\n const fraction = (now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds()) / 86400;\n return serial + fraction;\n});\n\nregisterFunction(\"DATE\", (args) => {\n const flat = args.flat();\n const year = Number(flat[0]);\n const month = Number(flat[1]) - 1; // JS months are 0-based\n const day = Number(flat[2]);\n if (isNaN(year) || isNaN(month) || isNaN(day)) return \"#VALUE!\";\n return dateToSerial(new Date(year, month, day));\n});\n\nregisterFunction(\"YEAR\", (args) => {\n const serial = toSerial(args.flat()[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n return serialToDate(serial).getFullYear();\n});\n\nregisterFunction(\"MONTH\", (args) => {\n const serial = toSerial(args.flat()[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n return serialToDate(serial).getMonth() + 1;\n});\n\nregisterFunction(\"DAY\", (args) => {\n const serial = toSerial(args.flat()[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n return serialToDate(serial).getDate();\n});\n\nregisterFunction(\"HOUR\", (args) => {\n const val = Number(args.flat()[0]);\n if (isNaN(val)) return \"#VALUE!\";\n const fraction = val % 1;\n return Math.floor(fraction * 24);\n});\n\nregisterFunction(\"MINUTE\", (args) => {\n const val = Number(args.flat()[0]);\n if (isNaN(val)) return \"#VALUE!\";\n const fraction = val % 1;\n return Math.floor((fraction * 24 * 60) % 60);\n});\n\nregisterFunction(\"SECOND\", (args) => {\n const val = Number(args.flat()[0]);\n if (isNaN(val)) return \"#VALUE!\";\n const fraction = val % 1;\n return Math.floor((fraction * 24 * 3600) % 60);\n});\n\nregisterFunction(\"WEEKDAY\", (args) => {\n const flat = args.flat();\n const serial = toSerial(flat[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n const day = serialToDate(serial).getDay(); // 0=Sun, 6=Sat\n const type = Number(flat[1] ?? 1);\n if (type === 1) return day + 1; // 1=Sun, 7=Sat (Excel default)\n if (type === 2) return day === 0 ? 7 : day; // 1=Mon, 7=Sun\n return day; // 0-based\n});\n\nregisterFunction(\"DATEDIF\", (args) => {\n const flat = args.flat();\n const startSerial = toSerial(flat[0]);\n const endSerial = toSerial(flat[1]);\n const unit = String(flat[2] ?? \"D\").toUpperCase();\n if (isNaN(startSerial) || isNaN(endSerial)) return \"#VALUE!\";\n const startDate = serialToDate(startSerial);\n const endDate = serialToDate(endSerial);\n if (unit === \"D\") return Math.floor(endSerial - startSerial);\n if (unit === \"M\") {\n return (endDate.getFullYear() - startDate.getFullYear()) * 12 +\n (endDate.getMonth() - startDate.getMonth());\n }\n if (unit === \"Y\") return endDate.getFullYear() - startDate.getFullYear();\n return \"#VALUE!\";\n});\n\nregisterFunction(\"EDATE\", (args) => {\n const flat = args.flat();\n const serial = toSerial(flat[0]);\n const months = Number(flat[1]);\n if (isNaN(serial) || isNaN(months)) return \"#VALUE!\";\n const d = serialToDate(serial);\n d.setMonth(d.getMonth() + months);\n return dateToSerial(d);\n});\n","import { registerFunction } from \"./registry\";\n\nregisterFunction(\"ISBLANK\", (args) => {\n const val = args.flat()[0];\n return val === null || val === undefined || val === \"\";\n});\n\nregisterFunction(\"ISNUMBER\", (args) => {\n return typeof args.flat()[0] === \"number\";\n});\n\nregisterFunction(\"ISTEXT\", (args) => {\n const val = args.flat()[0];\n return typeof val === \"string\" && !val.startsWith(\"#\");\n});\n\nregisterFunction(\"ISERROR\", (args) => {\n const val = args.flat()[0];\n return typeof val === \"string\" && val.startsWith(\"#\");\n});\n\nregisterFunction(\"ISLOGICAL\", (args) => {\n return typeof args.flat()[0] === \"boolean\";\n});\n\nregisterFunction(\"TYPE\", (args) => {\n const val = args.flat()[0];\n if (typeof val === \"number\") return 1;\n if (typeof val === \"string\") return val.startsWith(\"#\") ? 16 : 2;\n if (typeof val === \"boolean\") return 4;\n return 1; // null defaults to number\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\";\nimport \"./functions/conditional\";\nimport \"./functions/lookup\";\nimport \"./functions/datetime\";\nimport \"./functions/info\";\n\nexport type CellValueGetter = (address: string) => CellValue;\nexport type RangeValueGetter = (start: string, end: string) => CellValue[];\nexport type SheetCellValueGetter = (sheetName: string, address: string) => CellValue;\nexport type SheetRangeValueGetter = (sheetName: string, start: string, end: string) => CellValue[];\n\nexport interface EvaluatorContext {\n getCellValue: CellValueGetter;\n getRangeValues: RangeValueGetter;\n getSheetCellValue?: SheetCellValueGetter;\n getSheetRangeValues?: SheetRangeValueGetter;\n}\n\nexport function evaluateAST(\n node: FormulaASTNode,\n getCellValue: CellValueGetter,\n getRangeValues: RangeValueGetter,\n ctx?: { getSheetCellValue?: SheetCellValueGetter; getSheetRangeValues?: SheetRangeValueGetter },\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 const vals = getRangeValues(node.start, node.end);\n return vals[0] ?? null;\n }\n\n case \"sheetCellRef\": {\n if (!ctx?.getSheetCellValue) return \"#REF!\";\n return ctx.getSheetCellValue(node.sheet, node.address);\n }\n\n case \"sheetRangeRef\": {\n if (!ctx?.getSheetRangeValues) return \"#REF!\";\n const vals = ctx.getSheetRangeValues(node.sheet, node.start, node.end);\n return vals[0] ?? null;\n }\n\n case \"functionCall\": {\n const entry = getFunction(node.name);\n if (!entry) return `#NAME?`;\n\n const argValues: CellValue[][] = node.args.map((arg) => {\n if (arg.type === \"rangeRef\") {\n return getRangeValues(arg.start, arg.end);\n }\n if (arg.type === \"sheetRangeRef\") {\n if (!ctx?.getSheetRangeValues) return [\"#REF!\" as CellValue];\n return ctx.getSheetRangeValues(arg.sheet, arg.start, arg.end);\n }\n const val = evaluateAST(arg, getCellValue, getRangeValues, ctx);\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, ctx);\n const right = evaluateAST(node.right, getCellValue, getRangeValues, ctx);\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, ctx);\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\";\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((s) => recalculateSheet(s, workbook.sheets)),\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: \"SET_FROZEN_ROWS\"; count: number }\r\n | { type: \"SET_FROZEN_COLS\"; count: number }\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, with cross-sheet reference support */\r\nfunction recalculateSheet(sheet: SheetData, allSheets?: 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 // Cross-sheet getters\r\n const getSheetCellValue = (sheetName: string, addr: string): CellValue => {\r\n if (!allSheets) return \"#REF!\";\r\n const target = allSheets.find((s) => s.name === sheetName || s.id === sheetName);\r\n if (!target) return \"#REF!\";\r\n const c = target.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 getSheetRangeValues = (sheetName: string, startAddr: string, endAddr: string): CellValue[] => {\r\n if (!allSheets) return [];\r\n const target = allSheets.find((s) => s.name === sheetName || s.id === sheetName);\r\n if (!target) return [];\r\n const addresses = expandRange(startAddr, endAddr);\r\n return addresses.map((a) => {\r\n const c = target.cells[a];\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\r\n const ctx = { getSheetCellValue, getSheetRangeValues };\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, ctx);\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, state.workbook.sheets);\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 \"SET_FROZEN_ROWS\": {\r\n const workbook = updateActiveSheet(state, (s) => ({\r\n ...s, frozenRows: Math.max(0, action.count),\r\n }));\r\n return { ...state, workbook };\r\n }\r\n\r\n case \"SET_FROZEN_COLS\": {\r\n const workbook = updateActiveSheet(state, (s) => ({\r\n ...s, frozenCols: Math.max(0, action.count),\r\n }));\r\n return { ...state, workbook };\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 setFrozenRows: (count: number) => dispatch({ type: \"SET_FROZEN_ROWS\", count }),\r\n setFrozenCols: (count: number) => dispatch({ type: \"SET_FROZEN_COLS\", count }),\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 { useCallback } from \"react\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { columnToLetter, toAddress, parseAddress } from \"../../engine/cell-utils\";\nimport { ColumnResizeHandle } from \"./ColumnResizeHandle\";\n\nexport function ColumnHeaders() {\n const { columnCount, rowCount, rowHeight, getColumnWidth, selection, selectRange, _isDragging } = useSpreadsheet();\n\n const handleColumnMouseDown = useCallback(\n (colIdx: number, e: React.MouseEvent) => {\n if (e.button !== 0) return;\n if (e.shiftKey) {\n const activeCol = parseAddress(selection.activeCell).col;\n const minCol = Math.min(activeCol, colIdx);\n const maxCol = Math.max(activeCol, colIdx);\n selectRange(toAddress(0, minCol), toAddress(rowCount - 1, maxCol));\n } else {\n selectRange(toAddress(0, colIdx), toAddress(rowCount - 1, colIdx));\n }\n _isDragging.current = true;\n },\n [rowCount, selectRange, selection.activeCell, _isDragging],\n );\n\n const handleColumnMouseEnter = useCallback(\n (colIdx: number) => {\n if (_isDragging.current) {\n const activeCol = parseAddress(selection.activeCell).col;\n const minCol = Math.min(activeCol, colIdx);\n const maxCol = Math.max(activeCol, colIdx);\n selectRange(toAddress(0, minCol), toAddress(rowCount - 1, maxCol));\n }\n },\n [rowCount, selection.activeCell, selectRange, _isDragging],\n );\n\n const handleMouseUp = useCallback(() => {\n _isDragging.current = false;\n }, [_isDragging]);\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 cursor-pointer items-center justify-center border-r border-zinc-300 text-[11px] font-medium text-zinc-500 select-none hover:bg-zinc-200 dark:border-zinc-600 dark:text-zinc-400 dark:hover:bg-zinc-700\"\n style={{ width: getColumnWidth(i), minWidth: getColumnWidth(i) }}\n onMouseDown={(e) => handleColumnMouseDown(i, e)}\n onMouseEnter={() => handleColumnMouseEnter(i)}\n onMouseUp={handleMouseUp}\n >\n {columnToLetter(i)}\n <ColumnResizeHandle colIndex={i} />\n </div>\n ))}\n </div>\n );\n}\n\nColumnHeaders.displayName = \"ColumnHeaders\";\n","import { useCallback } from \"react\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { toAddress, parseAddress } from \"../../engine/cell-utils\";\n\ninterface RowHeadersProps {\n rowIndex: number;\n}\n\nexport function RowHeader({ rowIndex }: RowHeadersProps) {\n const { rowHeight, columnCount, selection, selectRange, _isDragging } = useSpreadsheet();\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n if (e.shiftKey) {\n const activeRow = parseAddress(selection.activeCell).row;\n const minRow = Math.min(activeRow, rowIndex);\n const maxRow = Math.max(activeRow, rowIndex);\n selectRange(toAddress(minRow, 0), toAddress(maxRow, columnCount - 1));\n } else {\n selectRange(toAddress(rowIndex, 0), toAddress(rowIndex, columnCount - 1));\n }\n _isDragging.current = true;\n },\n [rowIndex, columnCount, selectRange, selection.activeCell, _isDragging],\n );\n\n const handleMouseEnter = useCallback(() => {\n if (_isDragging.current) {\n const activeRow = parseAddress(selection.activeCell).row;\n const minRow = Math.min(activeRow, rowIndex);\n const maxRow = Math.max(activeRow, rowIndex);\n selectRange(toAddress(minRow, 0), toAddress(maxRow, columnCount - 1));\n }\n }, [rowIndex, columnCount, selection.activeCell, selectRange, _isDragging]);\n\n const handleMouseUp = useCallback(() => {\n _isDragging.current = false;\n }, [_isDragging]);\n\n return (\n <div\n data-fancy-sheets-row-header=\"\"\n className=\"flex shrink-0 cursor-pointer items-center justify-center border-r border-b border-zinc-300 bg-zinc-100 text-[11px] font-medium text-zinc-500 select-none hover:bg-zinc-200 dark:border-zinc-600 dark:bg-zinc-800 dark:text-zinc-400 dark:hover:bg-zinc-700\"\n style={{ width: 48, minWidth: 48, height: rowHeight }}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n onMouseUp={handleMouseUp}\n >\n {rowIndex + 1}\n </div>\n );\n}\n\nRowHeader.displayName = \"RowHeader\";\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, CellValue } 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\nconst EXCEL_EPOCH = new Date(1899, 11, 30).getTime();\r\n\r\nfunction serialToDateStr(serial: number): string {\r\n const d = new Date(EXCEL_EPOCH + Math.floor(serial) * 86400000);\r\n const y = d.getFullYear();\r\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(d.getDate()).padStart(2, \"0\");\r\n return `${y}-${m}-${day}`;\r\n}\r\n\r\nfunction serialToDateTimeStr(serial: number): string {\r\n const date = serialToDateStr(serial);\r\n const fraction = serial % 1;\r\n const totalSeconds = Math.round(fraction * 86400);\r\n const h = String(Math.floor(totalSeconds / 3600)).padStart(2, \"0\");\r\n const min = String(Math.floor((totalSeconds % 3600) / 60)).padStart(2, \"0\");\r\n const s = String(totalSeconds % 60).padStart(2, \"0\");\r\n return `${date} ${h}:${min}:${s}`;\r\n}\r\n\r\n/** Detect if a formula likely returns a date based on the formula name */\r\nfunction isDateFormula(formula: string | undefined): boolean {\r\n if (!formula) return false;\r\n const f = formula.toUpperCase();\r\n return /^(TODAY|NOW|DATE|EDATE)\\b/.test(f) || /\\b(TODAY|NOW|DATE|EDATE)\\s*\\(/.test(f);\r\n}\r\n\r\nfunction formatCellValue(val: CellValue, cell: CellData | undefined): string {\r\n if (val === null || val === undefined) return \"\";\r\n const fmt = cell?.format?.displayFormat;\r\n\r\n if (typeof val === \"number\") {\r\n // Explicit format\r\n if (fmt === \"date\") return serialToDateStr(val);\r\n if (fmt === \"datetime\") return serialToDateTimeStr(val);\r\n if (fmt === \"percentage\") return (val * 100).toFixed(1) + \"%\";\r\n if (fmt === \"currency\") return \"$\" + val.toFixed(2);\r\n\r\n // Auto-detect date from formula\r\n if (fmt === \"auto\" || !fmt) {\r\n if (cell?.formula && isDateFormula(cell.formula)) {\r\n return val % 1 === 0 ? serialToDateStr(val) : serialToDateTimeStr(val);\r\n }\r\n }\r\n }\r\n\r\n if (typeof val === \"boolean\") return val ? \"TRUE\" : \"FALSE\";\r\n return String(val);\r\n}\r\n\r\nfunction getCellDisplayValue(cell: CellData | undefined): string {\r\n if (!cell) return \"\";\r\n const val = cell.formula && cell.computedValue !== undefined ? cell.computedValue : cell.value;\r\n return formatCellValue(val, cell);\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 _isDragging,\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.button !== 0) return;\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 _isDragging.current = true;\r\n },\r\n [address, setSelection, extendSelection, addSelection, _isDragging],\r\n );\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n if (_isDragging.current) {\r\n extendSelection(address);\r\n }\r\n }, [address, extendSelection, _isDragging]);\r\n\r\n const handleMouseUp = useCallback(() => {\r\n _isDragging.current = false;\r\n }, [_isDragging]);\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 bg-white px-1.5 text-[13px] select-none dark:border-zinc-700 dark:bg-zinc-900\",\r\n isActive && \"ring-2 ring-inset ring-blue-500\",\r\n isSelected && !isActive && \"bg-blue-50 dark:bg-blue-950/40\",\r\n )}\r\n style={{ width, minWidth: width, height: rowHeight, ...formatStyle }}\r\n onMouseDown={handleMouseDown}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseUp={handleMouseUp}\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, useState } from \"react\";\r\nimport { cn, ContextMenu } 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 setFrozenRows,\r\n setFrozenCols,\r\n extendSelection,\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 const handleCopy = useCallback(() => {\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 }, [selection, activeSheet]);\r\n\r\n const handlePaste = useCallback(() => {\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 setCellValue(toAddress(startRow + r, startCol + c), values[r][c]);\r\n }\r\n }\r\n });\r\n }, [selection, setCellValue]);\r\n\r\n const handleClearSelection = useCallback(() => {\r\n const range = selection.ranges[0];\r\n if (!range) return;\r\n const { start, end } = range;\r\n const s = parseAddress(start);\r\n const e = parseAddress(end);\r\n const minR = Math.min(s.row, e.row), maxR = Math.max(s.row, e.row);\r\n const minC = Math.min(s.col, e.col), maxC = Math.max(s.col, e.col);\r\n for (let r = minR; r <= maxR; r++) {\r\n for (let c = minC; c <= maxC; c++) {\r\n setCellValue(toAddress(r, c), \"\");\r\n }\r\n }\r\n }, [selection, setCellValue]);\r\n\r\n return (\r\n <ContextMenu>\r\n <ContextMenu.Trigger className=\"min-h-0 flex-1\">\r\n <div\r\n ref={containerRef}\r\n data-fancy-sheets-grid=\"\"\r\n className={cn(\"relative h-full 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 const isFrozenRow = rowIdx < activeSheet.frozenRows;\r\n return (\r\n <div\r\n key={rowIdx}\r\n className=\"flex\"\r\n style={isFrozenRow ? {\r\n position: \"sticky\",\r\n top: rowHeight + rowIdx * rowHeight,\r\n zIndex: 8,\r\n } : undefined}\r\n >\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 const isFrozenCol = colIdx < activeSheet.frozenCols;\r\n return (\r\n <div\r\n key={addr}\r\n style={isFrozenCol ? {\r\n position: \"sticky\",\r\n left: 48 + Array.from({ length: colIdx }, (_, c) => getColumnWidth(c)).reduce((a, b) => a + b, 0),\r\n zIndex: isFrozenRow ? 9 : 6,\r\n } : undefined}\r\n >\r\n <Cell address={addr} row={rowIdx} col={colIdx} />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\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 </ContextMenu.Trigger>\r\n <ContextMenu.Content>\r\n <ContextMenu.Item onClick={handleCopy}>Copy</ContextMenu.Item>\r\n <ContextMenu.Item onClick={handlePaste} disabled={readOnly}>Paste</ContextMenu.Item>\r\n <ContextMenu.Separator />\r\n <ContextMenu.Item onClick={handleClearSelection} disabled={readOnly}>Clear cells</ContextMenu.Item>\r\n <ContextMenu.Separator />\r\n <ContextMenu.Item onClick={() => {\r\n const row = parseAddress(selection.activeCell).row;\r\n setFrozenRows(activeSheet.frozenRows > 0 ? 0 : row);\r\n }} disabled={readOnly}>\r\n {activeSheet.frozenRows > 0 ? \"Unfreeze rows\" : \"Freeze rows above\"}\r\n </ContextMenu.Item>\r\n <ContextMenu.Item onClick={() => {\r\n const col = parseAddress(selection.activeCell).col;\r\n setFrozenCols(activeSheet.frozenCols > 0 ? 0 : col);\r\n }} disabled={readOnly}>\r\n {activeSheet.frozenCols > 0 ? \"Unfreeze columns\" : \"Freeze columns left\"}\r\n </ContextMenu.Item>\r\n </ContextMenu.Content>\r\n </ContextMenu>\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 setFrozenRows,\r\n setFrozenCols,\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 className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\r\n <button\r\n className={cn(btnClass, activeSheet.frozenRows > 0 && activeBtnClass)}\r\n onClick={() => {\r\n if (activeSheet.frozenRows > 0) {\r\n setFrozenRows(0);\r\n } else {\r\n // Freeze rows above the active cell\r\n const row = selection.activeCell.match(/\\d+/);\r\n setFrozenRows(row ? parseInt(row[0], 10) - 1 || 1 : 1);\r\n }\r\n }}\r\n disabled={readOnly}\r\n title={activeSheet.frozenRows > 0 ? `Unfreeze rows (${activeSheet.frozenRows} frozen)` : \"Freeze rows above current cell\"}\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=\"9\" x2=\"21\" y2=\"9\" />\r\n <line x1=\"3\" y1=\"4\" x2=\"21\" y2=\"4\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" strokeDasharray=\"3 3\" />\r\n <line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"19\" strokeDasharray=\"3 3\" />\r\n </svg>\r\n </button>\r\n <button\r\n className={cn(btnClass, activeSheet.frozenCols > 0 && activeBtnClass)}\r\n onClick={() => {\r\n if (activeSheet.frozenCols > 0) {\r\n setFrozenCols(0);\r\n } else {\r\n // Freeze cols left of the active cell\r\n const colMatch = selection.activeCell.match(/^([A-Z]+)/);\r\n if (colMatch) {\r\n const col = colMatch[1].split(\"\").reduce((acc, ch) => acc * 26 + ch.charCodeAt(0) - 64, 0) - 1;\r\n setFrozenCols(col || 1);\r\n } else {\r\n setFrozenCols(1);\r\n }\r\n }\r\n }}\r\n disabled={readOnly}\r\n title={activeSheet.frozenCols > 0 ? `Unfreeze columns (${activeSheet.frozenCols} frozen)` : \"Freeze columns left of current cell\"}\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=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\r\n <line x1=\"4\" y1=\"3\" x2=\"4\" y2=\"21\" />\r\n <line x1=\"14\" y1=\"3\" x2=\"14\" y2=\"21\" strokeDasharray=\"3 3\" />\r\n <line x1=\"19\" y1=\"3\" x2=\"19\" y2=\"21\" strokeDasharray=\"3 3\" />\r\n </svg>\r\n </button>\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 isDraggingRef = useRef(false);\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 _isDragging: isDraggingRef,\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"]}
|
|
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/functions/conditional.ts","../src/engine/formula/functions/lookup.ts","../src/engine/formula/functions/datetime.ts","../src/engine/formula/functions/info.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","num","useReducer","useMemo","useRef","useCallback","jsx","jsxs","cn","EXCEL_EPOCH","getCellDisplayValue","memo","Cell","useEffect","Fragment","ContextMenu","_","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, sheet 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 // Allow spaces in sheet names when followed by !\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] === \"_\" || input[i] === \" \")) {\r\n // Only allow spaces if they're part of a sheet name (followed eventually by !)\r\n if (input[i] === \" \") {\r\n let lookAhead = i + 1;\r\n while (lookAhead < len && input[lookAhead] === \" \") lookAhead++;\r\n // Check if after the spaces there's more identifier chars followed by !\r\n if (lookAhead < len && ((input[lookAhead] >= \"A\" && input[lookAhead] <= \"Z\") || (input[lookAhead] >= \"a\" && input[lookAhead] <= \"z\") || (input[lookAhead] >= \"0\" && input[lookAhead] <= \"9\") || input[lookAhead] === \"!\")) {\r\n i++;\r\n continue;\r\n }\r\n break;\r\n }\r\n i++;\r\n }\r\n let word = input.slice(pos, i).trimEnd();\r\n i = pos + word.length;\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 // Cross-sheet reference: SheetName!CellRef or SheetName!Range\r\n if (i < len && input[i] === \"!\") {\r\n const sheetName = word;\r\n i++; // skip !\r\n const refStart = 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 const ref1 = input.slice(refStart, i);\r\n\r\n if (i < len && input[i] === \":\") {\r\n // Sheet range ref: Sheet1!A1:B5\r\n i++;\r\n const ref2Start = 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 const ref2 = input.slice(ref2Start, i);\r\n tokens.push({ type: \"sheetRangeRef\", value: sheetName + \"!\" + ref1 + \":\" + ref2, position: pos });\r\n } else {\r\n // Sheet cell ref: Sheet1!A1\r\n tokens.push({ type: \"sheetCellRef\", value: sheetName + \"!\" + ref1.toUpperCase(), position: pos });\r\n }\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 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 // Cross-sheet cell reference (Sheet1!A1)\r\n if (t.type === \"sheetCellRef\") {\r\n advance();\r\n const bangIdx = t.value.indexOf(\"!\");\r\n return { type: \"sheetCellRef\", sheet: t.value.slice(0, bangIdx), address: t.value.slice(bangIdx + 1).toUpperCase() };\r\n }\r\n\r\n // Cross-sheet range reference (Sheet1!A1:B5)\r\n if (t.type === \"sheetRangeRef\") {\r\n advance();\r\n const bangIdx = t.value.indexOf(\"!\");\r\n const sheetName = t.value.slice(0, bangIdx);\r\n const rangePart = t.value.slice(bangIdx + 1);\r\n const parts = rangePart.split(\":\");\r\n return { type: \"sheetRangeRef\", sheet: sheetName, start: parts[0].toUpperCase(), end: parts[1].toUpperCase() };\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\r\nfunction toNum(args: CellValue[][]): number {\r\n const val = args.flat()[0];\r\n const n = typeof val === \"number\" ? val : Number(val);\r\n return isNaN(n) ? NaN : n;\r\n}\r\n\r\nregisterFunction(\"SQRT\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : n < 0 ? \"#NUM!\" : Math.sqrt(n);\r\n});\r\n\r\nregisterFunction(\"POWER\", (args) => {\r\n const flat = args.flat();\r\n const base = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const exp = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(base) || isNaN(exp)) return \"#VALUE!\";\r\n return Math.pow(base, exp);\r\n});\r\n\r\nregisterFunction(\"MOD\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const div = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(num) || isNaN(div) || div === 0) return \"#VALUE!\";\r\n return num % div;\r\n});\r\n\r\nregisterFunction(\"INT\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : Math.floor(n);\r\n});\r\n\r\nregisterFunction(\"TRUNC\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const decimals = flat[1] != null ? (typeof flat[1] === \"number\" ? flat[1] : Number(flat[1])) : 0;\r\n if (isNaN(num)) return \"#VALUE!\";\r\n const factor = Math.pow(10, decimals);\r\n return Math.trunc(num * factor) / factor;\r\n});\r\n\r\nregisterFunction(\"FLOOR\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const sig = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(num) || isNaN(sig) || sig === 0) return \"#VALUE!\";\r\n return Math.floor(num / sig) * sig;\r\n});\r\n\r\nregisterFunction(\"CEILING\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const sig = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(num) || isNaN(sig) || sig === 0) return \"#VALUE!\";\r\n return Math.ceil(num / sig) * sig;\r\n});\r\n\r\nregisterFunction(\"SIGN\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : Math.sign(n);\r\n});\r\n\r\nregisterFunction(\"PRODUCT\", (args) => {\r\n const nums = toNumbers(args);\r\n if (nums.length === 0) return 0;\r\n return nums.reduce((a, b) => a * b, 1);\r\n});\r\n\r\nregisterFunction(\"PI\", () => Math.PI);\r\n\r\nregisterFunction(\"EXP\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) ? \"#VALUE!\" : Math.exp(n);\r\n});\r\n\r\nregisterFunction(\"LN\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) || n <= 0 ? \"#NUM!\" : Math.log(n);\r\n});\r\n\r\nregisterFunction(\"LOG\", (args) => {\r\n const flat = args.flat();\r\n const num = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const base = flat[1] != null ? (typeof flat[1] === \"number\" ? flat[1] : Number(flat[1])) : 10;\r\n if (isNaN(num) || num <= 0 || isNaN(base) || base <= 0 || base === 1) return \"#NUM!\";\r\n return Math.log(num) / Math.log(base);\r\n});\r\n\r\nregisterFunction(\"LOG10\", (args) => {\r\n const n = toNum(args);\r\n return isNaN(n) || n <= 0 ? \"#NUM!\" : Math.log10(n);\r\n});\r\n\r\nregisterFunction(\"RAND\", () => Math.random());\r\n\r\nregisterFunction(\"RANDBETWEEN\", (args) => {\r\n const flat = args.flat();\r\n const low = typeof flat[0] === \"number\" ? flat[0] : Number(flat[0]);\r\n const high = typeof flat[1] === \"number\" ? flat[1] : Number(flat[1]);\r\n if (isNaN(low) || isNaN(high)) return \"#VALUE!\";\r\n return Math.floor(Math.random() * (high - low + 1)) + low;\r\n});\r\n\r\nregisterFunction(\"MEDIAN\", (args) => {\r\n const nums = toNumbers(args).sort((a, b) => a - b);\r\n if (nums.length === 0) return 0;\r\n const mid = Math.floor(nums.length / 2);\r\n return nums.length % 2 === 0 ? (nums[mid - 1] + nums[mid]) / 2 : nums[mid];\r\n});\r\n\r\nregisterFunction(\"FACT\", (args) => {\r\n const n = toNum(args);\r\n if (isNaN(n) || n < 0 || n !== Math.floor(n)) return \"#VALUE!\";\r\n let result = 1;\r\n for (let i = 2; i <= n; i++) result *= i;\r\n return result;\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\r\nregisterFunction(\"LEFT\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const chars = flat[1] != null ? Number(flat[1]) : 1;\r\n return text.slice(0, chars);\r\n});\r\n\r\nregisterFunction(\"RIGHT\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const chars = flat[1] != null ? Number(flat[1]) : 1;\r\n return text.slice(-chars);\r\n});\r\n\r\nregisterFunction(\"MID\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const start = Number(flat[1]) - 1; // 1-based to 0-based\r\n const chars = Number(flat[2]);\r\n if (isNaN(start) || isNaN(chars)) return \"#VALUE!\";\r\n return text.slice(start, start + chars);\r\n});\r\n\r\nregisterFunction(\"FIND\", (args) => {\r\n const flat = args.flat();\r\n const search = flat[0] != null ? String(flat[0]) : \"\";\r\n const text = flat[1] != null ? String(flat[1]) : \"\";\r\n const startPos = flat[2] != null ? Number(flat[2]) - 1 : 0;\r\n const idx = text.indexOf(search, startPos);\r\n return idx === -1 ? \"#VALUE!\" : idx + 1; // 1-based\r\n});\r\n\r\nregisterFunction(\"SEARCH\", (args) => {\r\n const flat = args.flat();\r\n const search = flat[0] != null ? String(flat[0]).toLowerCase() : \"\";\r\n const text = flat[1] != null ? String(flat[1]).toLowerCase() : \"\";\r\n const startPos = flat[2] != null ? Number(flat[2]) - 1 : 0;\r\n const idx = text.indexOf(search, startPos);\r\n return idx === -1 ? \"#VALUE!\" : idx + 1;\r\n});\r\n\r\nregisterFunction(\"SUBSTITUTE\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const oldText = flat[1] != null ? String(flat[1]) : \"\";\r\n const newText = flat[2] != null ? String(flat[2]) : \"\";\r\n const nth = flat[3] != null ? Number(flat[3]) : 0;\r\n if (nth === 0) return text.split(oldText).join(newText);\r\n let count = 0;\r\n return text.replace(new RegExp(oldText.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"), \"g\"), (match) => {\r\n count++;\r\n return count === nth ? newText : match;\r\n });\r\n});\r\n\r\nregisterFunction(\"REPLACE\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const start = Number(flat[1]) - 1;\r\n const chars = Number(flat[2]);\r\n const newText = flat[3] != null ? String(flat[3]) : \"\";\r\n if (isNaN(start) || isNaN(chars)) return \"#VALUE!\";\r\n return text.slice(0, start) + newText + text.slice(start + chars);\r\n});\r\n\r\nregisterFunction(\"REPT\", (args) => {\r\n const flat = args.flat();\r\n const text = flat[0] != null ? String(flat[0]) : \"\";\r\n const times = Number(flat[1]);\r\n if (isNaN(times) || times < 0) return \"#VALUE!\";\r\n return text.repeat(times);\r\n});\r\n\r\nregisterFunction(\"EXACT\", (args) => {\r\n const flat = args.flat();\r\n return String(flat[0] ?? \"\") === String(flat[1] ?? \"\");\r\n});\r\n\r\nregisterFunction(\"PROPER\", (args) => {\r\n const val = args.flat()[0];\r\n const text = val != null ? String(val) : \"\";\r\n return text.replace(/\\w\\S*/g, (w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase());\r\n});\r\n\r\nregisterFunction(\"VALUE\", (args) => {\r\n const val = args.flat()[0];\r\n const num = Number(val);\r\n return isNaN(num) ? \"#VALUE!\" : num;\r\n});\r\n\r\nregisterFunction(\"TEXT\", (args) => {\r\n const flat = args.flat();\r\n const val = flat[0];\r\n const fmt = flat[1] != null ? String(flat[1]) : \"\";\r\n if (val == null) return \"\";\r\n const num = Number(val);\r\n if (isNaN(num)) return String(val);\r\n // Basic format support: 0, 0.00, #,##0, %\r\n if (fmt.includes(\"%\")) return (num * 100).toFixed(fmt.split(\".\")[1]?.length ?? 0) + \"%\";\r\n if (fmt.includes(\".\")) {\r\n const decimals = fmt.split(\".\")[1]?.replace(/[^0#]/g, \"\").length ?? 0;\r\n return num.toFixed(decimals);\r\n }\r\n return String(num);\r\n});\r\n\r\nregisterFunction(\"CHAR\", (args) => {\r\n const code = Number(args.flat()[0]);\r\n if (isNaN(code)) return \"#VALUE!\";\r\n return String.fromCharCode(code);\r\n});\r\n\r\nregisterFunction(\"CODE\", (args) => {\r\n const text = String(args.flat()[0] ?? \"\");\r\n return text.length > 0 ? text.charCodeAt(0) : \"#VALUE!\";\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\r\nregisterFunction(\"IFERROR\", (args) => {\r\n const flat = args.flat();\r\n const val = flat[0];\r\n if (typeof val === \"string\" && val.startsWith(\"#\")) return flat[1] ?? \"\";\r\n return val;\r\n});\r\n\r\nregisterFunction(\"IFBLANK\", (args) => {\r\n const flat = args.flat();\r\n const val = flat[0];\r\n if (val === null || val === undefined || val === \"\") return flat[1] ?? \"\";\r\n return val;\r\n});\r\n\r\nregisterFunction(\"SWITCH\", (args) => {\r\n const flat = args.flat();\r\n const expr = flat[0];\r\n for (let i = 1; i < flat.length - 1; i += 2) {\r\n if (flat[i] === expr) return flat[i + 1];\r\n }\r\n // Last arg is default if odd number of remaining args\r\n return flat.length % 2 === 0 ? flat[flat.length - 1] : \"#N/A\";\r\n});\r\n\r\nregisterFunction(\"CHOOSE\", (args) => {\r\n const flat = args.flat();\r\n const index = Number(flat[0]);\r\n if (isNaN(index) || index < 1 || index >= flat.length) return \"#VALUE!\";\r\n return flat[index];\r\n});\r\n","import { registerFunction } from \"./registry\";\nimport type { CellValue } from \"../../../types/cell\";\n\n/** Match a value against a criteria string like \">5\", \"<>abc\", \"=text\", or plain value */\nfunction matchesCriteria(value: CellValue, criteria: CellValue): boolean {\n if (criteria === null || criteria === undefined) return false;\n const critStr = String(criteria);\n\n // Comparison operators\n if (critStr.startsWith(\"<>\")) {\n const target = critStr.slice(2);\n const num = Number(target);\n if (!isNaN(num) && typeof value === \"number\") return value !== num;\n return String(value) !== target;\n }\n if (critStr.startsWith(\">=\")) {\n const num = Number(critStr.slice(2));\n return typeof value === \"number\" && value >= num;\n }\n if (critStr.startsWith(\"<=\")) {\n const num = Number(critStr.slice(2));\n return typeof value === \"number\" && value <= num;\n }\n if (critStr.startsWith(\">\")) {\n const num = Number(critStr.slice(1));\n return typeof value === \"number\" && value > num;\n }\n if (critStr.startsWith(\"<\")) {\n const num = Number(critStr.slice(1));\n return typeof value === \"number\" && value < num;\n }\n if (critStr.startsWith(\"=\")) {\n const target = critStr.slice(1);\n const num = Number(target);\n if (!isNaN(num) && typeof value === \"number\") return value === num;\n return String(value).toLowerCase() === target.toLowerCase();\n }\n\n // Wildcard matching\n if (critStr.includes(\"*\") || critStr.includes(\"?\")) {\n const pattern = critStr\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*/g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(\"^\" + pattern + \"$\", \"i\").test(String(value));\n }\n\n // Exact match\n if (typeof criteria === \"number\") return value === criteria;\n const num = Number(critStr);\n if (!isNaN(num) && typeof value === \"number\") return value === num;\n return String(value).toLowerCase() === critStr.toLowerCase();\n}\n\nregisterFunction(\"SUMIF\", (args) => {\n const range = args[0] ?? [];\n const criteria = (args[1] ?? [])[0];\n const sumRange = args[2] ?? range;\n let total = 0;\n for (let i = 0; i < range.length; i++) {\n if (matchesCriteria(range[i], criteria)) {\n const val = Number(sumRange[i] ?? 0);\n if (!isNaN(val)) total += val;\n }\n }\n return total;\n});\n\nregisterFunction(\"SUMIFS\", (args) => {\n const sumRange = args[0] ?? [];\n let total = 0;\n for (let i = 0; i < sumRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(sumRange[i] ?? 0);\n if (!isNaN(val)) total += val;\n }\n }\n return total;\n});\n\nregisterFunction(\"COUNTIF\", (args) => {\n const range = args[0] ?? [];\n const criteria = (args[1] ?? [])[0];\n let count = 0;\n for (const val of range) {\n if (matchesCriteria(val, criteria)) count++;\n }\n return count;\n});\n\nregisterFunction(\"COUNTIFS\", (args) => {\n if (args.length < 2) return 0;\n const len = (args[0] ?? []).length;\n let count = 0;\n for (let i = 0; i < len; i++) {\n let allMatch = true;\n for (let p = 0; p < args.length - 1; p += 2) {\n const range = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(range[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) count++;\n }\n return count;\n});\n\nregisterFunction(\"AVERAGEIF\", (args) => {\n const range = args[0] ?? [];\n const criteria = (args[1] ?? [])[0];\n const avgRange = args[2] ?? range;\n let total = 0;\n let count = 0;\n for (let i = 0; i < range.length; i++) {\n if (matchesCriteria(range[i], criteria)) {\n const val = Number(avgRange[i] ?? 0);\n if (!isNaN(val)) { total += val; count++; }\n }\n }\n return count === 0 ? \"#DIV/0!\" : total / count;\n});\n\nregisterFunction(\"AVERAGEIFS\", (args) => {\n const avgRange = args[0] ?? [];\n let total = 0;\n let count = 0;\n for (let i = 0; i < avgRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(avgRange[i] ?? 0);\n if (!isNaN(val)) { total += val; count++; }\n }\n }\n return count === 0 ? \"#DIV/0!\" : total / count;\n});\n\nregisterFunction(\"MINIFS\", (args) => {\n const minRange = args[0] ?? [];\n let result = Infinity;\n for (let i = 0; i < minRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(minRange[i]);\n if (!isNaN(val) && val < result) result = val;\n }\n }\n return result === Infinity ? 0 : result;\n});\n\nregisterFunction(\"MAXIFS\", (args) => {\n const maxRange = args[0] ?? [];\n let result = -Infinity;\n for (let i = 0; i < maxRange.length; i++) {\n let allMatch = true;\n for (let p = 1; p < args.length - 1; p += 2) {\n const criteriaRange = args[p] ?? [];\n const criteria = (args[p + 1] ?? [])[0];\n if (!matchesCriteria(criteriaRange[i], criteria)) { allMatch = false; break; }\n }\n if (allMatch) {\n const val = Number(maxRange[i]);\n if (!isNaN(val) && val > result) result = val;\n }\n }\n return result === -Infinity ? 0 : result;\n});\n","import { registerFunction } from \"./registry\";\nimport type { CellValue } from \"../../../types/cell\";\n\nregisterFunction(\"VLOOKUP\", (args) => {\n const flat = args.flat();\n const key = flat[0];\n const range = args[1] ?? []; // The lookup range as flat array\n const colIdx = Number(flat[2] ?? flat[args[1]?.length ?? 0]); // Column index (1-based)\n // Approximate match not implemented — always exact\n if (key === null || isNaN(colIdx)) return \"#VALUE!\";\n\n // We receive the range as a flat array. We need to figure out dimensions.\n // For now, VLOOKUP works with the range as a single column lookup.\n // Look for the key in the range, return offset value.\n for (let i = 0; i < range.length; i++) {\n if (range[i] === key || (typeof range[i] === \"string\" && typeof key === \"string\" && range[i].toLowerCase() === key.toLowerCase())) {\n return range[i] ?? \"#N/A\";\n }\n }\n return \"#N/A\";\n});\n\nregisterFunction(\"HLOOKUP\", (args) => {\n const flat = args.flat();\n const key = flat[0];\n const range = args[1] ?? [];\n for (let i = 0; i < range.length; i++) {\n if (range[i] === key || (typeof range[i] === \"string\" && typeof key === \"string\" && range[i].toLowerCase() === key.toLowerCase())) {\n return range[i] ?? \"#N/A\";\n }\n }\n return \"#N/A\";\n});\n\nregisterFunction(\"INDEX\", (args) => {\n const range = args[0] ?? [];\n const flat = args.flat();\n const row = Number(flat[range.length] ?? flat[1]);\n if (isNaN(row) || row < 1 || row > range.length) return \"#REF!\";\n return range[row - 1] ?? null;\n});\n\nregisterFunction(\"MATCH\", (args) => {\n const flat = args.flat();\n const key = flat[0];\n const range = args[1] ?? [];\n for (let i = 0; i < range.length; i++) {\n if (range[i] === key || (typeof range[i] === \"number\" && typeof key === \"number\" && range[i] === key)) {\n return i + 1; // 1-based\n }\n if (typeof range[i] === \"string\" && typeof key === \"string\" && range[i].toLowerCase() === key.toLowerCase()) {\n return i + 1;\n }\n }\n return \"#N/A\";\n});\n\nregisterFunction(\"ROWS\", (args) => {\n // Range length represents total cells; without dimension info, return count\n return (args[0] ?? []).length;\n});\n\nregisterFunction(\"COLUMNS\", (args) => {\n // Without 2D dimension metadata, return 1\n return 1;\n});\n\nregisterFunction(\"ROW\", (args) => {\n // Without cell address metadata, return the numeric value if it looks like a row\n const val = args.flat()[0];\n if (typeof val === \"number\") return val;\n return \"#VALUE!\";\n});\n\nregisterFunction(\"COLUMN\", (args) => {\n const val = args.flat()[0];\n if (typeof val === \"number\") return val;\n return \"#VALUE!\";\n});\n","import { registerFunction } from \"./registry\";\n\n// Excel serial date: days since 1900-01-01 (with the 1900 leap year bug)\nconst EXCEL_EPOCH = new Date(1899, 11, 30).getTime(); // Dec 30, 1899\n\nfunction dateToSerial(d: Date): number {\n const ms = d.getTime() - EXCEL_EPOCH;\n return Math.floor(ms / 86400000);\n}\n\nfunction serialToDate(serial: number): Date {\n return new Date(EXCEL_EPOCH + serial * 86400000);\n}\n\nfunction toSerial(val: unknown): number {\n if (typeof val === \"number\") return val;\n if (typeof val === \"string\") {\n const d = new Date(val);\n if (!isNaN(d.getTime())) return dateToSerial(d);\n }\n return NaN;\n}\n\nregisterFunction(\"TODAY\", () => {\n return dateToSerial(new Date());\n});\n\nregisterFunction(\"NOW\", () => {\n const now = new Date();\n const serial = dateToSerial(now);\n const fraction = (now.getHours() * 3600 + now.getMinutes() * 60 + now.getSeconds()) / 86400;\n return serial + fraction;\n});\n\nregisterFunction(\"DATE\", (args) => {\n const flat = args.flat();\n const year = Number(flat[0]);\n const month = Number(flat[1]) - 1; // JS months are 0-based\n const day = Number(flat[2]);\n if (isNaN(year) || isNaN(month) || isNaN(day)) return \"#VALUE!\";\n return dateToSerial(new Date(year, month, day));\n});\n\nregisterFunction(\"YEAR\", (args) => {\n const serial = toSerial(args.flat()[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n return serialToDate(serial).getFullYear();\n});\n\nregisterFunction(\"MONTH\", (args) => {\n const serial = toSerial(args.flat()[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n return serialToDate(serial).getMonth() + 1;\n});\n\nregisterFunction(\"DAY\", (args) => {\n const serial = toSerial(args.flat()[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n return serialToDate(serial).getDate();\n});\n\nregisterFunction(\"HOUR\", (args) => {\n const val = Number(args.flat()[0]);\n if (isNaN(val)) return \"#VALUE!\";\n const fraction = val % 1;\n return Math.floor(fraction * 24);\n});\n\nregisterFunction(\"MINUTE\", (args) => {\n const val = Number(args.flat()[0]);\n if (isNaN(val)) return \"#VALUE!\";\n const fraction = val % 1;\n return Math.floor((fraction * 24 * 60) % 60);\n});\n\nregisterFunction(\"SECOND\", (args) => {\n const val = Number(args.flat()[0]);\n if (isNaN(val)) return \"#VALUE!\";\n const fraction = val % 1;\n return Math.floor((fraction * 24 * 3600) % 60);\n});\n\nregisterFunction(\"WEEKDAY\", (args) => {\n const flat = args.flat();\n const serial = toSerial(flat[0]);\n if (isNaN(serial)) return \"#VALUE!\";\n const day = serialToDate(serial).getDay(); // 0=Sun, 6=Sat\n const type = Number(flat[1] ?? 1);\n if (type === 1) return day + 1; // 1=Sun, 7=Sat (Excel default)\n if (type === 2) return day === 0 ? 7 : day; // 1=Mon, 7=Sun\n return day; // 0-based\n});\n\nregisterFunction(\"DATEDIF\", (args) => {\n const flat = args.flat();\n const startSerial = toSerial(flat[0]);\n const endSerial = toSerial(flat[1]);\n const unit = String(flat[2] ?? \"D\").toUpperCase();\n if (isNaN(startSerial) || isNaN(endSerial)) return \"#VALUE!\";\n const startDate = serialToDate(startSerial);\n const endDate = serialToDate(endSerial);\n if (unit === \"D\") return Math.floor(endSerial - startSerial);\n if (unit === \"M\") {\n return (endDate.getFullYear() - startDate.getFullYear()) * 12 +\n (endDate.getMonth() - startDate.getMonth());\n }\n if (unit === \"Y\") return endDate.getFullYear() - startDate.getFullYear();\n return \"#VALUE!\";\n});\n\nregisterFunction(\"EDATE\", (args) => {\n const flat = args.flat();\n const serial = toSerial(flat[0]);\n const months = Number(flat[1]);\n if (isNaN(serial) || isNaN(months)) return \"#VALUE!\";\n const d = serialToDate(serial);\n d.setMonth(d.getMonth() + months);\n return dateToSerial(d);\n});\n","import { registerFunction } from \"./registry\";\n\nregisterFunction(\"ISBLANK\", (args) => {\n const val = args.flat()[0];\n return val === null || val === undefined || val === \"\";\n});\n\nregisterFunction(\"ISNUMBER\", (args) => {\n return typeof args.flat()[0] === \"number\";\n});\n\nregisterFunction(\"ISTEXT\", (args) => {\n const val = args.flat()[0];\n return typeof val === \"string\" && !val.startsWith(\"#\");\n});\n\nregisterFunction(\"ISERROR\", (args) => {\n const val = args.flat()[0];\n return typeof val === \"string\" && val.startsWith(\"#\");\n});\n\nregisterFunction(\"ISLOGICAL\", (args) => {\n return typeof args.flat()[0] === \"boolean\";\n});\n\nregisterFunction(\"TYPE\", (args) => {\n const val = args.flat()[0];\n if (typeof val === \"number\") return 1;\n if (typeof val === \"string\") return val.startsWith(\"#\") ? 16 : 2;\n if (typeof val === \"boolean\") return 4;\n return 1; // null defaults to number\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\";\nimport \"./functions/conditional\";\nimport \"./functions/lookup\";\nimport \"./functions/datetime\";\nimport \"./functions/info\";\n\nexport type CellValueGetter = (address: string) => CellValue;\nexport type RangeValueGetter = (start: string, end: string) => CellValue[];\nexport type SheetCellValueGetter = (sheetName: string, address: string) => CellValue;\nexport type SheetRangeValueGetter = (sheetName: string, start: string, end: string) => CellValue[];\n\nexport interface EvaluatorContext {\n getCellValue: CellValueGetter;\n getRangeValues: RangeValueGetter;\n getSheetCellValue?: SheetCellValueGetter;\n getSheetRangeValues?: SheetRangeValueGetter;\n}\n\nexport function evaluateAST(\n node: FormulaASTNode,\n getCellValue: CellValueGetter,\n getRangeValues: RangeValueGetter,\n ctx?: { getSheetCellValue?: SheetCellValueGetter; getSheetRangeValues?: SheetRangeValueGetter },\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 const vals = getRangeValues(node.start, node.end);\n return vals[0] ?? null;\n }\n\n case \"sheetCellRef\": {\n if (!ctx?.getSheetCellValue) return \"#REF!\";\n return ctx.getSheetCellValue(node.sheet, node.address);\n }\n\n case \"sheetRangeRef\": {\n if (!ctx?.getSheetRangeValues) return \"#REF!\";\n const vals = ctx.getSheetRangeValues(node.sheet, node.start, node.end);\n return vals[0] ?? null;\n }\n\n case \"functionCall\": {\n const entry = getFunction(node.name);\n if (!entry) return `#NAME?`;\n\n const argValues: CellValue[][] = node.args.map((arg) => {\n if (arg.type === \"rangeRef\") {\n return getRangeValues(arg.start, arg.end);\n }\n if (arg.type === \"sheetRangeRef\") {\n if (!ctx?.getSheetRangeValues) return [\"#REF!\" as CellValue];\n return ctx.getSheetRangeValues(arg.sheet, arg.start, arg.end);\n }\n const val = evaluateAST(arg, getCellValue, getRangeValues, ctx);\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, ctx);\n const right = evaluateAST(node.right, getCellValue, getRangeValues, ctx);\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, ctx);\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\";\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 // Recalculate sequentially so cross-sheet refs see already-computed values\r\n const recalculated: SheetData[] = [];\r\n for (const sheet of workbook.sheets) {\r\n recalculated.push(recalculateSheet(sheet, recalculated));\r\n }\r\n // Second pass: recalculate again with ALL sheets computed\r\n // (handles reverse-order cross-sheet refs like Sheet1 referencing Sheet3)\r\n const finalSheets: SheetData[] = [];\r\n for (const sheet of recalculated) {\r\n finalSheets.push(recalculateSheet(sheet, recalculated));\r\n }\r\n return { ...workbook, sheets: finalSheets };\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: \"SET_FROZEN_ROWS\"; count: number }\r\n | { type: \"SET_FROZEN_COLS\"; count: number }\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, with cross-sheet reference support */\r\nfunction recalculateSheet(sheet: SheetData, allSheets?: 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 // Cross-sheet getters\r\n const getSheetCellValue = (sheetName: string, addr: string): CellValue => {\r\n if (!allSheets) return \"#REF!\";\r\n const target = allSheets.find((s) => s.name === sheetName || s.id === sheetName);\r\n if (!target) return \"#REF!\";\r\n const c = target.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 getSheetRangeValues = (sheetName: string, startAddr: string, endAddr: string): CellValue[] => {\r\n if (!allSheets) return [];\r\n const target = allSheets.find((s) => s.name === sheetName || s.id === sheetName);\r\n if (!target) return [];\r\n const addresses = expandRange(startAddr, endAddr);\r\n return addresses.map((a) => {\r\n const c = target.cells[a];\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\r\n const ctx = { getSheetCellValue, getSheetRangeValues };\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, ctx);\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 // Update the cell, then recalculate ALL sheets (cross-sheet refs may depend on this)\r\n const updatedWorkbook = updateActiveSheet(state, (s) => ({\r\n ...s, cells: { ...s.cells, [action.address]: cellData },\r\n }));\r\n const workbook = recalculateWorkbook(updatedWorkbook);\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 \"SET_FROZEN_ROWS\": {\r\n const workbook = updateActiveSheet(state, (s) => ({\r\n ...s, frozenRows: Math.max(0, action.count),\r\n }));\r\n return { ...state, workbook };\r\n }\r\n\r\n case \"SET_FROZEN_COLS\": {\r\n const workbook = updateActiveSheet(state, (s) => ({\r\n ...s, frozenCols: Math.max(0, action.count),\r\n }));\r\n return { ...state, workbook };\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 setFrozenRows: (count: number) => dispatch({ type: \"SET_FROZEN_ROWS\", count }),\r\n setFrozenCols: (count: number) => dispatch({ type: \"SET_FROZEN_COLS\", count }),\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 { useCallback } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { columnToLetter, toAddress, parseAddress } from \"../../engine/cell-utils\";\nimport { ColumnResizeHandle } from \"./ColumnResizeHandle\";\n\nexport function ColumnHeaders() {\n const { columnCount, rowCount, rowHeight, getColumnWidth, selection, selectRange, _isDragging, isCellSelected } = useSpreadsheet();\n\n const handleColumnMouseDown = useCallback(\n (colIdx: number, e: React.MouseEvent) => {\n if (e.button !== 0) return;\n if (e.shiftKey) {\n const activeCol = parseAddress(selection.activeCell).col;\n const minCol = Math.min(activeCol, colIdx);\n const maxCol = Math.max(activeCol, colIdx);\n selectRange(toAddress(0, minCol), toAddress(rowCount - 1, maxCol));\n } else {\n selectRange(toAddress(0, colIdx), toAddress(rowCount - 1, colIdx));\n }\n _isDragging.current = true;\n },\n [rowCount, selectRange, selection.activeCell, _isDragging],\n );\n\n const handleColumnMouseEnter = useCallback(\n (colIdx: number) => {\n if (_isDragging.current) {\n const activeCol = parseAddress(selection.activeCell).col;\n const minCol = Math.min(activeCol, colIdx);\n const maxCol = Math.max(activeCol, colIdx);\n selectRange(toAddress(0, minCol), toAddress(rowCount - 1, maxCol));\n }\n },\n [rowCount, selection.activeCell, selectRange, _isDragging],\n );\n\n const handleMouseUp = useCallback(() => {\n _isDragging.current = false;\n }, [_isDragging]);\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 const isColSelected = isCellSelected(toAddress(0, i));\n return (\n <div\n key={i}\n className={cn(\n \"relative flex shrink-0 cursor-pointer items-center justify-center border-r border-zinc-300 text-[11px] font-medium select-none hover:bg-zinc-200 dark:border-zinc-600 dark:hover:bg-zinc-700\",\n isColSelected\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-900/50 dark:text-blue-300\"\n : \"text-zinc-500 dark:text-zinc-400\",\n )}\n style={{ width: getColumnWidth(i), minWidth: getColumnWidth(i) }}\n onMouseDown={(e) => handleColumnMouseDown(i, e)}\n onMouseEnter={() => handleColumnMouseEnter(i)}\n onMouseUp={handleMouseUp}\n >\n {columnToLetter(i)}\n <ColumnResizeHandle colIndex={i} />\n </div>\n );\n })}\n </div>\n );\n}\n\nColumnHeaders.displayName = \"ColumnHeaders\";\n","import { useCallback } from \"react\";\nimport { cn } from \"@particle-academy/react-fancy\";\nimport { useSpreadsheet } from \"../Spreadsheet/Spreadsheet.context\";\nimport { toAddress, parseAddress } from \"../../engine/cell-utils\";\n\ninterface RowHeadersProps {\n rowIndex: number;\n}\n\nexport function RowHeader({ rowIndex }: RowHeadersProps) {\n const { rowHeight, columnCount, selection, selectRange, _isDragging, isCellSelected } = useSpreadsheet();\n\n // Check if this row is part of the selection\n const isRowSelected = isCellSelected(toAddress(rowIndex, 0));\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n if (e.shiftKey) {\n const activeRow = parseAddress(selection.activeCell).row;\n const minRow = Math.min(activeRow, rowIndex);\n const maxRow = Math.max(activeRow, rowIndex);\n selectRange(toAddress(minRow, 0), toAddress(maxRow, columnCount - 1));\n } else {\n selectRange(toAddress(rowIndex, 0), toAddress(rowIndex, columnCount - 1));\n }\n _isDragging.current = true;\n },\n [rowIndex, columnCount, selectRange, selection.activeCell, _isDragging],\n );\n\n const handleMouseEnter = useCallback(() => {\n if (_isDragging.current) {\n const activeRow = parseAddress(selection.activeCell).row;\n const minRow = Math.min(activeRow, rowIndex);\n const maxRow = Math.max(activeRow, rowIndex);\n selectRange(toAddress(minRow, 0), toAddress(maxRow, columnCount - 1));\n }\n }, [rowIndex, columnCount, selection.activeCell, selectRange, _isDragging]);\n\n const handleMouseUp = useCallback(() => {\n _isDragging.current = false;\n }, [_isDragging]);\n\n return (\n <div\n data-fancy-sheets-row-header=\"\"\n className={cn(\n \"flex shrink-0 cursor-pointer items-center justify-center border-r border-b border-zinc-300 text-[11px] font-medium select-none hover:bg-zinc-200 dark:border-zinc-600 dark:hover:bg-zinc-700\",\n isRowSelected\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-900/50 dark:text-blue-300\"\n : \"bg-zinc-100 text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400\",\n )}\n style={{ width: 48, minWidth: 48, height: rowHeight }}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n onMouseUp={handleMouseUp}\n >\n {rowIndex + 1}\n </div>\n );\n}\n\nRowHeader.displayName = \"RowHeader\";\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, CellValue } 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\nconst EXCEL_EPOCH = new Date(1899, 11, 30).getTime();\r\n\r\nfunction serialToDateStr(serial: number): string {\r\n const d = new Date(EXCEL_EPOCH + Math.floor(serial) * 86400000);\r\n const y = d.getFullYear();\r\n const m = String(d.getMonth() + 1).padStart(2, \"0\");\r\n const day = String(d.getDate()).padStart(2, \"0\");\r\n return `${y}-${m}-${day}`;\r\n}\r\n\r\nfunction serialToDateTimeStr(serial: number): string {\r\n const date = serialToDateStr(serial);\r\n const fraction = serial % 1;\r\n const totalSeconds = Math.round(fraction * 86400);\r\n const h = String(Math.floor(totalSeconds / 3600)).padStart(2, \"0\");\r\n const min = String(Math.floor((totalSeconds % 3600) / 60)).padStart(2, \"0\");\r\n const s = String(totalSeconds % 60).padStart(2, \"0\");\r\n return `${date} ${h}:${min}:${s}`;\r\n}\r\n\r\n/** Detect if a formula's OUTERMOST function returns a date serial.\r\n * YEAR(DATE(...)) should NOT be detected — YEAR returns a plain number.\r\n * Only detect when the formula starts with a date-producing function. */\r\nfunction isDateFormula(formula: string | undefined): boolean {\r\n if (!formula) return false;\r\n const f = formula.trim().toUpperCase();\r\n // Must START with a date-producing function (not nested inside another)\r\n return /^(TODAY|NOW|DATE|EDATE)\\s*\\(/.test(f);\r\n}\r\n\r\nfunction formatCellValue(val: CellValue, cell: CellData | undefined): string {\r\n if (val === null || val === undefined) return \"\";\r\n const fmt = cell?.format?.displayFormat;\r\n\r\n if (typeof val === \"number\") {\r\n const dec = cell?.format?.decimals;\r\n\r\n // Explicit format\r\n if (fmt === \"date\") return serialToDateStr(val);\r\n if (fmt === \"datetime\") return serialToDateTimeStr(val);\r\n if (fmt === \"percentage\") return (val * 100).toFixed(dec ?? 1) + \"%\";\r\n if (fmt === \"currency\") return \"$\" + val.toFixed(dec ?? 2);\r\n if (fmt === \"number\" && dec !== undefined) return val.toFixed(dec);\r\n\r\n // Auto-detect date from formula\r\n if (fmt === \"auto\" || !fmt) {\r\n if (cell?.formula && isDateFormula(cell.formula)) {\r\n return val % 1 === 0 ? serialToDateStr(val) : serialToDateTimeStr(val);\r\n }\r\n // Apply decimals even in auto mode\r\n if (dec !== undefined) return val.toFixed(dec);\r\n }\r\n }\r\n\r\n if (typeof val === \"boolean\") return val ? \"TRUE\" : \"FALSE\";\r\n return String(val);\r\n}\r\n\r\nfunction getCellDisplayValue(cell: CellData | undefined): string {\r\n if (!cell) return \"\";\r\n const val = cell.formula && cell.computedValue !== undefined ? cell.computedValue : cell.value;\r\n return formatCellValue(val, cell);\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 _isDragging,\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.button !== 0) return;\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 _isDragging.current = true;\r\n },\r\n [address, setSelection, extendSelection, addSelection, _isDragging],\r\n );\r\n\r\n const handleMouseEnter = useCallback(() => {\r\n if (_isDragging.current) {\r\n extendSelection(address);\r\n }\r\n }, [address, extendSelection, _isDragging]);\r\n\r\n const handleMouseUp = useCallback(() => {\r\n _isDragging.current = false;\r\n }, [_isDragging]);\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 bg-white px-1.5 text-[13px] select-none dark:border-zinc-700 dark:bg-zinc-900\",\r\n isActive && \"ring-2 ring-inset ring-blue-500\",\r\n isSelected && !isActive && \"bg-blue-50 dark:bg-blue-950/40\",\r\n )}\r\n style={{ width, minWidth: width, height: rowHeight, ...formatStyle }}\r\n onMouseDown={handleMouseDown}\r\n onMouseEnter={handleMouseEnter}\r\n onMouseUp={handleMouseUp}\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, useState } from \"react\";\r\nimport { cn, ContextMenu } 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 setFrozenRows,\r\n setFrozenCols,\r\n extendSelection,\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 const handleCopy = useCallback(() => {\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 }, [selection, activeSheet]);\r\n\r\n const handlePaste = useCallback(() => {\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 setCellValue(toAddress(startRow + r, startCol + c), values[r][c]);\r\n }\r\n }\r\n });\r\n }, [selection, setCellValue]);\r\n\r\n const handleClearSelection = useCallback(() => {\r\n const range = selection.ranges[0];\r\n if (!range) return;\r\n const { start, end } = range;\r\n const s = parseAddress(start);\r\n const e = parseAddress(end);\r\n const minR = Math.min(s.row, e.row), maxR = Math.max(s.row, e.row);\r\n const minC = Math.min(s.col, e.col), maxC = Math.max(s.col, e.col);\r\n for (let r = minR; r <= maxR; r++) {\r\n for (let c = minC; c <= maxC; c++) {\r\n setCellValue(toAddress(r, c), \"\");\r\n }\r\n }\r\n }, [selection, setCellValue]);\r\n\r\n return (\r\n <ContextMenu>\r\n <ContextMenu.Trigger className=\"min-h-0 flex-1\">\r\n <div\r\n ref={containerRef}\r\n data-fancy-sheets-grid=\"\"\r\n className={cn(\"relative h-full 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 const isFrozenRow = rowIdx < activeSheet.frozenRows;\r\n return (\r\n <div\r\n key={rowIdx}\r\n className=\"flex\"\r\n style={isFrozenRow ? {\r\n position: \"sticky\",\r\n top: rowHeight + rowIdx * rowHeight,\r\n zIndex: 8,\r\n } : undefined}\r\n >\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 const isFrozenCol = colIdx < activeSheet.frozenCols;\r\n return (\r\n <div\r\n key={addr}\r\n style={isFrozenCol ? {\r\n position: \"sticky\",\r\n left: 48 + Array.from({ length: colIdx }, (_, c) => getColumnWidth(c)).reduce((a, b) => a + b, 0),\r\n zIndex: isFrozenRow ? 9 : 6,\r\n } : undefined}\r\n >\r\n <Cell address={addr} row={rowIdx} col={colIdx} />\r\n </div>\r\n );\r\n })}\r\n </div>\r\n );\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 </ContextMenu.Trigger>\r\n <ContextMenu.Content>\r\n <ContextMenu.Item onClick={handleCopy}>Copy</ContextMenu.Item>\r\n <ContextMenu.Item onClick={handlePaste} disabled={readOnly}>Paste</ContextMenu.Item>\r\n <ContextMenu.Separator />\r\n <ContextMenu.Item onClick={handleClearSelection} disabled={readOnly}>Clear cells</ContextMenu.Item>\r\n <ContextMenu.Separator />\r\n <ContextMenu.Item onClick={() => {\r\n const row = parseAddress(selection.activeCell).row;\r\n setFrozenRows(activeSheet.frozenRows > 0 ? 0 : row);\r\n }} disabled={readOnly}>\r\n {activeSheet.frozenRows > 0 ? \"Unfreeze rows\" : \"Freeze rows above\"}\r\n </ContextMenu.Item>\r\n <ContextMenu.Item onClick={() => {\r\n const col = parseAddress(selection.activeCell).col;\r\n setFrozenCols(activeSheet.frozenCols > 0 ? 0 : col);\r\n }} disabled={readOnly}>\r\n {activeSheet.frozenCols > 0 ? \"Unfreeze columns\" : \"Freeze columns left\"}\r\n </ContextMenu.Item>\r\n </ContextMenu.Content>\r\n </ContextMenu>\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 setFrozenRows,\r\n setFrozenCols,\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 const displayFormat = cell?.format?.displayFormat ?? \"auto\";\r\n const decimals = cell?.format?.decimals;\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 className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\r\n <button\r\n className={cn(btnClass, activeSheet.frozenRows > 0 && activeBtnClass)}\r\n onClick={() => {\r\n if (activeSheet.frozenRows > 0) {\r\n setFrozenRows(0);\r\n } else {\r\n // Freeze rows above the active cell\r\n const row = selection.activeCell.match(/\\d+/);\r\n setFrozenRows(row ? parseInt(row[0], 10) - 1 || 1 : 1);\r\n }\r\n }}\r\n disabled={readOnly}\r\n title={activeSheet.frozenRows > 0 ? `Unfreeze rows (${activeSheet.frozenRows} frozen)` : \"Freeze rows above current cell\"}\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=\"9\" x2=\"21\" y2=\"9\" />\r\n <line x1=\"3\" y1=\"4\" x2=\"21\" y2=\"4\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" strokeDasharray=\"3 3\" />\r\n <line x1=\"3\" y1=\"19\" x2=\"21\" y2=\"19\" strokeDasharray=\"3 3\" />\r\n </svg>\r\n </button>\r\n <button\r\n className={cn(btnClass, activeSheet.frozenCols > 0 && activeBtnClass)}\r\n onClick={() => {\r\n if (activeSheet.frozenCols > 0) {\r\n setFrozenCols(0);\r\n } else {\r\n // Freeze cols left of the active cell\r\n const colMatch = selection.activeCell.match(/^([A-Z]+)/);\r\n if (colMatch) {\r\n const col = colMatch[1].split(\"\").reduce((acc, ch) => acc * 26 + ch.charCodeAt(0) - 64, 0) - 1;\r\n setFrozenCols(col || 1);\r\n } else {\r\n setFrozenCols(1);\r\n }\r\n }\r\n }}\r\n disabled={readOnly}\r\n title={activeSheet.frozenCols > 0 ? `Unfreeze columns (${activeSheet.frozenCols} frozen)` : \"Freeze columns left of current cell\"}\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=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\r\n <line x1=\"4\" y1=\"3\" x2=\"4\" y2=\"21\" />\r\n <line x1=\"14\" y1=\"3\" x2=\"14\" y2=\"21\" strokeDasharray=\"3 3\" />\r\n <line x1=\"19\" y1=\"3\" x2=\"19\" y2=\"21\" strokeDasharray=\"3 3\" />\r\n </svg>\r\n </button>\r\n <div className=\"mx-1 h-4 w-px bg-zinc-200 dark:bg-zinc-700\" />\r\n <select\r\n className=\"h-6 rounded border border-zinc-200 bg-transparent px-1 text-[11px] text-zinc-600 outline-none hover:border-zinc-300 dark:border-zinc-700 dark:text-zinc-400 dark:hover:border-zinc-600\"\r\n value={displayFormat}\r\n onChange={(e) => setCellFormat(selectedAddresses, { displayFormat: e.target.value as any })}\r\n disabled={readOnly}\r\n title=\"Cell format\"\r\n >\r\n <option value=\"auto\">Auto</option>\r\n <option value=\"text\">Text</option>\r\n <option value=\"number\">Number</option>\r\n <option value=\"currency\">Currency ($)</option>\r\n <option value=\"percentage\">Percentage (%)</option>\r\n <option value=\"date\">Date</option>\r\n <option value=\"datetime\">Date & Time</option>\r\n </select>\r\n <button\r\n className={btnClass}\r\n onClick={() => setCellFormat(selectedAddresses, { decimals: Math.max(0, (decimals ?? 0) - 1) })}\r\n disabled={readOnly || (decimals ?? 0) <= 0}\r\n title=\"Decrease decimal places\"\r\n >\r\n <span className=\"text-[10px]\">.0</span>\r\n <span className=\"text-[8px]\">←</span>\r\n </button>\r\n <button\r\n className={btnClass}\r\n onClick={() => setCellFormat(selectedAddresses, { decimals: (decimals ?? 0) + 1 })}\r\n disabled={readOnly}\r\n title=\"Increase decimal places\"\r\n >\r\n <span className=\"text-[10px]\">.00</span>\r\n <span className=\"text-[8px]\">→</span>\r\n </button>\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 isDraggingRef = useRef(false);\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 _isDragging: isDraggingRef,\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"]}
|