@pixerate/editor-react 0.17.0 → 0.18.1

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/spreadsheet/useSpreadsheetEditor.ts","../src/spreadsheet/SpreadsheetEditor.tsx","../src/spreadsheet/SpreadsheetContextMenu.tsx","../src/spreadsheet/SpreadsheetGroupRow.tsx","../src/spreadsheet/useSpreadsheetTableInteractions.ts","../src/spreadsheet/SpreadsheetValidationDialog.tsx","../src/spreadsheet/SpreadsheetRulePanels.tsx","../src/spreadsheet/useSpreadsheetViewport.ts","../src/spreadsheet/FormulaHints.tsx","../src/spreadsheet/SheetTabs.tsx","../src/spreadsheet/NameManager.tsx"],"sourcesContent":["import { useState, useRef, useCallback, useMemo } from 'react';\nimport {\n SpreadsheetController,\n bindSpreadsheetTableActions,\n type SpreadsheetControllerOptions,\n type SpreadsheetDocument,\n type CellCoordinate,\n type CellRange,\n type SpreadsheetColumn,\n type SpreadsheetRow,\n type SpreadsheetDataSource,\n type SpreadsheetDocument as SheetDocument,\n type SpreadsheetNameScope,\n type SpreadsheetCommitResult,\n type SpreadsheetValidationAction,\n type SpreadsheetValidationPrompt\n} from '@pixerate/editor/spreadsheet';\n\nexport function useSpreadsheetEditor(options: SpreadsheetControllerOptions = {}) {\n // Callbacks are read through a ref so they are never stale.\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const settersRef = useRef<{\n setDoc?: (doc: SpreadsheetDocument) => void;\n setActiveCell?: (cell: CellCoordinate | null) => void;\n setSelectedRange?: (range: CellRange | null) => void;\n }>({});\n\n // Create the controller first so the initial state reflects its document\n // (including default rows and columns when no document is passed).\n const [controller] = useState(\n () =>\n new SpreadsheetController({\n ...options,\n onDocumentChange: (updated) => {\n settersRef.current.setDoc?.({ ...updated });\n optionsRef.current.onDocumentChange?.(updated);\n },\n onSelectionChange: (active, range) => {\n settersRef.current.setActiveCell?.(active);\n settersRef.current.setSelectedRange?.(range);\n optionsRef.current.onSelectionChange?.(active, range);\n },\n onCellCommit: (rowId, colId, raw, value) => {\n optionsRef.current.onCellCommit?.(rowId, colId, raw, value);\n },\n }),\n );\n\n const [doc, setDoc] = useState<SpreadsheetDocument>(() => ({ ...controller.document }));\n const [activeCell, setActiveCell] = useState<CellCoordinate | null>(controller.activeCell);\n const [selectedRange, setSelectedRange] = useState<CellRange | null>(controller.selectedRange);\n const [editingCell, setEditingCell] = useState<CellCoordinate | null>(null);\n const [draftValue, setDraftState] = useState<string>('');\n // Invalid input waiting for the user (data validation alert).\n const [validationPrompt, setValidationPrompt] = useState<SpreadsheetValidationPrompt | null>(null);\n settersRef.current = { setDoc, setActiveCell, setSelectedRange };\n\n // The controller commits its own `draftValue` (`commitEditing()` without an\n // argument), so typed text must reach it, not just React state.\n const setDraftValue = useCallback((value: string) => {\n controller.draftValue = value;\n setDraftState(value);\n }, [controller]);\n\n const setCellValue = useCallback((rowId: string, colId: string, raw: string) => {\n controller.setCellValue(rowId, colId, raw);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const selectCell = useCallback((row: number, col: number, extendSelection = false) => {\n controller.selectCell(row, col, extendSelection);\n setActiveCell(controller.activeCell);\n setSelectedRange(controller.selectedRange);\n }, [controller]);\n\n const selectRange = useCallback((range: CellRange) => {\n controller.selectRange(range);\n setSelectedRange(controller.selectedRange);\n }, [controller]);\n\n const startEditing = useCallback((row?: number, col?: number, initialVal?: string) => {\n controller.startEditing(row, col, initialVal);\n setActiveCell(controller.activeCell);\n setEditingCell(controller.editingCell);\n setDraftValue(controller.draftValue);\n }, [controller]);\n\n // Input breaking a data validation rule is not committed: the editor stays\n // open and `validationPrompt` holds the alert until it is resolved.\n const syncEditing = useCallback(() => {\n setEditingCell(controller.editingCell);\n setDraftValue(controller.draftValue);\n setValidationPrompt(controller.validationPrompt);\n setActiveCell(controller.activeCell);\n setSelectedRange(controller.selectedRange);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const commitEditing = useCallback((val?: string): SpreadsheetCommitResult => {\n const result = controller.commitEditing(val);\n syncEditing();\n return result;\n }, [controller, syncEditing]);\n\n /** Commits input from outside the cell editor (formula bar, list dropdown) with validation. */\n const commitCellInput = useCallback((rowId: string, colId: string, raw: string): SpreadsheetCommitResult => {\n const result = controller.commitCellInput(rowId, colId, raw);\n syncEditing();\n return result;\n }, [controller, syncEditing]);\n\n /** Answers the validation alert: accept (warning / information), retry or cancel. */\n const resolveValidationPrompt = useCallback((action: SpreadsheetValidationAction) => {\n controller.resolveValidationPrompt(action);\n syncEditing();\n }, [controller, syncEditing]);\n\n const cancelEditing = useCallback(() => {\n controller.cancelEditing();\n setEditingCell(null);\n setDraftValue('');\n }, [controller]);\n\n const moveCursor = useCallback((dir: 'up' | 'down' | 'left' | 'right', extend = false) => {\n controller.moveCursor(dir, extend);\n setActiveCell(controller.activeCell);\n setSelectedRange(controller.selectedRange);\n }, [controller]);\n\n const insertColumn = useCallback((index: number, config?: Partial<SpreadsheetColumn>) => {\n controller.insertColumn(index, config);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const deleteColumn = useCallback((colId: string) => {\n controller.deleteColumn(colId);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const insertRow = useCallback((index: number, config?: Partial<SpreadsheetRow>) => {\n controller.insertRow(index, config);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const deleteRow = useCallback((rowId: string) => {\n controller.deleteRow(rowId);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const setColumnWidth = useCallback((colId: string, width: number) => {\n controller.setColumnWidth(colId, width);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const autoFitColumnWidth = useCallback((colId: string, customWidth?: number) => {\n controller.autoFitColumnWidth(colId, customWidth);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const registerDataSource = useCallback((ds: SpreadsheetDataSource) => {\n controller.registerDataSource(ds);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const setPrimaryDataSource = useCallback((id: string | undefined) => {\n controller.setPrimaryDataSource(id);\n setDoc({ ...controller.document });\n }, [controller]);\n\n const recalculateAll = useCallback(() => {\n controller.recalculateAll();\n setDoc({ ...controller.document });\n }, [controller]);\n\n // Undo can switch to the sheet the step belongs to.\n const undo = useCallback(() => {\n controller.undo();\n setDoc({ ...controller.document });\n setActiveCell(controller.activeCell);\n setSelectedRange(controller.selectedRange);\n }, [controller]);\n\n const redo = useCallback(() => {\n controller.redo();\n setDoc({ ...controller.document });\n setActiveCell(controller.activeCell);\n setSelectedRange(controller.selectedRange);\n }, [controller]);\n\n // Table operations (sort, filters, freeze, hide, merge, autofill, categories,\n // transpose, CSV, clipboard). The controller reports their changes through\n // onDocumentChange / onSelectionChange, which update the state above.\n const tableActions = useMemo(() => bindSpreadsheetTableActions(controller), [controller]);\n // What to render: visible rows (with group headers) and columns, frozen\n // offsets and merged-cell spans. Recomputed whenever the document changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const viewModel = useMemo(() => controller.getViewModel(), [controller, doc]);\n // Sheet tabs and defined names. Every workbook change notifies through\n // onDocumentChange, so they follow `doc`.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const sheets = useMemo(() => controller.getSheets(), [controller, doc]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const names = useMemo(() => controller.getNames(), [controller, doc]);\n\n // Switching sheets commits the edit in progress.\n const afterSheetSwitch = useCallback(() => {\n setEditingCell(controller.editingCell);\n setDraftValue(controller.draftValue);\n setActiveCell(controller.activeCell);\n setSelectedRange(controller.selectedRange);\n setDoc({ ...controller.document });\n }, [controller, setDraftValue]);\n\n const workbookActions = useMemo(\n () => ({\n setActiveSheet: (idOrName: string) => {\n const changed = controller.setActiveSheet(idOrName);\n afterSheetSwitch();\n return changed;\n },\n addSheet: (options?: { name?: string; index?: number; document?: Partial<SheetDocument>; activate?: boolean }) => {\n const id = controller.addSheet(options);\n afterSheetSwitch();\n return id;\n },\n renameSheet: (idOrName: string, newName: string) => controller.renameSheet(idOrName, newName),\n moveSheet: (idOrName: string, toIndex: number) => controller.moveSheet(idOrName, toIndex),\n deleteSheet: (idOrName: string) => {\n const deleted = controller.deleteSheet(idOrName);\n afterSheetSwitch();\n return deleted;\n },\n duplicateSheet: (idOrName: string, options?: { name?: string; index?: number; activate?: boolean }) => {\n const id = controller.duplicateSheet(idOrName, options);\n afterSheetSwitch();\n return id;\n },\n defineName: (name: string, refersTo: string, options?: SpreadsheetNameScope & { comment?: string }) =>\n controller.defineName(name, refersTo, options),\n renameName: (oldName: string, newName: string, options?: SpreadsheetNameScope) =>\n controller.renameName(oldName, newName, options),\n deleteName: (name: string, options?: SpreadsheetNameScope) => controller.deleteName(name, options),\n }),\n [controller, afterSheetSwitch],\n );\n\n // Conditional formatting of every formatted cell (re-evaluated incrementally).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const conditionalFormatOverlay = useMemo(() => controller.getConditionalFormatOverlay(), [controller, doc]);\n\n return {\n document: doc,\n activeCell,\n selectedRange,\n editingCell,\n draftValue,\n setDraftValue,\n validationPrompt,\n resolveValidationPrompt,\n commitCellInput,\n controller,\n getCell: (rowId: string, colId: string) => controller.getCell(rowId, colId),\n setCellValue,\n selectCell,\n selectRange,\n startEditing,\n commitEditing,\n cancelEditing,\n moveCursor,\n insertColumn,\n deleteColumn,\n insertRow,\n deleteRow,\n setColumnWidth,\n autoFitColumnWidth,\n loadDocument: (document: SpreadsheetDocument) => {\n controller.loadDocument(document);\n setDoc({ ...controller.document });\n setActiveCell(null);\n setSelectedRange(null);\n setEditingCell(null);\n setDraftValue('');\n },\n syncWithDataSource: () => {\n controller.syncWithDataSource();\n controller.recalculateAll();\n setDoc({ ...controller.document });\n },\n registerDataSource,\n setPrimaryDataSource,\n recalculateAll,\n exportToTsv: (range?: CellRange | null) => controller.exportToTsv(range),\n importFromTsv: (data: string) => {\n controller.importFromTsv(data);\n setDoc({ ...controller.document });\n },\n ...tableActions,\n viewModel,\n /** The sheets in tab order (see `SpreadsheetController.getSheets`). */\n sheets,\n activeSheetId: controller.activeSheetId,\n /** Defined names (see `SpreadsheetController.getNames`). */\n names,\n ...workbookActions,\n conditionalFormatOverlay,\n undo,\n redo\n };\n}\n","import React, { useRef, useState, useMemo, useEffect, useCallback } from 'react';\nimport {\n indexToColName,\n getSpreadsheetMenuItems,\n normalizeRange,\n rangeContains,\n type SpreadsheetColumn,\n type SpreadsheetRow,\n type CellData,\n type CellRange,\n type SpreadsheetMenuItem,\n type SpreadsheetViewColumn,\n type SpreadsheetViewRow,\n formatCellForDisplay,\n numberFormatColorToCss,\n getConditionalFormatCss,\n getConditionalFormatIcon,\n getDataBarCss,\n type ConditionalCellFormat,\n type SpreadsheetPanelId\n} from '@pixerate/editor/spreadsheet';\nimport { useSpreadsheetEditor } from './useSpreadsheetEditor';\nimport { SpreadsheetContextMenu } from './SpreadsheetContextMenu';\nimport { SpreadsheetGroupRow } from './SpreadsheetGroupRow';\nimport { useFillHandle, useSpreadsheetClipboard } from './useSpreadsheetTableInteractions';\nimport { SpreadsheetValidationDialog } from './SpreadsheetValidationDialog';\nimport { SpreadsheetConditionalFormatPanel, SpreadsheetDataValidationPanel } from './SpreadsheetRulePanels';\nimport { useSpreadsheetViewport } from './useSpreadsheetViewport';\n\n// Sizes of the sticky header row and row-number column, for frozen-pane offsets.\nconst COLUMN_HEADER_HEIGHT = 28;\nconst ROW_HEADER_WIDTH = 48;\n\n/** Sticky positioning for cells in frozen rows and/or columns. */\nfunction frozenCellStyle(\n viewRow: Extract<SpreadsheetViewRow, { kind: 'row' }>,\n viewCol: SpreadsheetViewColumn\n): React.CSSProperties | undefined {\n if (!viewRow.frozen && !viewCol.frozen) return undefined;\n return {\n position: 'sticky',\n ...(viewRow.frozen ? { top: COLUMN_HEADER_HEIGHT + viewRow.stickyTop } : {}),\n ...(viewCol.frozen ? { left: ROW_HEADER_WIDTH + viewCol.stickyLeft } : {}),\n zIndex: viewRow.frozen && viewCol.frozen ? 14 : viewRow.frozen ? 12 : 11,\n background: 'var(--background, #fff)'\n };\n}\nimport { FormulaHints } from './FormulaHints';\nimport { SheetTabs } from './SheetTabs';\n\nconst coordKey = (cell: { row: number; col: number } | null) => (cell ? `${indexToColName(cell.col)}${cell.row + 1}` : '');\n\n/** Thin border drawn on the outer edges of a dynamic array's spill range. */\nfunction spillBorderStyle(range: CellRange, row: number, col: number): React.CSSProperties {\n const line = '1px solid color-mix(in srgb, var(--primary, #6366f1) 60%, transparent)';\n return {\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n zIndex: 5,\n borderTop: row === range.startRow ? line : undefined,\n borderBottom: row === range.endRow ? line : undefined,\n borderLeft: col === range.startCol ? line : undefined,\n borderRight: col === range.endCol ? line : undefined\n };\n}\n\n/**\n * A cell's display text: formatted with its number format, numbers\n * right-aligned, `[Red]`-style colours applied. A conditional format adds a\n * data bar and / or an icon, and its font colour wins over the format's.\n */\nfunction CellText({ cell, conditional }: { cell: CellData; conditional?: ConditionalCellFormat }) {\n const shown = formatCellForDisplay(cell);\n const color = conditional?.color ?? (shown.color ? numberFormatColorToCss(shown.color) : undefined);\n const decorated = !!conditional?.dataBar || !!conditional?.icon;\n const text = (\n <span\n className={`truncate block max-w-full ${cell.error ? 'text-destructive font-semibold' : ''}`}\n title={cell.error ? cell.errorMessage ?? cell.error : undefined}\n data-numeric={shown.numeric ? '' : undefined}\n style={\n shown.numeric || color || decorated\n ? {\n ...(decorated ? { position: 'relative' as const } : {}),\n ...(conditional?.icon ? { flex: 1, minWidth: 0 } : {}),\n ...(shown.numeric ? { textAlign: 'right' as const } : {}),\n ...(color ? { color } : {})\n }\n : undefined\n }\n >\n {conditional?.hideValue ? '' : shown.text}\n </span>\n );\n if (!conditional || !decorated) return text;\n const icon = conditional.icon ? getConditionalFormatIcon(conditional.icon.set, conditional.icon.index) : null;\n return (\n <>\n {conditional.dataBar && (\n <span aria-hidden=\"true\" className=\"spreadsheet-data-bar\" style={getDataBarCss(conditional.dataBar) as React.CSSProperties} />\n )}\n {icon ? (\n <span className=\"flex items-center gap-1 min-w-0\" style={{ position: 'relative' }}>\n <span className=\"spreadsheet-cf-icon shrink-0\" role=\"img\" aria-label={icon.label} data-icon={conditional.icon!.id} style={{ color: icon.color }}>\n {icon.glyph}\n </span>\n {text}\n </span>\n ) : (\n text\n )}\n </>\n );\n}\n\nexport interface SpreadsheetEditorProps {\n state?: ReturnType<typeof useSpreadsheetEditor>;\n readOnly?: boolean;\n customCellRenderer?: (props: { row: SpreadsheetRow; col: SpreadsheetColumn; cell: CellData }) => React.ReactNode;\n onAddColumnClick?: () => void;\n onColumnHeaderClick?: (col: SpreadsheetColumn) => void;\n onColumnResize?: (colId: string, width: number) => void;\n /** Show the sheet tabs bar under the grid (add, switch, rename, reorder, delete sheets). */\n showSheetTabs?: boolean;\n /**\n * Render only the rows and columns in (or near) view. `'auto'` (default)\n * virtualises sheets with more than 200 displayed rows or 60 columns;\n * `true` / `false` force it.\n */\n virtualize?: boolean | 'auto';\n}\n\n/** A rendered column, or the space standing for the columns left out. */\ntype ColumnSlot = { kind: 'col'; viewCol: SpreadsheetViewColumn } | { kind: 'space'; key: string; width: number };\n/** A rendered row, or the space standing for the rows left out. */\ntype RowSlot = { kind: 'row'; viewRow: SpreadsheetViewRow } | { kind: 'space'; key: string; height: number };\n\nexport const SpreadsheetEditor: React.FC<SpreadsheetEditorProps> = ({\n state: externalState,\n readOnly = false,\n customCellRenderer,\n onAddColumnClick,\n onColumnHeaderClick,\n onColumnResize,\n showSheetTabs = false,\n virtualize = 'auto'\n}) => {\n const defaultState = useSpreadsheetEditor();\n const state = externalState || defaultState;\n const gridRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n const formulaBarRef = useRef<HTMLInputElement>(null);\n const cellInputRef = useRef<HTMLInputElement>(null);\n\n const [resizingColId, setResizingColId] = useState<string | null>(null);\n const [hoveredColId, setHoveredColId] = useState<string | null>(null);\n const [resizeStartX, setResizeStartX] = useState(0);\n const [resizeStartWidth, setResizeStartWidth] = useState(0);\n\n // Table operations: render model, clipboard, fill handle and context menu.\n const view = state.viewModel;\n // Virtualised rendering: frozen rows/columns, a spacer, the rows and\n // columns in view, another spacer (everything for small sheets).\n const { window: viewWindow, onScroll: handleGridScroll } = useSpreadsheetViewport(scrollRef, view, {\n virtualize,\n merges: state.document.table?.merges,\n activeCell: state.activeCell\n });\n const columnSlots = useMemo<ColumnSlot[]>(() => {\n const col = (viewCol: SpreadsheetViewColumn): ColumnSlot => ({ kind: 'col', viewCol });\n if (!viewWindow.virtual) return view.columns.map(col);\n const slots = view.columns.slice(0, viewWindow.frozenColumns).map(col);\n if (viewWindow.leftSpace > 0) slots.push({ kind: 'space', key: 'space:left', width: viewWindow.leftSpace });\n for (let i = viewWindow.colStart; i < viewWindow.colEnd; i++) slots.push(col(view.columns[i]));\n if (viewWindow.rightSpace > 0) slots.push({ kind: 'space', key: 'space:right', width: viewWindow.rightSpace });\n return slots;\n }, [view, viewWindow]);\n const renderedColumns = useMemo(\n () => columnSlots.flatMap((slot) => (slot.kind === 'col' ? [slot.viewCol] : [])),\n [columnSlots]\n );\n const rowSlots = useMemo<RowSlot[]>(() => {\n const row = (viewRow: SpreadsheetViewRow): RowSlot => ({ kind: 'row', viewRow });\n if (!viewWindow.virtual) return view.rows.map(row);\n const slots = view.rows.slice(0, viewWindow.frozenRows).map(row);\n if (viewWindow.topSpace > 0) slots.push({ kind: 'space', key: 'space:top', height: viewWindow.topSpace });\n for (let i = viewWindow.rowStart; i < viewWindow.rowEnd; i++) slots.push(row(view.rows[i]));\n if (viewWindow.bottomSpace > 0) slots.push({ kind: 'space', key: 'space:bottom', height: viewWindow.bottomSpace });\n return slots;\n }, [view, viewWindow]);\n const { copyShortcutFallback } = useSpreadsheetClipboard(gridRef, state, readOnly);\n const { fillTarget, startFill, extendFill } = useFillHandle(state);\n const [menu, setMenu] = useState<{ x: number; y: number; items: SpreadsheetMenuItem[] } | null>(null);\n // Conditional formatting / data validation manager, opened from the context menu.\n const [panel, setPanel] = useState<SpreadsheetPanelId | null>(null);\n // List dropdown of a list-validated cell.\n const [listMenu, setListMenu] = useState<{ x: number; y: number; row: number; col: number; values: string[] } | null>(null);\n const overlay = state.conditionalFormatOverlay;\n const filter = state.document.table?.filter;\n const filteredColIds = useMemo(\n () => new Set(filter?.enabled ? filter.rules.map((r) => r.colId) : []),\n [filter]\n );\n\n const handleCellContextMenu = useCallback((rIdx: number, cIdx: number, e: React.MouseEvent) => {\n if (readOnly) return;\n e.preventDefault();\n if (state.editingCell) state.commitEditing();\n if (!state.selectedRange || !rangeContains(state.selectedRange, rIdx, cIdx)) {\n state.selectCell(rIdx, cIdx);\n }\n setMenu({ x: e.clientX, y: e.clientY, items: getSpreadsheetMenuItems(state.controller, { row: rIdx, col: cIdx }) });\n }, [readOnly, state]);\n\n // Defined names for formula autocomplete.\n const nameSuggestions = useMemo(\n () => state.controller.getNameSuggestions(),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [state.controller, state.document]\n );\n\n const activeRawValue = useMemo(() => {\n if (!state.activeCell) return '';\n const row = state.document.rows[state.activeCell.row];\n const col = state.document.columns[state.activeCell.col];\n if (!row || !col) return '';\n return state.getCell(row.id, col.id).raw;\n }, [state.activeCell, state.document]);\n\n // The dynamic array under the active cell (anchor or spilled cell): it gets\n // a border, and a spilled cell shows the anchor's formula greyed out.\n const activeSpill = useMemo(\n () => (state.activeCell ? state.controller.getSpillAt(state.activeCell.row, state.activeCell.col) : null),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [state.controller, state.activeCell, state.document]\n );\n const spillFormula = activeSpill && !activeRawValue && activeSpill.key !== coordKey(state.activeCell) ? activeSpill.formula : '';\n\n const coordLabel = useMemo(() => {\n if (!state.activeCell) return '--';\n const colName = indexToColName(state.activeCell.col);\n return `${colName}${state.activeCell.row + 1}`;\n }, [state.activeCell]);\n\n // Text typed in the formula bar while no cell editor is open.\n const [formulaDraft, setFormulaDraft] = useState<string | null>(null);\n const activeColumn = state.activeCell ? state.document.columns[state.activeCell.col] : undefined;\n const formulaBarReadOnly = readOnly || !state.activeCell || !!activeColumn?.readOnly;\n\n useEffect(() => {\n setFormulaDraft(null);\n }, [state.activeCell?.row, state.activeCell?.col]);\n\n const commitFormulaBar = () => {\n if (state.editingCell) {\n state.commitEditing();\n return;\n }\n if (formulaDraft === null || !state.activeCell) return;\n const row = state.document.rows[state.activeCell.row];\n const col = state.document.columns[state.activeCell.col];\n if (row && col && !formulaBarReadOnly && formulaDraft !== activeRawValue) {\n state.commitCellInput(row.id, col.id, formulaDraft);\n }\n setFormulaDraft(null);\n };\n\n const handleCellClick = useCallback((rIdx: number, cIdx: number, e: React.MouseEvent) => {\n if (state.editingCell && (state.editingCell.row !== rIdx || state.editingCell.col !== cIdx)) {\n state.commitEditing();\n }\n state.selectCell(rIdx, cIdx, e.shiftKey);\n }, [state]);\n\n const handleCellDblClick = useCallback((rIdx: number, cIdx: number) => {\n if (readOnly) return;\n const col = state.document.columns[cIdx];\n if (col?.readOnly) return;\n state.startEditing(rIdx, cIdx);\n }, [readOnly, state]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (state.editingCell) {\n if (e.key === 'Enter') {\n e.preventDefault();\n // Invalid input keeps the editor open behind the validation alert.\n if (state.commitEditing().status !== 'committed') return;\n state.moveCursor('down');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n state.cancelEditing();\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (state.commitEditing().status !== 'committed') return;\n state.moveCursor(e.shiftKey ? 'left' : 'right');\n } else {\n return;\n }\n // The cell input unmounts; keep focus on the grid so typing continues.\n gridRef.current?.focus();\n return;\n }\n\n if (!state.activeCell) return;\n\n if (e.altKey && e.key === 'ArrowDown') {\n // Alt+Down opens the list of a list-validated cell.\n e.preventDefault();\n openListMenu(state.activeCell.row, state.activeCell.col);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n state.moveCursor('up', e.shiftKey);\n } else if (e.key === 'ArrowDown') {\n e.preventDefault();\n state.moveCursor('down', e.shiftKey);\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault();\n state.moveCursor('left', e.shiftKey);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n state.moveCursor('right', e.shiftKey);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n state.moveCursor(e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Enter') {\n e.preventDefault();\n const col = state.document.columns[state.activeCell.col];\n if (!readOnly && !col?.readOnly) {\n state.startEditing();\n }\n } else if (e.key === 'Backspace' || e.key === 'Delete') {\n if (readOnly) return;\n const row = state.document.rows[state.activeCell.row];\n const col = state.document.columns[state.activeCell.col];\n if (row && col && !col.readOnly) {\n e.preventDefault();\n state.setCellValue(row.id, col.id, '');\n }\n } else if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'z') {\n // With Shift held, e.key is 'Z'.\n e.preventDefault();\n if (e.shiftKey) {\n state.redo();\n } else {\n state.undo();\n }\n } else if (e.ctrlKey && !e.metaKey && e.key.toLowerCase() === 'y') {\n e.preventDefault();\n state.redo();\n } else if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'c') {\n // Copy the selection, not the whole sheet. The browser's copy event\n // writes TSV, HTML and the internal format; the fallback writes TSV.\n copyShortcutFallback();\n } else if (!readOnly && e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n const col = state.document.columns[state.activeCell.col];\n if (!col?.readOnly) {\n // The key becomes the draft; without preventDefault the browser would\n // also type it into the newly focused cell input (\"1\" -> \"11\").\n e.preventDefault();\n state.startEditing(state.activeCell.row, state.activeCell.col, e.key);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [readOnly, state, copyShortcutFallback]);\n\n // --- Data validation: list dropdown, input message, alerts ---\n\n const activeListValues = useMemo(\n () => (state.activeCell && !readOnly ? state.controller.getValidationListValues(state.activeCell.row, state.activeCell.col) : null),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [state.controller, state.activeCell, state.document, readOnly]\n );\n const activeRule = useMemo(\n () => (state.activeCell ? state.controller.getDataValidationAt(state.activeCell.row, state.activeCell.col) : undefined),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [state.controller, state.activeCell, state.document]\n );\n const inputMessage =\n activeRule && activeRule.showInputMessage !== false && (activeRule.inputTitle || activeRule.inputMessage) ? activeRule : null;\n\n function openListMenu(row: number, col: number, anchor?: HTMLElement | null) {\n if (readOnly || state.document.columns[col]?.readOnly) return;\n const values = state.controller.getValidationListValues(row, col);\n if (!values) return;\n const td = anchor ?? gridRef.current?.querySelector<HTMLElement>(`td[data-row=\"${row}\"][data-col=\"${col}\"]`);\n const rect = td?.getBoundingClientRect();\n setListMenu({ x: rect ? rect.left : 0, y: rect ? rect.bottom : 0, row, col, values });\n }\n\n // Close the list on a press outside it (or on its arrow, which toggles it).\n useEffect(() => {\n if (!listMenu) return;\n const close = (e: MouseEvent) => {\n if (!(e.target as Element | null)?.closest?.('[aria-label=\"Allowed values\"], .spreadsheet-list-arrow')) setListMenu(null);\n };\n window.addEventListener('mousedown', close);\n return () => window.removeEventListener('mousedown', close);\n }, [listMenu]);\n\n const chooseListValue = (value: string) => {\n if (!listMenu) return;\n const row = state.document.rows[listMenu.row];\n const col = state.document.columns[listMenu.col];\n setListMenu(null);\n if (row && col) state.commitCellInput(row.id, col.id, value);\n gridRef.current?.focus();\n };\n\n const resolveValidation = (action: 'accept' | 'retry' | 'cancel') => {\n state.resolveValidationPrompt(action);\n // Back to the cell editor when it is still open (retry), else the grid.\n requestAnimationFrame(() => {\n if (cellInputRef.current) cellInputRef.current.focus();\n else gridRef.current?.focus();\n });\n };\n // The resize effect reads these through refs: re-running it on every width\n // update would reset the in-progress drag (and skip onColumnResize).\n const stateRef = useRef(state);\n stateRef.current = state;\n const onColumnResizeRef = useRef(onColumnResize);\n onColumnResizeRef.current = onColumnResize;\n\n useEffect(() => {\n if (!resizingColId) return;\n\n if (typeof document !== 'undefined') {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n let rafId: number | null = null;\n let pendingWidth = resizeStartWidth;\n let hasDragged = false;\n\n const handleMouseMove = (e: MouseEvent) => {\n const delta = e.clientX - resizeStartX;\n if (Math.abs(delta) > 2) {\n hasDragged = true;\n }\n pendingWidth = Math.max(30, resizeStartWidth + delta);\n\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n rafId = null;\n stateRef.current.setColumnWidth(resizingColId, pendingWidth);\n });\n }\n };\n\n const handleMouseUp = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n if (hasDragged) {\n stateRef.current.setColumnWidth(resizingColId, pendingWidth);\n onColumnResizeRef.current?.(resizingColId, pendingWidth);\n }\n setResizingColId(null);\n if (typeof document !== 'undefined') {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n if (typeof document !== 'undefined') {\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n }\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [resizingColId, resizeStartX, resizeStartWidth]);\n\n const measureElementContentWidth = useCallback((el: HTMLElement, container: HTMLElement): number => {\n if (typeof document === 'undefined') return 0;\n\n let maxW = el.scrollWidth || 0;\n const firstChild = el.firstElementChild as HTMLElement | null;\n if (firstChild && firstChild.scrollWidth > maxW) {\n maxW = firstChild.scrollWidth;\n }\n\n const truncated = el.querySelectorAll<HTMLElement>('.truncate, [title], span, div');\n truncated.forEach((node) => {\n if (node.scrollWidth > maxW) {\n maxW = node.scrollWidth;\n }\n });\n\n try {\n const clone = (firstChild ? firstChild.cloneNode(true) : el.cloneNode(true)) as HTMLElement;\n clone.style.cssText = `\n position: absolute !important;\n visibility: hidden !important;\n width: max-content !important;\n min-width: max-content !important;\n max-width: none !important;\n overflow: visible !important;\n white-space: nowrap !important;\n pointer-events: none !important;\n top: -9999px !important;\n left: -9999px !important;\n `;\n\n const allNodes = clone.querySelectorAll<HTMLElement>('*');\n allNodes.forEach((node) => {\n node.style.maxWidth = 'none';\n node.style.overflow = 'visible';\n node.style.textOverflow = 'clip';\n node.style.whiteSpace = 'nowrap';\n if (\n node.classList.contains('truncate') ||\n node.classList.contains('min-w-0') ||\n node.classList.contains('w-full') ||\n node.classList.contains('max-w-0') ||\n node.classList.contains('flex-1')\n ) {\n node.style.width = 'max-content';\n node.style.minWidth = 'max-content';\n }\n });\n\n container.appendChild(clone);\n const rect = clone.getBoundingClientRect();\n container.removeChild(clone);\n\n if (rect.width > maxW) {\n maxW = rect.width;\n }\n } catch {\n // Ignore cloning/measuring errors\n }\n\n return maxW;\n }, []);\n\n const autoFitColumn = useCallback((colId: string, colIndex: number) => {\n const col = state.document.columns.find((c) => c.id === colId);\n if (!col) return;\n\n let calculatedWidth = 0;\n\n if (gridRef.current && typeof document !== 'undefined') {\n const table = gridRef.current.querySelector('table');\n if (table) {\n // Look cells up by column index: hidden columns and merges shift DOM positions.\n const th = table.querySelector(`thead th[data-col=\"${colIndex}\"]`) as HTMLElement | null;\n if (th) {\n const headerInner = (th.firstElementChild as HTMLElement) || th;\n const headerW = measureElementContentWidth(headerInner, gridRef.current);\n calculatedWidth = Math.max(calculatedWidth, headerW + 28);\n }\n\n const rows = table.querySelectorAll('tbody tr');\n const sampleLimit = Math.min(rows.length, 150);\n for (let r = 0; r < sampleLimit; r++) {\n const tr = rows[r];\n const td = tr.querySelector(`td[data-col=\"${colIndex}\"][colspan=\"1\"]`) as HTMLElement | null;\n if (td) {\n const cellW = measureElementContentWidth(td, gridRef.current);\n calculatedWidth = Math.max(calculatedWidth, cellW + 20);\n }\n }\n }\n }\n\n if (calculatedWidth > 0) {\n const finalWidth = Math.min(600, Math.max(50, Math.ceil(calculatedWidth)));\n state.setColumnWidth(colId, finalWidth);\n } else {\n state.autoFitColumnWidth?.(colId);\n }\n\n const updatedCol = state.document.columns.find((c) => c.id === colId);\n if (updatedCol && onColumnResize) {\n onColumnResize(updatedCol.id, updatedCol.width || 130);\n }\n }, [state, measureElementContentWidth, onColumnResize]);\n\n const handleResizeDblClick = useCallback((colId: string, colIndex: number, e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n autoFitColumn(colId, colIndex);\n }, [autoFitColumn]);\n\n const handleHeaderDblClick = useCallback((colId: string, colIndex: number, e: React.MouseEvent) => {\n const target = e.currentTarget as HTMLElement | null;\n if (target) {\n const rect = target.getBoundingClientRect();\n if (rect.right - e.clientX <= 12) {\n e.preventDefault();\n e.stopPropagation();\n autoFitColumn(colId, colIndex);\n }\n }\n }, [autoFitColumn]);\n\n const isCellSelected = (rIdx: number, cIdx: number) => {\n if (!state.selectedRange) return false;\n const minR = Math.min(state.selectedRange.startRow, state.selectedRange.endRow);\n const maxR = Math.max(state.selectedRange.startRow, state.selectedRange.endRow);\n const minC = Math.min(state.selectedRange.startCol, state.selectedRange.endCol);\n const maxC = Math.max(state.selectedRange.startCol, state.selectedRange.endCol);\n return rIdx >= minR && rIdx <= maxR && cIdx >= minC && cIdx <= maxC;\n };\n\n const isActiveCell = (rIdx: number, cIdx: number) => {\n return state.activeCell?.row === rIdx && state.activeCell?.col === cIdx;\n };\n\n const grid = (\n <div\n ref={gridRef}\n className=\"flex flex-col h-full w-full overflow-hidden border border-border bg-background select-none outline-none text-foreground font-sans text-xs\"\n tabIndex={0}\n onKeyDown={handleKeyDown}\n role=\"grid\"\n aria-label=\"Spreadsheet\"\n >\n {/* Formula Bar */}\n <div className=\"flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5 text-xs font-mono\">\n <div className=\"flex h-6 min-w-[3rem] items-center justify-center rounded border border-border bg-background px-1.5 font-semibold text-foreground\">\n {coordLabel}\n </div>\n <div className=\"flex items-center text-muted-foreground select-none\">\n <span className=\"italic font-serif font-bold text-sm text-primary\">fx</span>\n </div>\n <input\n ref={formulaBarRef}\n type=\"text\"\n className=\"flex-1 bg-transparent px-2 py-0.5 outline-none font-sans text-xs text-foreground placeholder:text-muted-foreground/60 focus:bg-background focus:ring-1 focus:ring-primary rounded\"\n placeholder=\"Enter a value or formula (e.g. =SUM(A1:A5))\"\n aria-label=\"Formula bar\"\n readOnly={formulaBarReadOnly}\n data-spill-formula={!state.editingCell && formulaDraft === null && spillFormula ? 'true' : undefined}\n style={!state.editingCell && formulaDraft === null && spillFormula ? { color: 'var(--muted-foreground, #94a3b8)' } : undefined}\n value={state.editingCell ? state.draftValue : formulaDraft ?? (activeRawValue || spillFormula)}\n onFocus={() => {\n if (!state.editingCell) setFormulaDraft(activeRawValue);\n }}\n onChange={(e) => {\n if (state.editingCell) {\n state.setDraftValue(e.target.value);\n } else if (state.activeCell) {\n setFormulaDraft(e.target.value);\n }\n }}\n onBlur={() => commitFormulaBar()}\n onKeyDown={(e) => {\n // Keys typed here must not reach the grid's navigation handler.\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commitFormulaBar();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setFormulaDraft(null);\n if (state.editingCell) state.cancelEditing();\n }\n }}\n />\n {!formulaBarReadOnly && (\n <FormulaHints\n inputRef={formulaBarRef}\n value={state.editingCell ? state.draftValue : formulaDraft ?? activeRawValue}\n onAccept={(next) => (state.editingCell ? state.setDraftValue(next) : setFormulaDraft(next))}\n names={nameSuggestions}\n />\n )}\n </div>\n\n {inputMessage && (\n <div role=\"note\" data-validation-input-message=\"\" className=\"border-b border-border bg-muted/30 px-3 py-1 text-[11px] text-muted-foreground\">\n {inputMessage.inputTitle && <span className=\"mr-1 font-semibold text-foreground\">{inputMessage.inputTitle}</span>}\n {inputMessage.inputMessage}\n </div>\n )}\n\n {/* Main Grid */}\n <div ref={scrollRef} className=\"relative flex-1 overflow-auto\" onScroll={handleGridScroll}>\n <table className=\"border-separate border-spacing-0 table-fixed w-max min-w-full [&>*>tr:not([data-spacer])>*]:border-b [&>*>tr>*]:border-border\">\n <thead>\n <tr className=\"h-7 bg-muted sticky top-0 z-20 border-b border-border shadow-xs\">\n <th className=\"w-12 min-w-[3rem] sticky left-0 z-30 bg-muted border-r border-border text-center text-[10px] text-muted-foreground font-medium\">\n #\n </th>\n {columnSlots.map((slot) => slot.kind === 'space' ? (\n <th\n key={slot.key}\n aria-hidden=\"true\"\n data-spacer=\"\"\n className=\"p-0\"\n style={{ width: slot.width, minWidth: slot.width, maxWidth: slot.width, padding: 0 }}\n />\n ) : ((({ column: col, index: cIdx, frozen, stickyLeft }) => (\n <th\n key={col.id}\n data-col={cIdx}\n className={`relative border-r border-border px-2 text-left font-medium text-muted-foreground hover:bg-muted/90 transition-colors group overflow-hidden max-w-0 ${\n onColumnHeaderClick ? 'cursor-pointer' : 'cursor-default'\n }`}\n style={{\n width: col.width || 130,\n minWidth: col.width || 130,\n maxWidth: col.width || 130,\n overflow: 'hidden',\n ...(frozen ? { position: 'sticky', left: ROW_HEADER_WIDTH + stickyLeft, zIndex: 25, background: 'var(--muted, #f4f4f5)' } : {})\n }}\n onClick={() => onColumnHeaderClick?.(col)}\n onDoubleClick={(e) => handleHeaderDblClick(col.id, cIdx, e)}\n >\n <div className=\"flex items-center justify-between gap-1 min-w-0 overflow-hidden truncate\">\n <span className=\"truncate font-semibold text-foreground text-xs min-w-0\">{col.title}</span>\n {filteredColIds.has(col.id) && (\n <span className=\"text-[10px] text-primary shrink-0\" title=\"Filtered\" data-filtered=\"true\">⏷</span>\n )}\n <span className=\"text-[10px] text-muted-foreground/70 font-mono font-normal shrink-0\">({col.key})</span>\n </div>\n {/* Column Resize Handle */}\n <div\n className=\"col-resize-handle\"\n style={{ position: 'absolute', top: 0, bottom: 0, width: 12, right: -6, cursor: 'col-resize', zIndex: 20, display: 'flex', justifyContent: 'center', touchAction: 'none' }}\n onMouseEnter={() => setHoveredColId(col.id)}\n onMouseLeave={() => setHoveredColId((cur) => cur === col.id ? null : cur)}\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setResizingColId(col.id);\n setResizeStartX(e.clientX);\n setResizeStartWidth(col.width || 130);\n }}\n onDoubleClick={(e) => handleResizeDblClick(col.id, cIdx, e)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n >\n <div\n className=\"col-resize-handle-line\"\n style={{\n width: 2,\n height: '100%',\n pointerEvents: 'none',\n transition: 'background-color 150ms ease',\n backgroundColor: resizingColId === col.id ? 'var(--primary, #6366f1)' : hoveredColId === col.id ? 'color-mix(in srgb, var(--primary, #6366f1) 75%, transparent)' : 'transparent'\n }}\n />\n </div>\n </th>\n ))(slot.viewCol)))}\n {onAddColumnClick && (\n <th\n className=\"w-10 min-w-[2.5rem] px-1 text-center bg-muted/40 hover:bg-muted cursor-pointer transition-colors\"\n onClick={onAddColumnClick}\n title=\"Add Column\"\n >\n <span className=\"text-xs font-bold text-muted-foreground\">+</span>\n </th>\n )}\n </tr>\n </thead>\n <tbody>\n {rowSlots.map((rowSlot) => {\n if (rowSlot.kind === 'space') {\n return (\n <tr key={rowSlot.key} aria-hidden=\"true\" data-spacer=\"\" style={{ height: rowSlot.height }}>\n <td colSpan={columnSlots.length + 2} style={{ padding: 0, border: 0 }} />\n </tr>\n );\n }\n const viewRow = rowSlot.viewRow;\n if (viewRow.kind === 'group') {\n return (\n <SpreadsheetGroupRow\n key={`group:${viewRow.group.key}`}\n group={viewRow.group}\n columns={renderedColumns}\n labelColumns={view.columns}\n leadingColumns={viewWindow.virtual ? viewWindow.frozenColumns : undefined}\n leftSpace={viewWindow.leftSpace}\n rightSpace={viewWindow.rightSpace}\n groupColId={state.document.table?.grouping?.colId ?? ''}\n onToggle={state.toggleGroupCollapsed}\n trailingCell={!!onAddColumnClick}\n />\n );\n }\n const displayRowIndex = viewRow.index;\n const selection = state.selectedRange ? normalizeRange(state.selectedRange) : null;\n return (\n <tr\n key={viewRow.row.id}\n data-row={displayRowIndex}\n className={`border-b border-border hover:bg-muted/10 transition-colors ${viewRow.section !== 'body' ? 'bg-muted/30 font-semibold' : ''}`}\n style={{ height: viewRow.row.height || 32 }}\n >\n <td\n className=\"w-12 min-w-[3rem] sticky left-0 z-10 bg-muted border-r border-border text-center text-[10px] text-muted-foreground font-mono select-none\"\n style={viewRow.frozen ? { top: COLUMN_HEADER_HEIGHT + viewRow.stickyTop, zIndex: 15 } : undefined}\n >\n {displayRowIndex + 1}\n </td>\n {columnSlots.map((slot) => {\n if (slot.kind === 'space') return <td key={slot.key} aria-hidden=\"true\" data-spacer=\"\" style={{ padding: 0 }} />;\n const viewCol = slot.viewCol;\n // A merged cell renders its top-left cell, spanning the merge.\n const span = view.getCellSpan(displayRowIndex, viewCol.index);\n if (!span) return null;\n const rIdx = span.source.row;\n const cIdx = span.source.col;\n const row = state.document.rows[rIdx];\n const col = state.document.columns[cIdx];\n const cell = state.getCell(row.id, col.id);\n const selected = isCellSelected(rIdx, cIdx);\n const active = isActiveCell(rIdx, cIdx);\n const isEditing = state.editingCell?.row === rIdx && state.editingCell?.col === cIdx;\n\n const conditional = overlay.get(rIdx, cIdx);\n const conditionalCss = getConditionalFormatCss(conditional);\n const circled = state.controller.isInvalidDataCircled(rIdx, cIdx);\n const showListArrow = active && !isEditing && !!activeListValues;\n const inFillPreview = !!fillTarget && !selected && rangeContains(fillTarget, displayRowIndex, viewCol.index);\n const showFillHandle =\n !readOnly &&\n !isEditing &&\n !!selection &&\n (span.merge\n ? rangeContains(span.merge, selection.endRow, selection.endCol)\n : selection.endRow === rIdx && selection.endCol === cIdx);\n\n return (\n <td\n key={viewCol.column.id}\n data-row={rIdx}\n data-col={cIdx}\n rowSpan={span.rowSpan}\n colSpan={span.colSpan}\n className={`relative border-r border-border px-2 py-1 truncate max-w-0 text-foreground transition-colors ${\n selected ? 'bg-primary/10' : ''\n } ${active ? 'ring-2 ring-primary ring-inset z-10' : ''} ${viewCol.header ? 'font-semibold' : ''}`}\n style={{\n maxWidth: 0,\n overflow: 'hidden',\n ...frozenCellStyle(viewRow, viewCol),\n ...conditionalCss,\n // Keep the selection tint visible over a conditional fill.\n ...(conditionalCss.background && selected\n ? { boxShadow: 'inset 0 0 0 9999px color-mix(in srgb, var(--primary, #6366f1) 12%, transparent)' }\n : {}),\n ...(inFillPreview ? { outline: '1px dashed var(--primary, #6366f1)', outlineOffset: -1 } : {})\n }}\n data-cf-fill={conditional?.fill}\n onClick={(e) => handleCellClick(rIdx, cIdx, e)}\n onDoubleClick={() => handleCellDblClick(rIdx, cIdx)}\n onContextMenu={(e) => handleCellContextMenu(rIdx, cIdx, e)}\n onMouseOver={() => extendFill(displayRowIndex, viewCol.index)}\n >\n {isEditing ? (\n <>\n <input\n ref={cellInputRef}\n type=\"text\"\n className=\"absolute inset-0 w-full h-full px-2 py-1 bg-background text-foreground outline-none font-sans text-xs border-2 border-primary z-20\"\n value={state.draftValue}\n onChange={(e) => state.setDraftValue(e.target.value)}\n onBlur={() => state.commitEditing()}\n onFocus={(e) => {\n // Caret after the draft (e.g. the key that started editing).\n const end = e.currentTarget.value.length;\n e.currentTarget.setSelectionRange(end, end);\n }}\n autoFocus\n />\n <FormulaHints inputRef={cellInputRef} value={state.draftValue} onAccept={state.setDraftValue} names={nameSuggestions} />\n </>\n ) : customCellRenderer ? (\n customCellRenderer({ row, col, cell })\n ) : (\n <CellText cell={cell} conditional={conditional} />\n )}\n {circled && (\n <span\n className=\"spreadsheet-invalid-circle\"\n aria-label=\"Invalid value\"\n style={{ position: 'absolute', inset: '1px 2px', border: '2px solid #e11d48', borderRadius: '50%', pointerEvents: 'none', zIndex: 6 }}\n />\n )}\n {showListArrow && (\n <button\n type=\"button\"\n className=\"spreadsheet-list-arrow\"\n aria-label=\"Show allowed values\"\n aria-haspopup=\"listbox\"\n tabIndex={-1}\n style={{ position: 'absolute', right: 1, top: 1, bottom: 1, width: 16, zIndex: 24, fontSize: 10, lineHeight: 1, background: 'var(--muted, #f4f4f5)', border: '1px solid var(--border, #e4e4e7)', borderRadius: 2, cursor: 'pointer', padding: 0 }}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n if (listMenu) setListMenu(null);\n else openListMenu(rIdx, cIdx, e.currentTarget.parentElement);\n }}\n >\n ▾\n </button>\n )}\n {activeSpill && rangeContains(activeSpill.range, rIdx, cIdx) && (\n <span aria-hidden=\"true\" className=\"spreadsheet-spill-border\" style={spillBorderStyle(activeSpill.range, rIdx, cIdx)} />\n )}\n {showFillHandle && (\n <div\n className=\"spreadsheet-fill-handle\"\n aria-label=\"Fill handle\"\n onMouseDown={startFill}\n onClick={(e) => e.stopPropagation()}\n style={{ position: 'absolute', right: 0, bottom: 0, width: 7, height: 7, background: 'var(--primary, #6366f1)', cursor: 'crosshair', zIndex: 25 }}\n />\n )}\n </td>\n );\n })}\n {onAddColumnClick && <td className=\"w-10 min-w-[2.5rem] bg-muted/10 border-r border-border\" />}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n {menu && (\n <SpreadsheetContextMenu\n items={menu.items}\n x={menu.x}\n y={menu.y}\n onClose={() => {\n setMenu(null);\n gridRef.current?.focus();\n }}\n onOpenPanel={setPanel}\n />\n )}\n {panel === 'conditionalFormatting' && <SpreadsheetConditionalFormatPanel state={state} onClose={() => setPanel(null)} />}\n {panel === 'dataValidation' && <SpreadsheetDataValidationPanel state={state} onClose={() => setPanel(null)} />}\n {listMenu && (\n <div\n role=\"listbox\"\n aria-label=\"Allowed values\"\n className=\"fixed z-50 max-h-60 min-w-[8rem] overflow-y-auto rounded-md border border-border bg-popover py-1 text-xs text-popover-foreground shadow-lg\"\n style={{ left: listMenu.x, top: listMenu.y, background: 'var(--popover, var(--background, #fff))' }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n setListMenu(null);\n gridRef.current?.focus();\n }\n }}\n >\n {listMenu.values.length === 0 && <div className=\"px-3 py-1 text-muted-foreground\">No values</div>}\n {listMenu.values.map((value, i) => (\n <button\n key={`${i}:${value}`}\n type=\"button\"\n role=\"option\"\n aria-selected={false}\n className=\"block w-full px-3 py-1 text-left hover:bg-muted\"\n onClick={() => chooseListValue(value)}\n >\n {value}\n </button>\n ))}\n </div>\n )}\n {state.validationPrompt && <SpreadsheetValidationDialog prompt={state.validationPrompt} onResolve={resolveValidation} />}\n <style>{`\n .col-resize-handle:hover .col-resize-handle-line {\n background-color: var(--primary, #6366f1);\n opacity: 0.75;\n }\n .col-resize-handle.active .col-resize-handle-line {\n background-color: var(--primary, #6366f1);\n opacity: 1;\n }\n table.table-fixed th {\n overflow: hidden;\n }\n table.table-fixed td {\n max-width: 0;\n overflow: hidden;\n }\n `}</style>\n </div>\n );\n\n if (!showSheetTabs) return grid;\n return (\n <div className=\"flex h-full w-full flex-col\">\n <div className=\"min-h-0 flex-1\">{grid}</div>\n <SheetTabs state={state} readOnly={readOnly} />\n </div>\n );\n};\n","import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { clampMenuPosition, runSpreadsheetMenuItem, type SpreadsheetMenuItem, type SpreadsheetPanelId } from '@pixerate/editor/spreadsheet';\n\n// Gap kept between the menu and the viewport edges.\nconst VIEWPORT_MARGIN = 4;\n\nexport interface SpreadsheetContextMenuProps {\n items: SpreadsheetMenuItem[];\n x: number;\n y: number;\n onClose: () => void;\n /** Accessible name of the menu (default \"Table actions\"). */\n ariaLabel?: string;\n /** Opens a panel for items with `panel` (conditional formatting, data validation). */\n onOpenPanel?: (panel: SpreadsheetPanelId) => void;\n}\n\n/** The table context menu (sort, filter, freeze, hide, merge, categories, transpose). */\nexport const SpreadsheetContextMenu: React.FC<SpreadsheetContextMenuProps> = ({ items, x, y, onClose, onOpenPanel, ariaLabel = 'Table actions' }) => {\n const menuRef = useRef<HTMLDivElement>(null);\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n const [position, setPosition] = useState({ x, y });\n\n // Keep the (fixed) menu inside the viewport: near the right or bottom edge\n // it opens to the left of / above the pointer instead of being cut off.\n useLayoutEffect(() => {\n const menu = menuRef.current;\n if (!menu || typeof window === 'undefined') return;\n const { width, height } = menu.getBoundingClientRect();\n const next = clampMenuPosition(\n { x, y },\n { width, height },\n { width: window.innerWidth, height: window.innerHeight },\n VIEWPORT_MARGIN\n );\n setPosition((prev) => (prev.x === next.x && prev.y === next.y ? prev : next));\n }, [x, y, items]);\n\n useEffect(() => {\n const handlePointer = (e: MouseEvent) => {\n if (!menuRef.current?.contains(e.target as Node)) onCloseRef.current();\n };\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onCloseRef.current();\n };\n window.addEventListener('mousedown', handlePointer);\n window.addEventListener('keydown', handleKey);\n return () => {\n window.removeEventListener('mousedown', handlePointer);\n window.removeEventListener('keydown', handleKey);\n };\n }, []);\n\n return (\n <div\n ref={menuRef}\n role=\"menu\"\n aria-label={ariaLabel}\n className=\"fixed z-50 min-w-[14rem] rounded-md border border-border bg-popover py-1 text-xs text-popover-foreground shadow-lg\"\n style={{\n left: position.x,\n top: position.y,\n maxHeight: `calc(100vh - ${VIEWPORT_MARGIN * 2}px)`,\n overflowY: 'auto',\n background: 'var(--popover, var(--background, #fff))'\n }}\n onContextMenu={(e) => e.preventDefault()}\n onKeyDown={(e) => e.stopPropagation()}\n >\n {items.map((item) => (\n <React.Fragment key={item.id}>\n {item.separatorBefore && <div role=\"separator\" className=\"my-1 h-px bg-border\" />}\n <button\n type=\"button\"\n role=\"menuitem\"\n data-action={item.id}\n data-checked={item.checked ? '' : undefined}\n disabled={item.disabled}\n className={`block w-full px-3 py-1 text-left hover:bg-muted disabled:cursor-default disabled:opacity-40 disabled:hover:bg-transparent ${\n item.checked ? 'font-semibold' : ''\n }`}\n onClick={() => {\n onClose();\n if (item.panel) onOpenPanel?.(item.panel);\n else runSpreadsheetMenuItem(item);\n }}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n );\n};\n","import React from 'react';\nimport type { SpreadsheetRowGroup, SpreadsheetViewColumn } from '@pixerate/editor/spreadsheet';\n\nexport interface SpreadsheetGroupRowProps {\n group: SpreadsheetRowGroup;\n columns: SpreadsheetViewColumn[];\n /** Column the rows are grouped by: shows the group label and toggle. */\n groupColId: string;\n onToggle: (key: string) => void;\n /** Render a trailing cell for the \"add column\" column. */\n trailingCell?: boolean;\n /** Every displayed column, when `columns` is a virtualised window of them (picks the label column). */\n labelColumns?: SpreadsheetViewColumn[];\n /** Virtualised: columns before the left spacer (the frozen ones), and the spacers' widths. */\n leadingColumns?: number;\n leftSpace?: number;\n rightSpace?: number;\n}\n\nconst formatSummary = (value: number | null) => (value === null ? '–' : String(value));\n\n/** A category header row: collapse toggle, label, row count and per-column summaries. */\nexport const SpreadsheetGroupRow: React.FC<SpreadsheetGroupRowProps> = ({\n group,\n columns,\n groupColId,\n onToggle,\n trailingCell,\n labelColumns = columns,\n leadingColumns,\n leftSpace = 0,\n rightSpace = 0\n}) => {\n // The label goes in the grouping column, or the first column when that one is hidden.\n const labelColId = labelColumns.some((c) => c.column.id === groupColId) ? groupColId : labelColumns[0]?.column.id;\n const spacer = (key: string) => <td key={key} aria-hidden=\"true\" data-spacer=\"\" style={{ padding: 0 }} />;\n return (\n <tr className=\"border-b border-border bg-muted/40 font-semibold\" data-group-key={group.key} style={{ height: 28 }}>\n <td className=\"w-12 min-w-[3rem] sticky left-0 z-10 bg-muted border-r border-border text-center\">\n <button\n type=\"button\"\n aria-label={`${group.collapsed ? 'Expand' : 'Collapse'} group ${group.label}`}\n aria-expanded={!group.collapsed}\n className=\"h-5 w-5 rounded text-[10px] text-muted-foreground hover:bg-muted\"\n onClick={(e) => {\n e.stopPropagation();\n onToggle(group.key);\n }}\n >\n {group.collapsed ? '▸' : '▾'}\n </button>\n </td>\n {columns.map(({ column }, i) => {\n const summary = group.summaries[column.id];\n const before = leadingColumns !== undefined && i === leadingColumns && leftSpace > 0 ? spacer('space:left') : null;\n return (\n <React.Fragment key={column.id}>\n {before}\n <td className=\"border-r border-border px-2 py-1 truncate max-w-0 text-foreground\" style={{ maxWidth: 0, overflow: 'hidden' }}>\n {column.id === labelColId ? (\n <span className=\"truncate\">\n {group.label} <span className=\"font-normal text-muted-foreground\">({group.rowIndices.length})</span>\n </span>\n ) : summary !== undefined ? (\n <span className=\"truncate\" data-summary={column.id}>{formatSummary(summary)}</span>\n ) : null}\n </td>\n </React.Fragment>\n );\n })}\n {leadingColumns !== undefined && leadingColumns >= columns.length && leftSpace > 0 && spacer('space:left')}\n {rightSpace > 0 && spacer('space:right')}\n {trailingCell && <td className=\"w-10 min-w-[2.5rem] bg-muted/10 border-r border-border\" />}\n </tr>\n );\n};\n","import { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\nimport {\n computeFillTarget,\n normalizeRange,\n type CellRange\n} from '@pixerate/editor/spreadsheet';\nimport type { useSpreadsheetEditor } from './useSpreadsheetEditor';\n\ntype SpreadsheetState = ReturnType<typeof useSpreadsheetEditor>;\n\n/** True when focus is in the grid itself, not in a text input (cell editor, formula bar). */\nfunction gridHasFocus(grid: HTMLElement | null): boolean {\n if (!grid || typeof document === 'undefined') return false;\n const active = document.activeElement;\n if (!active || !grid.contains(active)) return false;\n return !(active instanceof HTMLInputElement || active instanceof HTMLTextAreaElement);\n}\n\n/**\n * Copy and paste for the grid. Copy writes TSV, an HTML table and the\n * lossless `application/x.pixerate.spreadsheet+json` format; paste prefers\n * that format, then HTML, then TSV.\n *\n * The listeners are on `document`: with no text selection the browser fires\n * `copy`/`paste` at `<body>`, not at the focused grid. Text inputs inside the\n * grid keep native copy/paste.\n */\nexport function useSpreadsheetClipboard(\n gridRef: RefObject<HTMLElement | null>,\n state: SpreadsheetState,\n readOnly: boolean\n) {\n const stateRef = useRef(state);\n stateRef.current = state;\n const readOnlyRef = useRef(readOnly);\n readOnlyRef.current = readOnly;\n // Set when a copy event wrote the selection, so the keyboard fallback is skipped.\n const copiedRef = useRef(false);\n\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const handleCopy = (e: ClipboardEvent) => {\n const s = stateRef.current;\n if (!gridHasFocus(gridRef.current) || s.editingCell || !e.clipboardData || !s.selectedRange) return;\n for (const [type, data] of Object.entries(s.copyToClipboardData(s.selectedRange))) {\n e.clipboardData.setData(type, data);\n }\n copiedRef.current = true;\n e.preventDefault();\n };\n const handlePaste = (e: ClipboardEvent) => {\n const s = stateRef.current;\n if (readOnlyRef.current || !gridHasFocus(gridRef.current) || s.editingCell || !e.clipboardData) return;\n if (s.pasteClipboardData(e.clipboardData)) e.preventDefault();\n };\n document.addEventListener('copy', handleCopy);\n document.addEventListener('paste', handlePaste);\n return () => {\n document.removeEventListener('copy', handleCopy);\n document.removeEventListener('paste', handlePaste);\n };\n }, [gridRef]);\n\n /**\n * Call on Mod+C (without preventing default). The browser normally follows\n * with a `copy` event; where it doesn't (no selection in some browsers),\n * the selection is written as plain TSV instead.\n */\n const copyShortcutFallback = useCallback(() => {\n copiedRef.current = false;\n setTimeout(() => {\n if (copiedRef.current) return;\n const s = stateRef.current;\n // Rejected when clipboard access is denied; nothing else to fall back to.\n Promise.resolve(navigator.clipboard?.writeText(s.exportToTsv(s.selectedRange))).catch(() => {});\n }, 0);\n }, []);\n\n return { copyShortcutFallback };\n}\n\n/**\n * Fill handle dragging: press on the handle, move over cells, release to\n * autofill from the selection into the dragged range (one undo step).\n */\nexport function useFillHandle(state: SpreadsheetState) {\n const [drag, setDrag] = useState<{ source: CellRange; target: CellRange | null } | null>(null);\n const dragRef = useRef(drag);\n dragRef.current = drag;\n const stateRef = useRef(state);\n stateRef.current = state;\n const dragging = drag !== null;\n\n useEffect(() => {\n if (!dragging) return;\n const handleMouseUp = () => {\n const current = dragRef.current;\n setDrag(null);\n if (current?.target) stateRef.current.autofill(current.source, current.target);\n };\n window.addEventListener('mouseup', handleMouseUp);\n return () => window.removeEventListener('mouseup', handleMouseUp);\n }, [dragging]);\n\n const startFill = useCallback((e: { preventDefault(): void; stopPropagation(): void }) => {\n e.preventDefault();\n e.stopPropagation();\n const range = stateRef.current.selectedRange;\n if (range) setDrag({ source: normalizeRange(range), target: null });\n }, []);\n\n const extendFill = useCallback((row: number, col: number) => {\n const current = dragRef.current;\n if (!current) return;\n setDrag({ source: current.source, target: computeFillTarget(current.source, { row, col }) });\n }, []);\n\n return { fillTarget: drag?.target ?? null, isFilling: dragging, startFill, extendFill };\n}\n","import React, { useEffect, useRef } from 'react';\nimport type { SpreadsheetValidationAction, SpreadsheetValidationPrompt } from '@pixerate/editor/spreadsheet';\n\nexport interface SpreadsheetValidationDialogProps {\n prompt: SpreadsheetValidationPrompt;\n onResolve: (action: SpreadsheetValidationAction) => void;\n}\n\n/**\n * The data validation alert: Stop (Retry / Cancel), Warning (\"Continue?\"\n * Yes / No / Cancel) or Information (OK / Cancel), as in Excel.\n */\nexport const SpreadsheetValidationDialog: React.FC<SpreadsheetValidationDialogProps> = ({ prompt, onResolve }) => {\n const style = prompt.result.errorStyle ?? 'stop';\n const firstButton = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n firstButton.current?.focus();\n }, [prompt]);\n\n const buttons: Array<{ label: string; action: SpreadsheetValidationAction }> =\n style === 'stop'\n ? [\n { label: 'Retry', action: 'retry' },\n { label: 'Cancel', action: 'cancel' }\n ]\n : style === 'warning'\n ? [\n { label: 'Yes', action: 'accept' },\n { label: 'No', action: 'retry' },\n { label: 'Cancel', action: 'cancel' }\n ]\n : [\n { label: 'OK', action: 'accept' },\n { label: 'Cancel', action: 'cancel' }\n ];\n const icon = style === 'stop' ? '⛔' : style === 'warning' ? '⚠' : 'ℹ';\n\n return (\n <div\n className=\"fixed inset-0 z-[60] flex items-center justify-center bg-black/30\"\n onMouseDown={(e) => e.preventDefault()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n e.preventDefault();\n onResolve('cancel');\n }\n }}\n >\n <div\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"spreadsheet-validation-title\"\n aria-describedby=\"spreadsheet-validation-message\"\n data-error-style={style}\n className=\"w-[22rem] max-w-[calc(100vw-2rem)] rounded-md border border-border bg-popover p-4 text-xs text-popover-foreground shadow-xl\"\n style={{ background: 'var(--popover, var(--background, #fff))' }}\n >\n <div className=\"flex items-start gap-3\">\n <span aria-hidden=\"true\" className=\"text-lg leading-none\">{icon}</span>\n <div className=\"min-w-0 flex-1\">\n <h2 id=\"spreadsheet-validation-title\" className=\"mb-1 text-sm font-semibold\">\n {prompt.result.title}\n </h2>\n <p id=\"spreadsheet-validation-message\" className=\"whitespace-pre-wrap\">\n {prompt.result.message}\n </p>\n {style === 'warning' && <p className=\"mt-2\">Continue?</p>}\n </div>\n </div>\n <div className=\"mt-4 flex justify-end gap-2\">\n {buttons.map((button, i) => (\n <button\n key={button.action}\n ref={i === 0 ? firstButton : undefined}\n type=\"button\"\n data-action={button.action}\n className={`rounded border border-border px-3 py-1 ${i === 0 ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'}`}\n onClick={() => onResolve(button.action)}\n >\n {button.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport {\n CONDITIONAL_FORMAT_ICON_SETS,\n CONDITIONAL_FORMAT_PRESETS,\n CONDITIONAL_FORMAT_STYLE_PRESETS,\n CONDITIONAL_FORMAT_TIME_PERIODS,\n DATA_VALIDATION_ERROR_STYLE_OPTIONS,\n DATA_VALIDATION_OPERATOR_OPTIONS,\n DATA_VALIDATION_TYPE_OPTIONS,\n createConditionalFormatRule,\n describeConditionalFormat,\n describeDataValidation,\n formatRuleRanges,\n getConditionalFormatCss,\n parseRuleRanges,\n type CellRange,\n type ConditionalFormatIconSet,\n type ConditionalFormatPresetKind,\n type ConditionalFormatRule,\n type ConditionalFormatTimePeriod,\n type DataValidationErrorStyle,\n type DataValidationOperator,\n type DataValidationType\n} from '@pixerate/editor/spreadsheet';\nimport type { useSpreadsheetEditor } from './useSpreadsheetEditor';\n\ntype SpreadsheetState = ReturnType<typeof useSpreadsheetEditor>;\n\nexport interface SpreadsheetRulePanelProps {\n state: SpreadsheetState;\n onClose: () => void;\n}\n\nconst inputClass = 'w-full rounded border border-border bg-background px-1.5 py-0.5 text-xs text-foreground';\nconst buttonClass = 'rounded border border-border px-2 py-0.5 hover:bg-muted disabled:opacity-40';\n\nfunction selectionText(range: CellRange | null): string {\n return range ? formatRuleRanges([range]) : 'A1';\n}\n\n/** Frame shared by both managers: a compact side panel that keeps keys away from the grid. */\nconst PanelFrame: React.FC<{ title: string; label: string; onClose: () => void; children: React.ReactNode }> = ({\n title,\n label,\n onClose,\n children\n}) => (\n <div\n role=\"dialog\"\n aria-label={label}\n className=\"fixed right-4 top-16 z-40 flex max-h-[calc(100vh-5rem)] w-80 flex-col overflow-y-auto rounded-md border border-border bg-popover p-3 text-xs text-popover-foreground shadow-lg\"\n style={{ background: 'var(--popover, var(--background, #fff))' }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') onClose();\n }}\n onContextMenu={(e) => e.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <h2 className=\"text-sm font-semibold\">{title}</h2>\n <button type=\"button\" aria-label=\"Close\" className=\"px-1 text-muted-foreground hover:text-foreground\" onClick={onClose}>\n ✕\n </button>\n </div>\n {children}\n </div>\n);\n\n/** Swatch showing a rule's look (fill, font colour, bold) or its kind. */\nfunction RuleSwatch({ rule }: { rule: ConditionalFormatRule }) {\n if (rule.type === 'colorScale') {\n return (\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-3 w-6 shrink-0 rounded-sm border border-border\"\n style={{ background: `linear-gradient(90deg, ${rule.stops.map((s) => s.color).join(', ')})` }}\n />\n );\n }\n if (rule.type === 'dataBar') {\n return <span aria-hidden=\"true\" className=\"inline-block h-3 w-6 shrink-0 rounded-sm\" style={{ background: rule.color ?? '#638ec6' }} />;\n }\n if (rule.type === 'iconSet') return <span aria-hidden=\"true\" className=\"shrink-0\">●</span>;\n const css = getConditionalFormatCss(rule.style);\n return (\n <span aria-hidden=\"true\" className=\"inline-flex h-4 w-6 shrink-0 items-center justify-center rounded-sm border border-border\" style={css}>\n Aa\n </span>\n );\n}\n\n/**\n * Conditional formatting manager: the sheet's rules in priority order (move,\n * stop if true, delete) and a form to add a rule to a range.\n */\nexport const SpreadsheetConditionalFormatPanel: React.FC<SpreadsheetRulePanelProps> = ({ state, onClose }) => {\n const rules = state.document.table?.conditionalFormats ?? [];\n const [kind, setKind] = useState<ConditionalFormatPresetKind>('greaterThan');\n const [appliesTo, setAppliesTo] = useState(() => selectionText(state.selectedRange));\n const [value, setValue] = useState('');\n const [value2, setValue2] = useState('');\n const [text, setText] = useState('');\n const [formula, setFormula] = useState('=');\n const [rank, setRank] = useState('10');\n const [period, setPeriod] = useState<ConditionalFormatTimePeriod>('today');\n const [iconSet, setIconSet] = useState<ConditionalFormatIconSet>('3TrafficLights1');\n const [color, setColor] = useState('#638ec6');\n const [styleId, setStyleId] = useState(CONDITIONAL_FORMAT_STYLE_PRESETS[0].id);\n const preset = useMemo(() => CONDITIONAL_FORMAT_PRESETS.find((p) => p.kind === kind)!, [kind]);\n const ranges = parseRuleRanges(appliesTo);\n\n const add = () => {\n if (!ranges) return;\n state.addConditionalFormat(\n createConditionalFormatRule({\n kind,\n ranges,\n value,\n value2,\n text,\n formula,\n rank: Number(rank) || 10,\n period,\n iconSet,\n color,\n style: CONDITIONAL_FORMAT_STYLE_PRESETS.find((s) => s.id === styleId)?.style\n })\n );\n };\n\n return (\n <PanelFrame title=\"Conditional formatting\" label=\"Conditional formatting rules\" onClose={onClose}>\n <ol className=\"mb-3 flex flex-col gap-1\" aria-label=\"Rules in priority order\">\n {rules.length === 0 && <li className=\"text-muted-foreground\">No rules on this sheet.</li>}\n {rules.map((rule, i) => (\n <li key={rule.id} data-rule-id={rule.id} className=\"flex items-center gap-1.5 rounded border border-border px-1.5 py-1\">\n <RuleSwatch rule={rule} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate\" title={describeConditionalFormat(rule)}>\n {describeConditionalFormat(rule)}\n </div>\n <div className=\"truncate font-mono text-[10px] text-muted-foreground\">{formatRuleRanges(rule.ranges)}</div>\n </div>\n <label className=\"flex items-center gap-0.5 text-[10px]\" title=\"Stop if true\">\n <input\n type=\"checkbox\"\n aria-label=\"Stop if true\"\n checked={!!rule.stopIfTrue}\n onChange={(e) => state.updateConditionalFormat(rule.id, { stopIfTrue: e.target.checked })}\n />\n Stop\n </label>\n <button type=\"button\" aria-label=\"Move up\" className={buttonClass} disabled={i === 0} onClick={() => state.moveConditionalFormat(rule.id, { by: -1 })}>\n ▲\n </button>\n <button\n type=\"button\"\n aria-label=\"Move down\"\n className={buttonClass}\n disabled={i === rules.length - 1}\n onClick={() => state.moveConditionalFormat(rule.id, { by: 1 })}\n >\n ▼\n </button>\n <button type=\"button\" aria-label=\"Delete rule\" className={buttonClass} onClick={() => state.deleteConditionalFormat(rule.id)}>\n ✕\n </button>\n </li>\n ))}\n </ol>\n\n <fieldset className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n <legend className=\"sr-only\">New rule</legend>\n <label className=\"flex flex-col gap-0.5\">\n Format cells\n <select aria-label=\"Rule type\" className={inputClass} value={kind} onChange={(e) => setKind(e.target.value as ConditionalFormatPresetKind)}>\n {CONDITIONAL_FORMAT_PRESETS.map((p) => (\n <option key={p.kind} value={p.kind}>\n {p.label}\n </option>\n ))}\n </select>\n </label>\n {preset.fields.includes('value') && (\n <input aria-label=\"Value\" placeholder=\"Value or =formula\" className={inputClass} value={value} onChange={(e) => setValue(e.target.value)} />\n )}\n {preset.fields.includes('value2') && (\n <input aria-label=\"Second value\" placeholder=\"and\" className={inputClass} value={value2} onChange={(e) => setValue2(e.target.value)} />\n )}\n {preset.fields.includes('text') && (\n <input aria-label=\"Text\" placeholder=\"Text\" className={inputClass} value={text} onChange={(e) => setText(e.target.value)} />\n )}\n {preset.fields.includes('formula') && (\n <input aria-label=\"Formula\" placeholder=\"=$A1>10\" className={inputClass} value={formula} onChange={(e) => setFormula(e.target.value)} />\n )}\n {preset.fields.includes('rank') && (\n <input aria-label=\"Rank\" type=\"number\" min={1} className={inputClass} value={rank} onChange={(e) => setRank(e.target.value)} />\n )}\n {preset.fields.includes('period') && (\n <select aria-label=\"Period\" className={inputClass} value={period} onChange={(e) => setPeriod(e.target.value as ConditionalFormatTimePeriod)}>\n {CONDITIONAL_FORMAT_TIME_PERIODS.map((p) => (\n <option key={p.period} value={p.period}>\n {p.label}\n </option>\n ))}\n </select>\n )}\n {preset.fields.includes('iconSet') && (\n <select aria-label=\"Icon set\" className={inputClass} value={iconSet} onChange={(e) => setIconSet(e.target.value as ConditionalFormatIconSet)}>\n {CONDITIONAL_FORMAT_ICON_SETS.map((set) => (\n <option key={set} value={set}>\n {set}\n </option>\n ))}\n </select>\n )}\n {preset.fields.includes('color') && (\n <input aria-label=\"Bar colour\" type=\"color\" className=\"h-6 w-12\" value={color} onChange={(e) => setColor(e.target.value)} />\n )}\n {preset.usesStyle && (\n <select aria-label=\"Style\" className={inputClass} value={styleId} onChange={(e) => setStyleId(e.target.value)}>\n {CONDITIONAL_FORMAT_STYLE_PRESETS.map((s) => (\n <option key={s.id} value={s.id}>\n {s.label}\n </option>\n ))}\n </select>\n )}\n <label className=\"flex flex-col gap-0.5\">\n Applies to\n <input aria-label=\"Applies to\" className={`${inputClass} font-mono`} value={appliesTo} onChange={(e) => setAppliesTo(e.target.value)} />\n </label>\n <div className=\"flex justify-between gap-2\">\n <button type=\"button\" className={buttonClass} onClick={() => setAppliesTo(selectionText(state.selectedRange))}>\n Use selection\n </button>\n <button type=\"button\" className={buttonClass} disabled={!ranges} onClick={add}>\n Add rule\n </button>\n </div>\n </fieldset>\n </PanelFrame>\n );\n};\n\n/**\n * Data validation manager: the sheet's rules (delete), a form to validate a\n * range, and \"circle invalid data\".\n */\nexport const SpreadsheetDataValidationPanel: React.FC<SpreadsheetRulePanelProps> = ({ state, onClose }) => {\n const rules = state.document.table?.dataValidations ?? [];\n const [type, setType] = useState<DataValidationType>('list');\n const [operator, setOperator] = useState<DataValidationOperator>('between');\n const [formula1, setFormula1] = useState('');\n const [formula2, setFormula2] = useState('');\n const [errorStyle, setErrorStyle] = useState<DataValidationErrorStyle>('stop');\n const [errorMessage, setErrorMessage] = useState('');\n const [inputMessage, setInputMessage] = useState('');\n const [ignoreBlank, setIgnoreBlank] = useState(true);\n const [appliesTo, setAppliesTo] = useState(() => selectionText(state.selectedRange));\n const ranges = parseRuleRanges(appliesTo);\n const usesOperator = type === 'whole' || type === 'decimal' || type === 'date' || type === 'time' || type === 'textLength';\n const needsTwo = usesOperator && (operator === 'between' || operator === 'notBetween');\n const circles = state.controller.getInvalidDataCircles();\n\n const apply = () => {\n if (!ranges) return;\n state.addDataValidation({\n ranges,\n type,\n ...(usesOperator ? { operator } : {}),\n ...(formula1 ? { formula1 } : {}),\n ...(needsTwo && formula2 ? { formula2 } : {}),\n errorStyle,\n ...(errorMessage ? { errorMessage } : {}),\n ...(inputMessage ? { inputMessage } : {}),\n ignoreBlank\n });\n };\n\n return (\n <PanelFrame title=\"Data validation\" label=\"Data validation rules\" onClose={onClose}>\n <ul className=\"mb-3 flex flex-col gap-1\" aria-label=\"Validation rules\">\n {rules.length === 0 && <li className=\"text-muted-foreground\">No validation on this sheet.</li>}\n {rules.map((rule) => (\n <li key={rule.id} data-rule-id={rule.id} className=\"flex items-center gap-1.5 rounded border border-border px-1.5 py-1\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate\" title={describeDataValidation(rule)}>\n {describeDataValidation(rule)}\n </div>\n <div className=\"truncate font-mono text-[10px] text-muted-foreground\">\n {formatRuleRanges(rule.ranges)} · {rule.errorStyle ?? 'stop'}\n </div>\n </div>\n <button type=\"button\" aria-label=\"Delete rule\" className={buttonClass} onClick={() => state.deleteDataValidation(rule.id)}>\n ✕\n </button>\n </li>\n ))}\n </ul>\n\n <fieldset className=\"flex flex-col gap-1.5 border-t border-border pt-2\">\n <legend className=\"sr-only\">New validation</legend>\n <label className=\"flex flex-col gap-0.5\">\n Allow\n <select aria-label=\"Allow\" className={inputClass} value={type} onChange={(e) => setType(e.target.value as DataValidationType)}>\n {DATA_VALIDATION_TYPE_OPTIONS.map((o) => (\n <option key={o.type} value={o.type}>\n {o.label}\n </option>\n ))}\n </select>\n </label>\n {usesOperator && (\n <select aria-label=\"Operator\" className={inputClass} value={operator} onChange={(e) => setOperator(e.target.value as DataValidationOperator)}>\n {DATA_VALIDATION_OPERATOR_OPTIONS.map((o) => (\n <option key={o.operator} value={o.operator}>\n {o.label}\n </option>\n ))}\n </select>\n )}\n {type !== 'any' && (\n <input\n aria-label={type === 'list' ? 'Source' : type === 'custom' ? 'Formula' : needsTwo ? 'Minimum' : 'Value'}\n placeholder={type === 'list' ? 'Low,Medium,High or =$H$1:$H$5' : type === 'custom' ? '=A1>0' : 'Value or =formula'}\n className={inputClass}\n value={formula1}\n onChange={(e) => setFormula1(e.target.value)}\n />\n )}\n {needsTwo && <input aria-label=\"Maximum\" placeholder=\"Maximum\" className={inputClass} value={formula2} onChange={(e) => setFormula2(e.target.value)} />}\n <label className=\"flex items-center gap-1\">\n <input type=\"checkbox\" checked={ignoreBlank} onChange={(e) => setIgnoreBlank(e.target.checked)} /> Ignore blank\n </label>\n <input aria-label=\"Input message\" placeholder=\"Input message (optional)\" className={inputClass} value={inputMessage} onChange={(e) => setInputMessage(e.target.value)} />\n <div className=\"flex gap-1\">\n <select aria-label=\"Error style\" className={inputClass} value={errorStyle} onChange={(e) => setErrorStyle(e.target.value as DataValidationErrorStyle)}>\n {DATA_VALIDATION_ERROR_STYLE_OPTIONS.map((o) => (\n <option key={o.style} value={o.style}>\n {o.label}\n </option>\n ))}\n </select>\n </div>\n <input aria-label=\"Error message\" placeholder=\"Error message (optional)\" className={inputClass} value={errorMessage} onChange={(e) => setErrorMessage(e.target.value)} />\n <label className=\"flex flex-col gap-0.5\">\n Applies to\n <input aria-label=\"Applies to\" className={`${inputClass} font-mono`} value={appliesTo} onChange={(e) => setAppliesTo(e.target.value)} />\n </label>\n <div className=\"flex flex-wrap justify-between gap-2\">\n <button type=\"button\" className={buttonClass} onClick={() => setAppliesTo(selectionText(state.selectedRange))}>\n Use selection\n </button>\n <button type=\"button\" className={buttonClass} disabled={!ranges} onClick={() => ranges && ranges.forEach((r) => state.clearDataValidation(r))}>\n Clear\n </button>\n <button type=\"button\" className={buttonClass} disabled={!ranges} onClick={apply}>\n Apply\n </button>\n </div>\n <button type=\"button\" className={buttonClass} aria-pressed={circles} onClick={() => state.setInvalidDataCircles(!circles)}>\n {circles ? 'Clear validation circles' : 'Circle invalid data'}\n </button>\n </fieldset>\n </PanelFrame>\n );\n};\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, type RefObject } from 'react';\nimport {\n fullSpreadsheetViewWindow,\n getSpreadsheetScrollToCell,\n getSpreadsheetViewWindow,\n measureSpreadsheetView,\n sameSpreadsheetViewWindow,\n shouldVirtualizeSpreadsheet,\n type CellCoordinate,\n type CellRange,\n type SpreadsheetViewMetrics,\n type SpreadsheetViewModel,\n type SpreadsheetViewport,\n type SpreadsheetViewWindow\n} from '@pixerate/editor/spreadsheet';\n\n// Browsers without layout effects on the server: fall back to useEffect there.\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nexport interface SpreadsheetViewportOptions {\n /** `'auto'` (default): virtualise large views only; `true` / `false` force it. */\n virtualize?: boolean | 'auto';\n /** Merged ranges, rendered whole when they cross the window's edge. */\n merges?: readonly CellRange[];\n /** Scrolled into view when it changes (virtualised views only). */\n activeCell?: CellCoordinate | null;\n overscanRows?: number;\n overscanColumns?: number;\n}\n\nexport interface SpreadsheetViewportState {\n metrics: SpreadsheetViewMetrics;\n /** What to render; `virtual: false` renders every row and column. */\n window: SpreadsheetViewWindow;\n /** Attach to the scroll container's `onScroll`. */\n onScroll: () => void;\n}\n\n/**\n * Virtualised rendering for `SpreadsheetEditor`: tracks the scroll\n * container (`scrollRef`), works out the window of rows and columns to\n * render, and scrolls the active cell into view.\n */\nexport function useSpreadsheetViewport(\n scrollRef: RefObject<HTMLElement | null>,\n view: SpreadsheetViewModel,\n options: SpreadsheetViewportOptions = {}\n): SpreadsheetViewportState {\n const metrics = useMemo(() => measureSpreadsheetView(view), [view]);\n const virtual = shouldVirtualizeSpreadsheet(view, options.virtualize ?? 'auto');\n const [viewport, setViewport] = useState<SpreadsheetViewport>({ scrollTop: 0, scrollLeft: 0, width: 0, height: 0 });\n const windowOptions = useMemo(\n () => ({ merges: options.merges, overscanRows: options.overscanRows, overscanColumns: options.overscanColumns }),\n [options.merges, options.overscanRows, options.overscanColumns]\n );\n\n const win = useMemo(\n () => (virtual ? getSpreadsheetViewWindow(metrics, viewport, windowOptions) : fullSpreadsheetViewWindow(metrics)),\n [virtual, metrics, viewport, windowOptions]\n );\n\n // Read by the scroll handler, which must not change identity.\n const latest = useRef({ metrics, viewport, virtual, windowOptions });\n latest.current = { metrics, viewport, virtual, windowOptions };\n\n const readViewport = useCallback((): SpreadsheetViewport | null => {\n const el = scrollRef.current;\n if (!el) return null;\n return { scrollTop: el.scrollTop, scrollLeft: el.scrollLeft, width: el.clientWidth, height: el.clientHeight };\n }, [scrollRef]);\n\n /** Stores a new viewport, re-rendering only when the window it gives changes. */\n const updateViewport = useCallback((next: SpreadsheetViewport) => {\n setViewport((prev) => {\n const { metrics: m, virtual: v, windowOptions: o } = latest.current;\n if (!v) return prev;\n const same =\n prev.width === next.width &&\n prev.height === next.height &&\n sameSpreadsheetViewWindow(getSpreadsheetViewWindow(m, prev, o), getSpreadsheetViewWindow(m, next, o));\n return same ? prev : next;\n });\n }, []);\n\n const onScroll = useCallback(() => {\n const next = readViewport();\n if (next) updateViewport(next);\n }, [readViewport, updateViewport]);\n\n // Measure the container, and again whenever it is resized.\n useIsomorphicLayoutEffect(() => {\n if (!virtual) return;\n onScroll();\n const el = scrollRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(() => onScroll());\n observer.observe(el);\n return () => observer.disconnect();\n }, [virtual, onScroll, scrollRef]);\n\n // Keyboard navigation and selection: bring the active cell into view.\n const activeRow = options.activeCell?.row;\n const activeCol = options.activeCell?.col;\n useIsomorphicLayoutEffect(() => {\n if (!virtual || activeRow === undefined || activeCol === undefined) return;\n const el = scrollRef.current;\n const current = latest.current.viewport;\n const measured = readViewport();\n const base: SpreadsheetViewport = measured\n ? { ...measured, scrollTop: Math.max(measured.scrollTop, 0), scrollLeft: Math.max(measured.scrollLeft, 0) }\n : current;\n const target = getSpreadsheetScrollToCell(latest.current.metrics, base, { row: activeRow, col: activeCol });\n if (!target) return;\n const next = { ...base, ...target };\n if (el) {\n if (target.scrollTop !== undefined) el.scrollTop = target.scrollTop;\n if (target.scrollLeft !== undefined) el.scrollLeft = target.scrollLeft;\n }\n // Some environments (jsdom) never fire the scroll event.\n updateViewport(next);\n // Only the active cell and the mode: scrolling away from the active cell\n // (or an edit elsewhere) must not snap back.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [virtual, activeRow, activeCol]);\n\n return { metrics, window: win, onScroll };\n}\n","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { applyFormulaSuggestion, getFormulaHints, type FormulaNameSuggestionSource } from '@pixerate/editor/spreadsheet';\n\nexport interface FormulaHintsProps {\n /** The input being edited (a cell editor or the formula bar). */\n inputRef: React.RefObject<HTMLInputElement | null>;\n /** The input's current value. */\n value: string;\n /** Called with the new value when a suggestion is accepted. */\n onAccept: (value: string) => void;\n /** Maximum number of function suggestions (default 8). */\n limit?: number;\n /** Defined names to suggest too (e.g. `controller.getNameSuggestions()`). */\n names?: readonly FormulaNameSuggestionSource[];\n}\n\n/**\n * Formula autocomplete for an input: while the value starts with `=`, lists\n * functions matching the name at the caret (name, signature, description) and,\n * inside a call, shows the signature with the current argument highlighted.\n *\n * Keys are handled on the input itself, before the grid sees them: ArrowUp /\n * ArrowDown move the selection, Tab accepts it, Escape closes the list.\n * Enter is left alone so it still commits the cell.\n */\nexport const FormulaHints: React.FC<FormulaHintsProps> = ({ inputRef, value, onAccept, limit = 8, names }) => {\n const [caret, setCaret] = useState<number | null>(null);\n const [focused, setFocused] = useState(false);\n const [selected, setSelected] = useState(0);\n const [dismissed, setDismissed] = useState(false);\n const [position, setPosition] = useState<{ top: number; left: number; width: number } | null>(null);\n const pendingCaret = useRef<number | null>(null);\n\n const hints = useMemo(\n () => getFormulaHints(value, caret ?? value.length, { limit, names }),\n [value, caret, limit, names],\n );\n const suggestions = dismissed ? [] : hints.suggestions;\n const selectedIndex = Math.max(0, Math.min(selected, suggestions.length - 1));\n const visible = focused && value.trimStart().startsWith('=') && (suggestions.length > 0 || !!hints.activeCall);\n\n // The key listener reads the latest state through a ref.\n const latest = useRef({ suggestions, selected: selectedIndex, value, caret, onAccept });\n latest.current = { suggestions, selected: selectedIndex, value, caret, onAccept };\n\n const accept = (index: number) => {\n const { suggestions: list, value: current, caret: at, onAccept: commit } = latest.current;\n const suggestion = list[index];\n if (!suggestion) return;\n const next = applyFormulaSuggestion(current, at ?? current.length, suggestion);\n pendingCaret.current = next.caret;\n commit(next.value);\n };\n\n useEffect(() => {\n const input = inputRef.current;\n if (!input) return;\n const syncCaret = () => setCaret(input.selectionStart ?? input.value.length);\n const onInput = () => {\n setDismissed(false);\n setSelected(0);\n syncCaret();\n };\n const onFocus = () => {\n setFocused(true);\n syncCaret();\n };\n const onBlur = () => setFocused(false);\n // A native listener on the input runs before React's delegated handlers,\n // so stopping propagation keeps these keys away from the grid.\n const onKeyDown = (e: KeyboardEvent) => {\n const { suggestions: list } = latest.current;\n if (list.length === 0) return;\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n e.stopPropagation();\n const step = e.key === 'ArrowDown' ? 1 : -1;\n setSelected((i) => (i + step + list.length) % list.length);\n } else if (e.key === 'Tab' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n accept(latest.current.selected);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n setDismissed(true);\n }\n };\n\n input.addEventListener('input', onInput);\n input.addEventListener('keyup', syncCaret);\n input.addEventListener('click', syncCaret);\n input.addEventListener('select', syncCaret);\n input.addEventListener('focus', onFocus);\n input.addEventListener('blur', onBlur);\n input.addEventListener('keydown', onKeyDown);\n // Inputs focused on mount (autoFocus) fired `focus` before this effect ran.\n if (typeof document !== 'undefined' && document.activeElement === input) onFocus();\n return () => {\n input.removeEventListener('input', onInput);\n input.removeEventListener('keyup', syncCaret);\n input.removeEventListener('click', syncCaret);\n input.removeEventListener('select', syncCaret);\n input.removeEventListener('focus', onFocus);\n input.removeEventListener('blur', onBlur);\n input.removeEventListener('keydown', onKeyDown);\n };\n }, [inputRef]);\n\n // After accepting, put the caret inside the inserted parenthesis.\n useLayoutEffect(() => {\n const input = inputRef.current;\n const at = pendingCaret.current;\n if (!input || at === null || input.value !== value) return;\n pendingCaret.current = null;\n input.setSelectionRange(at, at);\n setCaret(at);\n setSelected(0);\n }, [value, inputRef]);\n\n useLayoutEffect(() => {\n const input = inputRef.current;\n if (!visible || !input) return;\n const rect = input.getBoundingClientRect();\n setPosition({ top: rect.bottom + 2, left: rect.left, width: rect.width });\n }, [visible, value, inputRef]);\n\n if (!visible) return null;\n\n const { activeCall } = hints;\n return (\n <div\n data-formula-hints=\"\"\n className=\"rounded-md border border-border bg-popover text-popover-foreground shadow-md text-xs font-sans overflow-hidden\"\n style={{\n position: 'fixed',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n minWidth: Math.max(260, position?.width ?? 0),\n maxWidth: 440,\n zIndex: 50,\n visibility: position ? 'visible' : 'hidden'\n }}\n onMouseDown={(e) => e.preventDefault()}\n >\n {activeCall && (\n <div data-formula-signature=\"\" className=\"px-2 py-1.5 border-b border-border bg-muted/30\">\n <div className=\"font-mono\">\n {activeCall.parts.map((part, i) => (\n <span\n key={i}\n data-active={part.active ? '' : undefined}\n className={part.active ? 'font-bold text-primary underline' : ''}\n >\n {part.text}\n </span>\n ))}\n </div>\n <div className=\"mt-0.5 text-muted-foreground\">\n {activeCall.argument ? (\n <>\n <span className=\"font-semibold\">{activeCall.argument.name}</span>: {activeCall.argument.description}\n </>\n ) : (\n activeCall.description\n )}\n </div>\n </div>\n )}\n {suggestions.length > 0 && (\n <ul role=\"listbox\" aria-label=\"Formula suggestions\" className=\"max-h-64 overflow-auto py-1 m-0 list-none p-0\">\n {suggestions.map((s, i) => (\n <li\n key={`${s.kind ?? 'fn'}:${s.name}`}\n role=\"option\"\n aria-selected={i === selectedIndex}\n className={`cursor-pointer px-2 py-1 ${i === selectedIndex ? 'bg-primary/10' : 'hover:bg-muted/50'}`}\n onMouseEnter={() => setSelected(i)}\n onMouseDown={(e) => {\n // Keep focus in the input so the edit isn't committed by blur.\n e.preventDefault();\n accept(i);\n }}\n >\n <div className=\"font-mono font-semibold text-foreground\">{s.signature}</div>\n <div className=\"text-muted-foreground truncate\">{s.description}</div>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n","import React, { useRef, useState } from 'react';\nimport { getSheetTabMenuItems, sheetDropIndex, type SpreadsheetMenuItem } from '@pixerate/editor/spreadsheet';\nimport type { useSpreadsheetEditor } from './useSpreadsheetEditor';\nimport { SpreadsheetContextMenu } from './SpreadsheetContextMenu';\n\nexport interface SheetTabsProps {\n state: ReturnType<typeof useSpreadsheetEditor>;\n readOnly?: boolean;\n className?: string;\n}\n\n/**\n * The workbook's sheet tabs: click to switch, double-click to rename, drag\n * to reorder, right-click for insert / rename / duplicate / move / delete\n * (delete asks to confirm), and a `+` button to add a sheet.\n */\nexport const SheetTabs: React.FC<SheetTabsProps> = ({ state, readOnly = false, className = '' }) => {\n const { controller, sheets } = state;\n const [renaming, setRenaming] = useState<{ id: string; draft: string } | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [menu, setMenu] = useState<{ x: number; y: number; items: SpreadsheetMenuItem[] } | null>(null);\n const dragFrom = useRef<number | null>(null);\n const [dropTarget, setDropTarget] = useState<{ index: number; after: boolean } | null>(null);\n\n const commitRename = (cancelOnError: boolean) => {\n if (!renaming) return;\n const sheet = sheets.find((s) => s.id === renaming.id);\n const name = renaming.draft.trim();\n if (!sheet || !name || name === sheet.name) {\n setRenaming(null);\n setError(null);\n return;\n }\n try {\n state.renameSheet(renaming.id, name);\n setRenaming(null);\n setError(null);\n } catch (err: any) {\n setError(err?.message ?? String(err));\n if (cancelOnError) setRenaming(null);\n }\n };\n\n const dropAfter = (e: React.DragEvent<HTMLElement>) => {\n const rect = e.currentTarget.getBoundingClientRect();\n return e.clientX > rect.left + rect.width / 2;\n };\n\n return (\n <div className={`flex flex-col ${className}`} data-sheet-tabs=\"\">\n <div\n role=\"tablist\"\n aria-label=\"Sheets\"\n className=\"flex items-center gap-0.5 overflow-x-auto border-t border-border bg-muted px-1 py-1 text-xs\"\n >\n {sheets.map((sheet, index) =>\n renaming?.id === sheet.id ? (\n <input\n key={sheet.id}\n aria-label=\"Sheet name\"\n autoFocus\n className=\"w-32 rounded border border-primary bg-background px-2 py-0.5 text-xs outline-none\"\n value={renaming.draft}\n onChange={(e) => setRenaming({ id: sheet.id, draft: e.target.value })}\n onFocus={(e) => e.currentTarget.select()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') commitRename(false);\n else if (e.key === 'Escape') {\n setRenaming(null);\n setError(null);\n }\n }}\n onBlur={() => commitRename(true)}\n />\n ) : (\n <button\n key={sheet.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.active}\n data-sheet-id={sheet.id}\n draggable={!readOnly}\n title={readOnly ? sheet.name : `${sheet.name} — double-click to rename, drag to move`}\n className={`whitespace-nowrap rounded px-3 py-0.5 ${\n sheet.active ? 'bg-background font-semibold text-foreground shadow-sm' : 'text-muted-foreground hover:bg-background/60'\n } ${dropTarget?.index === index ? (dropTarget.after ? 'border-r-2 border-primary' : 'border-l-2 border-primary') : ''}`}\n onClick={() => state.setActiveSheet(sheet.id)}\n onDoubleClick={() => {\n if (readOnly) return;\n setError(null);\n setRenaming({ id: sheet.id, draft: sheet.name });\n }}\n onContextMenu={(e) => {\n if (readOnly) return;\n e.preventDefault();\n setMenu({ x: e.clientX, y: e.clientY, items: getSheetTabMenuItems(controller, sheet.id, { onError: setError }) });\n }}\n onDragStart={(e) => {\n dragFrom.current = index;\n e.dataTransfer?.setData('text/plain', sheet.id);\n if (e.dataTransfer) e.dataTransfer.effectAllowed = 'move';\n }}\n onDragOver={(e) => {\n if (dragFrom.current === null) return;\n e.preventDefault();\n const after = dropAfter(e);\n setDropTarget((prev) => (prev?.index === index && prev.after === after ? prev : { index, after }));\n }}\n onDragLeave={() => setDropTarget(null)}\n onDrop={(e) => {\n e.preventDefault();\n const from = dragFrom.current;\n dragFrom.current = null;\n setDropTarget(null);\n if (from === null) return;\n state.moveSheet(sheets[from].id, sheetDropIndex(from, index, dropAfter(e)));\n }}\n onDragEnd={() => {\n dragFrom.current = null;\n setDropTarget(null);\n }}\n >\n {sheet.name}\n </button>\n ),\n )}\n {!readOnly && (\n <button\n type=\"button\"\n aria-label=\"Add sheet\"\n title=\"Add sheet\"\n className=\"rounded px-2 py-0.5 text-muted-foreground hover:bg-background/60\"\n onClick={() => {\n setError(null);\n state.addSheet();\n }}\n >\n +\n </button>\n )}\n </div>\n {error && (\n <div role=\"alert\" className=\"px-2 py-1 text-xs text-destructive\">\n {error}\n </div>\n )}\n {menu && (\n <SpreadsheetContextMenu\n items={menu.items}\n x={menu.x}\n y={menu.y}\n ariaLabel=\"Sheet actions\"\n onClose={() => setMenu(null)}\n />\n )}\n </div>\n );\n};\n","import React, { useMemo, useState } from 'react';\nimport { getNameManagerRows, parseFormula, type SpreadsheetNameRow } from '@pixerate/editor/spreadsheet';\nimport type { useSpreadsheetEditor } from './useSpreadsheetEditor';\n\nexport interface NameManagerProps {\n state: ReturnType<typeof useSpreadsheetEditor>;\n readOnly?: boolean;\n onClose?: () => void;\n className?: string;\n}\n\ninterface Draft {\n /** The name being edited (null for a new one). */\n original: { name: string; sheetId?: string } | null;\n name: string;\n refersTo: string;\n /** Sheet id, or '' for workbook scope. */\n scope: string;\n comment: string;\n}\n\nconst EMPTY_DRAFT: Draft = { original: null, name: '', refersTo: '=', scope: '', comment: '' };\n\n/**\n * A simple Name Manager: lists defined names (name, current value, formula,\n * scope) and adds, edits, renames and deletes them. Renaming a name rewrites\n * the formulas that use it; deleting one leaves them showing `#NAME?`.\n */\nexport const NameManager: React.FC<NameManagerProps> = ({ state, readOnly = false, onClose, className = '' }) => {\n const { controller, sheets } = state;\n const rows = useMemo(\n () => getNameManagerRows(controller),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [controller, state.document, state.names],\n );\n const [draft, setDraft] = useState<Draft>(EMPTY_DRAFT);\n const [error, setError] = useState<string | null>(null);\n\n const edit = (row: SpreadsheetNameRow) => {\n setError(null);\n setDraft({\n original: { name: row.name, sheetId: row.sheetId },\n name: row.name,\n refersTo: row.refersTo,\n scope: row.sheetId ?? '',\n comment: row.comment ?? '',\n });\n };\n\n const save = (e: React.FormEvent) => {\n e.preventDefault();\n const scope = draft.scope ? { sheet: draft.scope } : {};\n try {\n // Check before changing anything, so a failed edit keeps the old name.\n const invalid = controller.validateDefinedName(draft.name.trim());\n if (invalid) throw new Error(invalid);\n try {\n parseFormula(draft.refersTo.trim().startsWith('=') ? draft.refersTo.trim() : `=${draft.refersTo.trim()}`);\n } catch (err: any) {\n throw new Error(`There's a problem with this formula: ${err?.message ?? draft.refersTo}`);\n }\n const original = draft.original;\n if (original) {\n const originalScope = original.sheetId ? { sheet: original.sheetId } : {};\n if ((original.sheetId ?? '') !== draft.scope) {\n state.deleteName(original.name, originalScope);\n } else if (original.name !== draft.name) {\n state.renameName(original.name, draft.name.trim(), originalScope);\n }\n }\n state.defineName(draft.name.trim(), draft.refersTo, { ...scope, comment: draft.comment || undefined });\n setDraft(EMPTY_DRAFT);\n setError(null);\n } catch (err: any) {\n setError(err?.message ?? String(err));\n }\n };\n\n return (\n <section aria-label=\"Name Manager\" className={`flex flex-col gap-2 text-xs ${className}`} data-name-manager=\"\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"m-0 text-sm font-semibold\">Name Manager</h3>\n {onClose && (\n <button type=\"button\" aria-label=\"Close Name Manager\" className=\"rounded px-2 hover:bg-muted\" onClick={onClose}>\n ×\n </button>\n )}\n </div>\n <table className=\"w-full border-collapse\">\n <thead>\n <tr className=\"text-left text-muted-foreground\">\n <th className=\"px-1 font-medium\">Name</th>\n <th className=\"px-1 font-medium\">Value</th>\n <th className=\"px-1 font-medium\">Refers to</th>\n <th className=\"px-1 font-medium\">Scope</th>\n {!readOnly && <th className=\"px-1\" />}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 && (\n <tr>\n <td colSpan={5} className=\"px-1 py-2 text-muted-foreground\">\n No names yet.\n </td>\n </tr>\n )}\n {rows.map((row) => (\n <tr key={`${row.sheetId ?? ''}!${row.name}`} data-name={row.name} className=\"border-t border-border\" title={row.comment}>\n <td className=\"px-1 py-0.5 font-mono font-semibold\">{row.name}</td>\n <td className=\"px-1 py-0.5\">{row.value}</td>\n <td className=\"px-1 py-0.5 font-mono\">{row.refersTo}</td>\n <td className=\"px-1 py-0.5\">{row.scopeLabel}</td>\n {!readOnly && (\n <td className=\"whitespace-nowrap px-1 py-0.5 text-right\">\n <button type=\"button\" aria-label={`Edit ${row.name}`} className=\"rounded px-1 hover:bg-muted\" onClick={() => edit(row)}>\n Edit\n </button>\n <button\n type=\"button\"\n aria-label={`Delete ${row.name}`}\n className=\"rounded px-1 text-destructive hover:bg-muted\"\n onClick={() => {\n state.deleteName(row.name, row.sheetId ? { sheet: row.sheetId } : {});\n if (draft.original?.name === row.name && (draft.original.sheetId ?? '') === (row.sheetId ?? '')) setDraft(EMPTY_DRAFT);\n }}\n >\n Delete\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && (\n <form className=\"grid grid-cols-[auto_1fr] items-center gap-x-2 gap-y-1\" onSubmit={save} aria-label={draft.original ? `Edit name ${draft.original.name}` : 'New name'}>\n <label htmlFor=\"pixerate-name-manager-name\">Name</label>\n <input\n id=\"pixerate-name-manager-name\"\n className=\"rounded border border-border bg-background px-1 py-0.5\"\n value={draft.name}\n onChange={(e) => setDraft({ ...draft, name: e.target.value })}\n />\n <label htmlFor=\"pixerate-name-manager-refers\">Refers to</label>\n <input\n id=\"pixerate-name-manager-refers\"\n className=\"rounded border border-border bg-background px-1 py-0.5 font-mono\"\n value={draft.refersTo}\n onChange={(e) => setDraft({ ...draft, refersTo: e.target.value })}\n />\n <label htmlFor=\"pixerate-name-manager-scope\">Scope</label>\n <select\n id=\"pixerate-name-manager-scope\"\n className=\"rounded border border-border bg-background px-1 py-0.5\"\n value={draft.scope}\n onChange={(e) => setDraft({ ...draft, scope: e.target.value })}\n >\n <option value=\"\">Workbook</option>\n {sheets.map((sheet) => (\n <option key={sheet.id} value={sheet.id}>\n {sheet.name}\n </option>\n ))}\n </select>\n <label htmlFor=\"pixerate-name-manager-comment\">Comment</label>\n <input\n id=\"pixerate-name-manager-comment\"\n className=\"rounded border border-border bg-background px-1 py-0.5\"\n value={draft.comment}\n onChange={(e) => setDraft({ ...draft, comment: e.target.value })}\n />\n <div className=\"col-span-2 flex gap-2\">\n <button type=\"submit\" className=\"rounded bg-primary px-2 py-0.5 text-primary-foreground\">\n {draft.original ? 'Save' : 'Add name'}\n </button>\n {draft.original && (\n <button\n type=\"button\"\n className=\"rounded px-2 py-0.5 hover:bg-muted\"\n onClick={() => {\n setDraft(EMPTY_DRAFT);\n setError(null);\n }}\n >\n Cancel\n </button>\n )}\n </div>\n </form>\n )}\n {error && (\n <div role=\"alert\" className=\"text-destructive\">\n {error}\n </div>\n )}\n </section>\n );\n};\n"],"mappings":"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","names":["options","document","useRef","useState","useMemo","useEffect","useCallback","normalizeRange","getConditionalFormatCss","useRef","useState","React","jsx","jsxs","useCallback","useEffect","useRef","useState","useEffect","useRef","jsx","jsxs","useMemo","useState","jsx","jsxs","useCallback","useEffect","useLayoutEffect","useMemo","useRef","useState","useEffect","useLayoutEffect","useMemo","useRef","useState","jsx","jsxs","useRef","useState","jsx","jsxs","useState","useRef","Fragment","jsx","jsxs","useRef","useState","useMemo","useCallback","useEffect","normalizeRange","getConditionalFormatCss","useMemo","useState","jsx","jsxs"]}