export type SpreadsheetCanvasCellFormat = { fill?: string | undefined; font?: { name?: string | undefined; size?: number | undefined; bold?: boolean | undefined; italic?: boolean | undefined; underline?: boolean | undefined; color?: string | undefined; } | undefined; horizontalAlignment?: "left" | "center" | "right" | "justify" | undefined; verticalAlignment?: "top" | "center" | "bottom" | undefined; wrapText?: boolean | undefined; }; /** One sparse, already-authorized cell projected into the renderer. */ export type SpreadsheetCanvasCell = { row: number; col: number; value: unknown; formula?: string | null | undefined; format: SpreadsheetCanvasCellFormat; }; export type SpreadsheetCanvasCoverage = { rowStart: number; rowEnd: number; columnStart: number; columnEnd: number; }; /** * A bounded value projection. `coverage` is end-exclusive; omitting it means * the source can answer for the entire sheet. A session-backed adapter can * replace this object as viewport subscriptions advance without making the * React layer or renderer own the canonical workbook model. */ export type SpreadsheetCanvasProjection = { sheetId: string; generationId: string | null; revision: string | number; coverage?: SpreadsheetCanvasCoverage | undefined; cells: SpreadsheetCanvasCellSource; valueAt: (cell: SpreadsheetCanvasCell) => unknown; }; export type SpreadsheetCanvasCellSource = { forEachInRange: (rowStart: number, rowEnd: number, columnStart: number, columnEnd: number, visit: (cell: SpreadsheetCanvasCell) => void) => void; }; export type SpreadsheetCanvasAxis = { count: number; total: number; offsetAt: (index: number) => number; sizeAt: (index: number) => number; indexAtOffset: (offset: number) => number; }; export type SpreadsheetCanvasSelection = { top: number; bottom: number; left: number; right: number; focusRow: number; focusColumn: number; }; export type SpreadsheetCanvasTheme = { background: string; headerBackground: string; border: string; foreground: string; mutedForeground: string; accent: string; error: string; fontFamily: string; fontSize: number; headerFontSize: number; signature: string; }; export type SpreadsheetCanvasPaint = { canvas: HTMLCanvasElement; projection: SpreadsheetCanvasProjection; rows: SpreadsheetCanvasAxis; columns: SpreadsheetCanvasAxis; selection: SpreadsheetCanvasSelection; logicalScrollLeft: number; logicalScrollTop: number; viewportWidth: number; viewportHeight: number; rowHeaderWidth: number; columnHeaderHeight: number; dimensionRevision: string | number; devicePixelRatio: number; theme: SpreadsheetCanvasTheme; }; export type SpreadsheetCanvasPaintStats = { cacheSize: number; paintedTiles: number; reusedTiles: number; uncachedTiles: number; devicePixelRatio: number; }; /** * A row-major sparse index over stored worksheet cells. Empty cells never enter * this structure, so a tile query costs O(log k + v), where v is the number of * stored cells intersecting that tile. */ export declare class SparseSpreadsheetCellIndex { readonly size: number; private readonly rows; constructor(entries: Iterable); forEachInRange(rowStart: number, rowEnd: number, columnStart: number, columnEnd: number, visit: (cell: SpreadsheetCanvasCell) => void): void; } export declare function spreadsheetCanvasDevicePixelRatio(value: number): number; /** Caps backing-store allocation while retaining the full CSS viewport. */ export declare function spreadsheetCanvasBackingScale(width: number, height: number, devicePixelRatio: number): number; /** Retained 2D tile renderer. Dynamic selection and headers are painted above cached body tiles. */ export declare class SpreadsheetCanvasRenderer { private readonly tiles; private generation; private clock; dispose(): void; paint(input: SpreadsheetCanvasPaint): SpreadsheetCanvasPaintStats | null; private paintTile; private evictTiles; }