@particle-academy/fancy-sheets 0.1.0

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