@gridsheet/react-core 3.0.0-rc.5 → 3.0.0-rc.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/GridSheet.d.ts.map +1 -1
- package/dist/index.js +597 -588
- package/dist/index.js.map +1 -1
- package/dist/lib/book.d.ts +6 -0
- package/dist/lib/book.d.ts.map +1 -1
- package/dist/lib/sheet.d.ts.map +1 -1
- package/dist/store/actions.d.ts.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/store/index.ts","../src/lib/coords.ts","../src/lib/spatial.ts","../src/store/helpers.ts","../src/lib/virtualization.ts","../src/lib/operation.ts","../src/lib/time.ts","../src/lib/autofill.ts","../src/store/actions.ts","../src/lib/popup.ts","../src/components/FunctionGuide.tsx","../src/components/EditorOptions.tsx","../src/lib/dom.ts","../src/lib/clipboard.ts","../src/formula/formula-error.ts","../src/formula/evaluator.ts","../src/lib/cell.ts","../src/lib/sheet_utils.ts","../src/lib/input.ts","../src/lib/palette.ts","../src/sentinels.ts","../src/lib/book.ts","../src/lib/date.ts","../src/policy/core.ts","../src/lib/filter.ts","../src/lib/reference.ts","../src/lib/sheet.ts","../src/formula/solver.ts","../src/formula/functions/__async.ts","../src/formula/functions/__base.ts","../src/formula/functions/__utils.ts","../src/formula/functions/add.ts","../src/formula/functions/minus.ts","../src/formula/functions/multiply.ts","../src/formula/functions/divide.ts","../src/formula/functions/sum.ts","../src/formula/functions/concat.ts","../src/formula/functions/eq.ts","../src/formula/functions/ne.ts","../src/formula/functions/gt.ts","../src/formula/functions/gte.ts","../src/formula/functions/lt.ts","../src/formula/functions/lte.ts","../src/formula/functions/now.ts","../src/formula/functions/and.ts","../src/formula/functions/or.ts","../src/formula/functions/if.ts","../src/formula/functions/iferror.ts","../src/formula/functions/not.ts","../src/formula/functions/count.ts","../src/formula/functions/abs.ts","../src/formula/functions/power.ts","../src/formula/functions/counta.ts","../src/formula/functions/average.ts","../src/formula/functions/max.ts","../src/formula/functions/min.ts","../src/formula/functions/len.ts","../src/formula/functions/uminus.ts","../src/formula/functions/arrayformula.ts","../src/formula/mapping.ts","../src/components/useAutocomplete.ts","../src/components/hooks.ts","../src/components/Fixed.tsx","../src/lib/paste.ts","../src/components/Editor.tsx","../src/components/PluginBase.tsx","../src/components/StoreObserver.tsx","../src/components/Resizer.tsx","../src/components/Emitter.tsx","../src/store/dispatchers.ts","../src/lib/menu.ts","../src/components/MenuItem.tsx","../src/components/ContextMenu.tsx","../src/components/ColumnMenuFilterSection.tsx","../src/components/ColumnMenuSortSection.tsx","../src/lib/label.ts","../src/components/ColumnMenuLabelSection.tsx","../src/components/ColumnMenu.tsx","../src/components/RowMenu.tsx","../src/lib/events.ts","../src/components/Cell.tsx","../src/components/ScrollHandle.tsx","../src/components/HeaderCellTop.tsx","../src/components/HeaderCellLeft.tsx","../src/components/CellStateOverlay.tsx","../src/components/Tabular.tsx","../src/styles/minified.ts","../src/styles/embedder.ts","../src/components/FormulaBar.tsx","../src/components/svg/Base.tsx","../src/components/svg/SearchIcon.tsx","../src/components/svg/CloseIcon.tsx","../src/components/SearchBar.tsx","../src/components/GridSheet.tsx","../src/policy/thousand_separator.ts","../src/policy/checkbox.tsx","../src/styles/utils.ts"],"sourcesContent":["import type { ZoneType } from './types';\n\nexport const DEFAULT_HISTORY_LIMIT = 20;\n\nexport const DEFAULT_HEIGHT = 24;\nexport const DEFAULT_WIDTH = 90;\n\nexport const SHEET_HEIGHT = 500;\nexport const SHEET_WIDTH = 1000;\n\nexport const HEADER_HEIGHT = 24;\nexport const HEADER_WIDTH = 50;\n\nexport const MIN_WIDTH = 5;\nexport const MIN_HEIGHT = 5;\n\nexport const OVERSCAN_X = 5;\nexport const OVERSCAN_Y = 10;\n\nexport const DEFAULT_ALPHABET_CACHE_SIZE = 1000;\n\nexport const SECONDS_IN_DAY = 86400;\nexport const FULLDATE_FORMAT_UTC = 'YYYY-MM-DDTHH:mm:ss.SSSZ';\n\nexport const RESET_ZONE: ZoneType = {\n startY: -1,\n startX: -1,\n endY: -1,\n endX: -1,\n};\n\n// 1900-01-01 is the base date for date serialization in Excel, and is represented as 0 in Excel's date system. However, JavaScript's Date object uses the Unix epoch (1970-01-01) as its base date. Therefore, we need to account for the difference between these two epochs when converting between Excel dates and JavaScript dates.\nexport const BASE_DATE = new Date(1900, 0, 1);\n\nexport const DEFAULT_KEY = 'default';\nexport const DEFAULT_COL_KEY = 'defaultCol';\nexport const DEFAULT_ROW_KEY = 'defaultRow';\n","import { createContext } from 'react';\nimport { StoreType } from '../types';\n\nexport type Dispatcher = React.Dispatch<{\n type: number;\n value: any;\n}>;\n\nexport const Context = createContext(\n {} as {\n store: StoreType;\n dispatch: Dispatcher;\n },\n);\n","import type { Address, PointType, ExtraPointType } from '../types';\nimport { DEFAULT_ALPHABET_CACHE_SIZE } from '../constants';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nconst N2C_CACHE = new Map<number, string>();\nconst C2N_CACHE = new Map<string, number>();\n\nconst getColumnLetterFromNumber = (key: number, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): string => {\n const cached = N2C_CACHE.get(--key);\n if (cached != null) {\n return cached;\n }\n if (key === 0) {\n return '';\n }\n let num = key;\n let result = '';\n do {\n result = ALPHABET[--num % 26] + result;\n num = Math.floor(num / 26);\n } while (num > 0);\n\n N2C_CACHE.set(key, result);\n const it = N2C_CACHE.keys();\n for (let st = it.next(); N2C_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n N2C_CACHE.delete(st.value);\n }\n return result;\n};\n\nconst getNumberFromColumnLetter = (key: string, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): number => {\n const cached = C2N_CACHE.get(key);\n if (cached != null) {\n return cached;\n }\n if (key === '') {\n return 0;\n }\n const alpha = key;\n let result = 0;\n for (let digit = 0; digit < alpha.length; digit++) {\n const a = alpha[alpha.length - digit - 1];\n const num = ALPHABET.indexOf(a) + 1;\n result += ALPHABET.length ** digit * num;\n }\n C2N_CACHE.set(key, result);\n const it = C2N_CACHE.keys();\n for (let st = it.next(); C2N_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n C2N_CACHE.delete(st.value);\n }\n return result;\n};\n\nexport const x2c = (x: number): string => {\n if (x === 0) {\n return '';\n }\n const c = getColumnLetterFromNumber(x + 1);\n return x < 0 ? `$${c}` : c;\n};\n\nexport const c2x = (col: string, absolute = false): number => {\n const n = getNumberFromColumnLetter(col.toUpperCase());\n return absolute ? -n : n;\n};\n\nexport const y2r = (y: number) => {\n if (y === 0) {\n return '';\n }\n return y < 0 ? `$${y}` : String(y);\n};\n\nexport const r2y = (row: number | string, absolute = false) => {\n if (typeof row === 'string') {\n row = parseInt(row, 10);\n }\n return absolute ? -row : row;\n};\n\nexport const p2a = ({ y, x, absX, absY }: Partial<ExtraPointType>) => {\n if (x === -1 && y === -1) {\n return '?';\n }\n const colPart = x === undefined ? '' : x === 0 ? '0' : `${absX ? '$' : ''}${x2c(x)}`;\n const rowPart = y === undefined ? '' : y === 0 ? '0' : `${absY ? '$' : ''}${y2r(y)}`;\n return `${colPart}${rowPart}`;\n};\n\nexport const a2p = (address: Address): ExtraPointType => {\n const m = address.match(/(\\$)?([a-zA-Z]*)(\\$)?([0-9]*)/);\n if (m == null) {\n return { y: -1, x: -1 };\n }\n const [, _absX, col, _absY, row] = m.slice();\n const [absX, absY] = [_absX != null, _absY != null];\n if (col === '' && row === '') {\n return { y: -1, x: -1, absX: false, absY: false };\n }\n return { y: r2y(row) || 0, x: c2x(col) || 0, absX, absY };\n};\n\nexport const grantAddressAbsolute = (address: Address, absCol: boolean, absRow: boolean) => {\n const m = address.match(/([A-Z]*)([0-9]*)/);\n if (m == null) {\n return address;\n }\n const [, col, row] = m.slice();\n return `${absCol ? '$' : ''}${col.toUpperCase()}${absRow ? '$' : ''}${row}`;\n};\n\n/**\n * Returns the row header cell address for a given row number by prepending `0`.\n * e.g. rh(6) → '06', rh(1) → '01'\n */\nexport const rh = (y: number): string => `0${y}`;\n\n/**\n * Returns the column header cell address for a given column letter or column index\n * (1-based, same as point.x) by appending `0`.\n * e.g. ch('A') → 'A0', ch(1) → 'A0'\n */\nexport const ch = (col: string | number): string =>\n typeof col === 'number' ? `${x2c(col)}0` : `${col.toUpperCase()}0`;\n\nexport const stripAddressAbsolute = (address: Address) => {\n return address.replace(/\\$/g, '');\n};\n\nexport const buildIdentifiedRef = (id: string, absX = false, absY = false): string => {\n return `${absX ? '$' : ''}#${id}${absY ? '$' : ''}`;\n};\n","import { DEFAULT_KEY, DEFAULT_COL_KEY, DEFAULT_ROW_KEY } from '../constants';\nimport type {\n MatrixType,\n AreaType,\n ZoneType,\n RangeType,\n PointType,\n CellsByAddressType,\n ShapeType,\n MatricesByAddress,\n CellType,\n Address,\n} from '../types';\nimport { a2p, p2a, x2c, c2x } from './coords';\n\nexport const superposeArea = (srcArea: AreaType, dstArea: AreaType): ShapeType => {\n const { rows: srcRows, cols: srcCols } = areaDiff(srcArea);\n const { rows: dstRows, cols: dstCols } = areaDiff(dstArea);\n\n // biggerRows, biggerCols\n return {\n rows: srcRows > dstRows ? srcRows : dstRows,\n cols: srcCols > dstCols ? srcCols : dstCols,\n };\n};\n\nexport const concatAreas = (area1: AreaType, area2: AreaType): AreaType => {\n const result: AreaType = { ...area1 };\n if (area2.left < area1.left) {\n result.left = area2.left;\n }\n if (area2.right > area1.right) {\n result.right = area2.right;\n }\n if (area2.top < area1.top) {\n result.top = area2.top;\n }\n if (area2.bottom > area1.bottom) {\n result.bottom = area2.bottom;\n }\n return result;\n};\n\nexport const zoneToArea = (zone: ZoneType): AreaType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { top: -1, left: -1, bottom: -1, right: -1 };\n }\n const [top, bottom] = zone.startY < zone.endY ? [zone.startY, zone.endY] : [zone.endY, zone.startY];\n const [left, right] = zone.startX < zone.endX ? [zone.startX, zone.endX] : [zone.endX, zone.startX];\n return { top, left, bottom, right };\n};\n\nexport const areaToZone = (area: AreaType): ZoneType => {\n return {\n startY: area.top,\n startX: area.left,\n endY: area.bottom,\n endX: area.right,\n };\n};\n\nexport const areaToRange = (area: AreaType): string => {\n const { top, left, bottom, right } = area;\n if (top === bottom && left === right) {\n return p2a({ y: top, x: left });\n }\n const leftTop = p2a({ y: top, x: left });\n const rightBottom = p2a({ y: bottom, x: right });\n return `${leftTop}:${rightBottom}`;\n};\n\nexport const between = (range: RangeType, index: number) => {\n if (range.start === -1 || range.end === -1) {\n return false;\n }\n return (range.start <= index && index <= range.end) || (range.end <= index && index <= range.start);\n};\n\nexport const among = (area: AreaType, point: PointType) => {\n if (area.top === -1 || area.left === -1 || area.bottom === -1 || area.right === -1) {\n return false;\n }\n const { y, x } = point;\n const { top, left, bottom, right } = area;\n return top <= y && y <= bottom && left <= x && x <= right;\n};\n\ntype ShapeExtension = { base?: number };\n\nexport const zoneDiff = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 0, cols: 0 };\n }\n return {\n rows: Math.abs(zone.startY - zone.endY),\n cols: Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const zoneShape = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 1, cols: 1 };\n }\n return {\n rows: 1 + Math.abs(zone.startY - zone.endY),\n cols: 1 + Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const areaDiff = (area: AreaType): ShapeType => {\n return {\n rows: Math.abs(area.top - area.bottom),\n cols: Math.abs(area.left - area.right),\n };\n};\n\nexport const areaShape = (area: AreaType): ShapeType => {\n return {\n rows: 1 + Math.abs(area.top - area.bottom),\n cols: 1 + Math.abs(area.left - area.right),\n };\n};\n\nexport const matrixShape = ({ base = 0, matrix }: { matrix: MatrixType } & ShapeExtension): ShapeType => {\n const h = matrix.length;\n if (h === 0) {\n return { rows: 0, cols: 0 };\n }\n return { rows: base + h, cols: base + matrix[0].length };\n};\n\nexport const makeSequence = (start: number, stop: number, step: number = 1) => {\n return Array.from({ length: (stop - start - 1) / step + 1 }, (_, i) => start + i * step);\n};\n\nexport const oa2aa = (oa: { [s: string]: any }[], fields: string[]): MatrixType => {\n const aa: any[][] = [];\n oa.forEach((o) => {\n const a: any[] = [];\n fields.forEach((field) => {\n a.push(o[field]);\n });\n aa.push(a);\n });\n return aa;\n};\n\nexport const aa2oa = (aa: MatrixType, fields: string[]): { [s: string]: any }[] => {\n const oa: { [s: string]: any }[] = [];\n aa.forEach((a) => {\n const o: { [s: string]: any } = {};\n a.forEach((v, i) => {\n if (i >= fields.length) {\n return;\n }\n const field = fields[i];\n o[field] = v;\n });\n oa.push(o);\n });\n return oa;\n};\n\nexport const createMatrix = <T = any>(numRows: number, numCols: number, fill?: T): T[][] => {\n return [...Array(numRows)].map(() => Array(numCols).fill(fill));\n};\n\nexport const buildInitialCellsFromOrigin = ({\n cells = {},\n ensured = {},\n matrix = [],\n flattenAs = 'value',\n origin = 'A1',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrix?: MatrixType;\n origin?: Address;\n}) => {\n return buildInitialCells({\n cells,\n ensured,\n matrices: { [origin]: matrix },\n flattenAs,\n });\n};\n\nexport const buildInitialCells = ({\n cells = {},\n ensured = {},\n matrices = {},\n flattenAs = 'value',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<any>;\n} = {}) => {\n buildCells({ cells, flattenAs, matrices });\n const { numRows, numCols } = Object.assign({ numRows: 1, numCols: 1 }, ensured);\n const rightBottom = p2a({ y: numRows, x: numCols });\n if (cells[rightBottom] == null) {\n cells[rightBottom] = {};\n }\n return cells;\n};\n\nexport const buildCells = <T>({\n cells = {},\n matrices = {},\n flattenAs,\n}: {\n cells?: CellsByAddressType;\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<T>;\n}) => {\n Object.keys(matrices).forEach((baseAddress) => {\n const matrix = matrices[baseAddress];\n const { y: baseY, x: baseX } = a2p(baseAddress);\n matrix.forEach((row, y) => {\n row.forEach((e, x) => {\n const id = p2a({ y: baseY + y, x: baseX + x });\n if (flattenAs) {\n const cell = cells[id];\n cells[id] = { [flattenAs]: e, ...cell };\n } else {\n cells[id] = e as CellType;\n }\n });\n });\n });\n return cells;\n};\n\nexport const getMaxSizesFromCells = (cells: CellsByAddressType = {}) => {\n let [lastY, lastX] = [0, 0];\n Object.keys(cells).forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const { y, x } = a2p(address);\n if (lastY < y) {\n lastY = y;\n }\n if (lastX < x) {\n lastX = x;\n }\n });\n return { numRows: lastY, numCols: lastX };\n};\n\nexport const range = (start: number, end: number) => {\n const list: number[] = [];\n for (let i = start; i <= end; i++) {\n list.push(i);\n }\n return list;\n};\n\nexport const complementSelectingArea = (selectingArea: AreaType, choosing: PointType) => {\n if (selectingArea.left === -1) {\n selectingArea = {\n left: choosing.x,\n top: choosing.y,\n right: choosing.x,\n bottom: choosing.y,\n };\n }\n return selectingArea;\n};\n\nexport const expandRange = (range: string): Address[] => {\n if (range.indexOf(':') === -1) {\n return [range];\n }\n\n const result: Address[] = [];\n\n const isRowRange = /^\\d+\\:\\d+$/.test(range);\n\n if (isRowRange) {\n const [startRow, endRow] = range.split(':').map(Number);\n for (let row = startRow; row <= endRow; row++) {\n result.push(`${row}`);\n }\n return result;\n }\n\n const match = range.match(/^([A-Z]*)(\\d+)?\\:([A-Z]*)(\\d+)?$/);\n if (!match) {\n console.error('Invalid range format', range);\n return [range];\n }\n\n const [, startCol, startRow, endCol, endRow] = match;\n const startColIndex = startCol ? c2x(startCol) : 1;\n const endColIndex = endCol ? c2x(endCol) : 1;\n\n for (let col = startColIndex; col <= endColIndex; col++) {\n const currentColumn = startCol || endCol ? x2c(col) : '';\n if (startRow && endRow) {\n for (let row = Number(startRow); row <= Number(endRow); row++) {\n result.push(`${currentColumn}${row}`);\n }\n } else if (!startRow && !endRow) {\n result.push(currentColumn);\n }\n }\n return result;\n};\n\n// restrictZone resets a zone if the zone consists of a single cell.\nexport const restrictZone = (zone: ZoneType): ZoneType => {\n const s = zoneDiff(zone);\n if (s.rows + s.cols === 0) {\n return { startY: -1, startX: -1, endY: -1, endX: -1 };\n }\n return { ...zone };\n};\n\nexport type BinarySearchPredicate = (mid: number) => boolean;\n\nexport const binarySearch = (\n low: number,\n high: number,\n predicate: BinarySearchPredicate,\n lessThan: boolean,\n): number => {\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (predicate(mid)) {\n if (lessThan) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n } else {\n if (lessThan) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n }\n return lessThan ? low : high;\n};\n\n/**\n * Convert a list of addresses into an array of bounding areas.\n * Adjacent cells (4-connected: up/down/left/right) are grouped into the same area.\n * Each resulting AreaType is the bounding rectangle of one connected group.\n */\nexport const addressesToAreas = (addresses: Address[]): AreaType[] => {\n if (addresses.length === 0) {\n return [];\n }\n\n const points = addresses.map((addr) => {\n const { y, x } = a2p(addr);\n return { y, x };\n });\n\n const key = (y: number, x: number) => `${y},${x}`;\n const pointSet = new Set(points.map((p) => key(p.y, p.x)));\n const visited = new Set<string>();\n const areas: AreaType[] = [];\n\n for (const p of points) {\n const k = key(p.y, p.x);\n if (visited.has(k)) {\n continue;\n }\n\n // BFS to find connected component\n let top = p.y,\n left = p.x,\n bottom = p.y,\n right = p.x;\n const queue = [p];\n visited.add(k);\n\n while (queue.length > 0) {\n const { y, x } = queue.shift()!;\n if (y < top) {\n top = y;\n }\n if (y > bottom) {\n bottom = y;\n }\n if (x < left) {\n left = x;\n }\n if (x > right) {\n right = x;\n }\n\n for (const [dy, dx] of [\n [0, 1],\n [0, -1],\n [1, 0],\n [-1, 0],\n ]) {\n const nk = key(y + dy, x + dx);\n if (pointSet.has(nk) && !visited.has(nk)) {\n visited.add(nk);\n queue.push({ y: y + dy, x: x + dx });\n }\n }\n }\n\n areas.push({ top, left, bottom, right });\n }\n\n return areas;\n};\n\n/**\n * Extract unique column indices (x) from a list of addresses, ignoring row information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToCols = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const cols: number[] = [];\n for (const addr of addresses) {\n const { x } = a2p(addr);\n if (!seen.has(x)) {\n seen.add(x);\n cols.push(x);\n }\n }\n if (asc === true) {\n cols.sort((a, b) => a - b);\n } else if (asc === false) {\n cols.sort((a, b) => b - a);\n }\n return cols;\n};\n\n/**\n * Extract unique row indices (y) from a list of addresses, ignoring column information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToRows = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const rows: number[] = [];\n for (const addr of addresses) {\n const { y } = a2p(addr);\n if (!seen.has(y)) {\n seen.add(y);\n rows.push(y);\n }\n }\n if (asc === true) {\n rows.sort((a, b) => a - b);\n } else if (asc === false) {\n rows.sort((a, b) => b - a);\n }\n return rows;\n};\n\nexport const isZoneNotSelected = (zone: ZoneType): boolean => {\n return zone.startY === -1 || zone.startX === -1 || zone.endY === -1 || zone.endX === -1;\n};\n","import { a2p, x2c, y2r } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport type { Address, PointType, StorePatchType, StoreType } from '../types';\n\n/**\n * Strip redundant fields from a StorePatchType before recording in history.\n * - selectingZone with endY === -1 && endX === -1 is a no-selection sentinel and need not be stored.\n */\nexport const compactReflection = (reflection: StorePatchType): StorePatchType => {\n const result = { ...reflection };\n if (result.selectingZone != null && result.selectingZone.endY === -1 && result.selectingZone.endX === -1) {\n delete result.selectingZone;\n }\n return result;\n};\n\nexport const restrictPoints = (store: StoreType, sheet: Sheet) => {\n const { choosing, selectingZone } = store;\n let { y, x } = choosing;\n let { startY: y1, startX: x1, endY: y2, endX: x2 } = selectingZone;\n const [numRows, numCols] = [sheet.numRows, sheet.numCols];\n if (y > numRows) {\n y = numRows;\n }\n if (x > numCols) {\n x = numCols;\n }\n if (y1 > numRows) {\n y1 = numRows;\n }\n if (y2 > numRows) {\n y2 = numRows;\n }\n if (x1 > numCols) {\n x1 = numCols;\n }\n if (x2 > numCols) {\n x2 = numCols;\n }\n return {\n choosing: { y, x } as PointType,\n selectingZone: { startY: y1, startX: x1, endY: y2, endX: x2 },\n };\n};\n\nconst FLASH_CLASS = 'gs-flash-overlay--active';\nconst FLASH_DURATION_MS = 600;\nexport const flashSheet = (el: HTMLElement | null) => {\n if (!el) {\n return;\n }\n el.classList.remove(FLASH_CLASS);\n // force reflow to restart animation when called consecutively\n void el.offsetWidth;\n el.classList.add(FLASH_CLASS);\n setTimeout(() => el.classList.remove(FLASH_CLASS), FLASH_DURATION_MS);\n};\n\nexport const flashWithCallback = (\n store: StoreType,\n sheet: Sheet,\n callback: ((s: StoreType) => void) | undefined,\n): StoreType & { callback?: (store: StoreType) => void } => ({\n ...store,\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n});\n\nexport const shouldTracking = (operation: string) => {\n switch (operation) {\n case 'INSERT_ROWS':\n return true;\n case 'INSERT_COLS':\n return true;\n case 'REMOVE_ROWS':\n return true;\n case 'REMOVE_COLS':\n return true;\n case 'MOVE':\n return true;\n case 'SORT_ROWS':\n return true;\n }\n return false;\n};\n\nexport const initSearchStatement = (sheet: Sheet, store: StoreType) => {\n const { searchQuery, searchCaseSensitive, searchRegex, searchRange } = store;\n let { choosing } = store;\n if (!searchQuery) {\n return { matchingCells: [] };\n }\n const matchingCells: Address[] = [];\n\n let matcher: (value: string) => boolean;\n if (searchRegex) {\n try {\n const flags = searchCaseSensitive ? '' : 'i';\n const regex = new RegExp(searchQuery, flags);\n matcher = (v: string) => regex.test(v);\n } catch (e) {\n // Invalid regex, treat as literal string\n const q = searchCaseSensitive ? searchQuery : searchQuery.toLowerCase();\n matcher = (v: string) => {\n const s = searchCaseSensitive ? v : v.toLowerCase();\n return s.indexOf(q) !== -1;\n };\n }\n } else {\n const q = searchCaseSensitive ? searchQuery : searchQuery.toLowerCase();\n matcher = (v: string) => {\n const s = searchCaseSensitive ? v : v.toLowerCase();\n return s.indexOf(q) !== -1;\n };\n }\n\n // Determine search range\n let startY = 1,\n endY = sheet.bottom;\n let startX = 1,\n endX = sheet.right;\n if (searchRange) {\n startY = searchRange.startY;\n endY = searchRange.endY;\n startX = searchRange.startX;\n endX = searchRange.endX;\n }\n\n for (let y = startY; y <= endY; y++) {\n for (let x = startX; x <= endX; x++) {\n const v = sheet.getSerializedValue({ point: { y, x } });\n if (matcher(v)) {\n matchingCells.push(`${x2c(x)}${y2r(y)}`);\n }\n }\n }\n const matchingCellIndex = matchingCells.length === store.matchingCells.length ? store.matchingCellIndex : 0;\n if (matchingCells.length > 0) {\n const address = matchingCells[matchingCellIndex];\n choosing = a2p(address);\n }\n return { matchingCells, searchQuery, matchingCellIndex, choosing };\n};\n\nexport const isXSheetFocused = (store: StoreType) => {\n const { sheetId, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return false;\n }\n if (sheetId === sheet.registry.editingSheetId) {\n return false;\n }\n return !!sheet.registry.editingAddress;\n};\n","import { DEFAULT_HEIGHT, DEFAULT_WIDTH, OVERSCAN_X, OVERSCAN_Y } from '../constants';\nimport { range, binarySearch, type BinarySearchPredicate } from './spatial';\nimport { Sheet } from './sheet';\nimport type { AreaType, PointType, Virtualization } from '../types';\n\nexport const getCellRectPositions = (sheet: Sheet, { y, x }: PointType) => {\n // Use System.offsetLeft / offsetTop stored on header cells for O(1) lookup\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const left = sheet.getSystem({ y: 0, x })?.offsetLeft ?? 0;\n const top = sheet.getSystem({ y, x: 0 })?.offsetTop ?? 0;\n const w = colCell?.width || DEFAULT_WIDTH;\n const h = rowCell?.filtered ? 0 : rowCell?.height || DEFAULT_HEIGHT;\n return {\n top,\n left,\n bottom: top + h,\n right: left + w,\n width: w,\n height: h,\n };\n};\n\nexport const getScreenRect = (e: HTMLDivElement) => {\n const top = e.scrollTop,\n left = e.scrollLeft;\n const height = e.offsetHeight,\n width = e.offsetWidth;\n const bottom = top + height,\n right = left + width;\n return { top, left, bottom, right, height, width };\n};\n\nexport const virtualize = (sheet: Sheet, e: HTMLDivElement | null): Virtualization | null => {\n if (e == null) {\n return null;\n }\n let boundaryTop = 0,\n boundaryLeft = 0,\n boundaryBottom = sheet.numRows,\n boundaryRight = sheet.numCols;\n\n const { top, left, bottom, right } = getScreenRect(e);\n let width = 0,\n height = 0;\n for (let x = 1; x <= sheet.numCols; x++) {\n const w = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n width += w;\n if (boundaryLeft === 0 && width > left) {\n boundaryLeft = Math.max(x - OVERSCAN_X, 1);\n }\n if (width > right) {\n boundaryRight = Math.min(x + OVERSCAN_X, sheet.numCols);\n break;\n }\n }\n for (let y = 1; y <= sheet.numRows; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n const h = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n height += h;\n if (boundaryTop === 0 && height > top) {\n boundaryTop = Math.max(y - OVERSCAN_Y, 1);\n }\n if (height > bottom) {\n boundaryBottom = Math.min(y + OVERSCAN_Y, sheet.numRows);\n break;\n }\n }\n const ys = boundaryTop === 0 ? [] : range(boundaryTop, boundaryBottom).filter((y) => !sheet.isRowFiltered(y));\n const xs = range(boundaryLeft, boundaryRight);\n const before = sheet.getRectSize({\n top: 1,\n left: 1,\n bottom: boundaryTop,\n right: boundaryLeft,\n });\n const after = sheet.getRectSize({\n top: boundaryBottom,\n left: boundaryRight,\n bottom: sheet.numRows,\n right: sheet.numCols,\n });\n return {\n ys,\n xs,\n adjuster: {\n top: before.height,\n left: before.width,\n bottom: after.height,\n right: after.width,\n },\n };\n};\n\nexport const smartScroll = (\n sheet: Sheet,\n e: HTMLDivElement | null,\n targetPoint: PointType,\n behavior: ScrollBehavior = 'auto',\n) => {\n if (e == null) {\n return;\n }\n const screen = getScreenRect(e);\n const target = getCellRectPositions(sheet, targetPoint);\n\n // when header is sticky\n const up = target.top - sheet.headerHeight;\n const left = target.left - sheet.headerWidth;\n const down = target.bottom - screen.height + 1;\n const right = target.right - screen.width + 1;\n\n const isTopOver = up < screen.top;\n const isLeftOver = left < screen.left;\n const isBottomOver = target.bottom > screen.bottom;\n const isRightOver = target.right > screen.right;\n\n if (isLeftOver) {\n if (isTopOver) {\n // go left up\n e.scrollTo({ left, top: up, behavior });\n } else if (isBottomOver) {\n // go left down\n e.scrollTo({ left, top: down, behavior });\n } else {\n // go left\n e.scrollTo({ left, top: screen.top, behavior });\n }\n } else if (isRightOver) {\n if (isTopOver) {\n // go right up\n e.scrollTo({ left: right, top: up, behavior });\n } else if (isBottomOver) {\n // go right down\n e.scrollTo({ left: right, top: down, behavior });\n } else {\n // go right\n e.scrollTo({ left: right, top: screen.top, behavior });\n }\n } else {\n if (isTopOver) {\n // go up\n e.scrollTo({ left: screen.left, top: up, behavior });\n } else if (isBottomOver) {\n // go down\n e.scrollTo({ left: screen.left, top: down, behavior });\n } else {\n // go nowhere\n }\n }\n};\n\ntype PositionGetter = (rect: DOMRect) => number;\n\nconst findVisibleElement = (\n elements: HTMLTableHeaderCellElement[],\n getPosition: PositionGetter,\n boundary: number,\n dataKey: string,\n): number => {\n const index = binarySearch(\n 0,\n elements.length - 1,\n (mid) => getPosition(elements[mid].getBoundingClientRect()) < boundary,\n false,\n );\n return parseInt(elements[index]?.dataset[dataKey] ?? '1');\n};\n\nexport const getAreaInTabular = (tabularElement: HTMLDivElement): AreaType => {\n const {\n top: topPosition,\n left: leftPosition,\n bottom: bottomPosition,\n right: rightPosition,\n } = tabularElement.getBoundingClientRect();\n\n const rows = Array.from(tabularElement.querySelectorAll('.gs-th-left')) as HTMLTableHeaderCellElement[];\n const cols = Array.from(tabularElement.querySelectorAll('.gs-th-top')) as HTMLTableHeaderCellElement[];\n\n const top = findVisibleElement(rows, (rect) => rect.top, topPosition, 'y');\n const bottom = findVisibleElement(rows, (rect) => rect.bottom, bottomPosition, 'y');\n const left = findVisibleElement(cols, (rect) => rect.left, leftPosition, 'x');\n const right = findVisibleElement(cols, (rect) => rect.right, rightPosition, 'x');\n\n return { top, left, bottom, right };\n};\n","import { OperationType as operations } from '../types';\n\nexport const RemoveRows: operations = 0b00000000000000000000000000000000000000000000000000001; // 1\nexport const RemoveCols: operations = 0b00000000000000000000000000000000000000000000000000010; // 2\nexport const InsertRowsAbove: operations = 0b00000000000000000000000000000000000000000000000000100; // 4\nexport const InsertRowsBelow: operations = 0b00000000000000000000000000000000000000000000000001000; // 8\nexport const InsertColsLeft: operations = 0b00000000000000000000000000000000000000000000000010000; // 16\nexport const InsertColsRight: operations = 0b00000000000000000000000000000000000000000000000100000; // 32\nexport const MoveFrom: operations = 0b00000000000000000000000000000000000000000000001000000; // 64\nexport const MoveTo: operations = 0b00000000000000000000000000000000000000000000010000000; // 128\nexport const Write: operations = 0b00000000000000000000000000000000000000000000100000000; // 256\nexport const Style: operations = 0b00000000000000000000000000000000000000000001000000000; // 512\nexport const Copy: operations = 0b00000000000000000000000000000000000000010000000000000; // 8192\nexport const Resize: operations = 0b00000000000000000000000000000000000000000010000000000; // 1024\nexport const SetPolicy: operations = 0b00000000000000000000000000000000000000100000000000000; // 16384\nexport const Sort: operations = 0b00000000000000000000000000000000000001000000000000000; // 32768\nexport const Filter: operations = 0b00000000000000000000000000000000000010000000000000000; // 65536\nexport const SetLabel: operations = 0b00000000000000000000000000000000000100000000000000000; // 131072\n\nexport const NoOperation: operations = 0;\n\nexport const Move: operations = MoveFrom | MoveTo; // 192\n\nexport const Update: operations = Write | Style | Copy | Resize | SetPolicy | SetLabel;\n\nexport const InsertRows: operations = InsertRowsAbove | InsertRowsBelow; // 12\n\nexport const InsertCols: operations = InsertColsLeft | InsertColsRight; // 48\n\nexport const Add: operations = InsertRows | InsertCols; // 60\n\nexport const Delete: operations = RemoveRows | RemoveCols; // 3\n\nexport const ReadOnly: operations = Update | Delete | Add | Move;\n\nexport const ColumnMenu: operations = Filter | Sort | SetLabel;\n\nexport const RowMenu: operations = 0b00000000000000000000000000000000010000000000000000000; // 524288\n\nexport const ViewOnly: operations = ReadOnly | ColumnMenu;\n\nexport const hasOperation = (operation: operations | undefined, flag: operations) => {\n if (operation === undefined) {\n return false;\n }\n return (operation & flag) === flag;\n};\n\n// Don't use this function in production\nexport const debugOperations = (prevention: operations | undefined) => {\n const operations: string[] = [];\n if (hasOperation(prevention, RemoveRows)) {\n operations.push('RemoveRow');\n }\n if (hasOperation(prevention, RemoveCols)) {\n operations.push('RemoveCol');\n }\n if (hasOperation(prevention, InsertRowsAbove)) {\n operations.push('InsertRowAbove');\n }\n if (hasOperation(prevention, InsertRowsBelow)) {\n operations.push('InsertRowBelow');\n }\n if (hasOperation(prevention, InsertColsLeft)) {\n operations.push('InsertColLeft');\n }\n if (hasOperation(prevention, InsertColsRight)) {\n operations.push('InsertColRight');\n }\n if (hasOperation(prevention, MoveFrom)) {\n operations.push('MoveFrom');\n }\n if (hasOperation(prevention, MoveTo)) {\n operations.push('MoveTo');\n }\n if (hasOperation(prevention, Write)) {\n operations.push('Write');\n }\n if (hasOperation(prevention, Style)) {\n operations.push('Style');\n }\n if (hasOperation(prevention, Resize)) {\n operations.push('Resize');\n }\n if (hasOperation(prevention, SetPolicy)) {\n operations.push('SetPolicy');\n }\n if (hasOperation(prevention, SetLabel)) {\n operations.push('SetLabel');\n }\n if (hasOperation(prevention, Sort)) {\n operations.push('Sort');\n }\n if (hasOperation(prevention, Filter)) {\n operations.push('Filter');\n }\n return operations;\n};\n","import { BASE_DATE } from '../constants';\n\nconst MS_PER_DAY = 86400000;\n\nexport class Time {\n public readonly __gsType = 'Time' as const;\n public readonly days: number;\n public format: string;\n\n constructor(days: number, format = 'HH:mm:ss') {\n this.days = days;\n this.format = format;\n }\n\n public add(date: Date): Date {\n return new Date(date.getTime() + this.days * MS_PER_DAY);\n }\n\n public sub(date: Date): Date {\n return new Date(date.getTime() - this.days * MS_PER_DAY);\n }\n\n public stringify(format?: string): string {\n const totalMs = this.toMilliseconds();\n const absMs = Math.abs(totalMs);\n const sign = totalMs < 0 ? '-' : '';\n\n const millis = absMs % 1000;\n let remaining = Math.floor(absMs / 1000);\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n const minutes = remaining % 60;\n const hours = Math.floor(remaining / 60);\n\n const resolvedFormat = format ?? (millis === 0 ? 'HH:mm:ss' : 'HH:mm:ss.SSS');\n\n let result = resolvedFormat;\n result = result.replace('HH', sign + String(hours).padStart(2, '0'));\n result = result.replace('H', sign + String(hours));\n result = result.replace('mm', String(minutes).padStart(2, '0'));\n result = result.replace('ss', String(seconds).padStart(2, '0'));\n result = result.replace('SSS', String(millis).padStart(3, '0'));\n result = result.replace('SS', String(millis).padStart(3, '0').substring(0, 2));\n result = result.replace('S', String(millis).padStart(3, '0').substring(0, 1));\n return result;\n }\n\n public toMilliseconds(): number {\n return this.days * MS_PER_DAY;\n }\n\n public toDate(): Date {\n return new Date(BASE_DATE.getTime() + this.days * MS_PER_DAY);\n }\n\n public toJSON(): { __gsType: 'Time'; days: number; format: string } {\n return { __gsType: 'Time', days: this.days, format: this.format };\n }\n\n public toString(): string {\n return this.stringify();\n }\n\n static create(hours = 0, minutes = 0, seconds = 0, milliseconds = 0): Time {\n const ms = hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds;\n return new Time(ms / MS_PER_DAY);\n }\n\n static fromDate(date: Date): Time {\n const timeMs =\n date.getHours() * 3600000 + date.getMinutes() * 60000 + date.getSeconds() * 1000 + date.getMilliseconds();\n return new Time(timeMs / MS_PER_DAY);\n }\n\n static fromDates(date1: Date, date2: Date): Time {\n return new Time((date1.getTime() - date2.getTime()) / MS_PER_DAY);\n }\n\n static fromObject(obj: { days: number; format?: string }): Time {\n return new Time(obj.days, obj.format);\n }\n\n static is(obj: any): boolean {\n if (obj instanceof Time) {\n return true;\n }\n if (obj?.__gsType === 'Time') {\n return true;\n }\n return false;\n }\n\n static ensure(obj: any): Time {\n if (obj instanceof Time) {\n return obj;\n }\n if (obj?.__gsType === 'Time') {\n return Time.fromObject(obj);\n }\n return Time.create();\n }\n\n static parse(value: string, format?: string, strict = false): Time | undefined {\n if (format != null) {\n const formattedMatcher = dayjsFormatToNamedRegex(format);\n const match = value.match(formattedMatcher);\n if (match?.groups) {\n return Time.create(\n Number(match.groups.HH || match.groups.H || 0),\n Number(match.groups.mm || match.groups.m || 0),\n Number(match.groups.ss || match.groups.s || 0),\n Number(match.groups.SSS || match.groups.SS || match.groups.S || 0),\n );\n }\n }\n if (strict) {\n return;\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes, seconds] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})\\.(\\d+)$/);\n if (match) {\n const [, _sign, hours, minutes, seconds, msecs] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds), sign * Number(msecs));\n }\n }\n }\n}\n\nconst tokenRegexMap: Record<string, { group: string; pattern: string }> = {\n HH: { group: 'HH', pattern: '(?<HH>\\\\d+)' },\n H: { group: 'H', pattern: '(?<HH>\\\\d+)' },\n mm: { group: 'mm', pattern: '(?<mm>[0-5]\\\\d)' },\n m: { group: 'm', pattern: '(?<m>\\\\d|[1-5]\\\\d)' },\n ss: { group: 'ss', pattern: '(?<ss>[0-5]\\\\d)' },\n s: { group: 's', pattern: '(?<s>\\\\d|[1-5]\\\\d)' },\n SSS: { group: 'SSS', pattern: '(?<SSS>\\\\d{3})' },\n SS: { group: 'SS', pattern: '(?<SS>\\\\d{2})' },\n S: { group: 'S', pattern: '(?<S>\\\\d)' },\n};\n\nfunction dayjsFormatToNamedRegex(format: string): RegExp {\n const sortedTokens = Object.keys(tokenRegexMap).sort((a, b) => b.length - a.length);\n const tokenPattern = new RegExp(sortedTokens.join('|'), 'g');\n\n const escapedFormat = format.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n const regexSource = escapedFormat.replace(tokenPattern, (match) => {\n return tokenRegexMap[match]?.pattern ?? match;\n });\n\n return new RegExp(`^${regexSource}$`);\n}\n\nexport const safeQueueMicrotask =\n typeof queueMicrotask === 'function' ? queueMicrotask : (cb: () => void) => Promise.resolve().then(cb);\n","import dayjs from 'dayjs';\nimport type { AreaType, CellsByAddressType, CellType, PointType, StoreType } from '../types';\nimport { Sheet } from './sheet';\nimport { areaShape, areaToZone, complementSelectingArea, concatAreas, zoneToArea, createMatrix } from './spatial';\nimport { p2a } from './coords';\n\nimport { Time } from './time';\nimport { CSSProperties } from 'react';\n\nconst BORDER_AUTOFILL_DRAGGING = 'dashed 1px #888888';\n\ntype Direction = 'left' | 'right' | 'up' | 'down' | 'none';\ntype Orientation = 'horizontal' | 'vertical' | 'none';\nconst DirectionMapping: {\n [key: string]: [Orientation, number];\n} = {\n left: ['horizontal', -1],\n right: ['horizontal', 1],\n up: ['vertical', -1],\n down: ['vertical', 1],\n none: ['none', 0],\n};\n\nexport class Autofill {\n private readonly src: AreaType;\n private readonly dst: AreaType;\n private readonly direction: Direction;\n private readonly sheet: Sheet;\n constructor(store: StoreType, draggingTo: PointType) {\n const { sheetReactive: sheetRef, choosing, selectingZone } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n throw new Error('Sheet is not available');\n }\n this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);\n this.direction = this.suggestDirection(draggingTo);\n this.dst = this.getDestinationArea(draggingTo);\n this.sheet = sheet;\n }\n\n public get applied(): Sheet {\n const [orientation, sign] = DirectionMapping[this.direction];\n const { top: sTop, left: sLeft, bottom: sBottom, right: sRight } = this.src;\n const matrix = createMatrix(sBottom - sTop + 1, sRight - sLeft + 1) as (CellType | null)[][];\n for (let y = sTop; y <= sBottom; y++) {\n for (let x = sLeft; x <= sRight; x++) {\n matrix[y - sTop][x - sLeft] = this.sheet.getCell({ y, x }, { resolution: 'SYSTEM' }) ?? null;\n }\n }\n const srcShape = areaShape(this.src);\n const dstShape = areaShape(this.dst);\n\n const diff: CellsByAddressType = {};\n if (orientation === 'horizontal') {\n for (let i = 0; i < dstShape.rows; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(matrix[i], '');\n for (let j = 0; j < dstShape.cols; j++) {\n const baseCell = matrix[i % srcShape.rows]?.[j % srcShape.cols];\n const x = sign > 0 ? this.dst.left + j : this.dst.right - j;\n const px = sign > 0 ? j % srcShape.cols : (srcShape.cols - 1 - (j % srcShape.cols)) % srcShape.cols;\n const point = { y: this.dst.top + i, x };\n const id = this.sheet.getId(point);\n const value = patterns[px].next().value;\n const nextValue =\n (baseCell?.formulaEnabled ?? true)\n ? this.sheet.processFormula(value, {\n dependency: id,\n })\n : value;\n diff[p2a(point)] = {\n ...baseCell,\n value: nextValue,\n };\n }\n }\n } else if (orientation === 'vertical') {\n for (let i = 0; i < dstShape.cols; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(\n matrix.map((row) => row[i]),\n '',\n );\n for (let j = 0; j < dstShape.rows; j++) {\n const baseCell = matrix[j % srcShape.rows]?.[i % srcShape.cols];\n const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;\n const py = sign > 0 ? j % srcShape.rows : (srcShape.rows - 1 - (j % srcShape.rows)) % srcShape.rows;\n const value = patterns[py].next().value;\n diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };\n }\n }\n }\n const sheet = this.sheet.update({\n diff,\n operator: 'USER',\n undoReflection: {\n sheetId: this.sheet.id,\n selectingZone: areaToZone(this.src),\n },\n redoReflection: {\n sheetId: this.sheet.id,\n selectingZone: areaToZone(this.dst),\n },\n });\n return sheet;\n }\n\n public get wholeArea() {\n return concatAreas(this.src, this.dst);\n }\n\n public getCellStyle(target: PointType) {\n const { x, y } = target;\n const style: CSSProperties = {};\n const { top, left, bottom, right } = this.src;\n\n switch (this.direction) {\n case 'left': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.left === x && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'right': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.right === x - 1 && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n\n case 'up': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.top === y && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'down': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.bottom === y - 1 && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n }\n return style;\n }\n\n private getDestinationArea(autofillDraggingTo: PointType): AreaType {\n const { x, y } = autofillDraggingTo;\n const { top, left, bottom, right } = this.src;\n switch (this.direction) {\n case 'left':\n return { top, bottom, left: x, right: left - 1 };\n case 'right':\n return { top, bottom, left: right + 1, right: x };\n case 'up':\n return { left, right, top: y, bottom: top - 1 };\n case 'down':\n return { left, right, top: bottom + 1, bottom: y };\n }\n return this.src;\n }\n\n private suggestDirection(draggingTo: PointType): Direction {\n const { top, left, bottom, right } = this.src;\n let horizontal = 0,\n vertical = 0;\n if (draggingTo.x < left) {\n horizontal = draggingTo.x - left;\n } else if (draggingTo.x > right) {\n horizontal = draggingTo.x - right;\n }\n if (draggingTo.y < top) {\n vertical = draggingTo.y - top;\n } else if (draggingTo.y > bottom) {\n vertical = draggingTo.y - bottom;\n }\n // diagonal\n if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {\n if (Math.abs(horizontal) > Math.abs(vertical)) {\n return horizontal < 0 ? 'left' : 'right';\n }\n return vertical < 0 ? 'up' : 'down';\n }\n if (horizontal !== 0) {\n return horizontal < 0 ? 'left' : 'right';\n }\n if (vertical !== 0) {\n return vertical < 0 ? 'up' : 'down';\n }\n return 'none';\n }\n\n private getChangePatterns(cells: (CellType | null)[], id: string): Generator[] {\n const result: Generator[] = [];\n const groups = groupByType(cells);\n const [orientation, sign] = DirectionMapping[this.direction];\n groups.forEach((group) => {\n const lastValue = sign > 0 ? group.last : group.first;\n switch (group.kind) {\n case 'other': {\n result.push(pass(group.first));\n return;\n }\n case 'formula': {\n const value = group.first;\n const sheet = this.sheet;\n\n function* generateFormula() {\n let slide = 0;\n const skip = cells.length * sign;\n while (true) {\n slide += skip;\n yield sheet.processFormula(value, {\n dependency: id,\n slideY: orientation === 'vertical' ? slide : 0,\n slideX: orientation === 'horizontal' ? slide : 0,\n });\n }\n }\n result.push(generateFormula());\n return;\n }\n case 'number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateNumber() {\n let value = lastValue;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield value;\n }\n }\n const g = generateNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'date': {\n const next = (d: Date) => {\n return sign > 0 ? group.time.add(d) : group.time.sub(d);\n };\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateDate() {\n let value = lastValue as Date;\n while (true) {\n value = next(value);\n yield new Date(value);\n }\n }\n const g = generateDate();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'string+number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateStringNumber() {\n const { prefix } = extractStringNumber(group.first as string);\n const { number: lastNumber } = extractStringNumber(lastValue as string);\n let value = lastNumber;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield `${prefix}${Math.abs(value)}`;\n }\n }\n const g = generateStringNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n }\n });\n return result;\n }\n}\n\nfunction* pass(value: any) {\n while (true) {\n yield value;\n }\n}\n\ntype GroupKind = 'number' | 'date' | 'string+number' | 'formula' | 'other';\n\nconst StringNumberPattern = new RegExp('(.+?)(\\\\d+)$');\n\nconst extractStringNumber = (value: string) => {\n const match = value.match(StringNumberPattern);\n if (match) {\n const [, prefix, n] = match;\n return { prefix, number: Number(n) };\n }\n return { prefix: '', number: 0 };\n};\n\nclass TypedGroup {\n public time: Time = Time.create();\n public numericDelta: number = 0;\n public kind: GroupKind;\n public nexts: any[];\n public first: any;\n public equidistant = true;\n\n constructor(value: any) {\n this.first = value;\n this.nexts = [];\n this.kind = this.discriminate(value);\n }\n private discriminate(value: any): GroupKind {\n const kind = value instanceof Date ? 'date' : typeof value;\n if (kind === 'number' || kind === 'date') {\n return kind;\n }\n if (kind === 'string' && value[0] === '=') {\n return 'formula';\n } else if (kind === 'string' && value.match(StringNumberPattern)) {\n return 'string+number';\n }\n return 'other';\n }\n\n public get last() {\n if (this.nexts.length === 0) {\n return this.first;\n }\n return this.nexts[this.nexts.length - 1];\n }\n\n public add(value: any): TypedGroup | undefined {\n const kind = this.discriminate(value);\n if (this.kind !== kind || kind === 'other' || kind === 'formula') {\n return new TypedGroup(value);\n }\n if (this.nexts.length === 0) {\n switch (kind) {\n case 'date': {\n this.time = Time.fromDates(value as Date, this.first as Date);\n break;\n }\n case 'number': {\n this.numericDelta = (value as number) - this.first;\n break;\n }\n case 'string+number': {\n const { prefix: prefix1, number: number1 } = extractStringNumber(this.first as string);\n const { prefix: prefix2, number: number2 } = extractStringNumber(value as string);\n if (prefix1 === prefix2) {\n this.numericDelta = number2 - number1;\n }\n break;\n }\n }\n }\n this.nexts.push(value);\n }\n\n public subdivide() {\n if (this.nexts.length === 0) {\n return [];\n }\n\n const news: TypedGroup[] = [];\n\n let lastGroup: TypedGroup = this;\n switch (this.kind) {\n case 'date': {\n const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.time.add(this.nexts[i - 1])));\n this.equidistant = eq;\n return [];\n }\n case 'number': {\n const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));\n this.equidistant = eq;\n return [];\n }\n case 'string+number': {\n const { prefix: basePrefix } = extractStringNumber(this.first as string);\n for (let i = 0; i < lastGroup.nexts.length; i++) {\n const next = lastGroup.nexts[i];\n const { prefix, number } = extractStringNumber(next as string);\n if (basePrefix !== prefix) {\n const nexts = this.nexts.splice(i, this.nexts.length);\n lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);\n nexts.forEach(lastGroup.add.bind(lastGroup));\n news.push(lastGroup, ...lastGroup.subdivide());\n break;\n } else {\n const { number: firstNumber } = extractStringNumber(lastGroup.first as string);\n if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {\n lastGroup.equidistant = false;\n }\n }\n }\n break;\n }\n }\n\n return news;\n }\n}\n\nfunction groupByType(cells: (CellType | null)[]): TypedGroup[] {\n let group = new TypedGroup(cells[0]?.value);\n const groups: TypedGroup[] = [group];\n\n for (let i = 1; i < cells.length; i++) {\n const value = cells[i]?.value;\n const nextGroup = group.add(value);\n if (nextGroup) {\n groups.push(nextGroup);\n group = nextGroup;\n }\n }\n for (let i = groups.length - 1; i >= 0; i--) {\n const group = groups[i];\n groups.splice(i + 1, 0, ...group.subdivide());\n }\n return groups;\n}\n","import {\n StoreType,\n RectType,\n ZoneType,\n PointType,\n RangeType,\n FeedbackType,\n CellsByAddressType,\n AreaType,\n PositionType,\n ModeType,\n RawCellType,\n OperatorType,\n FilterConfig,\n} from '../types';\nimport { zoneToArea, superposeArea, matrixShape, areaShape, areaDiff, areaToZone, restrictZone } from '../lib/spatial';\nimport { Sheet } from '../lib/sheet';\n\nimport { p2a, a2p } from '../lib/coords';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../constants';\nimport { initSearchStatement, restrictPoints, flashSheet, flashWithCallback, compactReflection } from './helpers';\nimport { smartScroll } from '../lib/virtualization';\nimport * as prevention from '../lib/operation';\nimport { Autofill } from '../lib/autofill';\n\nconst resetZone: ZoneType = { startY: -1, startX: -1, endY: -1, endX: -1 };\n\nconst actions: { [s: string]: CoreAction<any> } = {};\n\ntype StoreWithCallback = StoreType & {\n callback?: (store: StoreType) => void;\n};\n\nexport const reducer = <T>(store: StoreType, action: { type: number; value: T }): StoreType => {\n const act: CoreAction<T> | undefined = actions[action.type];\n if (act == null) {\n return store;\n }\n\n const { callback, ...newStore } = act.reduce(store, action.value);\n callback?.(newStore);\n return { ...store, ...newStore };\n};\n\nexport class CoreAction<T> {\n static head = 1;\n private actionId: number = 1;\n\n public reduce(store: StoreType, payload: T): StoreWithCallback {\n return store;\n }\n public call(payload: T): { type: number; value: T } {\n return {\n type: this.actionId,\n value: payload,\n };\n }\n public bind() {\n this.actionId = CoreAction.head++;\n actions[this.actionId] = this;\n return this.call.bind(this);\n }\n}\n\nclass SetSearchQueryAction<T extends string | undefined> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchQuery = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchQuery }),\n searchQuery,\n };\n }\n}\nexport const setSearchQuery = new SetSearchQueryAction().bind();\n\nclass SetSearchCaseSensitiveAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchCaseSensitive = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchCaseSensitive }),\n searchCaseSensitive,\n };\n }\n}\nexport const setSearchCaseSensitive = new SetSearchCaseSensitiveAction().bind();\n\nclass SetSearchRegexAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchRegex = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchRegex }),\n searchRegex,\n };\n }\n}\nexport const setSearchRegex = new SetSearchRegexAction().bind();\n\nclass SetSearchRangeAction<T extends ZoneType | undefined> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchRange = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchRange }),\n searchRange,\n };\n }\n}\nexport const setSearchRange = new SetSearchRangeAction().bind();\n\nclass SetEditingAddressAction<T extends string> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editingAddress: payload,\n };\n }\n}\nexport const setEditingAddress = new SetEditingAddressAction().bind();\n\nclass SetAutofillDraggingToAction<T extends PointType | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n autofillDraggingTo: payload,\n };\n }\n}\nexport const setAutofillDraggingTo = new SetAutofillDraggingToAction().bind();\n\nclass SubmitAutofillAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const autofill = new Autofill(store, payload);\n const sheet = autofill.applied;\n const selectingZone = areaToZone(autofill.wholeArea);\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n ...initSearchStatement(sheet, store),\n ...restrictPoints(store, sheet),\n selectingZone,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n autofillDraggingTo: null,\n };\n }\n}\nexport const submitAutofill = new SubmitAutofillAction().bind();\n\nclass SetContextMenuPositionAction<T extends PositionType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n contextMenuPosition: payload,\n };\n }\n}\nexport const setContextMenuPosition = new SetContextMenuPositionAction().bind();\n\nclass SetResizingPositionYAction<T extends [number, number, number]> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n resizingPositionY: payload,\n };\n }\n}\nexport const setResizingPositionY = new SetResizingPositionYAction().bind();\n\nclass SetResizingPositionXAction<T extends [number, number, number]> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n resizingPositionX: payload,\n };\n }\n}\nexport const setResizingPositionX = new SetResizingPositionXAction().bind();\n\nclass SetEnteringAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n entering: payload,\n };\n }\n}\nexport const setEntering = new SetEnteringAction().bind();\n\nclass UpdateSheetAction<T extends Sheet> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n sheetReactive: { current: payload },\n ...initSearchStatement(payload, store),\n ...restrictPoints(store, payload),\n };\n }\n}\nexport const updateSheet = new UpdateSheetAction().bind();\n\nclass SetEditorRectAction<T extends RectType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editorRect: payload,\n };\n }\n}\nexport const setEditorRect = new SetEditorRectAction().bind();\n\nclass SetDragging<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n dragging: payload,\n };\n }\n}\nexport const setDragging = new SetDragging().bind();\n\nclass BlurAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editingAddress: '',\n };\n }\n}\nexport const blur = new BlurAction().bind();\n\nclass CopyAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n return {\n ...store,\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingSheetId: sheet.id,\n copyingZone: payload,\n cutting: false,\n });\n },\n };\n }\n}\nexport const copy = new CopyAction().bind();\n\nclass CutAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n return {\n ...store,\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingSheetId: sheet.id,\n copyingZone: payload,\n cutting: true,\n });\n },\n };\n }\n}\nexport const cut = new CutAction().bind();\n\nclass PasteAction<T extends { matrix: RawCellType[][]; onlyValue: boolean }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { choosing, selectingZone, sheetReactive: dstSheetRef } = store;\n const dstSheet = dstSheetRef.current;\n if (!dstSheet) {\n return store;\n }\n const { registry } = dstSheet;\n const { copyingSheetId, copyingZone, cutting } = registry;\n const srcSheet = dstSheet.getSheetBySheetId(copyingSheetId);\n\n let selectingArea = zoneToArea(selectingZone);\n const copyingArea = zoneToArea(copyingZone);\n const { matrix, onlyValue } = payload;\n\n if (cutting) {\n if (!srcSheet) {\n return store;\n }\n const src = copyingArea;\n const { rows: dy, cols: dx } = areaDiff(copyingArea);\n const dst: AreaType =\n selectingArea.top !== -1\n ? {\n top: selectingArea.top,\n left: selectingArea.left,\n bottom: selectingArea.top + dy,\n right: selectingArea.left + dx,\n }\n : {\n top: choosing.y,\n left: choosing.x,\n bottom: choosing.y + dy,\n right: choosing.x + dx,\n };\n\n const nextSelectingZone = restrictZone(areaToZone(dst));\n const newSheet = dstSheet.move({\n srcSheet,\n src,\n dst,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: srcSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n transmit: { copyingSheetId: srcSheet.id, copyingZone, cutting: true },\n }),\n redoReflection: compactReflection({\n sheetId: srcSheet.id,\n choosing,\n transmit: { copyingSheetId: srcSheet.id, copyingZone: resetZone },\n }),\n });\n\n return {\n ...store,\n ...initSearchStatement(newSheet, store),\n sheetReactive: { current: newSheet },\n selectingZone: nextSelectingZone,\n inputting: newSheet.getSerializedValue({ point: choosing, resolution: 'RAW' }),\n callback: ({ sheetReactive: sheetRef }) => {\n registry.transmit({\n cutting: false,\n copyingZone: resetZone,\n });\n },\n };\n }\n\n let newSheet: Sheet;\n let { y, x } = choosing;\n\n if (copyingArea.top === -1) {\n const { rows: height, cols: width } = matrixShape({ matrix, base: -1 });\n selectingArea = {\n top: y,\n left: x,\n bottom: y + height,\n right: x + width,\n };\n const nextSelectingZone = restrictZone(areaToZone(selectingArea));\n newSheet = dstSheet.writeRawCellMatrix({\n point: { y, x },\n matrix,\n onlyValue,\n undoReflection: compactReflection({\n sheetId: dstSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: dstSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n }),\n });\n } else {\n if (srcSheet == null) {\n return store;\n }\n let { rows: dy, cols: dx } = areaDiff(copyingArea);\n if (selectingArea.top !== -1) {\n y = selectingArea.top;\n x = selectingArea.left;\n const superposed = superposeArea(selectingArea, copyingArea);\n dy = superposed.rows;\n dx = superposed.cols;\n }\n selectingArea = { top: y, left: x, bottom: y + dy, right: x + dx };\n newSheet = dstSheet.copy({\n srcSheet,\n src: copyingArea,\n dst: selectingArea,\n onlyValue,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: srcSheet.id,\n transmit: { copyingZone },\n choosing,\n selectingZone,\n }),\n redoReflection: compactReflection({\n sheetId: srcSheet.id,\n transmit: { copyingSheetId: srcSheet.id, copyingZone: resetZone },\n choosing,\n selectingZone: areaToZone(selectingArea),\n }),\n });\n }\n\n const nextSelectingZone = restrictZone(areaToZone(selectingArea));\n nextSelectingZone.endX = Math.min(nextSelectingZone.endX, newSheet.numCols);\n nextSelectingZone.endY = Math.min(nextSelectingZone.endY, newSheet.numRows);\n return {\n ...store,\n sheetReactive: { current: newSheet },\n selectingZone: nextSelectingZone,\n inputting: newSheet.getSerializedValue({ point: choosing, resolution: 'RAW' }),\n ...initSearchStatement(newSheet, store),\n callback: ({ sheetReactive: sheetRef }) => {\n registry.transmit({\n copyingZone: resetZone,\n });\n },\n };\n }\n}\nexport const paste = new PasteAction().bind();\n\nclass EscapeAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n return {\n ...store,\n editingAddress: '',\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n callback: ({ sheetReactive: sheetRef }) => {\n sheetRef.current!.registry.transmit({\n copyingZone: resetZone,\n cutting: false,\n });\n },\n };\n }\n}\nexport const escape = new EscapeAction().bind();\n\nclass ChooseAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n choosing: payload,\n entering: true,\n };\n }\n}\nexport const choose = new ChooseAction().bind();\n\nclass SelectAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n selectingZone: payload,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n };\n }\n}\nexport const select = new SelectAction().bind();\n\nclass SelectRowsAction<T extends { range: RangeType; numCols: number }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { range, numCols } = payload;\n const { start, end } = range;\n const sheet = store.sheetReactive.current;\n const selectingZone = {\n startY: start,\n startX: 1,\n endY: end,\n endX: numCols,\n };\n // Find the first non-filtered row in the selection for choosing\n let choosingY = start;\n if (sheet) {\n for (let y = start; y <= end; y++) {\n if (!sheet.isRowFiltered(y)) {\n choosingY = y;\n break;\n }\n }\n }\n return {\n ...store,\n selectingZone,\n choosing: { y: choosingY, x: 1 },\n leftHeaderSelecting: true,\n topHeaderSelecting: false,\n };\n }\n}\nexport const selectRows = new SelectRowsAction().bind();\n\nclass SelectColsAction<T extends { range: RangeType; numRows: number }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { range, numRows } = payload;\n const { start, end } = range;\n const sheet = store.sheetReactive.current;\n const selectingZone = {\n startY: 1,\n startX: start,\n endY: numRows,\n endX: end,\n };\n // Find the first non-filtered row (y=1 is always visible for columns, use y=1)\n // For columns there is no column-level filter, so choosing y=1 (first data row visible)\n let choosingY = 1;\n if (sheet) {\n for (let y = 1; y <= numRows; y++) {\n if (!sheet.isRowFiltered(y)) {\n choosingY = y;\n break;\n }\n }\n }\n return {\n ...store,\n selectingZone,\n choosing: { y: choosingY, x: start },\n leftHeaderSelecting: false,\n topHeaderSelecting: true,\n };\n }\n}\nexport const selectCols = new SelectColsAction().bind();\n\nclass DragAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { startY, startX } = store.selectingZone;\n const selectingZone = {\n startY,\n startX,\n endY: payload.y,\n endX: payload.x,\n };\n if (startY === payload.y && startX === payload.x) {\n selectingZone.endY = -1;\n selectingZone.endX = -1;\n }\n return { ...store, selectingZone };\n }\n}\nexport const drag = new DragAction().bind();\n\nclass SearchAction<T extends number> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { matchingCells } = store;\n let { matchingCellIndex, choosing } = store;\n matchingCellIndex += payload;\n if (matchingCellIndex >= matchingCells.length) {\n matchingCellIndex = 0;\n } else if (matchingCellIndex < 0) {\n matchingCellIndex = matchingCells.length - 1;\n }\n\n if (matchingCells.length > 0) {\n const address = matchingCells[matchingCellIndex];\n choosing = a2p(address);\n }\n return { ...store, matchingCells, matchingCellIndex, choosing };\n }\n}\nexport const search = new SearchAction().bind();\n\nclass WriteAction<T extends { value: string; point?: PointType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n let { value, point } = payload;\n const { choosing, selectingZone, sheetReactive: sheetRef } = store;\n if (point == null) {\n point = choosing;\n }\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n const newSheet = sheet.write({\n point: point,\n value,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing: point,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing: point,\n }),\n });\n return {\n ...store,\n ...initSearchStatement(newSheet, store),\n sheetReactive: { current: newSheet },\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingZone: resetZone,\n });\n },\n };\n }\n}\nexport const write = new WriteAction().bind();\n\nclass ClearAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { choosing, selectingZone, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n\n let selectingArea = zoneToArea(selectingZone);\n if (selectingArea.top === -1) {\n const { y, x } = choosing;\n selectingArea = { top: y, left: x, bottom: y, right: x };\n }\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n let diffCount = 0;\n for (let y = top; y <= bottom; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution: 'SYSTEM' });\n const address = p2a({ y, x });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n continue;\n }\n // Spilled cells are derived from the origin cell's formula and should\n // not be cleared independently — doing so would blank the FormulaBar\n // while the spill re-populates the value on next evaluation.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n continue;\n }\n if (cell?.value != null) {\n diff[address] = { value: undefined };\n diffCount++;\n }\n }\n }\n if (diffCount === 0) {\n return store;\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const clear = new ClearAction().bind();\n\nclass UndoAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n const { history, callback } = sheet.undo();\n if (history == null) {\n return store;\n }\n if (history.dstSheetId !== sheet.id) {\n const { dispatch, store: dstStore } = sheet.registry.contextsBySheetId[history.dstSheetId];\n dispatch(\n setStore({\n ...dstStore,\n ...history.undoReflection,\n sheetReactive: { current: dstStore.sheetReactive.current },\n }),\n );\n flashSheet(dstStore.flashRef.current);\n // For cross-sheet MOVE: the src (current) sheet's lastChangedAddresses was also updated.\n // Return updated sheetReactive so this sheet's Emitter fires onChange.\n if (history.srcSheetId === sheet.id) {\n return flashWithCallback(store, sheet, callback);\n }\n return store;\n }\n return {\n ...store,\n ...restrictPoints(store, sheet),\n ...history.undoReflection,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n };\n }\n}\nexport const undo = new UndoAction().bind();\n\nclass RedoAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const { history, newSheet, callback } = sheet.redo();\n if (history == null) {\n return store;\n }\n if (history.dstSheetId !== sheet.id) {\n const { dispatch, store: dstStore } = sheet.registry.contextsBySheetId[history.dstSheetId];\n dispatch(\n setStore({\n ...dstStore,\n ...history.redoReflection,\n sheetReactive: { current: dstStore.sheetReactive.current },\n }),\n );\n flashSheet(dstStore.flashRef.current);\n // For cross-sheet MOVE: the src (current) sheet's lastChangedAddresses was also updated.\n // Return updated sheetReactive so this sheet's Emitter fires onChange.\n if (history.srcSheetId === sheet.id) {\n return flashWithCallback(store, sheet, callback);\n }\n return store;\n }\n return {\n ...store,\n ...restrictPoints(store, sheet),\n ...history.redoReflection,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n };\n }\n}\nexport const redo = new RedoAction().bind();\n\nclass ArrowAction<\n T extends {\n shiftKey: boolean;\n deltaY: number;\n deltaX: number;\n numRows: number;\n numCols: number;\n },\n> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { shiftKey, deltaY, deltaX, numRows, numCols } = payload;\n const { choosing, sheetReactive: sheetRef, tabularRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n let { selectingZone } = store;\n const { y, x } = choosing;\n if (shiftKey) {\n const [dragEndY, dragEndX] = [\n selectingZone.endY === -1 ? y : selectingZone.endY,\n selectingZone.endX === -1 ? x : selectingZone.endX,\n ];\n const [nextY, nextX] = [dragEndY + deltaY, dragEndX + deltaX];\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n selectingZone =\n y === nextY && x === nextX\n ? { startY: -1, startX: -1, endY: -1, endX: -1 }\n : { startY: y, startX: x, endY: nextY, endX: nextX };\n return {\n ...store,\n selectingZone,\n };\n }\n const [nextY, nextX] = [y + deltaY, x + deltaX];\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n // Skip hidden rows\n let resolvedY = nextY;\n if (sheet.isRowFiltered(resolvedY)) {\n const dir = deltaY >= 0 ? 1 : -1;\n while (resolvedY >= 1 && resolvedY <= numRows && sheet.isRowFiltered(resolvedY)) {\n resolvedY += dir;\n }\n if (resolvedY < 1 || resolvedY > numRows) {\n return store; // no visible row in that direction\n }\n }\n let { y: editorTop, x: editorLeft, height, width } = store.editorRect;\n if (deltaY > 0) {\n for (let i = y; i < resolvedY; i++) {\n editorTop += sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n } else if (deltaY < 0) {\n for (let i = y - 1; i >= resolvedY; i--) {\n editorTop -= sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n }\n if (deltaX > 0) {\n for (let i = x; i < nextX; i++) {\n editorLeft += sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n } else if (deltaX < 0) {\n for (let i = x - 1; i >= nextX; i--) {\n editorLeft -= sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n }\n\n const cell = sheet.getCell({ y: resolvedY, x: nextX }, { resolution: 'SYSTEM' });\n height = cell?.height || DEFAULT_HEIGHT;\n width = cell?.width || DEFAULT_WIDTH;\n\n smartScroll(sheet, tabularRef.current, { y: resolvedY, x: nextX });\n return {\n ...store,\n selectingZone: { startY: -1, startX: -1, endY: -1, endX: -1 },\n choosing: { y: resolvedY, x: nextX } as PointType,\n editorRect: { y: editorTop, x: editorLeft, height, width },\n };\n }\n}\nexport const arrow = new ArrowAction().bind();\n\nclass WalkAction<\n T extends {\n deltaY: number;\n deltaX: number;\n numRows: number;\n numCols: number;\n },\n> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, numCols } = payload;\n let { deltaY, deltaX } = payload;\n const { choosing, selectingZone, sheetReactive: sheetRef, tabularRef: gridOuterRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n let { y: editorTop, x: editorLeft, height, width } = store.editorRect;\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n let [nextY, nextX] = [y + deltaY, x + deltaX];\n if (nextY < top && top !== -1) {\n deltaY = bottom - nextY;\n nextY = bottom;\n if (nextX > left) {\n nextX--;\n deltaX--;\n } else {\n deltaX = right - nextX;\n nextX = right;\n }\n }\n if (nextY > bottom && bottom !== -1) {\n deltaY = top - nextY;\n nextY = top;\n if (nextX < right) {\n nextX++;\n deltaX++;\n } else {\n deltaX = left - nextX;\n nextX = left;\n }\n }\n if (nextX < left && left !== -1) {\n deltaX = right - nextX;\n nextX = right;\n if (nextY > top) {\n nextY--;\n deltaY--;\n } else {\n deltaY = bottom - nextY;\n nextY = bottom;\n }\n }\n if (nextX > right && right !== -1) {\n deltaX = left - nextX;\n nextX = left;\n if (nextY < bottom) {\n nextY++;\n deltaY++;\n } else {\n deltaY = top - nextY;\n nextY = top;\n }\n }\n\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n\n // Skip hidden rows\n if (sheet.isRowFiltered(nextY)) {\n const dir = deltaY >= 0 ? 1 : -1;\n const lo = top !== -1 ? top : 1;\n const hi = bottom !== -1 ? bottom : numRows;\n while (nextY >= lo && nextY <= hi && sheet.isRowFiltered(nextY)) {\n nextY += dir;\n }\n if (nextY < lo || nextY > hi || sheet.isRowFiltered(nextY)) {\n return store; // no visible row in range\n }\n }\n\n if (deltaY > 0) {\n for (let i = y; i < nextY; i++) {\n editorTop += sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n } else if (deltaY < 0) {\n for (let i = y - 1; i >= nextY; i--) {\n editorTop -= sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n }\n if (deltaX > 0) {\n for (let i = x; i < nextX; i++) {\n editorLeft += sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n } else if (deltaX < 0) {\n for (let i = x - 1; i >= nextX; i--) {\n editorLeft -= sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n }\n const cell = sheet.getCell({ y: nextY, x: nextX }, { resolution: 'SYSTEM' });\n height = cell?.height || DEFAULT_HEIGHT;\n width = cell?.width || DEFAULT_WIDTH;\n smartScroll(sheet, gridOuterRef.current, { y: nextY, x: nextX });\n return {\n ...store,\n choosing: { y: nextY, x: nextX } as PointType,\n editorRect: { y: editorTop, x: editorLeft, height, width },\n };\n }\n}\nexport const walk = new WalkAction().bind();\n\nclass SetInputtingAction<T extends string> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n inputting: payload,\n };\n }\n}\n\nexport const setInputting = new SetInputtingAction().bind();\n\nclass InsertRowsAboveAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.insertRows({\n y,\n numRows,\n baseY: y,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertRowsAbove = new InsertRowsAboveAction().bind();\n\nclass InsertRowsBelowAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const nextSelectingZone = {\n ...selectingZone,\n startY: selectingZone.startY + numRows,\n endY: selectingZone.endY + numRows,\n };\n const nextChoosing = { ...choosing, y: choosing.y + numRows };\n\n sheet.insertRows({\n y: y + 1,\n numRows,\n baseY: y,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n }),\n });\n return {\n ...store,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertRowsBelow = new InsertRowsBelowAction().bind();\n\nclass InsertColsLeftAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.insertCols({\n x,\n numCols,\n baseX: x,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertColsLeft = new InsertColsLeftAction().bind();\n\nclass InsertColsRightAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const nextSelectingZone = {\n ...selectingZone,\n startX: selectingZone.startX + numCols,\n endX: selectingZone.endX + numCols,\n };\n const nextChoosing = { ...choosing, x: choosing.x + numCols };\n\n selectingZone.startX += numCols;\n selectingZone.endX += numCols;\n\n sheet.insertCols({\n x: x + 1,\n numCols,\n baseX: x,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n }),\n });\n return {\n ...store,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertColsRight = new InsertColsRightAction().bind();\n\nclass RemoveRowsAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.removeRows({\n y,\n numRows,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n sheetHeight: store.sheetHeight,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const removeRows = new RemoveRowsAction().bind();\n\nclass RemoveColsAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.removeCols({\n x,\n numCols,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n sheetWidth: store.sheetWidth,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const removeCols = new RemoveColsAction().bind();\n\nclass SortRowsAction<T extends { x: number; direction: 'asc' | 'desc' }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { x, direction } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.sortRows({ x, direction });\n const reflection = compactReflection({ sheetId: sheet.id, selectingZone, choosing });\n if (sheet.registry.lastHistory) {\n sheet.registry.lastHistory.undoReflection = reflection;\n sheet.registry.lastHistory.redoReflection = reflection;\n }\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const sortRows = new SortRowsAction().bind();\n\nclass FilterRowsAction<T extends { x?: number; filter?: FilterConfig }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { x, filter } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.filterRows({ x, filter });\n const reflection = compactReflection({ sheetId: sheet.id, selectingZone, choosing });\n if (sheet.registry.lastHistory) {\n sheet.registry.lastHistory.undoReflection = reflection;\n sheet.registry.lastHistory.redoReflection = reflection;\n }\n let newChoosing = choosing;\n if (sheet.isRowFiltered(choosing.y)) {\n for (let y = 1; y <= sheet.numRows; y++) {\n if (!sheet.isRowFiltered(y)) {\n newChoosing = { y, x: choosing.x };\n break;\n }\n }\n }\n return {\n ...store,\n choosing: newChoosing,\n selectingZone: newChoosing !== choosing ? resetZone : selectingZone,\n sheetReactive: { current: sheet },\n callback: ({ sheetReactive: sheetRef }) => {\n const t = sheetRef.current;\n if (t) {\n t.registry.transmit({\n cutting: false,\n copyingZone: resetZone,\n });\n }\n },\n };\n }\n}\nexport const filterRows = new FilterRowsAction().bind();\n\nclass SetColumnMenuAction<T extends { x: number; position: { y: number; x: number } } | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n columnMenuState: payload,\n };\n }\n}\nexport const setColumnMenu = new SetColumnMenuAction().bind();\n\nclass SetRowMenuAction<T extends { y: number; position: { y: number; x: number } } | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n rowMenuState: payload,\n };\n }\n}\nexport const setRowMenu = new SetRowMenuAction().bind();\n\nclass SetEditorHoveringAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editorHovering: payload,\n };\n }\n}\nexport const setEditorHovering = new SetEditorHoveringAction().bind();\n\nclass setStoreAction<T extends Partial<StoreType>> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n ...payload,\n };\n }\n}\nexport const setStore = new setStoreAction().bind();\n\nexport const userActions = {\n blur,\n copy,\n cut,\n paste,\n escape,\n choose,\n select,\n selectRows,\n selectCols,\n drag,\n search,\n write,\n clear,\n undo,\n redo,\n arrow,\n walk,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n};\n","/**\n * lib/popup.ts\n *\n * Utility functions for computing the position of floating UI elements\n * (tooltips, dropdowns, autocomplete lists, function guides, etc.)\n * so they don't overflow the viewport.\n */\n\nconst MARGIN = 8; // px gap from the viewport edge\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type HAlign = 'left' | 'right';\nexport type VAlign = 'top' | 'bottom';\n\nexport type PopupPosition = {\n x: number;\n y: number;\n hAlign: HAlign;\n};\n\n// ---------------------------------------------------------------------------\n// calcBelowPosition\n//\n// Places a popup BELOW an anchor rect.\n// Prefers aligning the popup's RIGHT edge to rect.right (hAlign='right'),\n// but falls back to aligning its LEFT edge to rect.left (hAlign='left')\n// when there is not enough room on the left side of the viewport.\n//\n// In the 'right' case the caller should apply translateX(-100%) to shift the\n// popup leftward so its right edge lands at x.\n// In the 'left' case x is the desired left edge directly.\n//\n// Usage: error triangle tooltip, any anchored-to-element popup.\n// ---------------------------------------------------------------------------\nexport const calcBelowPosition = (rect: DOMRect, maxWidth = 260, margin = MARGIN): PopupPosition => {\n if (rect.right - maxWidth >= margin) {\n return { x: rect.right, y: rect.bottom, hAlign: 'right' };\n }\n return { x: Math.max(rect.left, margin), y: rect.bottom, hAlign: 'left' };\n};\n\n// ---------------------------------------------------------------------------\n// clampLeft\n//\n// Given the desired left position of a popup and its rendered width,\n// returns an adjusted left value that keeps the popup within the viewport.\n//\n// Usage: EditorOptions dropdown, FunctionGuide floating panel.\n// ---------------------------------------------------------------------------\nexport const clampLeft = (left: number, width: number, margin = MARGIN): number => {\n const rightEdge = left + width;\n const overflow = rightEdge - (window.innerWidth - margin);\n return overflow > 0 ? left - overflow : left;\n};\n\n// ---------------------------------------------------------------------------\n// calcSidePosition\n//\n// Places a popup to the LEFT or RIGHT of an anchor element.\n// Prefers the right side; falls back to the left side if the right side\n// overflows the viewport.\n//\n// Resets the element to the preferred (right-side) position BEFORE measuring,\n// so that stale styles from a previous render don't corrupt the measurement.\n//\n// Applies the final styles directly to the element and also returns them.\n//\n// Usage: FunctionGuide guide1 (option tooltip panel).\n// ---------------------------------------------------------------------------\nexport type SideStyle = { left: string; right: string };\n\nexport const calcSideStyle = (el: HTMLElement, gap = MARGIN): SideStyle => {\n // 1. Reset to preferred position so getBoundingClientRect reflects the right side.\n el.style.left = `calc(100% + ${gap}px)`;\n el.style.right = 'auto';\n\n // 2. Measure after reset.\n const rect = el.getBoundingClientRect();\n if (rect.right > window.innerWidth - MARGIN) {\n const flipped: SideStyle = { left: 'auto', right: `calc(100% + ${gap}px)` };\n el.style.left = flipped.left;\n el.style.right = flipped.right;\n return flipped;\n }\n return { left: `calc(100% + ${gap}px)`, right: 'auto' };\n};\n\n// ---------------------------------------------------------------------------\n// clampPopup\n//\n// Adjusts a rendered popup element's position so it stays within the viewport.\n// Applies left/top corrections directly as inline styles to avoid re-renders.\n// Call this inside useLayoutEffect with no dependency array so it runs after\n// every render (content changes may change the popup dimensions).\n//\n// Usage: ContextMenu, FunctionGuide guide2, any popup that can change size.\n// ---------------------------------------------------------------------------\nexport const clampPopup = (el: HTMLElement): void => {\n const rect = el.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n if (rect.right > vw - MARGIN) {\n el.style.left = `${parseFloat(el.style.left || '0') - (rect.right - (vw - MARGIN))}px`;\n }\n if (rect.bottom > vh - MARGIN) {\n el.style.top = `${parseFloat(el.style.top || '0') - (rect.bottom - (vh - MARGIN))}px`;\n }\n};\n\n// ---------------------------------------------------------------------------\n// hAlignTransform\n//\n// Returns the CSS transform string for a popup based on its horizontal alignment.\n// 'right' → shift left by full width so the popup's right edge sits at x.\n// 'left' → no transform needed.\n// ---------------------------------------------------------------------------\nexport const hAlignTransform = (hAlign: HAlign): string => (hAlign === 'right' ? 'translateX(-100%)' : 'none');\n","import React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '../formula/mapping';\nimport type { AutocompleteOption } from '../policy/core';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '../lib/popup';\n\ntype OptionWithGuide = AutocompleteOption & {\n isFunction?: boolean;\n example?: string;\n category?: string;\n description?: string;\n defs?: any[];\n};\n\nexport interface FunctionGuideProps {\n // Option Help Mode (renders in EditorOptions)\n option?: OptionWithGuide;\n\n // Active Function Highlight Mode (renders floating near cursor)\n activeFunctionGuide?: FunctionHelp;\n activeArgIndex?: number;\n top?: number;\n left?: number;\n}\n\nexport const FunctionGuide: React.FC<FunctionGuideProps> = ({\n option,\n activeFunctionGuide,\n activeArgIndex = 0,\n top,\n left,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const guide1Ref = useRef<HTMLDivElement>(null);\n const { store } = useContext(Context);\n // Hide the active help when not hovering over the editor, to prevent it from blocking clicks on other options.\n const isHidden = !store.editorHovering;\n\n useLayoutEffect(() => {\n const el = guide1Ref.current;\n if (!el) {\n return;\n }\n calcSideStyle(el);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || left === undefined) {\n return;\n }\n clampPopup(el);\n });\n\n if (option) {\n return (\n <div\n ref={guide1Ref}\n className=\"gs-fn-guide1\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {option.category && option.isFunction && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${option.category}`}>{option.category}</span>\n )}\n {option.tooltip && (\n <div className=\"gs-fn-guide1-tooltip\">\n {typeof option.tooltip === 'function'\n ? React.createElement(option.tooltip as any, { value: option.value })\n : option.tooltip}\n </div>\n )}\n {option.isFunction && (\n <>\n <div className=\"gs-fn-guide1-example\">{option.example}</div>\n {option.description && (\n <div className=\"gs-fn-guide1-desc\" style={{ whiteSpace: 'pre-line' }}>\n {option.description}\n </div>\n )}\n {option.defs && option.defs.length > 0 && (\n <div className=\"gs-fn-guide1-args\">\n {option.defs.map((arg: any, j: number) => (\n <div key={j} className=\"gs-fn-guide1-arg\">\n <span className=\"gs-fn-guide1-arg-name\">{arg.name}</span>\n {arg.optional && <span className=\"gs-fn-guide1-arg-opt\"> (optional)</span>}\n {arg.variadic && <span className=\"gs-fn-guide1-arg-iter\">...</span>}\n <code className=\"gs-fn-guide1-arg-type\">{arg.acceptedTypes?.join(' | ') || 'any'}</code>\n <span className=\"gs-fn-guide1-arg-desc\"> — {arg.description}</span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n\n if (activeFunctionGuide) {\n return (\n <div\n ref={ref}\n className={`gs-fn-guide2 ${isHidden ? 'gs-fn-guide2-hidden' : ''}`}\n style={top !== undefined && left !== undefined ? { top: top + 4, left } : undefined}\n >\n {activeFunctionGuide.category && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${activeFunctionGuide.category}`}>\n {activeFunctionGuide.category}\n </span>\n )}\n <div className=\"gs-fn-guide2-name\">{activeFunctionGuide.example}</div>\n <div className=\"gs-fn-guide2-args-inline\">\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n return args.map((arg: any, j: number) => {\n let isActive: boolean;\n if (activeArgIndex < variadicStart) {\n // Cursor is on a fixed (non-variadic) argument\n isActive = activeArgIndex === j;\n } else if (numIterable > 0 && j >= variadicStart) {\n // Cursor is in the variadic zone; cycle through the variadic args\n const offset = (activeArgIndex - variadicStart) % numIterable;\n isActive = j === variadicStart + offset;\n } else {\n isActive = false;\n }\n return (\n <React.Fragment key={j}>\n {j > 0 ? ', ' : ''}\n <span className={isActive ? 'gs-active-arg' : ''}>\n {arg.optional ? '[' : ''}\n {arg.name}\n {arg.variadic ? ', ...' : ''}\n {arg.optional ? ']' : ''}\n </span>\n </React.Fragment>\n );\n });\n })()}\n </div>\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n let resolvedIndex: number;\n if (activeArgIndex < variadicStart || numIterable === 0) {\n resolvedIndex = Math.min(activeArgIndex, args.length - 1);\n } else {\n const offset = (activeArgIndex - variadicStart) % numIterable;\n resolvedIndex = variadicStart + offset;\n }\n const activeArg = args[resolvedIndex];\n if (!activeArg?.description) {\n return null;\n }\n return (\n <div className=\"gs-fn-guide2-desc\" style={{ marginTop: 8, fontSize: 12, color: '#888' }}>\n <p>\n <strong>{activeArg.name}:</strong>{' '}\n <code className=\"gs-fn-guide2-arg-type\">{activeArg.acceptedTypes?.join(' | ') || 'any'}</code>\n {activeArg.description}\n </p>\n </div>\n );\n })()}\n\n {activeFunctionGuide.description && (\n <div className=\"gs-fn-guide2-desc\" style={{ whiteSpace: 'pre-line' }}>\n {activeFunctionGuide.description}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n};\n","import React, { useRef, useLayoutEffect, useState } from 'react';\nimport { FunctionGuide } from './FunctionGuide';\nimport { clampLeft } from '../lib/popup';\n\ninterface EditorOptionsProps {\n filteredOptions: any[];\n top: number;\n left: number;\n selected: number;\n onOptionMouseDown: (e: React.MouseEvent<HTMLLIElement>, i: number) => void;\n}\n\nexport const EditorOptions: React.FC<EditorOptionsProps> = ({\n filteredOptions,\n top,\n left,\n selected,\n onOptionMouseDown,\n}) => {\n const ulRef = useRef<HTMLUListElement>(null);\n const [adjustedLeft, setAdjustedLeft] = useState(left);\n\n useLayoutEffect(() => {\n if (!ulRef.current) {\n return;\n }\n const width = ulRef.current.getBoundingClientRect().width;\n setAdjustedLeft(clampLeft(left, width));\n }, [left, filteredOptions]);\n\n if (filteredOptions.length === 0) {\n return null;\n }\n\n return (\n <ul ref={ulRef} className=\"gs-editor-options\" style={{ top, left: adjustedLeft }}>\n {filteredOptions.map((option, i) => (\n <li\n key={i}\n className={`gs-editor-option ${selected === i ? ' gs-editor-option-selected' : ''}`}\n onMouseDown={(e) => onOptionMouseDown(e, i)}\n >\n <div className=\"gs-editor-option-content\">\n <span>{option.label ?? option.value}</span>\n {selected === i && <span className=\"gs-editor-option-tab\">⇥ Tab</span>}\n </div>\n {(option.isFunction || option.tooltip) && selected === i && <FunctionGuide option={option} />}\n </li>\n ))}\n </ul>\n );\n};\n","export const focus = (el: HTMLElement | null | undefined) => {\n el?.focus({ preventScroll: true });\n};\n\nconst isSafari = (): boolean =>\n typeof navigator !== 'undefined' && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n/**\n * Prevents Safari elastic bounce (rubber-band) at scroll boundaries.\n * No-op on non-Safari browsers. Returns a cleanup function to remove the listeners.\n */\nexport const preventSafariBounce = (el: HTMLDivElement): (() => void) => {\n if (!isSafari()) {\n return () => {};\n }\n const preventBounce = (e: WheelEvent) => {\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = el;\n const atTop = e.deltaY < 0 && scrollTop <= 0;\n const atBottom = e.deltaY > 0 && scrollTop + clientHeight >= scrollHeight;\n const atLeft = e.deltaX < 0 && scrollLeft <= 0;\n const atRight = e.deltaX > 0 && scrollLeft + clientWidth >= scrollWidth;\n if (atTop || atBottom || atLeft || atRight) {\n e.preventDefault();\n window.scrollBy({ top: e.deltaY, left: e.deltaX, behavior: 'auto' });\n }\n };\n\n let touchStartX = 0;\n let touchStartY = 0;\n\n const onTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 1) {\n touchStartX = e.touches[0].clientX;\n touchStartY = e.touches[0].clientY;\n }\n };\n\n const preventTouchBounce = (e: TouchEvent) => {\n if (e.touches.length !== 1) {\n return;\n }\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = el;\n const dx = e.touches[0].clientX - touchStartX;\n const dy = e.touches[0].clientY - touchStartY;\n const atTop = dy > 0 && scrollTop <= 0;\n const atBottom = dy < 0 && scrollTop + clientHeight >= scrollHeight;\n const atLeft = dx > 0 && scrollLeft <= 0;\n const atRight = dx < 0 && scrollLeft + clientWidth >= scrollWidth;\n if (atTop || atBottom || atLeft || atRight) {\n e.preventDefault();\n }\n };\n\n el.addEventListener('wheel', preventBounce, { passive: false });\n el.addEventListener('touchstart', onTouchStart, { passive: true });\n el.addEventListener('touchmove', preventTouchBounce, { passive: false });\n\n return () => {\n el.removeEventListener('wheel', preventBounce);\n el.removeEventListener('touchstart', onTouchStart);\n el.removeEventListener('touchmove', preventTouchBounce);\n };\n};\n","import type { StoreType, AreaType, PointType } from '../types';\n\nimport { zoneToArea } from './spatial';\nimport type { Sheet, UserSheet } from './sheet';\nimport { focus } from './dom';\n\nexport const clip = (store: StoreType) => {\n const { selectingZone, choosing, editorRef, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n if (!sheet) {\n return { top: 0, left: 0, bottom: 0, right: 0 };\n }\n\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n let area = selectingArea;\n if (area.left === -1) {\n area = { top: y, left: x, bottom: y, right: x };\n }\n const input = editorRef.current;\n const trimmed = sheet.trim(area);\n const tsv = sheet2csv(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n const html = sheet2html(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n\n if (navigator.clipboard) {\n const tsvBlob = new Blob([tsv], { type: 'text/plain' });\n const htmlBlob = new Blob([html], { type: 'text/html' });\n\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': tsvBlob,\n 'text/html': htmlBlob,\n }),\n ]);\n } else if (input != null) {\n input.value = tsv;\n focus(input);\n input.select();\n document.execCommand('copy');\n input.value = '';\n input.blur();\n }\n return area;\n};\n\nexport type SheetCSVProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n separator?: string;\n newline?: string;\n};\n\nexport const sheet2csv = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n separator = '\\t',\n newline = '\\n',\n }: SheetCSVProps = {},\n): string => {\n const rows: { isEmpty: boolean; line: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n if (value.indexOf('\\n') !== -1) {\n cols.push(`\"${value.replace(/\"/g, '\"\"')}\"`);\n } else {\n cols.push(value);\n }\n }\n rows.push({ isEmpty: rowIsEmpty, line: cols.join(separator) });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return rows.map((r) => r.line).join(newline);\n};\n\nexport type SheetHTMLProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n};\n\nexport const sheet2html = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n }: SheetHTMLProps = {},\n): string => {\n const rows: { isEmpty: boolean; html: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n const valueEscaped = value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n cols.push(`<td>${valueEscaped}</td>`);\n }\n rows.push({ isEmpty: rowIsEmpty, html: `<tr>${cols.join('')}</tr>` });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return `<table>${rows.map((r) => r.html).join('')}</table>`;\n};\n","export class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n public readonly __gsType = 'FormulaError' as const;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n static is(obj: any): obj is FormulaError {\n return obj instanceof FormulaError || obj?.__gsType === 'FormulaError';\n }\n toString() {\n return this.code;\n }\n}\n","import { a2p, buildIdentifiedRef, grantAddressAbsolute, p2a } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport { Id, PointType } from '../types';\nimport { FormulaError } from './formula-error';\n\ntype EvaluateProps = {\n sheet: Sheet;\n};\n\ntype IdentityBaseProps = {\n slideY?: number;\n slideX?: number;\n operation?: 'move' | 'removeRows' | 'removeCols';\n dependency: Id;\n};\n\nexport type ProcessFormulaProps = IdentityBaseProps & {\n idMap?: { [id: string]: string };\n};\n\nexport type IdentifyProps = IdentityBaseProps & {\n sheet: Sheet;\n};\n\nexport type DisplayProps = {\n sheet: Sheet;\n slideY?: number;\n slideX?: number;\n};\n\n// strip sharp and dollars\nconst stripId = (idString: string, stripAbsolute = true) => {\n let id = idString;\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id.replace('#', '');\n};\n\nclass Entity<T = any> {\n public value: T;\n public ids: string[] = [];\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const { y, x } = a2p(parsed.addresses[0]);\n const t = parsed.sheet.trim({ top: y, left: x, bottom: y, right: x });\n return t;\n }\n\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const address = parsed.addresses[0];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids = [id];\n return `#${parsed.sheet.id}!${buildIdentifiedRef(id, absX, absY)}`;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const area = parsed.sheet.rangeToArea(parsed.addresses.join(':'));\n const t = parsed.sheet.trim(area);\n return t;\n }\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const formulas: string[] = [];\n for (let i = 0; i < parsed.addresses.length; i++) {\n const address = parsed.addresses[i];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids.push(id);\n formulas.push(buildIdentifiedRef(id, absX, absY));\n }\n return `#${parsed.sheet.id}!${formulas.join(':')}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [sheetIdStr, id] = this.value.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, id: stripId(id, false) };\n }\n return { sheet, id: stripId(this.value, false) };\n }\n public evaluate({ sheet }: EvaluateProps) {\n const parsed = this.parse(sheet);\n if (parsed.id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const { y, x } = parsed.sheet.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.sheet.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const address = parsed.sheet.getAddressById(parsed.id, slideY, slideX);\n if (!address) {\n return '#REF!';\n }\n if (parsed.sheet.id === sheet.id) {\n return address;\n }\n return `${parsed.sheet.sheetPrefix()}${address}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const address = this.display({ sheet, slideY, slideX });\n if (address == null || address.length < 2) {\n return '#?';\n }\n const { formula, ids } = parseRef(address, props);\n this.ids = ids;\n return formula || '#?';\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetIdStr, idRange] = range.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, ids: idRange.split(':') };\n }\n return { sheet, ids: range.split(':') };\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = this.parse(sheet);\n const ids = parsed.ids.map((id) => stripId(id));\n const ps: PointType[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const p = parsed.sheet.getPointById(id);\n ps.push(p);\n }\n const [p1, p2] = ps;\n const [top, left, bottom, right] = [p1.y, p1.x, p2.y || parsed.sheet.numRows, p2.x || parsed.sheet.numCols];\n return parsed.sheet.trim({ top, left, bottom, right });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const range = parsed.ids\n .map((id) => stripId(id, false))\n .map((id) => parsed.sheet.getAddressById(id, slideY, slideX) || '#REF!')\n .join(':');\n if (parsed.sheet.id === sheet.id) {\n return range;\n }\n return `${parsed.sheet.sheetPrefix()}${range}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const range = this.display({ sheet, slideY, slideX });\n const { formula, ids } = parseRef(range, props);\n this.ids = ids;\n return formula ?? '';\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n private at?: Id;\n constructor(name: string, precedence = 0, args: Expression[] = [], at?: Id) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n this.at = at;\n }\n\n public evaluate({ sheet }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = sheet.getFunctionByName(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, sheet, at: this.at });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n closed: boolean;\n private at?: Id;\n\n constructor(type: TokenType, entity: any, precedence = 0, at?: Id, closed = true) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n this.at = at;\n this.closed = closed;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + (this.closed ? 2 : 1);\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return this.closed ? `\"${this.entity}\"` : `\"${this.entity}`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string, 0, [], this.at);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ',');\n\nconst INFIX_OPERATOR = 'INFIX_OPERATOR';\nconst PREFIX_OPERATOR = 'PREFIX_OPERATOR';\nconst POSTFIX_OPERATOR = 'POSTFIX_OPERATOR';\n\ntype LexerOption = {\n at?: Id;\n};\n\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n public identifiedFormula: string = '';\n public dependencyIds: string[] = [];\n private at?: Id;\n\n constructor(formula: string, options?: LexerOption) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n this.at = options?.at;\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number): [number, boolean] {\n // return [index, edge]\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return [i, pos === start || pos === end];\n }\n start = end;\n }\n return [-1, false];\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public identify(props: IdentifyProps): void {\n const parts: string[] = [];\n const ids: string[] = [];\n for (const t of this.tokens) {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n parts.push(String(t.entity));\n } else {\n parts.push(t.closed ? `\"${t.entity}\"` : `\"${t.entity}`);\n }\n break;\n case 'ID': {\n const entity = new IdEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'ID_RANGE': {\n const entity = new IdRangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'REF': {\n const entity = new RefEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'RANGE': {\n const entity = new RangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n default:\n parts.push(t.entity);\n break;\n }\n }\n this.identifiedFormula = parts.join('');\n this.dependencyIds = ids;\n }\n\n public display({ sheet }: DisplayProps) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return t.closed ? `\"${t.entity}\"` : `\"${t.entity}`;\n case 'ID':\n return new IdEntity(t.entity as string).display({ sheet });\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).display({ sheet });\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize(idMap: { [id: Id]: Id } = {}) {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n // TOKEN_PLUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '+', 3, this.at));\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === INFIX_OPERATOR || (prev1 === 'SPACE' && prev2 === INFIX_OPERATOR)) {\n // TOKEN_UMINUS(6)\n this.tokens.push(new Token(PREFIX_OPERATOR, '-', 6, this.at));\n } else {\n // TOKEN_MINUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '-', 3, this.at));\n }\n continue;\n }\n case '/':\n // TOKEN_DIVIDE(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '/', 4, this.at));\n continue;\n case '*':\n // TOKEN_MULTIPLY(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '*', 4, this.at));\n continue;\n case '^':\n // TOKEN_POWER(5)\n this.tokens.push(new Token(INFIX_OPERATOR, '^', 5, this.at));\n continue;\n case '&':\n // TOKEN_CONCAT(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '&', 4, this.at));\n continue;\n case '=':\n // TOKEN_EQ(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '=', 1, this.at));\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n // TOKEN_GTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>=', 2, this.at));\n continue;\n }\n // TOKEN_GT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>', 2, this.at));\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n // TOKEN_LTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<=', 2, this.at));\n continue;\n }\n if (this.get() === '>') {\n this.next();\n // TOKEN_NE(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '<>', 1, this.at));\n continue;\n }\n // TOKEN_LT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<', 2, this.at));\n continue;\n case '\"': {\n const { buf, closed } = this.getString('\"');\n // TOKEN_VALUE(0)\n this.tokens.push(new Token('VALUE', buf, 0, this.at, closed));\n continue;\n }\n case \"'\": {\n const { buf } = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n // TOKEN_PERCENT(4)\n this.tokens.push(new Token(POSTFIX_OPERATOR, '%', 4, this.at));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n // TOKEN_FUNCTION(0)\n this.tokens.push(new Token('FUNCTION', buf, 0, this.at), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n this.tokens.push(new Token('VALUE', parseFloat(buf), 0, this.at));\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool, 0, this.at));\n } else if (buf.startsWith('#')) {\n if (buf.indexOf('#REF!') !== -1) {\n this.tokens.push(new Token('UNREFERENCED', buf, 0, this.at));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', resolveIdRange(buf, idMap), 0, this.at));\n } else {\n this.tokens.push(new Token('ID', buf, 0, this.at));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf, 0, this.at));\n } else {\n // A token containing '.' alongside letters is a partial function name\n // (e.g. \"RANGE.1\" before the opening paren), not a cell reference.\n const looksLikeFunctionName = buf.includes('.') && /[a-zA-Z]/.test(buf);\n if (looksLikeFunctionName || isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf, 0, this.at));\n } else {\n this.tokens.push(new Token('REF', buf, 0, this.at));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space, 0, this.at));\n }\n }\n\n private getString(quote = '\"'): { buf: string; closed: boolean } {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n return { buf, closed: false };\n }\n if (c === quote) {\n if (quote === '\"' && this.get() === quote) {\n // escape for double quotes\n buf += quote;\n this.next();\n continue;\n } else if (quote === \"'\" && this.get() === quote) {\n // keep consecutive single quotes as is\n buf += c;\n continue;\n } else {\n return { buf, closed: true };\n }\n } else {\n buf += c;\n }\n }\n }\n}\n\nconst resolveIdRange = (range: string, idMap: { [id: Id]: Id }) => {\n const [sheetId, refString] = range.split('!');\n const refs = refString.split(':');\n const done = new Set<number>();\n Object.keys(idMap).forEach((before) => {\n const after = idMap[before];\n // #x -> #y, #$x -> #$y, #x$ -> #y$, #$x$ -> #$y$\n const regex = new RegExp(`(\\\\$)?#${before}\\\\b(\\\\$)?`);\n for (let i = 0; i < refs.length; i++) {\n if (done.has(i)) {\n continue;\n }\n const ref = refs[i];\n const replaced = ref.replace(regex, (_: string, prefix: string, suffix: string) => {\n return `${prefix || ''}#${after}${suffix || ''}`;\n });\n if (replaced === ref) {\n continue;\n }\n refs[i] = replaced;\n done.add(i);\n }\n });\n return `${sheetId}!${refs.join(':')}`;\n};\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\n/** Alias for Parser, exported for external tooling (e.g. Debugger). */\nexport const FormulaParser = Parser;\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n\nexport function splitRef(ref: string): { sheetName: string | undefined; addresses: string[] } {\n let sheetName: string | undefined = undefined;\n let addresses: string[] = [];\n\n if (ref.startsWith(\"'\")) {\n let i = 1;\n let name = '';\n\n while (i < ref.length) {\n const char = ref[i];\n const nextChar = ref[i + 1];\n\n if (char === \"'\") {\n if (nextChar === \"'\") {\n name += \"'\";\n i += 2;\n } else if (nextChar === '!') {\n i += 2;\n break;\n } else {\n return { sheetName: undefined, addresses: [] };\n }\n } else {\n name += char;\n i++;\n }\n }\n\n sheetName = name;\n const addressPart = ref.slice(i).trim();\n addresses = addressPart.split(':');\n } else {\n const excl = ref.indexOf('!');\n if (excl !== -1) {\n sheetName = ref.slice(0, excl);\n const addressPart = ref.slice(excl + 1).trim();\n addresses = addressPart.split(':');\n } else {\n addresses = ref.trim().split(':');\n }\n }\n return { sheetName, addresses };\n}\n\nexport const parseRef = (\n ref: string,\n { sheet, operation, dependency }: IdentifyProps,\n): {\n sheet: Sheet;\n sheetId?: number;\n formula?: string;\n sheetName?: string;\n addresses: string[];\n ids: string[];\n} => {\n const { sheetName, addresses } = splitRef(ref);\n const ids: string[] = [];\n if (sheetName) {\n sheet = sheet.getSheetBySheetName(sheetName)!;\n if (sheet == null) {\n return { sheet, sheetName, addresses, ids };\n }\n }\n if (addresses.length === 0) {\n return { sheet, sheetName, addresses, ids };\n }\n const refs: string[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const { y, x, absX, absY } = a2p(address);\n let id = sheet.getId({ y, x });\n\n // if the id is the same as the dependency by the operation,\n // we need to adjust the id based on the operation\n if (id === dependency) {\n if (operation === 'removeRows') {\n id = sheet.getId({ y: y - 1, x });\n } else if (operation === 'removeCols') {\n id = sheet.getId({ y, x: x - 1 });\n }\n }\n if (id == null) {\n refs.push(grantAddressAbsolute(address, !!absX, !!absY) || '?');\n continue;\n }\n ids.push(id);\n refs.push(`${absX ? '$' : ''}#${id}${absY ? '$' : ''}`);\n }\n let formula = `#${sheet.id}!${refs.join(':')}`;\n return {\n sheet,\n sheetName,\n addresses,\n ids,\n formula,\n };\n};\n","import type { AsyncCache, CellType, System } from '../types';\n\nexport const filterCellFields = (cell: CellType, ignoreFields: (keyof CellType)[]): CellType => {\n if (ignoreFields.length === 0) {\n return cell;\n }\n return Object.fromEntries(\n Object.entries(cell).filter(([key]) => !ignoreFields.includes(key as keyof CellType)),\n ) as CellType;\n};\n\n/**\n * Ensure that `registry.systems[id]` exists, initialising it with sensible\n * defaults when missing. Any keys present in `defaults` that are absent on\n * the existing System object are filled in.\n * Returns the (possibly freshly-created) `System` object.\n */\nexport const ensureSys = (\n registry: { systems: Record<string, System> },\n id: string,\n defaults: Partial<System> = {},\n): System => {\n if (registry.systems[id] == null) {\n registry.systems[id] = {};\n }\n const sys = registry.systems[id];\n for (const key of Object.keys(defaults) as (keyof System)[]) {\n (sys as any)[key] ??= defaults[key];\n }\n return sys;\n};\n\n/**\n * Write an `AsyncCache` entry into `cell.asyncCaches[key]`, creating the\n * `asyncCaches` record if it does not yet exist.\n */\nexport const setAsyncCache = (cell: CellType, key: string, ac: AsyncCache): void => {\n if (!cell.asyncCaches) {\n cell.asyncCaches = {};\n }\n cell.asyncCaches[key] = ac;\n};\n","import type { Address, AreaType, CellsByAddressType, CellType, Id } from '../types';\nimport type { UserSheet } from './sheet';\nimport { a2p, p2a, x2c, c2x, y2r } from './coords';\nimport { createMatrix } from './spatial';\nimport { filterCellFields } from './cell';\nimport type { CellFilter, Resolution } from '../types';\nimport type { SolveOptions } from '../formula/solver';\n\nconst noFilter: CellFilter = () => true;\n\ntype CellField = keyof CellType;\n\ntype ToProps = {\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n};\n\ntype ToCellProps = ToProps & {\n ignoreFields?: CellField[];\n};\n\n/**\n * @internal — used by Sheet._toValueMatrix and solver.ts; keeps resolution for internal wiring.\n */\n\nexport type ToValueMatrixProps = ToProps & {\n area?: AreaType;\n};\n\nexport type ToCellMatrixProps = ToCellProps & {\n area?: AreaType;\n};\n\nexport type ToValueObjectProps = ToProps & {\n addresses?: Address[];\n};\n\nexport type ToCellObjectProps = ToCellProps & {\n addresses?: Address[];\n};\n\nexport type ToValueRowsProps = ToProps & {\n rows?: number[];\n};\n\nexport type ToCellRowsProps = ToCellProps & {\n rows?: number[];\n};\n\nexport type ToValueColsProps = ToProps & {\n cols?: (number | string)[];\n};\n\nexport type ToCellColsProps = ToCellProps & {\n cols?: (number | string)[];\n};\n\nexport const getCellByAddress = (\n sheet: UserSheet,\n address: Address,\n options: SolveOptions = {},\n): CellType | undefined => {\n const point = a2p(address);\n return sheet.getCell(point, options);\n};\n\nexport const toValueMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, asScalar = false }: ToValueMatrixProps = {},\n): any[][] => {\n return sheet.__raw__._toValueMatrix({ area, resolution, raise, filter, asScalar });\n};\n\nexport const toValueObject = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, addresses, asScalar = false }: ToValueObjectProps = {},\n): { [address: Address]: any } => {\n const result: { [Address: Address]: any } = {};\n if (addresses) {\n for (const addr of addresses) {\n const point = a2p(addr);\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy(point);\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point });\n }\n result[addr] = fieldValue;\n }\n }\n return result;\n }\n const { top, left, bottom, right } = sheet.area;\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n result[p2a({ y, x })] = fieldValue;\n }\n }\n }\n return result;\n};\n\nexport const toValueRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, asScalar = false }: ToValueRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n row[x2c(x)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toValueCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, asScalar = false }: ToValueColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n col[y2r(y)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toCellMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, ignoreFields = [] }: ToCellMatrixProps = {},\n): (CellType | null)[][] => {\n const { top, left, bottom, right } = area ?? {\n top: 1,\n left: 1,\n bottom: sheet.area.bottom,\n right: sheet.area.right,\n };\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n const filteredCell = filterCellFields(cell, ignoreFields);\n matrix[y - top][x - left] = filteredCell;\n }\n }\n }\n return matrix;\n};\n\nexport const toCellObject = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, addresses, ignoreFields = [] }: ToCellObjectProps = {},\n): CellsByAddressType => {\n const result: CellsByAddressType = {};\n if (addresses) {\n for (const addr of addresses) {\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[addr] = filterCellFields(cell, ignoreFields);\n }\n }\n return result;\n }\n const { bottom, right } = sheet.area;\n for (let y = 1; y <= bottom; y++) {\n for (let x = 1; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[p2a({ y, x })] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const toCellRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, ignoreFields = [] }: ToCellRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n row[x2c(x)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const escapeSheetName = (name: string): string => {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n};\n\nexport const toSheetPrefix = (name?: string): string => {\n if (name) {\n return `${escapeSheetName(name)}!`;\n }\n return '';\n};\n\nexport const toCellCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, ignoreFields = [] }: ToCellColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n col[y2r(y)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n","import type { PointType } from '../types';\nimport type { Sheet } from './sheet';\nimport { Lexer, splitRef } from '../formula/evaluator';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../constants';\nimport { a2p, grantAddressAbsolute } from './coords';\nimport { toSheetPrefix } from './sheet_utils';\nimport { focus } from './dom';\n\nexport const insertTextAtCursor = (input: HTMLTextAreaElement, text: string) => {\n focus(input);\n const deprecated = !document.execCommand?.('insertText', false, text);\n if (!deprecated) {\n return;\n }\n input.setRangeText(text, input.selectionStart, input.selectionEnd, 'end');\n return;\n};\n\ntype InsertRefProps = {\n input: HTMLTextAreaElement | null;\n ref: string;\n dryRun?: boolean;\n};\n\nexport const insertRef = ({ input, ref, dryRun = false }: InsertRefProps): boolean => {\n // dryRun is used to check if the ref can be inserted without actually inserting it\n if (!input?.value?.startsWith('=') || input.selectionStart === 0) {\n return false;\n }\n const lexer = new Lexer(input.value.substring(1));\n lexer.tokenize();\n const [tokenIndex, _] = lexer.getTokenIndexByCharPosition(input.selectionStart - 1);\n let token = lexer.tokens[tokenIndex];\n if (token?.type === 'SPACE') {\n token = lexer.tokens[tokenIndex - 1];\n }\n if (\n token == null ||\n token.type === 'OPEN' ||\n token.type === 'COMMA' ||\n token.type === 'INFIX_OPERATOR' ||\n token.type === 'PREFIX_OPERATOR'\n ) {\n if (!dryRun) {\n insertTextAtCursor(input, ref);\n }\n } else if (token.type === 'REF' || token.type === 'RANGE') {\n if (!dryRun) {\n // keep the absolute/relative state of the token\n const { sheetName: refSheetName, addresses: refAddresses } = splitRef(ref);\n const { addresses: tokenAddresses } = splitRef(token.entity as string);\n\n const tokenAbsolutes = tokenAddresses.map((a) => a2p(a));\n if (tokenAddresses.length === 2 && refAddresses.length === 1) {\n refAddresses.push(refAddresses[0]);\n }\n ref =\n toSheetPrefix(refSheetName) +\n refAddresses\n .map((r, i) => {\n return grantAddressAbsolute(r, !!tokenAbsolutes[i]?.absX, !!tokenAbsolutes[i]?.absY);\n })\n .join(':');\n\n const [start, end] = lexer.getTokenPositionRange(tokenIndex + 1, 1);\n input.setSelectionRange(start, end);\n insertTextAtCursor(input, ref);\n }\n } else {\n return false;\n }\n return true;\n};\n\nexport const isRefInsertable = (input: HTMLTextAreaElement | null): boolean => {\n return insertRef({ input, ref: '', dryRun: true });\n};\n\nexport const expandInput = (input: HTMLTextAreaElement | null) => {\n if (input == null) {\n return;\n }\n input.style.width = `${input.scrollWidth}px`;\n input.style.height = `${input.scrollHeight}px`;\n};\n\nexport const resetInput = (input: HTMLTextAreaElement | null, sheet: Sheet, point: PointType) => {\n const style = input?.style;\n if (style == null) {\n return;\n }\n const width = sheet.getCell({ x: point.x, y: 0 }, { resolution: 'SYSTEM' })?.width ?? DEFAULT_WIDTH;\n const height = sheet.getCell(point, { resolution: 'SYSTEM' })?.height ?? DEFAULT_HEIGHT;\n style.width = `${width}px`;\n style.height = `${height}px`;\n};\n\nexport const isFocus = (input: HTMLTextAreaElement | null): boolean => {\n if (typeof window === 'undefined' || input == null) {\n return false;\n }\n return document.activeElement === input;\n};\n\n/**\n * Handles auto-close behavior for double quotes in formula editing.\n * - Typing `\"` inserts `\"\"` and places cursor between them.\n * - Typing `\"` when cursor is right before an auto-closed `\"` skips over it.\n * - Backspace between empty `\"\"` deletes both quotes.\n *\n * Returns true if the event was handled (caller should preventDefault), false otherwise.\n */\nexport const handleFormulaQuoteAutoClose = (\n e: React.KeyboardEvent<HTMLTextAreaElement>,\n inputting: string,\n): boolean => {\n const input = e.currentTarget;\n const isFormula = inputting.startsWith('=');\n if (!isFormula) {\n return false;\n }\n\n const { selectionStart, selectionEnd } = input;\n\n if (e.key === '\"') {\n // If text is selected, wrap it in quotes\n if (selectionStart !== selectionEnd) {\n e.preventDefault();\n const selectedText = inputting.slice(selectionStart, selectionEnd);\n insertTextAtCursor(input, `\"${selectedText}\"`);\n requestAnimationFrame(() => {\n input.setSelectionRange(selectionStart + 1, selectionEnd + 1);\n });\n return true;\n }\n\n const charAfter = inputting[selectionStart];\n\n // Count unescaped double quotes before cursor (after '=') to determine if we're inside a string\n const beforeCursor = inputting.slice(1, selectionStart); // skip '='\n let quoteCount = 0;\n for (let i = 0; i < beforeCursor.length; i++) {\n if (beforeCursor[i] === '\"') {\n // Skip escaped double quotes (\"\") inside strings\n if (i + 1 < beforeCursor.length && beforeCursor[i + 1] === '\"') {\n i++; // skip the next quote\n } else {\n quoteCount++;\n }\n }\n }\n\n // If odd number of quotes before cursor, we're inside a string.\n // If the next char is `\"`, it's the closing quote — skip over it.\n if (quoteCount % 2 === 1 && charAfter === '\"') {\n e.preventDefault();\n input.setSelectionRange(selectionStart + 1, selectionStart + 1);\n return true;\n }\n\n // Otherwise, insert `\"\"` and place cursor in between\n e.preventDefault();\n insertTextAtCursor(input, '\"\"');\n requestAnimationFrame(() => {\n input.setSelectionRange(selectionStart + 1, selectionStart + 1);\n });\n return true;\n }\n\n if (e.key === 'Backspace') {\n // If cursor is between `\"\"`, delete both\n if (\n selectionStart === selectionEnd &&\n selectionStart > 0 &&\n inputting[selectionStart - 1] === '\"' &&\n inputting[selectionStart] === '\"'\n ) {\n e.preventDefault();\n input.setRangeText('', selectionStart - 1, selectionStart + 1, 'end');\n input.dispatchEvent(new Event('input', { bubbles: true }));\n return true;\n }\n }\n\n return false;\n};\n","export const COLOR_PALETTE = [\n // orange\n '#FF6600',\n // purple\n '#AA44FF',\n // emeraldblue\n '#00CCCC',\n // peach\n '#EEAAEE',\n // yellow\n '#DDDD00',\n // winered\n '#AA4444',\n // lightgreen\n '#00FF00',\n // pink\n '#FF00FF',\n // navy\n '#3366FF',\n // cyan\n '#008888',\n];\n","export class Sentinel {\n public readonly __gsType = 'Sentinel' as const;\n constructor(public readonly code: string) {}\n\n is(obj: any): obj is this {\n return Sentinel.is(obj, this.code);\n }\n\n static is(obj: any, code?: string): obj is Sentinel {\n const match = obj instanceof Sentinel || obj?.__gsType === 'Sentinel';\n if (!match) {\n return false;\n }\n return code == null || obj.code === code;\n }\n}\n\nexport const SOLVING = new Sentinel('solving');\n\n/**\n * Sentinel value representing an in-flight async formula computation.\n * Cells whose solved cache contains a Pending will render a loading indicator.\n * Dependent cells that encounter a Pending value also become pending.\n */\nexport class Pending<T = unknown> {\n private readonly timestamp: number;\n\n public readonly promise: Promise<T>;\n public readonly __gsType = 'Pending' as const;\n\n constructor(promise: Promise<T>) {\n this.promise = promise;\n this.timestamp = Date.now();\n }\n\n static is(obj: any): obj is Pending {\n return obj instanceof Pending || obj?.__gsType === 'Pending';\n }\n\n toString(): string {\n return `<Pending #${this.timestamp}>`;\n }\n}\n\n/**\n * Returned by functions that want to spill a 2D result into adjacent cells.\n *\n * Usage in a function:\n * return new Spilling([[1, 2], [3, 4]]);\n *\n * The solver detects Spilling via `Spilling.is()` and calls\n * `sheet.spill(origin, result.matrix)` to perform obstruction checks\n * and write values into the solvedCaches.\n */\nexport class Spilling {\n public readonly __gsType = 'Spilling' as const;\n /** The 2D matrix of resolved values. matrix[row][col] */\n public readonly matrix: any[][];\n\n constructor(matrix: any[] | any[][]) {\n this.matrix = this.ensure2D(matrix);\n }\n\n private ensure2D(matrix: any[] | any[][]): any[][] {\n if (matrix.length === 0) {\n return [];\n }\n if (Array.isArray(matrix[0])) {\n return matrix as any[][];\n }\n // 1D array is treated as a single row (horizontal expansion).\n // e.g. [1, 2, 3] → [[1, 2, 3]]\n // To expand vertically instead, use: matrix.map(v => [v])\n return [matrix as any[]];\n }\n\n static is(obj: any): obj is Spilling {\n return obj instanceof Spilling || obj?.__gsType === 'Spilling';\n }\n}\n","import { DEFAULT_HISTORY_LIMIT, RESET_ZONE } from '../constants';\nimport { Pending } from '../sentinels';\n\nimport type {\n HistoryType,\n RefPaletteType,\n SheetIdsByName,\n ContextsBySheetId,\n ZoneType,\n CellsByIdType,\n SystemsByIdType,\n System,\n Id,\n StoreDispatchType,\n FeedbackType,\n EditorEvent,\n CursorStateType,\n} from '../types';\nimport type { UserSheet } from './sheet';\nimport { useEffect, useState } from 'react';\nimport { updateSheet } from '../store/actions';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { functions as functionsDefault } from '../formula/mapping';\nimport { PolicyType } from '../policy/core';\n\nexport type RegistryProps = {\n historyLimit?: number;\n additionalFunctions?: FunctionMapping;\n policies?: { [policyName: string]: PolicyType | null };\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n};\n\nexport type BookProps = RegistryProps;\n\nexport class Registry {\n sheetHead: number = 0;\n cellHead: number = 0;\n data: CellsByIdType = {};\n systems: SystemsByIdType = {};\n sheetIdsByName: SheetIdsByName = {};\n contextsBySheetId: ContextsBySheetId = {};\n choosingSheetId: number = 0;\n choosingAddress: string = '';\n editingSheetId: number = 0;\n editingAddress: string = '';\n paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n lastFocused: HTMLTextAreaElement | null = null;\n solvedCaches: Map<Id, any> = new Map();\n /** IDs of non-origin cells that received spilled values (populated in spill(), cleared in clearSolvedCaches()). */\n lastSpilledTargetIds: Set<Id> = new Set();\n /** Currently in-flight async formula Pending sentinels (keyed by cell ID). */\n asyncPending: Map<string, Pending> = new Map();\n /** In-flight async formulas shared by cache key (for useInflight). */\n asyncInflight?: Map<string, { pending: Pending; expireTime?: number }>;\n copyingSheetId: number = 0;\n copyingZone: ZoneType = RESET_ZONE;\n cutting: boolean = false;\n histories: HistoryType[] = [];\n historyIndex: number = -1;\n historyLimit: number = DEFAULT_HISTORY_LIMIT;\n lastHistory?: HistoryType;\n currentHistory?: HistoryType;\n ready = false;\n functions: FunctionMapping = {};\n policies: { [policyName: string]: PolicyType | null } = {};\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n\n transmit: (newBook?: TransmitProps) => void = (newBook?: TransmitProps) => {\n // This method will be overridden by useBook\n };\n\n public boot() {\n if (this.ready || Object.keys(this.contextsBySheetId).length === 0) {\n return;\n }\n const keys = Object.keys(this.contextsBySheetId);\n const tobe: StoreDispatchType[] = [];\n for (let i = 0; i < keys.length; i++) {\n const sheetId = keys[i];\n const storeDispatch = this.contextsBySheetId[sheetId];\n const sheet = storeDispatch.store.sheetReactive.current;\n if (!sheet || sheet.status === 0) {\n return;\n }\n tobe.push(storeDispatch);\n }\n for (let i = 0; i < tobe.length; i++) {\n const { store, dispatch } = tobe[i];\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n continue;\n }\n sheet.resolveFormulas();\n dispatch(updateSheet(sheet));\n }\n this.ready = true;\n }\n\n constructor({\n historyLimit,\n additionalFunctions,\n policies = {},\n onSave,\n onChange,\n onRemoveRows,\n onRemoveCols,\n onInsertRows,\n onInsertCols,\n onSelect,\n onKeyUp,\n onInit,\n }: RegistryProps = {}) {\n if (historyLimit != null) {\n this.historyLimit = historyLimit;\n }\n this.functions = {\n ...functionsDefault,\n ...additionalFunctions,\n };\n for (const fnName in this.functions) {\n const fn = this.functions[fnName];\n fn.__name = fnName;\n }\n this.policies = policies;\n this.onSave = onSave;\n this.onChange = onChange;\n this.onRemoveRows = onRemoveRows;\n this.onRemoveCols = onRemoveCols;\n this.onInsertRows = onInsertRows;\n this.onInsertCols = onInsertCols;\n this.onSelect = onSelect;\n this.onKeyUp = onKeyUp;\n this.onInit = onInit;\n }\n}\n\nexport type TransmitProps = Partial<Registry>;\n\nexport const createRegistry = (props: RegistryProps = {}) => {\n return new Registry(props);\n};\n\n/** @deprecated use createRegistry */\nexport const createBinding = createRegistry;\n\nexport type BookType = {\n registry: Registry;\n};\n\nexport const createBook = (props: RegistryProps = {}): BookType => {\n return { registry: createRegistry(props) };\n};\n\nexport const useBook = (props: RegistryProps = {}) => {\n const [book, setBook] = useState<BookType>(() => createBook(props));\n const { registry } = book;\n registry.transmit = (patch?: TransmitProps) => {\n Object.assign(registry, patch);\n if (!registry.ready) {\n return;\n }\n requestAnimationFrame(() => setBook({ registry }));\n };\n useEffect(() => {\n Object.assign(registry, props);\n }, [props]);\n return book;\n};\n","import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport timezone from 'dayjs/plugin/timezone.js';\ndayjs.extend(timezone);\ndayjs.extend(utc);\n\nconst NUMS = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);\nconst NUMS_Z = new Set([...NUMS, 'Z', 'z']);\nconst JFMASOND = new Set(['J', 'F', 'M', 'A', 'S', 'O', 'N', 'D', ...NUMS]);\nconst NBRYNLGPTVC = new Set(['N', 'B', 'R', 'Y', 'N', 'L', 'G', 'P', 'T', 'V', 'C', ...NUMS_Z]);\n\n// Reject strings that contain words not typically found in date representations.\n// Date strings consist of month names, digits, separators, and timezone abbreviations.\n// If a word is purely alphabetic and not a recognized date token, it's likely not a date.\nconst DATE_WORDS = new Set([\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n 'january',\n 'february',\n 'march',\n 'april',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n 'mon',\n 'tue',\n 'wed',\n 'thu',\n 'fri',\n 'sat',\n 'sun',\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n 'am',\n 'pm',\n 'utc',\n 'gmt',\n 'est',\n 'cst',\n 'mst',\n 'pst',\n 'jst',\n 'cet',\n 'eet',\n 'ist',\n 'aest',\n 'edt',\n 'cdt',\n 'mdt',\n 'pdt',\n 'bst',\n 'hst',\n 'akst',\n 'akdt',\n 'nzst',\n 'nzdt',\n 't',\n 'z',\n]);\n\nexport function parseDate(value: string): Date | undefined {\n const first = value[0];\n if (first == null || !JFMASOND.has(first.toUpperCase())) {\n return;\n }\n if (!NBRYNLGPTVC.has(value[value.length - 1].toUpperCase())) {\n return;\n }\n if (value.match(/[=*&#@!?[\\]{}\"'()|%\\\\<>~+\\r\\n]/)) {\n return;\n }\n const words = value.split(/[\\s,/\\-:.]+/).filter(Boolean);\n for (const word of words) {\n if (/^[a-zA-Z]+$/.test(word) && !DATE_WORDS.has(word.toLowerCase())) {\n return;\n }\n }\n let timeZone = 'UTC';\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {}\n try {\n const day = dayjs.tz(value, timeZone);\n return day.toDate();\n } catch (e) {}\n}\n","import type { FC, ReactNode } from 'react';\nimport type { CellPatchType, CellType, OperationType, PointType } from '../types';\nimport type { Sheet, UserSheet } from '../lib/sheet';\nimport { isSheet } from '../formula/functions/__base';\nimport dayjs from 'dayjs';\nimport { FormulaError } from '../formula/formula-error';\nimport { Pending } from '../sentinels';\nimport { Time } from '../lib/time';\nimport { parseDate } from '../lib/date';\n\nexport type AutocompleteOption = {\n value: any;\n label?: any;\n keywords?: string[];\n tooltip?: ReactNode | FC<{ value?: any }>;\n};\n\nexport type SelectProps = {\n sheet: UserSheet;\n point: PointType;\n current?: CellType;\n next?: CellType;\n operation: OperationType;\n};\n\nexport type SerializeForClipboardProps = {\n sheet: UserSheet;\n point: PointType;\n};\n\nexport type SelectFallbackProps = {\n sheet: UserSheet;\n point: PointType;\n value: any;\n};\n\nexport type Scalar = string | number | boolean | null | undefined;\n\nexport type ScalarProps<T = any> = {\n value?: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type RenderProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n apply?: (sheet: UserSheet) => void;\n};\n\nexport type SerializeProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type PolicyMixinType = {\n // format settings\n datetimeFormat?: string;\n dateFormat?: string;\n timeFormat?: string;\n decimalPrecision?: number;\n\n // render\n render?: (props: RenderProps) => any;\n renderCallback?: (rendered: any, props: RenderProps) => any;\n renderString?: (props: RenderProps<string>) => any;\n renderNumber?: (props: RenderProps<number>) => any;\n renderBool?: (props: RenderProps<boolean>) => any;\n renderDate?: (props: RenderProps<Date>) => any;\n renderTime?: (props: RenderProps<Time>) => any;\n renderArray?: (props: RenderProps<any[]>) => any;\n renderObject?: (props: RenderProps<any>) => any;\n renderNull?: (props: RenderProps<null | undefined>) => any;\n renderSheet?: (props: RenderProps<UserSheet>) => any;\n renderRowHeaderLabel?: (n: number) => string | null;\n renderColHeaderLabel?: (n: number) => string | null;\n\n // serialize\n serialize?: (props: SerializeProps) => string;\n serializeString?: (props: SerializeProps<string>) => string;\n serializeNumber?: (props: SerializeProps<number>) => string;\n serializeBool?: (props: SerializeProps<boolean>) => string;\n serializeDate?: (props: SerializeProps<Date>) => string;\n serializeTime?: (props: SerializeProps<Time>) => string;\n serializeArray?: (props: SerializeProps<any[]>) => string;\n serializeNull?: (props: SerializeProps<null | undefined>) => string;\n serializeFormulaError?: (props: SerializeProps<FormulaError>) => string;\n serializeError?: (props: SerializeProps<Error>) => string;\n\n // deserialize\n deserialize?: (value: string, cell?: CellType) => CellType;\n deserializeRaw?: (value: any, cell?: CellType) => CellType;\n deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n // Priority slot: called before built-in deserializers when defined\n deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n // Built-in deserializers\n deserializeNumber?: (value: string, cell?: CellType) => CellPatchType<number | undefined>;\n deserializeBool?: (value: string, cell?: CellType) => CellPatchType<boolean | undefined>;\n deserializeDate?: (value: string, cell?: CellType) => CellPatchType<Date | undefined>;\n deserializeTime?: (value: string, cell?: CellType) => CellPatchType<Time | undefined>;\n deserializeAny?: (value: string, cell?: CellType) => CellPatchType<string | undefined>;\n\n // toScalar\n toScalar?: (props: ScalarProps) => Scalar;\n toScalarString?: (props: ScalarProps<string>) => Scalar;\n toScalarNumber?: (props: ScalarProps<number>) => Scalar;\n toScalarBool?: (props: ScalarProps<boolean>) => Scalar;\n toScalarDate?: (props: ScalarProps<Date>) => Scalar;\n toScalarTime?: (props: ScalarProps<Time>) => Scalar;\n toScalarArray?: (props: ScalarProps<any[]>) => Scalar;\n toScalarNull?: (props: ScalarProps<null | undefined>) => Scalar;\n\n // select\n getSelectOptions?: () => AutocompleteOption[];\n getSelectFallback?: (props: SelectFallbackProps) => CellType | undefined;\n select?: (props: SelectProps) => CellType | undefined;\n serializeForClipboard?: (props: SerializeForClipboardProps) => string;\n};\n\ntype PolicyProps = {\n mixins?: PolicyMixinType[];\n priority?: number;\n};\n\nconst BOOLS = { true: true, false: false } as { [s: string]: boolean };\n\nexport class Policy implements PolicyMixinType {\n public priority: number = 0;\n\n public datetimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n public dateFormat: string = 'YYYY-MM-DD';\n public timeFormat: string = 'HH:mm:ss';\n public decimalPrecision: number = 15;\n\n public deserializeFunctions: ((value: string, cell?: CellType) => CellPatchType<any>)[] = [];\n public deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n public deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n public renderCallback?: (rendered: any, props: RenderProps) => any;\n\n constructor(props?: PolicyProps) {\n this.priority = props?.priority ?? 1;\n this.applyMixins(props?.mixins);\n\n this.registerDeserializeFunctions();\n }\n\n private registerDeserializeFunctions(): void {\n this.deserializeFunctions = [\n ...(this.deserializeFirst ? [this.deserializeFirst.bind(this)] : []),\n this.deserializeNumber.bind(this),\n this.deserializeTime.bind(this),\n this.deserializeDate.bind(this),\n this.deserializeBool.bind(this),\n this.deserializeAny.bind(this),\n ];\n }\n\n private applyMixins(mixins?: PolicyMixinType[]) {\n if (mixins == null) {\n return;\n }\n const subclassProto = Object.getPrototypeOf(this);\n for (const mixin of mixins) {\n for (const key in mixin) {\n // Methods defined in a subclass take priority over mixins\n const overriddenBySubclass =\n subclassProto !== Policy.prototype && Object.prototype.hasOwnProperty.call(subclassProto, key);\n if (!overriddenBySubclass) {\n (this as any)[key] = (mixin as any)[key];\n }\n }\n }\n }\n\n // --- RENDER ---\n\n public render(props: RenderProps): any {\n let { value, cell } = props;\n const { sheet, point } = props;\n\n // Cell lookup: if cell not provided, resolve from sheet (entry-point usage)\n if (cell == null) {\n cell = sheet.getCell(point, { resolution: 'EVALUATED', raise: true }) ?? {};\n value = cell.value;\n }\n\n let rendered: any;\n\n if (Pending.is(value)) {\n rendered = '';\n } else if (value == null) {\n rendered = this.renderNull({ ...props, value: value as null | undefined, cell });\n } else {\n switch (typeof value) {\n case 'object':\n if (value instanceof Date) {\n rendered = this.renderDate({ ...props, value, cell });\n } else if (Time.is(value)) {\n rendered = this.renderTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n rendered = this.renderArray({ ...props, value, cell });\n } else if (FormulaError.is(value)) {\n throw value;\n } else if (isSheet(value)) {\n rendered = this.renderSheet({ ...props, value, cell });\n } else {\n rendered = this.renderObject({ ...props, value, cell });\n }\n break;\n case 'string':\n rendered = this.renderString({ ...props, value, cell });\n break;\n case 'number':\n rendered = this.renderNumber({ ...props, value, cell });\n break;\n case 'boolean':\n rendered = this.renderBool({ ...props, value, cell });\n break;\n case 'function':\n rendered = (value as () => any)();\n break;\n default:\n rendered = '';\n }\n }\n\n return this.renderCallback ? this.renderCallback(rendered, { ...props, value, cell }) : rendered;\n }\n\n public renderString({ value }: RenderProps<string>): any {\n return value!;\n }\n\n public renderBool({ value }: RenderProps<boolean>): any {\n return value ? 'TRUE' : 'FALSE';\n }\n\n public renderNumber({ value }: RenderProps<number>): any {\n if (isNaN(value!)) {\n return 'NaN';\n }\n return parseFloat(value!.toPrecision(this.decimalPrecision));\n }\n\n public renderDate({ value }: RenderProps<Date>): any {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public renderTime({ value }: RenderProps<Time>): any {\n return value!.stringify(this.timeFormat);\n }\n\n public renderArray(props: RenderProps<any[]>): any {\n let { value, cell } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.render({ ...props, value, cell });\n }\n\n public renderObject({ value }: RenderProps<any>): any {\n return JSON.stringify(value);\n }\n\n public renderNull(_props: RenderProps<null | undefined>): any {\n return '';\n }\n\n public renderSheet({ value: childSheet, ...rest }: RenderProps<UserSheet>): any {\n const at = rest.sheet.getId(rest.point);\n const stripped = childSheet.__raw__.strip({ raise: true, at });\n return this.render({ ...rest, value: stripped });\n }\n\n public renderRowHeaderLabel(_n: number): string | null {\n return null;\n }\n\n public renderColHeaderLabel(_n: number): string | null {\n return null;\n }\n\n // --- TO SCALAR ---\n\n public toScalar(props: ScalarProps): Scalar {\n const { value, cell, sheet, point } = props;\n if (Pending.is(value)) {\n return undefined;\n }\n if (value == null) {\n return this.toScalarNull({ value: value as null | undefined, cell, sheet, point });\n }\n switch (typeof value) {\n case 'string':\n return this.toScalarString({ value, cell, sheet, point });\n case 'number':\n return this.toScalarNumber({ value, cell, sheet, point });\n case 'boolean':\n return this.toScalarBool({ value, cell, sheet, point });\n case 'object':\n if (value instanceof Date) {\n return this.toScalarDate({ value, cell, sheet, point });\n } else if (Time.is(value)) {\n return this.toScalarTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n return this.toScalarArray({ value, cell, sheet, point });\n } else if (FormulaError.is(value)) {\n throw value;\n }\n return undefined;\n default:\n return undefined;\n }\n }\n\n public toScalarString({ value }: ScalarProps<string>): Scalar {\n return value;\n }\n\n public toScalarNumber({ value }: ScalarProps<number>): Scalar {\n return value?.toPrecision(this.decimalPrecision);\n }\n\n public toScalarBool({ value }: ScalarProps<boolean>): Scalar {\n return value;\n }\n\n public toScalarDate({ value }: ScalarProps<Date>): Scalar {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public toScalarTime({ value }: ScalarProps<Time>): Scalar {\n return value!.stringify(this.timeFormat);\n }\n\n public toScalarArray({ value, cell, sheet, point }: ScalarProps<any[]>): Scalar {\n let v = value?.[0];\n if (Array.isArray(v)) {\n v = v[0];\n }\n return this.toScalar({ value: v, cell, sheet, point });\n }\n\n public toScalarNull(_props: ScalarProps<null | undefined>): Scalar {\n return null;\n }\n\n // --- SERIALIZE ---\n\n public serialize({ value, cell, sheet, point }: SerializeProps): string {\n if (value === undefined) {\n value = cell?.value;\n }\n if (Pending.is(value)) {\n return '';\n }\n if (value instanceof Date) {\n return this.serializeDate({ value, cell, sheet, point } as SerializeProps<Date>);\n }\n if (Time.is(value)) {\n return this.serializeTime({ value: Time.ensure(value), cell, sheet, point } as SerializeProps<Time>);\n }\n if (value == null) {\n return this.serializeNull({ cell, sheet, point } as SerializeProps<null | undefined>);\n }\n if (Array.isArray(value)) {\n return this.serializeArray({ value, cell, sheet, point } as SerializeProps<any[]>);\n }\n if (value instanceof FormulaError) {\n return this.serializeFormulaError({ value, cell, sheet, point } as SerializeProps<FormulaError>);\n }\n if (value instanceof Error) {\n return this.serializeError({ value, cell, sheet, point } as SerializeProps<Error>);\n }\n return value.toString();\n }\n\n public serializeString({ value }: SerializeProps<string>): string {\n return value;\n }\n\n public serializeBool({ value }: SerializeProps<boolean>): string {\n return value ? 'true' : 'false';\n }\n\n public serializeNumber({ value }: SerializeProps<number>): string {\n if (isNaN(value)) {\n return 'NaN';\n }\n return parseFloat(value.toPrecision(this.decimalPrecision)).toString();\n }\n\n public serializeDate({ value }: SerializeProps<Date>): string {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public serializeTime({ value }: SerializeProps<Time>): string {\n return value.stringify(this.timeFormat);\n }\n\n public serializeArray(props: SerializeProps<any[]>): string {\n let { value } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.serialize({ ...props, value });\n }\n\n public serializeNull(_props: SerializeProps<null | undefined>): string {\n return '';\n }\n\n public serializeFormulaError({ value }: SerializeProps<FormulaError>): string {\n return value.code;\n }\n\n public serializeError(_props: SerializeProps<Error>): string {\n return '';\n }\n\n public serializeForClipboard(props: SerializeForClipboardProps): string {\n const { point, sheet } = props;\n return sheet.getSerializedValue({ point }) ?? '';\n }\n\n // --- DESERIALIZE ---\n public deserializeValue(value: any, cell: CellType): CellType {\n try {\n const parsed = typeof value !== 'string' ? this.deserializeRaw(value, cell) : this.deserialize(value, cell);\n if (this.deserializeCallback) {\n return this.deserializeCallback(parsed, cell);\n }\n return parsed;\n } catch (e) {\n return { ...cell, value: String(e) };\n }\n }\n\n public deserializeRaw(value: any, cell?: CellType): CellType {\n if (Time.is(value)) {\n value = Time.ensure(value);\n }\n return { ...cell, value };\n }\n\n public deserialize(value: string, cell?: CellType): CellPatchType<any> {\n if (value[0] === \"'\") {\n return { ...cell, value };\n }\n for (let i = 0; i < this.deserializeFunctions.length; i++) {\n const result = this.deserializeFunctions[i](value, cell);\n if (result?.value !== undefined) {\n return { ...cell, ...result };\n }\n }\n if (value === '') {\n return { ...cell, value: undefined };\n }\n return { ...cell, value };\n }\n\n public deserializeAny(value: string, _cell?: CellType): CellPatchType<string | undefined> {\n if (value == null || value === '') {\n return { value: undefined };\n }\n return { value };\n }\n\n public deserializeBool(value: string, _cell?: CellType): CellPatchType<boolean | undefined> {\n return { value: BOOLS[value.toLowerCase()] };\n }\n\n public deserializeNumber(value: string, _cell?: CellType): CellPatchType<number | undefined> {\n const m = value.match(/^-?[\\d.]+$/);\n if (m != null && value.match(/\\.$/) == null && (value.match(/\\./g) || []).length <= 1) {\n return { value: parseFloat(value) };\n }\n return { value: undefined };\n }\n\n public deserializeTime(value: string, _cell?: CellType): CellPatchType<Time | undefined> {\n if (value.length < 3 || isNaN(value[value.length - 1] as unknown as number)) {\n return { value: undefined };\n }\n return { value: Time.parse(value) };\n }\n\n public deserializeDate(value: string, _cell?: CellType): CellPatchType<Date | undefined> {\n return { value: parseDate(value) };\n }\n\n // --- SELECT ---\n\n public getSelectFallback(_props: SelectFallbackProps): any {\n return { value: null };\n }\n\n public getSelectOptions(): AutocompleteOption[] {\n return [];\n }\n\n public select(props: SelectProps): CellType | undefined {\n const { next, sheet, point } = props;\n const options = this.getSelectOptions();\n if (options.length === 0) {\n return next;\n }\n const ok = options.some((o) => o.value === next?.value);\n if (!ok) {\n return { ...next, ...this.getSelectFallback({ sheet, point, value: next?.value }) };\n }\n return next;\n }\n}\n\nexport type PolicyType = Policy;\nexport const DEFAULT_POLICY_NAME = 'default';\nexport const nonePolicy = new Policy({ priority: 0 });\n","import type { FilterCondition, FilterConditionMethod, FilterConfig } from '../types';\nimport { parseDate } from './date';\nimport { Time } from './time';\n\ntype FilterFunction = (condition: FilterCondition, cellValue: any) => boolean;\n\nconst _str = (v: any): string => (v == null ? '' : String(v));\n\ntype ValueType = 'number' | 'date' | 'time' | 'boolean' | 'string';\n\nfunction detectType(cellValue: any): ValueType {\n if (typeof cellValue === 'number') {\n return 'number';\n }\n if (cellValue instanceof Date) {\n return 'date';\n }\n if (Time.is(cellValue)) {\n return 'time';\n }\n if (typeof cellValue === 'boolean') {\n return 'boolean';\n }\n return 'string';\n}\n\nfunction parseAsType(v: string, type: ValueType): { ok: boolean; num: number } {\n switch (type) {\n case 'number': {\n let s = v.replace(/[,_]/g, '');\n let scale = 1;\n if (s.endsWith('%')) {\n s = s.slice(0, -1);\n scale = 0.01;\n }\n const n = Number(s);\n return { ok: !isNaN(n), num: n * scale };\n }\n case 'date': {\n const d = parseDate(v);\n if (!d) {\n return { ok: false, num: NaN };\n }\n return { ok: true, num: d.getTime() };\n }\n case 'time': {\n const td = Time.parse(v);\n return td ? { ok: true, num: td.toMilliseconds() } : { ok: false, num: NaN };\n }\n case 'boolean': {\n const bv = v.toLowerCase();\n if (bv === 'true') {\n return { ok: true, num: 1 };\n }\n if (bv === 'false') {\n return { ok: true, num: 0 };\n }\n return { ok: false, num: NaN };\n }\n default:\n return { ok: false, num: NaN };\n }\n}\n\nfunction toNumeric(cellValue: any, type: ValueType): number {\n switch (type) {\n case 'number':\n return cellValue as number;\n case 'date':\n return (cellValue as Date).getTime();\n case 'time':\n return Time.ensure(cellValue).toMilliseconds();\n case 'boolean':\n return cellValue ? 1 : 0;\n default:\n return NaN;\n }\n}\n\nconst filterEq: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterNe: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return !condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return !condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterGt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) > condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum > parsed.num;\n};\n\nconst filterGte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) >= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum >= parsed.num;\n};\n\nconst filterLt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) < condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum < parsed.num;\n};\n\nconst filterLte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) <= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum <= parsed.num;\n};\n\nconst filterBlank: FilterFunction = (_condition, cellValue) => {\n return cellValue == null || _str(cellValue) === '';\n};\n\nconst filterNonblank: FilterFunction = (_condition, cellValue) => {\n return cellValue != null && _str(cellValue) !== '';\n};\n\nconst filterIncludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nconst filterExcludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return !condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nexport const filterFunctions: Record<FilterConditionMethod, FilterFunction> = {\n eq: filterEq,\n ne: filterNe,\n gt: filterGt,\n gte: filterGte,\n lt: filterLt,\n lte: filterLte,\n blank: filterBlank,\n nonblank: filterNonblank,\n includes: filterIncludes,\n excludes: filterExcludes,\n};\n\nexport function evaluateFilterCondition(condition: FilterCondition, cellValue: any): boolean {\n const fn = filterFunctions[condition.method];\n return fn ? fn(condition, cellValue) : true;\n}\n\nexport function evaluateFilterConfig(filter: FilterConfig, cellValue: any): boolean {\n const mode = filter.mode ?? 'or';\n if (filter.conditions.length === 0) {\n return true;\n }\n if (mode === 'and') {\n return filter.conditions.every((c) => evaluateFilterCondition(c, cellValue));\n } else {\n return filter.conditions.some((c) => evaluateFilterCondition(c, cellValue));\n }\n}\n","import { CellsByIdType, Id } from '../types';\nimport { Sheet } from './sheet';\n\nexport class ReferencePreserver {\n public map: { [id: Id]: Id } = {};\n private sheet: Sheet;\n private dependentIds: Set<Id> = new Set<Id>();\n\n constructor(sheet: Sheet) {\n this.sheet = sheet;\n }\n\n collectDependents(...ids: Id[]) {\n ids.forEach((id) => {\n this.sheet.registry.systems[id]?.dependents?.forEach((did) => {\n this.dependentIds.add(did);\n });\n });\n }\n\n /**\n * Compare two idMatrix snapshots (`before` and `after`) and populate\n * `this.map` and collect dependents for every position where the occupying\n * cell ID changed. Works for any rearrangement (sort, move, etc.).\n */\n buildMap(before: Id[], after: Id[]) {\n for (let i = 0; i < before.length; i++) {\n const prevId = before[i];\n const currId = after[i];\n if (prevId != null && currId != null && prevId !== currId) {\n this.collectDependents(prevId, currId);\n this.map[prevId] = currId;\n }\n }\n }\n\n resolveDependents(operation?: 'move' | 'removeRows' | 'removeCols'): CellsByIdType {\n this.sheet.clearAddressCaches();\n const diffBefore: CellsByIdType = {};\n this.dependentIds.forEach((id) => {\n const dep = this.sheet.registry.data[id];\n if (dep == null) {\n return;\n }\n diffBefore[id] = { ...dep };\n this.sheet.clearDependencies(id);\n dep.value = this.sheet.processFormula(dep.value, {\n dependency: id,\n idMap: this.map,\n operation,\n });\n });\n\n return diffBefore;\n }\n}\n","import {\n Id,\n Ids,\n IdMatrix,\n AreaType,\n CellsByIdType,\n CellsByAddressType,\n PointType,\n Address,\n CellFilter,\n MatrixType,\n CellType,\n FilterConfig,\n HistoryType,\n HistorySortRowsType,\n StorePatchType,\n ShapeType,\n RectType,\n OperatorType,\n OperationType,\n RawCellType,\n ExtraPointType,\n StoreType,\n Resolution,\n MoveRelations,\n Y,\n X,\n System,\n} from '../types';\nimport { among, areaShape, createMatrix, expandRange, getMaxSizesFromCells, matrixShape } from './spatial';\nimport { a2p, x2c, c2x, p2a, y2r, grantAddressAbsolute } from './coords';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { Lexer, ProcessFormulaProps } from '../formula/evaluator';\nimport { FormulaError } from '../formula/formula-error';\nimport { solveFormula, SolveOptions, solveSheet, stripSheet } from '../formula/solver';\nimport { ensureSys, filterCellFields } from './cell';\nimport { escapeSheetName, toSheetPrefix } from './sheet_utils';\n\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n DEFAULT_HISTORY_LIMIT,\n DEFAULT_KEY,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '../constants';\nimport { Pending, SOLVING, Spilling } from '../sentinels';\nimport { shouldTracking } from '../store/helpers';\nimport { updateSheet } from '../store/actions';\nimport * as operation from './operation';\nimport { Registry, createRegistry } from './book';\nimport { nonePolicy, PolicyType, DEFAULT_POLICY_NAME, RenderProps, ScalarProps } from '../policy/core';\nimport { evaluateFilterConfig } from './filter';\nimport { ReferencePreserver } from './reference';\n\ntype CellField = keyof CellType;\n\nexport type SheetLimits = {\n minRows?: number;\n maxRows?: number;\n minCols?: number;\n maxCols?: number;\n};\n\ntype Props = {\n limits?: SheetLimits;\n functions?: FunctionMapping;\n name?: string;\n registry?: Registry;\n};\n\nconst noFilter: CellFilter = () => true;\n\ntype MoveProps = {\n srcSheet?: UserSheet;\n src: AreaType;\n dst: AreaType;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n historicize?: boolean;\n};\n\nexport interface UserSheet {\n changedTime: number;\n lastChangedTime?: number;\n area: AreaType;\n top: number;\n left: number;\n bottom: number;\n right: number;\n minNumRows: number;\n maxNumRows: number;\n minNumCols: number;\n maxNumCols: number;\n headerWidth: number;\n headerHeight: number;\n name: string;\n\n /**\n * Returns the raw sheet object, which is used for internal operations.\n * This is not intended for public use and may change in future versions.\n */\n __raw__: Sheet;\n\n getRectSize(area: AreaType): RectType;\n getCell(point: PointType, options?: { resolution?: Resolution; raise?: boolean }): CellType | undefined;\n getPolicy(point: PointType): PolicyType;\n get numRows(): number;\n get numCols(): number;\n get shape(): ShapeType;\n move(args: MoveProps): UserSheet;\n copy(args: MoveProps & { onlyValue?: boolean }): UserSheet;\n update(args: {\n diff: CellsByAddressType;\n historicize?: boolean;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n writeMatrix(args: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n write(args: { point: PointType; value: string; updateChangedTime?: boolean; reflection?: StorePatchType }): UserSheet;\n insertRows(args: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeRows(args: { y: number; numRows: number; reflection?: StorePatchType }): UserSheet;\n insertCols(args: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeCols(args: { x: number; numCols: number; reflection?: StorePatchType }): UserSheet;\n undo(): {\n history: HistoryType | null;\n };\n redo(): {\n history: HistoryType | null;\n };\n histories(): HistoryType[];\n historyIndex(): number;\n historySize(): number;\n setHeaderHeight(height: number, historicize?: boolean): UserSheet;\n setHeaderWidth(width: number, historicize?: boolean): UserSheet;\n\n sortRows(args: { x: number; direction: 'asc' | 'desc' }): UserSheet;\n\n filterRows(args?: { x?: number; filter?: FilterConfig }): UserSheet;\n isRowFiltered(y: number): boolean;\n hasActiveFilters(): boolean;\n hasPendingCells(): boolean;\n waitForPending(): Promise<void>;\n getLastChangedAddresses(): Address[];\n getSerializedValue(props: { point: PointType; cell?: CellType; resolution?: Resolution }): string;\n}\n\ntype InternalToValueMatrixProps = {\n area?: AreaType;\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n at?: Id;\n};\n\nexport class Sheet implements UserSheet {\n /** @internal */\n public __gsType = 'Sheet';\n public changedTime: number;\n public lastChangedTime?: number;\n public area: AreaType = { top: 0, left: 0, bottom: 0, right: 0 };\n\n /** @internal */\n private _limits: Required<SheetLimits>;\n get minNumRows() {\n return this._limits.minRows;\n }\n get maxNumRows() {\n return this._limits.maxRows;\n }\n get minNumCols() {\n return this._limits.minCols;\n }\n get maxNumCols() {\n return this._limits.maxCols;\n }\n /** @internal */\n public id: number = 0;\n public name: string = '';\n /** @internal */\n public prevName: string = '';\n /** @internal */\n public status: 0 | 1 | 2 = 0; // 0: not initialized, 1: initialized, 2: formula absoluted\n /** @internal */\n public registry: Registry;\n /** @internal */\n public idsToBeIdentified: Id[] = [];\n /** @internal */\n public totalWidth = 0;\n /** @internal */\n public totalHeight = 0;\n /** @internal */\n public fullHeight = 0;\n /** @internal */\n public defaultColWidth: number = DEFAULT_WIDTH;\n /** @internal */\n public defaultRowHeight: number = DEFAULT_HEIGHT;\n\n /** @internal */\n private version = 0;\n /** @internal */\n private idMatrix: IdMatrix;\n /** @internal */\n private addressCaches: Map<Id, Address> = new Map();\n /** @internal */\n private lastChangedAddresses: Address[] = [];\n\n constructor({ limits = {}, name, registry = createRegistry({}) }: Props) {\n this.idMatrix = [];\n this.changedTime = Date.now();\n this._limits = {\n minRows: limits.minRows ?? 1,\n maxRows: limits.maxRows ?? -1,\n minCols: limits.minCols ?? 1,\n maxCols: limits.maxCols ?? -1,\n };\n this.name = name || '';\n this.prevName = this.name;\n this.registry = registry;\n }\n\n static is(obj: any): obj is Sheet {\n return obj?.__gsType === 'Sheet';\n }\n\n toString() {\n return `Sheet(name=${escapeSheetName(this.name)}, size=${this.numRows}x${this.numCols})`;\n }\n\n get headerHeight() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.height || HEADER_HEIGHT;\n }\n\n setHeaderHeight(height: number, historicize = true) {\n return this.update({\n diff: { 0: { height } },\n partial: true,\n historicize,\n });\n }\n\n get headerWidth() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.width || HEADER_WIDTH;\n }\n\n setHeaderWidth(width: number, historicize = true) {\n return this.update({\n diff: { 0: { width } },\n partial: true,\n historicize,\n });\n }\n\n /**\n * Get the raw (mutable) cell data for a point. Unlike getCell, this returns the actual registry.data reference.\n * @internal\n */\n private _pointToRawCell({ y, x }: PointType): CellType | undefined {\n const id = this.idMatrix[y]?.[x];\n if (id == null) {\n return undefined;\n }\n return this.registry.data[id];\n }\n\n public isRowFiltered(y: number): boolean {\n return !!this._pointToRawCell({ y, x: 0 })?.filtered;\n }\n\n public hasActiveFilters(): boolean {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns true if any data cell in this sheet currently holds a Pending value\n * (i.e. an async formula that hasn't resolved yet).\n */\n public hasPendingCells(): boolean {\n const numRows = this.numRows;\n const numCols = this.numCols;\n for (let y = 1; y <= numRows; y++) {\n for (let x = 1; x <= numCols; x++) {\n const cell = this.getCell({ y, x }, { resolution: 'RESOLVED' });\n if (Pending.is(cell?.value)) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Returns a Promise that resolves when all in-flight async formula computations\n * have completed and no data cells hold Pending values.\n * If nothing is pending, resolves immediately.\n * Useful for waiting before sort/filter so that cell values are fully resolved.\n */\n public waitForPending(): Promise<void> {\n const pendingMap = this.registry.asyncPending;\n // If there are in-flight promises, wait for them first\n if (pendingMap.size > 0) {\n const promises = Array.from(pendingMap.values()).map((p) => p.promise);\n return Promise.all(promises).then(() => this.waitForPending());\n }\n // Even if asyncPending is empty, cells may still hold Pending values\n // (e.g. propagated pending from dependent formulas).\n // In that case, wait for the next transmit cycle and re-check.\n if (this.hasPendingCells()) {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (this.registry.asyncPending.size > 0) {\n const promises = Array.from(this.registry.asyncPending.values()).map((p) => p.promise);\n Promise.all(promises).then(check);\n } else if (this.hasPendingCells()) {\n // Still pending — wait a tick for transmit/re-render\n setTimeout(check, 50);\n } else {\n resolve();\n }\n };\n check();\n });\n }\n return Promise.resolve();\n }\n\n /**\n * Returns the addresses that were changed in the most recent `_update()` call.\n * Useful inside `onChange` to know which cells were modified.\n */\n public getLastChangedAddresses(): Address[] {\n return this.lastChangedAddresses;\n }\n\n /**\n * Capture the full cell state of all filter-related header cells as a CellsByIdType snapshot.\n * @internal\n */\n private _captureFilterCellStates(): CellsByIdType {\n const snapshot: CellsByIdType = {};\n const numCols = this.numCols;\n const numRows = this.numRows;\n // Column header cells: only capture the 'filter' field (undefined if absent)\n for (let col = 1; col <= numCols; col++) {\n const id = this.idMatrix[0]?.[col];\n if (id != null) {\n snapshot[id] = { filter: this.registry.data[id]?.filter };\n }\n }\n // Row header cells: only capture the 'filtered' field (undefined if absent)\n for (let y = 1; y <= numRows; y++) {\n const id = this.idMatrix[y]?.[0];\n if (id != null) {\n snapshot[id] = { filtered: this.registry.data[id]?.filtered };\n }\n }\n return snapshot;\n }\n\n public filterRows({\n x,\n filter,\n }: {\n x?: number;\n filter?: FilterConfig;\n } = {}) {\n const diffBefore = this._captureFilterCellStates();\n\n if (x == null) {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n delete colCell?.filter;\n }\n } else {\n const colCell = this._pointToRawCell({ y: 0, x });\n if (colCell) {\n if (filter) {\n colCell.filter = filter;\n } else {\n delete colCell.filter;\n }\n }\n }\n this._reapplyFilters();\n\n const diffAfter = this._captureFilterCellStates();\n\n // Only keep cells whose state actually changed\n const changedIds = Object.keys(diffBefore).filter(\n (id) => JSON.stringify(diffBefore[id]) !== JSON.stringify(diffAfter[id]),\n );\n\n if (changedIds.length > 0) {\n const trimmedBefore: CellsByIdType = {};\n const trimmedAfter: CellsByIdType = {};\n for (const id of changedIds) {\n trimmedBefore[id] = diffBefore[id];\n trimmedAfter[id] = diffAfter[id];\n }\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n diffBefore: trimmedBefore,\n diffAfter: trimmedAfter,\n partial: true,\n });\n }\n\n return this.refresh(false, true);\n }\n\n /** @internal */\n private _reapplyFilters() {\n // Collect active filters from column header cells\n const numCols = this.numCols;\n const activeFilters: { x: number; filter: FilterConfig }[] = [];\n const changedAddresses: Address[] = [];\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n activeFilters.push({ x: col, filter: colCell.filter });\n }\n // Track column header cells that have filter config changes\n changedAddresses.push(p2a({ y: 0, x: col }));\n }\n\n const numRows = this.numRows;\n\n // Evaluate each row and update filtered flag\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (!rowCell) {\n continue;\n }\n\n if (rowCell.filterFixed) {\n continue;\n }\n\n let shouldFilter = false;\n for (const { x: col, filter } of activeFilters) {\n const cell = this.getCell({ y, x: col }, { resolution: 'RESOLVED' });\n if (!evaluateFilterConfig(filter, cell?.value)) {\n shouldFilter = true;\n break;\n }\n }\n\n const wasFiltered = !!rowCell.filtered;\n if (shouldFilter) {\n rowCell.filtered = true;\n } else {\n delete rowCell.filtered;\n }\n if (wasFiltered !== shouldFilter) {\n changedAddresses.push(p2a({ y, x: 0 }));\n }\n }\n\n this.lastChangedAddresses = changedAddresses;\n }\n\n public sortRows({ x, direction }: { x: number; direction: 'asc' | 'desc' }) {\n const numRows = this.numRows;\n if (numRows <= 1) {\n return this;\n }\n\n // Collect row indices (data rows: 1..numRows), separating fixed rows\n const fixedPositions = new Set<number>();\n const sortableIndices: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (rowCell?.sortFixed) {\n fixedPositions.add(y);\n } else {\n sortableIndices.push(y);\n }\n }\n\n // Sort by resolved cell value at column x\n sortableIndices.sort((a, b) => {\n const cellA = this.getCell({ y: a, x }, { resolution: 'RESOLVED' });\n const cellB = this.getCell({ y: b, x }, { resolution: 'RESOLVED' });\n const valA = cellA?.value;\n const valB = cellB?.value;\n\n // null/undefined goes to the end\n if (valA == null && valB == null) {\n return 0;\n }\n if (valA == null) {\n return 1;\n }\n if (valB == null) {\n return -1;\n }\n\n let cmp = 0;\n if (typeof valA === 'number' && typeof valB === 'number') {\n cmp = valA - valB;\n } else if (valA instanceof Date && valB instanceof Date) {\n cmp = valA.getTime() - valB.getTime();\n } else {\n cmp = String(valA).localeCompare(String(valB));\n }\n return direction === 'asc' ? cmp : -cmp;\n });\n\n // Check if order actually changed (only among sortable rows)\n // Assign sortable rows to the positions not occupied by fixed rows\n const availablePositions: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n if (!fixedPositions.has(y)) {\n availablePositions.push(y);\n }\n }\n\n let changed = false;\n for (let i = 0; i < sortableIndices.length; i++) {\n if (sortableIndices[i] !== availablePositions[i]) {\n changed = true;\n break;\n }\n }\n if (!changed) {\n return this;\n }\n\n // Build row mapping: original position -> new position\n // Fixed rows map to themselves; sortable rows map to available positions in sorted order\n const sortedRowMapping: { [beforeY: number]: number } = {};\n for (const y of fixedPositions) {\n sortedRowMapping[y] = y;\n }\n for (let i = 0; i < sortableIndices.length; i++) {\n sortedRowMapping[sortableIndices[i]] = availablePositions[i];\n }\n\n // Save row references before rearranging (rows are re-slotted, not mutated).\n const matrixSnapshot = this.idMatrix.slice();\n\n for (const [oldY, newY] of Object.entries(sortedRowMapping)) {\n this.idMatrix[Number(newY)] = matrixSnapshot[Number(oldY)];\n }\n this.addressCaches.clear();\n\n const preserver = new ReferencePreserver(this);\n preserver.buildMap(matrixSnapshot.flat(), this.idMatrix.flat());\n preserver.resolveDependents();\n\n this._pushHistory({\n applyed: true,\n operation: 'SORT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n sortedRowMapping,\n } as HistorySortRowsType);\n\n return this.refresh(true, true);\n }\n\n /** @internal */\n private _sortRowMapping(sortedRowMapping: { [beforeY: number]: number }, inverse = false) {\n // Convert mapping to array and apply the sort order\n const numRows = this.numRows;\n const newOrder: number[] = new Array(numRows);\n\n if (inverse) {\n // Undo: reverse the mapping\n // If sortedRowMapping says \"oldY -> newY\", then to undo we put \"newY -> oldY\"\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[oldY - 1] = newY;\n }\n } else {\n // Redo: apply the mapping\n // sortedRowMapping[oldY] = newY means row oldY goes to position newY\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[newY - 1] = oldY;\n }\n }\n\n // Apply the sort order: newOrder[i] = original row index that should end up at position i+1\n const savedRows: Ids[] = [];\n for (let i = 0; i < newOrder.length; i++) {\n savedRows.push(this.idMatrix[newOrder[i]]);\n }\n for (let i = 0; i < newOrder.length; i++) {\n this.idMatrix[i + 1] = savedRows[i];\n }\n this.addressCaches.clear();\n }\n\n get isInitialized() {\n return this.status === 2;\n }\n\n get policies() {\n return this.registry.policies;\n }\n\n /** @internal */\n public getSystem(point: PointType): System | undefined {\n const id = this.getId(point);\n if (id == null) {\n return undefined;\n }\n return this.registry.systems[id];\n }\n\n /** @internal */\n public processFormula(value: any, { idMap, ...props }: ProcessFormulaProps): any {\n if (typeof value === 'string' || value instanceof String) {\n if (value.charAt(0) === '=') {\n const lexer = new Lexer(value.substring(1));\n lexer.tokenize(idMap);\n lexer.identify({ ...props, sheet: this });\n lexer.dependencyIds.forEach((id) => this.addDependency(id, props.dependency));\n return '=' + lexer.identifiedFormula;\n }\n }\n return value;\n }\n\n /** @internal */\n public resolveFormulas() {\n this.idsToBeIdentified.forEach((id) => {\n const cell = this.registry.data[id];\n if (this.registry.systems[id]?.sheetId == null) {\n return;\n }\n if (cell == null) {\n return;\n }\n this.clearDependencies(id);\n cell.value = this.processFormula(cell?.value, { dependency: id });\n });\n this.idsToBeIdentified = [];\n this.status = 2;\n }\n\n /** @internal */\n public getSheetBySheetName(sheetName: string) {\n const sheetId = this.registry.sheetIdsByName[sheetName];\n return this.getSheetBySheetId(sheetId);\n }\n /** @internal */\n public getSheetBySheetId(sheetId: number) {\n return this.registry.contextsBySheetId[sheetId]?.store?.sheetReactive?.current;\n }\n\n /** @internal */\n private static _stack(...cells: (CellType | undefined)[]) {\n const extension: CellType = {};\n cells.forEach((cell) => {\n if (cell?.style) {\n extension.style = { ...extension.style, ...cell.style };\n }\n if (cell?.prevention) {\n extension.prevention = (extension.prevention || 0) | cell.prevention;\n }\n });\n return extension;\n }\n\n /** @internal */\n public initialize(cells: CellsByAddressType) {\n if (this.status > 1) {\n return;\n }\n if (cells[0] == null) {\n cells[0] = { width: HEADER_WIDTH, height: HEADER_HEIGHT };\n }\n const auto = getMaxSizesFromCells(cells);\n const changedTime = Date.now();\n this.area = {\n top: 1,\n left: 1,\n bottom: auto.numRows,\n right: auto.numCols,\n };\n\n // make idMatrix beforehand\n for (let y = 0; y < auto.numRows + 1; y++) {\n const ids: Ids = [];\n this.idMatrix.push(ids);\n for (let x = 0; x < auto.numCols + 1; x++) {\n const id = this._generateId();\n ids.push(id);\n const address = p2a({ y, x });\n this.addressCaches.set(id, address);\n }\n }\n Object.keys(cells).forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const range = expandRange(address);\n const data = cells[address];\n\n range.forEach((address) => {\n const origin = cells[address];\n cells[address] = {\n ...origin,\n ...data,\n ...Sheet._stack(origin, data),\n };\n });\n });\n\n const common = cells?.[DEFAULT_KEY];\n const commonCol = cells?.[DEFAULT_COL_KEY];\n const commonRow = cells?.[DEFAULT_ROW_KEY];\n if (commonCol?.width != null) {\n this.defaultColWidth = commonCol.width;\n }\n if (commonRow?.height != null) {\n this.defaultRowHeight = commonRow.height;\n }\n for (let y = 0; y < auto.numRows + 1; y++) {\n const rowId = y2r(y);\n for (let x = 0; x < auto.numCols + 1; x++) {\n const id = this.getId({ y, x });\n const colId = x2c(x);\n let stacked: CellType;\n if (y === 0 && x > 0) {\n // Column header: defaultCol as base (width, style, etc.),\n // then 'A' layout props (width, label, no style), then 'A0' overrides.\n const colDefault = cells?.[colId];\n const { style: _cs, ...colDefaultLayout } = colDefault ?? {};\n const headerCell = cells?.[colId + '0'];\n stacked = {\n ...commonCol,\n ...colDefaultLayout,\n ...headerCell,\n ...Sheet._stack(commonCol, headerCell),\n } as CellType;\n } else if (x === 0 && y > 0) {\n // Row header: defaultRow as base (height, style, etc.),\n // then '1' layout props (height, no style), then '01' overrides.\n const rowDefault = cells?.[rowId];\n const { style: _rs, ...rowDefaultLayout } = rowDefault ?? {};\n const headerCell = cells?.['0' + rowId];\n stacked = {\n ...commonRow,\n ...rowDefaultLayout,\n ...headerCell,\n ...Sheet._stack(commonRow, headerCell),\n } as CellType;\n } else if (y === 0 && x === 0) {\n // Corner cell (y=0, x=0): excluded from all defaults to keep headerHeight correct.\n const cell = cells?.['0'];\n stacked = { ...cell, ...Sheet._stack(cell) } as CellType;\n } else {\n // Data cell: 'A' applies to all column-A cells, '1' to all row-1 cells.\n const address = p2a({ y, x });\n const rowDefault = cells?.[rowId];\n const colDefault = cells?.[colId];\n const cell = cells?.[address];\n stacked = {\n ...common,\n ...rowDefault,\n ...colDefault,\n ...cell,\n ...Sheet._stack(common, rowDefault, colDefault, cell),\n } as CellType;\n }\n\n if (stacked?.value?.startsWith?.('=') && (stacked?.formulaEnabled ?? true)) {\n this.idsToBeIdentified.push(id);\n }\n if (y === 0) {\n if (stacked.width == null) {\n stacked.width = DEFAULT_WIDTH;\n }\n } else if (x === 0) {\n if (stacked.height == null) {\n stacked.height = DEFAULT_HEIGHT;\n }\n } else {\n delete stacked.height;\n delete stacked.width;\n delete stacked.label;\n }\n\n const policy = this.policies[stacked.policy ?? ''] ?? this.defaultPolicy;\n stacked = policy.deserializeValue(stacked.value, stacked) ?? {};\n this.registry.systems[id] = { id, changedTime, sheetId: this.id };\n this.registry.data[id] = stacked;\n }\n }\n this.status = 1; // initialized\n this.registry.sheetIdsByName[this.name] = this.id;\n }\n\n /** @internal */\n private _incrementVersion() {\n this.version++;\n if (this.version >= Number.MAX_SAFE_INTEGER) {\n this.version = 1;\n }\n }\n\n /** @internal */\n private _xsheetDispatch(otherSheet: Sheet) {\n if (otherSheet === this) {\n return;\n }\n otherSheet.refresh(true);\n const context = this.registry.contextsBySheetId[otherSheet.id];\n if (context !== null) {\n const { dispatch } = context;\n requestAnimationFrame(() => {\n dispatch(updateSheet(otherSheet));\n });\n }\n }\n\n /** @internal */\n private _generateId() {\n return (this.registry.cellHead++).toString();\n }\n\n public getRectSize({ top, left, bottom, right }: AreaType): RectType {\n // Use System.offsetLeft / System.offsetTop stored on header cells for O(1) lookup.\n // offsetLeft on (y=0, x) = absolute left of column x\n // offsetTop on (y, x=0) = absolute top of row y\n const l = left || 1;\n const t = top || 1;\n\n const rw = this.registry.systems[this.getId({ y: 0, x: right })]?.offsetLeft ?? 0;\n const lw = this.registry.systems[this.getId({ y: 0, x: l })]?.offsetLeft ?? 0;\n const rh = this.registry.systems[this.getId({ y: bottom, x: 0 })]?.offsetTop ?? 0;\n const th = this.registry.systems[this.getId({ y: t, x: 0 })]?.offsetTop ?? 0;\n\n const width = Math.max(0, rw - lw);\n const height = Math.max(0, rh - th);\n return { y: t, x: l, height, width };\n }\n\n /** @internal */\n public setTotalSize() {\n const numCols = this.numCols;\n const numRows = this.numRows;\n const headerW = this.headerWidth;\n const headerH = this.headerHeight;\n\n // Write offsetLeft into column-header cells (y=0, x=1..numCols)\n let accW = 0;\n for (let x = 1; x <= numCols; x++) {\n const cell = this.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const w = cell?.width || this.defaultColWidth || DEFAULT_WIDTH;\n const colSys = this.registry.systems[this.getId({ y: 0, x })];\n if (colSys != null) {\n colSys.offsetLeft = headerW + accW;\n }\n accW += w;\n }\n this.totalWidth = headerW + accW;\n\n // Write offsetTop into row-header cells (y=1..numRows, x=0)\n let accH = 0;\n let fullH = 0;\n for (let y = 1; y <= numRows; y++) {\n const cell = this.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const h = cell?.height || this.defaultRowHeight || DEFAULT_HEIGHT;\n const rowSys = this.registry.systems[this.getId({ y, x: 0 })];\n if (rowSys != null) {\n rowSys.offsetTop = headerH + accH;\n }\n if (!cell?.filtered) {\n accH += h;\n }\n fullH += h;\n }\n this.totalHeight = headerH + accH;\n this.fullHeight = headerH + fullH;\n }\n\n /** @internal */\n public refresh(relocate = false, resize = false): Sheet {\n this._incrementVersion();\n this.lastChangedTime = this.changedTime;\n this.changedTime = Date.now();\n\n this.clearSolvedCaches();\n\n if (relocate) {\n // force reset\n this.addressCaches.clear();\n }\n if (resize) {\n this.setTotalSize();\n }\n return this;\n }\n\n /** @internal */\n public clone(relocate = false): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n return copied.refresh(relocate);\n }\n\n /** @internal */\n public getPointById(\n id: Id,\n slideY = 0,\n slideX = 0,\n ): PointType & {\n absCol: boolean;\n absRow: boolean;\n } {\n const absCol = id.startsWith('$');\n if (absCol) {\n id = id.slice(1);\n slideX = 0;\n }\n const absRow = id.endsWith('$');\n if (absRow) {\n id = id.slice(0, -1);\n slideY = 0;\n }\n const cache = this.addressCaches.get(id);\n if (cache) {\n const p = a2p(cache);\n return { y: p.y + slideY, x: p.x + slideX, absCol, absRow };\n }\n\n for (let y = 0; y < this.idMatrix.length; y++) {\n const ids = this.idMatrix[y];\n for (let x = 0; x < ids.length; x++) {\n const existing = ids[x];\n const address = p2a({ y, x });\n this.addressCaches.set(existing, address);\n if (existing === id) {\n return {\n y: y + slideY,\n x: x + slideX,\n absCol,\n absRow,\n };\n }\n }\n }\n return { y: -1, x: -1, absCol, absRow };\n }\n\n /** @internal */\n public getAddressById(id: Id, slideY = 0, slideX = 0): string | undefined {\n const { y, x, absCol, absRow } = this.getPointById(id, slideY, slideX);\n return grantAddressAbsolute(p2a({ y, x }), absCol, absRow);\n }\n\n /** @internal */\n public clearAddressCaches() {\n this.addressCaches.clear();\n }\n\n /** @internal */\n private _warmAddressCaches() {\n for (let y = 0; y < this.idMatrix.length; y++) {\n const row = this.idMatrix[y];\n for (let x = 0; x < row.length; x++) {\n this.addressCaches.set(row[x], p2a({ y, x }));\n }\n }\n }\n\n /** @internal */\n public getId(point: PointType) {\n const { y, x } = point;\n return this.idMatrix[y]?.[x];\n }\n\n /** @internal */\n public getCell(point: PointType, { resolution = 'RESOLVED', raise = false }: SolveOptions = {}) {\n const { y, x } = point;\n if (y === -1 || x === -1) {\n return undefined;\n }\n const id = this.idMatrix[y]?.[x];\n if (id == null) {\n return undefined;\n }\n const cell = this.registry.data[id];\n if (cell == null) {\n return undefined;\n }\n let value = cell.value;\n if (resolution !== 'SYSTEM' && (cell.formulaEnabled ?? true)) {\n value = solveFormula({ value, sheet: this, point, raise, resolution, at: id });\n }\n return { ...cell, value } as CellType;\n }\n\n /** @internal */\n public get numRows() {\n const { top, bottom } = this.area;\n return 1 + bottom - top;\n }\n\n public get numCols() {\n const { left, right } = this.area;\n return 1 + right - left;\n }\n\n public get top() {\n return this.area.top;\n }\n public get left() {\n return this.area.left;\n }\n public get bottom() {\n return this.area.bottom;\n }\n public get right() {\n return this.area.right;\n }\n\n /** @internal */\n public _toValueMatrix({\n area,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n }: InternalToValueMatrixProps = {}) {\n const { top, left, bottom, right } = area ?? this.area;\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n\n // Normalize `at` check to ensure we only throw circular ref if the `at` is from this sheet\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const id = this.getId({ y, x });\n if (at === id) {\n throw new FormulaError('#REF!', 'References are circulating.');\n }\n const cell = this.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = this.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: this, point: { y, x } });\n }\n matrix[y - top][x - left] = fieldValue;\n }\n }\n }\n return matrix;\n }\n\n /** @internal */\n private _pushHistory(history: HistoryType) {\n const book = this.registry;\n const strayedHistories = book.histories.splice(book.historyIndex + 1, book.histories.length);\n strayedHistories.forEach(this._cleanStrayed.bind(this));\n book.histories.push(history);\n book.lastHistory = book.currentHistory = history;\n if (book.histories.length > book.historyLimit) {\n const kickedOut = book.histories.splice(0, 1)[0];\n this._cleanObsolete(kickedOut);\n } else {\n book.historyIndex++;\n }\n }\n\n /** @internal */\n private _cleanObsolete(history: HistoryType) {\n if (history.operation === 'REMOVE_ROWS' || history.operation === 'REMOVE_COLS') {\n history.deleted.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n if (history.operation === 'MOVE') {\n history.moveRelations.forEach((rel) => {\n if (rel.new != null) {\n this._deleteOrphanedId(rel.new);\n }\n if (rel.lost != null) {\n this._deleteOrphanedId(rel.lost);\n }\n });\n }\n }\n\n /** @internal */\n private _cleanStrayed(history: HistoryType) {\n /**\n * Cleans up IDs that were created by a history entry that has been discarded\n * (\"strayed\") due to a new operation being pushed while the history index was\n * not at the end (i.e. after undo).\n *\n * When the user undoes one or more steps and then performs a new operation,\n * the previously-redoable future histories are removed from the history stack.\n * Any cells that were **inserted** by those discarded histories (INSERT_ROWS /\n * INSERT_COLS) have IDs that are no longer reachable from the id-matrix, so\n * their registry entries must be deleted to avoid memory leaks.\n * @internal\n */\n if (history.operation === 'INSERT_ROWS' || history.operation === 'INSERT_COLS') {\n history.idMatrix.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n }\n\n /**\n * Remove an id from registry.data and registry.dependents entirely.\n * @internal\n */\n private _deleteOrphanedId(id: Id) {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n delete this.registry.data[id];\n delete this.registry.systems[id];\n }\n\n /** @internal */\n private _copyCellLayout(cell: CellType | undefined) {\n if (cell == null) {\n return undefined;\n }\n const newCell: CellType = {};\n if (cell.style != null) {\n newCell.style = cell.style;\n }\n if (cell.justifyContent != null) {\n newCell.justifyContent = cell.justifyContent;\n }\n if (cell.alignItems != null) {\n newCell.alignItems = cell.alignItems;\n }\n if (cell.policy != null) {\n newCell.policy = cell.policy;\n }\n if (cell.width != null) {\n newCell.width = cell.width;\n }\n if (cell.height != null) {\n newCell.height = cell.height;\n }\n return newCell;\n }\n\n public move({\n srcSheet = this,\n src,\n dst,\n historicize = true,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: MoveProps) {\n const srcSheetRaw = srcSheet.__raw__;\n const moveRelations = this._createMoveRelations(srcSheetRaw, src, this, dst);\n const { diffBefore, diffAfter } = this._moveCells(srcSheetRaw, this, moveRelations, false, operator);\n\n this._xsheetDispatch(srcSheetRaw);\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'MOVE',\n srcSheetId: srcSheetRaw.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n moveRelations,\n });\n }\n\n return this.refresh(true);\n }\n\n /**\n * Build MoveRelations from src area to dst area, skipping filtered rows.\n *\n * Layout of the returned array (processed in this order by _moveCells):\n * 1. Entries where [0] is a newly-generated ID — these fill the vacated src cells (processed last in forward order)\n * 2. Entries where [0] is a src address and [1] is a dst address — the actual moves (processed first in forward order, descending)\n * Entries whose [1] is an existing ID mean the destination cell is displaced/overflowed and\n * is no longer addressable; on forward pass they are skipped; on reverse pass the ID is written back.\n */\n /** @internal */\n private _createMoveRelations(srcSheet: Sheet, src: AreaType, dstSheet: Sheet, dst: AreaType): MoveRelations {\n const { top: srcTop, left: srcLeft, bottom: srcBottom, right: srcRight } = src;\n const { top: dstTop, left: dstLeft } = dst;\n\n const dstNumRows = dstSheet.numRows;\n const dstNumCols = dstSheet.numCols;\n\n // Collect visible (non-filtered) rows for src\n const srcVisibleRows: number[] = [];\n for (let y = srcTop; y <= srcBottom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const srcNumCols = srcRight - srcLeft + 1;\n const srcNumVisibleRows = srcVisibleRows.length;\n\n // Collect corresponding visible dst rows (skip filtered rows in dst, matching count)\n const dstVisibleRows: number[] = [];\n {\n let di = 0;\n let y = dstTop;\n while (di < srcNumVisibleRows) {\n if (!dstSheet.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n di++;\n }\n y++;\n }\n }\n\n // Build sets for quick lookup\n const srcCellSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n for (let j = 0; j < srcNumCols; j++) {\n srcCellSet.add(p2a({ y: srcVisibleRows[di], x: srcLeft + j }));\n }\n }\n\n const dstAddrSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const dstX = dstLeft + j;\n if (dstY <= dstNumRows && dstX <= dstNumCols) {\n dstAddrSet.add(p2a({ y: dstY, x: dstX }));\n }\n }\n }\n\n const moveRelations: MoveRelations = [];\n\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const srcY = srcVisibleRows[di];\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const srcX = srcLeft + j;\n const dstX = dstLeft + j;\n const srcAddr = p2a({ y: srcY, x: srcX });\n const isDstInBounds = dstY <= dstNumRows && dstX <= dstNumCols;\n const dstAddr = isDstInBounds ? p2a({ y: dstY, x: dstX }) : undefined;\n\n let newId: Id | undefined;\n // Vacate: src cell is NOT covered by any dst write in the same sheet overlap\n if (!(srcSheet === dstSheet && dstAddrSet.has(srcAddr))) {\n newId = srcSheet._generateId();\n }\n\n let lostId: Id | undefined;\n if (isDstInBounds) {\n // Displace: dst cell is overwritten but was NOT part of the src area being moved\n if (!(srcSheet === dstSheet && srcCellSet.has(dstAddr!))) {\n const existingId = dstSheet.getId({ y: dstY, x: dstX });\n if (existingId != null) {\n lostId = existingId;\n }\n }\n } else {\n // Overflow: the src ID itself is pushed out of bounds and lost\n const srcId = srcSheet.getId({ y: srcY, x: srcX });\n if (srcId != null) {\n lostId = srcId;\n }\n }\n\n const srcCell = srcSheet.getCell({ y: srcY, x: srcX }, { resolution: 'SYSTEM' });\n const dstCell = isDstInBounds ? dstSheet.getCell({ y: dstY, x: dstX }, { resolution: 'SYSTEM' }) : undefined;\n\n moveRelations.push({\n before: srcCell?.policy,\n after: dstCell?.policy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n });\n }\n }\n\n return moveRelations;\n }\n\n get defaultPolicy(): PolicyType {\n return this.policies[DEFAULT_POLICY_NAME] ?? nonePolicy;\n }\n\n /**\n * Apply (or reverse) a MoveRelations list.\n *\n * Forward (reverse=false): process descending — actual ID moves happen bottom-up so\n * earlier entries don't clobber later ones; vacate entries (at front of array) are\n * applied last.\n * Reverse (reverse=true): process ascending — restores IDs in the natural order.\n *\n * On forward pass: applies policy, collects diffBefore, runs ReferencePreserver.\n * On reverse pass: only moves IDs (caller is responsible for applyDiff(diffBefore)).\n */\n /** @internal */\n private _moveCells(\n srcSheet: Sheet,\n dstSheet: Sheet,\n moveRelations: MoveRelations,\n reverse: boolean,\n operator: OperatorType = 'SYSTEM',\n ): { diffBefore: CellsByIdType; diffAfter: CellsByIdType } {\n const diffBefore: CellsByIdType = {};\n const preserver = new ReferencePreserver(dstSheet);\n\n const wireWrites: CellsByIdType = {};\n const idWritesSrc: Array<{ y: Y; x: X; id: Id }> = [];\n const idWritesDst: Array<{ y: Y; x: X; id: Id }> = [];\n\n // Forward pass: collect diffs and temporary buffer writes\n if (!reverse) {\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n const srcPoint = a2p(srcAddr);\n const srcId = srcSheet.getId(srcPoint);\n const dstPoint = dstAddr != null ? a2p(dstAddr) : undefined;\n const dstId = dstPoint != null ? dstSheet.getId(dstPoint) : undefined;\n\n const srcCell = srcId != null ? srcSheet.registry.data[srcId] : undefined;\n const dstCell = dstId != null ? dstSheet.registry.data[dstId] : undefined;\n\n if (\n operator === 'USER' &&\n (operation.hasOperation(srcCell?.prevention, operation.MoveFrom) ||\n operation.hasOperation(dstCell?.prevention, operation.MoveTo))\n ) {\n continue;\n }\n\n // Vacate\n if (newId != null) {\n const policyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const policy = srcSheet.policies[policyKey] ?? srcSheet.defaultPolicy;\n const restricted = policy.select({\n sheet: srcSheet,\n point: srcPoint,\n next: { value: null },\n current: srcCell,\n operation: operation.MoveFrom,\n });\n\n wireWrites[newId] = {\n ...restricted,\n policy: beforePolicy,\n };\n this.registry.systems[newId] = { id: newId, sheetId: srcSheet.id, changedTime: Date.now() };\n idWritesSrc.push({ y: srcPoint.y, x: srcPoint.x, id: newId });\n }\n\n // Actual Move\n if (dstId != null && dstPoint != null && dstAddr != null) {\n const dstPolicyKey = afterPolicy || DEFAULT_POLICY_NAME;\n const srcPolicyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const dstPolicyVal = dstSheet.policies[dstPolicyKey] ?? dstSheet.defaultPolicy;\n const srcPolicyVal = srcSheet.policies[srcPolicyKey] ?? srcSheet.defaultPolicy;\n const isSrcWinner = srcPolicyVal.priority > dstPolicyVal.priority;\n const policy = isSrcWinner ? srcPolicyVal : dstPolicyVal;\n\n const restricted = policy.select({\n sheet: dstSheet,\n point: dstPoint,\n next: srcCell,\n current: dstCell,\n operation: operation.MoveTo,\n });\n\n if (restricted) {\n diffBefore[srcId] = srcCell ?? {};\n wireWrites[srcId] = {\n ...srcCell,\n ...restricted,\n policy: isSrcWinner ? beforePolicy : afterPolicy,\n };\n }\n if (srcCell != null) {\n const srcSys = this.registry.systems[srcId];\n if (srcSys) {\n srcSys.changedTime = Date.now();\n }\n }\n\n idWritesDst.push({ y: dstPoint.y, x: dstPoint.x, id: srcId });\n }\n }\n } else {\n // Reverse pass: collect id buffer writes (no registry.data modification)\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n // Move ID that landed at dst back to src\n if (dstAddr != null) {\n const toPoint = a2p(dstAddr);\n const movedId = dstSheet.getId(toPoint);\n if (movedId != null) {\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: movedId });\n }\n }\n\n // Restore lost ID to where it was lost from\n if (lostId != null) {\n if (dstAddr != null) {\n // It was displaced from dst\n const toPoint = a2p(dstAddr);\n idWritesDst.push({ y: toPoint.y, x: toPoint.x, id: lostId });\n } else {\n // It overflowed from src\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: lostId });\n }\n }\n }\n }\n\n // Snapshot idMatrix before flush\n const srcSnapshot = !reverse ? srcSheet.idMatrix.flat() : null;\n const dstSnapshot = !reverse && srcSheet !== dstSheet ? dstSheet.idMatrix.flat() : null;\n\n // Flush registry.data writes first\n Object.assign(this.registry.data, wireWrites);\n // Then flush idMatrix writes\n for (const { y, x, id } of idWritesSrc) {\n srcSheet.idMatrix[y][x] = id;\n }\n for (const { y, x, id } of idWritesDst) {\n dstSheet.idMatrix[y][x] = id;\n }\n\n // Update lastChangedAddresses\n const changedAddresses: Address[] = moveRelations.filter((r) => r.dst != null).map((r) => r.dst as Address);\n const srcAddresses: Address[] = moveRelations.map((r) => r.src);\n\n if (srcSheet === dstSheet) {\n dstSheet.lastChangedAddresses = [...new Set([...srcAddresses, ...changedAddresses])];\n } else {\n dstSheet.lastChangedAddresses = changedAddresses;\n srcSheet.lastChangedAddresses = srcAddresses;\n }\n\n if (!reverse) {\n preserver.buildMap(srcSnapshot!.flat(), srcSheet.idMatrix.flat());\n if (srcSheet !== dstSheet) {\n preserver.buildMap(dstSnapshot!.flat(), dstSheet.idMatrix.flat());\n }\n const resolvedDiff = preserver.resolveDependents('move');\n Object.assign(diffBefore, resolvedDiff);\n }\n\n return { diffBefore, diffAfter: {} };\n }\n\n public copy({\n srcSheet = this,\n src,\n dst,\n onlyValue = false,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: MoveProps & { onlyValue?: boolean }) {\n const isXSheet = srcSheet !== this;\n const { top: topFrom, left: leftFrom, bottom: bottomFrom, right: rightFrom } = src;\n const { top: topTo, left: leftTo, bottom: bottomTo, right: rightTo } = dst;\n const diff: CellsByAddressType = {};\n const changedTime = Date.now();\n\n // Build list of visible (non-filtered) rows for src and dst\n const srcVisibleRows: number[] = [];\n for (let y = topFrom; y <= bottomFrom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const dstVisibleRows: number[] = [];\n for (let y = topTo; y <= bottomTo; y++) {\n if (y > this.numRows) {\n continue;\n }\n if (!this.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n }\n }\n\n const srcNumVisibleRows = srcVisibleRows.length;\n const srcNumCols = rightFrom - leftFrom + 1;\n const dstNumCols = rightTo - leftTo + 1;\n\n for (let di = 0; di < dstVisibleRows.length; di++) {\n const toY = dstVisibleRows[di];\n const fromY = srcVisibleRows[di % srcNumVisibleRows];\n for (let j = 0; j <= dstNumCols - 1; j++) {\n const toX = leftTo + j;\n if (toX > this.numCols) {\n continue;\n }\n const fromX = leftFrom + (j % srcNumCols);\n const slideY = isXSheet ? 0 : toY - fromY;\n const slideX = isXSheet ? 0 : toX - fromX;\n const cell: CellType = {\n ...srcSheet.getCell({ y: fromY, x: fromX }, { resolution: 'SYSTEM' }),\n };\n const dstPoint = { y: toY, x: toX };\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n const dstPolicy = this.getPolicy(dstPoint);\n const srcPoint = { y: fromY, x: fromX };\n const srcPolicy = srcSheet.getPolicy(srcPoint);\n const srcCell = srcSheet.getCell(srcPoint, { resolution: 'SYSTEM' });\n\n const isSrcWinner = srcPolicy.priority > dstPolicy.priority;\n cell.policy = isSrcWinner ? srcCell?.policy : dstCell?.policy;\n const dstIdForClear = this.getId(dstPoint);\n this.clearDependencies(dstIdForClear);\n const value =\n (cell?.formulaEnabled ?? true)\n ? this.processFormula(cell?.value, {\n dependency: dstIdForClear,\n slideY,\n slideX,\n })\n : cell?.value;\n const dstId = this.getId(dstPoint);\n const dstSys = this.registry.systems[dstId];\n if (dstSys != null) {\n dstSys.changedTime = changedTime;\n }\n const address = p2a(dstPoint);\n if (onlyValue) {\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n cell.style = dstCell?.style;\n cell.justifyContent = dstCell?.justifyContent;\n cell.alignItems = dstCell?.alignItems;\n }\n diff[address] = { ...cell, value };\n }\n }\n return this.update({\n diff,\n partial: false,\n operator,\n operation: operation.Copy,\n undoReflection,\n redoReflection,\n });\n }\n\n public getPolicy(point: PointType): PolicyType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' });\n if (cell?.policy == null) {\n return this.defaultPolicy;\n }\n return this.policies[cell.policy] ?? this.defaultPolicy;\n }\n\n /** @internal */\n private _update({\n diff,\n partial = true,\n updateChangedTime = true,\n ignoreFields = ['label'],\n operator = 'SYSTEM',\n operation: op = operation.Update,\n formulaIdentify = true,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n ignoreFields?: CellField[];\n operator?: OperatorType;\n operation?: OperationType;\n formulaIdentify?: boolean;\n }) {\n const diffBefore: CellsByIdType = {};\n const diffAfter: CellsByIdType = {};\n const changedAddresses: Address[] = [];\n const changedTime = Date.now();\n\n let resized = false;\n Object.keys(diff).forEach((address) => {\n const point = a2p(address);\n const id = this.getId(point);\n const current = this.registry.data[id];\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Update)) {\n return;\n }\n\n let next: Record<string, any> = { ...diff[address] };\n\n if (formulaIdentify) {\n const formulaEnabled = next.formulaEnabled ?? current?.formulaEnabled ?? true;\n if (formulaEnabled) {\n this.clearDependencies(id);\n next.value = this.processFormula(next.value, { dependency: id });\n }\n }\n ignoreFields.forEach((key) => {\n next[key] = current?.[key];\n });\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Write)) {\n delete next.value;\n }\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Style)) {\n delete next?.style?.justifyContent;\n delete next?.style?.alignItems;\n }\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Resize)) {\n delete next?.style?.width;\n delete next?.style?.height;\n }\n if (next.width != null || next.height != null) {\n resized = true;\n }\n diffBefore[id] = current ?? {};\n\n const policy = this.policies[current?.policy || DEFAULT_POLICY_NAME] ?? this.defaultPolicy;\n const p = policy.select({\n sheet: this,\n point,\n next,\n current,\n operation: op,\n });\n next = { ...p };\n if (updateChangedTime) {\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = changedTime;\n }\n }\n if (partial) {\n const merged = { ...current, ...next };\n this.registry.data[id] = merged;\n diffAfter[id] = merged;\n } else {\n this.registry.data[id] = next;\n diffAfter[id] = next;\n }\n changedAddresses.push(address);\n });\n\n // Store the changed addresses for retrieval via getLastChangedAddresses()\n this.lastChangedAddresses = changedAddresses;\n\n //this.clearSolvedCaches();\n return {\n diffBefore,\n diffAfter,\n resized,\n };\n }\n\n public update({\n diff,\n partial = true,\n updateChangedTime = true,\n historicize = true,\n operator = 'SYSTEM',\n operation: op = operation.Update,\n ignoreFields,\n undoReflection,\n redoReflection,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n operation?: OperationType;\n ignoreFields?: CellField[];\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { diffBefore, diffAfter, resized } = this._update({\n diff,\n partial,\n operator,\n operation: op,\n updateChangedTime,\n ...(ignoreFields != null ? { ignoreFields } : {}),\n });\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n partial,\n });\n }\n return this.refresh(false, resized);\n }\n\n /** @internal */\n public writeRawCellMatrix({\n point,\n matrix,\n updateChangedTime = true,\n historicize = true,\n onlyValue = false,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n point: PointType;\n matrix: MatrixType<RawCellType>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n onlyValue?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { y: baseY, x: baseX } = point;\n const diff: CellsByAddressType = {};\n\n // Build list of visible (non-filtered) rows starting from baseY\n // Map src row index (i) -> dst y, skipping filtered rows\n let srcRowIndex = 0;\n let dstY = baseY;\n while (srcRowIndex < matrix.length) {\n if (dstY > this.bottom) {\n break;\n }\n if (this.isRowFiltered(dstY)) {\n dstY++;\n continue;\n }\n const cells = matrix[srcRowIndex];\n cells.forEach((newCell, j) => {\n const x = baseX + j;\n if (x > this.right) {\n return;\n }\n const dstPoint = { y: dstY, x };\n const parsed = this.parse(dstPoint, newCell.value ?? '');\n parsed.style = { ...newCell.style, ...parsed.style };\n if (onlyValue) {\n const currentCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n parsed.style = currentCell?.style;\n parsed.justifyContent = currentCell?.justifyContent;\n parsed.alignItems = currentCell?.alignItems;\n }\n diff[p2a(dstPoint)] = parsed;\n });\n srcRowIndex++;\n dstY++;\n }\n return this.update({\n diff,\n partial: true,\n updateChangedTime,\n historicize,\n operator,\n operation: operation.Write,\n undoReflection,\n redoReflection,\n });\n }\n\n public writeMatrix(props: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const matrixWithStyle: MatrixType<RawCellType> = props.matrix.map((row) => row.map((value) => ({ value })));\n return this.writeRawCellMatrix({ ...props, matrix: matrixWithStyle });\n }\n\n public write(props: {\n point: PointType;\n value: string;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { point, value } = props;\n const parsed = this.parse(point, value ?? '');\n const current = this.getCell(point, { resolution: 'RAW' });\n if ((current?.value ?? null) === parsed.value) {\n // no change (treat undefined and null as equivalent empty values)\n return this;\n }\n const diff = { [p2a(point)]: parsed };\n return this.update({\n ...props,\n diff,\n partial: true,\n operation: operation.Write,\n });\n }\n\n public insertRows({\n y,\n numRows,\n baseY,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumRows !== -1 && this.numRows + numRows > this.maxNumRows) {\n console.error(`Rows are limited to ${this.maxNumRows}.`);\n return this;\n }\n const numCols = this.numCols;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i < numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j <= numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: baseY, x: j }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.idMatrix.splice(y, 0, ...rows);\n this.area.bottom += numRows;\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n y,\n numRows,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertRows) {\n const cloned = this.clone();\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n this.registry.onInsertRows({ sheet: cloned, y, numRows });\n }\n return this.refresh(true, true);\n }\n public removeRows({\n y,\n numRows,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumRows !== -1 && this.numRows - numRows < this.minNumRows) {\n console.error(`At least ${this.minNumRows} row(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const ys: number[] = [];\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let yi = y; yi < y + numRows; yi++) {\n const cell = this.getCell({ y: yi, x: 0 }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveRows)) {\n console.warn(`Cannot delete row ${yi}.`);\n return this;\n }\n for (let xi = 1; xi <= this.numCols; xi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi + numRows, x: xi });\n }\n ys.unshift(yi);\n }\n const deleted: MatrixType = [];\n ys.forEach((y) => {\n const row = this.idMatrix.splice(y, 1);\n deleted.unshift(row[0]);\n });\n this.area.bottom -= ys.length;\n\n const diffBefore = preserver.resolveDependents('removeRows');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n ys: ys.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveRows) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n this.registry.onRemoveRows({ sheet: cloned, ys: ys.reverse() });\n }\n return this.refresh(true, true);\n }\n\n public insertCols({\n x,\n numCols,\n baseX,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumCols !== -1 && this.numCols + numCols > this.maxNumCols) {\n console.error(`Columns are limited to ${this.maxNumCols}.`);\n return this;\n }\n const numRows = this.numRows;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i <= numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j < numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: i, x: baseX }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this.idMatrix[i].splice(x, 0, id);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.area.right += numCols;\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n x,\n numCols,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertCols) {\n const cloned = this.clone();\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n this.registry.onInsertCols({ sheet: cloned, x, numCols });\n }\n return this.refresh(true, true);\n }\n public removeCols({\n x,\n numCols,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumCols !== -1 && this.numCols - numCols < this.minNumCols) {\n console.error(`At least ${this.minNumCols} column(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const xs: number[] = [];\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let xi = x; xi < x + numCols; xi++) {\n const cell = this.getCell({ y: 0, x: xi }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveCols)) {\n console.warn(`Cannot delete col ${xi}.`);\n continue;\n }\n for (let yi = 1; yi <= this.numRows; yi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi, x: xi + numCols });\n }\n xs.unshift(xi);\n }\n\n const deleted: MatrixType = [];\n this.idMatrix.forEach((row) => {\n const deleting: Ids = [];\n deleted.push(deleting);\n // reverse and delete\n xs.forEach((x) => {\n deleting.unshift(...row.splice(x, 1));\n });\n });\n this.area.right -= xs.length;\n const diffBefore = preserver.resolveDependents('removeCols');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n xs: xs.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveCols) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n this.registry.onRemoveCols({ sheet: cloned, xs: xs.reverse() });\n }\n return this.refresh(true, true);\n }\n /** @internal */\n public histories() {\n return [...this.registry.histories];\n }\n /** @internal */\n public historyIndex() {\n return this.registry.historyIndex;\n }\n /** @internal */\n public historySize() {\n return this.registry.histories.length;\n }\n /** @internal */\n public getHistoryLimit() {\n return this.registry.historyLimit;\n }\n\n /** @internal */\n public parse(point: PointType, value: any): CellType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' }) ?? {};\n const policy = this.getPolicy(point);\n return policy.deserializeValue(value, cell);\n }\n\n /** @internal */\n public render(props: RenderProps) {\n const { point, apply } = props;\n const at = this.getId(point);\n const policy = this.getPolicy(point);\n return policy.render({ sheet: this, point, apply, value: undefined });\n }\n\n public getSerializedValue({\n point,\n cell,\n resolution = 'RESOLVED',\n }: {\n point: PointType;\n cell?: CellType;\n resolution?: Resolution;\n }) {\n if (cell == null) {\n // Use raw cell from registry so cell.value is the original formula string.\n // getCell(raise=false) would replace cell.value with undefined, losing the formula.\n const id = this.idMatrix[point.y]?.[point.x];\n cell = id != null ? this.registry.data[id] : undefined;\n }\n if (cell == null) {\n return '';\n }\n const policy = this.getPolicy(point);\n const raw = cell.value;\n\n if (typeof raw === 'string' && raw[0] === '=') {\n if (resolution === 'SYSTEM') {\n return raw; // do not evaluate system references\n }\n if (resolution === 'RAW') {\n const lexer = new Lexer(raw.substring(1));\n lexer.tokenize();\n return '=' + lexer.display({ sheet: this });\n }\n try {\n const id = this.idMatrix[point.y]?.[point.x];\n const solved = solveFormula({ value: raw, sheet: this, point, raise: true, resolution, at: id });\n const value = stripSheet({ value: solved, raise: false });\n return policy.serialize({ value, cell, sheet: this, point });\n } catch (e) {\n return policy.serialize({ value: e, cell, sheet: this, point });\n }\n }\n return policy.serialize({ value: raw, cell, sheet: this, point });\n }\n\n /** @internal */\n public trim(area: AreaType): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n copied.area = area;\n // this causes RangeError on circular reference(maximum call stack size exceeded)\n // copied.solvedCaches = {};\n return copied;\n }\n\n /**\n * Solve all formulas in this sheet and return a 2D matrix of resolved values.\n * @internal\n */\n public solve({ raise = false, at }: { raise?: boolean; at: Id }): any[][] {\n return solveSheet({ sheet: this, raise, at });\n }\n\n /**\n * Collapse this sheet to a scalar (top-left cell value).\n * @internal\n */\n public strip({ raise = false, at }: { raise?: boolean; at?: Id }): any {\n return stripSheet({ value: this, raise, at });\n }\n\n /** @internal */\n private _applyDiff(diff: CellsByIdType = {}, partial = true) {\n const ids = Object.keys(diff);\n ids.forEach((id) => {\n const cell = diff[id] ?? {};\n let merged: CellType;\n if (partial) {\n merged = { ...this.registry.data[id] };\n (Object.keys(cell) as (keyof CellType)[]).forEach((key) => {\n if (cell[key] === undefined) {\n delete merged[key];\n } else {\n (merged as any)[key] = cell[key];\n }\n });\n } else {\n merged = { ...cell };\n }\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = Date.now();\n }\n this.registry.data[id] = merged;\n this.clearDependencies(id);\n this.processFormula(merged.value, { dependency: id });\n });\n this._warmAddressCaches();\n const addresses: Address[] = [];\n for (const id of ids) {\n const address = this.getAddressById(id);\n if (address) {\n addresses.push(address);\n }\n }\n this.lastChangedAddresses = addresses;\n }\n\n public undo() {\n if (this.registry.historyIndex < 0) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex--];\n history.applyed = false;\n this.registry.currentHistory = this.registry.histories[this.registry.historyIndex];\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffBefore, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.splice(history.y, rows);\n dstSheet.area.bottom -= rows;\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.forEach((row) => {\n row.splice(history.x, cols);\n });\n dstSheet.area.right -= cols;\n break;\n }\n case 'REMOVE_ROWS': {\n const { ys, deleted } = history;\n ys.forEach((y, i) => {\n dstSheet.idMatrix.splice(y, 0, deleted[i]);\n });\n dstSheet.area.bottom += ys.length;\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'REMOVE_COLS': {\n const { xs, deleted } = history;\n dstSheet.idMatrix.forEach((row, i) => {\n for (let j = 0; j < xs.length; j++) {\n row.splice(xs[j], 0, deleted[i][j]);\n }\n });\n dstSheet.area.right += xs.length;\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, true);\n }\n const movedAddresses = dstSheet.lastChangedAddresses;\n dstSheet._applyDiff(history.diffBefore, false);\n dstSheet.lastChangedAddresses = [...new Set([...movedAddresses, ...dstSheet.lastChangedAddresses])];\n break;\n }\n case 'SORT_ROWS': {\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, true);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: StoreType) => {\n sheetRef.current?.registry.transmit(history.undoReflection?.transmit);\n },\n };\n }\n\n public redo() {\n if (this.registry.historyIndex + 1 >= this.registry.histories.length) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[++this.registry.historyIndex];\n history.applyed = true;\n this.registry.currentHistory = history;\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffAfter, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.splice(history.y, 0, ...history.idMatrix);\n dstSheet.area.bottom += rows;\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.map((row, i) => {\n row.splice(history.x, 0, ...history.idMatrix[i]);\n });\n dstSheet.area.right += cols;\n break;\n }\n case 'REMOVE_ROWS': {\n dstSheet.removeRows({\n y: history.ys[0],\n numRows: history.ys.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'REMOVE_COLS': {\n dstSheet.removeCols({\n x: history.xs[0],\n numCols: history.xs.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, false);\n }\n break;\n }\n case 'SORT_ROWS': {\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, false);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: StoreType) => {\n sheetRef.current?.registry.transmit(history.redoReflection?.transmit);\n },\n };\n }\n /** @internal */\n public getFunctionByName(name: string) {\n return this.registry.functions[name];\n }\n\n /** @internal */\n public clearDependencies(id: Id): void {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n if (sys != null) {\n sys.dependencies = new Set();\n }\n }\n\n /** @internal */\n public addDependency(id: Id, dependency: Id): void {\n const sys = ensureSys(this.registry, id);\n if (sys.dependents == null) {\n sys.dependents = new Set();\n }\n sys.dependents.add(dependency);\n const depSys = ensureSys(this.registry, dependency);\n if (depSys.dependencies == null) {\n depSys.dependencies = new Set();\n }\n depSys.dependencies.add(id);\n }\n\n /** @internal */\n public getSolvedCache(point: PointType): [boolean, any] {\n const id = this.getId(point);\n return [this.registry.solvedCaches.has(id), this.registry.solvedCaches.get(id)];\n }\n /** @internal */\n public setSolvingCache(point: PointType) {\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, SOLVING);\n ensureSys(this.registry, id, { tmpAsyncCaches: {} });\n }\n\n /** @internal */\n public finishSolvedCache(point: PointType, value: any) {\n if (SOLVING.is(value)) {\n return;\n }\n\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, value);\n\n const cell = this.registry.data[id];\n if (cell == null) {\n return;\n }\n const sys = this.registry.systems[id];\n const tmp = sys?.tmpAsyncCaches;\n\n if (tmp != null) {\n if (Object.keys(tmp).length > 0) {\n cell.asyncCaches = tmp;\n } else {\n delete cell.asyncCaches;\n }\n delete sys!.tmpAsyncCaches;\n }\n }\n\n /** @internal */\n public clearSolvedCaches() {\n this.registry.solvedCaches.clear();\n for (const id of this.registry.lastSpilledTargetIds) {\n const sys = this.registry.systems[id];\n if (sys?.spilledFrom != null) {\n delete sys.spilledFrom;\n }\n }\n this.registry.lastSpilledTargetIds.clear();\n }\n\n /**\n * Spill a 2D matrix of values starting from the origin cell.\n * The origin cell receives matrix[0][0] and adjacent cells receive spill values in solvedCaches.\n * For a 1×1 matrix, no spill occurs — the single value is cached directly.\n * Throws FormulaError('#REF!') if the spill range is obstructed.\n *\n * @param origin The anchor cell that produced the spill.\n * @param matrix The 2D array of resolved scalar values.\n * @returns The top-left value (matrix[0][0]).\n * @internal\n */\n public spill(origin: PointType, matrix: any[][]): any {\n const numRows = matrix.length;\n const numCols = numRows > 0 ? matrix[0].length : 0;\n\n // Single cell result (1×1) — no spill needed\n if (numRows <= 1 && numCols <= 1) {\n return matrix[0]?.[0];\n }\n\n // Multi-cell result — check for obstructions\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n if (i === 0 && j === 0) {\n continue;\n }\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n const address = p2a(targetPoint);\n if (targetId == null) {\n console.warn(`Spill target ${address} is out of bounds.`);\n continue;\n }\n const targetCell = this.registry.data[targetId];\n if (targetCell?.value != null && targetCell.value !== '') {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because it would overwrite data in ${address}.`,\n );\n }\n // If solvedCaches already has an entry for this cell, another formula\n // (including another spill) has already written here — treat as obstruction.\n if (this.registry.solvedCaches.has(targetId)) {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because ${address} is already occupied by another formula.`,\n );\n }\n }\n }\n\n // All clear — write values into solvedCaches\n const originId = this.getId(origin);\n const spilledAddresses: Address[] = [];\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n if (targetId == null) {\n continue;\n }\n this.finishSolvedCache(targetPoint, matrix[i][j]);\n if (i !== 0 || j !== 0) {\n spilledAddresses.push(p2a(targetPoint));\n // Mark target cell as spilled from the origin formula cell\n if (originId != null) {\n const targetCell = this.registry.data[targetId];\n if (targetCell != null) {\n const sys = ensureSys(this.registry, targetId, {});\n sys.spilledFrom = p2a(origin);\n this.registry.lastSpilledTargetIds.add(targetId);\n }\n }\n }\n }\n }\n\n return matrix[0][0];\n }\n\n /** @internal */\n public sheetPrefix(omit = false) {\n if (omit) {\n return '';\n }\n return toSheetPrefix(this.name);\n }\n /** @internal */\n public rangeToArea(range: string) {\n const cells = range.split(':');\n let [start, end] = cells;\n if (start.match(/[a-zA-Z]$/)) {\n start += '1';\n }\n if (start.match(/^[1-9]/)) {\n start = `A${start}`;\n }\n if (end?.match(/[a-zA-Z]$/)) {\n end += this.bottom;\n }\n if (end?.match(/^[1-9]/)) {\n end = `${x2c(this.right)}${end}`;\n }\n const { y: top, x: left } = a2p(start);\n const { y: bottom, x: right } = a2p(end || start);\n return {\n top: Math.abs(top),\n left: Math.abs(left),\n bottom: Math.abs(bottom),\n right: Math.abs(right),\n };\n }\n\n get __raw__(): Sheet {\n return this;\n }\n\n get shape() {\n return areaShape(this.area);\n }\n get hasSingleCell() {\n const shape = this.shape;\n return shape.rows === 1 && shape.cols === 1;\n }\n get currentVersion() {\n return this.version;\n }\n}\n","import { Pending, SOLVING, Spilling } from '../sentinels';\nimport { Sheet } from '../lib/sheet';\nimport type { Id, MatrixType, PointType, Resolution } from '../types';\nimport { Lexer, Parser } from './evaluator';\nimport { FormulaError } from './formula-error';\n\nexport type SolveOptions = {\n raise?: boolean;\n resolution?: Resolution;\n};\n\ntype SolveFormulaProps = {\n value: any;\n sheet: Sheet;\n point: PointType;\n raise?: boolean;\n resolution?: Resolution;\n at?: Id;\n};\n\n/**\n * Evaluates a single cell value (formula or literal) within the context of a sheet.\n * Handles caching, circular reference detection, spilling, and async pending states.\n * Returns the resolved scalar value (or error) for the given cell.\n */\nexport const solveFormula = ({ value, sheet, point, raise = true, resolution = 'RESOLVED', at }: SolveFormulaProps) => {\n const [hit, cache] = sheet.getSolvedCache(point);\n if (hit && value == null && !SOLVING.is(cache)) {\n // spilled value\n return cache;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n if (resolution === 'SYSTEM') {\n return value;\n }\n if (value.charAt(0) === \"'\") {\n return resolution === 'RAW' ? value : value.substring(1);\n }\n if (value.charAt(0) !== '=') {\n return value;\n }\n if (resolution === 'RAW') {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n return '=' + lexer.display({ sheet });\n }\n\n let solved: any = value;\n if (hit && !SOLVING.is(cache)) {\n solved = cache;\n } else {\n try {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n const parser = new Parser(lexer.tokens);\n const expr = parser.build();\n solved = expr?.evaluate?.({ sheet });\n } catch (e) {\n if (raise) {\n sheet.finishSolvedCache(point, e);\n throw e;\n }\n return e;\n }\n }\n\n if (resolution === 'RESOLVED' && solved instanceof Sheet) {\n // Unwrap to scalar (top-left cell of the sheet's area).\n // NOTE: We intentionally call solveSheet directly here instead of stripSheet,\n // to avoid a three-way cycle: solveFormula → stripSheet → solveSheet → solveFormula.\n // The mutual recursion between solveFormula and solveSheet is unavoidable by design,\n // but routing through stripSheet would make the call graph harder to follow and reason about.\n solved = solveSheet({ sheet: solved, raise, at })[0]?.[0];\n }\n // 'EVALUATED' resolution: keep Sheet objects intact (range formulas return Sheet, not scalar).\n\n if (Spilling.is(solved)) {\n solved = sheet.spill(point, solved.matrix);\n } else {\n sheet.finishSolvedCache(point, solved);\n }\n if (Pending.is(solved)) {\n sheet.finishSolvedCache(point, solved);\n }\n return solved;\n};\n\nexport type SolveSheetProps = {\n sheet: Sheet;\n raise?: boolean;\n at?: Id;\n};\n\n/**\n * Evaluates all cells in a Sheet and returns the results as a 2D array (MatrixType).\n * Each cell formula is resolved in order, with caching to avoid redundant computation.\n * Use this when you need the full evaluated contents of a range.\n */\nexport const solveSheet = ({ sheet, raise = true, at }: SolveSheetProps): MatrixType => {\n const area = sheet.area;\n const matrix = sheet._toValueMatrix({ area, at, resolution: 'SYSTEM' });\n return matrix.map((row, i) => {\n const y = area.top + i;\n return row.map((value, j) => {\n const x = area.left + j;\n const point = { y, x };\n const [hit, cache] = sheet.getSolvedCache(point);\n try {\n if (SOLVING.is(cache)) {\n throw new FormulaError('#REF!', 'References are circulating.', new Error(value as string));\n } else if (Pending.is(cache)) {\n return cache;\n } else if (FormulaError.is(cache)) {\n throw cache;\n } else if (cache != null) {\n return cache;\n }\n sheet.setSolvingCache(point);\n const solved = solveFormula({ value, sheet, point, raise, at, resolution: 'RESOLVED' });\n sheet.finishSolvedCache(point, solved);\n return solved;\n } catch (e) {\n sheet.finishSolvedCache(point, e);\n if (raise) {\n throw e;\n }\n return e;\n }\n });\n });\n};\n\nexport type StripSheetProps = {\n value: any;\n at?: Id;\n raise?: boolean;\n};\n\nexport const stripSheet = ({ value, at, raise = true }: StripSheetProps): any => {\n while (value instanceof Sheet) {\n value = solveSheet({ sheet: value, raise, at })[0]?.[0];\n }\n return value;\n};\n","import { Pending, Sentinel, Spilling } from '../../sentinels';\nimport { FormulaError } from '../formula-error';\nimport { ensureSys, setAsyncCache } from '../../lib/cell';\nimport type { Registry } from '../../lib/book';\nimport type { CellType, Id, PointType } from '../../types';\nimport type { Sheet } from '../../lib/sheet';\nimport { toValueMatrix } from '../../lib/sheet_utils';\n\n/**\n * Sentinel value to distinguish cache miss from user-returned undefined/null.\n * Since user functions can return undefined or null, we need a special marker\n * to indicate \"no cache entry found\" vs \"cache entry is undefined\".\n */\nexport const asyncCacheMiss = new Sentinel('asyncCacheMiss');\n\n/** Returns true if any element of `args` is a Pending sentinel. */\nexport const hasPendingArg = (args: any[]): boolean => {\n return args.some((v) => Pending.is(v));\n};\n\nconst isSheet = (value: any): value is Sheet => {\n return value?.__gsType === 'Sheet';\n};\n\n/**\n * Recursively check whether any value in the structure is a Pending sentinel.\n * Handles flat values, nested arrays, and Sheet objects (via getFieldMatrix).\n */\nexport const hasDeepPending = (values: any[], at: Id): boolean => {\n for (const v of values) {\n if (Pending.is(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n if (hasDeepPending(v, at)) {\n return true;\n }\n }\n if (Spilling.is(v)) {\n if (hasDeepPending(v.matrix, at)) {\n return true;\n }\n }\n if (isSheet(v)) {\n if (hasDeepPending(v._toValueMatrix({ at }), at)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * cyrb53 – a fast, high-quality 53-bit string hash.\n * Returns a non-negative integer that fits safely in a JS Number.\n */\nconst cyrb53 = (str: string, seed = 0): number => {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\n/**\n * Build a cache key from function name + hashed serialised arguments.\n *\n * Format: `funcName:length:hash1-hash2-...`\n * - length: byte length of the JSON-serialised args\n * - hash: cyrb53 hash of the JSON string, repeated hashPrecision times with different seeds\n *\n * When a Sheet appears as an argument its trimmed area is converted to a\n * value matrix (`any[][]`) via `getFieldMatrix()` so the key reflects the\n * actual cell values the function will operate on.\n */\nexport const buildAsyncCacheKey = (funcName: string, args: any[], hashPrecision: number = 1): string => {\n const argsJson = JSON.stringify(args, (_key, value) => {\n if (isSheet(value)) {\n return toValueMatrix(value);\n }\n if (Pending.is(value)) {\n return null;\n }\n return value;\n });\n const hashes = Array.from({ length: hashPrecision }, (_, i) => cyrb53(argsJson, i).toString(36));\n return `${funcName}:${argsJson.length}:${hashes.join('-')}`;\n};\n\n/**\n * Try to retrieve a cached or pending async result for the given cache key.\n *\n * Returns:\n * - Cached value if present, valid, and not expired\n * - Pending if there is an in-flight promise for this cell\n * - asyncCacheMiss if no cache/pending exists (distinguishes from user-returned undefined/null)\n */\nexport const getAsyncCache = (\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n useInflight: boolean = false,\n): any => {\n const registry = sheet.registry;\n const cell: CellType | undefined = registry.data[id];\n\n if (cell == null) {\n return asyncCacheMiss;\n }\n\n const sys = ensureSys(registry, id, { tmpAsyncCaches: {} });\n\n // Check for a cached result from a previous async run\n if (cell.asyncCaches != null) {\n const ac = cell.asyncCaches[key];\n if (ac != null) {\n // Check expiry\n if (ac.expireTime == null || Date.now() < ac.expireTime) {\n sys.tmpAsyncCaches![key] = ac;\n return ac.value;\n }\n // Expired — will not be copied to tmpAsyncCaches\n }\n }\n\n const compositeKey = `${id}:${key}`;\n\n // Check if there is already a pending promise for this cell+key\n if (registry.asyncPending.has(compositeKey)) {\n return registry.asyncPending.get(compositeKey)!;\n }\n\n // If useInflight is enabled, check for an in-flight promise with the same cache key\n if (useInflight && registry.asyncInflight?.has(key)) {\n const inflight = registry.asyncInflight.get(key)!;\n // Track for this cell+key to prevent duplicate `.then` attachment and correctly yield the pending sentinel\n registry.asyncPending.set(compositeKey, inflight.pending);\n\n // Chain to the shared promise to populate this cell's cache when it resolves\n inflight.pending.promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime: inflight.expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime: inflight.expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n });\n\n return inflight.pending;\n }\n\n return asyncCacheMiss;\n};\n\n/**\n * Handle an async (Promise) result returned by BaseFunction.main().\n *\n * Cache is stored per-cell in cell.asyncCache.\n * In-flight tracking uses Binding.asyncPending (keyed by cell ID).\n * If useInflight is true, also tracks by cache key in Binding.asyncInflight.\n *\n * Flow:\n * 1. If cell has asyncCache and the key matches (inputs unchanged) and not expired → return cached value\n * 2. If there is already an in-flight promise for this cell → return its Pending\n * 3. If useInflight is true and there is an in-flight promise for this key → return its Pending\n * 4. Otherwise start the async work, return a new Pending, and on completion\n * write the result into cell.asyncCache and trigger a re-render.\n *\n * @param ttlMilliseconds - Cache time-to-live in **milliseconds**. undefined = never expires.\n * @param useInflight - If true, reuse the same promise for matching cache keys across different cells.\n */\nexport const awaitAndSave = (\n promise: Promise<any>,\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n ttlMilliseconds?: number,\n useInflight: boolean = false,\n): Pending => {\n const registry = sheet.registry;\n\n // Compute expireTime from ttl (ms)\n const expireTime = ttlMilliseconds != null ? Date.now() + ttlMilliseconds : undefined;\n\n const compositeKey = `${id}:${key}`;\n\n // Start the async computation\n const pending = new Pending(promise);\n registry.asyncPending.set(compositeKey, pending);\n\n // If useInflight is enabled, also track by cache key\n if (useInflight) {\n if (!registry.asyncInflight) {\n registry.asyncInflight = new Map();\n }\n registry.asyncInflight.set(key, { pending, expireTime });\n }\n\n promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n // If useInflight was enabled, also remove from asyncInflight\n if (useInflight) {\n if (registry.asyncInflight) {\n registry.asyncInflight.delete(key);\n }\n }\n // Clear solvedCaches so dependent formulas re-evaluate\n registry.solvedCaches.clear();\n // Trigger re-render of all sheets\n registry.transmit();\n });\n\n return pending;\n};\n\n/**\n * Create a Pending sentinel that resolves immediately.\n * Used when an argument is already pending — the result is propagated.\n */\nexport const createPropagatedPending = (): Pending => {\n return new Pending(Promise.resolve());\n};\n","import { type Sheet } from '../../lib/sheet';\n\n/** Duck-type check for Sheet instances (avoids runtime import cycle). */\nexport const isSheet = (v: any): v is Sheet => v?.__gsType === 'Sheet';\n/** Duck-type check for Time instances (avoids runtime import cycle). */\nconst isTime = (v: any): boolean => v != null && v.__gsType === 'Time';\nimport { Spilling } from '../../sentinels';\nimport type { Id } from '../../types';\nimport { FormulaError } from '../formula-error';\nimport { stripSheet } from '../../formula/solver';\nimport type { Expression } from '../evaluator';\nimport {\n hasPendingArg,\n hasDeepPending,\n buildAsyncCacheKey,\n awaitAndSave,\n createPropagatedPending,\n getAsyncCache,\n asyncCacheMiss,\n} from './__async';\nimport { Time } from '../../lib/time';\n\nexport type FunctionCategory =\n | 'math'\n | 'statistics'\n | 'text'\n | 'time'\n | 'lookup'\n | 'information'\n | 'finance'\n | 'engineering'\n | 'logical'\n | 'other';\n\nexport type FunctionProps = {\n args: Expression[];\n sheet: Sheet;\n at?: Id;\n};\n\nexport type FunctionArgumentType = 'number' | 'string' | 'boolean' | 'date' | 'time' | 'matrix' | 'reference' | 'any';\n\nexport type FunctionArgumentDefinition = {\n name: string;\n description: string;\n // if true, this argument can be omitted (i.e. fewer args than defs.length is allowed)\n optional?: boolean;\n // If true, blank will be treated as 0 for numbers, \"\" for strings, etc. Default: true\n nullable?: boolean;\n variadic?: boolean;\n\n errorTolerant?: boolean;\n acceptedTypes?: FunctionArgumentType[];\n /** When true, this argument takes a range/matrix value — broadcasting is suppressed for it. */\n takesMatrix?: boolean;\n};\n\nexport const conditionArg: FunctionArgumentDefinition = {\n name: 'condition',\n description:\n 'The condition to evaluate. Use \"=\" for equal, \"<\" for less than, \">\" for greater than, \"<=\" for less than or equal, \">=\" for greater than or equal, \"<>\" for not equal.',\n acceptedTypes: ['any'],\n};\n\n/**\n * Check whether a value matches one of the allowed type names\n * from a FunctionArgumentDefinition.acceptedTypes array.\n */\nconst matchesType = (\n value: any,\n { nullable = true, errorTolerant = false, acceptedTypes }: FunctionArgumentDefinition,\n): boolean => {\n if (!acceptedTypes || acceptedTypes.length === 0) {\n return true;\n }\n if (value == null) {\n return nullable;\n }\n if (FormulaError.is(value) || value instanceof Error) {\n if (errorTolerant) {\n return true;\n }\n throw value;\n }\n for (const t of acceptedTypes) {\n switch (t) {\n case 'any':\n return true;\n case 'number':\n if (typeof value === 'number') {\n return true;\n }\n break;\n case 'string':\n if (typeof value === 'string') {\n return true;\n }\n break;\n case 'boolean':\n if (typeof value === 'boolean') {\n return true;\n }\n break;\n case 'date':\n if (value instanceof Date) {\n return true;\n }\n break;\n case 'time':\n if (Time.is(value)) {\n return true;\n }\n break;\n case 'matrix':\n if (isMatrix(value)) {\n return true;\n }\n break;\n case 'reference':\n if (isSheet(value)) {\n return true;\n }\n break;\n }\n }\n return false;\n};\n\n/**\n * Check if a value is a \"matrix\" (Sheet, Spilling, or 2D array).\n */\nexport const isMatrix = (value: any): boolean => {\n return isSheet(value) || Spilling.is(value) || (Array.isArray(value) && Array.isArray(value[0]));\n};\n\n/**\n * Extract the scalar from a 1×1 matrix (Sheet, Spilling, or plain 2D array).\n * Returns the value unchanged if it is not a matrix.\n */\nexport const stripMatrix = (value: any, at: Id): any => {\n if (!isMatrix(value)) {\n return value;\n }\n if (isSheet(value)) {\n return stripSheet({ value, raise: false, at });\n }\n const m: any[][] = Spilling.is(value) ? value.matrix : value;\n let val = m?.[0]?.[0];\n return val;\n};\n\n/**\n * Check if a value is a matrix that is larger than 1×1.\n */\nexport const isMultiCell = (value: any): boolean => {\n if (isSheet(value)) {\n return !value.hasSingleCell;\n }\n if (Spilling.is(value)) {\n const m = value.matrix;\n return m.length > 1 || (m.length === 1 && m[0].length > 1);\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value.length > 1 || value[0].length > 1;\n }\n return false;\n};\n\n/**\n * Resolve which FunctionArgumentDefinition index each args position maps to,\n * accounting for variadic args at the tail.\n *\n * Example: args = [A, B(variadic), C(variadic)], args has 7 elements\n * positions 0 → A, 1 → B, 2 → C, 3 → B, 4 → C, 5 → B, 6 → C\n */\nconst resolveParamIndex = (defs: FunctionArgumentDefinition[], argCount: number): number[] => {\n const indices: number[] = [];\n\n // Find the first variadic arg position\n let iterStart = -1;\n let iterCount = 0;\n for (let i = 0; i < defs.length; i++) {\n if (defs[i].variadic) {\n if (iterStart < 0) {\n iterStart = i;\n }\n iterCount++;\n }\n }\n\n for (let i = 0; i < argCount; i++) {\n if (iterStart >= 0 && i >= iterStart) {\n // Map extra args round-robin across variadic args\n const j = (i - iterStart) % iterCount;\n indices.push(iterStart + j);\n } else if (i < defs.length) {\n indices.push(i);\n } else {\n // Beyond defs and no variadic — fall back to last def\n indices.push(defs.length - 1);\n }\n }\n return indices;\n};\n\nexport class BaseFunction {\n public defs: FunctionArgumentDefinition[] = [];\n public example: string | undefined;\n public description = '';\n public category: FunctionCategory = 'other';\n /** Indicates if this function is async. Override in subclass or use BaseFunctionAsync. */\n protected isAsync: boolean = false;\n /** Cache TTL in milliseconds. Override in subclass to set expiry. undefined = never expires. */\n protected ttlMilliseconds?: number;\n /** Hash precision for cache key generation. Higher values reduce collision risk. Default: 1 */\n protected hashPrecision: number = 1;\n /** If true, reuse the same in-flight promise for matching cache keys across different cells. */\n protected useInflight: boolean = true;\n /** If true, broadcasting is unconditionally disabled for this function. */\n protected broadcastDisabled: boolean = false;\n protected args: any[];\n protected autoSpilling: boolean = false;\n public sheet: Sheet;\n public at: Id;\n static __name = '';\n\n constructor({ args, sheet, at }: FunctionProps) {\n this.args = args.map((a) => {\n try {\n return a.evaluate({ sheet });\n } catch (e) {\n return e;\n }\n });\n this.sheet = sheet;\n this.at = at ?? '?';\n }\n\n private _main(...args: any[]): any {\n if (this.autoSpilling) {\n // @ts-expect-error main is not defined in BaseFunction\n return new Spilling(this.main(...args));\n }\n // @ts-expect-error main is not defined in BaseFunction\n return this.main(...args);\n }\n\n /**\n * Validate and normalise arguments before `main()` is called.\n *\n * Checks:\n * 1. Argument count satisfies defs (respecting optional / variadic).\n * 2. Each argument's runtime type matches the corresponding def's `type` list.\n *\n * Subclasses may override for additional coercion / spreading.\n */\n protected validate(args: any[]): any[] {\n const validatedArgs = [...args];\n\n const defs = this.defs;\n if (defs.length === 0) {\n if (args.length !== 0) {\n throw new FormulaError('#N/A', 'Too many arguments: expected 0, got ' + args.length + '.');\n }\n return validatedArgs;\n }\n\n // --- argument count check ---\n // minArgs: count of defs that are neither optional nor variadic,\n // plus non-optional variadic defs (need at least one instance each).\n let minArgs = 0;\n let hasIterable = false;\n let variadicCount = 0;\n for (const d of defs) {\n if (d.variadic) {\n hasIterable = true;\n variadicCount++;\n if (!d.optional) {\n minArgs++;\n }\n } else if (!d.optional) {\n minArgs++;\n }\n }\n\n if (args.length < minArgs) {\n throw new FormulaError('#N/A', `Too few arguments: expected at least ${minArgs}, got ${args.length}.`);\n }\n\n // maxArgs: if no variadic defs, max = defs.length\n if (!hasIterable && args.length > defs.length) {\n throw new FormulaError('#N/A', `Too many arguments: expected at most ${defs.length}, got ${args.length}.`);\n }\n\n // --- per-argument type check ---\n const indices = resolveParamIndex(defs, args.length);\n for (let i = 0; i < args.length; i++) {\n const def = defs[indices[i]];\n if (!def) {\n continue;\n }\n let value = args[i];\n if (!def.acceptedTypes || def.acceptedTypes.length === 0) {\n continue;\n }\n\n if (isMultiCell(value)) {\n if (!def.takesMatrix) {\n continue;\n }\n } else if (isMatrix(value)) {\n // For 1x1 Sheet, Spilling, or plain 2D array, extract the single value for validation.\n // UNLESS the definition explicitly takes a matrix (e.g. SUM(A1) — let it pass through).\n if (!def.takesMatrix) {\n value = stripMatrix(value, this.at);\n }\n }\n if (!matchesType(value, def)) {\n throw new FormulaError(\n '#VALUE!',\n `Argument \"${def.name}\" (position ${i + 1}) expected ${def.acceptedTypes.join(' | ')}, got ${typeof value}.`,\n );\n }\n validatedArgs[i] = value;\n }\n return validatedArgs;\n }\n\n eachMatrix = (value: any, callback: (v: any) => void) => {\n if (isSheet(value)) {\n const matrix = value.solve({ at: this.at, raise: true });\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let r = 0; r < value.length; r++) {\n for (let c = 0; c < value[r].length; c++) {\n callback(value[r][c]);\n }\n }\n } else {\n callback(value);\n }\n };\n\n /**\n * Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).\n * Default behavior for Sheet is value.solve(). Functions like COL can override\n * this to preserve Sheet metadata per cell.\n */\n protected toMatrix(value: any): any[][] {\n if (Spilling.is(value)) {\n return value.matrix;\n }\n if (isSheet(value)) {\n return value.solve({ at: this.at });\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value;\n }\n return [[value]];\n }\n\n /**\n * Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.\n * Non-matrix values pass through unchanged.\n *\n * Override in sub-classes that need the original Sheet / reference\n * metadata (e.g. COL, ROW) — for instance, to extract position\n * information before collapsing.\n */\n protected toScalar(value: any): any {\n if (isSheet(value)) {\n const { rows, cols } = value.shape;\n if (rows === 1 && cols === 1) {\n return value.strip({});\n }\n return value;\n }\n if (Spilling.is(value)) {\n return value.matrix?.[0]?.[0];\n }\n if (Array.isArray(value)) {\n if (Array.isArray(value[0])) {\n return value[0]?.[0];\n }\n return value[0];\n }\n return value;\n }\n\n public call() {\n // Broadcast BEFORE validate, because validate may strip Tables to scalars.\n // broadcast only activates when there are 2+ args and at least one\n // broadcastable arg is a multi-cell matrix.\n const broadcastResult = this.broadcast();\n if (broadcastResult !== undefined) {\n return broadcastResult;\n }\n\n // If any argument is still pending, propagate before validate runs\n // (Pending values would fail type checks in validate).\n if (hasDeepPending(this.args, this.at)) {\n return createPropagatedPending();\n }\n\n this.args = this.validate(this.args);\n\n // For async functions, build cache key and check cache before execution\n if (this.isAsync) {\n const key = buildAsyncCacheKey(this.constructor.name, this.args, this.hashPrecision);\n const cached = getAsyncCache(this.sheet, this.at, key, this.useInflight);\n if (cached !== asyncCacheMiss) {\n return cached;\n }\n\n const promise = this._main(...this.args);\n return awaitAndSave(promise, this.sheet, this.at, key, this.ttlMilliseconds, this.useInflight);\n }\n\n // For sync functions, just call and return\n return this._main(...this.args);\n }\n\n /**\n * If any broadcastable argument is a matrix (multi-cell), expand the call\n * across all element positions and return a Spilling.\n * Returns `undefined` when no broadcast is necessary.\n *\n * Rules:\n * - broadcastDisabled = true → never broadcast\n * - An arg is broadcastable when its corresponding args[].takesMatrix is not true\n * - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar\n * (not broadcast); only multi-cell matrices trigger broadcast\n * - For variadic args, extra args are assigned round-robin\n * across the variadic helpArg positions\n */\n private broadcast(): any[][] | undefined {\n if (this.broadcastDisabled) {\n return undefined;\n }\n\n // Map each args index to its corresponding args index\n const helpIndices = resolveParamIndex(this.defs, this.args.length);\n\n // Determine which arg positions are broadcastable (takesMatrix: true suppresses broadcasting).\n const broadcastable: boolean[] = this.args.map((_, i) => {\n const hIdx = helpIndices[i];\n return !this.defs[hIdx]?.takesMatrix;\n });\n\n // Collect matrices only for broadcastable positions whose value is a multi-cell matrix\n const matrices: (any[][] | null)[] = this.args.map((arg, i) => {\n if (broadcastable[i] && isMultiCell(arg)) {\n return this.toMatrix(arg);\n }\n return null;\n });\n\n // If no broadcastable arg is actually a multi-cell matrix, nothing to do\n if (matrices.every((m) => m === null)) {\n return undefined;\n }\n\n // Collapse 1×1 matrix args (non-broadcast) to scalars for the cell-level calls\n const scalarArgs = this.args.map((arg, i) => {\n if (matrices[i] !== null) {\n return arg;\n } // will be expanded per-cell\n return this.toScalar(arg);\n });\n\n // Compute the max rows / cols across all matrix arguments\n let maxRows = 1;\n let maxCols = 1;\n for (const m of matrices) {\n if (m) {\n maxRows = Math.max(maxRows, m.length);\n maxCols = Math.max(\n maxCols,\n m.reduce((acc, row) => Math.max(acc, row.length), 0),\n );\n }\n }\n\n // Save original args so we can restore after each cell iteration\n const originalBareArgs = this.args;\n\n // Iterate over every (row, col) position\n const result: any[][] = [];\n for (let r = 0; r < maxRows; r++) {\n const row: any[] = [];\n for (let c = 0; c < maxCols; c++) {\n // Build the argument list for this cell position\n const cellArgs = scalarArgs.map((arg, i) => {\n const m = matrices[i];\n if (m) {\n // If the position exists in the matrix, use it; otherwise null\n return m?.[r]?.[c] ?? null;\n }\n return arg;\n });\n try {\n if (hasPendingArg(cellArgs)) {\n row.push(createPropagatedPending());\n } else {\n // Validate cell-level args\n const validatedArgs = this.validate(cellArgs);\n if (hasDeepPending(validatedArgs, this.at)) {\n row.push(createPropagatedPending());\n } else {\n row.push(this._main(...validatedArgs));\n }\n }\n } catch (e) {\n row.push(e);\n }\n }\n result.push(row);\n }\n\n // Restore original args\n this.args = originalBareArgs;\n\n return result;\n }\n}\n\n/**\n * Base class for async functions.\n * Extend this class to create async functions that support caching.\n */\nexport class BaseFunctionAsync extends BaseFunction {\n protected isAsync: boolean = true;\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n","import { stripSheet } from '../solver';\nimport { Sheet } from '../../lib/sheet';\nimport { FormulaError } from '../formula-error';\nimport dayjs from 'dayjs';\nimport { FULLDATE_FORMAT_UTC } from '../../constants';\nimport { Pending, Spilling } from '../../sentinels';\nimport type { Id, PointType } from '../../types';\nimport { Time } from '../../lib/time';\n\nexport const gt = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) > ensureString(right);\n }\n try {\n return ensureNumber(left) > ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const gte = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) >= ensureString(right);\n }\n try {\n return ensureNumber(left) >= ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const lt = (left: any, right: any): boolean => {\n return !gte(left, right);\n};\n\nexport const lte = (left: any, right: any): boolean => {\n return !gt(left, right);\n};\n\nexport const eq = (left: any, right: any): boolean => {\n return ensureString(left).toLowerCase() === ensureString(right).toLowerCase();\n};\n\nexport const ne = (left: any, right: any): boolean => {\n return !eq(left, right);\n};\n\nexport type EnsureNumberOptions = {\n alternative?: number;\n ignore?: boolean;\n};\n\nexport type EnsureBooleanOptions = {\n alternative?: boolean;\n ignore?: boolean;\n};\n\nexport const ensureNumber = (value: any, options?: EnsureNumberOptions): number => {\n const { alternative, ignore } = options || {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (!value) {\n // falsy is 0\n return 0;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureNumber(v, { alternative });\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (Time.is(value)) {\n return value.days;\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const num = parseFloat(value.slice(0, -1));\n if (!isNaN(num)) {\n return num / 100;\n }\n }\n\n const num = parseFloat(value as string);\n if (isNaN(num)) {\n if (ignore) {\n return alternative ?? 0;\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a number`);\n }\n return num;\n};\n\nexport const ensureString = (value: any): string => {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value === 0) {\n return '0';\n }\n if (!value) {\n return '';\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureString(v);\n }\n switch (value.constructor.name) {\n case 'Date': {\n const d: Date = value;\n return dayjs(d).format(FULLDATE_FORMAT_UTC);\n }\n default:\n return String(value);\n }\n};\n\nexport const ensureBoolean = (value: any, options?: EnsureBooleanOptions): boolean => {\n const { alternative, ignore } = options ?? {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (value === null) {\n return false;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureBoolean(v, options);\n }\n if (typeof value === 'string' || value instanceof String) {\n const bool = { true: true, false: false }[value.toLowerCase()];\n if (bool == null) {\n if (ignore) {\n return false;\n }\n throw new FormulaError('#VALUE!', `text '${value as string}' cannot be converted to a boolean`);\n }\n return bool;\n }\n return Boolean(value);\n};\n\nconst CONDITION_REGEX = /^(<=|>=|<>|>|<|=)?(.*)$/;\n\nexport const check = (value: any, condition: string): boolean => {\n const m = condition.match(CONDITION_REGEX);\n\n const [, expr = '', target = ''] = m || [];\n let comparison: any = target;\n if (expr === '>' || expr === '<' || expr === '>=' || expr === '<=') {\n if (typeof value === 'number') {\n comparison = parseFloat(target);\n }\n switch (expr) {\n case '>':\n return gt(value, comparison);\n case '>=':\n return gte(value, comparison);\n case '<':\n return lt(value, comparison);\n case '<=':\n return lte(value, comparison);\n }\n }\n\n const equals = expr === '' || expr === '=';\n if (target === '') {\n // empty target means \"\" or \"<>\"\n return (value == null || value === '') === equals;\n }\n\n if (typeof value === 'string' || value instanceof String) {\n const replaced = target\n .replace(/~\\*/g, '(\\\\*)')\n .replace(/~\\?/g, '(\\\\?)')\n .replace(/\\*/g, '(.*)')\n .replace(/\\?/g, '(.)');\n const regex = RegExp(`^${replaced}$`, 'i');\n return regex.test(value as string) === equals;\n }\n return eq(value, comparison) === equals;\n};\n\nexport const eachMatrix = (value: any, callback: (v: any, relativePoint: PointType) => void, at: Id) => {\n if (value instanceof Sheet) {\n const matrix = value.solve({ at });\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let y = 0; y < value.length; y++) {\n for (let x = 0; x < value[y].length; x++) {\n callback(value[y][x], { y, x });\n }\n }\n } else {\n callback(value, { y: 0, x: 0 });\n }\n};\n\nexport const createBooleanMask = (sheets: Sheet[], conditions: string[], at: Id): boolean[][] => {\n if (sheets.length === 0) {\n return [];\n }\n const refRange = sheets[0];\n const numRows = refRange.numRows;\n const numCols = refRange.numCols;\n\n const mask: boolean[][] = Array.from({ length: numRows }, () => Array(numCols).fill(true));\n\n for (let p = 0; p < sheets.length; p++) {\n const condRange = sheets[p];\n const condition = conditions[p];\n eachMatrix(\n condRange,\n (v: any, pt: PointType) => {\n mask[pt.y][pt.x] &&= check(v, condition);\n },\n at,\n );\n }\n return mask;\n};\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { BaseFunction, type FunctionCategory, type FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { Time } from '../../lib/time';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the sum of two numbers.\nThis is the same as the '+' operator.`;\n\nexport class AddFunction extends BaseFunction {\n example = 'ADD(2, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First additive.', acceptedTypes: ['number', 'date', 'time'] },\n { name: 'value2', description: 'Second additive.', acceptedTypes: ['number', 'date', 'time'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 + v2;\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).add(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).add(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .add(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n if (typeof v1 === 'number' && v2 instanceof Date) {\n return dayjs(v2)\n .add(v1 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) + ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for augend or addend.');\n }\n }\n}\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { Time } from '../../lib/time';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the difference of two numbers.\nThis is the same as the '-' operator.`;\n\nexport class MinusFunction extends BaseFunction {\n example = 'MINUS(8, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number', 'date', 'time'] },\n {\n name: 'value2',\n description: 'A number that will subtract from value1.',\n acceptedTypes: ['number', 'date', 'time'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 - v2;\n }\n if (v1 instanceof Date && v2 instanceof Date) {\n return Time.fromDates(v1, v2);\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).sub(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).sub(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .subtract(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) - ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for minuend or subtrahend.');\n }\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the product of two numbers.\nThis is the same as the '*' operator.`;\n\nexport class MultiplyFunction extends BaseFunction {\n example = 'MULTIPLY(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'factor1', description: 'First factor.', acceptedTypes: ['number'] },\n { name: 'factor2', description: 'Second factor.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any, v2: any) {\n return ensureNumber(v1) * ensureNumber(v2);\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the result of dividing one number by another.\nThis is the same as the '/' operator.`;\n\nexport class DivideFunction extends BaseFunction {\n example = 'DIVIDE(4, 2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'dividend',\n description: 'A number that will be divided by divisor.',\n acceptedTypes: ['number'],\n },\n {\n name: 'divisor',\n description: 'A number that will divide a dividend. Must be non-zero.',\n acceptedTypes: ['number'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected validate(args: any[]): any[] {\n const validated = super.validate(args).map((arg) => ensureNumber(arg));\n if (validated[1] === 0) {\n throw new FormulaError('#DIV/0!', 'The second argument must be non-zero.');\n }\n return validated;\n }\n\n protected main(divided: number, divisor: number) {\n return divided / divisor;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the sum of a series of numbers or cells.`;\n\nexport class SumFunction extends BaseFunction {\n example = 'SUM(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to sum.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n sum += ensureNumber(v, { ignore: true });\n },\n this.at,\n );\n });\n return sum;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the concatenation of two values.\nThis is the same as the '&' operator.`;\n\nexport class ConcatFunction extends BaseFunction {\n example = 'CONCAT(\"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value1',\n description: 'A value to be concatenated with value2.',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n {\n name: 'value2',\n description: 'A value to be concatenated with value1',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(v1: any, v2: any) {\n return ensureString(v1) + ensureString(v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eq } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are equal, FALSE if they are not.\nThis is the same as the '=' operator.`;\n\nexport class EqFunction extends BaseFunction {\n example = 'EQ(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return eq(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ne } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are not equal, FALSE if they are.\nThis is the same as the '<>' operator.`;\n\nexport class NeFunction extends BaseFunction {\n example = 'NE(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: number, v2: number) {\n return ne(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truly greater than the second, FALSE otherwise.\nThis is the same as the '>' operator.`;\n\nexport class GtFunction extends BaseFunction {\n example = 'GT(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is greater than the second, FALSE otherwise.\nThis is the same as the '>=' operator.`;\n\nexport class GteFunction extends BaseFunction {\n example = 'GTE(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truely less than the second argument, FALSE otherwise.\nThis is the same as the '<' operator.`;\n\nexport class LtFunction extends BaseFunction {\n example = 'LT(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is less than the second argument, FALSE otherwise.\nThis is the same as the '<=' operator.`;\n\nexport class LteFunction extends BaseFunction {\n example = 'LTE(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Returns a serial value corresponding to the current date and time.`;\n\nexport class NowFunction extends BaseFunction {\n example = 'NOW()';\n description = description;\n defs: FunctionArgumentDefinition[] = [];\n category: FunctionCategory = 'time';\n\n protected main() {\n return new Date();\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if all arguments are logically TRUE.\nReturns FALSE if any argument is logically FALSE.`;\n\nexport class AndFunction extends BaseFunction {\n example = 'AND(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a && b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if any argument is logically true.\nReturns FALSE if all arguments are logically false.`;\n\nexport class OrFunction extends BaseFunction {\n example = 'OR(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a || b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `If the logical expression is TRUE, the second argument is returned.\nIf FALSE, the third argument is returned.`;\n\nexport class IfFunction extends BaseFunction {\n example = 'IF(A2 = \"Human\", \"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'condition', description: 'An expression as a condition', acceptedTypes: ['any'] },\n {\n name: 'value1',\n description: 'value to be returned if the condition is true.',\n acceptedTypes: ['any'],\n },\n {\n name: 'value2',\n description: 'value to be returned if the condition is false.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(condition: any, v1: any, v2: any = false) {\n return ensureBoolean(condition) ? v1 : v2;\n }\n}\n","// DO NOT COPY THIS CODE FOR THE OTHER.\nimport { FormulaError } from '../formula-error';\nimport {\n FunctionArgumentDefinition,\n BaseFunction,\n FunctionCategory,\n isMatrix,\n isMultiCell,\n stripMatrix,\n} from './__base';\n\nconst description = `Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.`;\n\nexport class IfErrorFunction extends BaseFunction {\n example = 'IFERROR(A1, \"Error in cell A1\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The value to return if value itself is not an error.',\n acceptedTypes: ['any'],\n errorTolerant: true,\n },\n {\n name: 'value_if_error',\n description: 'The value the function returns if value is an error.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any, valueIfError?: any) {\n if (FormulaError.is(value) || value instanceof Error) {\n return valueIfError;\n }\n return value;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns the inverse of the Boolean; if TRUE, NOT returns FALSE.\nIf FALSE, NOT returns TRUE.`;\n\nexport class NotFunction extends BaseFunction {\n example = 'NOT(TRUE)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'logical expression',\n description: 'A logical expression as a boolean.',\n acceptedTypes: ['boolean', 'number'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any) {\n return !ensureBoolean(v1);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the count of a series of numbers or cells.`;\n\nexport class CountFunction extends BaseFunction {\n example = 'COUNT(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n count++;\n }\n },\n this.at,\n );\n } else {\n ensureNumber(val);\n count++;\n }\n });\n return count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the absolute value of a number`;\n\nexport class AbsFunction extends BaseFunction {\n example = 'ABS(-2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [{ name: 'value', description: 'target number', acceptedTypes: ['number'] }];\n category: FunctionCategory = 'math';\n\n protected main(value: any) {\n return Math.abs(ensureNumber(value));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number multiplied by an exponent.`;\n\nexport class PowerFunction extends BaseFunction {\n example = 'POWER(4,0.5)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'base', description: 'A number to be multiplied by an exponent.', acceptedTypes: ['number'] },\n { name: 'exponent', description: 'An exponent to power the base.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(base: any, exponent: any) {\n return Math.pow(ensureNumber(base), ensureNumber(exponent));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eachMatrix } from './__utils';\n\nconst description = `Returns the number of values in the data set.`;\n\nexport class CountaFunction extends BaseFunction {\n example = 'COUNTA(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Values or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n if (v != null && v !== '') {\n count++;\n }\n },\n this.at,\n );\n });\n return count;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the average of a series of numbers or cells.`;\n\nexport class AverageFunction extends BaseFunction {\n example = 'AVERAGE(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to average.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let sum = 0;\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n sum += v;\n count++;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n sum += num;\n count++;\n }\n });\n\n if (count === 0) {\n throw new FormulaError('#DIV/0!', 'Evaluation of function AVERAGE caused a divide by zero error.');\n }\n return sum / count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the max in a series of numbers or cells.`;\n\nexport class MaxFunction extends BaseFunction {\n example = 'MAX(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find max from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let max = -Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n if (v > max) {\n max = v;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num > max) {\n max = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? max : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the min in a series of numbers or cells.`;\n\nexport class MinFunction extends BaseFunction {\n example = 'MIN(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find min from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let min = Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n if (v < min) {\n min = v;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num < min) {\n min = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? min : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the length of a string.`;\n\nexport class LenFunction extends BaseFunction {\n example = 'LEN(A2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'text',\n description: 'A text to be returned the length.',\n acceptedTypes: ['string', 'number'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(text: any) {\n return ensureString(text).length;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number with positive and negative values reversed.`;\n\nexport class UminusFunction extends BaseFunction {\n example = 'UMINUS(4)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any) {\n return -ensureNumber(v1);\n }\n}\n","import { Sheet } from '../../lib/sheet';\nimport { Spilling } from '../../sentinels';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Enables the display of values returned from an array formula into multiple rows and/or columns.\nIf the argument is already a Spilling, it is returned as-is. If it is a Sheet (range reference), the field matrix is extracted and wrapped in a Spilling. Otherwise the value is wrapped as a single-element Spilling.`;\n\nexport class ArrayformulaFunction extends BaseFunction {\n autoSpilling = true;\n example = 'ARRAYFORMULA(A1:A10 * B1:B10)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The array expression or value to evaluate.',\n takesMatrix: true,\n acceptedTypes: ['matrix', 'any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any) {\n if (Spilling.is(value)) {\n return value;\n }\n if (value instanceof Sheet) {\n return value._toValueMatrix();\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [[value]];\n }\n}\n","import { AddFunction } from './functions/add';\nimport { MinusFunction } from './functions/minus';\nimport { MultiplyFunction } from './functions/multiply';\nimport { DivideFunction } from './functions/divide';\nimport { SumFunction } from './functions/sum';\nimport { ConcatFunction } from './functions/concat';\nimport { EqFunction } from './functions/eq';\nimport { NeFunction } from './functions/ne';\nimport { GtFunction } from './functions/gt';\nimport { GteFunction } from './functions/gte';\nimport { LtFunction } from './functions/lt';\nimport { LteFunction } from './functions/lte';\nimport { NowFunction } from './functions/now';\nimport { AndFunction } from './functions/and';\nimport { OrFunction } from './functions/or';\nimport { IfFunction } from './functions/if';\nimport { IfErrorFunction } from './functions/iferror';\nimport { NotFunction } from './functions/not';\nimport { CountFunction } from './functions/count';\nimport { AbsFunction } from './functions/abs';\nimport { PowerFunction } from './functions/power';\nimport { CountaFunction } from './functions/counta';\nimport { AverageFunction } from './functions/average';\nimport { MaxFunction } from './functions/max';\nimport { MinFunction } from './functions/min';\nimport { LenFunction } from './functions/len';\nimport { UminusFunction } from './functions/uminus';\nimport { ArrayformulaFunction } from './functions/arrayformula';\nimport type { FunctionCategory, FunctionMapping, FunctionArgumentDefinition } from './functions/__base';\n\nexport const functions: FunctionMapping = {\n // Arithmetic & Comparison\n add: AddFunction,\n minus: MinusFunction,\n uminus: UminusFunction,\n multiply: MultiplyFunction,\n divide: DivideFunction,\n pow: PowerFunction,\n power: PowerFunction,\n concat: ConcatFunction,\n eq: EqFunction,\n ne: NeFunction,\n gt: GtFunction,\n gte: GteFunction,\n lt: LtFunction,\n lte: LteFunction,\n\n // Logical\n if: IfFunction,\n iferror: IfErrorFunction,\n and: AndFunction,\n or: OrFunction,\n not: NotFunction,\n arrayformula: ArrayformulaFunction,\n\n // Statistics & Aggregation\n sum: SumFunction,\n max: MaxFunction,\n min: MinFunction,\n average: AverageFunction,\n count: CountFunction,\n counta: CountaFunction,\n\n // Text\n len: LenFunction,\n\n // Math\n abs: AbsFunction,\n\n // Time\n now: NowFunction,\n};\n\nexport type FunctionHelp = {\n name: string;\n category: FunctionCategory;\n example: string;\n description: string;\n defs: FunctionArgumentDefinition[];\n};\n\nconst _functionHelpsCache = new Map<FunctionMapping, FunctionHelp[]>();\n\nexport const getFunctionHelps = (customFunctions: FunctionMapping = functions): FunctionHelp[] => {\n let helps = _functionHelpsCache.get(customFunctions);\n if (!helps) {\n helps = Object.keys(customFunctions).map((name) => {\n const FnClass = customFunctions[name];\n const instance = new FnClass({ args: [], sheet: {} as any });\n return {\n name: name.toUpperCase(),\n category: instance.category,\n example: instance.example ?? FnClass?.__name ?? 'Unknown',\n description: instance.description ?? '',\n defs: instance.defs || [],\n };\n });\n _functionHelpsCache.set(customFunctions, helps);\n }\n return helps;\n};\n","import { useState, useMemo, useCallback } from 'react';\nimport { getFunctionHelps, type FunctionHelp } from '../formula/mapping';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport type { AutocompleteOption } from '../policy/core';\nimport { Lexer } from '../formula/evaluator';\n\ntype UseAutocompleteProps = {\n inputting: string;\n selectionStart: number;\n optionsAll: AutocompleteOption[];\n functions?: FunctionMapping;\n};\n\nexport const useAutocomplete = ({ inputting, selectionStart, optionsAll, functions }: UseAutocompleteProps) => {\n const [selected, setSelected] = useState(0);\n\n const { filteredOptions, matchParams, activeFunctionHelp, activeArgIndex } = useMemo(() => {\n const isFormula = inputting.startsWith('=');\n\n let activeFunctionHelp: FunctionHelp | null = null;\n let activeArgIndex: number = 0;\n\n const textBeforeCursor = inputting.slice(0, selectionStart);\n const textAfterCursor = inputting.slice(selectionStart);\n\n // --- Active Argument Context Tracking ---\n if (isFormula && textBeforeCursor.length > 1) {\n try {\n const textToCursor = textBeforeCursor.slice(1); // skip '='\n const lexer = new Lexer(textToCursor);\n lexer.tokenize();\n\n const functionStack: { name: string; argIndex: number; hasWaitComma: boolean }[] = [];\n\n for (let i = 0; i < lexer.tokens.length; i++) {\n const token = lexer.tokens[i];\n if (token.type === 'FUNCTION') {\n const nextToken = lexer.tokens[i + 1];\n if (nextToken?.type === 'OPEN') {\n functionStack.push({ name: token.entity as string, argIndex: 0, hasWaitComma: false });\n i++; // skip OPEN\n } else if (i === lexer.tokens.length - 1) {\n // Function keyword right before cursor but without paren yet!\n // Do nothing special here, autocomplete dropdown will handle it.\n }\n } else if (token.type === 'COMMA') {\n if (functionStack.length > 0) {\n functionStack[functionStack.length - 1].argIndex++;\n functionStack[functionStack.length - 1].hasWaitComma = true;\n }\n } else if (token.type === 'CLOSE') {\n if (functionStack.length > 0) {\n functionStack.pop();\n }\n } else if (token.type !== 'SPACE' && functionStack.length > 0) {\n functionStack[functionStack.length - 1].hasWaitComma = false;\n }\n }\n\n if (functionStack.length > 0) {\n const activeItem = functionStack[functionStack.length - 1];\n const helps = getFunctionHelps(functions);\n activeArgIndex = activeItem.argIndex;\n activeFunctionHelp = helps.find((h: any) => h.name === activeItem.name.toUpperCase()) || null;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n const wordBefore = textBeforeCursor.match(/[a-zA-Z0-9_.]+$/)?.[0] || '';\n const wordAfter = textAfterCursor.match(/^[a-zA-Z0-9_.]+/)?.[0] || '';\n\n // For regular cells, we use the whole word as the search target.\n // For formulas, we extract the word under the cursor.\n const currentWord = isFormula ? (wordBefore + wordAfter).toLowerCase() : inputting.toLocaleLowerCase();\n const hasOpenParenAssigned = isFormula && textAfterCursor.slice(wordAfter.length).trimStart().startsWith('(');\n\n let filtered: any[] = [];\n\n let isOnAddress = false;\n if (isFormula) {\n try {\n const fullLexer = new Lexer(inputting.slice(1));\n fullLexer.tokenize();\n let currentIndex = 1; // start after '='\n for (const token of fullLexer.tokens) {\n const tLen = token.length();\n if (selectionStart > currentIndex && selectionStart < currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n // Inside a string literal (VALUE token whose entity is a string)\n if (token.type === 'VALUE' && typeof token.entity === 'string') {\n isOnAddress = true;\n }\n break;\n }\n if (selectionStart === currentIndex || selectionStart === currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n }\n currentIndex += tLen;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n if (isFormula && !isOnAddress) {\n // Suggest if we have at least 1 letter, and there isn't already an opening parenthesis attached\n if (currentWord.length > 0 && !hasOpenParenAssigned) {\n filtered = getFunctionHelps(functions)\n .map((help: any) => {\n const keywordLower = help.name.toLowerCase();\n const startsWith = keywordLower.startsWith(currentWord);\n const index = startsWith ? 0 : -1;\n const hasNoArgs = help.defs.length === 0;\n return {\n option: { ...help, value: help.name + (hasNoArgs ? '()' : '('), isFunction: true, label: help.name },\n index,\n startsWith,\n keywordCount: 1,\n keyword: keywordLower,\n };\n })\n .filter(({ startsWith }: { startsWith: boolean }) => startsWith)\n .sort((a: any, b: any) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }: { option: any }) => option);\n }\n } else {\n filtered = optionsAll\n .map((option) => {\n const keywords = option.keywords ?? [String(option.value)];\n let bestMatch = { index: -1, startsWith: false, keyword: '' };\n\n for (const keyword of keywords) {\n const keywordLower = keyword.toLowerCase();\n const index = keywordLower.indexOf(currentWord);\n if (index !== -1) {\n const startsWith = keywordLower.startsWith(currentWord);\n if (\n bestMatch.index === -1 ||\n index < bestMatch.index ||\n (index === bestMatch.index && startsWith && !bestMatch.startsWith)\n ) {\n bestMatch = { index, startsWith, keyword };\n }\n }\n }\n\n return {\n option,\n ...bestMatch,\n keywordCount: keywords.length,\n };\n })\n .filter(({ index }) => index !== -1)\n .sort((a, b) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n if (a.keywordCount !== b.keywordCount) {\n return b.keywordCount - a.keywordCount;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }) => option);\n }\n\n return {\n filteredOptions: filtered,\n matchParams: {\n isFormula,\n currentWord,\n matchLengthBefore: wordBefore.length,\n matchLengthAfter: wordAfter.length,\n },\n activeFunctionHelp,\n activeArgIndex,\n };\n }, [inputting, selectionStart, optionsAll, functions]);\n\n useMemo(() => {\n if (selected >= filteredOptions.length) {\n setSelected(0);\n }\n }, [filteredOptions.length, selected]);\n\n const replaceWithOption = useCallback(\n (option: any) => {\n if (!option) {\n return { value: inputting, selectionStart };\n }\n\n if (matchParams.isFormula) {\n const beforeMatch = inputting.slice(0, selectionStart - matchParams.matchLengthBefore);\n const afterMatch = inputting.slice(selectionStart + matchParams.matchLengthAfter);\n const newValue = beforeMatch + option.value + afterMatch;\n return { value: newValue, selectionStart: beforeMatch.length + option.value.length };\n } else {\n return { value: String(option.value), selectionStart: String(option.value).length };\n }\n },\n [inputting, selectionStart, matchParams],\n );\n\n const handleArrowUp = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s <= 0 ? filteredOptions.length - 1 : s - 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n const handleArrowDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s >= filteredOptions.length - 1 ? 0 : s + 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n return {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula: matchParams.isFormula,\n activeFunctionHelp,\n activeArgIndex,\n };\n};\n","import { useEffect, useState, useRef } from 'react';\n\n// Return the document object with SSR.\nexport const useBrowser = () => {\n const [ok, setOk] = useState(false);\n useEffect(() => {\n setOk(true);\n }, []);\n if (ok && typeof window !== 'undefined') {\n return { window, document };\n }\n return { window: null, document: null };\n};\n\nexport const useDebounce = <T>(value: T, delay = 100) => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n const timerRef = useRef<number>();\n\n useEffect(() => {\n timerRef.current = window.setTimeout(() => setDebouncedValue(value), delay);\n return () => {\n window.clearTimeout(timerRef.current);\n };\n }, [value, delay]);\n return debouncedValue;\n};\n\nexport const useDebounceCallback = (callback: (...args: any[]) => void, delay = 100) => {\n const debouncedCallback = useRef(callback);\n const timerRef = useRef<number>();\n\n useEffect(() => {\n debouncedCallback.current = callback;\n }, [callback]);\n\n return (...args: any[]) => {\n window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n debouncedCallback.current(...args);\n }, delay);\n };\n};\n","import type { CSSProperties, FC, ReactNode } from 'react';\nimport { useBrowser } from './hooks';\nimport { createPortal } from 'react-dom';\n\ntype Props = {\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n [attr: string]: any;\n};\n\nexport const Fixed: FC<Props> = ({ children, style, className = '', ...attrs }) => {\n const { document } = useBrowser();\n if (document == null) {\n return null;\n }\n return createPortal(\n <div {...attrs} className={`gs-fixed ${className}`} style={style}>\n {children}\n </div>,\n document.body,\n );\n};\n","import React, { type CSSProperties } from 'react';\nimport type { RawCellType } from '../types';\nexport const parseHTML = (html: string, onlyValue = false): RawCellType[][] => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const results: RawCellType[][] = [];\n\n const processSheet = (sheet: HTMLTableElement) => {\n const spans = new Set<string>();\n const rows = sheet.querySelectorAll('tr,caption');\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (row.tagName === 'CAPTION') {\n const caption = row.textContent?.trim() ?? '';\n if (caption) {\n results.push([{ value: caption }]);\n }\n continue;\n }\n const cells = Array.from(row.querySelectorAll('td, th'));\n const result: RawCellType[] = [];\n let j = 0;\n for (const cell of cells) {\n const value = cell.textContent?.trim() ?? '';\n const style: CSSProperties | undefined = onlyValue\n ? undefined\n : (() => {\n const childStyle = parseStyleString(cell.firstElementChild);\n const parentStyle = parseStyleString(cell);\n return { ...parentStyle, ...childStyle };\n })();\n while (spans.has(`${i}-${++j}`)) {\n result.push({ value: '', style, skip: true });\n }\n result.push({ value, style });\n\n const rowSpan = parseInt(cell.getAttribute('rowspan') ?? '1', 10);\n const colSpan = parseInt(cell.getAttribute('colspan') ?? '1', 10);\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n spans.add(`${i + r}-${j + c}`);\n }\n }\n }\n results.push(result);\n }\n };\n\n const processNodeSequentially = (node: Node, currentLine: RawCellType[] = []) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const tagName = el.tagName;\n\n if (tagName === 'TABLE') {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n processSheet(el as HTMLTableElement);\n } else if (tagName === 'BR') {\n results.push(currentLine.slice());\n currentLine.length = 0;\n } else if (blockTags.has(tagName)) {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n } else {\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n }\n } else if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const lines = text.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n currentLine.push({ value: trimmed });\n }\n }\n }\n };\n\n const currentLine: RawCellType[] = [];\n doc.body.childNodes.forEach((node) => processNodeSequentially(node, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine);\n }\n\n return results;\n};\n\nfunction parseStyleString(element: Element | null): React.CSSProperties | undefined {\n if (!element) {\n return undefined;\n }\n const styleString = element.getAttribute('style') ?? '';\n const styleObj: React.CSSProperties = {};\n\n styleString.split(';').forEach((d) => {\n let [rawKey, rawValue] = d.split(':');\n if (!rawKey || !rawValue) {\n return;\n }\n rawKey = rawKey.trim();\n if (rawKey === 'height' || rawKey === 'width') {\n return;\n }\n const key = rawKey.trim().replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n if (key === 'float' || key === 'display' || key.startsWith('padding')) {\n return;\n }\n if (key === 'border') {\n Object.assign(styleObj, {\n borderTop: rawValue,\n borderRight: rawValue,\n borderBottom: rawValue,\n borderLeft: rawValue,\n });\n return;\n }\n if (key === 'borderColor') {\n Object.assign(styleObj, {\n borderTopColor: rawValue,\n borderRightColor: rawValue,\n borderBottomColor: rawValue,\n borderLeftColor: rawValue,\n });\n return;\n }\n if (key === 'borderStyle') {\n Object.assign(styleObj, {\n borderTopStyle: rawValue,\n borderRightStyle: rawValue,\n borderBottomStyle: rawValue,\n borderLeftStyle: rawValue,\n });\n return;\n }\n if (key === 'borderWidth') {\n Object.assign(styleObj, {\n borderTopWidth: rawValue,\n borderRightWidth: rawValue,\n borderBottomWidth: rawValue,\n borderLeftWidth: rawValue,\n });\n return;\n }\n const value = rawValue.trim();\n (styleObj as any)[key] = value;\n });\n\n return styleObj;\n}\n\nexport const parseText = (tsv: string, sep = '\\t'): RawCellType[][] => {\n tsv = tsv.replace(/\"\"/g, '\\x00');\n const rows: RawCellType[][] = [[]];\n let row = rows[0];\n let entering = false;\n let word = '';\n for (let i = 0; i < tsv.length; i++) {\n const s = tsv[i];\n if (s === '\\n' && !entering) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n row = [];\n rows.push(row);\n continue;\n }\n if (s === sep) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n continue;\n }\n if (s === '\"' && !entering && word === '') {\n entering = true;\n continue;\n }\n if (s === '\"' && entering) {\n entering = false;\n continue;\n }\n word += s;\n }\n if (word) {\n row.push({ value: restoreDoubleQuote(word) });\n }\n return rows;\n};\n\nconst restoreDoubleQuote = (text: string) => text.replace(/\\x00/g, '\"');\n\nconst blockTags = new Set([\n 'ADDRESS',\n 'ARTICLE',\n 'ASIDE',\n 'BLOCKQUOTE',\n 'DETAILS',\n 'DIALOG',\n 'DD',\n 'DIV',\n 'DL',\n 'DT',\n 'FIELDSET',\n 'FIGCAPTION',\n 'FIGURE',\n 'FOOTER',\n 'FORM',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'HEADER',\n 'HR',\n 'LI',\n 'MAIN',\n 'NAV',\n 'OL',\n 'P',\n 'PRE',\n 'SECTION',\n 'TABLE',\n 'UL',\n]);\n","import type { FC } from 'react';\nimport { useContext, useEffect, useState, useCallback, memo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { x2c, y2r } from '../lib/coords';\nimport { clip } from '../lib/clipboard';\nimport {\n clear,\n escape,\n select,\n setEditingAddress,\n undo,\n redo,\n arrow,\n walk,\n write,\n copy,\n cut,\n paste,\n setSearchQuery,\n setEntering,\n setInputting,\n setEditorHovering,\n updateSheet,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { areaToZone, zoneToArea } from '../lib/spatial';\nimport * as prevention from '../lib/operation';\nimport {\n expandInput,\n handleFormulaQuoteAutoClose,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n} from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { Lexer } from '../formula/evaluator';\nimport { COLOR_PALETTE } from '../lib/palette';\nimport { useAutocomplete } from './useAutocomplete';\nimport { EditorEventWithNativeEvent, FeedbackType, ModeType } from '../types';\nimport { Fixed } from './Fixed';\nimport { parseHTML, parseText } from '../lib/paste';\nimport React from 'react';\n\ntype Props = {\n mode: ModeType;\n};\n\nexport const Editor: FC<Props> = ({ mode }: Props) => {\n const { store, dispatch } = useContext(Context);\n const [shiftKey, setShiftKey] = useState(false);\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n inputting,\n selectingZone,\n editorRect,\n editingAddress,\n entering,\n matchingCells,\n matchingCellIndex,\n searchQuery,\n editorRef,\n largeEditorRef,\n searchInputRef,\n editingOnEnter,\n sheetReactive: sheetRef,\n sheetId,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n\n const renderOverlays = () => {\n if (!isFocused || !editing || typeof document === 'undefined') {\n return null;\n }\n if (editorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = editorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n const { bottom: top, left } = rect;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() ?? [];\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n useEffect(() => {\n focus(editorRef?.current);\n }, [editorRef]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheet.registry.lastFocused == null) {\n return;\n }\n if (sheet.registry.lastFocused !== editorRef.current) {\n return;\n }\n if (sheet.registry.lastFocused !== largeEditorRef.current) {\n return;\n }\n\n dispatch(setEditingAddress(''));\n }, [sheet?.registry.lastFocused, sheet, editorRef, largeEditorRef, dispatch]);\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.editingSheetId = sheetId;\n sheet.registry.editingAddress = editingAddress;\n }, [editingAddress, sheet, sheetId]);\n\n useEffect(() => {\n //sheet.registry.transmit();\n expandInput(editorRef.current);\n }, [inputting, editingAddress, editorRef]);\n\n const { y, x } = choosing;\n const rowId = `${y2r(y)}`;\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const editing = editingAddress === address;\n\n // Use 'RAW' so that spilled values (stored in solvedCaches) are already\n // reflected in cell.value without re-evaluating the formula.\n const cell = sheet?.getCell({ y, x }, { resolution: 'RAW' });\n const currentString = sheet ? sheet.getSerializedValue({ point: choosing, cell, resolution: 'RAW' }) : '';\n const [before, setBefore] = useState<string>(currentString);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n setBefore(value);\n },\n [before, dispatch],\n );\n\n const selectValue = useCallback(\n (selectedIndex: number) => {\n if (!sheet) {\n return;\n }\n const option = filteredOptions[selectedIndex];\n if (option) {\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n\n setTimeout(() => {\n if (editorRef.current) {\n focus(editorRef.current);\n editorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n } else {\n const t = sheet.update({\n diff: { [address]: { value: option.value } },\n partial: true,\n });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n setSelected(0);\n }\n },\n [filteredOptions, sheet, address, inputting, writeCell, dispatch, editorRef],\n );\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setBefore(currentString);\n dispatch(setInputting(currentString));\n resetInput(editorRef.current, sheet, choosing);\n }, [choosing, currentString, dispatch, editorRef, sheet]);\n\n const { y: top, x: left, height, width } = editorRect;\n\n const numLines = currentString.split('\\n').length;\n const [isKeyDown, setIsKeyDown] = useState(false);\n const handleKeyDown = useCallback(\n (e: EditorEventWithNativeEvent) => {\n if (!sheet) {\n return;\n }\n if (isKeyDown) {\n return;\n }\n // do not debounce it if control key is down.\n if (!(e.key === 'Meta' || e.key === 'Control')) {\n setIsKeyDown(true);\n requestAnimationFrame(() => {\n setIsKeyDown(false);\n });\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n const shiftKey = e.shiftKey;\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n return false;\n }\n } else {\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: shiftKey ? -1 : 1,\n }),\n );\n dispatch(setEditingAddress(''));\n return false;\n\n case 'Enter': // ENTER\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n e.preventDefault();\n return false;\n }\n } else if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n dispatch(setInputting(input.value));\n e.preventDefault();\n return false;\n } else {\n if (e.nativeEvent.isComposing) {\n return false;\n }\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n } else if (editingOnEnter && selectingZone.endY === -1) {\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input.dispatchEvent(dblclick);\n e.preventDefault();\n return false;\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: shiftKey ? -1 : 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n\n case 'Backspace': // BACKSPACE\n if (!editing) {\n // Spilled cells are read-only — clearing them would only erase the\n // cached spill value while the origin formula remains intact, causing\n // a confusing state where the FormulaBar goes blank but the cell\n // visually still shows the spilled value after re-evaluation.\n // e.preventDefault() is required here: without it the browser still\n // fires the default textarea behavior (deletes one char), which\n // triggers onInput → setInputting, making the value shrink character\n // by character on each Backspace press.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Delete': // DELETE\n if (!editing) {\n // Same guard as Backspace — spilled cells must not be cleared directly.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Shift': // SHIFT\n setShiftKey(true);\n return false;\n\n case 'Control': // CTRL\n return false;\n\n case 'Alt': // OPTION\n return false;\n\n case 'Meta': // COMMAND\n return false;\n\n case 'NumLock': // NUMLOCK\n return false;\n\n case 'Escape': // ESCAPE\n dispatch(escape(null));\n dispatch(setSearchQuery(undefined));\n dispatch(setInputting(before));\n // input.blur();\n return false;\n\n case 'ArrowLeft': // LEFT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: -1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowUp': // UP\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: -1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowRight': // RIGHT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: 1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowDown': // DOWN\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n return false;\n }\n }\n break;\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(input); // refocus\n return false;\n }\n return true;\n }\n break;\n case 'f': // F\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (typeof searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(searchInputRef.current));\n return false;\n }\n }\n break;\n case 'r': // R\n case 'y': // Y\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(redo(null));\n requestAnimationFrame(() => dispatch(setInputting(''))); // resetting textarea\n return false;\n }\n }\n break;\n case 's': // S\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n sheet.registry.onSave?.({\n sheet,\n points: {\n pointing: choosing,\n selectingFrom: {\n y: selectingZone.startY,\n x: selectingZone.startX,\n },\n selectingTo: {\n y: selectingZone.endY,\n x: selectingZone.endX,\n },\n },\n });\n return false;\n }\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n // moved to onPaste\n e.stopPropagation();\n return false;\n }\n break;\n case 'x': // X\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(input); // refocus\n\n return false;\n }\n }\n break;\n case 'z': // Z\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (e.shiftKey) {\n dispatch(redo(null));\n //window.setTimeout(() => apply(setInputting('')), 100); // resetting textarea\n } else {\n dispatch(undo(null));\n }\n return false;\n }\n }\n break;\n case ';': // semicolon\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n // MAYBE: need to aware timezone.\n writeCell(new Date().toDateString());\n }\n }\n break;\n }\n if (e.ctrlKey || e.metaKey) {\n return false;\n }\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return false;\n }\n dispatch(setEditingAddress(address));\n if (!editing) {\n dispatch(setInputting(''));\n }\n setSelected(0);\n return false;\n },\n [\n isKeyDown,\n editing,\n filteredOptions,\n selected,\n editingOnEnter,\n selectingZone,\n before,\n sheet,\n choosing,\n store,\n cell,\n address,\n writeCell,\n searchQuery,\n inputting,\n ],\n );\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n if (!sheet) {\n return;\n }\n sheet.registry.lastFocused = e.currentTarget;\n },\n [sheet],\n );\n\n const handleDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return;\n }\n const input = e.currentTarget;\n if (!editing) {\n dispatch(setInputting(currentString));\n dispatch(setEditingAddress(address));\n requestAnimationFrame(() => {\n input.style.width = `${input.scrollWidth}px`;\n input.style.height = `${input.scrollHeight}px`;\n const length = new String(currentString).length;\n input.setSelectionRange(length, length);\n });\n }\n },\n [cell, editing, currentString, address],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (isRefInsertable(e.currentTarget)) {\n return true;\n } else {\n if (editing) {\n writeCell(e.currentTarget.value);\n }\n }\n dispatch(setEditingAddress(''));\n },\n [editing, writeCell, dispatch],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n return;\n }\n dispatch(setInputting(e.currentTarget.value));\n setSelected(0);\n },\n [cell],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (editing) {\n return true;\n }\n\n const onlyValue = shiftKey;\n const html = e.clipboardData?.getData?.('text/html');\n if (html) {\n dispatch(paste({ matrix: parseHTML(html), onlyValue }));\n } else {\n const text = e.clipboardData?.getData?.('text/plain');\n if (text) {\n dispatch(paste({ matrix: parseText(text), onlyValue }));\n } else {\n console.warn('No clipboard data found.');\n }\n }\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [editing, shiftKey],\n );\n\n const handleKeyUpInternal = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n setShiftKey(false);\n const selectingArea = zoneToArea(store.selectingZone);\n sheet?.registry.onKeyUp?.({\n e,\n points: {\n pointing: choosing,\n selectingFrom: { y: selectingArea.top, x: selectingArea.left },\n selectingTo: { y: selectingArea.bottom, x: selectingArea.right },\n },\n });\n },\n [store.selectingZone, choosing, sheet],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent<HTMLLIElement>, index: number) => {\n selectValue(index);\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [selectValue],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <Fixed\n className={`gs-editor ${editing ? 'gs-editing' : ''}`}\n style={editing ? { top, left, height } : {}}\n {...{\n 'data-mode': mode,\n 'data-sheet-id': sheetId,\n }}\n >\n <div className={`gs-cell-label ${editing ? ' gs-hidden' : ''}`}>{address}</div>\n <div className=\"gs-editor-inner\" style={{ width }}>\n <pre\n className=\"gs-editor-hl\"\n style={{\n //...cell?.style,\n height: editorRef.current?.scrollHeight,\n width: (editorRef.current?.scrollWidth ?? 0) - 4,\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </pre>\n <textarea\n data-sheet-id={sheetId}\n name=\"gs-editor-input\"\n data-size=\"small\"\n autoFocus={true}\n spellCheck={false}\n draggable={false}\n ref={editorRef}\n rows={numLines}\n onFocus={handleFocus}\n style={{ minWidth: width, minHeight: height }}\n onDoubleClick={handleDoubleClick}\n onBlur={handleBlur}\n value={inputting}\n onChange={handleChange}\n onSelect={handleSelect}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUpInternal}\n onMouseEnter={() => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={() => {\n dispatch(setEditorHovering(false));\n }}\n />\n </div>\n {renderOverlays()}\n </Fixed>\n );\n};\n\n// Memoized token span component to prevent unnecessary re-renders\nconst TokenSpan = memo<{\n token: any;\n tokenKey: string;\n color?: string;\n className?: string;\n}>(\n ({ token, tokenKey, color, className }) => {\n return (\n <span key={tokenKey} style={color ? { color } : undefined} className={className}>\n {token.stringify()}\n </span>\n );\n },\n (prevProps, nextProps) => {\n // Custom comparison to prevent unnecessary re-renders\n return (\n prevProps.tokenKey === nextProps.tokenKey &&\n prevProps.color === nextProps.color &&\n prevProps.className === nextProps.className &&\n prevProps.token.stringify() === nextProps.token.stringify()\n );\n },\n);\n\nexport const editorStyle = (text: string) => {\n if (text[0] !== '=') {\n return <>{text}</>;\n }\n\n const lexer = new Lexer(text.substring(1));\n lexer.tokenize();\n let palletIndex = 0;\n const exists: { [ref: string]: number } = {};\n\n // Create a simple hash of the formula for stable keys\n const formulaHash = text.split('').reduce((hash, char) => {\n return ((hash << 5) - hash + char.charCodeAt(0)) & 0xffffffff;\n }, 0);\n\n return (\n <>\n =\n {lexer.tokens.map((token, i) => {\n // Handle SPACE tokens differently - render as plain text\n if (token.type === 'SPACE') {\n return <React.Fragment key={`${formulaHash}-SPACE-${i}`}>{token.stringify()}</React.Fragment>;\n }\n\n // Create a stable key based on formula hash, token content and index\n const tokenKey = `${formulaHash}-${token.type}-${token.stringify()}-${i}`;\n\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedToken = token.stringify();\n const existsIndex = exists[normalizedToken];\n if (existsIndex !== undefined) {\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={COLOR_PALETTE[existsIndex % COLOR_PALETTE.length]}\n />\n );\n }\n const color = COLOR_PALETTE[palletIndex % COLOR_PALETTE.length];\n exists[normalizedToken] = palletIndex++;\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={color}\n className={`gs-token-type-${token.type}`}\n />\n );\n }\n\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n className={`gs-token-type-${token.type} gs-token-entity-type-${typeof token.entity}`}\n />\n );\n })}\n </>\n );\n};\n","import type { ReactNode } from 'react';\nimport { createContext, useContext, useState } from 'react';\n\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\n\nexport type PluginContextType = {\n provided: boolean;\n store?: StoreType;\n apply?: Dispatcher;\n setStore: (store: StoreType) => void;\n setApply: (apply: Dispatcher) => void;\n};\n\nexport const PluginContext = createContext({} as PluginContextType);\n\nexport function useInitialPluginContext(): PluginContextType {\n const [store, setStore] = useState<StoreType | undefined>(undefined);\n const [apply, setApply] = useState<Dispatcher>();\n return {\n provided: true,\n store,\n apply,\n setStore,\n setApply,\n };\n}\n\nexport function usePluginContext(): [boolean, PluginContextType] {\n const ctx = useContext(PluginContext);\n if (ctx?.provided == null) {\n return [false, ctx];\n }\n return [true, ctx];\n}\n\nexport function usePluginDispatch() {\n const sync = useContext(PluginContext);\n if (!sync) {\n return undefined;\n }\n return sync;\n}\n\ntype Props = {\n children: ReactNode;\n context: PluginContextType;\n};\n\nexport function PluginBase({ children, context }: Props) {\n const [provided] = usePluginContext();\n if (provided) {\n return <>{children}</>;\n }\n return <PluginContext.Provider value={context}>{children}</PluginContext.Provider>;\n}\n","import type { FC, MutableRefObject } from 'react';\nimport { createRef, useContext, useEffect, useRef, useState } from 'react';\n\nimport type { OptionsType, Props, SheetHandle, StoreHandle } from '../types';\nimport { Context } from '../store';\n\nimport { setStore, updateSheet } from '../store/actions';\n\nimport { usePluginContext } from './PluginBase';\nimport { Sheet } from '../lib/sheet';\n\ntype StoreObserverProps = OptionsType & {\n sheetName?: string;\n sheetRef?: MutableRefObject<SheetHandle | null>;\n storeRef?: MutableRefObject<StoreHandle | null>;\n};\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\nexport const StoreObserver: FC<StoreObserverProps> = ({\n sheetName,\n sheetHeight,\n sheetWidth,\n sheetRef,\n storeRef,\n editingOnEnter,\n mode,\n}) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheetName && sheetName !== sheet.name) {\n sheet.name = sheetName;\n sheet.registry.sheetIdsByName[sheetName] = sheet.id;\n delete sheet.registry.sheetIdsByName[sheet.prevName];\n sheet.prevName = sheetName;\n //book.transmit();\n }\n }, [sheetName]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const { registry } = sheet;\n requestAnimationFrame(() => registry.boot());\n registry.contextsBySheetId[sheet.id] = { store, dispatch };\n registry.transmit();\n\n if (sheetRef) {\n sheetRef.current = {\n sheet,\n apply: (sheet) => {\n dispatch(updateSheet(sheet as Sheet));\n },\n };\n }\n if (storeRef) {\n storeRef.current = {\n store,\n apply: (store) => {\n dispatch(setStore(store));\n },\n dispatch,\n };\n }\n }, [store, sheet, sheetRef, storeRef]);\n\n useEffect(() => {\n if (sheetHeight) {\n dispatch(setStore({ sheetHeight }));\n }\n }, [sheetHeight, dispatch]);\n useEffect(() => {\n if (sheetWidth) {\n dispatch(setStore({ sheetWidth }));\n }\n }, [sheetWidth]);\n useEffect(() => {\n if (typeof editingOnEnter !== 'undefined') {\n dispatch(setStore({ editingOnEnter }));\n }\n }, [editingOnEnter]);\n useEffect(() => {\n if (mode) {\n dispatch(setStore({ mode }));\n }\n }, [mode]);\n\n const [pluginProvided, pluginContext] = usePluginContext();\n useEffect(() => {\n if (!pluginProvided) {\n return;\n }\n pluginContext.setStore(store);\n pluginContext.setApply(() => dispatch);\n }, [store, pluginProvided, pluginContext]);\n\n return <></>;\n};\n","import { useContext } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport { Context } from '../store';\nimport { setResizingPositionY, setResizingPositionX, updateSheet, setStore } from '../store/actions';\n\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_WIDTH, MIN_HEIGHT } from '../constants';\nimport { zoneToArea, makeSequence, between } from '../lib/spatial';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '../lib/coords';\nimport { focus } from '../lib/dom';\n\nexport const Resizer = () => {\n const { store, dispatch } = useContext(Context);\n const {\n resizingPositionY: posY,\n resizingPositionX: posX,\n sheetReactive: sheetRef,\n leftHeaderSelecting,\n topHeaderSelecting,\n selectingZone,\n editorRef,\n mainRef,\n } = store;\n const sheet = sheetRef.current;\n\n const [y, startY, endY] = posY;\n const [x, startX, endX] = posX;\n\n if (mainRef.current == null || editorRef.current == null || !sheet) {\n return <div className=\"gs-resizing gs-hidden\" />;\n }\n\n const cell = sheet.getCell({ y: y === -1 ? 0 : y, x: x === -1 ? 0 : x }, { resolution: 'SYSTEM' });\n const { y: offsetY, x: offsetX } = mainRef.current.getBoundingClientRect();\n\n const baseWidth = cell?.width || DEFAULT_WIDTH;\n const baseHeight = cell?.height || DEFAULT_HEIGHT;\n\n const width = baseWidth + (endX - startX);\n const height = baseHeight + (endY - startY);\n\n const handleResizeEnd = () => {\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n if (x !== -1) {\n let xs = [x];\n if (topHeaderSelecting && between({ start: left, end: right }, x)) {\n xs = makeSequence(left, right + 1);\n }\n xs.forEach((x) => {\n diff[p2a({ y: 0, x })] = { width };\n });\n }\n if (y !== -1) {\n let ys = [y];\n if (leftHeaderSelecting && between({ start: top, end: bottom }, y)) {\n ys = makeSequence(top, bottom + 1);\n }\n ys.forEach((y) => {\n diff[p2a({ y, x: 0 })] = { height };\n });\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: { selectingZone, sheetId: sheet.id },\n });\n dispatch(\n setStore({\n sheetReactive: { current: sheet },\n }),\n );\n dispatch(setResizingPositionY([-1, -1, -1]));\n dispatch(setResizingPositionX([-1, -1, -1]));\n focus(editorRef.current);\n };\n const handleResizeMove = (e: MouseEvent) => {\n if (y !== -1) {\n let endY = e.clientY;\n const height = baseHeight + (endY - startY);\n if (height < MIN_HEIGHT) {\n endY += MIN_HEIGHT - height;\n }\n dispatch(setResizingPositionY([y, startY, endY]));\n } else if (x !== -1) {\n let endX = e.clientX;\n const width = baseWidth + (endX - startX);\n if (width < MIN_WIDTH) {\n endX += MIN_WIDTH - width;\n }\n dispatch(setResizingPositionX([x, startX, endX]));\n }\n };\n\n return (\n <div\n className={`gs-resizing ${y === -1 && x === -1 ? 'gs-hidden' : ''}`}\n onMouseUp={handleResizeEnd}\n onMouseMove={handleResizeMove}\n >\n <div className={`gs-line-vertical ${x === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: 1, height: '100%', left: endX - offsetX }}>\n <span style={{ left: '-50%' }}>{width}px</span>\n </div>\n </div>\n <div className={`gs-line-horizontal ${y === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: '100%', height: 1, top: endY - offsetY }}>\n <span style={{ top: '-50%' }}>{height}px</span>\n </div>\n </div>\n </div>\n );\n};\n","import type { FC } from 'react';\nimport { useContext, useEffect, useRef } from 'react';\nimport { Context } from '../store';\n\nexport const Emitter: FC = () => {\n const { store } = useContext(Context);\n const { choosing: pointing, selectingZone: zone, sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (sheet?.isInitialized && sheet.currentVersion > 0 && sheet.registry.onChange) {\n sheet.registry.onChange({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [sheetReactive]);\n\n useEffect(() => {\n if (sheet && sheet.registry.onSelect) {\n sheet.registry.onSelect({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [pointing, zone]);\n return null;\n};\n","import type { StoreDispatchType, FilterConfig, RawCellType } from '../types';\nimport { areaToZone, zoneShape, zoneToArea } from '../lib/spatial';\nimport { focus } from '../lib/dom';\nimport { p2a } from '../lib/coords';\nimport {\n copy,\n cut,\n paste,\n undo,\n redo,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n setSearchQuery,\n setEntering,\n updateSheet,\n} from './actions';\nimport { clip } from '../lib/clipboard';\nimport { parseHTML, parseText } from '../lib/paste';\n\nexport const copier = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const cutter = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const paster = async ({ store, dispatch }: StoreDispatchType, onlyValue = false) => {\n const { editorRef } = store;\n const items = await navigator.clipboard.read();\n let cells: RawCellType[][] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.types.indexOf('text/html') !== -1) {\n const blob = await item.getType('text/html');\n const html = await blob.text();\n if (html) {\n cells = parseHTML(html, onlyValue);\n break;\n }\n } else if (item.types.indexOf('text/plain') !== -1) {\n const blob = await item.getType('text/plain');\n const text = await blob.text();\n if (text) {\n cells = parseText(text);\n break;\n }\n }\n }\n dispatch(paste({ matrix: cells, onlyValue }));\n focus(editorRef.current);\n};\n\nexport const undoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(undo(null));\n focus(editorRef.current);\n};\n\nexport const redoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(redo(null));\n focus(editorRef.current);\n};\n\nexport const rowsInserterAbove = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsAbove({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsInserterBelow = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { bottom } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsBelow({ numRows, y: bottom, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterLeft = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsLeft({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterRight = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { right } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsRight({ numCols, x: right, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(removeRows({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(removeCols({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsSorterAsc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'asc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsSorterDesc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'desc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterer = async ({ store, dispatch }: StoreDispatchType, x: number, filter: FilterConfig) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(filterRows({ x, filter }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterClearer = async ({ store, dispatch }: StoreDispatchType, x?: number) => {\n dispatch(filterRows({ x }));\n focus(store.editorRef.current);\n};\n\nexport const rowSortFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.sortFixed || undefined;\n sheet.update({ diff: { [addr]: { sortFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const rowFilterFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.filterFixed || undefined;\n sheet.update({ diff: { [addr]: { filterFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const searcher = async ({ store, dispatch }: StoreDispatchType) => {\n if (typeof store.searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(store.searchInputRef.current));\n};\n\nexport const applyers = {\n copy: copier,\n cut: cutter,\n paste: paster,\n undo: undoer,\n redo: redoer,\n insertRowsAbove: rowsInserterAbove,\n insertRowsBelow: rowsInserterBelow,\n insertColsLeft: colsInserterLeft,\n insertColsRight: colsInserterRight,\n removeRows: rowsRemover,\n removeCols: colsRemover,\n sortRowsAsc: rowsSorterAsc,\n sortRowsDesc: rowsSorterDesc,\n filterRows: rowsFilterer,\n clearFilter: rowsFilterClearer,\n toggleSortFixed: rowSortFixedToggler,\n toggleFilterFixed: rowFilterFixedToggler,\n search: searcher,\n};\n","/**\n * Menu system — types, default descriptors, and MenuContext builder.\n */\n\n// ---- types ----------------------------------------------------------------\n\nimport type { PointType, ZoneType, FilterConfig } from '../types';\nimport type { UserSheet } from './sheet';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport * as prevention from './operation';\nimport { zoneShape } from './spatial';\nimport { p2a } from './coords';\nimport {\n copier,\n cutter,\n paster,\n undoer,\n redoer,\n rowsSorterAsc,\n rowsSorterDesc,\n rowsFilterer,\n rowsFilterClearer,\n rowSortFixedToggler,\n rowFilterFixedToggler,\n searcher,\n} from '../store/dispatchers';\nimport {\n insertRowsAbove as _insertRowsAbove,\n insertRowsBelow as _insertRowsBelow,\n removeRows as _removeRows,\n insertColsLeft as _insertColsLeft,\n insertColsRight as _insertColsRight,\n removeCols as _removeCols,\n setStore as _setStore,\n} from '../store/actions';\n\nexport type MenuContext = {\n /** Current sheet instance */\n sheet: UserSheet;\n /** Currently focused cell */\n choosing: PointType;\n /** Currently selected zone */\n selectingZone: ZoneType;\n /** True when the left (row) header is being selected */\n leftHeaderSelecting: boolean;\n /** True when the top (column) header is being selected */\n topHeaderSelecting: boolean;\n\n // ---- actions ----\n cut(): Promise<void>;\n copy(): Promise<void>;\n paste(onlyValue?: boolean): Promise<void>;\n undo(): void;\n redo(): void;\n insertRowsAbove(y: number, numRows: number): void;\n insertRowsBelow(y: number, numRows: number): void;\n removeRows(y: number, numRows: number): void;\n insertColsLeft(x: number, numCols: number): void;\n insertColsRight(x: number, numCols: number): void;\n removeCols(x: number, numCols: number): void;\n sortRows(x: number, direction: 'asc' | 'desc'): Promise<void>;\n filterRows(x: number, filter?: FilterConfig): Promise<void>;\n clearFilter(x?: number): void;\n toggleSortFixed(y: number): void;\n toggleFilterFixed(y: number): void;\n search(): void;\n updateColLabel(x: number, label: string | undefined): void;\n /** Close the currently open menu */\n close(): void;\n};\n\nexport type MenuDividerItem = { type: 'divider'; visible?: (ctx: MenuContext) => boolean };\n\n/**\n * Base structure shared by all menu item descriptors.\n * `Args` is the tuple of coordinate arguments passed after `ctx`:\n * - `[]` → ContextMenu (no coordinate)\n * - `[y: number]` → RowMenu\n * - `[x: number]` → ColMenu\n */\nexport type MenuItemBase<Args extends unknown[] = []> = {\n type?: 'item';\n id?: string;\n label: string | ((ctx: MenuContext, ...args: Args) => string);\n shortcuts?: string[] | ((ctx: MenuContext, ...args: Args) => string[]);\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n disabled?: (ctx: MenuContext, ...args: Args) => boolean;\n /** Render a checkmark prefix when defined. */\n checked?: (ctx: MenuContext, ...args: Args) => boolean;\n onClick: (ctx: MenuContext, ...args: Args) => void | Promise<void>;\n};\n\n/**\n * A menu entry that renders a registered React component.\n * Use `registerMenuComponent(id, Component)` to associate an id with a component,\n * then reference it here as `{ type: 'component', componentId: id }`.\n */\nexport type MenuComponentItem<Args extends unknown[] = []> = {\n type: 'component';\n componentId: string;\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n};\n\nexport type ContextMenuItemDescriptor = MenuDividerItem | MenuItemBase | MenuComponentItem;\nexport type RowMenuItemDescriptor = MenuDividerItem | MenuItemBase<[y: number]> | MenuComponentItem<[y: number]>;\nexport type ColMenuItemDescriptor = MenuDividerItem | MenuItemBase<[x: number]> | MenuComponentItem<[x: number]>;\n\n// ---- helpers ---------------------------------------------------------------\n\nconst rowInsertCount = (ctx: MenuContext, y: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startY, selectingZone.endY);\n const selEnd = Math.max(selectingZone.startY, selectingZone.endY);\n const isFullRow = selectingZone.startX === 1 && selectingZone.endX === ctx.sheet.numCols;\n return isFullRow && y >= selStart && y <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\nconst colInsertCount = (ctx: MenuContext, x: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startX, selectingZone.endX);\n const selEnd = Math.max(selectingZone.startX, selectingZone.endX);\n const isFullCol = selectingZone.startY === 1 && selectingZone.endY === ctx.sheet.numRows;\n return isFullCol && x >= selStart && x <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\n// ---- default descriptors ---------------------------------------------------\n\nexport const defaultContextMenuDescriptors: ContextMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider', visible: (ctx) => ctx.leftHeaderSelecting || ctx.topHeaderSelecting },\n {\n id: 'insert-rows-above',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx) => ctx.insertRowsAbove(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-rows-below',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx) => ctx.insertRowsBelow(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-cols-left',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx) => ctx.insertColsLeft(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'insert-cols-right',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx) => ctx.insertColsRight(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'remove-rows',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx) => ctx.removeRows(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'remove-cols',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx) => ctx.removeCols(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n { type: 'divider' },\n {\n id: 'undo',\n label: 'Undo',\n shortcuts: ['Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() <= -1,\n onClick: (ctx) => ctx.undo(),\n },\n {\n id: 'redo',\n label: 'Redo',\n shortcuts: ['R', 'Y', 'Shift+Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() >= ctx.sheet.historySize() - 1,\n onClick: (ctx) => ctx.redo(),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\nexport const defaultRowMenuDescriptors: RowMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-rows-above',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsAbove(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'insert-rows-below',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsBelow(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'remove-rows',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx, y) => ctx.removeRows(y, rowInsertCount(ctx, y)),\n },\n { type: 'divider' },\n {\n id: 'toggle-sort-fixed',\n label: 'Fix row for sorting',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.sortFixed,\n onClick: (ctx, y) => ctx.toggleSortFixed(y),\n },\n {\n id: 'toggle-filter-fixed',\n label: 'Fix row for filtering',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.filterFixed,\n onClick: (ctx, y) => ctx.toggleFilterFixed(y),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\n// The col menu composes registered section components (filter, sort, label) and\n// simple menu items. Use `registerMenuComponent` to override built-in sections.\nexport const defaultColMenuDescriptors: ColMenuItemDescriptor[] = [\n { type: 'component', componentId: 'col-filter' },\n { type: 'divider' },\n { type: 'component', componentId: 'col-sort' },\n { type: 'divider' },\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-cols-left',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx, x) => ctx.insertColsLeft(x, colInsertCount(ctx, x)),\n },\n {\n id: 'insert-cols-right',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx, x) => ctx.insertColsRight(x, colInsertCount(ctx, x)),\n },\n {\n id: 'remove-cols',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx, x) => ctx.removeCols(x, colInsertCount(ctx, x)),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n { type: 'divider' },\n { type: 'component', componentId: 'col-label' },\n];\n\n// ---- buildMenuContext -------------------------------------------------------\n\nexport function buildMenuContext(store: StoreType, dispatch: Dispatcher, close: () => void): MenuContext {\n const props = { store, dispatch };\n const sheet = store.sheetReactive.current!;\n\n return {\n sheet,\n choosing: store.choosing,\n selectingZone: store.selectingZone,\n leftHeaderSelecting: store.leftHeaderSelecting,\n topHeaderSelecting: store.topHeaderSelecting,\n\n cut: () => cutter(props),\n copy: () => copier(props),\n paste: (onlyValue = false) => paster(props, onlyValue),\n undo: () => undoer(props),\n redo: () => redoer(props),\n\n insertRowsAbove: (y, numRows) => {\n dispatch(_insertRowsAbove({ numRows, y, operator: 'USER' }));\n },\n insertRowsBelow: (y, numRows) => {\n dispatch(_insertRowsBelow({ numRows, y, operator: 'USER' }));\n },\n removeRows: (y, numRows) => {\n dispatch(_removeRows({ numRows, y, operator: 'USER' }));\n },\n insertColsLeft: (x, numCols) => {\n dispatch(_insertColsLeft({ numCols, x, operator: 'USER' }));\n },\n insertColsRight: (x, numCols) => {\n dispatch(_insertColsRight({ numCols, x, operator: 'USER' }));\n },\n removeCols: (x, numCols) => {\n dispatch(_removeCols({ numCols, x, operator: 'USER' }));\n },\n\n sortRows: async (x, direction) => {\n if (direction === 'asc') {\n await rowsSorterAsc(props, x);\n } else {\n await rowsSorterDesc(props, x);\n }\n },\n filterRows: async (x, filter) => {\n if (filter) {\n await rowsFilterer(props, x, filter);\n } else {\n rowsFilterClearer(props, x);\n }\n },\n clearFilter: (x) => rowsFilterClearer(props, x),\n\n toggleSortFixed: (y) => rowSortFixedToggler(props, y),\n toggleFilterFixed: (y) => rowFilterFixedToggler(props, y),\n\n search: () => searcher(props),\n\n updateColLabel: (x, label) => {\n if (!sheet) {\n return;\n }\n const addr = p2a({ y: 0, x });\n sheet.update({\n diff: { [addr]: { label: label || undefined } },\n partial: true,\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(_setStore({ sheetReactive: { current: sheet } }));\n },\n\n close,\n };\n}\n\n// ---- menu component registry -----------------------------------------------\n\nimport type { FC } from 'react';\n\nexport type ContextMenuSectionProps = {\n close: () => void;\n};\n\nexport type RowMenuSectionProps = {\n y: number;\n close: () => void;\n};\n\nexport type ColMenuSectionProps = {\n x: number;\n close: () => void;\n /** Signal waiting state to parent menu. Pass null to clear. */\n onWaiting?: (message: string | null, cancel?: () => void) => void;\n};\n\nconst _menuComponentRegistry = new Map<string, FC<any>>();\n\n/**\n * Register a React component under a string id so it can be referenced in menu\n * descriptors via `{ type: 'component', componentId: '...' }`.\n *\n * Built-in ids: `'col-filter'`, `'col-sort'`, `'col-label'`.\n * You can override any built-in by registering your own component with the same id.\n */\n\nexport function registerMenuComponent(id: string, component: FC<any>): void {\n _menuComponentRegistry.set(id, component);\n}\n\n/** Look up a previously registered component by id. */\n\nexport function getMenuComponent(id: string): FC<any> | undefined {\n return _menuComponentRegistry.get(id);\n}\n","import type { FC } from 'react';\n\ntype MenuItemProps = {\n label: string;\n shortcuts?: string[];\n disabled?: boolean;\n /**\n * undefined → no check column\n * true/false → displayed as a toggle row with a checkmark\n */\n checked?: boolean;\n testId?: string;\n onClick?: () => void;\n className?: string;\n};\n\nexport const MenuItem: FC<MenuItemProps> = ({\n label,\n shortcuts,\n disabled = false,\n checked,\n testId,\n onClick,\n className,\n}) => {\n const hasCheck = checked !== undefined;\n return (\n <li\n className={`gs-menu-item ${disabled ? 'gs-disabled' : 'gs-enabled'}${className ? ` ${className}` : ''}`}\n data-testid={testId}\n onClick={disabled ? undefined : onClick}\n >\n <div className={`gs-menu-name${hasCheck ? ' gs-row-fixed-toggle' : ''}`}>\n {hasCheck && <span className={`gs-row-fixed-check${checked ? ' gs-row-fixed-active' : ''}`}>✓</span>}\n {label}\n </div>\n {shortcuts != null && shortcuts.length > 0 && (\n <div className=\"gs-menu-shortcut\">\n {shortcuts.map((shortcut, i) => (\n <span key={i}>\n {i > 0 && <span className=\"gs-menu-shortcut-sep\">, </span>}\n <span className=\"gs-menu-shortcut-badge\">\n {shortcut.split('+').map((part, j, arr) =>\n j < arr.length - 1 ? (\n <span key={j}>{part}+</span>\n ) : (\n <span key={j} className=\"gs-menu-underline\">\n {part}\n </span>\n ),\n )}\n </span>\n </span>\n ))}\n </div>\n )}\n </li>\n );\n};\n\nexport const MenuDivider: FC = () => <li className=\"gs-menu-divider\" />;\n","import { useContext, useRef, useLayoutEffect } from 'react';\n\nimport { setContextMenuPosition } from '../store/actions';\n\nimport { Context } from '../store';\nimport { Fixed } from './Fixed';\nimport type { ContextMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\nimport { clampPopup } from '../lib/popup';\n\nexport const ContextMenu = () => {\n const { store, dispatch } = useContext(Context);\n const { contextMenuPosition, contextMenu } = store;\n const { y: top, x: left } = contextMenuPosition;\n const menuRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (menuRef.current) {\n clampPopup(menuRef.current);\n }\n });\n\n if (top === -1) {\n return null;\n }\n\n const close = () => dispatch(setContextMenuPosition({ y: -1, x: -1 }));\n const ctx = buildMenuContext(store, dispatch, close);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-context-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n close();\n return false;\n }}\n >\n <div ref={menuRef} className={'gs-context-menu'} style={{ top: top, left: left }}>\n <ul className=\"gs-menu-items\">\n {contextMenu.map((d, i) => {\n if (d.type === 'divider') {\n if (d.visible && !d.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={i} />;\n }\n if (d.type === 'component') {\n return null;\n }\n const visible = !d.visible || d.visible(ctx);\n if (!visible) {\n return null;\n }\n const disabled = d.disabled?.(ctx) ?? false;\n const label = typeof d.label === 'function' ? d.label(ctx) : d.label;\n const shortcuts = typeof d.shortcuts === 'function' ? d.shortcuts(ctx) : d.shortcuts;\n const checked = d.checked?.(ctx);\n return (\n <MenuItem\n key={i}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={d.id ? `${d.id}-item` : undefined}\n onClick={() => d.onClick(ctx)}\n />\n );\n })}\n </ul>\n </div>\n </Fixed>\n );\n};\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { filterRows } from '../store/actions';\nimport type { FilterCondition, FilterConditionMethod } from '../types';\nimport * as prevention from '../lib/operation';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst METHOD_LABELS: Record<FilterConditionMethod, string> = {\n eq: '=',\n ne: '≠',\n gt: '>',\n gte: '≥',\n lt: '<',\n lte: '≤',\n blank: 'Blank',\n nonblank: 'Nonblank',\n includes: 'Includes',\n excludes: 'Excludes',\n};\n\nconst NO_VALUE_METHODS: FilterConditionMethod[] = ['blank', 'nonblank'];\nconst DEFAULT_CONDITION: FilterCondition = { method: 'eq', value: [''] };\n\ntype PendingFilter = {\n x: number;\n conditions: FilterCondition[];\n mode: 'and' | 'or';\n};\n\nconst FilterSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [conditions, setConditions] = useState<FilterCondition[]>([{ ...DEFAULT_CONDITION }]);\n const [mode, setMode] = useState<'and' | 'or'>('or');\n const [pending, setPending] = useState<PendingFilter | null>(null);\n\n // Auto-focus first value input when x changes\n const firstValueRef = useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.focus();\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [x],\n );\n\n // Restore conditions from existing filter on the column cell when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const existing = colCell?.filter;\n if (existing && existing.conditions.length > 0) {\n setConditions(existing.conditions.map((c) => ({ ...c, value: [...c.value] })));\n setMode(existing.mode || 'or');\n } else {\n setConditions([{ ...DEFAULT_CONDITION, value: [''] }]);\n setMode('or');\n }\n }\n }, [x, sheet]);\n\n // Escape key cancels during waiting\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Filtering…', handleCancel);\n }\n // Do NOT include onWaiting/handleCancel in deps to avoid re-triggering execute\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending filter after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n const { x: actionX, conditions: validConditions, mode: filterMode } = pending;\n if (validConditions.length > 0) {\n dispatch(filterRows({ x: actionX, filter: { mode: filterMode, conditions: validConditions } }));\n } else {\n dispatch(filterRows({ x: actionX }));\n }\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n const updateCondition = useCallback((index: number, patch: Partial<FilterCondition>) => {\n setConditions((prev) => {\n const next = [...prev];\n next[index] = { ...next[index], ...patch };\n return next;\n });\n }, []);\n\n const addCondition = useCallback(() => {\n setConditions((prev) => [...prev, { ...DEFAULT_CONDITION, value: [''] }]);\n }, []);\n\n const removeCondition = useCallback((index: number) => {\n setConditions((prev) => {\n if (prev.length <= 1) {\n return [{ ...DEFAULT_CONDITION, value: [''] }];\n }\n return prev.filter((_, i) => i !== index);\n });\n }, []);\n\n const handleApplyFilter = useCallback(() => {\n const valid = conditions.filter((c) => {\n if (NO_VALUE_METHODS.includes(c.method)) {\n return true;\n }\n return c.value.some((v) => v.trim() !== '');\n });\n setPending({ x, conditions: valid, mode });\n }, [x, conditions, mode]);\n\n const handleResetColumn = useCallback(() => {\n setPending(null);\n dispatch(filterRows({ x }));\n close();\n }, [dispatch, x, close]);\n\n const handleResetAll = useCallback(() => {\n setPending(null);\n dispatch(filterRows({}));\n close();\n }, [dispatch, close]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const filterDisabled = prevention.hasOperation(colCell?.prevention, prevention.Filter);\n const hasAnyFilter = sheet.hasActiveFilters();\n\n return (\n <li className={`gs-column-menu-filter${filterDisabled ? ' gs-disabled' : ''}`}>\n <>\n <div className=\"gs-filter-header\">\n <div className=\"gs-menu-name\">Filter:</div>\n <button className=\"gs-filter-add-btn\" onClick={addCondition} disabled={filterDisabled}>\n + ADD\n </button>\n <div className={`gs-filter-mode-toggle${conditions.length <= 1 ? ' gs-disabled' : ''}`}>\n <label className={mode === 'and' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'and'}\n onChange={() => setMode('and')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n AND\n </label>\n <label className={mode === 'or' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'or'}\n onChange={() => setMode('or')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n OR\n </label>\n </div>\n </div>\n <div className=\"gs-filter-conditions\">\n {conditions.map((cond, i) => (\n <div className=\"gs-filter-condition-row\" key={i}>\n <select\n className=\"gs-filter-method-select\"\n value={cond.method}\n disabled={filterDisabled}\n tabIndex={i * 2 + 1}\n onChange={(e) => updateCondition(i, { method: e.target.value as FilterConditionMethod })}\n >\n {(Object.keys(METHOD_LABELS) as FilterConditionMethod[]).map((m) => (\n <option key={m} value={m}>\n {METHOD_LABELS[m]}\n </option>\n ))}\n </select>\n {!NO_VALUE_METHODS.includes(cond.method) && (\n <input\n ref={i === 0 ? firstValueRef : undefined}\n className=\"gs-filter-value-input\"\n type=\"text\"\n placeholder=\"Value\"\n value={cond.value[0] || ''}\n disabled={filterDisabled}\n tabIndex={i * 2 + 2}\n onChange={(e) => updateCondition(i, { value: [e.target.value] })}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyFilter();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n )}\n <button\n className=\"gs-filter-remove-btn\"\n onClick={() => removeCondition(i)}\n disabled={filterDisabled}\n title=\"Remove condition\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n <div className=\"gs-filter-actions\">\n {hasAnyFilter && (\n <button className=\"gs-filter-reset-all-btn\" onClick={handleResetAll}>\n RESET ALL\n </button>\n )}\n <div className=\"gs-filter-actions-right\">\n {colCell?.filter && (\n <button className=\"gs-filter-reset-btn\" onClick={handleResetColumn}>\n RESET\n </button>\n )}\n <button className=\"gs-filter-apply-btn\" onClick={handleApplyFilter} disabled={filterDisabled}>\n APPLY\n </button>\n </div>\n </div>\n </>\n </li>\n );\n};\n\nregisterMenuComponent('col-filter', FilterSection);\nexport { FilterSection };\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { sortRows } from '../store/actions';\nimport * as prevention from '../lib/operation';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\ntype PendingSort = {\n x: number;\n direction: 'asc' | 'desc';\n};\n\nconst SortSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [pending, setPending] = useState<PendingSort | null>(null);\n\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Sorting\\u2026', handleCancel);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending sort after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n dispatch(sortRows({ x: pending.x, direction: pending.direction }));\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const sortDisabled = prevention.hasOperation(colCell?.prevention, prevention.Sort);\n\n return (\n <li className={`gs-menu-item gs-column-menu-sort${sortDisabled ? ' gs-disabled' : ''}`}>\n <div className=\"gs-menu-name\">Sort:</div>\n <div className=\"gs-sort-buttons\">\n <button\n className=\"gs-sort-btn gs-sort-btn-asc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'asc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↓ A to Z\n </button>\n <button\n className=\"gs-sort-btn gs-sort-btn-desc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'desc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↑ Z to A\n </button>\n </div>\n </li>\n );\n};\n\nregisterMenuComponent('col-sort', SortSection);\nexport { SortSection };\n","import type { PointType } from '../types';\nimport type { UserSheet } from './sheet';\n\nexport const getLabel = (sheet: UserSheet, label: string | undefined, point: PointType, n: number): string | null => {\n if (label != null) {\n return label;\n }\n const policy = sheet.getPolicy(point);\n return (point.x === 0 ? policy.renderRowHeaderLabel(n) : policy.renderColHeaderLabel(n)) ?? null;\n};\n","import { type FC, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { Context } from '../store';\nimport { setStore } from '../store/actions';\nimport * as prevention from '../lib/operation';\nimport { x2c, p2a } from '../lib/coords';\nimport { getLabel } from '../lib/label';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst LabelSection: FC<ColMenuSectionProps> = ({ x, close }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n const labelInputRef = useRef<HTMLInputElement>(null);\n const [label, setLabel] = useState('');\n\n // Restore label value when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n setLabel(colCell?.label ?? '');\n }\n }, [x, sheet]);\n\n const handleApplyLabel = useCallback(() => {\n if (!sheet) {\n return;\n }\n const address = p2a({ y: 0, x });\n sheet.update({\n diff: { [address]: { label: label || undefined } },\n partial: true,\n ignoreFields: [],\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(setStore({ sheetReactive: { current: sheet } }));\n close();\n }, [dispatch, x, label, close, sheet, store.selectingZone, store.choosing]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const labelDisabled = prevention.hasOperation(colCell?.prevention, prevention.SetLabel);\n const labelPlaceholder = getLabel(sheet, colCell?.label, { y: 0, x }, x) ?? x2c(x);\n\n return (\n <li className={`gs-menu-item gs-column-menu-label${labelDisabled ? ' gs-disabled' : ''}`}>\n <label className=\"gs-label-input-row\">\n <div className=\"gs-label-input-label\">Label:</div>\n <input\n ref={labelInputRef}\n className=\"gs-label-input\"\n type=\"text\"\n placeholder={labelPlaceholder}\n value={label}\n disabled={labelDisabled}\n onChange={(e) => setLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyLabel();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n <button className=\"gs-label-apply-btn\" onClick={handleApplyLabel} disabled={labelDisabled}>\n UPDATE\n </button>\n </label>\n </li>\n );\n};\n\nregisterMenuComponent('col-label', LabelSection);\nexport { LabelSection };\n","import { type FC, useContext, useCallback, useState } from 'react';\nimport { Context } from '../store';\nimport { setColumnMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '../lib/dom';\nimport { buildMenuContext } from '../lib/menu';\nimport { getMenuComponent } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\n// Import section modules so their registerMenuComponent() calls run at load time.\n// Users may override any of these ids via registerMenuComponent() after import.\nimport './ColumnMenuFilterSection';\nimport './ColumnMenuSortSection';\nimport './ColumnMenuLabelSection';\n\nexport const ColumnMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { columnMenuState, editorRef, colMenu } = store;\n const sheet = store.sheetReactive.current;\n\n const x = columnMenuState?.x;\n const position = columnMenuState?.position;\n\n const [waitingState, setWaitingState] = useState<{ message: string; cancel: () => void } | null>(null);\n\n const handleClose = useCallback(() => {\n dispatch(setColumnMenu(null));\n focus(editorRef.current);\n }, [dispatch, editorRef]);\n\n const handleWaiting = useCallback(\n (message: string | null, cancel?: () => void) => {\n if (message) {\n setWaitingState({ message, cancel: cancel ?? handleClose });\n } else {\n setWaitingState(null);\n }\n },\n [handleClose],\n );\n\n if (!columnMenuState || !sheet || x == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-column-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (!waitingState) {\n handleClose();\n }\n return false;\n }}\n >\n <div\n className=\"gs-column-menu\"\n style={{ top: position.y, left: position.x, display: waitingState ? 'none' : undefined }}\n onClick={(e) => e.stopPropagation()}\n >\n <ul className=\"gs-menu-items\">\n {colMenu.map((descriptor, index) => {\n if (descriptor.type === 'component') {\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const Section = getMenuComponent(descriptor.componentId);\n if (!Section) {\n return null;\n }\n return <Section key={index} x={x} close={handleClose} onWaiting={handleWaiting} />;\n }\n if (descriptor.type === 'divider') {\n if (descriptor.visible && !descriptor.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={index} />;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, x) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, x) : descriptor.label;\n const shortcuts =\n typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, x) : descriptor.shortcuts;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, x);\n dispatch(setColumnMenu(null));\n }}\n />\n );\n })}\n </ul>\n </div>\n {waitingState && (\n <div\n className=\"gs-column-menu gs-column-menu-waiting\"\n style={{ top: position.y, left: position.x }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"gs-waiting-message\">{waitingState.message}</div>\n <div className=\"gs-waiting-spinner\" />\n <button className=\"gs-waiting-cancel-btn\" onClick={waitingState.cancel}>\n CANCEL\n </button>\n </div>\n )}\n </Fixed>\n );\n};\n","import { type FC, useContext } from 'react';\nimport { Context } from '../store';\nimport { setRowMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '../lib/dom';\nimport type { RowMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\nfunction renderRowDescriptor(\n descriptor: RowMenuItemDescriptor,\n ctx: ReturnType<typeof buildMenuContext>,\n y: number,\n index: number,\n close: () => void,\n) {\n if (descriptor.type === 'divider') {\n return <MenuDivider key={index} />;\n }\n if (descriptor.type === 'component') {\n return null;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, y);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, y) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, y) : descriptor.label;\n const shortcuts = typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, y) : descriptor.shortcuts;\n const checked = descriptor.checked != null ? descriptor.checked(ctx, y) : undefined;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, y);\n close();\n }}\n />\n );\n}\n\nexport const RowMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { rowMenuState, sheetReactive: sheetRef, editorRef, rowMenu } = store;\n const sheet = sheetRef.current;\n\n const y = rowMenuState?.y;\n const position = rowMenuState?.position;\n\n const handleClose = () => {\n dispatch(setRowMenu(null));\n focus(editorRef.current);\n };\n\n if (!rowMenuState || !sheet || y == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-row-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n handleClose();\n return false;\n }}\n >\n <div className=\"gs-row-menu\" style={{ top: position.y, left: position.x }} onClick={(e) => e.stopPropagation()}>\n <ul className=\"gs-menu-items\">\n {rowMenu.map((descriptor, index) => renderRowDescriptor(descriptor, ctx, y, index, handleClose))}\n </ul>\n </div>\n </Fixed>\n );\n};\n","export const isTouching = (e: React.TouchEvent | React.MouseEvent): boolean => {\n if (e.type.startsWith('touch')) {\n return (e as React.TouchEvent).touches.length > 0;\n }\n if (e.type.startsWith('mouse')) {\n const mouseEvent = e as React.MouseEvent;\n // left click only\n return !!(mouseEvent.buttons & 1) && mouseEvent.button === 0;\n }\n return false;\n};\n\n/**\n * Safely call preventDefault to avoid errors on touch events\n */\nexport const safePreventDefault = (e: React.MouseEvent | React.TouchEvent): void => {\n if (!e.type.startsWith('touch')) {\n e.preventDefault();\n }\n};\n","import { useContext, useRef, useCallback, useEffect, memo, useMemo, useState } from 'react';\nimport { x2c, y2r } from '../lib/coords';\nimport { zoneToArea, among, areaToRange } from '../lib/spatial';\nimport {\n choose,\n select,\n drag,\n write,\n setEditorRect,\n setContextMenuPosition,\n setAutofillDraggingTo,\n setEditingAddress,\n setDragging,\n submitAutofill,\n setStore,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { FormulaError } from '../formula/formula-error';\nimport { Pending } from '../sentinels';\nimport { insertRef, isRefInsertable } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '../lib/sheet';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '../lib/popup';\n\ntype Props = {\n y: number;\n x: number;\n};\n\nexport const Cell: FC<Props> = memo(({ y, x }) => {\n const rowId = y2r(y);\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const { store, dispatch } = useContext(Context);\n const isFirstPointed = useRef(true);\n\n const cellRef = useRef<HTMLTableCellElement>(null);\n const [errorTooltipPos, setErrorTooltipPos] = useState<PopupPosition | null>(null);\n const {\n sheetReactive,\n editingAddress,\n choosing,\n selectingZone,\n leftHeaderSelecting,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n // Whether the focus is on another sheet\n const xSheetFocused = isXSheetFocused(store);\n\n const lastFocused = sheet?.registry.lastFocused;\n\n const selectingArea = zoneToArea(selectingZone); // (top, left) -> (bottom, right)\n\n const editing = editingAddress === address;\n const pointed = choosing.y === y && choosing.x === x;\n const _setEditorRect = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (rect == null) {\n return null;\n }\n dispatch(\n setEditorRect({\n y: rect.y,\n x: rect.x,\n height: rect.height,\n width: rect.width,\n }),\n );\n }, [dispatch]);\n\n useEffect(() => {\n // Avoid setting coordinates on the initial render to account for shifts caused by redrawing due to virtualization.\n if (pointed && !isFirstPointed.current) {\n _setEditorRect();\n return;\n }\n isFirstPointed.current = false;\n }, [pointed, editing, _setEditorRect]);\n\n const cell = sheet?.getCell({ y, x }, { resolution: 'SYSTEM' });\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value }));\n },\n [dispatch],\n );\n\n const apply = useCallback(\n (sheet: UserSheet) => {\n dispatch(setStore({ sheetReactive: { current: sheet.__raw__ } }));\n },\n [dispatch],\n );\n\n let errorMessage = '';\n let rendered: any;\n try {\n if (sheet) {\n rendered = sheet.render({ sheet, point: { y, x }, apply, value: undefined });\n }\n } catch (e: any) {\n if (FormulaError.is(e)) {\n errorMessage = e.message;\n rendered = e.code;\n } else {\n errorMessage = e.message;\n rendered = '#UNKNOWN';\n }\n }\n const [, v] = sheet?.getSolvedCache({ y, x }) ?? [undefined, undefined];\n const isPendingCell = Pending.is(v);\n const input = editorRef.current;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!sheet) {\n return false;\n }\n if (!isTouching(e)) {\n return false;\n }\n if (!input) {\n return false;\n }\n\n // Single cell selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && input) {\n input.blur();\n }\n dispatch(choose({ y, x }));\n dispatch(select({ startY: y, startX: x, endY: y, endX: x }));\n return true;\n }\n\n // Normal drag operation for mouse events\n if (e.shiftKey) {\n dispatch(drag({ y, x }));\n } else {\n dispatch(select({ startY: y, startX: x, endY: -1, endX: -1 }));\n }\n\n dispatch(setDragging(true));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${address}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n return false;\n }\n }\n\n sheet.registry.lastFocused = input;\n focus(input);\n dispatch(setEditingAddress(''));\n\n if (autofillDraggingTo) {\n return false;\n }\n\n if (editingAnywhere) {\n writeCell(input.value);\n }\n if (!e.shiftKey) {\n dispatch(choose({ y, x }));\n }\n return true;\n },\n [editingAnywhere, input, address, xSheetFocused, lastFocused, autofillDraggingTo, writeCell, sheet],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n dispatch(submitAutofill(autofillDraggingTo));\n focus(input);\n return false;\n }\n if (editingAnywhere) {\n dispatch(drag({ y: -1, x: -1 }));\n }\n },\n [autofillDraggingTo, editingAnywhere, input],\n );\n\n const handleDragging = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e)) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n if (!sheet) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ x, y }));\n return false;\n }\n if (leftHeaderSelecting) {\n dispatch(drag({ y, x: sheet.numCols }));\n return false;\n }\n if (topHeaderSelecting) {\n dispatch(drag({ y: sheet.numRows, x }));\n return false;\n }\n if (editingAnywhere && !isRefInsertable(lastFocused || null)) {\n return false;\n }\n dispatch(drag({ y, x }));\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${areaToRange(newArea)}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n //sheet.registry.transmit(); // Force drawing because the formula is not reflected in largeInput\n return true;\n },\n [\n autofillDraggingTo,\n leftHeaderSelecting,\n topHeaderSelecting,\n sheet,\n editingAnywhere,\n lastFocused,\n selectingZone,\n xSheetFocused,\n ],\n );\n\n const handleAutofillMouseDown = useCallback(\n (e: React.MouseEvent) => {\n dispatch(setAutofillDraggingTo({ x, y }));\n dispatch(setDragging(true));\n e.stopPropagation();\n },\n [dispatch, x, y],\n );\n\n const handleErrorTriangleEnter = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n setErrorTooltipPos(calcBelowPosition(rect));\n }, []);\n\n const handleErrorTriangleLeave = useCallback(() => {\n setErrorTooltipPos(null);\n }, []);\n\n // --- Memoize event handlers with useCallback ---\n const onContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n const onDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n e.stopPropagation();\n safePreventDefault(e);\n setEditingAddress(address);\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input?.dispatchEvent(dblclick);\n return false;\n },\n [address, input],\n );\n\n const autofillDragClass = useMemo(() => {\n if (!editing && pointed && selectingArea.bottom === -1) {\n return 'gs-autofill-drag';\n }\n\n if (selectingArea.bottom === y && selectingArea.right === x) {\n return 'gs-autofill-drag';\n }\n return 'gs-autofill-drag gs-hidden';\n }, [editing, pointed, selectingArea]);\n\n if (!sheet) {\n return null;\n }\n\n if (!input) {\n return (\n <td key={x} data-x={x} data-y={y} data-address={address} className=\"gs-cell gs-hidden\">\n <div className=\"gs-cell-inner-wrap\">\n <div className=\"gs-cell-inner\">\n <div className=\"gs-cell-rendered\"></div>\n </div>\n <div className=\"gs-autofill-drag\"></div>\n </div>\n </td>\n );\n }\n\n return (\n <td\n key={x}\n ref={cellRef}\n data-x={x}\n data-y={y}\n data-address={address}\n className={`gs-cell ${among(selectingArea, { y, x }) ? 'gs-selecting' : ''} ${pointed ? 'gs-choosing' : ''} ${\n editing ? 'gs-editing' : ''\n } ${isPendingCell ? 'gs-pending' : ''}`}\n style={{\n ...cell?.style,\n }}\n onContextMenu={onContextMenu}\n onDoubleClick={onDoubleClick}\n >\n <div\n className={`gs-cell-inner-wrap`}\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div\n className={'gs-cell-inner'}\n style={{\n ...cell?.style,\n justifyContent: cell?.justifyContent || 'left',\n alignItems: cell?.alignItems || 'start',\n }}\n >\n {errorMessage && (\n <div\n className=\"gs-formula-error-triangle\"\n onMouseEnter={handleErrorTriangleEnter}\n onMouseLeave={handleErrorTriangleLeave}\n />\n )}\n <div className=\"gs-cell-rendered\">{rendered}</div>\n </div>\n {errorMessage && errorTooltipPos && (\n <div\n className=\"gs-formula-error-tooltip\"\n style={{\n top: errorTooltipPos.y + 4,\n left: errorTooltipPos.x,\n transform: hAlignTransform(errorTooltipPos.hAlign),\n }}\n >\n {errorMessage}\n </div>\n )}\n <div className={autofillDragClass} onMouseDown={handleAutofillMouseDown}></div>\n </div>\n </td>\n );\n});\n","import type { CSSProperties } from 'react';\nimport { useEffect, useRef, useContext, useCallback } from 'react';\nimport { Context } from '../store';\nimport { drag, setAutofillDraggingTo, setDragging, submitAutofill } from '../store/actions';\nimport { getAreaInTabular } from '../lib/virtualization';\nimport { insertRef, isFocus } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { areaToRange, zoneToArea } from '../lib/spatial';\nimport { isXSheetFocused } from '../store/helpers';\n\ntype Props = {\n className?: string;\n style: CSSProperties;\n horizontal?: number;\n vertical?: number;\n};\n\nconst acceleration = 0.4;\nconst maxSpeed = 200;\n\nlet lastScrollTime = new Date().getTime();\nlet currentSpeed = 0;\n\nexport function ScrollHandle({ style, horizontal = 0, vertical = 0, className = '' }: Props) {\n const scrollRef = useRef<number | null>(null);\n const { store, dispatch } = useContext(Context);\n const {\n tabularRef,\n autofillDraggingTo,\n dragging,\n selectingZone,\n editorRef,\n sheetReactive: sheetRef,\n searchInputRef,\n editingAddress,\n } = store;\n const sheet = sheetRef.current;\n\n let isScrolling = false;\n const xSheetFocused = isXSheetFocused(store);\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const getDestEdge = useCallback(\n (e: React.MouseEvent) => {\n if (!sheet) {\n return { x: -1, y: -1 };\n }\n if (horizontal == 0 && vertical == 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n horizontal = e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical = e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n const area = getAreaInTabular(tabularRef.current!);\n let { endX: x, endY: y } = selectingZone;\n if (horizontal) {\n x = horizontal > 0 ? area.right : area.left;\n } else if (vertical) {\n y = vertical > 0 ? area.bottom : area.top;\n }\n return { x, y };\n },\n [sheet, horizontal, vertical, selectingZone],\n );\n\n const scrollStep = useCallback(\n (e: React.MouseEvent) => {\n if (!isScrolling || tabularRef.current === null || !sheet) {\n return;\n }\n const now = new Date().getTime();\n if (now - lastScrollTime > 1000) {\n currentSpeed = 0;\n }\n lastScrollTime = now;\n\n tabularRef.current.scrollBy({\n left: currentSpeed * horizontal!,\n top: currentSpeed * vertical!,\n });\n focus(editorRef.current);\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(setAutofillDraggingTo({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n } else {\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const sheetPrefix = sheet.sheetPrefix(!xSheetFocused);\n const sheetRange = areaToRange(newArea);\n const fullRange = `${sheetPrefix}${sheetRange}`;\n insertRef({ input: editorRef.current, ref: fullRange });\n }\n dispatch(drag({ y, x }));\n }\n currentSpeed = Math.min(currentSpeed + acceleration, maxSpeed);\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [\n isScrolling,\n sheet,\n horizontal,\n vertical,\n autofillDraggingTo,\n editingAnywhere,\n selectingZone,\n xSheetFocused,\n getDestEdge,\n ],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (isScrolling) {\n return;\n }\n isScrolling = true;\n\n if (horizontal === 0 || vertical === 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n\n horizontal ||= e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical ||= e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [isScrolling, horizontal, vertical, scrollStep],\n );\n\n const stopScroll = useCallback(() => {\n if (scrollRef.current !== null) {\n cancelAnimationFrame(scrollRef.current);\n scrollRef.current = null;\n }\n isScrolling = false;\n if (!isFocus(searchInputRef.current)) {\n // Pressing Enter on a search result will not focus the editor.\n focus(editorRef.current);\n }\n }, []);\n\n const handleMouseUp = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const area = getAreaInTabular(tabularRef.current!);\n if (area.bottom === -1 || area.right === -1) {\n return;\n }\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(submitAutofill({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n focus(editorRef.current);\n } else {\n if (editingAnywhere) {\n // inserting a range\n dispatch(drag({ y: -1, x: -1 })); // Reset dragging\n }\n }\n },\n [autofillDraggingTo, editingAnywhere, getDestEdge],\n );\n\n const handleMouseUpWrapper = useCallback(\n (e: React.MouseEvent) => {\n stopScroll();\n dispatch(setDragging(false));\n requestAnimationFrame(() => handleMouseUp(e));\n },\n [stopScroll, handleMouseUp],\n );\n\n const handleMouseLeave = useCallback(() => {\n stopScroll();\n }, [stopScroll]);\n\n useEffect(() => {\n return stopScroll;\n }, [stopScroll]);\n\n if (!editorRef.current || (!dragging && !autofillDraggingTo)) {\n return <div className={`gs-scroll-handle gs-hidden ${className}`} />;\n }\n\n return (\n <div\n style={style}\n className={`gs-scroll-handle ${className}`}\n onMouseUp={(e) => {\n handleMouseUpWrapper(e);\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n />\n );\n}\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { x2c } from '../lib/coords';\nimport { getLabel } from '../lib/label';\nimport { between, zoneToArea } from '../lib/spatial';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectCols,\n setAutofillDraggingTo,\n setColumnMenu,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionX,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_WIDTH } from '../constants';\nimport * as prevention from '../lib/operation';\nimport { insertRef } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from './hooks';\n\ntype Props = {\n x: number;\n};\n\nexport const HeaderCellTop: FC<Props> = memo(({ x }) => {\n const colId = x2c(x);\n const { store, dispatch } = useContext(Context);\n\n const {\n sheetReactive: sheetRef,\n editingAddress,\n choosing,\n selectingZone,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n columnMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const col = sheet?.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const width = col?.width || DEFAULT_WIDTH;\n const hasFilter = !!(col?.filter && col.filter.conditions.length > 0);\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionX([x, e.clientX, e.clientX]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (dragging) {\n return false;\n }\n\n // Single column selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y: 1, x }));\n dispatch(select({ startY: 1, startX: x, endY: sheet.numRows, endX: x }));\n return true;\n }\n\n dispatch(select({ startY: 1, startX: x, endY: -1, endX: x }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${colId}:${colId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: sheet.numRows, startX: x, endY: 0, endX: x }));\n return false;\n }\n }\n\n let startX = e.shiftKey ? selectingZone.startX : x;\n if (startX === -1) {\n startX = choosing.x;\n }\n\n dispatch(\n selectCols({\n range: { start: startX, end: x },\n numRows: sheet.numRows,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n colId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y: 1, x }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: 1, endX: x });\n const [left, right] = [x2c(newArea.left), x2c(newArea.right)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${left}:${right}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startY } = selectingZone;\n if (startY === 1) {\n dispatch(drag({ y: sheet.numRows, x }));\n } else {\n dispatch(drag({ y: 1, x }));\n }\n }\n return false;\n }, 100);\n\n if (!sheet) {\n return (\n <th data-x={x} className=\"gs-th gs-th-top gs-hidden\">\n <div className=\"gs-th-inner-wrap\">\n <div className=\"gs-th-inner\">\n <ScrollHandle style={{ position: 'absolute' }} vertical={-1} />\n <div className=\"gs-resizer\"></div>\n </div>\n </div>\n </th>\n );\n }\n\n return (\n <th\n data-x={x}\n className={`gs-th gs-th-top ${choosing.x === x ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startX, end: selectingZone.endX }, x)\n ? topHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n }`}\n style={{ ...col?.style, width, minWidth: width, maxWidth: width }}\n onContextMenu={(e) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n }}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ height: sheet.headerHeight, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: topHeaderSelecting ? -1 : 1,\n }}\n vertical={-1}\n />\n {(() => {\n const displayedLabel = getLabel(sheet, col?.label, { y: 0, x }, x) ?? colId;\n if (displayedLabel !== colId) {\n return (\n <>\n <span className=\"gs-col-addr\">{colId}</span>\n {displayedLabel}\n </>\n );\n }\n return displayedLabel;\n })()}\n {!prevention.hasOperation(col?.prevention, prevention.ColumnMenu) && (\n <button\n className={`gs-menu-btn gs-column-menu-btn ${hasFilter ? 'gs-filtered' : ''} ${columnMenuState?.x === x ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (columnMenuState?.x === x) {\n dispatch(setColumnMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startX, end: selectingZone.endX }, x) &&\n selectingZone.startY === 1 &&\n selectingZone.endY === sheet.numRows;\n if (!alreadySelected) {\n dispatch(selectCols({ range: { start: x, end: x }, numRows: sheet.numRows }));\n }\n dispatch(setColumnMenu({ x, position: { y: rect.bottom, x: rect.left } }));\n }\n }}\n title=\"Sort & Filter\"\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer \n ${prevention.hasOperation(col?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ height: sheet.headerHeight }}\n onMouseDown={handleResizeMouseDown}\n >\n <i />\n </div>\n </div>\n </div>\n </th>\n );\n});\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { y2r } from '../lib/coords';\nimport { getLabel } from '../lib/label';\nimport { between, zoneToArea } from '../lib/spatial';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectRows,\n setAutofillDraggingTo,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionY,\n setRowMenu,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_HEIGHT } from '../constants';\nimport * as prevention from '../lib/operation';\nimport { insertRef } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from './hooks';\n\ntype Props = {\n y: number;\n};\n\nexport const HeaderCellLeft: FC<Props> = memo(({ y }) => {\n const rowId = `${y2r(y)}`;\n const { store, dispatch } = useContext(Context);\n\n const {\n choosing,\n editingAddress,\n selectingZone,\n leftHeaderSelecting,\n editorRef,\n sheetReactive: sheetRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n rowMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const row = sheet?.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const height = row?.height || DEFAULT_HEIGHT;\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionY([y, e.clientY, e.clientY]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n if (dragging) {\n return false;\n }\n\n // Single row selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y, x: 1 }));\n dispatch(select({ startY: y, startX: 1, endY: y, endX: sheet.numCols }));\n return true;\n }\n\n // Normal drag operation for mouse events\n dispatch(select({ startY: y, startX: 1, endY: y, endX: -1 }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${rowId}:${rowId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: y, startX: sheet.numCols, endY: y, endX: 0 }));\n return false;\n }\n }\n\n let startY = e.shiftKey ? selectingZone.startY : y;\n if (startY === -1) {\n startY = choosing.y;\n }\n\n dispatch(\n selectRows({\n range: { start: startY, end: y },\n numCols: sheet.numCols,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n rowId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y, x: 1 }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: 1 });\n const [top, bottom] = [y2r(newArea.top), y2r(newArea.bottom)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${top}:${bottom}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startX } = selectingZone;\n if (startX === 1) {\n dispatch(drag({ y, x: sheet.numCols }));\n } else {\n dispatch(drag({ y, x: 1 }));\n }\n }\n return false;\n }, 100);\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <th\n data-y={y}\n className={`gs-th gs-th-left ${choosing.y === y ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startY, end: selectingZone.endY }, y)\n ? leftHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n } ${row?.filterFixed ? 'gs-filter-fixed' : ''} ${row?.sortFixed ? 'gs-sort-fixed' : ''}`}\n style={{ ...row?.style, height }}\n onContextMenu={handleContextMenu}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ width: sheet.headerWidth, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: leftHeaderSelecting ? -1 : 1,\n }}\n horizontal={-1}\n />\n {getLabel(sheet, row?.label, { y, x: 0 }, y) ?? rowId}\n {!prevention.hasOperation(row?.prevention, prevention.RowMenu) && (\n <button\n className={`gs-menu-btn gs-row-menu-btn ${rowMenuState?.y === y ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (rowMenuState?.y === y) {\n dispatch(setRowMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startY, end: selectingZone.endY }, y) &&\n selectingZone.startX === 1 &&\n selectingZone.endX === sheet.numCols;\n if (!alreadySelected) {\n dispatch(selectRows({ range: { start: y, end: y }, numCols: sheet.numCols }));\n }\n dispatch(setRowMenu({ y, position: { y: rect.bottom, x: rect.right } }));\n }\n }}\n title=\"Row menu\"\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer\n ${prevention.hasOperation(row?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ width: sheet.headerWidth }}\n onMouseDown={handleResizeMouseDown}\n ></div>\n </div>\n </div>\n </th>\n );\n});\n","import { useContext, useEffect, useRef, useCallback } from 'react';\nimport { Context } from '../store';\nimport { zoneToArea } from '../lib/spatial';\nimport { between } from '../lib/spatial';\nimport { a2p } from '../lib/coords';\nimport { COLOR_PALETTE } from '../lib/palette';\nimport { Autofill } from '../lib/autofill';\nimport { getCellRectPositions } from '../lib/virtualization';\nimport type { Sheet } from '../lib/sheet';\nimport type { FC } from 'react';\nimport type { RefPaletteType, AreaType, ModeType } from '../types';\n\nconst COLOR_POINTED = 'rgba(0, 119, 255, 1)';\nconst COLOR_SELECTED = 'rgba(0, 119, 255, 0.6)';\nconst SELECTING_FILL = 'rgba(0, 128, 255, 0.2)';\nconst COLOR_COPYING = '#0077ff';\nconst COLOR_CUTTING = '#0077ff';\nconst SEARCH_MATCHING_BACKGROUND = 'rgba(0, 200, 100, 0.2)';\nconst COLOR_SEARCH_MATCHING = '#00aa78';\nconst COLOR_AUTOFILL = '#0077aa';\n\nconst HEADER_COLORS = {\n light: {\n selecting: 'rgba(0, 0, 0, 0.1)',\n choosing: 'rgba(0, 0, 0, 0.2)',\n thSelecting: 'rgba(0, 0, 0, 0.55)',\n },\n dark: {\n selecting: 'rgba(255, 255, 255, 0.08)',\n choosing: 'rgba(255, 255, 255, 0.18)',\n thSelecting: 'rgba(255, 255, 255, 0.4)',\n },\n} as const;\n\ntype Props = {\n refs?: RefPaletteType;\n};\n\ntype Ctx2D = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\nconst fillRect = (ctx: Ctx2D, x: number, y: number, width: number, height: number, color: string) => {\n ctx.fillStyle = color;\n ctx.fillRect(x, y, width, height);\n};\n\nconst drawRect = (\n ctx: Ctx2D,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n if (fillColor) {\n ctx.fillStyle = fillColor;\n ctx.fillRect(x, y, width, height);\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(dashPattern);\n ctx.strokeRect(x + lineWidth / 2, y + lineWidth / 2, width - lineWidth, height - lineWidth);\n ctx.setLineDash([]);\n};\n\n// Draw an area rect in viewport coordinates (absolute coords - scroll offset, clamped to viewport)\nconst drawAreaRectViewport = (\n ctx: Ctx2D,\n sheet: Sheet,\n scrollTop: number,\n scrollLeft: number,\n viewW: number,\n viewH: number,\n area: AreaType,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n const { top, left, bottom, right } = area;\n if (top === -1 || left === -1 || bottom === -1 || right === -1) {\n return;\n }\n\n const topLeft = getCellRectPositions(sheet, { y: top, x: left });\n const bottomRight = getCellRectPositions(sheet, { y: bottom, x: right });\n\n const x1 = topLeft.left - scrollLeft;\n const y1 = topLeft.top - scrollTop;\n const x2 = bottomRight.right - scrollLeft;\n const y2 = bottomRight.bottom - scrollTop;\n\n // Quick reject if entirely off-screen\n if (x2 < 0 || x1 > viewW || y2 < 0 || y1 > viewH) {\n return;\n }\n\n drawRect(ctx, x1, y1, x2 - x1, y2 - y1, color, lineWidth, dashPattern, fillColor);\n};\n\nexport const CellStateOverlay: FC<Props> = ({ refs = {} }) => {\n const { store } = useContext(Context);\n const {\n sheetReactive,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n } = store;\n const sheet = sheetReactive.current;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafIdRef = useRef<number>(0);\n const storeRef = useRef(store);\n storeRef.current = store;\n\n const drawCanvas = useCallback(() => {\n if (!sheet || !tabularRef.current || !canvasRef.current) {\n return;\n }\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n const container = tabularRef.current;\n const dpr = window.devicePixelRatio || 1;\n const w = container.clientWidth;\n const h = container.clientHeight;\n\n // Resize canvas to viewport\n if (canvas.width !== w * dpr || canvas.height !== h * dpr) {\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n }\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n const { registry } = sheet;\n const scrollTop = container.scrollTop;\n const scrollLeft = container.scrollLeft;\n const headerW = sheet.headerWidth;\n const headerH = sheet.headerHeight;\n\n // Clip cell-area drawing to exclude header region\n ctx.save();\n ctx.beginPath();\n ctx.rect(headerW, headerH, w - headerW, h - headerH);\n ctx.clip();\n\n // 1. Selecting zone (border + fill)\n const selectingArea = zoneToArea(selectingZone);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, selectingArea, COLOR_SELECTED, 1, [], SELECTING_FILL);\n\n // 2. Autofill dragging\n if (autofillDraggingTo) {\n const autofill = new Autofill(storeRef.current, autofillDraggingTo);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, autofill.wholeArea, COLOR_AUTOFILL, 1, [5, 5]);\n }\n\n // 3. Choosing (pointed cell)\n {\n const { y, x } = choosing;\n if (y !== -1 && x !== -1) {\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n drawRect(ctx, vx, vy, pos.width, pos.height, COLOR_POINTED, 2, []);\n }\n }\n\n // 4. Copying/Cutting zone\n const { copyingSheetId, copyingZone, cutting } = registry;\n if (sheet.id === copyingSheetId) {\n const copyingArea = zoneToArea(copyingZone);\n const color = cutting ? COLOR_CUTTING : COLOR_COPYING;\n const dashPattern = cutting ? [4, 4] : [6, 4];\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, copyingArea, color, 2.5, dashPattern);\n }\n\n // 5. Formula references (from palette)\n Object.entries(refs).forEach(([ref, i]) => {\n const palette = COLOR_PALETTE[i % COLOR_PALETTE.length];\n try {\n const refArea = sheet.rangeToArea(ref);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, refArea, palette, 2, [5, 5]);\n } catch (e) {\n // Invalid reference, skip\n }\n });\n\n // 6. Search matching cells\n matchingCells.forEach((address, index) => {\n const { y, x } = a2p(address);\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n\n // Skip if off-screen\n if (vx + pos.width < 0 || vx > w || vy + pos.height < 0 || vy > h) {\n return;\n }\n\n const isCurrentMatch = index === matchingCellIndex;\n drawRect(\n ctx,\n vx,\n vy,\n pos.width,\n pos.height,\n isCurrentMatch ? COLOR_SEARCH_MATCHING : 'transparent',\n isCurrentMatch ? 2 : 0,\n [],\n SEARCH_MATCHING_BACKGROUND,\n );\n });\n\n // Restore full canvas for header drawing\n ctx.restore();\n\n // 7. Header highlights (top and left) — draw bottom border for top headers, right border for left headers\n const numCols = sheet.numCols;\n const numRows = sheet.numRows;\n\n // Top headers - draw bottom border and background\n for (let x = 1; x <= numCols; x++) {\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startX, end: selectingZone.endX }, x)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.x === x) {\n color = COLOR_POINTED;\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y: 1, x });\n const left = pos.left - scrollLeft;\n if (left + pos.width < headerW || left > w) {\n continue;\n }\n const drawLeft = Math.max(left, headerW);\n const drawWidth = Math.min(left + pos.width, w) - drawLeft;\n if (drawWidth > 0) {\n if (backgroundColor) {\n fillRect(ctx, drawLeft, 0, drawWidth, headerH, backgroundColor);\n }\n // Draw bottom border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(drawLeft, headerH + 1);\n ctx.lineTo(drawLeft + drawWidth, headerH + 1);\n ctx.stroke();\n }\n }\n\n // Left headers - draw right border and background\n for (let y = 1; y <= numRows; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startY, end: selectingZone.endY }, y)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.y === y) {\n color = COLOR_POINTED;\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y, x: 1 });\n const top = pos.top - scrollTop;\n if (top + pos.height < headerH || top > h) {\n continue;\n }\n const drawTop = Math.max(top, headerH);\n const drawHeight = Math.min(top + pos.height, h) - drawTop;\n if (drawHeight > 0) {\n if (backgroundColor) {\n fillRect(ctx, 0, drawTop, headerW, drawHeight, backgroundColor);\n }\n // Draw right border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(headerW + 1, drawTop);\n ctx.lineTo(headerW + 1, drawTop + drawHeight);\n ctx.stroke();\n }\n }\n }, [\n sheet,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n refs,\n ]);\n\n // Schedule a draw on the next animation frame (for state changes)\n const scheduleDrawCanvas = useCallback(() => {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(drawCanvas);\n }, [drawCanvas]);\n\n // Draw synchronously on scroll to avoid 1-frame lag\n const handleScroll = useCallback(() => {\n drawCanvas();\n }, [drawCanvas]);\n\n useEffect(() => {\n scheduleDrawCanvas();\n return () => cancelAnimationFrame(rafIdRef.current);\n }, [scheduleDrawCanvas]);\n\n useEffect(() => {\n const container = tabularRef.current;\n if (!container) {\n return;\n }\n container.addEventListener('scroll', handleScroll);\n return () => {\n container.removeEventListener('scroll', handleScroll);\n };\n }, [tabularRef, handleScroll]);\n\n return (\n <div\n style={{\n position: 'sticky',\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n overflow: 'visible',\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n <canvas\n ref={canvasRef}\n className=\"gs-cell-state-overlay\"\n style={{\n pointerEvents: 'none',\n display: 'block',\n }}\n />\n </div>\n );\n};\n","import { useEffect, useContext, useState, useCallback } from 'react';\n\nimport { Cell } from './Cell';\nimport { HeaderCellTop } from './HeaderCellTop';\nimport { HeaderCellLeft } from './HeaderCellLeft';\nimport { CellStateOverlay } from './CellStateOverlay';\n\nimport { Context } from '../store';\nimport { choose, select, setContextMenuPosition } from '../store/actions';\n\nimport type { RefPaletteType, Virtualization } from '../types';\nimport { virtualize } from '../lib/virtualization';\nimport { p2a, stripAddressAbsolute } from '../lib/coords';\nimport { Lexer, stripSheetName } from '../formula/evaluator';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '../lib/dom';\n\nexport const Tabular = () => {\n const [palette, setPalette] = useState<RefPaletteType>({});\n const { store, dispatch } = useContext(Context);\n const {\n sheetReactive,\n choosing,\n editingAddress,\n tabularRef,\n mainRef,\n sheetWidth,\n sheetHeight,\n inputting,\n leftHeaderSelecting,\n topHeaderSelecting,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n const [virtualized, setVirtualized] = useState<Virtualization | null>(null);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (sheet) {\n setVirtualized(virtualize(sheet, e.currentTarget));\n }\n },\n [sheetReactive],\n );\n\n const handleSelectAllClick = useCallback(() => {\n if (!sheet) {\n return;\n }\n dispatch(choose({ y: -1, x: -1 }));\n requestAnimationFrame(() => {\n dispatch(choose({ y: 1, x: 1 }));\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n });\n }, [sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const formulaEditing = editingAddress && inputting.startsWith('=');\n if (!formulaEditing) {\n setPalette({});\n sheet.registry.paletteBySheetName = {};\n return;\n }\n const palette: RefPaletteType = {};\n const paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n const lexer = new Lexer(inputting.substring(1));\n lexer.tokenize();\n\n let i = 0;\n for (const token of lexer.tokens) {\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedRef = stripAddressAbsolute(token.stringify());\n const splitterIndex = normalizedRef.indexOf('!');\n if (splitterIndex !== -1) {\n const sheetName = normalizedRef.substring(0, splitterIndex);\n const ref = normalizedRef.substring(splitterIndex + 1);\n const stripped = stripSheetName(sheetName);\n const upperRef = ref.toUpperCase();\n if (paletteBySheetName[stripped] == null) {\n paletteBySheetName[stripped] = {};\n }\n if (paletteBySheetName[stripped][upperRef] == null) {\n paletteBySheetName[stripped][upperRef] = i++;\n }\n } else {\n const upperRef = normalizedRef.toUpperCase();\n if (palette[upperRef] == null) {\n palette[upperRef] = i++;\n }\n }\n }\n }\n setPalette(palette);\n sheet.registry.paletteBySheetName = paletteBySheetName;\n }, [store.inputting, store.editingAddress, sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.choosingAddress = p2a(choosing);\n sheet.registry.choosingSheetId = sheet.id;\n }, [choosing]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setVirtualized(virtualize(sheet, tabularRef.current));\n }, [tabularRef.current, sheetReactive, mainRef.current?.clientHeight, mainRef.current?.clientWidth]);\n\n useEffect(() => {\n const el = tabularRef.current;\n if (!el) {\n return;\n }\n return preventSafariBounce(el);\n }, [sheetReactive]);\n\n const mergedRefs: RefPaletteType = {\n ...palette,\n ...(sheet ? sheet.registry.paletteBySheetName[sheet.name] : {}),\n };\n\n if (!sheet || !sheet.registry.ready) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"gs-tabular\"\n style={{\n width: sheetWidth === -1 ? undefined : sheetWidth,\n height: sheetHeight === -1 ? undefined : sheetHeight,\n }}\n ref={tabularRef}\n onMouseMove={handleMouseMove}\n onScroll={handleScroll}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: sheet.totalWidth + 1,\n height: sheet.totalHeight + 1,\n }}\n >\n <CellStateOverlay refs={mergedRefs} />\n <table className={`gs-table`}>\n <thead className=\"gs-thead\" style={{ height: sheet.headerHeight }}>\n <tr className=\"gs-row\">\n <th\n className=\"gs-th gs-th-left gs-th-top\"\n style={{ position: 'sticky', width: sheet.headerWidth, height: sheet.headerHeight }}\n onClick={handleSelectAllClick}\n >\n <div className=\"gs-th-inner\">\n <ScrollHandle\n className={leftHeaderSelecting || topHeaderSelecting ? 'gs-hidden' : ''}\n style={{ position: 'absolute' }}\n horizontal={leftHeaderSelecting ? 0 : -1}\n vertical={topHeaderSelecting ? 0 : -1}\n />\n {contextMenu.length > 0 && (\n <button\n className=\"gs-menu-btn gs-corner-menu-btn\"\n title=\"Menu\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return;\n }\n const rect = btn.getBoundingClientRect();\n dispatch(setContextMenuPosition({ y: rect.bottom, x: rect.left }));\n }}\n >\n ⋮\n </button>\n )}\n </div>\n </th>\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\"\n style={{ width: virtualized?.adjuster?.left ?? 1 }}\n ></th>\n {virtualized?.xs?.map?.((x) => <HeaderCellTop x={x} key={x} />)}\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\"\n style={{ width: virtualized?.adjuster?.right }}\n ></th>\n </tr>\n </thead>\n\n <tbody className=\"gs-sheet-body-adjuster\">\n <tr className=\"gs-row\">\n <th\n className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}\n style={{ height: virtualized?.adjuster?.top ?? 1 }}\n ></th>\n <td className=\"gs-adjuster gs-adjuster-vertical\"></td>\n {virtualized?.xs?.map((x) => <td className=\"gs-adjuster gs-adjuster-vertical\" key={x}></td>)}\n <th className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}></th>\n </tr>\n </tbody>\n\n <tbody className=\"gs-sheet-body-data\">\n {virtualized?.ys?.map((y) => {\n return (\n <tr key={y} className={`gs-row ${y % 2 === 0 ? 'gs-row-even' : 'gs-row-odd'}`}>\n <HeaderCellLeft y={y} />\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\" />\n {virtualized?.xs?.map((x) => <Cell key={x} y={y} x={x} />)}\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\" />\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n};\n","// pnpm generate-style\nexport const LAST_MODIFIED = 1774701851;\nexport const CSS = `.gs-root1{display:inline-block;position:relative;border-spacing:0;width:fit-content;max-width:100%;overflow:auto;font-family:\"SF Pro Text\",\"SF Pro Icons\",\"Helvetica Neue\",Helvetica,Arial,Meiryo,sans-serif;visibility:hidden;opacity:0}.gs-root1.gs-initialized{visibility:visible;opacity:1;transition:opacity .2s ease-in-out}.gs-root1 .gs-main{flex:1;max-width:100%;overflow:hidden;position:relative;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.gs-root1 .gs-resizing{width:100%;height:100%;position:absolute;background-color:rgba(0,127,255,.08);top:0;left:0;z-index:2}.gs-root1 .gs-line-horizontal{width:100%}.gs-root1 .gs-line-vertical{height:100%}.gs-root1 .gs-line{position:relative;top:0;left:0;border:dotted 1px #07f;box-sizing:border-box}.gs-root1 .gs-line span{font-size:10px;padding:3px;background-color:#07f;color:#fff;margin:0;position:absolute;top:0;left:0}.gs-root1 .gs-scroll-handle{width:100%;height:100%;cursor:cell}.gs-hidden{visibility:hidden;position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;pointer-events:none;z-index:-1}.gs-fixed{position:fixed;top:0;left:0;z-index:1}.gs-root1[data-mode=light]{background-color:#e2e2e2;color:#000}.gs-root1[data-mode=light] .gs-main{background-color:#e2e2e2;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd}.gs-root1[data-mode=light] .gs-tabular{background-color:#e2e2e2}.gs-root1[data-mode=light] .gs-sheet-body-data{background-color:#f7f7f7}.gs-root1[data-mode=light] .gs-formula-bar{background-color:#efefef}.gs-root1[data-mode=light] .gs-formula-bar-editor-inner{color:#555}.gs-root1[data-mode=light] .gs-cell{border:solid 1px #ddd}.gs-root1[data-mode=light] .gs-adjuster{background-color:#ddd}.gs-root1[data-mode=light] .gs-tabular-inner{background-color:#ddd}.gs-root1[data-mode=light] .gs-th{background-color:#efefef;color:#666}.gs-root1[data-mode=light] .gs-th-top{border-left:solid 1px #ddd}.gs-root1[data-mode=light] .gs-th-top .gs-th-inner{border-top:solid 1px #ddd}.gs-root1[data-mode=light] .gs-th-left{border-top:solid 1px #ddd}.gs-root1[data-mode=light] .gs-th-left .gs-th-inner{border-left:solid 1px #ddd}.gs-root1[data-mode=light] .gs-search-bar{color:rgba(0,0,0,.3)}.gs-editor[data-mode=light].gs-editing textarea{caret-color:#000000}.gs-editor[data-mode=light].gs-editing .gs-editor-hl{background-color:#f7f7f7;color:#000}.gs-editor[data-mode=light] .gs-editor-options{color:#000;background-color:#f7f7f7;border:solid 1px #ddd}.gs-root1[data-mode=dark]{background-color:#5a5a5a;color:#eee}.gs-root1[data-mode=dark] .gs-main{background-color:#3f3f3f;border-right:solid 1px #5a5a5a;border-bottom:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-tabular{background-color:#3f3f3f}.gs-root1[data-mode=dark] .gs-sheet-body-data{background-color:#212121}.gs-root1[data-mode=dark] .gs-formula-bar{background-color:#4f4f4f}.gs-root1[data-mode=dark] .gs-formula-bar-editor-inner{color:#bbb}.gs-root1[data-mode=dark] .gs-cell{background-color:#212121;border:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-adjuster{background-color:#5a5a5a}.gs-root1[data-mode=dark] .gs-tabular-inner{background-color:#5a5a5a}.gs-root1[data-mode=dark] .gs-large-editor textarea{color:#eee;caret-color:#eeeeee}.gs-root1[data-mode=dark] .gs-th{background-color:#4f4f4f;color:#eee}.gs-root1[data-mode=dark] .gs-th-top{border-left:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-th-top .gs-th-inner{border-top:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-th-left{border-top:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-th-left .gs-th-inner{border-left:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-search-bar textarea{color:#eee;caret-color:#eeeeee}.gs-root1[data-mode=dark] .gs-search-bar{color:rgba(255,255,255,.3)}.gs-editor[data-mode=dark].gs-editing textarea{caret-color:#eeeeee}.gs-editor[data-mode=dark].gs-editing .gs-editor-hl{background-color:#212121;color:#eee}.gs-editor[data-mode=dark] .gs-editor-options{color:#eee;background-color:#5a5a5a;border:solid 1px #5a5a5a}.gs-cell{transition:border-color .2s ease;padding:0;margin:0;box-sizing:border-box;position:relative;font-size:13px;letter-spacing:1px;line-height:24px;cursor:cell;user-select:none;-webkit-user-select:none;-moz-user-select:none}.gs-cell.gs-copying textarea:focus{outline:solid 1px #0077ff}.gs-cell.gs-selecting{z-index:1}.gs-cell.gs-selecting .gs-cell-label{display:block}.gs-cell.gs-choosing{margin-top:-1px;margin-left:-1px;z-index:1}.gs-cell.gs-choosing.gs-editing{color:transparent}.gs-cell.gs-choosing .gs-cell-label{display:block}.gs-cell.gs-pending .gs-cell-rendered{position:relative;overflow:hidden}.gs-cell.gs-pending .gs-cell-rendered::after{content:'';position:absolute;bottom:0;left:0;height:4px;width:40%;border-radius:1px;background:rgba(100,140,255,.6);animation:gs-pending-slide 1.4s ease-in-out infinite}.gs-cell .gs-formula-error-triangle{position:absolute;top:0;right:0;border-top:4px solid rgba(200,0,0,.9);border-right:4px solid rgba(200,0,0,.9);border-bottom:4px solid transparent;border-left:4px solid transparent;z-index:2;cursor:help}.gs-cell .gs-cell-label{font-size:8px;font-weight:400;font-style:normal;font-family:math,monospace,serif;letter-spacing:1px;line-height:14px;position:absolute;top:0;right:0;background-color:rgba(0,128,255,.6);color:rgba(255,255,255,.6);padding:0 2px;display:none;opacity:.7}.gs-cell .gs-cell-inner-wrap{width:100%;height:100%;position:absolute;top:0;left:0}.gs-cell .gs-cell-inner{width:100%;height:100%;overflow:hidden;display:flex;box-sizing:border-box;border:none!important}.gs-cell .gs-cell-rendered{overflow:hidden;white-space:pre-wrap;cursor:cell;word-wrap:break-word;word-break:break-all;padding:0 2px;width:100%;height:100%}.gs-cell .gs-cell-rendered>*{position:relative}.gs-cell .gs-cell-rendered>.backface{z-index:0}.gs-cell .gs-autofill-drag{background-color:#07f;position:absolute;width:7px;height:7px;bottom:0;right:0;margin-right:-3.5px;margin-bottom:-3.5px;cursor:crosshair;z-index:1}.gs-th[data-x=\"1\"] .gs-th-inner-wrap{border-left:none}.gs-th[data-y=\"1\"] .gs-th-inner-wrap{border-top:none}.gs-formula-error-tooltip{position:fixed;background-color:rgba(35,8,8,.94);color:#fff;padding:6px 10px;border-radius:4px;border-left:3px solid rgba(220,50,50,.8);font-size:12px;line-height:1.5;max-width:260px;white-space:pre-wrap;word-break:break-word;box-shadow:0 3px 10px rgba(0,0,0,.4);z-index:100;pointer-events:none;letter-spacing:.3px}.gs-menu-modal{width:100%;height:100vh;z-index:12}.gs-label-input-label{font-size:13px;letter-spacing:1px}.gs-menu-divider{background-color:#aaa;padding:0;margin:5px 0;height:1px;list-style-type:none}.gs-menu-btn{position:absolute;background-color:rgba(128,128,128,.3);border:1px solid #ccc;border-radius:50%;cursor:pointer;font-size:12px;font-weight:700;line-height:1;color:#888;width:18px;height:18px;padding:0;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s ease;z-index:2}.gs-context-menu{z-index:12;position:fixed;background-color:#fff;padding:5px 0;border-radius:5px;box-shadow:rgba(60,64,67,.3) 0 1px 2px 0,rgba(60,64,67,.15) 0 1px 3px 1px;opacity:.9;transition:opacity .15s ease}.gs-context-menu:hover{opacity:1}.gs-context-menu .gs-menu-items{color:#555;margin:0;padding:0;min-width:250px}.gs-menu-item{padding:5px 10px;list-style-type:none;display:flex}.gs-menu-item.gs-enabled{cursor:pointer}.gs-menu-item.gs-enabled:hover{background-color:#eee}.gs-menu-item.gs-disabled{opacity:.5;cursor:not-allowed}.gs-menu-item .gs-menu-name{font-size:13px;letter-spacing:1px;flex:1}.gs-menu-shortcut{font-size:10px;line-height:20px;color:#999}.gs-menu-shortcut:before{content:\"( \"}.gs-menu-shortcut:after{content:\" )\"}.gs-menu-shortcut .gs-menu-underline{text-decoration:underline}.gs-column-menu{z-index:12;position:fixed;background-color:#fff;padding:5px 0;border-radius:5px;box-shadow:rgba(60,64,67,.3) 0 1px 2px 0,rgba(60,64,67,.15) 0 1px 3px 1px;opacity:.9;transition:opacity .15s ease}.gs-column-menu:hover{opacity:1}.gs-column-menu ul{color:#555;margin:0;padding:0;min-width:200px}.gs-column-menu .gs-column-menu-sort{align-items:center}.gs-column-menu .gs-column-menu-sort .gs-sort-buttons{display:flex;gap:4px;margin-left:auto}.gs-column-menu .gs-column-menu-sort .gs-sort-btn{font-size:12px;padding:4px 8px;border:1px solid transparent;border-radius:3px;background-color:rgba(180,180,180,.1);cursor:pointer;color:#555;font-weight:700;letter-spacing:.5px}.gs-column-menu .gs-column-menu-sort .gs-sort-btn:hover:not(:disabled){border-color:#555}.gs-column-menu .gs-column-menu-sort .gs-sort-btn:disabled{opacity:.5;cursor:not-allowed}.gs-column-menu .gs-column-menu-label{padding:5px 10px}.gs-column-menu .gs-label-input-row{display:flex;gap:4px;align-items:center}.gs-column-menu .gs-label-input{flex:1;font-size:13px;padding:4px 6px;border:none;border-bottom:1px solid #ccc;border-radius:0;outline:0;min-width:0;width:100px;background-color:transparent;box-shadow:none}.gs-column-menu .gs-label-input:focus{border-bottom-color:#07f;outline:0;box-shadow:none}.gs-column-menu .gs-label-apply-btn{font-size:12px;padding:4px 8px;border:1px solid transparent;border-radius:3px;background-color:rgba(180,180,180,.1);cursor:pointer;color:#555;font-weight:700;letter-spacing:.5px}.gs-column-menu .gs-label-apply-btn:hover:not(:disabled){border-color:#555}.gs-column-menu .gs-label-apply-btn:disabled{opacity:.5;cursor:not-allowed}.gs-column-menu .gs-column-menu-filter{padding:5px 10px;list-style-type:none;font-size:13px}.gs-column-menu .gs-filter-header{display:flex;align-items:center;gap:8px}.gs-column-menu .gs-filter-header .gs-filter-add-btn{font-size:12px;padding:3px 9px;border:1px solid transparent;border-radius:3px;background-color:rgba(180,180,180,.1);cursor:pointer;color:#555;letter-spacing:1px}.gs-column-menu .gs-filter-header .gs-filter-add-btn:hover{border-color:#555}.gs-column-menu .gs-filter-mode-toggle{display:flex;gap:6px;margin-left:auto}.gs-column-menu .gs-filter-mode-toggle label{display:flex;align-items:center;gap:3px;font-size:11px;font-weight:700;letter-spacing:.5px;color:#888;cursor:pointer;user-select:none}.gs-column-menu .gs-filter-mode-toggle label input[type=radio]{margin:0;cursor:pointer}.gs-column-menu .gs-filter-mode-toggle label.gs-active{color:#07f}.gs-column-menu .gs-filter-mode-toggle.gs-disabled{opacity:.4;pointer-events:none}.gs-column-menu .gs-filter-conditions{display:flex;flex-direction:column;gap:5px;margin-top:6px;max-height:200px;overflow-y:auto}.gs-column-menu .gs-filter-condition-row{display:flex;gap:4px;align-items:normal}.gs-column-menu .gs-filter-method-select{font-size:12px;padding:4px 4px;border:none;border-bottom:1px solid #ccc;border-radius:0;outline:0;background-color:#fff;box-shadow:none;min-width:40px;max-width:80px;cursor:pointer}.gs-column-menu .gs-filter-method-select:focus{border-bottom-color:#07f;outline:0;box-shadow:none}.gs-column-menu .gs-filter-value-input{flex:1;font-size:13px;padding:4px 6px;border:none;border-bottom:1px solid #ccc;border-radius:0;outline:0;min-width:0;width:80px;background-color:transparent;box-shadow:none}.gs-column-menu .gs-filter-value-input:focus{border-bottom-color:#07f;outline:0;box-shadow:none}.gs-column-menu .gs-filter-remove-btn{font-size:12px;padding:0;border:none;border-radius:3px;background-color:transparent;cursor:pointer;color:#999;line-height:1;flex-shrink:0}.gs-column-menu .gs-filter-remove-btn:hover{color:#c33}.gs-column-menu .gs-filter-actions{display:flex;gap:4px;margin-top:10px;align-items:center}.gs-column-menu .gs-filter-actions .gs-filter-reset-all-btn{font-size:12px;padding:3px 9px;border:1px solid transparent;border-radius:3px;background-color:transparent;cursor:pointer;color:#c33;font-weight:700;letter-spacing:1px}.gs-column-menu .gs-filter-actions .gs-filter-reset-all-btn:hover{border-color:#c33}.gs-column-menu .gs-filter-actions .gs-filter-actions-right{display:flex;gap:4px;margin-left:auto}.gs-column-menu .gs-filter-actions .gs-filter-reset-btn{font-size:12px;padding:3px 9px;border:1px solid transparent;border-radius:3px;background-color:transparent;cursor:pointer;color:#e08000;font-weight:700;letter-spacing:1px}.gs-column-menu .gs-filter-actions .gs-filter-reset-btn:hover{border-color:#e08000}.gs-column-menu .gs-filter-actions .gs-filter-apply-btn{font-size:12px;padding:3px 6px;border:1px solid transparent;border-radius:3px;background-color:transparent;color:#07f;cursor:pointer;font-weight:700;letter-spacing:1px}.gs-column-menu .gs-filter-actions .gs-filter-apply-btn:hover{border-color:#07f}.gs-column-menu-waiting{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px 30px;gap:12px;min-width:180px}.gs-column-menu-waiting .gs-waiting-message{font-size:13px;font-weight:700;color:#555;letter-spacing:.5px}.gs-column-menu-waiting .gs-waiting-spinner{width:24px;height:24px;border:3px solid #e0e0e0;border-top-color:#07f;border-radius:50%;animation:spin .8s linear infinite}.gs-column-menu-waiting .gs-waiting-cancel-btn{font-size:12px;padding:4px 18px;border:1px solid #c33;border-radius:3px;background-color:transparent;color:#c33;cursor:pointer;font-weight:700;letter-spacing:1px}.gs-column-menu-waiting .gs-waiting-cancel-btn:hover{background-color:#c33;color:#fff}.gs-column-menu-btn{right:4px;top:50%;transform:translateY(-50%)}.gs-column-menu-btn.gs-filtered{opacity:1;background-color:#e0edff;border-color:#07f;color:#07f}.gs-column-menu-btn.gs-active{opacity:1;background-color:#d0e0ff;border-color:#07f;color:#07f}.gs-th-top:hover .gs-column-menu-btn{opacity:1}.gs-row-menu{z-index:12;position:fixed;background-color:#fff;padding:5px 0;border-radius:5px;box-shadow:rgba(60,64,67,.3) 0 1px 2px 0,rgba(60,64,67,.15) 0 1px 3px 1px;opacity:.9;transition:opacity .15s ease}.gs-row-menu:hover{opacity:1}.gs-row-menu ul{color:#555;margin:0;padding:0;min-width:200px}.gs-row-menu .gs-row-fixed-toggle{display:flex;align-items:center;gap:6px}.gs-row-menu .gs-row-fixed-check{font-size:12px;width:14px;text-align:center;color:rgba(0,119,255,.1)}.gs-row-menu .gs-row-fixed-check.gs-row-fixed-active{color:#07f}.gs-row-menu-btn{top:50%;transform:translateY(-50%);right:2px}.gs-row-menu-btn.gs-active{opacity:1;background-color:#d0e0ff;border-color:#07f;color:#07f}.gs-th-left:hover .gs-row-menu-btn{opacity:1}.gs-corner-menu-btn{bottom:2px;right:2px}.gs-corner-menu-btn:hover{opacity:1;background-color:#d0e0ff;border-color:#07f;color:#07f}.gs-th-left.gs-th-top:hover .gs-corner-menu-btn{opacity:1}.gs-editor-hl{padding:0 2px!important;position:absolute;font-family:monospace,Arial;font-size:12px;line-height:24px;letter-spacing:1px}.gs-formula-bar-editor-inner{position:relative;display:table-cell}.gs-editor{opacity:0;z-index:-1}.gs-editor .gs-editor-inner{position:relative}.gs-editor .gs-editor-hl{box-sizing:content-box;border:solid 2px #07f;margin:-2px -1px}.gs-editor textarea{width:100%;padding:0 2px!important;position:absolute;font-size:12px;font-family:monospace,Arial;line-height:24px;letter-spacing:1px;top:0;left:0;border:none;outline:0;background-color:transparent;color:transparent;resize:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;overflow:hidden;cursor:default;white-space:pre;height:auto}.gs-editor.gs-editing{z-index:11;opacity:1}.gs-editor.gs-editing .gs-cell-label{pointer-events:none;font-family:math,monospace,serif;position:absolute;top:0;right:0;margin-top:-15px;margin-right:-2px;padding:0 2px;font-size:10px;background-color:rgba(0,119,255,.75);color:#fff;z-index:1}.gs-formula-bar{width:100%;position:relative;display:table;align-items:center;justify-content:center;border-top:solid 1px rgba(128,128,128,.3);border-left:solid 1px rgba(128,128,128,.3);border-right:solid 1px rgba(128,128,128,.3);box-sizing:border-box}.gs-formula-bar .gs-selecting-address{display:table-cell;vertical-align:middle;width:60px;color:rgba(200,200,200);font-size:13px;text-align:center}.gs-formula-bar[data-spill=true]{background-color:rgba(0,119,255,.04)}.gs-formula-bar[data-spill=true] .gs-selecting-address{color:rgba(80,160,255,.9);font-style:italic}.gs-formula-bar[data-spill=true] .gs-selecting-address::after{content:\"\\\\2196\";margin-left:2px;font-style:normal;font-size:9px}.gs-formula-bar .gs-fx{display:table-cell;vertical-align:middle;width:30px;color:rgba(200,200,200);font-style:italic;font-family:cursive;text-align:center;border-left:solid 1px rgba(128,128,128,.5);font-size:15px}.gs-formula-bar .gs-editor-hl{z-index:0;overflow-y:auto;box-sizing:border-box;white-space:pre-wrap;word-break:break-all}.gs-formula-bar textarea{position:relative;z-index:1;width:100%;vertical-align:bottom;color:transparent;border:none;background-color:transparent;padding:0 2px;box-sizing:border-box;outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:12px;font-family:monospace,Arial;height:24px;line-height:24px;min-height:24px;letter-spacing:1px;resize:vertical;caret-color:rgba(128,128,128);white-space:pre-wrap;word-break:break-all}.gs-token-type-INVALID_REF{color:red}.gs-token-type-VALUE.gs-token-entity-type-boolean,.gs-token-type-VALUE.gs-token-entity-type-number{color:#39f}.gs-token-type-VALUE.gs-token-entity-type-string{color:#090}.gs-editor-options{position:fixed;z-index:1000;padding:4px;background:var(--gs-bg,#fff);box-shadow:0 4px 12px rgba(0,0,0,.15);border:1px solid rgba(0,0,0,.1);border-radius:6px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;overflow:visible}.gs-editor-option{position:relative;cursor:pointer;list-style:none;padding:6px 12px;font-size:13px;border-radius:4px;color:#333;margin-bottom:2px}.gs-editor-option-content{display:flex;justify-content:space-between;width:100%;align-items:center}.gs-editor-option-tab{font-size:10px;color:#aaa;margin-left:8px;padding:2px 4px;border:1px solid #ddd;border-radius:3px;background:#f9f9f9}.gs-editor-option:last-child{margin-bottom:0}.gs-editor-option:hover{background-color:#f5f5f5}.gs-editor-option-selected{background-color:#ebf5ff;color:#06c;font-weight:500}.gs-editor-option-selected:hover{background-color:#e0f0ff}.gs-fn-guide1{position:absolute;top:-4px;left:calc(100% + 8px);background:#fff;border:1px solid rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.12);border-radius:6px;padding:16px;width:280px;z-index:1000;cursor:default;white-space:normal;color:#333}.gs-fn-guide1-tooltip{margin-bottom:8px;line-height:1.4;font-size:13px}.gs-fn-guide1-example{font-family:monospace;font-weight:600;font-size:13px;margin-bottom:8px;color:#1a1a1a;background:#f5f5f5;padding:6px 8px;border-radius:4px;border:1px solid #eee;display:flex;align-items:center;gap:6px;flex-wrap:wrap}.gs-fn-guide1-desc{font-size:13px;color:#555;margin-bottom:12px;line-height:1.4}.gs-fn-guide1-desc p{margin:0 0 6px 0}.gs-fn-guide1-desc p:last-child{margin-bottom:0}.gs-fn-guide1-args{border-top:1px solid #eee;padding-top:10px}.gs-fn-guide1-arg{margin-bottom:6px;line-height:1.4;font-size:12px}.gs-fn-guide1-arg-name{font-weight:600;color:#06c}.gs-fn-guide1-arg-opt{color:#888;font-size:11px}.gs-fn-guide1-arg-iter{font-weight:600;color:#06c}.gs-fn-guide1-arg-type{color:#06c;padding:0 4px;background:#ebf5ff;border-radius:3px;font-size:11px;margin:0 4px}.gs-fn-guide1-arg-desc{color:#666}.gs-fn-guide-category{position:absolute;top:-11px;right:8px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;padding:2px 7px;border-radius:4px;background:#e8eaf6;color:#3949ab;border:1px solid #c5cae9;white-space:nowrap}.gs-fn-guide-category.gs-fn-guide-category-math{background:#e3f2fd;color:#1565c0;border-color:#bbdefb}.gs-fn-guide-category.gs-fn-guide-category-statistics{background:#e8f5e9;color:#2e7d32;border-color:#c8e6c9}.gs-fn-guide-category.gs-fn-guide-category-text{background:#fff8e1;color:#f57f17;border-color:#ffecb3}.gs-fn-guide-category.gs-fn-guide-category-time{background:#fce4ec;color:#880e4f;border-color:#f8bbd0}.gs-fn-guide-category.gs-fn-guide-category-lookup{background:#f3e5f5;color:#6a1b9a;border-color:#e1bee7}.gs-fn-guide-category.gs-fn-guide-category-logical{background:#e0f2f1;color:#00695c;border-color:#b2dfdb}.gs-fn-guide-category.gs-fn-guide-category-information{background:#e0f7fa;color:#006064;border-color:#b2ebf2}.gs-fn-guide-category.gs-fn-guide-category-finance{background:#fff3e0;color:#e65100;border-color:#ffe0b2}.gs-fn-guide-category.gs-fn-guide-category-engineering{background:#efebe9;color:#4e342e;border-color:#d7ccc8}.gs-fn-guide-category.gs-fn-guide-category-other{background:#f5f5f5;color:#616161;border-color:#e0e0e0}.gs-editor[data-mode=dark] .gs-editor-options{background:#252526;border-color:#454545;box-shadow:0 4px 12px rgba(0,0,0,.5)}.gs-editor[data-mode=dark] .gs-editor-option{color:#ccc}.gs-editor[data-mode=dark] .gs-editor-option:hover{background-color:#333}.gs-editor[data-mode=dark] .gs-editor-option-selected{background-color:#094771;color:#fff}.gs-editor[data-mode=dark] .gs-editor-option-selected:hover{background-color:#0d5a8f}.gs-editor[data-mode=dark] .gs-editor-option-tab{color:#777;background:#333;border-color:#444}.gs-editor[data-mode=dark] .gs-fn-guide1{background:#252526;border-color:#454545;color:#ccc}.gs-editor[data-mode=dark] .gs-fn-guide1-example{background:#1e1e1e;border-color:#333;color:#d4d4d4}.gs-editor[data-mode=dark] .gs-fn-guide1-desc{color:#aaa}.gs-editor[data-mode=dark] .gs-fn-guide1-args{border-color:#333}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-iter,.gs-editor[data-mode=dark] .gs-fn-guide1-arg-name{color:#4fc1ff}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-opt{color:#777}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-type{background:#094771;color:#4fc1ff}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-desc{color:#999}.gs-editor[data-mode=dark] .gs-fn-guide-category{background:#2a2d3e;color:#7986cb;border-color:#3d4166}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-math{background:#0d2137;color:#64b5f6;border-color:#1a3a5c}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-statistics{background:#0d2218;color:#66bb6a;border-color:#1a3d2a}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-text{background:#2e2200;color:#ffd54f;border-color:#4d3900}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-time{background:#2d0d1e;color:#f48fb1;border-color:#4d1a33}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-lookup{background:#260d33;color:#ce93d8;border-color:#3d1a54}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-logical{background:#0d2421;color:#4db6ac;border-color:#1a3d39}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-information{background:#0d2426;color:#4dd0e1;border-color:#1a3d40}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-finance{background:#2e1500;color:#ffb74d;border-color:#4d2800}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-engineering{background:#1e1714;color:#bcaaa4;border-color:#332c28}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-other{background:#1e1e1e;color:#9e9e9e;border-color:#333}.gs-editor[data-mode=dark] .gs-fn-guide2{background:#252526;border-color:#454545;box-shadow:0 4px 12px rgba(0,0,0,.5);color:#ccc}.gs-editor[data-mode=dark] .gs-fn-guide2-name{color:#dfdbdb;background:#333;border-color:#444}.gs-editor[data-mode=dark] .gs-fn-guide2 .gs-active-arg{color:#fff;background-color:#094771}.gs-editor[data-mode=dark] .gs-fn-guide2-arg-type{background:#094771;color:#4fc1ff}.gs-editor[data-mode=dark] .gs-fn-guide2-desc{color:#aaa;border-top-color:#333}.gs-fn-guide2{position:fixed;left:0;background:#fff;border:1px solid rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.12);border-radius:6px;padding:12px 16px;width:280px;z-index:1000;cursor:default;white-space:normal;color:#333;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;transition:opacity .1s ease-in-out}.gs-fn-guide2.gs-fn-guide2-hidden{opacity:0!important;pointer-events:none!important}.gs-fn-guide2-name{font-family:monospace;font-weight:700;font-size:13px;color:#1a1a1a;background:#f5f5f5;padding:6px 8px;border-radius:4px;border:1px solid #eee;display:flex;align-items:center;gap:6px;flex-wrap:wrap;width:100%;box-sizing:border-box;margin-bottom:8px}.gs-fn-guide2-args-inline{font-size:13px;font-family:monospace;line-height:1.5;margin-bottom:8px;color:#666}.gs-fn-guide2-args-inline span{transition:all .2s ease-in-out}.gs-fn-guide2 .gs-active-arg{font-weight:700;color:#06c;background-color:#ebf5ff;padding:2px 4px;margin:0 -4px;border-radius:4px}.gs-fn-guide2-arg-type{color:#06c;padding:0 4px;background:#ebf5ff;border-radius:3px;font-size:11px;margin:0 4px}.gs-fn-guide2-desc{font-size:12px;color:#555;line-height:1.4;border-top:1px solid #eee;padding-top:8px;margin-top:4px}.gs-fn-guide2-desc p{margin:0}.gs-fn-guide2-desc-more{font-style:italic;color:#888;margin-top:4px!important;font-size:11px}.gs-adjuster{padding:0}.gs-table{margin:0}.gs-tabular{overflow:auto;display:block;box-sizing:border-box;position:relative}.gs-tabular-inner>table{table-layout:fixed;border-collapse:collapse;border-spacing:0}.gs-th{z-index:2;padding:0;position:sticky;font-size:13px;font-weight:400;box-sizing:border-box;vertical-align:top}.gs-th .gs-resizer{position:absolute;border-color:transparent;box-sizing:border-box;z-index:2}.gs-th .gs-resizer:hover{background-color:#07f}.gs-th .gs-resizer.gs-protected{display:none}.gs-th-inner{height:100%;box-sizing:border-box;vertical-align:middle;overflow:hidden;display:flex;align-items:center;justify-content:center}.gs-th-inner-wrap{height:100%;box-sizing:border-box;background-color:transparent}.gs-th-top{top:0;overflow:hidden}.gs-th-top .gs-resizer{top:0;right:0;width:3px;cursor:e-resize}.gs-th-top .gs-resizer.gs-dragging{border-right-style:dotted;height:1000000px!important;cursor:e-resize}.gs-th-left{left:0;overflow:hidden;min-width:30px;border-top:solid 1px #ddd}.gs-th-left .gs-resizer{left:0;bottom:0;height:3px;cursor:n-resize}.gs-th-left .gs-resizer.gs-dragging{border-bottom-style:dotted;width:1000000px!important;cursor:n-resize}.gs-th-top.gs-th-left{top:0;left:0;z-index:3;border:none!important}.gs-th-left.gs-filter-fixed .gs-th-inner::before{content:'‹\\\\00a0'}.gs-th-left.gs-sort-fixed .gs-th-inner::after{content:'\\\\00a0›'}.gs-col-addr{position:absolute;top:2px;right:4px;font-size:9px;opacity:.5;line-height:1;letter-spacing:.3px;pointer-events:none}.gs-search-bar{width:100%;display:flex;align-items:center;border-top:solid 1px rgba(128,128,128,.3);border-left:solid 1px rgba(128,128,128,.3);border-right:solid 1px rgba(128,128,128,.3);box-sizing:border-box;background-color:rgba(200,50,0,.2)}.gs-search-bar.gs-search-found{background-color:rgba(0,200,100,.2)}.gs-search-bar .gs-search-bar-inner{border-left:solid 1px rgba(128,128,128,.5)}.gs-search-bar .gs-search-bar-icon{border-left:solid 1px rgba(128,128,128,.3);display:flex;align-items:center;justify-content:center;width:30px;flex-shrink:0}.gs-search-bar .gs-search-input-wrapper{flex-grow:1;position:relative;display:flex;align-items:center;height:100%}.gs-search-bar .gs-search-input-ghost{position:absolute;left:2px;right:2px;top:0;bottom:0;pointer-events:none;font-size:12px;font-family:monospace,Arial;line-height:24px;letter-spacing:1px;white-space:pre-wrap;word-break:break-all;color:transparent;overflow:hidden}.gs-search-bar .gs-search-input-ghost .gs-search-ghost-hint{color:#aaa}.gs-search-bar textarea{background-color:transparent;border:none;padding:0 2px;box-sizing:border-box;outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:12px;font-family:monospace,Arial;height:24px;line-height:24px;min-height:24px;letter-spacing:1px;caret-color:rgba(128,128,128);white-space:pre-wrap;word-break:break-all;flex-grow:1;width:100%;resize:none}.gs-search-progress{color:#999;font-size:13px;width:60px;flex-shrink:0;white-space:nowrap;text-align:center}.gs-search-close{cursor:pointer;display:flex;align-items:center;justify-content:center;width:24px;flex-shrink:0}.gs-search-buttons{display:flex;align-items:center;white-space:nowrap;flex-shrink:0}.gs-search-button{display:inline-flex;cursor:pointer;margin:0 2px}.gs-search-button span{display:inline-block;font-size:11px;padding:3px 5px;background-color:rgba(128,128,128,.1);border:1px solid rgba(128,128,128,.3);border-radius:3px;transition:all .15s ease;line-height:1}.gs-search-button span:hover{background-color:rgba(128,128,128,.2)}.gs-search-button span.gs-search-button-on{color:#07f;background-color:rgba(200,200,255,.5);border-color:#07f}.gs-search-range span{white-space:nowrap;font-family:monospace}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes gs-pending-slide{0%{left:-40%}100%{left:100%}}@keyframes gs-pending-pulse{0%{left:0;width:0}50%{left:0;width:100%}100%{left:100%;width:0}}@keyframes gs-flash{0%{opacity:0}20%{opacity:1}100%{opacity:0}}.gs-flash-overlay{position:absolute;inset:0;pointer-events:none;z-index:9999;background:rgba(0,119,255,.15);opacity:0}.gs-flash-overlay--active{animation:gs-flash .6s ease-out forwards}`;\n","import { CSS, LAST_MODIFIED } from './minified';\n\nexport const embedStyle = () => {\n if (typeof window === 'undefined') {\n return;\n }\n const exists = document.querySelector(`style.gs-styling[data-modified-at='${LAST_MODIFIED}']`);\n if (exists) {\n return;\n }\n const style = document.createElement('style');\n document.head.appendChild(style);\n style.setAttribute('class', 'gs-styling');\n style.setAttribute('data-modified-at', `${LAST_MODIFIED}`);\n style.innerText = CSS;\n};\n","import type { KeyboardEvent } from 'react';\nimport React, { useCallback, useEffect, useRef, useState, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { Context } from '../store';\nimport { p2a, a2p } from '../lib/coords';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport * as prevention from '../lib/operation';\nimport { handleFormulaQuoteAutoClose, insertTextAtCursor, isFocus } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { editorStyle } from './Editor';\nimport { ScrollHandle } from './ScrollHandle';\nimport { useAutocomplete } from './useAutocomplete';\n\ntype FormulaBarProps = {\n ready: boolean;\n};\n\nexport const FormulaBar = ({ ready }: FormulaBarProps) => {\n const { store, dispatch } = useContext(Context);\n const [before, setBefore] = useState('');\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n selectingZone,\n editorRef,\n largeEditorRef,\n sheetReactive: sheetRef,\n inputting,\n editingAddress: editingCell,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n const hlRef = useRef<HTMLDivElement | null>(null);\n\n const address = choosing.x === -1 ? '' : p2a(choosing);\n const cell = sheet?.getCell(choosing, { resolution: 'SYSTEM' });\n const spilledFromAddress = sheet?.getSystem(choosing)?.spilledFrom;\n const originPoint = spilledFromAddress ? a2p(spilledFromAddress) : undefined;\n const originAddress = originPoint != null ? p2a(originPoint) : undefined;\n useEffect(() => {\n if (!sheet) {\n return;\n }\n let value = sheet.getCell(choosing, { resolution: 'SYSTEM' })?.value ?? '';\n // debug to remove this line\n value = sheet.getSerializedValue({ point: choosing, cell: { ...cell, value }, resolution: 'RAW' });\n largeEditorRef.current!.value = value;\n setBefore(value as string);\n }, [address, sheet]);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n dispatch(setEditingAddress(''));\n focus(editorRef.current);\n },\n [before],\n );\n\n useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n entries.forEach(updateScroll);\n });\n if (largeEditorRef.current) {\n observer.observe(largeEditorRef.current);\n }\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() || [];\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n const largeInput = largeEditorRef.current;\n\n const handleInput = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n dispatch(setInputting(e.currentTarget.value));\n }, []);\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const updateScroll = useCallback(() => {\n if (!hlRef.current || !largeEditorRef.current) {\n return;\n }\n hlRef.current.style.height = `${largeEditorRef.current.clientHeight}px`;\n hlRef.current.scrollLeft = largeEditorRef.current.scrollLeft;\n hlRef.current.scrollTop = largeEditorRef.current.scrollTop;\n }, []);\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!largeInput || !sheet) {\n return;\n }\n setIsFocused(true);\n dispatch(setEditingAddress(address));\n sheet.registry.lastFocused = e.currentTarget;\n },\n [largeInput, address, sheet],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (e.currentTarget.value!.startsWith('=')) {\n return true;\n } else {\n if (editingCell) {\n writeCell(e.currentTarget.value);\n }\n }\n },\n [editingCell, writeCell],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.ctrlKey || !sheet) {\n return true;\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n const isFunc = option?.isFunction;\n\n if (isFunc) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n return false;\n } else {\n // ... regular completion ...\n const t = sheet.update({ diff: { [address]: { value: option.value } }, partial: true });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n break;\n case 'ArrowUp':\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowDown':\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'Enter': {\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n if (option?.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n e.preventDefault();\n return false;\n }\n }\n\n if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n } else {\n writeCell(input.value);\n dispatch(setInputting(''));\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n }\n break;\n }\n case 'Escape': {\n input.value = before;\n dispatch(setInputting(before));\n dispatch(setEditingAddress(''));\n e.preventDefault();\n focus(editorRef.current);\n\n break;\n }\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n }\n\n const cell = sheet.getCell(choosing, { resolution: 'SYSTEM' });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n e.preventDefault();\n }\n updateScroll();\n return false;\n },\n [\n sheet,\n choosing,\n address,\n before,\n writeCell,\n updateScroll,\n filteredOptions,\n selected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n inputting,\n ],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent, i: number) => {\n e.preventDefault();\n e.stopPropagation();\n const option = filteredOptions[i];\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n writeCell(newValue);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n }\n },\n [filteredOptions, replaceWithOption, writeCell, dispatch],\n );\n\n const style: React.CSSProperties = ready ? {} : { visibility: 'hidden' };\n if (!sheet) {\n return (\n <label className=\"gs-formula-bar gs-hidden\" style={style}>\n <div className=\"gs-selecting-address\"></div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <textarea />\n </div>\n </label>\n );\n }\n const renderOverlays = () => {\n if (!isFocused || typeof document === 'undefined') {\n return null;\n }\n if (largeEditorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = largeEditorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const top = rect.bottom;\n const left = rect.left;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && choosing.x !== -1 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n return (\n <div\n className=\"gs-formula-bar\"\n data-sheet-id={store.sheetId}\n data-spill={originAddress != null ? 'true' : undefined}\n style={style}\n >\n <ScrollHandle style={{ position: 'absolute', left: 0, top: 0, zIndex: 2 }} vertical={-1} />\n <div className=\"gs-selecting-address\">{originAddress != null ? originAddress : address}</div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <div\n className=\"gs-editor-hl\"\n ref={hlRef}\n style={{\n height: largeEditorRef.current?.clientHeight,\n width: '100%',\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </div>\n <textarea\n name=\"gs-formula-bar-editor\"\n data-sheet-id={store.sheetId}\n data-size=\"large\"\n rows={1}\n spellCheck={false}\n ref={largeEditorRef}\n value={inputting}\n // Spilled cells must not be edited from the FormulaBar — input here\n // would modify `inputting` one character at a time (via onInput) even\n // though the underlying cell cannot be written to.\n readOnly={originAddress != null}\n onInput={handleInput}\n onFocus={handleFocus}\n onSelect={handleSelect}\n onPaste={(e) => {\n e.stopPropagation();\n }}\n onKeyDown={handleKeyDown}\n onKeyUp={updateScroll}\n onScroll={updateScroll}\n onMouseEnter={(e) => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={(e) => {\n dispatch(setEditorHovering(false));\n }}\n ></textarea>\n {renderOverlays()}\n </div>\n </div>\n );\n};\n","import type { ReactNode, CSSProperties } from 'react';\n\nexport interface IconProps {\n style?: CSSProperties;\n color?: string;\n size?: number;\n}\n\ninterface BaseProps extends IconProps {\n children?: ReactNode;\n}\n\n// https://tabler.io/icons\n\nexport const Base = ({ style, size = 24, children }: BaseProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox={`0 0 24 24`}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n className=\"icon-tabler\"\n >\n {children}\n </svg>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const SearchIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\" fill={color} />\n <path d=\"M21 21l-6 -6\" fill={color} />\n </Base>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const CloseIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M18 6l-12 12\" fill={color} />\n <path d=\"M6 6l12 12\" fill={color} />\n </Base>\n );\n};\n","import { useContext, useEffect, useRef, useCallback, useMemo } from 'react';\n\nimport { a2p, x2c, y2r } from '../lib/coords';\nimport { isZoneNotSelected } from '../lib/spatial';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '../lib/virtualization';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '../lib/dom';\n\nexport const SearchBar = () => {\n const { store, dispatch } = useContext(Context);\n const {\n rootRef,\n editorRef,\n searchInputRef,\n tabularRef,\n searchQuery,\n searchCaseSensitive,\n searchRegex,\n searchRange,\n selectingZone,\n matchingCellIndex,\n matchingCells,\n sheetReactive: sheetRef,\n } = store;\n const sheet = sheetRef.current;\n\n const matchingCell = matchingCells[matchingCellIndex];\n useEffect(() => {\n if (!matchingCell || !sheet) {\n return;\n }\n const point = a2p(matchingCell);\n if (typeof point === 'undefined') {\n return;\n }\n smartScroll(sheet, tabularRef.current, point);\n }, [searchQuery, matchingCellIndex, searchCaseSensitive, searchRegex, sheet, tabularRef]);\n\n const handleProgressClick = useCallback((e: React.MouseEvent) => {\n const input = e.currentTarget.previousSibling as HTMLInputElement;\n input?.nodeName === 'INPUT' && focus(input);\n }, []);\n\n const handleSearchClick = useCallback(() => {\n dispatch(search(1));\n }, []);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n dispatch(setSearchQuery(e.currentTarget.value));\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n const el = editorRef?.current;\n if (el) {\n focus(el);\n }\n dispatch(setSearchQuery(undefined));\n }\n if (e.key === 'f' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n return false;\n }\n if (e.key === 'Enter') {\n dispatch(search(e.shiftKey ? -1 : 1));\n e.preventDefault();\n return false;\n }\n return true;\n },\n [editorRef],\n );\n\n const handleCaseSensitiveClick = useCallback(() => {\n dispatch(setSearchCaseSensitive(!searchCaseSensitive));\n }, [searchCaseSensitive]);\n\n const handleRegexClick = useCallback(() => {\n dispatch(setSearchRegex(!searchRegex));\n }, [searchRegex]);\n\n const hasSelection = useMemo(() => {\n if (!selectingZone) {\n return false;\n }\n if (isZoneNotSelected(selectingZone)) {\n return false;\n }\n const { startY, startX, endY, endX } = selectingZone;\n return !(startY === endY && startX === endX);\n }, [selectingZone]);\n\n const selectionLabel = useMemo(() => {\n if (!selectingZone || !hasSelection) {\n return '';\n }\n const { startY, startX, endY, endX } = selectingZone;\n const topLeft = `${x2c(Math.min(startX, endX))}${y2r(Math.min(startY, endY))}`;\n const bottomRight = `${x2c(Math.max(startX, endX))}${y2r(Math.max(startY, endY))}`;\n return `${topLeft}:${bottomRight}`;\n }, [selectingZone, hasSelection]);\n\n const handleRangeClick = useCallback(() => {\n if (searchRange) {\n // Clear search range\n dispatch(setSearchRange(undefined));\n } else if (selectingZone && hasSelection) {\n // Set search range to current selection\n const { startY, startX, endY, endX } = selectingZone;\n dispatch(\n setSearchRange({\n startY: Math.min(startY, endY),\n startX: Math.min(startX, endX),\n endY: Math.max(startY, endY),\n endX: Math.max(startX, endX),\n }),\n );\n }\n }, [searchRange, selectingZone, hasSelection]);\n\n const searchRangeLabel = useMemo(() => {\n if (!searchRange) {\n return '';\n }\n const { startY, startX, endY, endX } = searchRange;\n const topLeft = `${x2c(startX)}${y2r(startY)}`;\n const bottomRight = `${x2c(endX)}${y2r(endY)}`;\n return `${topLeft}:${bottomRight}`;\n }, [searchRange]);\n\n const handleCloseClick = useCallback(() => {\n dispatch(setSearchQuery(undefined));\n focus(editorRef.current);\n }, [editorRef]);\n\n if (typeof searchQuery === 'undefined') {\n return null;\n }\n if (rootRef.current === null) {\n return null;\n }\n return (\n <label className={`gs-search-bar ${matchingCells.length > 0 ? 'gs-search-found' : ''}`}>\n <div className=\"gs-search-progress\" onClick={handleProgressClick}>\n {matchingCells.length === 0 ? 0 : matchingCellIndex + 1} / {matchingCells.length}\n </div>\n <div className=\"gs-search-bar-icon\" onClick={handleSearchClick}>\n <SearchIcon style={{ verticalAlign: 'middle', marginLeft: '5px' }} />\n </div>\n <div className=\"gs-search-input-wrapper\">\n <div className=\"gs-search-input-ghost\">\n <span className=\"gs-search-ghost-text\">{searchQuery}</span>\n {searchQuery && <span className=\"gs-search-ghost-hint\"> ↵ Next</span>}\n </div>\n <textarea\n ref={searchInputRef}\n value={searchQuery}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Search\"\n title=\"Press Enter to next, Shift+Enter to previous\"\n ></textarea>\n </div>\n <div className=\"gs-search-buttons\">\n {searchRange && (\n <div className=\"gs-search-button gs-search-range\">\n <span\n className=\"gs-search-button-on\"\n onClick={handleRangeClick}\n title={`Search range: ${searchRangeLabel}`}\n >\n in {searchRangeLabel}\n </span>\n </div>\n )}\n {!searchRange && hasSelection && (\n <div className=\"gs-search-button gs-search-range\">\n <span onClick={handleRangeClick} title={`Limit to range: ${selectionLabel}`}>\n in {selectionLabel}\n </span>\n </div>\n )}\n <div className=\"gs-search-button gs-search-casesensitive\">\n <span\n className={`${searchCaseSensitive ? 'gs-search-button-on' : ''}`}\n onClick={handleCaseSensitiveClick}\n title={`Case sensitive`}\n >\n Aa\n </span>\n </div>\n <div className=\"gs-search-button gs-search-regex\">\n <span\n className={`${searchRegex ? 'gs-search-button-on' : ''}`}\n onClick={handleRegexClick}\n title={`Regular expression`}\n >\n .*\n </span>\n </div>\n </div>\n <a className=\"gs-search-close\" onClick={handleCloseClick}>\n <CloseIcon style={{ verticalAlign: 'middle' }} />\n </a>\n </label>\n );\n};\n","import { useEffect, useState, useRef, useReducer, createRef } from 'react';\nimport type { CellsByAddressType, SheetHandle, StoreHandle, OptionsType, Props, StoreType } from '../types';\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n SHEET_HEIGHT,\n SHEET_WIDTH,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '../constants';\nimport { Context } from '../store';\nimport { reducer as defaultReducer } from '../store/actions';\nimport { Editor } from './Editor';\nimport { StoreObserver } from './StoreObserver';\nimport { Resizer } from './Resizer';\nimport { Emitter } from './Emitter';\nimport { ContextMenu } from './ContextMenu';\nimport { ColumnMenu } from './ColumnMenu';\nimport { RowMenu } from './RowMenu';\nimport { Sheet } from '../lib/sheet';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '../lib/spatial';\nimport { x2c, y2r } from '../lib/coords';\nimport { embedStyle } from '../styles/embedder';\nimport { FormulaBar } from './FormulaBar';\nimport { SearchBar } from './SearchBar';\nimport { useBook } from '../lib/book';\nimport { ScrollHandle } from './ScrollHandle';\nimport { defaultContextMenuDescriptors, defaultRowMenuDescriptors, defaultColMenuDescriptors } from '../lib/menu';\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\n\nexport function GridSheet({\n initialCells,\n sheetName = '',\n sheetRef: initialSheetRef,\n storeRef: initialStoreRef,\n options = {},\n className,\n style,\n book: initialBook,\n}: Props) {\n const { sheetResize, showFormulaBar = true, mode = 'light' } = options;\n const rootRef = useRef<HTMLDivElement>(null);\n const flashRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLTextAreaElement>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n const largeEditorRef = useRef<HTMLTextAreaElement>(null);\n const tabularRef = useRef<HTMLDivElement>(null);\n\n const internalSheetRef = useSheetRef();\n const sheetRef = initialSheetRef ?? internalSheetRef;\n const internalStoreRef = useStoreRef();\n const storeRef = initialStoreRef ?? internalStoreRef;\n\n const internalBook = useBook({});\n const book = initialBook ?? internalBook;\n const { registry } = book;\n\n // useRef to manage sheetId and avoid Strict Mode issues\n const sheetIdRef = useRef<number | null>(null);\n if (sheetIdRef.current === null) {\n sheetIdRef.current = ++registry.sheetHead;\n }\n const sheetId = sheetIdRef.current;\n\n // Initialize sheetReactive\n const sheetReactive = useRef<Sheet | null>(null);\n\n const [initialState] = useState<StoreType>(() => {\n if (!sheetName) {\n sheetName = `Sheet${sheetId}`;\n console.debug('GridSheet: sheetName is not provided, using default name:', sheetName);\n }\n const { limits, contextMenu, rowMenu, colMenu } = options;\n const sheet = new Sheet({\n limits,\n name: sheetName,\n registry,\n });\n sheet.id = sheetId;\n registry.sheetIdsByName[sheetName] = sheetId;\n\n sheet.initialize(initialCells);\n registry.onInit?.({ sheet });\n\n sheet.setTotalSize();\n sheetReactive.current = sheet;\n\n const store: StoreType = {\n sheetId,\n sheetReactive,\n rootRef,\n flashRef,\n mainRef,\n searchInputRef,\n editorRef,\n largeEditorRef,\n tabularRef,\n choosing: { y: 1, x: 1 },\n inputting: '',\n selectingZone: { startY: 1, startX: 1, endY: -1, endX: -1 },\n autofillDraggingTo: null,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n editingAddress: '',\n editorRect: { y: 0, x: 0, height: 0, width: 0 },\n dragging: false,\n sheetHeight: 0,\n sheetWidth: 0,\n entering: false,\n matchingCells: [],\n matchingCellIndex: 0,\n searchCaseSensitive: false,\n searchRegex: false,\n editingOnEnter: true,\n contextMenuPosition: { y: -1, x: -1 },\n contextMenu: contextMenu ?? defaultContextMenuDescriptors,\n rowMenu: rowMenu ?? defaultRowMenuDescriptors,\n colMenu: colMenu ?? defaultColMenuDescriptors,\n resizingPositionY: [-1, -1, -1],\n resizingPositionX: [-1, -1, -1],\n columnMenuState: null,\n rowMenuState: null,\n editorHovering: true,\n mode: 'light',\n };\n return store;\n });\n\n type ReducerWithoutAction<S> = (prevState: S) => S;\n\n const [store, dispatch] = useReducer(\n defaultReducer as unknown as ReducerWithoutAction<StoreType>,\n initialState,\n () => initialState,\n );\n\n useEffect(() => {\n embedStyle();\n }, []);\n\n const [sheetHeight, setSheetHeight] = useState(options?.sheetHeight || estimateSheetHeight(initialCells));\n const [sheetWidth, setSheetWidth] = useState(options?.sheetWidth || estimateSheetWidth(initialCells));\n useEffect(() => {\n const intervalId = window.setInterval(() => {\n setSheetHeight(mainRef.current?.clientHeight || 0);\n setSheetWidth(mainRef.current?.clientWidth || 0);\n }, 1000);\n return () => window.clearInterval(intervalId);\n }, []);\n useEffect(() => {\n if (options.sheetHeight) {\n setSheetHeight(options.sheetHeight);\n }\n }, [options.sheetHeight]);\n useEffect(() => {\n if (options.sheetWidth) {\n setSheetWidth(options.sheetWidth);\n }\n }, [options.sheetWidth]);\n\n return (\n <Context.Provider value={{ store, dispatch }}>\n <div\n className={`gs-root1 ${registry.ready ? 'gs-initialized' : ''}`}\n ref={rootRef}\n data-sheet-name={sheetName}\n data-mode={mode}\n data-rows={store.sheetReactive.current?.numRows ?? 0}\n data-cols={store.sheetReactive.current?.numCols ?? 0}\n >\n <div className=\"gs-flash-overlay\" ref={flashRef} />\n <ScrollHandle style={{ position: 'fixed', top: 0, left: 0 }} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, right: 0, top: 0, width: 5 }} horizontal={1} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, left: 0, bottom: 0, height: 5 }} vertical={1} />\n\n {typeof store.searchQuery === 'undefined' ? (\n showFormulaBar && <FormulaBar ready={registry.ready} />\n ) : (\n <SearchBar />\n )}\n <div\n className={`gs-main ${className || ''}`}\n ref={mainRef}\n style={{\n //width: '100%',\n maxWidth: (store.sheetReactive.current?.totalWidth || 0) + 2,\n maxHeight: (store.sheetReactive.current?.fullHeight || 0) + 2,\n overflow: 'auto',\n resize: sheetResize,\n ...style,\n }}\n >\n <Editor mode={mode} />\n <Tabular />\n <StoreObserver {...{ ...options, sheetHeight, sheetWidth, sheetName, sheetRef, storeRef }} />\n <ContextMenu />\n <ColumnMenu />\n <RowMenu />\n <Resizer />\n <Emitter />\n </div>\n </div>\n </Context.Provider>\n );\n}\n\nconst estimateSheetHeight = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedHeight = initialCells[0]?.height ?? HEADER_HEIGHT;\n for (let y = 1; y <= auto.numRows; y++) {\n const row = y2r(y);\n const height =\n initialCells?.[row]?.height ||\n initialCells?.['0' + row]?.height ||\n initialCells?.[DEFAULT_ROW_KEY]?.height ||\n initialCells?.default?.height ||\n DEFAULT_HEIGHT;\n if (estimatedHeight + height > SHEET_HEIGHT) {\n return SHEET_HEIGHT;\n }\n estimatedHeight += height;\n }\n return estimatedHeight + 3;\n};\n\nconst estimateSheetWidth = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedWidth = initialCells[0]?.width ?? HEADER_WIDTH;\n for (let x = 1; x <= auto.numCols; x++) {\n const col = x2c(x);\n const width =\n initialCells?.[col]?.width ||\n initialCells?.[col + '0']?.width ||\n initialCells?.[DEFAULT_COL_KEY]?.width ||\n initialCells?.default?.width ||\n DEFAULT_WIDTH;\n if (estimatedWidth + width > SHEET_WIDTH) {\n return SHEET_WIDTH;\n }\n estimatedWidth += width;\n }\n return estimatedWidth + 3;\n};\n","import type { PolicyMixinType, RenderProps } from './core';\n\nconst makeThousandSeparatorMixin = (sep: string): PolicyMixinType => ({\n renderNumber({ value }: RenderProps<number>): any {\n if (value == null || isNaN(value)) {\n return 'NaN';\n }\n const [int, fraction] = String(parseFloat(value.toPrecision(this.decimalPrecision))).split('.');\n const result = int.replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, `$1${sep}`);\n if (fraction == null) {\n return result;\n }\n return `${result}.${fraction}`;\n },\n});\n\nexport const ThousandSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(',');\nexport const ThousandSpaceSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(' ');\n","import type { PolicyMixinType, RenderProps } from './core';\n\nexport const CheckboxPolicyMixin: PolicyMixinType = {\n renderBool({ value, apply, sheet, point }: RenderProps<boolean>): any {\n return (\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => {\n if (apply) {\n apply(sheet.write({ point, value: e.currentTarget.checked.toString() }));\n }\n e.currentTarget.blur();\n }}\n />\n );\n },\n};\n","import { CSSProperties } from 'react';\n\ntype BorderStyleValue = string;\n\ninterface BorderOptions {\n /**\n * Border CSS value to apply uniformly to all sides.\n * Individual sides (top, right, etc.) will override this if specified.\n *\n * Example: \"1px solid #000\"\n */\n all?: BorderStyleValue;\n\n /**\n * Border CSS value for the top side.\n *\n * Example: \"2px dashed red\"\n */\n top?: BorderStyleValue;\n\n /**\n * Border CSS value for the right side.\n */\n right?: BorderStyleValue;\n\n /**\n * Border CSS value for the bottom side.\n */\n bottom?: BorderStyleValue;\n\n /**\n * Border CSS value for the left side.\n */\n left?: BorderStyleValue;\n}\n\n/**\n * Generates a CSSProperties object with individual border styles.\n *\n * - If `all` is provided, it applies the same border style to all sides.\n * - If individual sides (top, right, bottom, left) are specified, they override `all`.\n * - Sides that are not specified will be omitted from the result,\n * which avoids unintentionally removing existing border styles during re-renders.\n * - The function does not output the shorthand `border` property, only individual sides.\n *\n * @param options Border configuration options.\n * @returns CSSProperties object with border styles.\n *\n * @example\n * makeBorder({ all: \"1px solid #000\" });\n * // → { borderTop: \"1px solid #000\", borderRight: \"1px solid #000\", borderBottom: \"1px solid #000\", borderLeft: \"1px solid #000\" }\n *\n * @example\n * makeBorder({ top: \"2px dashed red\", left: \"1px solid blue\" });\n * // → { borderTop: \"2px dashed red\", borderLeft: \"1px solid blue\" }\n */\nexport function makeBorder(options: BorderOptions): CSSProperties {\n const result: CSSProperties = {};\n\n const all = options.all;\n\n if (options.top ?? all) {\n result.borderTop = options.top ?? all;\n }\n\n if (options.right ?? all) {\n result.borderRight = options.right ?? all;\n }\n\n if (options.bottom ?? all) {\n result.borderBottom = options.bottom ?? all;\n }\n\n if (options.left ?? all) {\n result.borderLeft = options.left ?? all;\n }\n\n return result;\n}\n"],"names":["DEFAULT_HISTORY_LIMIT","DEFAULT_HEIGHT","DEFAULT_WIDTH","SHEET_HEIGHT","SHEET_WIDTH","HEADER_HEIGHT","HEADER_WIDTH","MIN_WIDTH","MIN_HEIGHT","OVERSCAN_X","OVERSCAN_Y","DEFAULT_ALPHABET_CACHE_SIZE","SECONDS_IN_DAY","FULLDATE_FORMAT_UTC","RESET_ZONE","BASE_DATE","DEFAULT_KEY","DEFAULT_COL_KEY","DEFAULT_ROW_KEY","Context","createContext","ALPHABET","N2C_CACHE","C2N_CACHE","getColumnLetterFromNumber","key","cacheSize","cached","num","result","it","st","getNumberFromColumnLetter","alpha","digit","x2c","x","c","c2x","col","absolute","n","y2r","y","r2y","row","p2a","absX","absY","colPart","rowPart","a2p","address","m","_absX","_absY","grantAddressAbsolute","absCol","absRow","rh","ch","stripAddressAbsolute","buildIdentifiedRef","id","superposeArea","srcArea","dstArea","srcRows","srcCols","areaDiff","dstRows","dstCols","concatAreas","area1","area2","zoneToArea","zone","top","bottom","left","right","areaToZone","area","areaToRange","leftTop","rightBottom","between","range","index","among","point","zoneDiff","zoneShape","areaShape","matrixShape","base","matrix","h","makeSequence","start","stop","step","_","i","oa2aa","oa","fields","aa","o","a","field","aa2oa","v","createMatrix","numRows","numCols","fill","buildInitialCellsFromOrigin","cells","ensured","flattenAs","origin","buildInitialCells","matrices","buildCells","baseAddress","baseY","baseX","e","cell","getMaxSizesFromCells","lastY","lastX","end","list","complementSelectingArea","selectingArea","choosing","expandRange","startRow","endRow","match","startCol","endCol","startColIndex","endColIndex","currentColumn","restrictZone","s","binarySearch","low","high","predicate","lessThan","mid","addressesToAreas","addresses","points","addr","pointSet","p","visited","areas","k","queue","dy","dx","nk","addressesToCols","asc","seen","cols","b","addressesToRows","rows","isZoneNotSelected","compactReflection","reflection","restrictPoints","store","sheet","selectingZone","y1","x1","y2","x2","FLASH_CLASS","FLASH_DURATION_MS","flashSheet","el","flashWithCallback","callback","shouldTracking","operation","initSearchStatement","searchQuery","searchCaseSensitive","searchRegex","searchRange","matchingCells","matcher","flags","regex","q","startY","endY","startX","endX","matchingCellIndex","isXSheetFocused","sheetId","sheetRef","getCellRectPositions","colCell","rowCell","_a","_b","w","getScreenRect","height","width","virtualize","boundaryTop","boundaryLeft","boundaryBottom","boundaryRight","ys","xs","before","after","smartScroll","targetPoint","behavior","screen","target","up","down","isTopOver","isLeftOver","isBottomOver","isRightOver","findVisibleElement","elements","getPosition","boundary","dataKey","getAreaInTabular","tabularElement","topPosition","leftPosition","bottomPosition","rightPosition","rect","RemoveRows","RemoveCols","InsertRowsAbove","InsertRowsBelow","InsertColsLeft","InsertColsRight","MoveFrom","MoveTo","Write","Style","Copy","Resize","SetPolicy","Sort","Filter","SetLabel","NoOperation","Move","Update","InsertRows","InsertCols","Add","Delete","ReadOnly","ColumnMenu","RowMenu","ViewOnly","hasOperation","flag","debugOperations","prevention","operations","MS_PER_DAY","Time","days","format","date","totalMs","absMs","sign","millis","remaining","seconds","minutes","hours","milliseconds","ms","timeMs","date1","date2","obj","value","strict","formattedMatcher","dayjsFormatToNamedRegex","_sign","msecs","tokenRegexMap","sortedTokens","tokenPattern","regexSource","BORDER_AUTOFILL_DRAGGING","DirectionMapping","Autofill","draggingTo","orientation","sTop","sLeft","sBottom","sRight","srcShape","dstShape","diff","patterns","j","baseCell","px","nextValue","py","style","autofillDraggingTo","horizontal","vertical","groups","groupByType","group","lastValue","pass","generateFormula","slide","skip","generateNumber","g","next","d","generateDate","generateStringNumber","prefix","extractStringNumber","lastNumber","StringNumberPattern","TypedGroup","kind","prefix1","number1","prefix2","number2","news","lastGroup","eq","dayjs","basePrefix","number","nexts","firstNumber","nextGroup","resetZone","actions","reducer","action","act","newStore","_CoreAction","payload","CoreAction","SetSearchQueryAction","setSearchQuery","SetSearchCaseSensitiveAction","setSearchCaseSensitive","SetSearchRegexAction","setSearchRegex","SetSearchRangeAction","setSearchRange","SetEditingAddressAction","setEditingAddress","SetAutofillDraggingToAction","setAutofillDraggingTo","SubmitAutofillAction","autofill","submitAutofill","SetContextMenuPositionAction","setContextMenuPosition","SetResizingPositionYAction","setResizingPositionY","SetResizingPositionXAction","setResizingPositionX","SetEnteringAction","setEntering","UpdateSheetAction","updateSheet","SetEditorRectAction","setEditorRect","SetDragging","setDragging","BlurAction","blur","CopyAction","copy","CutAction","cut","PasteAction","dstSheetRef","dstSheet","registry","copyingSheetId","copyingZone","cutting","srcSheet","copyingArea","onlyValue","src","dst","nextSelectingZone","newSheet","superposed","paste","EscapeAction","escape","ChooseAction","choose","SelectAction","select","SelectRowsAction","choosingY","selectRows","SelectColsAction","selectCols","DragAction","drag","SearchAction","search","WriteAction","write","ClearAction","diffCount","prevention.hasOperation","prevention.Write","clear","UndoAction","history","dispatch","dstStore","setStore","undo","RedoAction","redo","ArrowAction","shiftKey","deltaY","deltaX","tabularRef","dragEndY","dragEndX","nextY","nextX","resolvedY","dir","editorTop","editorLeft","_c","_d","arrow","WalkAction","gridOuterRef","lo","hi","walk","SetInputtingAction","setInputting","InsertRowsAboveAction","operator","insertRowsAbove","InsertRowsBelowAction","editorRef","nextChoosing","insertRowsBelow","InsertColsLeftAction","insertColsLeft","InsertColsRightAction","insertColsRight","RemoveRowsAction","removeRows","RemoveColsAction","removeCols","SortRowsAction","direction","sortRows","FilterRowsAction","filter","newChoosing","t","filterRows","SetColumnMenuAction","setColumnMenu","SetRowMenuAction","setRowMenu","SetEditorHoveringAction","setEditorHovering","setStoreAction","userActions","MARGIN","calcBelowPosition","maxWidth","margin","clampLeft","overflow","calcSideStyle","gap","flipped","clampPopup","vw","vh","hAlignTransform","hAlign","FunctionGuide","option","activeFunctionGuide","activeArgIndex","ref","useRef","guide1Ref","useContext","isHidden","useLayoutEffect","jsxs","jsx","React","Fragment","arg","args","numIterable","variadicStart","isActive","offset","resolvedIndex","activeArg","EditorOptions","filteredOptions","selected","onOptionMouseDown","ulRef","adjustedLeft","setAdjustedLeft","useState","focus","isSafari","preventSafariBounce","preventBounce","scrollTop","scrollHeight","clientHeight","scrollLeft","scrollWidth","clientWidth","atTop","atBottom","atLeft","atRight","touchStartX","touchStartY","onTouchStart","preventTouchBounce","clip","input","trimmed","tsv","sheet2csv","html","sheet2html","tsvBlob","htmlBlob","getter","filteredRowsIncluded","trailingEmptyRowsOmitted","separator","newline","rowIsEmpty","r","valueEscaped","FormulaError","code","message","error","stripId","idString","stripAbsolute","Entity","ValueEntity","UnreferencedEntity","InvalidRefEntity","RefEntity","parsed","parseRef","props","slideY","slideX","newPoint","RangeEntity","formulas","IdEntity","sheetIdStr","formula","ids","IdRangeEntity","idRange","ps","p1","p2","FunctionEntity","name","precedence","at","Func","ZERO","INFIX_FUNCTION_NAME_MAP","PREFIX_FUNCTION_NAME_MAP","WHITESPACE_CHARS","SPECIAL_CHARS","Token","type","entity","closed","isWhiteSpace","char","BOOLS","TOKEN_OPEN","TOKEN_CLOSE","TOKEN_COMMA","INFIX_OPERATOR","PREFIX_OPERATOR","POSTFIX_OPERATOR","Lexer","options","pos","token","parts","idMap","prev1","prev2","buf","bool","resolveIdRange","space","quote","refString","refs","done","replaced","suffix","Parser","tokens","expr","underFunction","stack","lastOperator","complement","hasNext","outer","divideBy100","func","FormulaParser","stripSheetName","sheetName","splitRef","nextChar","excl","dependency","filterCellFields","ignoreFields","ensureSys","defaults","sys","setAsyncCache","ac","noFilter","getCellByAddress","toValueMatrix","resolution","raise","asScalar","toValueObject","fieldValue","toValueRows","toValueCols","toCellMatrix","filteredCell","toCellObject","toCellRows","escapeSheetName","toSheetPrefix","toCellCols","insertTextAtCursor","text","insertRef","dryRun","lexer","tokenIndex","refSheetName","refAddresses","tokenAddresses","tokenAbsolutes","isRefInsertable","expandInput","resetInput","isFocus","handleFormulaQuoteAutoClose","inputting","selectionStart","selectionEnd","selectedText","charAfter","beforeCursor","quoteCount","COLOR_PALETTE","Sentinel","SOLVING","Pending","promise","Spilling","Registry","historyLimit","additionalFunctions","policies","onSave","onChange","onRemoveRows","onRemoveCols","onInsertRows","onInsertCols","onSelect","onKeyUp","onInit","newBook","functionsDefault","fnName","fn","keys","tobe","storeDispatch","createRegistry","createBook","useBook","book","setBook","patch","useEffect","timezone","utc","NUMS","NUMS_Z","JFMASOND","NBRYNLGPTVC","DATE_WORDS","parseDate","first","words","word","timeZone","Policy","mixins","subclassProto","mixin","rendered","isSheet","_props","childSheet","rest","stripped","_n","_cell","DEFAULT_POLICY_NAME","nonePolicy","_str","detectType","cellValue","parseAsType","scale","td","bv","toNumeric","filterEq","condition","vt","cellNum","filterNe","filterGt","filterGte","filterLt","filterLte","filterBlank","_condition","filterNonblank","filterIncludes","filterExcludes","filterFunctions","evaluateFilterCondition","evaluateFilterConfig","mode","ReferencePreserver","did","prevId","currId","diffBefore","dep","Sheet","limits","historicize","pendingMap","promises","resolve","check","snapshot","diffAfter","changedIds","trimmedBefore","trimmedAfter","activeFilters","changedAddresses","shouldFilter","wasFiltered","fixedPositions","sortableIndices","cellA","cellB","valA","valB","cmp","availablePositions","changed","sortedRowMapping","matrixSnapshot","oldY","newY","preserver","inverse","newOrder","oldYStr","savedRows","extension","auto","changedTime","data","common","commonCol","commonRow","rowId","colId","stacked","colDefault","_cs","colDefaultLayout","headerCell","rowDefault","_rs","rowDefaultLayout","otherSheet","context","l","rw","lw","th","headerW","headerH","accW","colSys","accH","fullH","rowSys","relocate","resize","cache","existing","solveFormula","kickedOut","rel","depId","newCell","undoReflection","redoReflection","srcSheetRaw","moveRelations","srcTop","srcLeft","srcBottom","srcRight","dstTop","dstLeft","dstNumRows","dstNumCols","srcVisibleRows","srcNumCols","srcNumVisibleRows","dstVisibleRows","di","srcCellSet","dstAddrSet","dstY","dstX","srcY","srcX","srcAddr","isDstInBounds","dstAddr","newId","lostId","existingId","srcId","srcCell","dstCell","reverse","wireWrites","idWritesSrc","idWritesDst","beforePolicy","afterPolicy","toPoint","movedId","fromPoint","srcPoint","dstPoint","dstId","operation.hasOperation","operation.MoveFrom","operation.MoveTo","policyKey","restricted","dstPolicyKey","srcPolicyKey","dstPolicyVal","srcPolicyVal","isSrcWinner","srcSys","srcSnapshot","dstSnapshot","srcAddresses","resolvedDiff","isXSheet","topFrom","leftFrom","bottomFrom","rightFrom","topTo","leftTo","bottomTo","rightTo","toY","fromY","toX","fromX","dstPolicy","srcPolicy","dstIdForClear","dstSys","operation.Copy","partial","updateChangedTime","op","operation.Update","formulaIdentify","resized","current","operation.Write","operation.Style","operation.Resize","merged","srcRowIndex","currentCell","matrixWithStyle","copied","cloned","backup","yi","operation.RemoveRows","xi","deleted","operation.RemoveCols","deleting","apply","policy","raw","solved","stripSheet","solveSheet","movedAddresses","snapshotIds","depSys","tmp","targetId","targetCell","originId","spilledAddresses","omit","shape","hit","asyncCacheMiss","hasPendingArg","hasDeepPending","values","cyrb53","str","seed","h1","h2","buildAsyncCacheKey","funcName","hashPrecision","argsJson","_key","hashes","getAsyncCache","useInflight","compositeKey","inflight","awaitAndSave","ttlMilliseconds","expireTime","pending","createPropagatedPending","conditionArg","matchesType","nullable","errorTolerant","acceptedTypes","isMatrix","stripMatrix","isMultiCell","resolveParamIndex","defs","argCount","indices","iterStart","iterCount","_BaseFunction","validatedArgs","minArgs","hasIterable","def","broadcastResult","helpIndices","broadcastable","hIdx","scalarArgs","maxRows","maxCols","acc","originalBareArgs","cellArgs","BaseFunction","BaseFunctionAsync","gt","ensureString","ensureNumber","gte","lt","lte","ne","alternative","ignore","ensureBoolean","CONDITION_REGEX","comparison","equals","eachMatrix","createBooleanMask","sheets","conditions","refRange","mask","condRange","pt","description","AddFunction","v1","v2","MinusFunction","MultiplyFunction","DivideFunction","validated","divided","divisor","SumFunction","sum","val","ConcatFunction","EqFunction","NeFunction","GtFunction","GteFunction","LtFunction","LteFunction","NowFunction","AndFunction","OrFunction","IfFunction","IfErrorFunction","valueIfError","NotFunction","CountFunction","count","AbsFunction","PowerFunction","exponent","CountaFunction","AverageFunction","MaxFunction","max","hasValues","MinFunction","min","LenFunction","UminusFunction","ArrayformulaFunction","functions","_functionHelpsCache","getFunctionHelps","customFunctions","helps","FnClass","instance","useAutocomplete","optionsAll","setSelected","matchParams","activeFunctionHelp","useMemo","isFormula","textBeforeCursor","textAfterCursor","textToCursor","functionStack","nextToken","activeItem","wordBefore","wordAfter","currentWord","hasOpenParenAssigned","filtered","isOnAddress","fullLexer","currentIndex","tLen","help","keywordLower","startsWith","hasNoArgs","keywords","bestMatch","keyword","replaceWithOption","useCallback","beforeMatch","afterMatch","handleArrowUp","handleArrowDown","useBrowser","ok","setOk","useDebounceCallback","delay","debouncedCallback","timerRef","Fixed","children","className","attrs","document","createPortal","parseHTML","doc","results","processSheet","spans","caption","childStyle","parseStyleString","rowSpan","colSpan","processNodeSequentially","node","currentLine","tagName","blockTags","child","lines","line","element","styleString","styleObj","rawKey","rawValue","letter","parseText","sep","entering","restoreDoubleQuote","Editor","setShiftKey","setSelectionStart","isFocused","setIsFocused","editorRect","editingAddress","largeEditorRef","searchInputRef","editingOnEnter","dragging","renderOverlays","editing","handleOptionMouseDown","handleSelect","currentString","setBefore","writeCell","selectValue","selectedIndex","newValue","newCursor","numLines","isKeyDown","setIsKeyDown","handleKeyDown","isFunction","dblclick","_f","_e","handleFocus","handleDoubleClick","length","handleBlur","handleChange","handlePaste","handleKeyUpInternal","editorStyle","TokenSpan","memo","tokenKey","color","prevProps","nextProps","palletIndex","exists","formulaHash","hash","normalizedToken","existsIndex","PluginContext","useInitialPluginContext","setApply","usePluginContext","ctx","PluginBase","provided","StoreObserver","sheetHeight","sheetWidth","storeRef","sheetReactive","pluginProvided","pluginContext","Resizer","posY","posX","leftHeaderSelecting","topHeaderSelecting","mainRef","offsetY","offsetX","baseWidth","baseHeight","Emitter","pointing","copier","cutter","paster","items","item","undoer","redoer","rowsInserterAbove","rowsInserterBelow","colsInserterLeft","colsInserterRight","rowsRemover","colsRemover","rowsSorterAsc","rowsSorterDesc","rowsFilterer","rowsFilterClearer","rowSortFixedToggler","rowFilterFixedToggler","searcher","applyers","rowInsertCount","selStart","selEnd","colInsertCount","defaultContextMenuDescriptors","prevention.InsertRowsAbove","prevention.InsertRowsBelow","prevention.InsertColsLeft","prevention.InsertColsRight","prevention.RemoveRows","prevention.RemoveCols","defaultRowMenuDescriptors","defaultColMenuDescriptors","buildMenuContext","close","_insertRowsAbove","_insertRowsBelow","_removeRows","_insertColsLeft","_insertColsRight","_removeCols","label","_setStore","_menuComponentRegistry","registerMenuComponent","component","getMenuComponent","MenuItem","shortcuts","disabled","checked","testId","onClick","hasCheck","shortcut","part","arr","MenuDivider","ContextMenu","contextMenuPosition","contextMenu","menuRef","METHOD_LABELS","NO_VALUE_METHODS","DEFAULT_CONDITION","FilterSection","onWaiting","setConditions","setMode","setPending","firstValueRef","handleCancel","cancelled","execute","actionX","validConditions","filterMode","currentSheet","updateCondition","prev","addCondition","removeCondition","handleApplyFilter","valid","handleResetColumn","handleResetAll","filterDisabled","prevention.Filter","hasAnyFilter","cond","SortSection","sortDisabled","prevention.Sort","getLabel","LabelSection","labelInputRef","setLabel","handleApplyLabel","labelDisabled","prevention.SetLabel","labelPlaceholder","columnMenuState","colMenu","position","waitingState","setWaitingState","handleClose","handleWaiting","cancel","descriptor","Section","renderRowDescriptor","rowMenuState","rowMenu","isTouching","mouseEvent","safePreventDefault","Cell","isFirstPointed","cellRef","errorTooltipPos","setErrorTooltipPos","xSheetFocused","lastFocused","pointed","_setEditorRect","errorMessage","isPendingCell","editingAnywhere","handleDragStart","fullAddress","handleDragEnd","handleDragging","newArea","fullRange","handleAutofillMouseDown","handleErrorTriangleEnter","handleErrorTriangleLeave","onContextMenu","onDoubleClick","autofillDragClass","acceleration","maxSpeed","lastScrollTime","currentSpeed","ScrollHandle","scrollRef","isScrolling","getDestEdge","tabularRect","scrollStep","now","curY","curX","sheetPrefix","sheetRange","handleMouseEnter","stopScroll","handleMouseUp","handleMouseUpWrapper","handleMouseLeave","HeaderCellTop","hasFilter","handleResizeMouseDown","displayedLabel","prevention.ColumnMenu","btn","pressX","pressY","prevention.Resize","HeaderCellLeft","handleContextMenu","prevention.RowMenu","COLOR_POINTED","COLOR_SELECTED","SELECTING_FILL","COLOR_COPYING","COLOR_CUTTING","SEARCH_MATCHING_BACKGROUND","COLOR_SEARCH_MATCHING","COLOR_AUTOFILL","fillRect","drawRect","lineWidth","dashPattern","fillColor","drawAreaRectViewport","viewW","viewH","topLeft","bottomRight","CellStateOverlay","canvasRef","rafIdRef","drawCanvas","canvas","container","dpr","vx","vy","palette","refArea","isCurrentMatch","backgroundColor","drawLeft","drawWidth","drawTop","drawHeight","scheduleDrawCanvas","handleScroll","Tabular","setPalette","virtualized","setVirtualized","handleMouseMove","handleSelectAllClick","paletteBySheetName","normalizedRef","splitterIndex","upperRef","mergedRefs","_g","_h","LAST_MODIFIED","CSS","embedStyle","FormulaBar","ready","editingCell","hlRef","spilledFromAddress","originPoint","originAddress","observer","entries","updateScroll","largeInput","handleInput","Base","size","SearchIcon","CloseIcon","SearchBar","rootRef","matchingCell","handleProgressClick","handleSearchClick","handleCaseSensitiveClick","handleRegexClick","hasSelection","selectionLabel","handleRangeClick","searchRangeLabel","handleCloseClick","createSheetRef","createRef","useSheetRef","createStoreRef","useStoreRef","GridSheet","initialCells","initialSheetRef","initialStoreRef","initialBook","sheetResize","showFormulaBar","flashRef","internalSheetRef","internalStoreRef","internalBook","sheetIdRef","initialState","useReducer","defaultReducer","setSheetHeight","estimateSheetHeight","setSheetWidth","estimateSheetWidth","intervalId","estimatedHeight","estimatedWidth","makeThousandSeparatorMixin","int","fraction","ThousandSeparatorPolicyMixin","CheckboxPolicyMixin","makeBorder","all"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/constants.ts","../src/store/index.ts","../src/lib/coords.ts","../src/lib/spatial.ts","../src/store/helpers.ts","../src/lib/virtualization.ts","../src/lib/operation.ts","../src/lib/time.ts","../src/lib/autofill.ts","../src/store/actions.ts","../src/lib/popup.ts","../src/components/FunctionGuide.tsx","../src/components/EditorOptions.tsx","../src/lib/dom.ts","../src/lib/clipboard.ts","../src/formula/formula-error.ts","../src/formula/evaluator.ts","../src/lib/cell.ts","../src/lib/sheet_utils.ts","../src/lib/input.ts","../src/lib/palette.ts","../src/sentinels.ts","../src/lib/book.ts","../src/lib/date.ts","../src/policy/core.ts","../src/lib/filter.ts","../src/lib/reference.ts","../src/lib/sheet.ts","../src/formula/solver.ts","../src/formula/functions/__async.ts","../src/formula/functions/__base.ts","../src/formula/functions/__utils.ts","../src/formula/functions/add.ts","../src/formula/functions/minus.ts","../src/formula/functions/multiply.ts","../src/formula/functions/divide.ts","../src/formula/functions/sum.ts","../src/formula/functions/concat.ts","../src/formula/functions/eq.ts","../src/formula/functions/ne.ts","../src/formula/functions/gt.ts","../src/formula/functions/gte.ts","../src/formula/functions/lt.ts","../src/formula/functions/lte.ts","../src/formula/functions/now.ts","../src/formula/functions/and.ts","../src/formula/functions/or.ts","../src/formula/functions/if.ts","../src/formula/functions/iferror.ts","../src/formula/functions/not.ts","../src/formula/functions/count.ts","../src/formula/functions/abs.ts","../src/formula/functions/power.ts","../src/formula/functions/counta.ts","../src/formula/functions/average.ts","../src/formula/functions/max.ts","../src/formula/functions/min.ts","../src/formula/functions/len.ts","../src/formula/functions/uminus.ts","../src/formula/functions/arrayformula.ts","../src/formula/mapping.ts","../src/components/useAutocomplete.ts","../src/components/hooks.ts","../src/components/Fixed.tsx","../src/lib/paste.ts","../src/components/Editor.tsx","../src/components/PluginBase.tsx","../src/components/StoreObserver.tsx","../src/components/Resizer.tsx","../src/components/Emitter.tsx","../src/store/dispatchers.ts","../src/lib/menu.ts","../src/components/MenuItem.tsx","../src/components/ContextMenu.tsx","../src/components/ColumnMenuFilterSection.tsx","../src/components/ColumnMenuSortSection.tsx","../src/lib/label.ts","../src/components/ColumnMenuLabelSection.tsx","../src/components/ColumnMenu.tsx","../src/components/RowMenu.tsx","../src/lib/events.ts","../src/components/Cell.tsx","../src/components/ScrollHandle.tsx","../src/components/HeaderCellTop.tsx","../src/components/HeaderCellLeft.tsx","../src/components/CellStateOverlay.tsx","../src/components/Tabular.tsx","../src/styles/minified.ts","../src/styles/embedder.ts","../src/components/FormulaBar.tsx","../src/components/svg/Base.tsx","../src/components/svg/SearchIcon.tsx","../src/components/svg/CloseIcon.tsx","../src/components/SearchBar.tsx","../src/components/GridSheet.tsx","../src/policy/thousand_separator.ts","../src/policy/checkbox.tsx","../src/styles/utils.ts"],"sourcesContent":["import type { ZoneType } from './types';\n\nexport const DEFAULT_HISTORY_LIMIT = 20;\n\nexport const DEFAULT_HEIGHT = 24;\nexport const DEFAULT_WIDTH = 90;\n\nexport const SHEET_HEIGHT = 500;\nexport const SHEET_WIDTH = 1000;\n\nexport const HEADER_HEIGHT = 24;\nexport const HEADER_WIDTH = 50;\n\nexport const MIN_WIDTH = 5;\nexport const MIN_HEIGHT = 5;\n\nexport const OVERSCAN_X = 5;\nexport const OVERSCAN_Y = 10;\n\nexport const DEFAULT_ALPHABET_CACHE_SIZE = 1000;\n\nexport const SECONDS_IN_DAY = 86400;\nexport const FULLDATE_FORMAT_UTC = 'YYYY-MM-DDTHH:mm:ss.SSSZ';\n\nexport const RESET_ZONE: ZoneType = {\n startY: -1,\n startX: -1,\n endY: -1,\n endX: -1,\n};\n\n// 1900-01-01 is the base date for date serialization in Excel, and is represented as 0 in Excel's date system. However, JavaScript's Date object uses the Unix epoch (1970-01-01) as its base date. Therefore, we need to account for the difference between these two epochs when converting between Excel dates and JavaScript dates.\nexport const BASE_DATE = new Date(1900, 0, 1);\n\nexport const DEFAULT_KEY = 'default';\nexport const DEFAULT_COL_KEY = 'defaultCol';\nexport const DEFAULT_ROW_KEY = 'defaultRow';\n","import { createContext } from 'react';\nimport { StoreType } from '../types';\n\nexport type Dispatcher = React.Dispatch<{\n type: number;\n value: any;\n}>;\n\nexport const Context = createContext(\n {} as {\n store: StoreType;\n dispatch: Dispatcher;\n },\n);\n","import type { Address, PointType, ExtraPointType } from '../types';\nimport { DEFAULT_ALPHABET_CACHE_SIZE } from '../constants';\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nconst N2C_CACHE = new Map<number, string>();\nconst C2N_CACHE = new Map<string, number>();\n\nconst getColumnLetterFromNumber = (key: number, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): string => {\n const cached = N2C_CACHE.get(--key);\n if (cached != null) {\n return cached;\n }\n if (key === 0) {\n return '';\n }\n let num = key;\n let result = '';\n do {\n result = ALPHABET[--num % 26] + result;\n num = Math.floor(num / 26);\n } while (num > 0);\n\n N2C_CACHE.set(key, result);\n const it = N2C_CACHE.keys();\n for (let st = it.next(); N2C_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n N2C_CACHE.delete(st.value);\n }\n return result;\n};\n\nconst getNumberFromColumnLetter = (key: string, cacheSize = DEFAULT_ALPHABET_CACHE_SIZE): number => {\n const cached = C2N_CACHE.get(key);\n if (cached != null) {\n return cached;\n }\n if (key === '') {\n return 0;\n }\n const alpha = key;\n let result = 0;\n for (let digit = 0; digit < alpha.length; digit++) {\n const a = alpha[alpha.length - digit - 1];\n const num = ALPHABET.indexOf(a) + 1;\n result += ALPHABET.length ** digit * num;\n }\n C2N_CACHE.set(key, result);\n const it = C2N_CACHE.keys();\n for (let st = it.next(); C2N_CACHE.size > cacheSize; st = it.next()) {\n // @ts-ignore\n C2N_CACHE.delete(st.value);\n }\n return result;\n};\n\nexport const x2c = (x: number): string => {\n if (x === 0) {\n return '';\n }\n const c = getColumnLetterFromNumber(x + 1);\n return x < 0 ? `$${c}` : c;\n};\n\nexport const c2x = (col: string, absolute = false): number => {\n const n = getNumberFromColumnLetter(col.toUpperCase());\n return absolute ? -n : n;\n};\n\nexport const y2r = (y: number) => {\n if (y === 0) {\n return '';\n }\n return y < 0 ? `$${y}` : String(y);\n};\n\nexport const r2y = (row: number | string, absolute = false) => {\n if (typeof row === 'string') {\n row = parseInt(row, 10);\n }\n return absolute ? -row : row;\n};\n\nexport const p2a = ({ y, x, absX, absY }: Partial<ExtraPointType>) => {\n if (x === -1 && y === -1) {\n return '?';\n }\n const colPart = x === undefined ? '' : x === 0 ? '0' : `${absX ? '$' : ''}${x2c(x)}`;\n const rowPart = y === undefined ? '' : y === 0 ? '0' : `${absY ? '$' : ''}${y2r(y)}`;\n return `${colPart}${rowPart}`;\n};\n\nexport const a2p = (address: Address): ExtraPointType => {\n const m = address.match(/(\\$)?([a-zA-Z]*)(\\$)?([0-9]*)/);\n if (m == null) {\n return { y: -1, x: -1 };\n }\n const [, _absX, col, _absY, row] = m.slice();\n const [absX, absY] = [_absX != null, _absY != null];\n if (col === '' && row === '') {\n return { y: -1, x: -1, absX: false, absY: false };\n }\n return { y: r2y(row) || 0, x: c2x(col) || 0, absX, absY };\n};\n\nexport const grantAddressAbsolute = (address: Address, absCol: boolean, absRow: boolean) => {\n const m = address.match(/([A-Z]*)([0-9]*)/);\n if (m == null) {\n return address;\n }\n const [, col, row] = m.slice();\n return `${absCol ? '$' : ''}${col.toUpperCase()}${absRow ? '$' : ''}${row}`;\n};\n\n/**\n * Returns the row header cell address for a given row number by prepending `0`.\n * e.g. rh(6) → '06', rh(1) → '01'\n */\nexport const rh = (y: number): string => `0${y}`;\n\n/**\n * Returns the column header cell address for a given column letter or column index\n * (1-based, same as point.x) by appending `0`.\n * e.g. ch('A') → 'A0', ch(1) → 'A0'\n */\nexport const ch = (col: string | number): string =>\n typeof col === 'number' ? `${x2c(col)}0` : `${col.toUpperCase()}0`;\n\nexport const stripAddressAbsolute = (address: Address) => {\n return address.replace(/\\$/g, '');\n};\n\nexport const buildIdentifiedRef = (id: string, absX = false, absY = false): string => {\n return `${absX ? '$' : ''}#${id}${absY ? '$' : ''}`;\n};\n","import { DEFAULT_KEY, DEFAULT_COL_KEY, DEFAULT_ROW_KEY } from '../constants';\nimport type {\n MatrixType,\n AreaType,\n ZoneType,\n RangeType,\n PointType,\n CellsByAddressType,\n ShapeType,\n MatricesByAddress,\n CellType,\n Address,\n} from '../types';\nimport { a2p, p2a, x2c, c2x } from './coords';\n\nexport const superposeArea = (srcArea: AreaType, dstArea: AreaType): ShapeType => {\n const { rows: srcRows, cols: srcCols } = areaDiff(srcArea);\n const { rows: dstRows, cols: dstCols } = areaDiff(dstArea);\n\n // biggerRows, biggerCols\n return {\n rows: srcRows > dstRows ? srcRows : dstRows,\n cols: srcCols > dstCols ? srcCols : dstCols,\n };\n};\n\nexport const concatAreas = (area1: AreaType, area2: AreaType): AreaType => {\n const result: AreaType = { ...area1 };\n if (area2.left < area1.left) {\n result.left = area2.left;\n }\n if (area2.right > area1.right) {\n result.right = area2.right;\n }\n if (area2.top < area1.top) {\n result.top = area2.top;\n }\n if (area2.bottom > area1.bottom) {\n result.bottom = area2.bottom;\n }\n return result;\n};\n\nexport const zoneToArea = (zone: ZoneType): AreaType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { top: -1, left: -1, bottom: -1, right: -1 };\n }\n const [top, bottom] = zone.startY < zone.endY ? [zone.startY, zone.endY] : [zone.endY, zone.startY];\n const [left, right] = zone.startX < zone.endX ? [zone.startX, zone.endX] : [zone.endX, zone.startX];\n return { top, left, bottom, right };\n};\n\nexport const areaToZone = (area: AreaType): ZoneType => {\n return {\n startY: area.top,\n startX: area.left,\n endY: area.bottom,\n endX: area.right,\n };\n};\n\nexport const areaToRange = (area: AreaType): string => {\n const { top, left, bottom, right } = area;\n if (top === bottom && left === right) {\n return p2a({ y: top, x: left });\n }\n const leftTop = p2a({ y: top, x: left });\n const rightBottom = p2a({ y: bottom, x: right });\n return `${leftTop}:${rightBottom}`;\n};\n\nexport const between = (range: RangeType, index: number) => {\n if (range.start === -1 || range.end === -1) {\n return false;\n }\n return (range.start <= index && index <= range.end) || (range.end <= index && index <= range.start);\n};\n\nexport const among = (area: AreaType, point: PointType) => {\n if (area.top === -1 || area.left === -1 || area.bottom === -1 || area.right === -1) {\n return false;\n }\n const { y, x } = point;\n const { top, left, bottom, right } = area;\n return top <= y && y <= bottom && left <= x && x <= right;\n};\n\ntype ShapeExtension = { base?: number };\n\nexport const zoneDiff = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 0, cols: 0 };\n }\n return {\n rows: Math.abs(zone.startY - zone.endY),\n cols: Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const zoneShape = (zone: ZoneType): ShapeType => {\n if (zone.endY === -1 || zone.endX === -1) {\n return { rows: 1, cols: 1 };\n }\n return {\n rows: 1 + Math.abs(zone.startY - zone.endY),\n cols: 1 + Math.abs(zone.startX - zone.endX),\n };\n};\n\nexport const areaDiff = (area: AreaType): ShapeType => {\n return {\n rows: Math.abs(area.top - area.bottom),\n cols: Math.abs(area.left - area.right),\n };\n};\n\nexport const areaShape = (area: AreaType): ShapeType => {\n return {\n rows: 1 + Math.abs(area.top - area.bottom),\n cols: 1 + Math.abs(area.left - area.right),\n };\n};\n\nexport const matrixShape = ({ base = 0, matrix }: { matrix: MatrixType } & ShapeExtension): ShapeType => {\n const h = matrix.length;\n if (h === 0) {\n return { rows: 0, cols: 0 };\n }\n return { rows: base + h, cols: base + matrix[0].length };\n};\n\nexport const makeSequence = (start: number, stop: number, step: number = 1) => {\n return Array.from({ length: (stop - start - 1) / step + 1 }, (_, i) => start + i * step);\n};\n\nexport const oa2aa = (oa: { [s: string]: any }[], fields: string[]): MatrixType => {\n const aa: any[][] = [];\n oa.forEach((o) => {\n const a: any[] = [];\n fields.forEach((field) => {\n a.push(o[field]);\n });\n aa.push(a);\n });\n return aa;\n};\n\nexport const aa2oa = (aa: MatrixType, fields: string[]): { [s: string]: any }[] => {\n const oa: { [s: string]: any }[] = [];\n aa.forEach((a) => {\n const o: { [s: string]: any } = {};\n a.forEach((v, i) => {\n if (i >= fields.length) {\n return;\n }\n const field = fields[i];\n o[field] = v;\n });\n oa.push(o);\n });\n return oa;\n};\n\nexport const createMatrix = <T = any>(numRows: number, numCols: number, fill?: T): T[][] => {\n return [...Array(numRows)].map(() => Array(numCols).fill(fill));\n};\n\nexport const buildInitialCellsFromOrigin = ({\n cells = {},\n ensured = {},\n matrix = [],\n flattenAs = 'value',\n origin = 'A1',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrix?: MatrixType;\n origin?: Address;\n}) => {\n return buildInitialCells({\n cells,\n ensured,\n matrices: { [origin]: matrix },\n flattenAs,\n });\n};\n\nexport const buildInitialCells = ({\n cells = {},\n ensured = {},\n matrices = {},\n flattenAs = 'value',\n}: {\n cells?: CellsByAddressType;\n ensured?: {\n numRows?: number;\n numCols?: number;\n };\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<any>;\n} = {}) => {\n buildCells({ cells, flattenAs, matrices });\n const { numRows, numCols } = Object.assign({ numRows: 1, numCols: 1 }, ensured);\n const rightBottom = p2a({ y: numRows, x: numCols });\n if (cells[rightBottom] == null) {\n cells[rightBottom] = {};\n }\n return cells;\n};\n\nexport const buildCells = <T>({\n cells = {},\n matrices = {},\n flattenAs,\n}: {\n cells?: CellsByAddressType;\n flattenAs?: keyof CellType;\n matrices?: MatricesByAddress<T>;\n}) => {\n Object.keys(matrices).forEach((baseAddress) => {\n const matrix = matrices[baseAddress];\n const { y: baseY, x: baseX } = a2p(baseAddress);\n matrix.forEach((row, y) => {\n row.forEach((e, x) => {\n const id = p2a({ y: baseY + y, x: baseX + x });\n if (flattenAs) {\n const cell = cells[id];\n cells[id] = { [flattenAs]: e, ...cell };\n } else {\n cells[id] = e as CellType;\n }\n });\n });\n });\n return cells;\n};\n\nexport const getMaxSizesFromCells = (cells: CellsByAddressType = {}) => {\n let [lastY, lastX] = [0, 0];\n Object.keys(cells).forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const { y, x } = a2p(address);\n if (lastY < y) {\n lastY = y;\n }\n if (lastX < x) {\n lastX = x;\n }\n });\n return { numRows: lastY, numCols: lastX };\n};\n\nexport const range = (start: number, end: number) => {\n const list: number[] = [];\n for (let i = start; i <= end; i++) {\n list.push(i);\n }\n return list;\n};\n\nexport const complementSelectingArea = (selectingArea: AreaType, choosing: PointType) => {\n if (selectingArea.left === -1) {\n selectingArea = {\n left: choosing.x,\n top: choosing.y,\n right: choosing.x,\n bottom: choosing.y,\n };\n }\n return selectingArea;\n};\n\nexport const expandRange = (range: string): Address[] => {\n if (range.indexOf(':') === -1) {\n return [range];\n }\n\n const result: Address[] = [];\n\n const isRowRange = /^\\d+\\:\\d+$/.test(range);\n\n if (isRowRange) {\n const [startRow, endRow] = range.split(':').map(Number);\n for (let row = startRow; row <= endRow; row++) {\n result.push(`${row}`);\n }\n return result;\n }\n\n const match = range.match(/^([A-Z]*)(\\d+)?\\:([A-Z]*)(\\d+)?$/);\n if (!match) {\n console.error('Invalid range format', range);\n return [range];\n }\n\n const [, startCol, startRow, endCol, endRow] = match;\n const startColIndex = startCol ? c2x(startCol) : 1;\n const endColIndex = endCol ? c2x(endCol) : 1;\n\n for (let col = startColIndex; col <= endColIndex; col++) {\n const currentColumn = startCol || endCol ? x2c(col) : '';\n if (startRow && endRow) {\n for (let row = Number(startRow); row <= Number(endRow); row++) {\n result.push(`${currentColumn}${row}`);\n }\n } else if (!startRow && !endRow) {\n result.push(currentColumn);\n }\n }\n return result;\n};\n\n// restrictZone resets a zone if the zone consists of a single cell.\nexport const restrictZone = (zone: ZoneType): ZoneType => {\n const s = zoneDiff(zone);\n if (s.rows + s.cols === 0) {\n return { startY: -1, startX: -1, endY: -1, endX: -1 };\n }\n return { ...zone };\n};\n\nexport type BinarySearchPredicate = (mid: number) => boolean;\n\nexport const binarySearch = (\n low: number,\n high: number,\n predicate: BinarySearchPredicate,\n lessThan: boolean,\n): number => {\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (predicate(mid)) {\n if (lessThan) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n } else {\n if (lessThan) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n }\n return lessThan ? low : high;\n};\n\n/**\n * Convert a list of addresses into an array of bounding areas.\n * Adjacent cells (4-connected: up/down/left/right) are grouped into the same area.\n * Each resulting AreaType is the bounding rectangle of one connected group.\n */\nexport const addressesToAreas = (addresses: Address[]): AreaType[] => {\n if (addresses.length === 0) {\n return [];\n }\n\n const points = addresses.map((addr) => {\n const { y, x } = a2p(addr);\n return { y, x };\n });\n\n const key = (y: number, x: number) => `${y},${x}`;\n const pointSet = new Set(points.map((p) => key(p.y, p.x)));\n const visited = new Set<string>();\n const areas: AreaType[] = [];\n\n for (const p of points) {\n const k = key(p.y, p.x);\n if (visited.has(k)) {\n continue;\n }\n\n // BFS to find connected component\n let top = p.y,\n left = p.x,\n bottom = p.y,\n right = p.x;\n const queue = [p];\n visited.add(k);\n\n while (queue.length > 0) {\n const { y, x } = queue.shift()!;\n if (y < top) {\n top = y;\n }\n if (y > bottom) {\n bottom = y;\n }\n if (x < left) {\n left = x;\n }\n if (x > right) {\n right = x;\n }\n\n for (const [dy, dx] of [\n [0, 1],\n [0, -1],\n [1, 0],\n [-1, 0],\n ]) {\n const nk = key(y + dy, x + dx);\n if (pointSet.has(nk) && !visited.has(nk)) {\n visited.add(nk);\n queue.push({ y: y + dy, x: x + dx });\n }\n }\n }\n\n areas.push({ top, left, bottom, right });\n }\n\n return areas;\n};\n\n/**\n * Extract unique column indices (x) from a list of addresses, ignoring row information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToCols = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const cols: number[] = [];\n for (const addr of addresses) {\n const { x } = a2p(addr);\n if (!seen.has(x)) {\n seen.add(x);\n cols.push(x);\n }\n }\n if (asc === true) {\n cols.sort((a, b) => a - b);\n } else if (asc === false) {\n cols.sort((a, b) => b - a);\n }\n return cols;\n};\n\n/**\n * Extract unique row indices (y) from a list of addresses, ignoring column information.\n * @param asc - true: ascending, false: descending, null: insertion order\n */\nexport const addressesToRows = (addresses: Address[], asc: boolean | null = true): number[] => {\n const seen = new Set<number>();\n const rows: number[] = [];\n for (const addr of addresses) {\n const { y } = a2p(addr);\n if (!seen.has(y)) {\n seen.add(y);\n rows.push(y);\n }\n }\n if (asc === true) {\n rows.sort((a, b) => a - b);\n } else if (asc === false) {\n rows.sort((a, b) => b - a);\n }\n return rows;\n};\n\nexport const isZoneNotSelected = (zone: ZoneType): boolean => {\n return zone.startY === -1 || zone.startX === -1 || zone.endY === -1 || zone.endX === -1;\n};\n","import { a2p, x2c, y2r } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport type { Address, PointType, StorePatchType, StoreType } from '../types';\n\n/**\n * Strip redundant fields from a StorePatchType before recording in history.\n * - selectingZone with endY === -1 && endX === -1 is a no-selection sentinel and need not be stored.\n */\nexport const compactReflection = (reflection: StorePatchType): StorePatchType => {\n const result = { ...reflection };\n if (result.selectingZone != null && result.selectingZone.endY === -1 && result.selectingZone.endX === -1) {\n delete result.selectingZone;\n }\n return result;\n};\n\nexport const restrictPoints = (store: StoreType, sheet: Sheet) => {\n const { choosing, selectingZone } = store;\n let { y, x } = choosing;\n let { startY: y1, startX: x1, endY: y2, endX: x2 } = selectingZone;\n const [numRows, numCols] = [sheet.numRows, sheet.numCols];\n if (y > numRows) {\n y = numRows;\n }\n if (x > numCols) {\n x = numCols;\n }\n if (y1 > numRows) {\n y1 = numRows;\n }\n if (y2 > numRows) {\n y2 = numRows;\n }\n if (x1 > numCols) {\n x1 = numCols;\n }\n if (x2 > numCols) {\n x2 = numCols;\n }\n return {\n choosing: { y, x } as PointType,\n selectingZone: { startY: y1, startX: x1, endY: y2, endX: x2 },\n };\n};\n\nconst FLASH_CLASS = 'gs-flash-overlay--active';\nconst FLASH_DURATION_MS = 600;\nexport const flashSheet = (el: HTMLElement | null) => {\n if (!el) {\n return;\n }\n el.classList.remove(FLASH_CLASS);\n // force reflow to restart animation when called consecutively\n void el.offsetWidth;\n el.classList.add(FLASH_CLASS);\n setTimeout(() => el.classList.remove(FLASH_CLASS), FLASH_DURATION_MS);\n};\n\nexport const flashWithCallback = (\n store: StoreType,\n sheet: Sheet,\n callback: ((s: StoreType) => void) | undefined,\n): StoreType & { callback?: (store: StoreType) => void } => ({\n ...store,\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n});\n\nexport const shouldTracking = (operation: string) => {\n switch (operation) {\n case 'INSERT_ROWS':\n return true;\n case 'INSERT_COLS':\n return true;\n case 'REMOVE_ROWS':\n return true;\n case 'REMOVE_COLS':\n return true;\n case 'MOVE':\n return true;\n case 'SORT_ROWS':\n return true;\n }\n return false;\n};\n\nexport const initSearchStatement = (sheet: Sheet, store: StoreType) => {\n const { searchQuery, searchCaseSensitive, searchRegex, searchRange } = store;\n let { choosing } = store;\n if (!searchQuery) {\n return { matchingCells: [] };\n }\n const matchingCells: Address[] = [];\n\n let matcher: (value: string) => boolean;\n if (searchRegex) {\n try {\n const flags = searchCaseSensitive ? '' : 'i';\n const regex = new RegExp(searchQuery, flags);\n matcher = (v: string) => regex.test(v);\n } catch (e) {\n // Invalid regex, treat as literal string\n const q = searchCaseSensitive ? searchQuery : searchQuery.toLowerCase();\n matcher = (v: string) => {\n const s = searchCaseSensitive ? v : v.toLowerCase();\n return s.indexOf(q) !== -1;\n };\n }\n } else {\n const q = searchCaseSensitive ? searchQuery : searchQuery.toLowerCase();\n matcher = (v: string) => {\n const s = searchCaseSensitive ? v : v.toLowerCase();\n return s.indexOf(q) !== -1;\n };\n }\n\n // Determine search range\n let startY = 1,\n endY = sheet.bottom;\n let startX = 1,\n endX = sheet.right;\n if (searchRange) {\n startY = searchRange.startY;\n endY = searchRange.endY;\n startX = searchRange.startX;\n endX = searchRange.endX;\n }\n\n for (let y = startY; y <= endY; y++) {\n for (let x = startX; x <= endX; x++) {\n const v = sheet.getSerializedValue({ point: { y, x } });\n if (matcher(v)) {\n matchingCells.push(`${x2c(x)}${y2r(y)}`);\n }\n }\n }\n const matchingCellIndex = matchingCells.length === store.matchingCells.length ? store.matchingCellIndex : 0;\n if (matchingCells.length > 0) {\n const address = matchingCells[matchingCellIndex];\n choosing = a2p(address);\n }\n return { matchingCells, searchQuery, matchingCellIndex, choosing };\n};\n\nexport const isXSheetFocused = (store: StoreType) => {\n const { sheetId, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return false;\n }\n if (sheetId === sheet.registry.editingSheetId) {\n return false;\n }\n return !!sheet.registry.editingAddress;\n};\n","import { DEFAULT_HEIGHT, DEFAULT_WIDTH, OVERSCAN_X, OVERSCAN_Y } from '../constants';\nimport { range, binarySearch, type BinarySearchPredicate } from './spatial';\nimport { Sheet } from './sheet';\nimport type { AreaType, PointType, Virtualization } from '../types';\n\nexport const getCellRectPositions = (sheet: Sheet, { y, x }: PointType) => {\n // Use System.offsetLeft / offsetTop stored on header cells for O(1) lookup\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const left = sheet.getSystem({ y: 0, x })?.offsetLeft ?? 0;\n const top = sheet.getSystem({ y, x: 0 })?.offsetTop ?? 0;\n const w = colCell?.width || DEFAULT_WIDTH;\n const h = rowCell?.filtered ? 0 : rowCell?.height || DEFAULT_HEIGHT;\n return {\n top,\n left,\n bottom: top + h,\n right: left + w,\n width: w,\n height: h,\n };\n};\n\nexport const getScreenRect = (e: HTMLDivElement) => {\n const top = e.scrollTop,\n left = e.scrollLeft;\n const height = e.offsetHeight,\n width = e.offsetWidth;\n const bottom = top + height,\n right = left + width;\n return { top, left, bottom, right, height, width };\n};\n\nexport const virtualize = (sheet: Sheet, e: HTMLDivElement | null): Virtualization | null => {\n if (e == null) {\n return null;\n }\n let boundaryTop = 0,\n boundaryLeft = 0,\n boundaryBottom = sheet.numRows,\n boundaryRight = sheet.numCols;\n\n const { top, left, bottom, right } = getScreenRect(e);\n let width = 0,\n height = 0;\n for (let x = 1; x <= sheet.numCols; x++) {\n const w = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n width += w;\n if (boundaryLeft === 0 && width > left) {\n boundaryLeft = Math.max(x - OVERSCAN_X, 1);\n }\n if (width > right) {\n boundaryRight = Math.min(x + OVERSCAN_X, sheet.numCols);\n break;\n }\n }\n for (let y = 1; y <= sheet.numRows; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n const h = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n height += h;\n if (boundaryTop === 0 && height > top) {\n boundaryTop = Math.max(y - OVERSCAN_Y, 1);\n }\n if (height > bottom) {\n boundaryBottom = Math.min(y + OVERSCAN_Y, sheet.numRows);\n break;\n }\n }\n const ys = boundaryTop === 0 ? [] : range(boundaryTop, boundaryBottom).filter((y) => !sheet.isRowFiltered(y));\n const xs = range(boundaryLeft, boundaryRight);\n const before = sheet.getRectSize({\n top: 1,\n left: 1,\n bottom: boundaryTop,\n right: boundaryLeft,\n });\n const after = sheet.getRectSize({\n top: boundaryBottom,\n left: boundaryRight,\n bottom: sheet.numRows,\n right: sheet.numCols,\n });\n return {\n ys,\n xs,\n adjuster: {\n top: before.height,\n left: before.width,\n bottom: after.height,\n right: after.width,\n },\n };\n};\n\nexport const smartScroll = (\n sheet: Sheet,\n e: HTMLDivElement | null,\n targetPoint: PointType,\n behavior: ScrollBehavior = 'auto',\n) => {\n if (e == null) {\n return;\n }\n const screen = getScreenRect(e);\n const target = getCellRectPositions(sheet, targetPoint);\n\n // when header is sticky\n const up = target.top - sheet.headerHeight;\n const left = target.left - sheet.headerWidth;\n const down = target.bottom - screen.height + 1;\n const right = target.right - screen.width + 1;\n\n const isTopOver = up < screen.top;\n const isLeftOver = left < screen.left;\n const isBottomOver = target.bottom > screen.bottom;\n const isRightOver = target.right > screen.right;\n\n if (isLeftOver) {\n if (isTopOver) {\n // go left up\n e.scrollTo({ left, top: up, behavior });\n } else if (isBottomOver) {\n // go left down\n e.scrollTo({ left, top: down, behavior });\n } else {\n // go left\n e.scrollTo({ left, top: screen.top, behavior });\n }\n } else if (isRightOver) {\n if (isTopOver) {\n // go right up\n e.scrollTo({ left: right, top: up, behavior });\n } else if (isBottomOver) {\n // go right down\n e.scrollTo({ left: right, top: down, behavior });\n } else {\n // go right\n e.scrollTo({ left: right, top: screen.top, behavior });\n }\n } else {\n if (isTopOver) {\n // go up\n e.scrollTo({ left: screen.left, top: up, behavior });\n } else if (isBottomOver) {\n // go down\n e.scrollTo({ left: screen.left, top: down, behavior });\n } else {\n // go nowhere\n }\n }\n};\n\ntype PositionGetter = (rect: DOMRect) => number;\n\nconst findVisibleElement = (\n elements: HTMLTableHeaderCellElement[],\n getPosition: PositionGetter,\n boundary: number,\n dataKey: string,\n): number => {\n const index = binarySearch(\n 0,\n elements.length - 1,\n (mid) => getPosition(elements[mid].getBoundingClientRect()) < boundary,\n false,\n );\n return parseInt(elements[index]?.dataset[dataKey] ?? '1');\n};\n\nexport const getAreaInTabular = (tabularElement: HTMLDivElement): AreaType => {\n const {\n top: topPosition,\n left: leftPosition,\n bottom: bottomPosition,\n right: rightPosition,\n } = tabularElement.getBoundingClientRect();\n\n const rows = Array.from(tabularElement.querySelectorAll('.gs-th-left')) as HTMLTableHeaderCellElement[];\n const cols = Array.from(tabularElement.querySelectorAll('.gs-th-top')) as HTMLTableHeaderCellElement[];\n\n const top = findVisibleElement(rows, (rect) => rect.top, topPosition, 'y');\n const bottom = findVisibleElement(rows, (rect) => rect.bottom, bottomPosition, 'y');\n const left = findVisibleElement(cols, (rect) => rect.left, leftPosition, 'x');\n const right = findVisibleElement(cols, (rect) => rect.right, rightPosition, 'x');\n\n return { top, left, bottom, right };\n};\n","import { OperationType as operations } from '../types';\n\nexport const RemoveRows: operations = 0b00000000000000000000000000000000000000000000000000001; // 1\nexport const RemoveCols: operations = 0b00000000000000000000000000000000000000000000000000010; // 2\nexport const InsertRowsAbove: operations = 0b00000000000000000000000000000000000000000000000000100; // 4\nexport const InsertRowsBelow: operations = 0b00000000000000000000000000000000000000000000000001000; // 8\nexport const InsertColsLeft: operations = 0b00000000000000000000000000000000000000000000000010000; // 16\nexport const InsertColsRight: operations = 0b00000000000000000000000000000000000000000000000100000; // 32\nexport const MoveFrom: operations = 0b00000000000000000000000000000000000000000000001000000; // 64\nexport const MoveTo: operations = 0b00000000000000000000000000000000000000000000010000000; // 128\nexport const Write: operations = 0b00000000000000000000000000000000000000000000100000000; // 256\nexport const Style: operations = 0b00000000000000000000000000000000000000000001000000000; // 512\nexport const Copy: operations = 0b00000000000000000000000000000000000000010000000000000; // 8192\nexport const Resize: operations = 0b00000000000000000000000000000000000000000010000000000; // 1024\nexport const SetPolicy: operations = 0b00000000000000000000000000000000000000100000000000000; // 16384\nexport const Sort: operations = 0b00000000000000000000000000000000000001000000000000000; // 32768\nexport const Filter: operations = 0b00000000000000000000000000000000000010000000000000000; // 65536\nexport const SetLabel: operations = 0b00000000000000000000000000000000000100000000000000000; // 131072\n\nexport const NoOperation: operations = 0;\n\nexport const Move: operations = MoveFrom | MoveTo; // 192\n\nexport const Update: operations = Write | Style | Copy | Resize | SetPolicy | SetLabel;\n\nexport const InsertRows: operations = InsertRowsAbove | InsertRowsBelow; // 12\n\nexport const InsertCols: operations = InsertColsLeft | InsertColsRight; // 48\n\nexport const Add: operations = InsertRows | InsertCols; // 60\n\nexport const Delete: operations = RemoveRows | RemoveCols; // 3\n\nexport const ReadOnly: operations = Update | Delete | Add | Move;\n\nexport const ColumnMenu: operations = Filter | Sort | SetLabel;\n\nexport const RowMenu: operations = 0b00000000000000000000000000000000010000000000000000000; // 524288\n\nexport const ViewOnly: operations = ReadOnly | ColumnMenu;\n\nexport const hasOperation = (operation: operations | undefined, flag: operations) => {\n if (operation === undefined) {\n return false;\n }\n return (operation & flag) === flag;\n};\n\n// Don't use this function in production\nexport const debugOperations = (prevention: operations | undefined) => {\n const operations: string[] = [];\n if (hasOperation(prevention, RemoveRows)) {\n operations.push('RemoveRow');\n }\n if (hasOperation(prevention, RemoveCols)) {\n operations.push('RemoveCol');\n }\n if (hasOperation(prevention, InsertRowsAbove)) {\n operations.push('InsertRowAbove');\n }\n if (hasOperation(prevention, InsertRowsBelow)) {\n operations.push('InsertRowBelow');\n }\n if (hasOperation(prevention, InsertColsLeft)) {\n operations.push('InsertColLeft');\n }\n if (hasOperation(prevention, InsertColsRight)) {\n operations.push('InsertColRight');\n }\n if (hasOperation(prevention, MoveFrom)) {\n operations.push('MoveFrom');\n }\n if (hasOperation(prevention, MoveTo)) {\n operations.push('MoveTo');\n }\n if (hasOperation(prevention, Write)) {\n operations.push('Write');\n }\n if (hasOperation(prevention, Style)) {\n operations.push('Style');\n }\n if (hasOperation(prevention, Resize)) {\n operations.push('Resize');\n }\n if (hasOperation(prevention, SetPolicy)) {\n operations.push('SetPolicy');\n }\n if (hasOperation(prevention, SetLabel)) {\n operations.push('SetLabel');\n }\n if (hasOperation(prevention, Sort)) {\n operations.push('Sort');\n }\n if (hasOperation(prevention, Filter)) {\n operations.push('Filter');\n }\n return operations;\n};\n","import { BASE_DATE } from '../constants';\n\nconst MS_PER_DAY = 86400000;\n\nexport class Time {\n public readonly __gsType = 'Time' as const;\n public readonly days: number;\n public format: string;\n\n constructor(days: number, format = 'HH:mm:ss') {\n this.days = days;\n this.format = format;\n }\n\n public add(date: Date): Date {\n return new Date(date.getTime() + this.days * MS_PER_DAY);\n }\n\n public sub(date: Date): Date {\n return new Date(date.getTime() - this.days * MS_PER_DAY);\n }\n\n public stringify(format?: string): string {\n const totalMs = this.toMilliseconds();\n const absMs = Math.abs(totalMs);\n const sign = totalMs < 0 ? '-' : '';\n\n const millis = absMs % 1000;\n let remaining = Math.floor(absMs / 1000);\n const seconds = remaining % 60;\n remaining = Math.floor(remaining / 60);\n const minutes = remaining % 60;\n const hours = Math.floor(remaining / 60);\n\n const resolvedFormat = format ?? (millis === 0 ? 'HH:mm:ss' : 'HH:mm:ss.SSS');\n\n let result = resolvedFormat;\n result = result.replace('HH', sign + String(hours).padStart(2, '0'));\n result = result.replace('H', sign + String(hours));\n result = result.replace('mm', String(minutes).padStart(2, '0'));\n result = result.replace('ss', String(seconds).padStart(2, '0'));\n result = result.replace('SSS', String(millis).padStart(3, '0'));\n result = result.replace('SS', String(millis).padStart(3, '0').substring(0, 2));\n result = result.replace('S', String(millis).padStart(3, '0').substring(0, 1));\n return result;\n }\n\n public toMilliseconds(): number {\n return this.days * MS_PER_DAY;\n }\n\n public toDate(): Date {\n return new Date(BASE_DATE.getTime() + this.days * MS_PER_DAY);\n }\n\n public toJSON(): { __gsType: 'Time'; days: number; format: string } {\n return { __gsType: 'Time', days: this.days, format: this.format };\n }\n\n public toString(): string {\n return this.stringify();\n }\n\n static create(hours = 0, minutes = 0, seconds = 0, milliseconds = 0): Time {\n const ms = hours * 3600000 + minutes * 60000 + seconds * 1000 + milliseconds;\n return new Time(ms / MS_PER_DAY);\n }\n\n static fromDate(date: Date): Time {\n const timeMs =\n date.getHours() * 3600000 + date.getMinutes() * 60000 + date.getSeconds() * 1000 + date.getMilliseconds();\n return new Time(timeMs / MS_PER_DAY);\n }\n\n static fromDates(date1: Date, date2: Date): Time {\n return new Time((date1.getTime() - date2.getTime()) / MS_PER_DAY);\n }\n\n static fromObject(obj: { days: number; format?: string }): Time {\n return new Time(obj.days, obj.format);\n }\n\n static is(obj: any): boolean {\n if (obj instanceof Time) {\n return true;\n }\n if (obj?.__gsType === 'Time') {\n return true;\n }\n return false;\n }\n\n static ensure(obj: any): Time {\n if (obj instanceof Time) {\n return obj;\n }\n if (obj?.__gsType === 'Time') {\n return Time.fromObject(obj);\n }\n return Time.create();\n }\n\n static parse(value: string, format?: string, strict = false): Time | undefined {\n if (format != null) {\n const formattedMatcher = dayjsFormatToNamedRegex(format);\n const match = value.match(formattedMatcher);\n if (match?.groups) {\n return Time.create(\n Number(match.groups.HH || match.groups.H || 0),\n Number(match.groups.mm || match.groups.m || 0),\n Number(match.groups.ss || match.groups.s || 0),\n Number(match.groups.SSS || match.groups.SS || match.groups.S || 0),\n );\n }\n }\n if (strict) {\n return;\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})$/);\n if (match) {\n const [, _sign, hours, minutes, seconds] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds));\n }\n }\n {\n const match = value.match(/^([+-]?)(\\d+):(\\d{2}):(\\d{2})\\.(\\d+)$/);\n if (match) {\n const [, _sign, hours, minutes, seconds, msecs] = match;\n const sign = _sign === '-' ? -1 : 1;\n return Time.create(sign * Number(hours), sign * Number(minutes), sign * Number(seconds), sign * Number(msecs));\n }\n }\n }\n}\n\nconst tokenRegexMap: Record<string, { group: string; pattern: string }> = {\n HH: { group: 'HH', pattern: '(?<HH>\\\\d+)' },\n H: { group: 'H', pattern: '(?<HH>\\\\d+)' },\n mm: { group: 'mm', pattern: '(?<mm>[0-5]\\\\d)' },\n m: { group: 'm', pattern: '(?<m>\\\\d|[1-5]\\\\d)' },\n ss: { group: 'ss', pattern: '(?<ss>[0-5]\\\\d)' },\n s: { group: 's', pattern: '(?<s>\\\\d|[1-5]\\\\d)' },\n SSS: { group: 'SSS', pattern: '(?<SSS>\\\\d{3})' },\n SS: { group: 'SS', pattern: '(?<SS>\\\\d{2})' },\n S: { group: 'S', pattern: '(?<S>\\\\d)' },\n};\n\nfunction dayjsFormatToNamedRegex(format: string): RegExp {\n const sortedTokens = Object.keys(tokenRegexMap).sort((a, b) => b.length - a.length);\n const tokenPattern = new RegExp(sortedTokens.join('|'), 'g');\n\n const escapedFormat = format.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n const regexSource = escapedFormat.replace(tokenPattern, (match) => {\n return tokenRegexMap[match]?.pattern ?? match;\n });\n\n return new RegExp(`^${regexSource}$`);\n}\n\nexport const safeQueueMicrotask =\n typeof queueMicrotask === 'function' ? queueMicrotask : (cb: () => void) => Promise.resolve().then(cb);\n","import dayjs from 'dayjs';\nimport type { AreaType, CellsByAddressType, CellType, PointType, StoreType } from '../types';\nimport { Sheet } from './sheet';\nimport { areaShape, areaToZone, complementSelectingArea, concatAreas, zoneToArea, createMatrix } from './spatial';\nimport { p2a } from './coords';\n\nimport { Time } from './time';\nimport { CSSProperties } from 'react';\n\nconst BORDER_AUTOFILL_DRAGGING = 'dashed 1px #888888';\n\ntype Direction = 'left' | 'right' | 'up' | 'down' | 'none';\ntype Orientation = 'horizontal' | 'vertical' | 'none';\nconst DirectionMapping: {\n [key: string]: [Orientation, number];\n} = {\n left: ['horizontal', -1],\n right: ['horizontal', 1],\n up: ['vertical', -1],\n down: ['vertical', 1],\n none: ['none', 0],\n};\n\nexport class Autofill {\n private readonly src: AreaType;\n private readonly dst: AreaType;\n private readonly direction: Direction;\n private readonly sheet: Sheet;\n constructor(store: StoreType, draggingTo: PointType) {\n const { sheetReactive: sheetRef, choosing, selectingZone } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n throw new Error('Sheet is not available');\n }\n this.src = complementSelectingArea(zoneToArea(selectingZone), choosing);\n this.direction = this.suggestDirection(draggingTo);\n this.dst = this.getDestinationArea(draggingTo);\n this.sheet = sheet;\n }\n\n public get applied(): Sheet {\n const [orientation, sign] = DirectionMapping[this.direction];\n const { top: sTop, left: sLeft, bottom: sBottom, right: sRight } = this.src;\n const matrix = createMatrix(sBottom - sTop + 1, sRight - sLeft + 1) as (CellType | null)[][];\n for (let y = sTop; y <= sBottom; y++) {\n for (let x = sLeft; x <= sRight; x++) {\n matrix[y - sTop][x - sLeft] = this.sheet.getCell({ y, x }, { resolution: 'SYSTEM' }) ?? null;\n }\n }\n const srcShape = areaShape(this.src);\n const dstShape = areaShape(this.dst);\n\n const diff: CellsByAddressType = {};\n if (orientation === 'horizontal') {\n for (let i = 0; i < dstShape.rows; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(matrix[i], '');\n for (let j = 0; j < dstShape.cols; j++) {\n const baseCell = matrix[i % srcShape.rows]?.[j % srcShape.cols];\n const x = sign > 0 ? this.dst.left + j : this.dst.right - j;\n const px = sign > 0 ? j % srcShape.cols : (srcShape.cols - 1 - (j % srcShape.cols)) % srcShape.cols;\n const point = { y: this.dst.top + i, x };\n const id = this.sheet.getId(point);\n const value = patterns[px].next().value;\n const nextValue =\n (baseCell?.formulaEnabled ?? true)\n ? this.sheet.processFormula(value, {\n dependency: id,\n })\n : value;\n diff[p2a(point)] = {\n ...baseCell,\n value: nextValue,\n };\n }\n }\n } else if (orientation === 'vertical') {\n for (let i = 0; i < dstShape.cols; i++) {\n // TODO: pass the originPath\n const patterns = this.getChangePatterns(\n matrix.map((row) => row[i]),\n '',\n );\n for (let j = 0; j < dstShape.rows; j++) {\n const baseCell = matrix[j % srcShape.rows]?.[i % srcShape.cols];\n const y = sign > 0 ? this.dst.top + j : this.dst.bottom - j;\n const py = sign > 0 ? j % srcShape.rows : (srcShape.rows - 1 - (j % srcShape.rows)) % srcShape.rows;\n const value = patterns[py].next().value;\n diff[p2a({ y, x: this.dst.left + i })] = { ...baseCell, value };\n }\n }\n }\n const sheet = this.sheet.update({\n diff,\n operator: 'USER',\n undoReflection: {\n sheetId: this.sheet.id,\n selectingZone: areaToZone(this.src),\n },\n redoReflection: {\n sheetId: this.sheet.id,\n selectingZone: areaToZone(this.dst),\n },\n });\n return sheet;\n }\n\n public get wholeArea() {\n return concatAreas(this.src, this.dst);\n }\n\n public getCellStyle(target: PointType) {\n const { x, y } = target;\n const style: CSSProperties = {};\n const { top, left, bottom, right } = this.src;\n\n switch (this.direction) {\n case 'left': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.left === x && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'right': {\n if (this.dst.left <= x && x <= this.dst.right) {\n if (top === y) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n if (bottom === y - 1) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.right === x - 1 && top <= y && y <= bottom) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n\n case 'up': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.top === y && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n case 'down': {\n if (this.dst.top <= y && y <= this.dst.bottom) {\n if (left === x) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n if (right === x - 1) {\n style.borderLeft = BORDER_AUTOFILL_DRAGGING;\n }\n }\n if (this.dst.bottom === y - 1 && left <= x && x <= right) {\n style.borderTop = BORDER_AUTOFILL_DRAGGING;\n }\n break;\n }\n }\n return style;\n }\n\n private getDestinationArea(autofillDraggingTo: PointType): AreaType {\n const { x, y } = autofillDraggingTo;\n const { top, left, bottom, right } = this.src;\n switch (this.direction) {\n case 'left':\n return { top, bottom, left: x, right: left - 1 };\n case 'right':\n return { top, bottom, left: right + 1, right: x };\n case 'up':\n return { left, right, top: y, bottom: top - 1 };\n case 'down':\n return { left, right, top: bottom + 1, bottom: y };\n }\n return this.src;\n }\n\n private suggestDirection(draggingTo: PointType): Direction {\n const { top, left, bottom, right } = this.src;\n let horizontal = 0,\n vertical = 0;\n if (draggingTo.x < left) {\n horizontal = draggingTo.x - left;\n } else if (draggingTo.x > right) {\n horizontal = draggingTo.x - right;\n }\n if (draggingTo.y < top) {\n vertical = draggingTo.y - top;\n } else if (draggingTo.y > bottom) {\n vertical = draggingTo.y - bottom;\n }\n // diagonal\n if (Math.abs(horizontal) > 0 && Math.abs(vertical) > 0) {\n if (Math.abs(horizontal) > Math.abs(vertical)) {\n return horizontal < 0 ? 'left' : 'right';\n }\n return vertical < 0 ? 'up' : 'down';\n }\n if (horizontal !== 0) {\n return horizontal < 0 ? 'left' : 'right';\n }\n if (vertical !== 0) {\n return vertical < 0 ? 'up' : 'down';\n }\n return 'none';\n }\n\n private getChangePatterns(cells: (CellType | null)[], id: string): Generator[] {\n const result: Generator[] = [];\n const groups = groupByType(cells);\n const [orientation, sign] = DirectionMapping[this.direction];\n groups.forEach((group) => {\n const lastValue = sign > 0 ? group.last : group.first;\n switch (group.kind) {\n case 'other': {\n result.push(pass(group.first));\n return;\n }\n case 'formula': {\n const value = group.first;\n const sheet = this.sheet;\n\n function* generateFormula() {\n let slide = 0;\n const skip = cells.length * sign;\n while (true) {\n slide += skip;\n yield sheet.processFormula(value, {\n dependency: id,\n slideY: orientation === 'vertical' ? slide : 0,\n slideX: orientation === 'horizontal' ? slide : 0,\n });\n }\n }\n result.push(generateFormula());\n return;\n }\n case 'number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateNumber() {\n let value = lastValue;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield value;\n }\n }\n const g = generateNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'date': {\n const next = (d: Date) => {\n return sign > 0 ? group.time.add(d) : group.time.sub(d);\n };\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateDate() {\n let value = lastValue as Date;\n while (true) {\n value = next(value);\n yield new Date(value);\n }\n }\n const g = generateDate();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n case 'string+number': {\n if (!group.equidistant) {\n result.push(pass(group.first), ...group.nexts.map((v) => pass(v)));\n return;\n }\n\n function* generateStringNumber() {\n const { prefix } = extractStringNumber(group.first as string);\n const { number: lastNumber } = extractStringNumber(lastValue as string);\n let value = lastNumber;\n const skip = group.numericDelta * sign;\n while (true) {\n value += skip;\n yield `${prefix}${Math.abs(value)}`;\n }\n }\n const g = generateStringNumber();\n result.push(g, ...group.nexts.map(() => g));\n return;\n }\n }\n });\n return result;\n }\n}\n\nfunction* pass(value: any) {\n while (true) {\n yield value;\n }\n}\n\ntype GroupKind = 'number' | 'date' | 'string+number' | 'formula' | 'other';\n\nconst StringNumberPattern = new RegExp('(.+?)(\\\\d+)$');\n\nconst extractStringNumber = (value: string) => {\n const match = value.match(StringNumberPattern);\n if (match) {\n const [, prefix, n] = match;\n return { prefix, number: Number(n) };\n }\n return { prefix: '', number: 0 };\n};\n\nclass TypedGroup {\n public time: Time = Time.create();\n public numericDelta: number = 0;\n public kind: GroupKind;\n public nexts: any[];\n public first: any;\n public equidistant = true;\n\n constructor(value: any) {\n this.first = value;\n this.nexts = [];\n this.kind = this.discriminate(value);\n }\n private discriminate(value: any): GroupKind {\n const kind = value instanceof Date ? 'date' : typeof value;\n if (kind === 'number' || kind === 'date') {\n return kind;\n }\n if (kind === 'string' && value[0] === '=') {\n return 'formula';\n } else if (kind === 'string' && value.match(StringNumberPattern)) {\n return 'string+number';\n }\n return 'other';\n }\n\n public get last() {\n if (this.nexts.length === 0) {\n return this.first;\n }\n return this.nexts[this.nexts.length - 1];\n }\n\n public add(value: any): TypedGroup | undefined {\n const kind = this.discriminate(value);\n if (this.kind !== kind || kind === 'other' || kind === 'formula') {\n return new TypedGroup(value);\n }\n if (this.nexts.length === 0) {\n switch (kind) {\n case 'date': {\n this.time = Time.fromDates(value as Date, this.first as Date);\n break;\n }\n case 'number': {\n this.numericDelta = (value as number) - this.first;\n break;\n }\n case 'string+number': {\n const { prefix: prefix1, number: number1 } = extractStringNumber(this.first as string);\n const { prefix: prefix2, number: number2 } = extractStringNumber(value as string);\n if (prefix1 === prefix2) {\n this.numericDelta = number2 - number1;\n }\n break;\n }\n }\n }\n this.nexts.push(value);\n }\n\n public subdivide() {\n if (this.nexts.length === 0) {\n return [];\n }\n\n const news: TypedGroup[] = [];\n\n let lastGroup: TypedGroup = this;\n switch (this.kind) {\n case 'date': {\n const eq = this.nexts.every((v, i) => i === 0 || dayjs(v).isSame(this.time.add(this.nexts[i - 1])));\n this.equidistant = eq;\n return [];\n }\n case 'number': {\n const eq = this.nexts.every((v, i) => i === 0 || v === this.first + this.numericDelta * (i + 1));\n this.equidistant = eq;\n return [];\n }\n case 'string+number': {\n const { prefix: basePrefix } = extractStringNumber(this.first as string);\n for (let i = 0; i < lastGroup.nexts.length; i++) {\n const next = lastGroup.nexts[i];\n const { prefix, number } = extractStringNumber(next as string);\n if (basePrefix !== prefix) {\n const nexts = this.nexts.splice(i, this.nexts.length);\n lastGroup = new TypedGroup(nexts.splice(0, 1)[0]);\n nexts.forEach(lastGroup.add.bind(lastGroup));\n news.push(lastGroup, ...lastGroup.subdivide());\n break;\n } else {\n const { number: firstNumber } = extractStringNumber(lastGroup.first as string);\n if (number !== firstNumber + (i + 1) * lastGroup.numericDelta) {\n lastGroup.equidistant = false;\n }\n }\n }\n break;\n }\n }\n\n return news;\n }\n}\n\nfunction groupByType(cells: (CellType | null)[]): TypedGroup[] {\n let group = new TypedGroup(cells[0]?.value);\n const groups: TypedGroup[] = [group];\n\n for (let i = 1; i < cells.length; i++) {\n const value = cells[i]?.value;\n const nextGroup = group.add(value);\n if (nextGroup) {\n groups.push(nextGroup);\n group = nextGroup;\n }\n }\n for (let i = groups.length - 1; i >= 0; i--) {\n const group = groups[i];\n groups.splice(i + 1, 0, ...group.subdivide());\n }\n return groups;\n}\n","import {\n StoreType,\n RectType,\n ZoneType,\n PointType,\n RangeType,\n FeedbackType,\n CellsByAddressType,\n AreaType,\n PositionType,\n ModeType,\n RawCellType,\n OperatorType,\n FilterConfig,\n} from '../types';\nimport { zoneToArea, superposeArea, matrixShape, areaShape, areaDiff, areaToZone, restrictZone } from '../lib/spatial';\nimport { Sheet } from '../lib/sheet';\n\nimport { p2a, a2p } from '../lib/coords';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../constants';\nimport { initSearchStatement, restrictPoints, flashSheet, flashWithCallback, compactReflection } from './helpers';\nimport { smartScroll } from '../lib/virtualization';\nimport * as prevention from '../lib/operation';\nimport { Autofill } from '../lib/autofill';\n\nconst resetZone: ZoneType = { startY: -1, startX: -1, endY: -1, endX: -1 };\n\nconst actions: { [s: string]: CoreAction<any> } = {};\n\ntype StoreWithCallback = StoreType & {\n callback?: (store: StoreType) => void;\n};\n\nexport const reducer = <T>(store: StoreType, action: { type: number; value: T }): StoreType => {\n const act: CoreAction<T> | undefined = actions[action.type];\n if (act == null) {\n return store;\n }\n\n // React StrictMode calls reducers twice per dispatch to detect side effects.\n // Since Sheet is a mutable object, the second call re-applies operations (double undo, etc.).\n // Guard: React passes the SAME action object reference to both calls, so we use object identity\n // to distinguish a StrictMode second-call (same reference) from a new dispatch (new reference).\n // Using a Map allows multiple batched dispatches to each have their own cached result,\n // preventing the single-slot cache from being overwritten when actions are processed together.\n const registry = store.sheetReactive.current?.registry;\n if (registry?._strictModeCache?.has(action)) {\n const cached = registry._strictModeCache.get(action) as StoreType;\n registry._strictModeCache.delete(action);\n return cached;\n }\n\n const { callback, ...newStore } = act.reduce(store, action.value);\n callback?.(newStore);\n const result = { ...store, ...newStore };\n\n if (registry) {\n if (!registry._strictModeCache) {\n registry._strictModeCache = new Map();\n }\n registry._strictModeCache.set(action, result);\n queueMicrotask(() => {\n registry._strictModeCache?.delete(action);\n });\n }\n\n return result;\n};\n\nexport class CoreAction<T> {\n static head = 1;\n private actionId: number = 1;\n\n public reduce(store: StoreType, payload: T): StoreWithCallback {\n return store;\n }\n public call(payload: T): { type: number; value: T } {\n return {\n type: this.actionId,\n value: payload,\n };\n }\n public bind() {\n this.actionId = CoreAction.head++;\n actions[this.actionId] = this;\n return this.call.bind(this);\n }\n}\n\nclass SetSearchQueryAction<T extends string | undefined> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchQuery = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchQuery }),\n searchQuery,\n };\n }\n}\nexport const setSearchQuery = new SetSearchQueryAction().bind();\n\nclass SetSearchCaseSensitiveAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchCaseSensitive = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchCaseSensitive }),\n searchCaseSensitive,\n };\n }\n}\nexport const setSearchCaseSensitive = new SetSearchCaseSensitiveAction().bind();\n\nclass SetSearchRegexAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchRegex = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchRegex }),\n searchRegex,\n };\n }\n}\nexport const setSearchRegex = new SetSearchRegexAction().bind();\n\nclass SetSearchRangeAction<T extends ZoneType | undefined> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const searchRange = payload;\n const { sheetReactive: sheetRef } = store;\n if (sheetRef.current == null) {\n return store;\n }\n return {\n ...store,\n ...initSearchStatement(sheetRef.current, { ...store, searchRange }),\n searchRange,\n };\n }\n}\nexport const setSearchRange = new SetSearchRangeAction().bind();\n\nclass SetEditingAddressAction<T extends string> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editingAddress: payload,\n };\n }\n}\nexport const setEditingAddress = new SetEditingAddressAction().bind();\n\nclass SetAutofillDraggingToAction<T extends PointType | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n autofillDraggingTo: payload,\n };\n }\n}\nexport const setAutofillDraggingTo = new SetAutofillDraggingToAction().bind();\n\nclass SubmitAutofillAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const autofill = new Autofill(store, payload);\n const sheet = autofill.applied;\n const selectingZone = areaToZone(autofill.wholeArea);\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n ...initSearchStatement(sheet, store),\n ...restrictPoints(store, sheet),\n selectingZone,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n autofillDraggingTo: null,\n };\n }\n}\nexport const submitAutofill = new SubmitAutofillAction().bind();\n\nclass SetContextMenuPositionAction<T extends PositionType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n contextMenuPosition: payload,\n };\n }\n}\nexport const setContextMenuPosition = new SetContextMenuPositionAction().bind();\n\nclass SetResizingPositionYAction<T extends [number, number, number]> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n resizingPositionY: payload,\n };\n }\n}\nexport const setResizingPositionY = new SetResizingPositionYAction().bind();\n\nclass SetResizingPositionXAction<T extends [number, number, number]> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n resizingPositionX: payload,\n };\n }\n}\nexport const setResizingPositionX = new SetResizingPositionXAction().bind();\n\nclass SetEnteringAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n entering: payload,\n };\n }\n}\nexport const setEntering = new SetEnteringAction().bind();\n\nclass UpdateSheetAction<T extends Sheet> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n sheetReactive: { current: payload },\n ...initSearchStatement(payload, store),\n ...restrictPoints(store, payload),\n };\n }\n}\nexport const updateSheet = new UpdateSheetAction().bind();\n\nclass SetEditorRectAction<T extends RectType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editorRect: payload,\n };\n }\n}\nexport const setEditorRect = new SetEditorRectAction().bind();\n\nclass SetDragging<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n dragging: payload,\n };\n }\n}\nexport const setDragging = new SetDragging().bind();\n\nclass BlurAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editingAddress: '',\n };\n }\n}\nexport const blur = new BlurAction().bind();\n\nclass CopyAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n return {\n ...store,\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingSheetId: sheet.id,\n copyingZone: payload,\n cutting: false,\n });\n },\n };\n }\n}\nexport const copy = new CopyAction().bind();\n\nclass CutAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n return {\n ...store,\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingSheetId: sheet.id,\n copyingZone: payload,\n cutting: true,\n });\n },\n };\n }\n}\nexport const cut = new CutAction().bind();\n\nclass PasteAction<T extends { matrix: RawCellType[][]; onlyValue: boolean }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { choosing, selectingZone, sheetReactive: dstSheetRef } = store;\n const dstSheet = dstSheetRef.current;\n if (!dstSheet) {\n return store;\n }\n const { registry } = dstSheet;\n const { copyingSheetId, copyingZone, cutting } = registry;\n const srcSheet = dstSheet.getSheetBySheetId(copyingSheetId);\n\n let selectingArea = zoneToArea(selectingZone);\n const copyingArea = zoneToArea(copyingZone);\n const { matrix, onlyValue } = payload;\n\n if (cutting) {\n if (!srcSheet) {\n return store;\n }\n const src = copyingArea;\n const { rows: dy, cols: dx } = areaDiff(copyingArea);\n const dst: AreaType =\n selectingArea.top !== -1\n ? {\n top: selectingArea.top,\n left: selectingArea.left,\n bottom: selectingArea.top + dy,\n right: selectingArea.left + dx,\n }\n : {\n top: choosing.y,\n left: choosing.x,\n bottom: choosing.y + dy,\n right: choosing.x + dx,\n };\n\n const nextSelectingZone = restrictZone(areaToZone(dst));\n const newSheet = dstSheet.move({\n srcSheet,\n src,\n dst,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: srcSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n transmit: { copyingSheetId: srcSheet.id, copyingZone, cutting: true },\n }),\n redoReflection: compactReflection({\n sheetId: srcSheet.id,\n choosing,\n transmit: { copyingSheetId: srcSheet.id, copyingZone: resetZone },\n }),\n });\n\n return {\n ...store,\n ...initSearchStatement(newSheet, store),\n sheetReactive: { current: newSheet },\n selectingZone: nextSelectingZone,\n inputting: newSheet.getSerializedValue({ point: choosing, resolution: 'RAW' }),\n callback: ({ sheetReactive: sheetRef }) => {\n registry.transmit({\n cutting: false,\n copyingZone: resetZone,\n });\n },\n };\n }\n\n let newSheet: Sheet;\n let { y, x } = choosing;\n\n if (copyingArea.top === -1) {\n const { rows: height, cols: width } = matrixShape({ matrix, base: -1 });\n selectingArea = {\n top: y,\n left: x,\n bottom: y + height,\n right: x + width,\n };\n const nextSelectingZone = restrictZone(areaToZone(selectingArea));\n newSheet = dstSheet.writeRawCellMatrix({\n point: { y, x },\n matrix,\n onlyValue,\n undoReflection: compactReflection({\n sheetId: dstSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: dstSheet.id,\n selectingZone: nextSelectingZone,\n choosing,\n }),\n });\n } else {\n if (srcSheet == null) {\n return store;\n }\n let { rows: dy, cols: dx } = areaDiff(copyingArea);\n if (selectingArea.top !== -1) {\n y = selectingArea.top;\n x = selectingArea.left;\n const superposed = superposeArea(selectingArea, copyingArea);\n dy = superposed.rows;\n dx = superposed.cols;\n }\n selectingArea = { top: y, left: x, bottom: y + dy, right: x + dx };\n newSheet = dstSheet.copy({\n srcSheet,\n src: copyingArea,\n dst: selectingArea,\n onlyValue,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: srcSheet.id,\n transmit: { copyingZone },\n choosing,\n selectingZone,\n }),\n redoReflection: compactReflection({\n sheetId: srcSheet.id,\n transmit: { copyingSheetId: srcSheet.id, copyingZone: resetZone },\n choosing,\n selectingZone: areaToZone(selectingArea),\n }),\n });\n }\n\n const nextSelectingZone = restrictZone(areaToZone(selectingArea));\n nextSelectingZone.endX = Math.min(nextSelectingZone.endX, newSheet.numCols);\n nextSelectingZone.endY = Math.min(nextSelectingZone.endY, newSheet.numRows);\n return {\n ...store,\n sheetReactive: { current: newSheet },\n selectingZone: nextSelectingZone,\n inputting: newSheet.getSerializedValue({ point: choosing, resolution: 'RAW' }),\n ...initSearchStatement(newSheet, store),\n callback: ({ sheetReactive: sheetRef }) => {\n registry.transmit({\n copyingZone: resetZone,\n });\n },\n };\n }\n}\nexport const paste = new PasteAction().bind();\n\nclass EscapeAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n return {\n ...store,\n editingAddress: '',\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n callback: ({ sheetReactive: sheetRef }) => {\n sheetRef.current!.registry.transmit({\n copyingZone: resetZone,\n cutting: false,\n });\n },\n };\n }\n}\nexport const escape = new EscapeAction().bind();\n\nclass ChooseAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n choosing: payload,\n entering: true,\n };\n }\n}\nexport const choose = new ChooseAction().bind();\n\nclass SelectAction<T extends ZoneType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n selectingZone: payload,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n };\n }\n}\nexport const select = new SelectAction().bind();\n\nclass SelectRowsAction<T extends { range: RangeType; numCols: number }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { range, numCols } = payload;\n const { start, end } = range;\n const sheet = store.sheetReactive.current;\n const selectingZone = {\n startY: start,\n startX: 1,\n endY: end,\n endX: numCols,\n };\n // Find the first non-filtered row in the selection for choosing\n let choosingY = start;\n if (sheet) {\n for (let y = start; y <= end; y++) {\n if (!sheet.isRowFiltered(y)) {\n choosingY = y;\n break;\n }\n }\n }\n return {\n ...store,\n selectingZone,\n choosing: { y: choosingY, x: 1 },\n leftHeaderSelecting: true,\n topHeaderSelecting: false,\n };\n }\n}\nexport const selectRows = new SelectRowsAction().bind();\n\nclass SelectColsAction<T extends { range: RangeType; numRows: number }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { range, numRows } = payload;\n const { start, end } = range;\n const sheet = store.sheetReactive.current;\n const selectingZone = {\n startY: 1,\n startX: start,\n endY: numRows,\n endX: end,\n };\n // Find the first non-filtered row (y=1 is always visible for columns, use y=1)\n // For columns there is no column-level filter, so choosing y=1 (first data row visible)\n let choosingY = 1;\n if (sheet) {\n for (let y = 1; y <= numRows; y++) {\n if (!sheet.isRowFiltered(y)) {\n choosingY = y;\n break;\n }\n }\n }\n return {\n ...store,\n selectingZone,\n choosing: { y: choosingY, x: start },\n leftHeaderSelecting: false,\n topHeaderSelecting: true,\n };\n }\n}\nexport const selectCols = new SelectColsAction().bind();\n\nclass DragAction<T extends PointType> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { startY, startX } = store.selectingZone;\n const selectingZone = {\n startY,\n startX,\n endY: payload.y,\n endX: payload.x,\n };\n if (startY === payload.y && startX === payload.x) {\n selectingZone.endY = -1;\n selectingZone.endX = -1;\n }\n return { ...store, selectingZone };\n }\n}\nexport const drag = new DragAction().bind();\n\nclass SearchAction<T extends number> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { matchingCells } = store;\n let { matchingCellIndex, choosing } = store;\n matchingCellIndex += payload;\n if (matchingCellIndex >= matchingCells.length) {\n matchingCellIndex = 0;\n } else if (matchingCellIndex < 0) {\n matchingCellIndex = matchingCells.length - 1;\n }\n\n if (matchingCells.length > 0) {\n const address = matchingCells[matchingCellIndex];\n choosing = a2p(address);\n }\n return { ...store, matchingCells, matchingCellIndex, choosing };\n }\n}\nexport const search = new SearchAction().bind();\n\nclass WriteAction<T extends { value: string; point?: PointType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n let { value, point } = payload;\n const { choosing, selectingZone, sheetReactive: sheetRef } = store;\n if (point == null) {\n point = choosing;\n }\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n const newSheet = sheet.write({\n point: point,\n value,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing: point,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing: point,\n }),\n });\n return {\n ...store,\n ...initSearchStatement(newSheet, store),\n sheetReactive: { current: newSheet },\n callback: ({ sheetReactive: sheetRef }) => {\n sheet.registry.transmit({\n copyingZone: resetZone,\n });\n },\n };\n }\n}\nexport const write = new WriteAction().bind();\n\nclass ClearAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { choosing, selectingZone, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n\n let selectingArea = zoneToArea(selectingZone);\n if (selectingArea.top === -1) {\n const { y, x } = choosing;\n selectingArea = { top: y, left: x, bottom: y, right: x };\n }\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n let diffCount = 0;\n for (let y = top; y <= bottom; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution: 'SYSTEM' });\n const address = p2a({ y, x });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n continue;\n }\n // Spilled cells are derived from the origin cell's formula and should\n // not be cleared independently — doing so would blank the FormulaBar\n // while the spill re-populates the value on next evaluation.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n continue;\n }\n if (cell?.value != null) {\n diff[address] = { value: undefined };\n diffCount++;\n }\n }\n }\n if (diffCount === 0) {\n return store;\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const clear = new ClearAction().bind();\n\nclass UndoAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (!sheet) {\n return store;\n }\n const { history, callback } = sheet.undo();\n if (history == null) {\n return store;\n }\n if (history.dstSheetId !== sheet.id) {\n const { dispatch, store: dstStore } = sheet.registry.contextsBySheetId[history.dstSheetId];\n dispatch(\n setStore({\n ...dstStore,\n ...history.undoReflection,\n sheetReactive: { current: dstStore.sheetReactive.current },\n }),\n );\n flashSheet(dstStore.flashRef.current);\n // For cross-sheet MOVE: the src (current) sheet's lastChangedAddresses was also updated.\n // Return updated sheetReactive so this sheet's Emitter fires onChange.\n if (history.srcSheetId === sheet.id) {\n return flashWithCallback(store, sheet, callback);\n }\n return store;\n }\n return {\n ...store,\n ...restrictPoints(store, sheet),\n ...history.undoReflection,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n };\n }\n}\nexport const undo = new UndoAction().bind();\n\nclass RedoAction<T extends null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const { history, newSheet, callback } = sheet.redo();\n if (history == null) {\n return store;\n }\n if (history.dstSheetId !== sheet.id) {\n const { dispatch, store: dstStore } = sheet.registry.contextsBySheetId[history.dstSheetId];\n dispatch(\n setStore({\n ...dstStore,\n ...history.redoReflection,\n sheetReactive: { current: dstStore.sheetReactive.current },\n }),\n );\n flashSheet(dstStore.flashRef.current);\n // For cross-sheet MOVE: the src (current) sheet's lastChangedAddresses was also updated.\n // Return updated sheetReactive so this sheet's Emitter fires onChange.\n if (history.srcSheetId === sheet.id) {\n return flashWithCallback(store, sheet, callback);\n }\n return store;\n }\n return {\n ...store,\n ...restrictPoints(store, sheet),\n ...history.redoReflection,\n ...initSearchStatement(sheet, store),\n sheetReactive: { current: sheet },\n callback: (s: StoreType) => {\n callback?.(s);\n flashSheet(store.flashRef.current);\n },\n };\n }\n}\nexport const redo = new RedoAction().bind();\n\nclass ArrowAction<\n T extends {\n shiftKey: boolean;\n deltaY: number;\n deltaX: number;\n numRows: number;\n numCols: number;\n },\n> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { shiftKey, deltaY, deltaX, numRows, numCols } = payload;\n const { choosing, sheetReactive: sheetRef, tabularRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n let { selectingZone } = store;\n const { y, x } = choosing;\n if (shiftKey) {\n const [dragEndY, dragEndX] = [\n selectingZone.endY === -1 ? y : selectingZone.endY,\n selectingZone.endX === -1 ? x : selectingZone.endX,\n ];\n const [nextY, nextX] = [dragEndY + deltaY, dragEndX + deltaX];\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n selectingZone =\n y === nextY && x === nextX\n ? { startY: -1, startX: -1, endY: -1, endX: -1 }\n : { startY: y, startX: x, endY: nextY, endX: nextX };\n return {\n ...store,\n selectingZone,\n };\n }\n const [nextY, nextX] = [y + deltaY, x + deltaX];\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n // Skip hidden rows\n let resolvedY = nextY;\n if (sheet.isRowFiltered(resolvedY)) {\n const dir = deltaY >= 0 ? 1 : -1;\n while (resolvedY >= 1 && resolvedY <= numRows && sheet.isRowFiltered(resolvedY)) {\n resolvedY += dir;\n }\n if (resolvedY < 1 || resolvedY > numRows) {\n return store; // no visible row in that direction\n }\n }\n let { y: editorTop, x: editorLeft, height, width } = store.editorRect;\n if (deltaY > 0) {\n for (let i = y; i < resolvedY; i++) {\n editorTop += sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n } else if (deltaY < 0) {\n for (let i = y - 1; i >= resolvedY; i--) {\n editorTop -= sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n }\n if (deltaX > 0) {\n for (let i = x; i < nextX; i++) {\n editorLeft += sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n } else if (deltaX < 0) {\n for (let i = x - 1; i >= nextX; i--) {\n editorLeft -= sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n }\n\n const cell = sheet.getCell({ y: resolvedY, x: nextX }, { resolution: 'SYSTEM' });\n height = cell?.height || DEFAULT_HEIGHT;\n width = cell?.width || DEFAULT_WIDTH;\n\n smartScroll(sheet, tabularRef.current, { y: resolvedY, x: nextX });\n return {\n ...store,\n selectingZone: { startY: -1, startX: -1, endY: -1, endX: -1 },\n choosing: { y: resolvedY, x: nextX } as PointType,\n editorRect: { y: editorTop, x: editorLeft, height, width },\n };\n }\n}\nexport const arrow = new ArrowAction().bind();\n\nclass WalkAction<\n T extends {\n deltaY: number;\n deltaX: number;\n numRows: number;\n numCols: number;\n },\n> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, numCols } = payload;\n let { deltaY, deltaX } = payload;\n const { choosing, selectingZone, sheetReactive: sheetRef, tabularRef: gridOuterRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n let { y: editorTop, x: editorLeft, height, width } = store.editorRect;\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n let [nextY, nextX] = [y + deltaY, x + deltaX];\n if (nextY < top && top !== -1) {\n deltaY = bottom - nextY;\n nextY = bottom;\n if (nextX > left) {\n nextX--;\n deltaX--;\n } else {\n deltaX = right - nextX;\n nextX = right;\n }\n }\n if (nextY > bottom && bottom !== -1) {\n deltaY = top - nextY;\n nextY = top;\n if (nextX < right) {\n nextX++;\n deltaX++;\n } else {\n deltaX = left - nextX;\n nextX = left;\n }\n }\n if (nextX < left && left !== -1) {\n deltaX = right - nextX;\n nextX = right;\n if (nextY > top) {\n nextY--;\n deltaY--;\n } else {\n deltaY = bottom - nextY;\n nextY = bottom;\n }\n }\n if (nextX > right && right !== -1) {\n deltaX = left - nextX;\n nextX = left;\n if (nextY < bottom) {\n nextY++;\n deltaY++;\n } else {\n deltaY = top - nextY;\n nextY = top;\n }\n }\n\n if (nextY < 1 || numRows < nextY || nextX < 1 || numCols < nextX) {\n return store;\n }\n\n // Skip hidden rows\n if (sheet.isRowFiltered(nextY)) {\n const dir = deltaY >= 0 ? 1 : -1;\n const lo = top !== -1 ? top : 1;\n const hi = bottom !== -1 ? bottom : numRows;\n while (nextY >= lo && nextY <= hi && sheet.isRowFiltered(nextY)) {\n nextY += dir;\n }\n if (nextY < lo || nextY > hi || sheet.isRowFiltered(nextY)) {\n return store; // no visible row in range\n }\n }\n\n if (deltaY > 0) {\n for (let i = y; i < nextY; i++) {\n editorTop += sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n } else if (deltaY < 0) {\n for (let i = y - 1; i >= nextY; i--) {\n editorTop -= sheet.getCell({ y: i, x: 0 }, { resolution: 'SYSTEM' })?.height || DEFAULT_HEIGHT;\n }\n }\n if (deltaX > 0) {\n for (let i = x; i < nextX; i++) {\n editorLeft += sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n } else if (deltaX < 0) {\n for (let i = x - 1; i >= nextX; i--) {\n editorLeft -= sheet.getCell({ y: 0, x: i }, { resolution: 'SYSTEM' })?.width || DEFAULT_WIDTH;\n }\n }\n const cell = sheet.getCell({ y: nextY, x: nextX }, { resolution: 'SYSTEM' });\n height = cell?.height || DEFAULT_HEIGHT;\n width = cell?.width || DEFAULT_WIDTH;\n smartScroll(sheet, gridOuterRef.current, { y: nextY, x: nextX });\n return {\n ...store,\n choosing: { y: nextY, x: nextX } as PointType,\n editorRect: { y: editorTop, x: editorLeft, height, width },\n };\n }\n}\nexport const walk = new WalkAction().bind();\n\nclass SetInputtingAction<T extends string> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n inputting: payload,\n };\n }\n}\n\nexport const setInputting = new SetInputtingAction().bind();\n\nclass InsertRowsAboveAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.insertRows({\n y,\n numRows,\n baseY: y,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertRowsAbove = new InsertRowsAboveAction().bind();\n\nclass InsertRowsBelowAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const nextSelectingZone = {\n ...selectingZone,\n startY: selectingZone.startY + numRows,\n endY: selectingZone.endY + numRows,\n };\n const nextChoosing = { ...choosing, y: choosing.y + numRows };\n\n sheet.insertRows({\n y: y + 1,\n numRows,\n baseY: y,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n }),\n });\n return {\n ...store,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertRowsBelow = new InsertRowsBelowAction().bind();\n\nclass InsertColsLeftAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.insertCols({\n x,\n numCols,\n baseX: x,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertColsLeft = new InsertColsLeftAction().bind();\n\nclass InsertColsRightAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n const nextSelectingZone = {\n ...selectingZone,\n startX: selectingZone.startX + numCols,\n endX: selectingZone.endX + numCols,\n };\n const nextChoosing = { ...choosing, x: choosing.x + numCols };\n\n selectingZone.startX += numCols;\n selectingZone.endX += numCols;\n\n sheet.insertCols({\n x: x + 1,\n numCols,\n baseX: x,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n }),\n });\n return {\n ...store,\n selectingZone: nextSelectingZone,\n choosing: nextChoosing,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const insertColsRight = new InsertColsRightAction().bind();\n\nclass RemoveRowsAction<T extends { numRows: number; y: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numRows, y, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.removeRows({\n y,\n numRows,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n sheetHeight: store.sheetHeight,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const removeRows = new RemoveRowsAction().bind();\n\nclass RemoveColsAction<T extends { numCols: number; x: number; operator?: OperatorType }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { numCols, x, operator } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing, editorRef } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n\n sheet.removeCols({\n x,\n numCols,\n operator,\n undoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n sheetWidth: store.sheetWidth,\n }),\n redoReflection: compactReflection({\n sheetId: sheet.id,\n selectingZone,\n choosing,\n }),\n });\n\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const removeCols = new RemoveColsAction().bind();\n\nclass SortRowsAction<T extends { x: number; direction: 'asc' | 'desc' }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { x, direction } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.sortRows({ x, direction });\n const reflection = compactReflection({ sheetId: sheet.id, selectingZone, choosing });\n if (sheet.registry.lastHistory) {\n sheet.registry.lastHistory.undoReflection = reflection;\n sheet.registry.lastHistory.redoReflection = reflection;\n }\n return {\n ...store,\n sheetReactive: { current: sheet },\n };\n }\n}\nexport const sortRows = new SortRowsAction().bind();\n\nclass FilterRowsAction<T extends { x?: number; filter?: FilterConfig }> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n const { x, filter } = payload;\n const { sheetReactive: sheetRef, selectingZone, choosing } = store;\n const sheet = sheetRef.current;\n if (sheet == null) {\n return store;\n }\n sheet.filterRows({ x, filter });\n const reflection = compactReflection({ sheetId: sheet.id, selectingZone, choosing });\n if (sheet.registry.lastHistory) {\n sheet.registry.lastHistory.undoReflection = reflection;\n sheet.registry.lastHistory.redoReflection = reflection;\n }\n let newChoosing = choosing;\n if (sheet.isRowFiltered(choosing.y)) {\n for (let y = 1; y <= sheet.numRows; y++) {\n if (!sheet.isRowFiltered(y)) {\n newChoosing = { y, x: choosing.x };\n break;\n }\n }\n }\n return {\n ...store,\n choosing: newChoosing,\n selectingZone: newChoosing !== choosing ? resetZone : selectingZone,\n sheetReactive: { current: sheet },\n callback: ({ sheetReactive: sheetRef }) => {\n const t = sheetRef.current;\n if (t) {\n t.registry.transmit({\n cutting: false,\n copyingZone: resetZone,\n });\n }\n },\n };\n }\n}\nexport const filterRows = new FilterRowsAction().bind();\n\nclass SetColumnMenuAction<T extends { x: number; position: { y: number; x: number } } | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n columnMenuState: payload,\n };\n }\n}\nexport const setColumnMenu = new SetColumnMenuAction().bind();\n\nclass SetRowMenuAction<T extends { y: number; position: { y: number; x: number } } | null> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n rowMenuState: payload,\n };\n }\n}\nexport const setRowMenu = new SetRowMenuAction().bind();\n\nclass SetEditorHoveringAction<T extends boolean> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n editorHovering: payload,\n };\n }\n}\nexport const setEditorHovering = new SetEditorHoveringAction().bind();\n\nclass setStoreAction<T extends Partial<StoreType>> extends CoreAction<T> {\n reduce(store: StoreType, payload: T): StoreWithCallback {\n return {\n ...store,\n ...payload,\n };\n }\n}\nexport const setStore = new setStoreAction().bind();\n\nexport const userActions = {\n blur,\n copy,\n cut,\n paste,\n escape,\n choose,\n select,\n selectRows,\n selectCols,\n drag,\n search,\n write,\n clear,\n undo,\n redo,\n arrow,\n walk,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n};\n","/**\n * lib/popup.ts\n *\n * Utility functions for computing the position of floating UI elements\n * (tooltips, dropdowns, autocomplete lists, function guides, etc.)\n * so they don't overflow the viewport.\n */\n\nconst MARGIN = 8; // px gap from the viewport edge\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type HAlign = 'left' | 'right';\nexport type VAlign = 'top' | 'bottom';\n\nexport type PopupPosition = {\n x: number;\n y: number;\n hAlign: HAlign;\n};\n\n// ---------------------------------------------------------------------------\n// calcBelowPosition\n//\n// Places a popup BELOW an anchor rect.\n// Prefers aligning the popup's RIGHT edge to rect.right (hAlign='right'),\n// but falls back to aligning its LEFT edge to rect.left (hAlign='left')\n// when there is not enough room on the left side of the viewport.\n//\n// In the 'right' case the caller should apply translateX(-100%) to shift the\n// popup leftward so its right edge lands at x.\n// In the 'left' case x is the desired left edge directly.\n//\n// Usage: error triangle tooltip, any anchored-to-element popup.\n// ---------------------------------------------------------------------------\nexport const calcBelowPosition = (rect: DOMRect, maxWidth = 260, margin = MARGIN): PopupPosition => {\n if (rect.right - maxWidth >= margin) {\n return { x: rect.right, y: rect.bottom, hAlign: 'right' };\n }\n return { x: Math.max(rect.left, margin), y: rect.bottom, hAlign: 'left' };\n};\n\n// ---------------------------------------------------------------------------\n// clampLeft\n//\n// Given the desired left position of a popup and its rendered width,\n// returns an adjusted left value that keeps the popup within the viewport.\n//\n// Usage: EditorOptions dropdown, FunctionGuide floating panel.\n// ---------------------------------------------------------------------------\nexport const clampLeft = (left: number, width: number, margin = MARGIN): number => {\n const rightEdge = left + width;\n const overflow = rightEdge - (window.innerWidth - margin);\n return overflow > 0 ? left - overflow : left;\n};\n\n// ---------------------------------------------------------------------------\n// calcSidePosition\n//\n// Places a popup to the LEFT or RIGHT of an anchor element.\n// Prefers the right side; falls back to the left side if the right side\n// overflows the viewport.\n//\n// Resets the element to the preferred (right-side) position BEFORE measuring,\n// so that stale styles from a previous render don't corrupt the measurement.\n//\n// Applies the final styles directly to the element and also returns them.\n//\n// Usage: FunctionGuide guide1 (option tooltip panel).\n// ---------------------------------------------------------------------------\nexport type SideStyle = { left: string; right: string };\n\nexport const calcSideStyle = (el: HTMLElement, gap = MARGIN): SideStyle => {\n // 1. Reset to preferred position so getBoundingClientRect reflects the right side.\n el.style.left = `calc(100% + ${gap}px)`;\n el.style.right = 'auto';\n\n // 2. Measure after reset.\n const rect = el.getBoundingClientRect();\n if (rect.right > window.innerWidth - MARGIN) {\n const flipped: SideStyle = { left: 'auto', right: `calc(100% + ${gap}px)` };\n el.style.left = flipped.left;\n el.style.right = flipped.right;\n return flipped;\n }\n return { left: `calc(100% + ${gap}px)`, right: 'auto' };\n};\n\n// ---------------------------------------------------------------------------\n// clampPopup\n//\n// Adjusts a rendered popup element's position so it stays within the viewport.\n// Applies left/top corrections directly as inline styles to avoid re-renders.\n// Call this inside useLayoutEffect with no dependency array so it runs after\n// every render (content changes may change the popup dimensions).\n//\n// Usage: ContextMenu, FunctionGuide guide2, any popup that can change size.\n// ---------------------------------------------------------------------------\nexport const clampPopup = (el: HTMLElement): void => {\n const rect = el.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n if (rect.right > vw - MARGIN) {\n el.style.left = `${parseFloat(el.style.left || '0') - (rect.right - (vw - MARGIN))}px`;\n }\n if (rect.bottom > vh - MARGIN) {\n el.style.top = `${parseFloat(el.style.top || '0') - (rect.bottom - (vh - MARGIN))}px`;\n }\n};\n\n// ---------------------------------------------------------------------------\n// hAlignTransform\n//\n// Returns the CSS transform string for a popup based on its horizontal alignment.\n// 'right' → shift left by full width so the popup's right edge sits at x.\n// 'left' → no transform needed.\n// ---------------------------------------------------------------------------\nexport const hAlignTransform = (hAlign: HAlign): string => (hAlign === 'right' ? 'translateX(-100%)' : 'none');\n","import React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '../formula/mapping';\nimport type { AutocompleteOption } from '../policy/core';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '../lib/popup';\n\ntype OptionWithGuide = AutocompleteOption & {\n isFunction?: boolean;\n example?: string;\n category?: string;\n description?: string;\n defs?: any[];\n};\n\nexport interface FunctionGuideProps {\n // Option Help Mode (renders in EditorOptions)\n option?: OptionWithGuide;\n\n // Active Function Highlight Mode (renders floating near cursor)\n activeFunctionGuide?: FunctionHelp;\n activeArgIndex?: number;\n top?: number;\n left?: number;\n}\n\nexport const FunctionGuide: React.FC<FunctionGuideProps> = ({\n option,\n activeFunctionGuide,\n activeArgIndex = 0,\n top,\n left,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const guide1Ref = useRef<HTMLDivElement>(null);\n const { store } = useContext(Context);\n // Hide the active help when not hovering over the editor, to prevent it from blocking clicks on other options.\n const isHidden = !store.editorHovering;\n\n useLayoutEffect(() => {\n const el = guide1Ref.current;\n if (!el) {\n return;\n }\n calcSideStyle(el);\n });\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el || left === undefined) {\n return;\n }\n clampPopup(el);\n });\n\n if (option) {\n return (\n <div\n ref={guide1Ref}\n className=\"gs-fn-guide1\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n >\n {option.category && option.isFunction && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${option.category}`}>{option.category}</span>\n )}\n {option.tooltip && (\n <div className=\"gs-fn-guide1-tooltip\">\n {typeof option.tooltip === 'function'\n ? React.createElement(option.tooltip as any, { value: option.value })\n : option.tooltip}\n </div>\n )}\n {option.isFunction && (\n <>\n <div className=\"gs-fn-guide1-example\">{option.example}</div>\n {option.description && (\n <div className=\"gs-fn-guide1-desc\" style={{ whiteSpace: 'pre-line' }}>\n {option.description}\n </div>\n )}\n {option.defs && option.defs.length > 0 && (\n <div className=\"gs-fn-guide1-args\">\n {option.defs.map((arg: any, j: number) => (\n <div key={j} className=\"gs-fn-guide1-arg\">\n <span className=\"gs-fn-guide1-arg-name\">{arg.name}</span>\n {arg.optional && <span className=\"gs-fn-guide1-arg-opt\"> (optional)</span>}\n {arg.variadic && <span className=\"gs-fn-guide1-arg-iter\">...</span>}\n <code className=\"gs-fn-guide1-arg-type\">{arg.acceptedTypes?.join(' | ') || 'any'}</code>\n <span className=\"gs-fn-guide1-arg-desc\"> — {arg.description}</span>\n </div>\n ))}\n </div>\n )}\n </>\n )}\n </div>\n );\n }\n\n if (activeFunctionGuide) {\n return (\n <div\n ref={ref}\n className={`gs-fn-guide2 ${isHidden ? 'gs-fn-guide2-hidden' : ''}`}\n style={top !== undefined && left !== undefined ? { top: top + 4, left } : undefined}\n >\n {activeFunctionGuide.category && (\n <span className={`gs-fn-guide-category gs-fn-guide-category-${activeFunctionGuide.category}`}>\n {activeFunctionGuide.category}\n </span>\n )}\n <div className=\"gs-fn-guide2-name\">{activeFunctionGuide.example}</div>\n <div className=\"gs-fn-guide2-args-inline\">\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n return args.map((arg: any, j: number) => {\n let isActive: boolean;\n if (activeArgIndex < variadicStart) {\n // Cursor is on a fixed (non-variadic) argument\n isActive = activeArgIndex === j;\n } else if (numIterable > 0 && j >= variadicStart) {\n // Cursor is in the variadic zone; cycle through the variadic args\n const offset = (activeArgIndex - variadicStart) % numIterable;\n isActive = j === variadicStart + offset;\n } else {\n isActive = false;\n }\n return (\n <React.Fragment key={j}>\n {j > 0 ? ', ' : ''}\n <span className={isActive ? 'gs-active-arg' : ''}>\n {arg.optional ? '[' : ''}\n {arg.name}\n {arg.variadic ? ', ...' : ''}\n {arg.optional ? ']' : ''}\n </span>\n </React.Fragment>\n );\n });\n })()}\n </div>\n {(() => {\n const args = activeFunctionGuide.defs ?? [];\n const numIterable = args.filter((a: any) => a.variadic).length;\n const variadicStart = args.length - numIterable;\n\n let resolvedIndex: number;\n if (activeArgIndex < variadicStart || numIterable === 0) {\n resolvedIndex = Math.min(activeArgIndex, args.length - 1);\n } else {\n const offset = (activeArgIndex - variadicStart) % numIterable;\n resolvedIndex = variadicStart + offset;\n }\n const activeArg = args[resolvedIndex];\n if (!activeArg?.description) {\n return null;\n }\n return (\n <div className=\"gs-fn-guide2-desc\" style={{ marginTop: 8, fontSize: 12, color: '#888' }}>\n <p>\n <strong>{activeArg.name}:</strong>{' '}\n <code className=\"gs-fn-guide2-arg-type\">{activeArg.acceptedTypes?.join(' | ') || 'any'}</code>\n {activeArg.description}\n </p>\n </div>\n );\n })()}\n\n {activeFunctionGuide.description && (\n <div className=\"gs-fn-guide2-desc\" style={{ whiteSpace: 'pre-line' }}>\n {activeFunctionGuide.description}\n </div>\n )}\n </div>\n );\n }\n\n return null;\n};\n","import React, { useRef, useLayoutEffect, useState } from 'react';\nimport { FunctionGuide } from './FunctionGuide';\nimport { clampLeft } from '../lib/popup';\n\ninterface EditorOptionsProps {\n filteredOptions: any[];\n top: number;\n left: number;\n selected: number;\n onOptionMouseDown: (e: React.MouseEvent<HTMLLIElement>, i: number) => void;\n}\n\nexport const EditorOptions: React.FC<EditorOptionsProps> = ({\n filteredOptions,\n top,\n left,\n selected,\n onOptionMouseDown,\n}) => {\n const ulRef = useRef<HTMLUListElement>(null);\n const [adjustedLeft, setAdjustedLeft] = useState(left);\n\n useLayoutEffect(() => {\n if (!ulRef.current) {\n return;\n }\n const width = ulRef.current.getBoundingClientRect().width;\n setAdjustedLeft(clampLeft(left, width));\n }, [left, filteredOptions]);\n\n if (filteredOptions.length === 0) {\n return null;\n }\n\n return (\n <ul ref={ulRef} className=\"gs-editor-options\" style={{ top, left: adjustedLeft }}>\n {filteredOptions.map((option, i) => (\n <li\n key={i}\n className={`gs-editor-option ${selected === i ? ' gs-editor-option-selected' : ''}`}\n onMouseDown={(e) => onOptionMouseDown(e, i)}\n >\n <div className=\"gs-editor-option-content\">\n <span>{option.label ?? option.value}</span>\n {selected === i && <span className=\"gs-editor-option-tab\">⇥ Tab</span>}\n </div>\n {(option.isFunction || option.tooltip) && selected === i && <FunctionGuide option={option} />}\n </li>\n ))}\n </ul>\n );\n};\n","export const focus = (el: HTMLElement | null | undefined) => {\n el?.focus({ preventScroll: true });\n};\n\nconst isSafari = (): boolean =>\n typeof navigator !== 'undefined' && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n/**\n * Prevents Safari elastic bounce (rubber-band) at scroll boundaries.\n * No-op on non-Safari browsers. Returns a cleanup function to remove the listeners.\n */\nexport const preventSafariBounce = (el: HTMLDivElement): (() => void) => {\n if (!isSafari()) {\n return () => {};\n }\n const preventBounce = (e: WheelEvent) => {\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = el;\n const atTop = e.deltaY < 0 && scrollTop <= 0;\n const atBottom = e.deltaY > 0 && scrollTop + clientHeight >= scrollHeight;\n const atLeft = e.deltaX < 0 && scrollLeft <= 0;\n const atRight = e.deltaX > 0 && scrollLeft + clientWidth >= scrollWidth;\n if (atTop || atBottom || atLeft || atRight) {\n e.preventDefault();\n window.scrollBy({ top: e.deltaY, left: e.deltaX, behavior: 'auto' });\n }\n };\n\n let touchStartX = 0;\n let touchStartY = 0;\n\n const onTouchStart = (e: TouchEvent) => {\n if (e.touches.length === 1) {\n touchStartX = e.touches[0].clientX;\n touchStartY = e.touches[0].clientY;\n }\n };\n\n const preventTouchBounce = (e: TouchEvent) => {\n if (e.touches.length !== 1) {\n return;\n }\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = el;\n const dx = e.touches[0].clientX - touchStartX;\n const dy = e.touches[0].clientY - touchStartY;\n const atTop = dy > 0 && scrollTop <= 0;\n const atBottom = dy < 0 && scrollTop + clientHeight >= scrollHeight;\n const atLeft = dx > 0 && scrollLeft <= 0;\n const atRight = dx < 0 && scrollLeft + clientWidth >= scrollWidth;\n if (atTop || atBottom || atLeft || atRight) {\n e.preventDefault();\n }\n };\n\n el.addEventListener('wheel', preventBounce, { passive: false });\n el.addEventListener('touchstart', onTouchStart, { passive: true });\n el.addEventListener('touchmove', preventTouchBounce, { passive: false });\n\n return () => {\n el.removeEventListener('wheel', preventBounce);\n el.removeEventListener('touchstart', onTouchStart);\n el.removeEventListener('touchmove', preventTouchBounce);\n };\n};\n","import type { StoreType, AreaType, PointType } from '../types';\n\nimport { zoneToArea } from './spatial';\nimport type { Sheet, UserSheet } from './sheet';\nimport { focus } from './dom';\n\nexport const clip = (store: StoreType) => {\n const { selectingZone, choosing, editorRef, sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n if (!sheet) {\n return { top: 0, left: 0, bottom: 0, right: 0 };\n }\n\n const { y, x } = choosing;\n const selectingArea = zoneToArea(selectingZone);\n let area = selectingArea;\n if (area.left === -1) {\n area = { top: y, left: x, bottom: y, right: x };\n }\n const input = editorRef.current;\n const trimmed = sheet.trim(area);\n const tsv = sheet2csv(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n const html = sheet2html(trimmed, {\n getter: (sheet, point) => {\n const policy = sheet.getPolicy(point);\n return policy.serializeForClipboard({ point, sheet });\n },\n });\n\n if (navigator.clipboard) {\n const tsvBlob = new Blob([tsv], { type: 'text/plain' });\n const htmlBlob = new Blob([html], { type: 'text/html' });\n\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/plain': tsvBlob,\n 'text/html': htmlBlob,\n }),\n ]);\n } else if (input != null) {\n input.value = tsv;\n focus(input);\n input.select();\n document.execCommand('copy');\n input.value = '';\n input.blur();\n }\n return area;\n};\n\nexport type SheetCSVProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n separator?: string;\n newline?: string;\n};\n\nexport const sheet2csv = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n separator = '\\t',\n newline = '\\n',\n }: SheetCSVProps = {},\n): string => {\n const rows: { isEmpty: boolean; line: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n if (value.indexOf('\\n') !== -1) {\n cols.push(`\"${value.replace(/\"/g, '\"\"')}\"`);\n } else {\n cols.push(value);\n }\n }\n rows.push({ isEmpty: rowIsEmpty, line: cols.join(separator) });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return rows.map((r) => r.line).join(newline);\n};\n\nexport type SheetHTMLProps = {\n getter?: (sheet: UserSheet, point: PointType) => string;\n filteredRowsIncluded?: boolean;\n trailingEmptyRowsOmitted?: boolean;\n};\n\nexport const sheet2html = (\n sheet: UserSheet,\n {\n getter = (sheet, point) => {\n return String(sheet.getCell(point)?.value ?? '');\n },\n filteredRowsIncluded = false,\n trailingEmptyRowsOmitted = false,\n }: SheetHTMLProps = {},\n): string => {\n const rows: { isEmpty: boolean; html: string }[] = [];\n for (let y = sheet.top; y <= sheet.bottom; y++) {\n if (sheet.isRowFiltered(y) && !filteredRowsIncluded) {\n continue;\n }\n const cols: string[] = [];\n let rowIsEmpty = true;\n for (let x = sheet.left; x <= sheet.right; x++) {\n const point: PointType = { y, x };\n const value = getter(sheet, point);\n if (value !== '') {\n rowIsEmpty = false;\n }\n const valueEscaped = value\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n cols.push(`<td>${valueEscaped}</td>`);\n }\n rows.push({ isEmpty: rowIsEmpty, html: `<tr>${cols.join('')}</tr>` });\n }\n if (trailingEmptyRowsOmitted) {\n while (rows.length > 0 && rows[rows.length - 1].isEmpty) {\n rows.pop();\n }\n }\n return `<table>${rows.map((r) => r.html).join('')}</table>`;\n};\n","export class FormulaError {\n public code: string;\n public message: string;\n public error?: Error;\n public readonly __gsType = 'FormulaError' as const;\n constructor(code: string, message: string, error?: Error) {\n this.code = code;\n this.message = message;\n this.error = error;\n }\n static is(obj: any): obj is FormulaError {\n return obj instanceof FormulaError || obj?.__gsType === 'FormulaError';\n }\n toString() {\n return this.code;\n }\n}\n","import { a2p, buildIdentifiedRef, grantAddressAbsolute, p2a } from '../lib/coords';\nimport { Sheet } from '../lib/sheet';\nimport { Id, PointType } from '../types';\nimport { FormulaError } from './formula-error';\n\ntype EvaluateProps = {\n sheet: Sheet;\n};\n\ntype IdentityBaseProps = {\n slideY?: number;\n slideX?: number;\n operation?: 'move' | 'removeRows' | 'removeCols';\n dependency: Id;\n};\n\nexport type ProcessFormulaProps = IdentityBaseProps & {\n idMap?: { [id: string]: string };\n};\n\nexport type IdentifyProps = IdentityBaseProps & {\n sheet: Sheet;\n};\n\nexport type DisplayProps = {\n sheet: Sheet;\n slideY?: number;\n slideX?: number;\n};\n\n// strip sharp and dollars\nconst stripId = (idString: string, stripAbsolute = true) => {\n let id = idString;\n if (stripAbsolute && id.startsWith('$')) {\n id = id.slice(1);\n }\n if (stripAbsolute && id.endsWith('$')) {\n id = id.slice(0, -1);\n }\n return id.replace('#', '');\n};\n\nclass Entity<T = any> {\n public value: T;\n public ids: string[] = [];\n constructor(value: T) {\n this.value = value;\n }\n}\n\nexport class ValueEntity extends Entity {\n public evaluate() {\n return this.value;\n }\n}\n\nexport class UnreferencedEntity extends Entity {\n public evaluate() {\n throw new FormulaError('#REF!', `Reference does not exist.`);\n }\n}\n\nexport class InvalidRefEntity extends Entity<string> {\n public evaluate() {\n throw new FormulaError('#NAME?', `Invalid ref: ${this.value}`);\n }\n}\n\nexport class RefEntity extends Entity<string> {\n constructor(value: string) {\n super(value);\n }\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const { y, x } = a2p(parsed.addresses[0]);\n const t = parsed.sheet.trim({ top: y, left: x, bottom: y, right: x });\n return t;\n }\n\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const address = parsed.addresses[0];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids = [id];\n return `#${parsed.sheet.id}!${buildIdentifiedRef(id, absX, absY)}`;\n }\n}\n\nexport class RangeEntity extends Entity<string> {\n public stringify() {\n return this.value.toUpperCase();\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = parseRef(this.value, { sheet, dependency: '' });\n if (parsed.sheet == null) {\n throw new FormulaError('#REF!', `Unknown sheet: ${parsed.sheetName}`);\n }\n if (parsed.addresses.length === 0) {\n throw new FormulaError('#REF!', `Invalid address: ${this.value}`);\n }\n const area = parsed.sheet.rangeToArea(parsed.addresses.join(':'));\n const t = parsed.sheet.trim(area);\n return t;\n }\n public identify(props: IdentifyProps): string {\n const { slideY = 0, slideX = 0 } = props;\n const parsed = parseRef(this.value, props);\n if (parsed.sheet == null) {\n return this.value;\n }\n const formulas: string[] = [];\n for (let i = 0; i < parsed.addresses.length; i++) {\n const address = parsed.addresses[i];\n const { y, x, absX, absY } = a2p(address);\n const newPoint = {\n y: y + slideY,\n x: x + slideX,\n absX,\n absY,\n };\n const id = parsed.sheet.getId(newPoint);\n if (id == null) {\n return this.value;\n }\n this.ids.push(id);\n formulas.push(buildIdentifiedRef(id, absX, absY));\n }\n return `#${parsed.sheet.id}!${formulas.join(':')}`;\n }\n}\n\nexport class IdEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; id: string } {\n if (this.value.indexOf('!') !== -1) {\n const [sheetIdStr, id] = this.value.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, id: stripId(id, false) };\n }\n return { sheet, id: stripId(this.value, false) };\n }\n public evaluate({ sheet }: EvaluateProps) {\n const parsed = this.parse(sheet);\n if (parsed.id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const { y, x } = parsed.sheet.getPointById(parsed.id);\n const [absY, absX] = [Math.abs(y), Math.abs(x)];\n return parsed.sheet.trim({\n top: absY,\n left: absX,\n bottom: absY,\n right: absX,\n });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const address = parsed.sheet.getAddressById(parsed.id, slideY, slideX);\n if (!address) {\n return '#REF!';\n }\n if (parsed.sheet.id === sheet.id) {\n return address;\n }\n return `${parsed.sheet.sheetPrefix()}${address}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const address = this.display({ sheet, slideY, slideX });\n if (address == null || address.length < 2) {\n return '#?';\n }\n const { formula, ids } = parseRef(address, props);\n this.ids = ids;\n return formula || '#?';\n }\n}\n\nexport class IdRangeEntity extends Entity<string> {\n private parse(sheet: Sheet): { sheet: Sheet; ids: string[] } {\n const range = this.value;\n if (range.indexOf('!') !== -1) {\n const [sheetIdStr, idRange] = range.split('!'); // #id\n const sheetId = Number(sheetIdStr.slice(1));\n return { sheet: sheet.getSheetBySheetId(sheetId)!, ids: idRange.split(':') };\n }\n return { sheet, ids: range.split(':') };\n }\n\n public evaluate({ sheet }: EvaluateProps): Sheet {\n const parsed = this.parse(sheet);\n const ids = parsed.ids.map((id) => stripId(id));\n const ps: PointType[] = [];\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (id === '?') {\n throw new FormulaError('#REF!', `Reference does not exist`);\n }\n const p = parsed.sheet.getPointById(id);\n ps.push(p);\n }\n const [p1, p2] = ps;\n const [top, left, bottom, right] = [p1.y, p1.x, p2.y || parsed.sheet.numRows, p2.x || parsed.sheet.numCols];\n return parsed.sheet.trim({ top, left, bottom, right });\n }\n public display({ sheet, slideY = 0, slideX = 0 }: DisplayProps) {\n const parsed = this.parse(sheet);\n const range = parsed.ids\n .map((id) => stripId(id, false))\n .map((id) => parsed.sheet.getAddressById(id, slideY, slideX) || '#REF!')\n .join(':');\n if (parsed.sheet.id === sheet.id) {\n return range;\n }\n return `${parsed.sheet.sheetPrefix()}${range}`;\n }\n public identify(props: IdentifyProps): string {\n const { sheet, slideY = 0, slideX = 0 } = props;\n const range = this.display({ sheet, slideY, slideX });\n const { formula, ids } = parseRef(range, props);\n this.ids = ids;\n return formula ?? '';\n }\n}\n\nexport class FunctionEntity {\n public args: Expression[];\n public name: string;\n public precedence: number;\n private at?: Id;\n constructor(name: string, precedence = 0, args: Expression[] = [], at?: Id) {\n this.name = name;\n this.precedence = precedence;\n this.args = args;\n this.at = at;\n }\n\n public evaluate({ sheet }: EvaluateProps): any {\n const name = this.name.toLowerCase();\n const Func = sheet.getFunctionByName(name);\n if (Func == null) {\n throw new FormulaError('#NAME?', `Unknown function: ${name}`);\n }\n const func = new Func({ args: this.args, sheet, at: this.at });\n return func.call();\n }\n}\n\nexport type Expression =\n | ValueEntity\n | RefEntity\n | RangeEntity\n | IdEntity\n | IdRangeEntity\n | FunctionEntity\n | UnreferencedEntity\n | InvalidRefEntity;\n\nconst ZERO = new ValueEntity(0);\n\nexport type TokenType =\n | 'VALUE'\n | 'REF'\n | 'RANGE'\n | 'ID'\n | 'ID_RANGE'\n | 'FUNCTION'\n | 'PREFIX_OPERATOR'\n | 'INFIX_OPERATOR'\n | 'POSTFIX_OPERATOR'\n | 'OPEN'\n | 'CLOSE'\n | 'COMMA'\n | 'SPACE'\n | 'UNREFERENCED'\n | 'INVALID_REF';\n\nconst INFIX_FUNCTION_NAME_MAP = {\n '+': 'add',\n '-': 'minus',\n '/': 'divide',\n '*': 'multiply',\n '^': 'power',\n '&': 'concat',\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n};\n\nconst PREFIX_FUNCTION_NAME_MAP = {\n '-': 'uminus',\n};\n\nconst WHITESPACE_CHARS = new Set([' ', '\\n', '\\r', '\\t', '\\f']);\nconst SPECIAL_CHARS = new Set([...WHITESPACE_CHARS, '+', '-', '/', '*', '^', '&', '=', '<', '>', ')', ',', '%']);\n\nexport class Token {\n type: TokenType;\n entity: any;\n precedence: number;\n closed: boolean;\n private at?: Id;\n\n constructor(type: TokenType, entity: any, precedence = 0, at?: Id, closed = true) {\n this.type = type;\n this.entity = entity;\n this.precedence = precedence;\n this.at = at;\n this.closed = closed;\n }\n\n public length() {\n if (this.type === 'VALUE' && typeof this.entity === 'string') {\n return this.entity.length + (this.closed ? 2 : 1);\n }\n return new String(this.entity).length;\n }\n\n public stringify() {\n if (this.type === 'VALUE') {\n if (typeof this.entity === 'string') {\n return this.closed ? `\"${this.entity}\"` : `\"${this.entity}`;\n }\n if (typeof this.entity === 'boolean') {\n return this.entity ? 'TRUE' : 'FALSE';\n }\n }\n return this.entity as string;\n }\n\n public convert() {\n switch (this.type) {\n case 'VALUE':\n return new ValueEntity(this.entity);\n\n case 'ID':\n return new IdEntity(this.entity as string);\n\n case 'ID_RANGE':\n return new IdRangeEntity(this.entity as string);\n\n case 'REF':\n return new RefEntity(this.entity as string);\n\n case 'RANGE':\n return new RangeEntity(this.entity as string);\n\n case 'INFIX_OPERATOR': {\n const name = INFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof INFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'PREFIX_OPERATOR': {\n const name = PREFIX_FUNCTION_NAME_MAP[this.entity as keyof typeof PREFIX_FUNCTION_NAME_MAP];\n return new FunctionEntity(name, this.precedence, undefined, this.at);\n }\n case 'FUNCTION':\n return new FunctionEntity(this.entity as string, 0, [], this.at);\n\n case 'UNREFERENCED':\n return new UnreferencedEntity(this.entity);\n\n case 'INVALID_REF':\n return new InvalidRefEntity(this.entity as string);\n }\n }\n}\n\nconst isWhiteSpace = (char: string) => {\n return WHITESPACE_CHARS.has(char);\n};\n\nconst BOOLS: { [s: string]: boolean } = { ['true']: true, ['false']: false };\n\nconst TOKEN_OPEN = new Token('OPEN', '('),\n TOKEN_CLOSE = new Token('CLOSE', ')'),\n TOKEN_COMMA = new Token('COMMA', ',');\n\nconst INFIX_OPERATOR = 'INFIX_OPERATOR';\nconst PREFIX_OPERATOR = 'PREFIX_OPERATOR';\nconst POSTFIX_OPERATOR = 'POSTFIX_OPERATOR';\n\ntype LexerOption = {\n at?: Id;\n};\n\nexport class Lexer {\n private index: number;\n private formula: string;\n public tokens: Token[] = [];\n public foreign: boolean = false;\n public identifiedFormula: string = '';\n public dependencyIds: string[] = [];\n private at?: Id;\n\n constructor(formula: string, options?: LexerOption) {\n this.formula = formula;\n this.index = 0;\n this.tokens = [];\n this.at = options?.at;\n }\n\n private isWhiteSpace() {\n return isWhiteSpace(this.formula[this.index]);\n }\n\n private next(base = 1) {\n this.index += base;\n }\n\n private get(base = 0) {\n const c = this.formula[this.index + base];\n return c;\n }\n\n private getToken(base = 0) {\n return this.tokens[this.tokens.length + base];\n }\n\n public getTokenIndexByCharPosition(pos: number): [number, boolean] {\n // return [index, edge]\n let start = 0,\n end = 0;\n\n for (let i = 0; i < this.tokens.length; i++) {\n const token = this.tokens[i];\n end = start + token.length();\n if (start <= pos && pos <= end) {\n return [i, pos === start || pos === end];\n }\n start = end;\n }\n return [-1, false];\n }\n\n public getTokenPositionRange(index: number, slide = 1): [number, number] {\n let start = 0,\n end = 0;\n for (let i = 0; i < index; i++) {\n start = end;\n end += this.tokens[i].length();\n }\n return [start + slide, end + slide];\n }\n\n public stringify() {\n return this.tokens.map((t) => t.stringify()).join('');\n }\n\n public identify(props: IdentifyProps): void {\n const parts: string[] = [];\n const ids: string[] = [];\n for (const t of this.tokens) {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n parts.push(String(t.entity));\n } else {\n parts.push(t.closed ? `\"${t.entity}\"` : `\"${t.entity}`);\n }\n break;\n case 'ID': {\n const entity = new IdEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'ID_RANGE': {\n const entity = new IdRangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'REF': {\n const entity = new RefEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n case 'RANGE': {\n const entity = new RangeEntity(t.entity as string);\n parts.push(entity.identify(props));\n ids.push(...entity.ids);\n break;\n }\n default:\n parts.push(t.entity);\n break;\n }\n }\n this.identifiedFormula = parts.join('');\n this.dependencyIds = ids;\n }\n\n public display({ sheet }: DisplayProps) {\n return this.tokens\n .map((t) => {\n switch (t.type) {\n case 'VALUE':\n if (typeof t.entity === 'number' || typeof t.entity === 'boolean') {\n return t.entity;\n }\n return t.closed ? `\"${t.entity}\"` : `\"${t.entity}`;\n case 'ID':\n return new IdEntity(t.entity as string).display({ sheet });\n case 'ID_RANGE':\n return new IdRangeEntity(t.entity as string).display({ sheet });\n }\n return t.entity;\n })\n .join('');\n }\n\n public tokenize(idMap: { [id: Id]: Id } = {}) {\n while (this.index <= this.formula.length) {\n this.skipSpaces();\n let char = this.get();\n this.next();\n switch (char) {\n case undefined:\n return;\n case '(':\n this.tokens.push(TOKEN_OPEN);\n continue;\n case ')':\n this.tokens.push(TOKEN_CLOSE);\n continue;\n case ',':\n this.tokens.push(TOKEN_COMMA);\n continue;\n case '+':\n // TOKEN_PLUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '+', 3, this.at));\n continue;\n case '-': {\n const prev1 = this.getToken(-1)?.type;\n const prev2 = this.getToken(-2)?.type;\n if (prev1 === INFIX_OPERATOR || (prev1 === 'SPACE' && prev2 === INFIX_OPERATOR)) {\n // TOKEN_UMINUS(6)\n this.tokens.push(new Token(PREFIX_OPERATOR, '-', 6, this.at));\n } else {\n // TOKEN_MINUS(3)\n this.tokens.push(new Token(INFIX_OPERATOR, '-', 3, this.at));\n }\n continue;\n }\n case '/':\n // TOKEN_DIVIDE(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '/', 4, this.at));\n continue;\n case '*':\n // TOKEN_MULTIPLY(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '*', 4, this.at));\n continue;\n case '^':\n // TOKEN_POWER(5)\n this.tokens.push(new Token(INFIX_OPERATOR, '^', 5, this.at));\n continue;\n case '&':\n // TOKEN_CONCAT(4)\n this.tokens.push(new Token(INFIX_OPERATOR, '&', 4, this.at));\n continue;\n case '=':\n // TOKEN_EQ(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '=', 1, this.at));\n continue;\n case '>':\n if (this.get() === '=') {\n this.next();\n // TOKEN_GTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>=', 2, this.at));\n continue;\n }\n // TOKEN_GT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '>', 2, this.at));\n continue;\n case '<':\n if (this.get() === '=') {\n this.next();\n // TOKEN_LTE(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<=', 2, this.at));\n continue;\n }\n if (this.get() === '>') {\n this.next();\n // TOKEN_NE(1)\n this.tokens.push(new Token(INFIX_OPERATOR, '<>', 1, this.at));\n continue;\n }\n // TOKEN_LT(2)\n this.tokens.push(new Token(INFIX_OPERATOR, '<', 2, this.at));\n continue;\n case '\"': {\n const { buf, closed } = this.getString('\"');\n // TOKEN_VALUE(0)\n this.tokens.push(new Token('VALUE', buf, 0, this.at, closed));\n continue;\n }\n case \"'\": {\n const { buf } = this.getString(\"'\");\n char = `'${buf}'`;\n break;\n }\n case '!': {\n this.foreign = true;\n break;\n // not continue\n }\n case '%': {\n // TOKEN_PERCENT(4)\n this.tokens.push(new Token(POSTFIX_OPERATOR, '%', 4, this.at));\n continue;\n }\n } // switch end\n let buf = char;\n\n while (true) {\n const c = this.get();\n if (c === '(') {\n // TOKEN_FUNCTION(0)\n this.tokens.push(new Token('FUNCTION', buf, 0, this.at), TOKEN_OPEN);\n this.next();\n break;\n }\n if (c == null || SPECIAL_CHARS.has(c)) {\n if (buf.length === 0) {\n break;\n }\n if (buf.match(/^[+-]?(\\d*[.])?\\d+$/)) {\n this.tokens.push(new Token('VALUE', parseFloat(buf), 0, this.at));\n } else {\n const bool = BOOLS[buf.toLowerCase()];\n if (bool != null) {\n this.tokens.push(new Token('VALUE', bool, 0, this.at));\n } else if (buf.startsWith('#')) {\n if (buf.indexOf('#REF!') !== -1) {\n this.tokens.push(new Token('UNREFERENCED', buf, 0, this.at));\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('ID_RANGE', resolveIdRange(buf, idMap), 0, this.at));\n } else {\n this.tokens.push(new Token('ID', buf, 0, this.at));\n }\n } else if (buf.indexOf(':') !== -1) {\n this.tokens.push(new Token('RANGE', buf, 0, this.at));\n } else {\n // A token containing '.' alongside letters is a partial function name\n // (e.g. \"RANGE.1\" before the opening paren), not a cell reference.\n const looksLikeFunctionName = buf.includes('.') && /[a-zA-Z]/.test(buf);\n if (looksLikeFunctionName || isNaN(buf[buf.length - 1] as unknown as number)) {\n this.tokens.push(new Token('INVALID_REF', buf, 0, this.at));\n } else {\n this.tokens.push(new Token('REF', buf, 0, this.at));\n }\n }\n }\n break;\n }\n buf += c;\n this.next();\n }\n }\n }\n private skipSpaces() {\n let space: string = '';\n while (this.isWhiteSpace()) {\n space += this.formula[this.index++];\n }\n if (space !== '') {\n this.tokens.push(new Token('SPACE', space, 0, this.at));\n }\n }\n\n private getString(quote = '\"'): { buf: string; closed: boolean } {\n let buf = '';\n\n while (true) {\n const c = this.get();\n this.next();\n if (c == null) {\n return { buf, closed: false };\n }\n if (c === quote) {\n if (quote === '\"' && this.get() === quote) {\n // escape for double quotes\n buf += quote;\n this.next();\n continue;\n } else if (quote === \"'\" && this.get() === quote) {\n // keep consecutive single quotes as is\n buf += c;\n continue;\n } else {\n return { buf, closed: true };\n }\n } else {\n buf += c;\n }\n }\n }\n}\n\nconst resolveIdRange = (range: string, idMap: { [id: Id]: Id }) => {\n const [sheetId, refString] = range.split('!');\n const refs = refString.split(':');\n const done = new Set<number>();\n Object.keys(idMap).forEach((before) => {\n const after = idMap[before];\n // #x -> #y, #$x -> #$y, #x$ -> #y$, #$x$ -> #$y$\n const regex = new RegExp(`(\\\\$)?#${before}\\\\b(\\\\$)?`);\n for (let i = 0; i < refs.length; i++) {\n if (done.has(i)) {\n continue;\n }\n const ref = refs[i];\n const replaced = ref.replace(regex, (_: string, prefix: string, suffix: string) => {\n return `${prefix || ''}#${after}${suffix || ''}`;\n });\n if (replaced === ref) {\n continue;\n }\n refs[i] = replaced;\n done.add(i);\n }\n });\n return `${sheetId}!${refs.join(':')}`;\n};\n\nexport class Parser {\n public index = 0;\n public depth = 0;\n public tokens: Token[];\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n public build() {\n const { expr } = this.parse(false);\n return expr;\n }\n\n private parse(underFunction: boolean) {\n const stack: Expression[] = [];\n let lastOperator: undefined | FunctionEntity;\n\n const complement = (hasNext = false) => {\n if (lastOperator) {\n const outer = stack.pop();\n lastOperator.args.push(outer!);\n }\n return { hasNext, expr: stack.shift() };\n };\n\n while (this.tokens.length > this.index) {\n const token = this.tokens[this.index++];\n if (token.type === 'SPACE') {\n continue;\n }\n if (token.type === 'COMMA') {\n if (!underFunction) {\n throw new FormulaError('#ERROR!', 'Invalid comma');\n }\n return complement(true);\n } else if (\n token.type === 'VALUE' ||\n token.type === 'ID' ||\n token.type === 'ID_RANGE' ||\n token.type === 'REF' ||\n token.type === 'RANGE' ||\n token.type === 'UNREFERENCED' ||\n token.type === 'INVALID_REF'\n ) {\n const expr = token.convert();\n stack.push(expr!);\n } else if (token.type === 'POSTFIX_OPERATOR' && token.entity === '%') {\n const expr = stack.pop();\n if (!expr) {\n throw new FormulaError('#ERROR!', 'Missing expression before %');\n }\n const divideBy100 = new FunctionEntity('divide', 4, [expr, new ValueEntity(100)]);\n stack.push(divideBy100);\n } else if (token.type === 'FUNCTION') {\n this.index++;\n this.depth++;\n const func = token.convert() as FunctionEntity;\n stack.push(func);\n\n while (true) {\n const { expr, hasNext } = this.parse(true);\n if (expr) {\n func.args.push(expr);\n }\n if (!hasNext) {\n break;\n }\n }\n } else if (token.type === 'OPEN') {\n this.depth++;\n const { expr } = this.parse(false);\n stack.push(expr!);\n } else if (token.type === 'CLOSE') {\n if (this.depth-- === 0) {\n throw new FormulaError('#ERROR!', 'Unexpected end paren');\n }\n return complement();\n } else if (token.type === 'INFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n let left = stack.pop();\n if (left == null) {\n if (operator.name === 'minus' || operator.name === 'add') {\n left = ZERO;\n } else {\n throw new FormulaError('#ERROR!', 'Missing left expression');\n }\n }\n\n if (lastOperator == null) {\n operator.args.push(left);\n stack.unshift(operator);\n } else if (operator.precedence > lastOperator.precedence) {\n operator.args.push(left);\n lastOperator.args.push(operator);\n stack.unshift(lastOperator);\n } else {\n const outer = stack.shift();\n operator.args.push(outer!);\n lastOperator.args.push(left);\n stack.unshift(operator);\n }\n lastOperator = operator;\n } else if (token.type === 'PREFIX_OPERATOR') {\n const operator = token.convert() as FunctionEntity;\n if (lastOperator) {\n lastOperator.args.push(operator);\n } else {\n stack.unshift(operator);\n }\n lastOperator = operator;\n }\n }\n return complement();\n }\n}\n\n/** Alias for Parser, exported for external tooling (e.g. Debugger). */\nexport const FormulaParser = Parser;\n\nexport const stripSheetName = (sheetName: string) => {\n if (sheetName.charAt(0) === \"'\") {\n sheetName = sheetName.slice(1);\n }\n if (sheetName.charAt(sheetName.length - 1) === \"'\") {\n sheetName = sheetName.slice(0, -1);\n }\n return sheetName;\n};\n\nexport function splitRef(ref: string): { sheetName: string | undefined; addresses: string[] } {\n let sheetName: string | undefined = undefined;\n let addresses: string[] = [];\n\n if (ref.startsWith(\"'\")) {\n let i = 1;\n let name = '';\n\n while (i < ref.length) {\n const char = ref[i];\n const nextChar = ref[i + 1];\n\n if (char === \"'\") {\n if (nextChar === \"'\") {\n name += \"'\";\n i += 2;\n } else if (nextChar === '!') {\n i += 2;\n break;\n } else {\n return { sheetName: undefined, addresses: [] };\n }\n } else {\n name += char;\n i++;\n }\n }\n\n sheetName = name;\n const addressPart = ref.slice(i).trim();\n addresses = addressPart.split(':');\n } else {\n const excl = ref.indexOf('!');\n if (excl !== -1) {\n sheetName = ref.slice(0, excl);\n const addressPart = ref.slice(excl + 1).trim();\n addresses = addressPart.split(':');\n } else {\n addresses = ref.trim().split(':');\n }\n }\n return { sheetName, addresses };\n}\n\nexport const parseRef = (\n ref: string,\n { sheet, operation, dependency }: IdentifyProps,\n): {\n sheet: Sheet;\n sheetId?: number;\n formula?: string;\n sheetName?: string;\n addresses: string[];\n ids: string[];\n} => {\n const { sheetName, addresses } = splitRef(ref);\n const ids: string[] = [];\n if (sheetName) {\n sheet = sheet.getSheetBySheetName(sheetName)!;\n if (sheet == null) {\n return { sheet, sheetName, addresses, ids };\n }\n }\n if (addresses.length === 0) {\n return { sheet, sheetName, addresses, ids };\n }\n const refs: string[] = [];\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i];\n const { y, x, absX, absY } = a2p(address);\n let id = sheet.getId({ y, x });\n\n // if the id is the same as the dependency by the operation,\n // we need to adjust the id based on the operation\n if (id === dependency) {\n if (operation === 'removeRows') {\n id = sheet.getId({ y: y - 1, x });\n } else if (operation === 'removeCols') {\n id = sheet.getId({ y, x: x - 1 });\n }\n }\n if (id == null) {\n refs.push(grantAddressAbsolute(address, !!absX, !!absY) || '?');\n continue;\n }\n ids.push(id);\n refs.push(`${absX ? '$' : ''}#${id}${absY ? '$' : ''}`);\n }\n let formula = `#${sheet.id}!${refs.join(':')}`;\n return {\n sheet,\n sheetName,\n addresses,\n ids,\n formula,\n };\n};\n","import type { AsyncCache, CellType, System } from '../types';\n\nexport const filterCellFields = (cell: CellType, ignoreFields: (keyof CellType)[]): CellType => {\n if (ignoreFields.length === 0) {\n return cell;\n }\n return Object.fromEntries(\n Object.entries(cell).filter(([key]) => !ignoreFields.includes(key as keyof CellType)),\n ) as CellType;\n};\n\n/**\n * Ensure that `registry.systems[id]` exists, initialising it with sensible\n * defaults when missing. Any keys present in `defaults` that are absent on\n * the existing System object are filled in.\n * Returns the (possibly freshly-created) `System` object.\n */\nexport const ensureSys = (\n registry: { systems: Record<string, System> },\n id: string,\n defaults: Partial<System> = {},\n): System => {\n if (registry.systems[id] == null) {\n registry.systems[id] = {};\n }\n const sys = registry.systems[id];\n for (const key of Object.keys(defaults) as (keyof System)[]) {\n (sys as any)[key] ??= defaults[key];\n }\n return sys;\n};\n\n/**\n * Write an `AsyncCache` entry into `cell.asyncCaches[key]`, creating the\n * `asyncCaches` record if it does not yet exist.\n */\nexport const setAsyncCache = (cell: CellType, key: string, ac: AsyncCache): void => {\n if (!cell.asyncCaches) {\n cell.asyncCaches = {};\n }\n cell.asyncCaches[key] = ac;\n};\n","import type { Address, AreaType, CellsByAddressType, CellType, Id } from '../types';\nimport type { UserSheet } from './sheet';\nimport { a2p, p2a, x2c, c2x, y2r } from './coords';\nimport { createMatrix } from './spatial';\nimport { filterCellFields } from './cell';\nimport type { CellFilter, Resolution } from '../types';\nimport type { SolveOptions } from '../formula/solver';\n\nconst noFilter: CellFilter = () => true;\n\ntype CellField = keyof CellType;\n\ntype ToProps = {\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n};\n\ntype ToCellProps = ToProps & {\n ignoreFields?: CellField[];\n};\n\n/**\n * @internal — used by Sheet._toValueMatrix and solver.ts; keeps resolution for internal wiring.\n */\n\nexport type ToValueMatrixProps = ToProps & {\n area?: AreaType;\n};\n\nexport type ToCellMatrixProps = ToCellProps & {\n area?: AreaType;\n};\n\nexport type ToValueObjectProps = ToProps & {\n addresses?: Address[];\n};\n\nexport type ToCellObjectProps = ToCellProps & {\n addresses?: Address[];\n};\n\nexport type ToValueRowsProps = ToProps & {\n rows?: number[];\n};\n\nexport type ToCellRowsProps = ToCellProps & {\n rows?: number[];\n};\n\nexport type ToValueColsProps = ToProps & {\n cols?: (number | string)[];\n};\n\nexport type ToCellColsProps = ToCellProps & {\n cols?: (number | string)[];\n};\n\nexport const getCellByAddress = (\n sheet: UserSheet,\n address: Address,\n options: SolveOptions = {},\n): CellType | undefined => {\n const point = a2p(address);\n return sheet.getCell(point, options);\n};\n\nexport const toValueMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, asScalar = false }: ToValueMatrixProps = {},\n): any[][] => {\n return sheet.__raw__._toValueMatrix({ area, resolution, raise, filter, asScalar });\n};\n\nexport const toValueObject = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, addresses, asScalar = false }: ToValueObjectProps = {},\n): { [address: Address]: any } => {\n const result: { [Address: Address]: any } = {};\n if (addresses) {\n for (const addr of addresses) {\n const point = a2p(addr);\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy(point);\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point });\n }\n result[addr] = fieldValue;\n }\n }\n return result;\n }\n const { top, left, bottom, right } = sheet.area;\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n result[p2a({ y, x })] = fieldValue;\n }\n }\n }\n return result;\n};\n\nexport const toValueRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, asScalar = false }: ToValueRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n row[x2c(x)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toValueCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, asScalar = false }: ToValueColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = sheet.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: sheet.__raw__, point: { y, x } });\n }\n col[y2r(y)] = fieldValue as any;\n }\n }\n }\n return result;\n};\n\nexport const toCellMatrix = (\n sheet: UserSheet,\n { area, resolution = 'RESOLVED', raise = false, filter = noFilter, ignoreFields = [] }: ToCellMatrixProps = {},\n): (CellType | null)[][] => {\n const { top, left, bottom, right } = area ?? {\n top: 1,\n left: 1,\n bottom: sheet.area.bottom,\n right: sheet.area.right,\n };\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n const filteredCell = filterCellFields(cell, ignoreFields);\n matrix[y - top][x - left] = filteredCell;\n }\n }\n }\n return matrix;\n};\n\nexport const toCellObject = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, addresses, ignoreFields = [] }: ToCellObjectProps = {},\n): CellsByAddressType => {\n const result: CellsByAddressType = {};\n if (addresses) {\n for (const addr of addresses) {\n const cell = getCellByAddress(sheet, addr, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[addr] = filterCellFields(cell, ignoreFields);\n }\n }\n return result;\n }\n const { bottom, right } = sheet.area;\n for (let y = 1; y <= bottom; y++) {\n for (let x = 1; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n result[p2a({ y, x })] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const toCellRows = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, rows, ignoreFields = [] }: ToCellRowsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const ys = rows ?? Array.from({ length: sheet.numRows }, (_, i) => top + i);\n for (const y of ys) {\n const row: CellsByAddressType = {};\n result.push(row);\n for (let x = left; x <= right; x++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n row[x2c(x)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n\nexport const escapeSheetName = (name: string): string => {\n const escaped = name.replace(/'/g, \"''\");\n return `'${escaped}'`;\n};\n\nexport const toSheetPrefix = (name?: string): string => {\n if (name) {\n return `${escapeSheetName(name)}!`;\n }\n return '';\n};\n\nexport const toCellCols = (\n sheet: UserSheet,\n { resolution = 'RESOLVED', raise = false, filter = noFilter, cols, ignoreFields = [] }: ToCellColsProps = {},\n): CellsByAddressType[] => {\n const result: CellsByAddressType[] = [];\n const { top, left, bottom, right } = sheet.area;\n const xs = cols\n ? cols.map((c) => (typeof c === 'string' ? c2x(c) : c))\n : Array.from({ length: sheet.numCols }, (_, i) => left + i);\n for (const x of xs) {\n const col: CellsByAddressType = {};\n result.push(col);\n for (let y = top; y <= bottom; y++) {\n const cell = sheet.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n col[y2r(y)] = filterCellFields(cell, ignoreFields);\n }\n }\n }\n return result;\n};\n","import type { PointType } from '../types';\nimport type { Sheet } from './sheet';\nimport { Lexer, splitRef } from '../formula/evaluator';\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from '../constants';\nimport { a2p, grantAddressAbsolute } from './coords';\nimport { toSheetPrefix } from './sheet_utils';\nimport { focus } from './dom';\n\nexport const insertTextAtCursor = (input: HTMLTextAreaElement, text: string) => {\n focus(input);\n const deprecated = !document.execCommand?.('insertText', false, text);\n if (!deprecated) {\n return;\n }\n input.setRangeText(text, input.selectionStart, input.selectionEnd, 'end');\n return;\n};\n\ntype InsertRefProps = {\n input: HTMLTextAreaElement | null;\n ref: string;\n dryRun?: boolean;\n};\n\nexport const insertRef = ({ input, ref, dryRun = false }: InsertRefProps): boolean => {\n // dryRun is used to check if the ref can be inserted without actually inserting it\n if (!input?.value?.startsWith('=') || input.selectionStart === 0) {\n return false;\n }\n const lexer = new Lexer(input.value.substring(1));\n lexer.tokenize();\n const [tokenIndex, _] = lexer.getTokenIndexByCharPosition(input.selectionStart - 1);\n let token = lexer.tokens[tokenIndex];\n if (token?.type === 'SPACE') {\n token = lexer.tokens[tokenIndex - 1];\n }\n if (\n token == null ||\n token.type === 'OPEN' ||\n token.type === 'COMMA' ||\n token.type === 'INFIX_OPERATOR' ||\n token.type === 'PREFIX_OPERATOR'\n ) {\n if (!dryRun) {\n insertTextAtCursor(input, ref);\n }\n } else if (token.type === 'REF' || token.type === 'RANGE') {\n if (!dryRun) {\n // keep the absolute/relative state of the token\n const { sheetName: refSheetName, addresses: refAddresses } = splitRef(ref);\n const { addresses: tokenAddresses } = splitRef(token.entity as string);\n\n const tokenAbsolutes = tokenAddresses.map((a) => a2p(a));\n if (tokenAddresses.length === 2 && refAddresses.length === 1) {\n refAddresses.push(refAddresses[0]);\n }\n ref =\n toSheetPrefix(refSheetName) +\n refAddresses\n .map((r, i) => {\n return grantAddressAbsolute(r, !!tokenAbsolutes[i]?.absX, !!tokenAbsolutes[i]?.absY);\n })\n .join(':');\n\n const [start, end] = lexer.getTokenPositionRange(tokenIndex + 1, 1);\n input.setSelectionRange(start, end);\n insertTextAtCursor(input, ref);\n }\n } else {\n return false;\n }\n return true;\n};\n\nexport const isRefInsertable = (input: HTMLTextAreaElement | null): boolean => {\n return insertRef({ input, ref: '', dryRun: true });\n};\n\nexport const expandInput = (input: HTMLTextAreaElement | null) => {\n if (input == null) {\n return;\n }\n input.style.width = `${input.scrollWidth}px`;\n input.style.height = `${input.scrollHeight}px`;\n};\n\nexport const resetInput = (input: HTMLTextAreaElement | null, sheet: Sheet, point: PointType) => {\n const style = input?.style;\n if (style == null) {\n return;\n }\n const width = sheet.getCell({ x: point.x, y: 0 }, { resolution: 'SYSTEM' })?.width ?? DEFAULT_WIDTH;\n const height = sheet.getCell(point, { resolution: 'SYSTEM' })?.height ?? DEFAULT_HEIGHT;\n style.width = `${width}px`;\n style.height = `${height}px`;\n};\n\nexport const isFocus = (input: HTMLTextAreaElement | null): boolean => {\n if (typeof window === 'undefined' || input == null) {\n return false;\n }\n return document.activeElement === input;\n};\n\n/**\n * Handles auto-close behavior for double quotes in formula editing.\n * - Typing `\"` inserts `\"\"` and places cursor between them.\n * - Typing `\"` when cursor is right before an auto-closed `\"` skips over it.\n * - Backspace between empty `\"\"` deletes both quotes.\n *\n * Returns true if the event was handled (caller should preventDefault), false otherwise.\n */\nexport const handleFormulaQuoteAutoClose = (\n e: React.KeyboardEvent<HTMLTextAreaElement>,\n inputting: string,\n): boolean => {\n const input = e.currentTarget;\n const isFormula = inputting.startsWith('=');\n if (!isFormula) {\n return false;\n }\n\n const { selectionStart, selectionEnd } = input;\n\n if (e.key === '\"') {\n // If text is selected, wrap it in quotes\n if (selectionStart !== selectionEnd) {\n e.preventDefault();\n const selectedText = inputting.slice(selectionStart, selectionEnd);\n insertTextAtCursor(input, `\"${selectedText}\"`);\n requestAnimationFrame(() => {\n input.setSelectionRange(selectionStart + 1, selectionEnd + 1);\n });\n return true;\n }\n\n const charAfter = inputting[selectionStart];\n\n // Count unescaped double quotes before cursor (after '=') to determine if we're inside a string\n const beforeCursor = inputting.slice(1, selectionStart); // skip '='\n let quoteCount = 0;\n for (let i = 0; i < beforeCursor.length; i++) {\n if (beforeCursor[i] === '\"') {\n // Skip escaped double quotes (\"\") inside strings\n if (i + 1 < beforeCursor.length && beforeCursor[i + 1] === '\"') {\n i++; // skip the next quote\n } else {\n quoteCount++;\n }\n }\n }\n\n // If odd number of quotes before cursor, we're inside a string.\n // If the next char is `\"`, it's the closing quote — skip over it.\n if (quoteCount % 2 === 1 && charAfter === '\"') {\n e.preventDefault();\n input.setSelectionRange(selectionStart + 1, selectionStart + 1);\n return true;\n }\n\n // Otherwise, insert `\"\"` and place cursor in between\n e.preventDefault();\n insertTextAtCursor(input, '\"\"');\n requestAnimationFrame(() => {\n input.setSelectionRange(selectionStart + 1, selectionStart + 1);\n });\n return true;\n }\n\n if (e.key === 'Backspace') {\n // If cursor is between `\"\"`, delete both\n if (\n selectionStart === selectionEnd &&\n selectionStart > 0 &&\n inputting[selectionStart - 1] === '\"' &&\n inputting[selectionStart] === '\"'\n ) {\n e.preventDefault();\n input.setRangeText('', selectionStart - 1, selectionStart + 1, 'end');\n input.dispatchEvent(new Event('input', { bubbles: true }));\n return true;\n }\n }\n\n return false;\n};\n","export const COLOR_PALETTE = [\n // orange\n '#FF6600',\n // purple\n '#AA44FF',\n // emeraldblue\n '#00CCCC',\n // peach\n '#EEAAEE',\n // yellow\n '#DDDD00',\n // winered\n '#AA4444',\n // lightgreen\n '#00FF00',\n // pink\n '#FF00FF',\n // navy\n '#3366FF',\n // cyan\n '#008888',\n];\n","export class Sentinel {\n public readonly __gsType = 'Sentinel' as const;\n constructor(public readonly code: string) {}\n\n is(obj: any): obj is this {\n return Sentinel.is(obj, this.code);\n }\n\n static is(obj: any, code?: string): obj is Sentinel {\n const match = obj instanceof Sentinel || obj?.__gsType === 'Sentinel';\n if (!match) {\n return false;\n }\n return code == null || obj.code === code;\n }\n}\n\nexport const SOLVING = new Sentinel('solving');\n\n/**\n * Sentinel value representing an in-flight async formula computation.\n * Cells whose solved cache contains a Pending will render a loading indicator.\n * Dependent cells that encounter a Pending value also become pending.\n */\nexport class Pending<T = unknown> {\n private readonly timestamp: number;\n\n public readonly promise: Promise<T>;\n public readonly __gsType = 'Pending' as const;\n\n constructor(promise: Promise<T>) {\n this.promise = promise;\n this.timestamp = Date.now();\n }\n\n static is(obj: any): obj is Pending {\n return obj instanceof Pending || obj?.__gsType === 'Pending';\n }\n\n toString(): string {\n return `<Pending #${this.timestamp}>`;\n }\n}\n\n/**\n * Returned by functions that want to spill a 2D result into adjacent cells.\n *\n * Usage in a function:\n * return new Spilling([[1, 2], [3, 4]]);\n *\n * The solver detects Spilling via `Spilling.is()` and calls\n * `sheet.spill(origin, result.matrix)` to perform obstruction checks\n * and write values into the solvedCaches.\n */\nexport class Spilling {\n public readonly __gsType = 'Spilling' as const;\n /** The 2D matrix of resolved values. matrix[row][col] */\n public readonly matrix: any[][];\n\n constructor(matrix: any[] | any[][]) {\n this.matrix = this.ensure2D(matrix);\n }\n\n private ensure2D(matrix: any[] | any[][]): any[][] {\n if (matrix.length === 0) {\n return [];\n }\n if (Array.isArray(matrix[0])) {\n return matrix as any[][];\n }\n // 1D array is treated as a single row (horizontal expansion).\n // e.g. [1, 2, 3] → [[1, 2, 3]]\n // To expand vertically instead, use: matrix.map(v => [v])\n return [matrix as any[]];\n }\n\n static is(obj: any): obj is Spilling {\n return obj instanceof Spilling || obj?.__gsType === 'Spilling';\n }\n}\n","import { DEFAULT_HISTORY_LIMIT, RESET_ZONE } from '../constants';\nimport { Pending } from '../sentinels';\n\nimport type {\n HistoryType,\n RefPaletteType,\n SheetIdsByName,\n ContextsBySheetId,\n ZoneType,\n CellsByIdType,\n SystemsByIdType,\n System,\n Id,\n StoreDispatchType,\n FeedbackType,\n EditorEvent,\n CursorStateType,\n} from '../types';\nimport type { UserSheet } from './sheet';\nimport { useEffect, useState } from 'react';\nimport { updateSheet } from '../store/actions';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { functions as functionsDefault } from '../formula/mapping';\nimport { PolicyType } from '../policy/core';\n\nexport type RegistryProps = {\n historyLimit?: number;\n additionalFunctions?: FunctionMapping;\n policies?: { [policyName: string]: PolicyType | null };\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n};\n\nexport type BookProps = RegistryProps;\n\nexport class Registry {\n sheetHead: number = 0;\n cellHead: number = 0;\n data: CellsByIdType = {};\n systems: SystemsByIdType = {};\n sheetIdsByName: SheetIdsByName = {};\n contextsBySheetId: ContextsBySheetId = {};\n choosingSheetId: number = 0;\n choosingAddress: string = '';\n editingSheetId: number = 0;\n editingAddress: string = '';\n paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n lastFocused: HTMLTextAreaElement | null = null;\n solvedCaches: Map<Id, any> = new Map();\n /** IDs of non-origin cells that received spilled values (populated in spill(), cleared in clearSolvedCaches()). */\n lastSpilledTargetIds: Set<Id> = new Set();\n /** Currently in-flight async formula Pending sentinels (keyed by cell ID). */\n asyncPending: Map<string, Pending> = new Map();\n /** In-flight async formulas shared by cache key (for useInflight). */\n asyncInflight?: Map<string, { pending: Pending; expireTime?: number }>;\n copyingSheetId: number = 0;\n copyingZone: ZoneType = RESET_ZONE;\n cutting: boolean = false;\n histories: HistoryType[] = [];\n historyIndex: number = -1;\n historyLimit: number = DEFAULT_HISTORY_LIMIT;\n lastHistory?: HistoryType;\n currentHistory?: HistoryType;\n /** StrictMode guard: Map from action object (identity) to cached reducer result.\n * Using a Map instead of a single slot allows multiple batched dispatches to coexist. */\n _strictModeCache?: Map<unknown, unknown>;\n /** StrictMode guard: Map from useId component key to assigned sheetId.\n * Prevents double-increment of sheetHead when useState initializer runs twice in Strict Mode. */\n _componentSheetIds: Map<string, number> = new Map();\n ready = false;\n functions: FunctionMapping = {};\n policies: { [policyName: string]: PolicyType | null } = {};\n onSave?: FeedbackType;\n onChange?: FeedbackType;\n onRemoveRows?: (args: { sheet: UserSheet; ys: number[] }) => void;\n onRemoveCols?: (args: { sheet: UserSheet; xs: number[] }) => void;\n onInsertRows?: (args: { sheet: UserSheet; y: number; numRows: number }) => void;\n onInsertCols?: (args: { sheet: UserSheet; x: number; numCols: number }) => void;\n onSelect?: FeedbackType;\n onKeyUp?: (args: { e: EditorEvent; points: CursorStateType }) => void;\n onInit?: (args: { sheet: UserSheet }) => void;\n\n transmit: (newBook?: TransmitProps) => void = (newBook?: TransmitProps) => {\n // This method will be overridden by useBook\n };\n\n public boot() {\n if (this.ready || Object.keys(this.contextsBySheetId).length === 0) {\n return;\n }\n const keys = Object.keys(this.contextsBySheetId);\n const tobe: StoreDispatchType[] = [];\n for (let i = 0; i < keys.length; i++) {\n const sheetId = keys[i];\n const storeDispatch = this.contextsBySheetId[sheetId];\n const sheet = storeDispatch.store.sheetReactive.current;\n if (!sheet || sheet.status === 0) {\n return;\n }\n tobe.push(storeDispatch);\n }\n for (let i = 0; i < tobe.length; i++) {\n const { store, dispatch } = tobe[i];\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n continue;\n }\n sheet.resolveFormulas();\n dispatch(updateSheet(sheet));\n }\n this.ready = true;\n }\n\n constructor({\n historyLimit,\n additionalFunctions,\n policies = {},\n onSave,\n onChange,\n onRemoveRows,\n onRemoveCols,\n onInsertRows,\n onInsertCols,\n onSelect,\n onKeyUp,\n onInit,\n }: RegistryProps = {}) {\n if (historyLimit != null) {\n this.historyLimit = historyLimit;\n }\n this.functions = {\n ...functionsDefault,\n ...additionalFunctions,\n };\n for (const fnName in this.functions) {\n const fn = this.functions[fnName];\n fn.__name = fnName;\n }\n this.policies = policies;\n this.onSave = onSave;\n this.onChange = onChange;\n this.onRemoveRows = onRemoveRows;\n this.onRemoveCols = onRemoveCols;\n this.onInsertRows = onInsertRows;\n this.onInsertCols = onInsertCols;\n this.onSelect = onSelect;\n this.onKeyUp = onKeyUp;\n this.onInit = onInit;\n }\n}\n\nexport type TransmitProps = Partial<Registry>;\n\nexport const createRegistry = (props: RegistryProps = {}) => {\n return new Registry(props);\n};\n\n/** @deprecated use createRegistry */\nexport const createBinding = createRegistry;\n\nexport type BookType = {\n registry: Registry;\n};\n\nexport const createBook = (props: RegistryProps = {}): BookType => {\n return { registry: createRegistry(props) };\n};\n\nexport const useBook = (props: RegistryProps = {}) => {\n const [book, setBook] = useState<BookType>(() => createBook(props));\n const { registry } = book;\n registry.transmit = (patch?: TransmitProps) => {\n Object.assign(registry, patch);\n if (!registry.ready) {\n return;\n }\n requestAnimationFrame(() => setBook({ registry }));\n };\n useEffect(() => {\n Object.assign(registry, props);\n }, [props]);\n return book;\n};\n","import dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc.js';\nimport timezone from 'dayjs/plugin/timezone.js';\ndayjs.extend(timezone);\ndayjs.extend(utc);\n\nconst NUMS = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);\nconst NUMS_Z = new Set([...NUMS, 'Z', 'z']);\nconst JFMASOND = new Set(['J', 'F', 'M', 'A', 'S', 'O', 'N', 'D', ...NUMS]);\nconst NBRYNLGPTVC = new Set(['N', 'B', 'R', 'Y', 'N', 'L', 'G', 'P', 'T', 'V', 'C', ...NUMS_Z]);\n\n// Reject strings that contain words not typically found in date representations.\n// Date strings consist of month names, digits, separators, and timezone abbreviations.\n// If a word is purely alphabetic and not a recognized date token, it's likely not a date.\nconst DATE_WORDS = new Set([\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n 'january',\n 'february',\n 'march',\n 'april',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n 'mon',\n 'tue',\n 'wed',\n 'thu',\n 'fri',\n 'sat',\n 'sun',\n 'monday',\n 'tuesday',\n 'wednesday',\n 'thursday',\n 'friday',\n 'saturday',\n 'sunday',\n 'am',\n 'pm',\n 'utc',\n 'gmt',\n 'est',\n 'cst',\n 'mst',\n 'pst',\n 'jst',\n 'cet',\n 'eet',\n 'ist',\n 'aest',\n 'edt',\n 'cdt',\n 'mdt',\n 'pdt',\n 'bst',\n 'hst',\n 'akst',\n 'akdt',\n 'nzst',\n 'nzdt',\n 't',\n 'z',\n]);\n\nexport function parseDate(value: string): Date | undefined {\n const first = value[0];\n if (first == null || !JFMASOND.has(first.toUpperCase())) {\n return;\n }\n if (!NBRYNLGPTVC.has(value[value.length - 1].toUpperCase())) {\n return;\n }\n if (value.match(/[=*&#@!?[\\]{}\"'()|%\\\\<>~+\\r\\n]/)) {\n return;\n }\n const words = value.split(/[\\s,/\\-:.]+/).filter(Boolean);\n for (const word of words) {\n if (/^[a-zA-Z]+$/.test(word) && !DATE_WORDS.has(word.toLowerCase())) {\n return;\n }\n }\n let timeZone = 'UTC';\n try {\n timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch (e) {}\n try {\n const day = dayjs.tz(value, timeZone);\n return day.toDate();\n } catch (e) {}\n}\n","import type { FC, ReactNode } from 'react';\nimport type { CellPatchType, CellType, OperationType, PointType } from '../types';\nimport type { Sheet, UserSheet } from '../lib/sheet';\nimport { isSheet } from '../formula/functions/__base';\nimport dayjs from 'dayjs';\nimport { FormulaError } from '../formula/formula-error';\nimport { Pending } from '../sentinels';\nimport { Time } from '../lib/time';\nimport { parseDate } from '../lib/date';\n\nexport type AutocompleteOption = {\n value: any;\n label?: any;\n keywords?: string[];\n tooltip?: ReactNode | FC<{ value?: any }>;\n};\n\nexport type SelectProps = {\n sheet: UserSheet;\n point: PointType;\n current?: CellType;\n next?: CellType;\n operation: OperationType;\n};\n\nexport type SerializeForClipboardProps = {\n sheet: UserSheet;\n point: PointType;\n};\n\nexport type SelectFallbackProps = {\n sheet: UserSheet;\n point: PointType;\n value: any;\n};\n\nexport type Scalar = string | number | boolean | null | undefined;\n\nexport type ScalarProps<T = any> = {\n value?: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type RenderProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n apply?: (sheet: UserSheet) => void;\n};\n\nexport type SerializeProps<T = any> = {\n value: T;\n cell?: CellType<T>;\n sheet: Sheet;\n point: PointType;\n};\n\nexport type PolicyMixinType = {\n // format settings\n datetimeFormat?: string;\n dateFormat?: string;\n timeFormat?: string;\n decimalPrecision?: number;\n\n // render\n render?: (props: RenderProps) => any;\n renderCallback?: (rendered: any, props: RenderProps) => any;\n renderString?: (props: RenderProps<string>) => any;\n renderNumber?: (props: RenderProps<number>) => any;\n renderBool?: (props: RenderProps<boolean>) => any;\n renderDate?: (props: RenderProps<Date>) => any;\n renderTime?: (props: RenderProps<Time>) => any;\n renderArray?: (props: RenderProps<any[]>) => any;\n renderObject?: (props: RenderProps<any>) => any;\n renderNull?: (props: RenderProps<null | undefined>) => any;\n renderSheet?: (props: RenderProps<UserSheet>) => any;\n renderRowHeaderLabel?: (n: number) => string | null;\n renderColHeaderLabel?: (n: number) => string | null;\n\n // serialize\n serialize?: (props: SerializeProps) => string;\n serializeString?: (props: SerializeProps<string>) => string;\n serializeNumber?: (props: SerializeProps<number>) => string;\n serializeBool?: (props: SerializeProps<boolean>) => string;\n serializeDate?: (props: SerializeProps<Date>) => string;\n serializeTime?: (props: SerializeProps<Time>) => string;\n serializeArray?: (props: SerializeProps<any[]>) => string;\n serializeNull?: (props: SerializeProps<null | undefined>) => string;\n serializeFormulaError?: (props: SerializeProps<FormulaError>) => string;\n serializeError?: (props: SerializeProps<Error>) => string;\n\n // deserialize\n deserialize?: (value: string, cell?: CellType) => CellType;\n deserializeRaw?: (value: any, cell?: CellType) => CellType;\n deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n // Priority slot: called before built-in deserializers when defined\n deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n // Built-in deserializers\n deserializeNumber?: (value: string, cell?: CellType) => CellPatchType<number | undefined>;\n deserializeBool?: (value: string, cell?: CellType) => CellPatchType<boolean | undefined>;\n deserializeDate?: (value: string, cell?: CellType) => CellPatchType<Date | undefined>;\n deserializeTime?: (value: string, cell?: CellType) => CellPatchType<Time | undefined>;\n deserializeAny?: (value: string, cell?: CellType) => CellPatchType<string | undefined>;\n\n // toScalar\n toScalar?: (props: ScalarProps) => Scalar;\n toScalarString?: (props: ScalarProps<string>) => Scalar;\n toScalarNumber?: (props: ScalarProps<number>) => Scalar;\n toScalarBool?: (props: ScalarProps<boolean>) => Scalar;\n toScalarDate?: (props: ScalarProps<Date>) => Scalar;\n toScalarTime?: (props: ScalarProps<Time>) => Scalar;\n toScalarArray?: (props: ScalarProps<any[]>) => Scalar;\n toScalarNull?: (props: ScalarProps<null | undefined>) => Scalar;\n\n // select\n getSelectOptions?: () => AutocompleteOption[];\n getSelectFallback?: (props: SelectFallbackProps) => CellType | undefined;\n select?: (props: SelectProps) => CellType | undefined;\n serializeForClipboard?: (props: SerializeForClipboardProps) => string;\n};\n\ntype PolicyProps = {\n mixins?: PolicyMixinType[];\n priority?: number;\n};\n\nconst BOOLS = { true: true, false: false } as { [s: string]: boolean };\n\nexport class Policy implements PolicyMixinType {\n public priority: number = 0;\n\n public datetimeFormat: string = 'YYYY-MM-DD HH:mm:ss';\n public dateFormat: string = 'YYYY-MM-DD';\n public timeFormat: string = 'HH:mm:ss';\n public decimalPrecision: number = 15;\n\n public deserializeFunctions: ((value: string, cell?: CellType) => CellPatchType<any>)[] = [];\n public deserializeCallback?: (parsed: any, cell?: CellType) => CellType;\n public deserializeFirst?: (value: string, cell?: CellType) => CellPatchType<any>;\n public renderCallback?: (rendered: any, props: RenderProps) => any;\n\n constructor(props?: PolicyProps) {\n this.priority = props?.priority ?? 1;\n this.applyMixins(props?.mixins);\n\n this.registerDeserializeFunctions();\n }\n\n private registerDeserializeFunctions(): void {\n this.deserializeFunctions = [\n ...(this.deserializeFirst ? [this.deserializeFirst.bind(this)] : []),\n this.deserializeNumber.bind(this),\n this.deserializeTime.bind(this),\n this.deserializeDate.bind(this),\n this.deserializeBool.bind(this),\n this.deserializeAny.bind(this),\n ];\n }\n\n private applyMixins(mixins?: PolicyMixinType[]) {\n if (mixins == null) {\n return;\n }\n const subclassProto = Object.getPrototypeOf(this);\n for (const mixin of mixins) {\n for (const key in mixin) {\n // Methods defined in a subclass take priority over mixins\n const overriddenBySubclass =\n subclassProto !== Policy.prototype && Object.prototype.hasOwnProperty.call(subclassProto, key);\n if (!overriddenBySubclass) {\n (this as any)[key] = (mixin as any)[key];\n }\n }\n }\n }\n\n // --- RENDER ---\n\n public render(props: RenderProps): any {\n let { value, cell } = props;\n const { sheet, point } = props;\n\n // Cell lookup: if cell not provided, resolve from sheet (entry-point usage)\n if (cell == null) {\n cell = sheet.getCell(point, { resolution: 'EVALUATED', raise: true }) ?? {};\n value = cell.value;\n }\n\n let rendered: any;\n\n if (Pending.is(value)) {\n rendered = '';\n } else if (value == null) {\n rendered = this.renderNull({ ...props, value: value as null | undefined, cell });\n } else {\n switch (typeof value) {\n case 'object':\n if (value instanceof Date) {\n rendered = this.renderDate({ ...props, value, cell });\n } else if (Time.is(value)) {\n rendered = this.renderTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n rendered = this.renderArray({ ...props, value, cell });\n } else if (FormulaError.is(value)) {\n throw value;\n } else if (isSheet(value)) {\n rendered = this.renderSheet({ ...props, value, cell });\n } else {\n rendered = this.renderObject({ ...props, value, cell });\n }\n break;\n case 'string':\n rendered = this.renderString({ ...props, value, cell });\n break;\n case 'number':\n rendered = this.renderNumber({ ...props, value, cell });\n break;\n case 'boolean':\n rendered = this.renderBool({ ...props, value, cell });\n break;\n case 'function':\n rendered = (value as () => any)();\n break;\n default:\n rendered = '';\n }\n }\n\n return this.renderCallback ? this.renderCallback(rendered, { ...props, value, cell }) : rendered;\n }\n\n public renderString({ value }: RenderProps<string>): any {\n return value!;\n }\n\n public renderBool({ value }: RenderProps<boolean>): any {\n return value ? 'TRUE' : 'FALSE';\n }\n\n public renderNumber({ value }: RenderProps<number>): any {\n if (isNaN(value!)) {\n return 'NaN';\n }\n return parseFloat(value!.toPrecision(this.decimalPrecision));\n }\n\n public renderDate({ value }: RenderProps<Date>): any {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public renderTime({ value }: RenderProps<Time>): any {\n return value!.stringify(this.timeFormat);\n }\n\n public renderArray(props: RenderProps<any[]>): any {\n let { value, cell } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.render({ ...props, value, cell });\n }\n\n public renderObject({ value }: RenderProps<any>): any {\n return JSON.stringify(value);\n }\n\n public renderNull(_props: RenderProps<null | undefined>): any {\n return '';\n }\n\n public renderSheet({ value: childSheet, ...rest }: RenderProps<UserSheet>): any {\n const at = rest.sheet.getId(rest.point);\n const stripped = childSheet.__raw__.strip({ raise: true, at });\n return this.render({ ...rest, value: stripped });\n }\n\n public renderRowHeaderLabel(_n: number): string | null {\n return null;\n }\n\n public renderColHeaderLabel(_n: number): string | null {\n return null;\n }\n\n // --- TO SCALAR ---\n\n public toScalar(props: ScalarProps): Scalar {\n const { value, cell, sheet, point } = props;\n if (Pending.is(value)) {\n return undefined;\n }\n if (value == null) {\n return this.toScalarNull({ value: value as null | undefined, cell, sheet, point });\n }\n switch (typeof value) {\n case 'string':\n return this.toScalarString({ value, cell, sheet, point });\n case 'number':\n return this.toScalarNumber({ value, cell, sheet, point });\n case 'boolean':\n return this.toScalarBool({ value, cell, sheet, point });\n case 'object':\n if (value instanceof Date) {\n return this.toScalarDate({ value, cell, sheet, point });\n } else if (Time.is(value)) {\n return this.toScalarTime({ value: Time.ensure(value), cell, sheet, point });\n } else if (Array.isArray(value)) {\n return this.toScalarArray({ value, cell, sheet, point });\n } else if (FormulaError.is(value)) {\n throw value;\n }\n return undefined;\n default:\n return undefined;\n }\n }\n\n public toScalarString({ value }: ScalarProps<string>): Scalar {\n return value;\n }\n\n public toScalarNumber({ value }: ScalarProps<number>): Scalar {\n return value?.toPrecision(this.decimalPrecision);\n }\n\n public toScalarBool({ value }: ScalarProps<boolean>): Scalar {\n return value;\n }\n\n public toScalarDate({ value }: ScalarProps<Date>): Scalar {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public toScalarTime({ value }: ScalarProps<Time>): Scalar {\n return value!.stringify(this.timeFormat);\n }\n\n public toScalarArray({ value, cell, sheet, point }: ScalarProps<any[]>): Scalar {\n let v = value?.[0];\n if (Array.isArray(v)) {\n v = v[0];\n }\n return this.toScalar({ value: v, cell, sheet, point });\n }\n\n public toScalarNull(_props: ScalarProps<null | undefined>): Scalar {\n return null;\n }\n\n // --- SERIALIZE ---\n\n public serialize({ value, cell, sheet, point }: SerializeProps): string {\n if (value === undefined) {\n value = cell?.value;\n }\n if (Pending.is(value)) {\n return '';\n }\n if (value instanceof Date) {\n return this.serializeDate({ value, cell, sheet, point } as SerializeProps<Date>);\n }\n if (Time.is(value)) {\n return this.serializeTime({ value: Time.ensure(value), cell, sheet, point } as SerializeProps<Time>);\n }\n if (value == null) {\n return this.serializeNull({ cell, sheet, point } as SerializeProps<null | undefined>);\n }\n if (Array.isArray(value)) {\n return this.serializeArray({ value, cell, sheet, point } as SerializeProps<any[]>);\n }\n if (value instanceof FormulaError) {\n return this.serializeFormulaError({ value, cell, sheet, point } as SerializeProps<FormulaError>);\n }\n if (value instanceof Error) {\n return this.serializeError({ value, cell, sheet, point } as SerializeProps<Error>);\n }\n return value.toString();\n }\n\n public serializeString({ value }: SerializeProps<string>): string {\n return value;\n }\n\n public serializeBool({ value }: SerializeProps<boolean>): string {\n return value ? 'true' : 'false';\n }\n\n public serializeNumber({ value }: SerializeProps<number>): string {\n if (isNaN(value)) {\n return 'NaN';\n }\n return parseFloat(value.toPrecision(this.decimalPrecision)).toString();\n }\n\n public serializeDate({ value }: SerializeProps<Date>): string {\n if (value!.getHours() + value!.getMinutes() + value!.getSeconds() === 0) {\n return dayjs(value).format(this.dateFormat);\n }\n return dayjs(value).format(this.datetimeFormat);\n }\n\n public serializeTime({ value }: SerializeProps<Time>): string {\n return value.stringify(this.timeFormat);\n }\n\n public serializeArray(props: SerializeProps<any[]>): string {\n let { value } = props;\n value = value?.[0];\n if (Array.isArray(value)) {\n value = value[0];\n }\n return this.serialize({ ...props, value });\n }\n\n public serializeNull(_props: SerializeProps<null | undefined>): string {\n return '';\n }\n\n public serializeFormulaError({ value }: SerializeProps<FormulaError>): string {\n return value.code;\n }\n\n public serializeError(_props: SerializeProps<Error>): string {\n return '';\n }\n\n public serializeForClipboard(props: SerializeForClipboardProps): string {\n const { point, sheet } = props;\n return sheet.getSerializedValue({ point }) ?? '';\n }\n\n // --- DESERIALIZE ---\n public deserializeValue(value: any, cell: CellType): CellType {\n try {\n const parsed = typeof value !== 'string' ? this.deserializeRaw(value, cell) : this.deserialize(value, cell);\n if (this.deserializeCallback) {\n return this.deserializeCallback(parsed, cell);\n }\n return parsed;\n } catch (e) {\n return { ...cell, value: String(e) };\n }\n }\n\n public deserializeRaw(value: any, cell?: CellType): CellType {\n if (Time.is(value)) {\n value = Time.ensure(value);\n }\n return { ...cell, value };\n }\n\n public deserialize(value: string, cell?: CellType): CellPatchType<any> {\n if (value[0] === \"'\") {\n return { ...cell, value };\n }\n for (let i = 0; i < this.deserializeFunctions.length; i++) {\n const result = this.deserializeFunctions[i](value, cell);\n if (result?.value !== undefined) {\n return { ...cell, ...result };\n }\n }\n if (value === '') {\n return { ...cell, value: undefined };\n }\n return { ...cell, value };\n }\n\n public deserializeAny(value: string, _cell?: CellType): CellPatchType<string | undefined> {\n if (value == null || value === '') {\n return { value: undefined };\n }\n return { value };\n }\n\n public deserializeBool(value: string, _cell?: CellType): CellPatchType<boolean | undefined> {\n return { value: BOOLS[value.toLowerCase()] };\n }\n\n public deserializeNumber(value: string, _cell?: CellType): CellPatchType<number | undefined> {\n const m = value.match(/^-?[\\d.]+$/);\n if (m != null && value.match(/\\.$/) == null && (value.match(/\\./g) || []).length <= 1) {\n return { value: parseFloat(value) };\n }\n return { value: undefined };\n }\n\n public deserializeTime(value: string, _cell?: CellType): CellPatchType<Time | undefined> {\n if (value.length < 3 || isNaN(value[value.length - 1] as unknown as number)) {\n return { value: undefined };\n }\n return { value: Time.parse(value) };\n }\n\n public deserializeDate(value: string, _cell?: CellType): CellPatchType<Date | undefined> {\n return { value: parseDate(value) };\n }\n\n // --- SELECT ---\n\n public getSelectFallback(_props: SelectFallbackProps): any {\n return { value: null };\n }\n\n public getSelectOptions(): AutocompleteOption[] {\n return [];\n }\n\n public select(props: SelectProps): CellType | undefined {\n const { next, sheet, point } = props;\n const options = this.getSelectOptions();\n if (options.length === 0) {\n return next;\n }\n const ok = options.some((o) => o.value === next?.value);\n if (!ok) {\n return { ...next, ...this.getSelectFallback({ sheet, point, value: next?.value }) };\n }\n return next;\n }\n}\n\nexport type PolicyType = Policy;\nexport const DEFAULT_POLICY_NAME = 'default';\nexport const nonePolicy = new Policy({ priority: 0 });\n","import type { FilterCondition, FilterConditionMethod, FilterConfig } from '../types';\nimport { parseDate } from './date';\nimport { Time } from './time';\n\ntype FilterFunction = (condition: FilterCondition, cellValue: any) => boolean;\n\nconst _str = (v: any): string => (v == null ? '' : String(v));\n\ntype ValueType = 'number' | 'date' | 'time' | 'boolean' | 'string';\n\nfunction detectType(cellValue: any): ValueType {\n if (typeof cellValue === 'number') {\n return 'number';\n }\n if (cellValue instanceof Date) {\n return 'date';\n }\n if (Time.is(cellValue)) {\n return 'time';\n }\n if (typeof cellValue === 'boolean') {\n return 'boolean';\n }\n return 'string';\n}\n\nfunction parseAsType(v: string, type: ValueType): { ok: boolean; num: number } {\n switch (type) {\n case 'number': {\n let s = v.replace(/[,_]/g, '');\n let scale = 1;\n if (s.endsWith('%')) {\n s = s.slice(0, -1);\n scale = 0.01;\n }\n const n = Number(s);\n return { ok: !isNaN(n), num: n * scale };\n }\n case 'date': {\n const d = parseDate(v);\n if (!d) {\n return { ok: false, num: NaN };\n }\n return { ok: true, num: d.getTime() };\n }\n case 'time': {\n const td = Time.parse(v);\n return td ? { ok: true, num: td.toMilliseconds() } : { ok: false, num: NaN };\n }\n case 'boolean': {\n const bv = v.toLowerCase();\n if (bv === 'true') {\n return { ok: true, num: 1 };\n }\n if (bv === 'false') {\n return { ok: true, num: 0 };\n }\n return { ok: false, num: NaN };\n }\n default:\n return { ok: false, num: NaN };\n }\n}\n\nfunction toNumeric(cellValue: any, type: ValueType): number {\n switch (type) {\n case 'number':\n return cellValue as number;\n case 'date':\n return (cellValue as Date).getTime();\n case 'time':\n return Time.ensure(cellValue).toMilliseconds();\n case 'boolean':\n return cellValue ? 1 : 0;\n default:\n return NaN;\n }\n}\n\nconst filterEq: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterNe: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n const s = _str(cellValue);\n return !condition.value.some((v) => s === v);\n }\n const cellNum = toNumeric(cellValue, vt);\n return !condition.value.some((v) => {\n const parsed = parseAsType(v, vt);\n return parsed.ok && cellNum === parsed.num;\n });\n};\n\nconst filterGt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) > condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum > parsed.num;\n};\n\nconst filterGte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) >= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum >= parsed.num;\n};\n\nconst filterLt: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) < condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum < parsed.num;\n};\n\nconst filterLte: FilterFunction = (condition, cellValue) => {\n const vt = detectType(cellValue);\n if (vt === 'string') {\n return _str(cellValue) <= condition.value[0];\n }\n const cellNum = toNumeric(cellValue, vt);\n const parsed = parseAsType(condition.value[0], vt);\n return parsed.ok && cellNum <= parsed.num;\n};\n\nconst filterBlank: FilterFunction = (_condition, cellValue) => {\n return cellValue == null || _str(cellValue) === '';\n};\n\nconst filterNonblank: FilterFunction = (_condition, cellValue) => {\n return cellValue != null && _str(cellValue) !== '';\n};\n\nconst filterIncludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nconst filterExcludes: FilterFunction = (condition, cellValue) => {\n const s = _str(cellValue).toLowerCase();\n return !condition.value.some((v) => s.includes(v.toLowerCase()));\n};\n\nexport const filterFunctions: Record<FilterConditionMethod, FilterFunction> = {\n eq: filterEq,\n ne: filterNe,\n gt: filterGt,\n gte: filterGte,\n lt: filterLt,\n lte: filterLte,\n blank: filterBlank,\n nonblank: filterNonblank,\n includes: filterIncludes,\n excludes: filterExcludes,\n};\n\nexport function evaluateFilterCondition(condition: FilterCondition, cellValue: any): boolean {\n const fn = filterFunctions[condition.method];\n return fn ? fn(condition, cellValue) : true;\n}\n\nexport function evaluateFilterConfig(filter: FilterConfig, cellValue: any): boolean {\n const mode = filter.mode ?? 'or';\n if (filter.conditions.length === 0) {\n return true;\n }\n if (mode === 'and') {\n return filter.conditions.every((c) => evaluateFilterCondition(c, cellValue));\n } else {\n return filter.conditions.some((c) => evaluateFilterCondition(c, cellValue));\n }\n}\n","import { CellsByIdType, Id } from '../types';\nimport { Sheet } from './sheet';\n\nexport class ReferencePreserver {\n public map: { [id: Id]: Id } = {};\n private sheet: Sheet;\n private dependentIds: Set<Id> = new Set<Id>();\n\n constructor(sheet: Sheet) {\n this.sheet = sheet;\n }\n\n collectDependents(...ids: Id[]) {\n ids.forEach((id) => {\n this.sheet.registry.systems[id]?.dependents?.forEach((did) => {\n this.dependentIds.add(did);\n });\n });\n }\n\n /**\n * Compare two idMatrix snapshots (`before` and `after`) and populate\n * `this.map` and collect dependents for every position where the occupying\n * cell ID changed. Works for any rearrangement (sort, move, etc.).\n */\n buildMap(before: Id[], after: Id[]) {\n for (let i = 0; i < before.length; i++) {\n const prevId = before[i];\n const currId = after[i];\n if (prevId != null && currId != null && prevId !== currId) {\n this.collectDependents(prevId, currId);\n this.map[prevId] = currId;\n }\n }\n }\n\n resolveDependents(operation?: 'move' | 'removeRows' | 'removeCols'): CellsByIdType {\n this.sheet.clearAddressCaches();\n const diffBefore: CellsByIdType = {};\n this.dependentIds.forEach((id) => {\n const dep = this.sheet.registry.data[id];\n if (dep == null) {\n return;\n }\n diffBefore[id] = { ...dep };\n this.sheet.clearDependencies(id);\n dep.value = this.sheet.processFormula(dep.value, {\n dependency: id,\n idMap: this.map,\n operation,\n });\n });\n\n return diffBefore;\n }\n}\n","import {\n Id,\n Ids,\n IdMatrix,\n AreaType,\n CellsByIdType,\n CellsByAddressType,\n PointType,\n Address,\n CellFilter,\n MatrixType,\n CellType,\n FilterConfig,\n HistoryType,\n HistorySortRowsType,\n StorePatchType,\n ShapeType,\n RectType,\n OperatorType,\n OperationType,\n RawCellType,\n ExtraPointType,\n StoreType,\n Resolution,\n MoveRelations,\n Y,\n X,\n System,\n} from '../types';\nimport { among, areaShape, createMatrix, expandRange, getMaxSizesFromCells, matrixShape } from './spatial';\nimport { a2p, x2c, c2x, p2a, y2r, grantAddressAbsolute } from './coords';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport { Lexer, ProcessFormulaProps } from '../formula/evaluator';\nimport { FormulaError } from '../formula/formula-error';\nimport { solveFormula, SolveOptions, solveSheet, stripSheet } from '../formula/solver';\nimport { ensureSys, filterCellFields } from './cell';\nimport { escapeSheetName, toSheetPrefix } from './sheet_utils';\n\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n DEFAULT_HISTORY_LIMIT,\n DEFAULT_KEY,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '../constants';\nimport { Pending, SOLVING, Spilling } from '../sentinels';\nimport { shouldTracking } from '../store/helpers';\nimport { updateSheet } from '../store/actions';\nimport * as operation from './operation';\nimport { Registry, createRegistry } from './book';\nimport { nonePolicy, PolicyType, DEFAULT_POLICY_NAME, RenderProps, ScalarProps } from '../policy/core';\nimport { evaluateFilterConfig } from './filter';\nimport { ReferencePreserver } from './reference';\n\ntype CellField = keyof CellType;\n\nexport type SheetLimits = {\n minRows?: number;\n maxRows?: number;\n minCols?: number;\n maxCols?: number;\n};\n\ntype Props = {\n limits?: SheetLimits;\n functions?: FunctionMapping;\n name?: string;\n registry?: Registry;\n};\n\nconst noFilter: CellFilter = () => true;\n\ntype MoveProps = {\n srcSheet?: UserSheet;\n src: AreaType;\n dst: AreaType;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n historicize?: boolean;\n};\n\nexport interface UserSheet {\n changedTime: number;\n lastChangedTime?: number;\n area: AreaType;\n top: number;\n left: number;\n bottom: number;\n right: number;\n minNumRows: number;\n maxNumRows: number;\n minNumCols: number;\n maxNumCols: number;\n headerWidth: number;\n headerHeight: number;\n name: string;\n\n /**\n * Returns the raw sheet object, which is used for internal operations.\n * This is not intended for public use and may change in future versions.\n */\n __raw__: Sheet;\n\n getRectSize(area: AreaType): RectType;\n getCell(point: PointType, options?: { resolution?: Resolution; raise?: boolean }): CellType | undefined;\n getPolicy(point: PointType): PolicyType;\n get numRows(): number;\n get numCols(): number;\n get shape(): ShapeType;\n move(args: MoveProps): UserSheet;\n copy(args: MoveProps & { onlyValue?: boolean }): UserSheet;\n update(args: {\n diff: CellsByAddressType;\n historicize?: boolean;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n writeMatrix(args: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n write(args: { point: PointType; value: string; updateChangedTime?: boolean; reflection?: StorePatchType }): UserSheet;\n insertRows(args: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeRows(args: { y: number; numRows: number; reflection?: StorePatchType }): UserSheet;\n insertCols(args: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n reflection?: StorePatchType;\n }): UserSheet;\n removeCols(args: { x: number; numCols: number; reflection?: StorePatchType }): UserSheet;\n undo(): {\n history: HistoryType | null;\n };\n redo(): {\n history: HistoryType | null;\n };\n histories(): HistoryType[];\n historyIndex(): number;\n historySize(): number;\n setHeaderHeight(height: number, historicize?: boolean): UserSheet;\n setHeaderWidth(width: number, historicize?: boolean): UserSheet;\n\n sortRows(args: { x: number; direction: 'asc' | 'desc' }): UserSheet;\n\n filterRows(args?: { x?: number; filter?: FilterConfig }): UserSheet;\n isRowFiltered(y: number): boolean;\n hasActiveFilters(): boolean;\n hasPendingCells(): boolean;\n waitForPending(): Promise<void>;\n getLastChangedAddresses(): Address[];\n getSerializedValue(props: { point: PointType; cell?: CellType; resolution?: Resolution }): string;\n}\n\ntype InternalToValueMatrixProps = {\n area?: AreaType;\n resolution?: Resolution;\n raise?: boolean;\n filter?: CellFilter;\n asScalar?: boolean;\n at?: Id;\n};\n\nexport class Sheet implements UserSheet {\n /** @internal */\n public __gsType = 'Sheet';\n public changedTime: number;\n public lastChangedTime?: number;\n public area: AreaType = { top: 0, left: 0, bottom: 0, right: 0 };\n\n /** @internal */\n private _limits: Required<SheetLimits>;\n get minNumRows() {\n return this._limits.minRows;\n }\n get maxNumRows() {\n return this._limits.maxRows;\n }\n get minNumCols() {\n return this._limits.minCols;\n }\n get maxNumCols() {\n return this._limits.maxCols;\n }\n /** @internal */\n public id: number = 0;\n public name: string = '';\n /** @internal */\n public prevName: string = '';\n /** @internal */\n public status: 0 | 1 | 2 = 0; // 0: not initialized, 1: initialized, 2: formula absoluted\n /** @internal */\n public registry: Registry;\n /** @internal */\n public idsToBeIdentified: Id[] = [];\n /** @internal */\n public totalWidth = 0;\n /** @internal */\n public totalHeight = 0;\n /** @internal */\n public fullHeight = 0;\n /** @internal */\n public defaultColWidth: number = DEFAULT_WIDTH;\n /** @internal */\n public defaultRowHeight: number = DEFAULT_HEIGHT;\n\n /** @internal */\n private version = 0;\n /** @internal */\n private idMatrix: IdMatrix;\n /** @internal */\n private addressCaches: Map<Id, Address> = new Map();\n /** @internal */\n private lastChangedAddresses: Address[] = [];\n\n constructor({ limits = {}, name, registry = createRegistry({}) }: Props) {\n this.idMatrix = [];\n this.changedTime = Date.now();\n this._limits = {\n minRows: limits.minRows ?? 1,\n maxRows: limits.maxRows ?? -1,\n minCols: limits.minCols ?? 1,\n maxCols: limits.maxCols ?? -1,\n };\n this.name = name || '';\n this.prevName = this.name;\n this.registry = registry;\n }\n\n static is(obj: any): obj is Sheet {\n return obj?.__gsType === 'Sheet';\n }\n\n toString() {\n return `Sheet(name=${escapeSheetName(this.name)}, size=${this.numRows}x${this.numCols})`;\n }\n\n get headerHeight() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.height || HEADER_HEIGHT;\n }\n\n setHeaderHeight(height: number, historicize = true) {\n return this.update({\n diff: { 0: { height } },\n partial: true,\n historicize,\n });\n }\n\n get headerWidth() {\n return this.getCell({ y: 0, x: 0 }, { resolution: 'SYSTEM' })?.width || HEADER_WIDTH;\n }\n\n setHeaderWidth(width: number, historicize = true) {\n return this.update({\n diff: { 0: { width } },\n partial: true,\n historicize,\n });\n }\n\n /**\n * Get the raw (mutable) cell data for a point. Unlike getCell, this returns the actual registry.data reference.\n * @internal\n */\n private _pointToRawCell({ y, x }: PointType): CellType | undefined {\n const id = this.idMatrix[y]?.[x];\n if (id == null) {\n return undefined;\n }\n return this.registry.data[id];\n }\n\n public isRowFiltered(y: number): boolean {\n return !!this._pointToRawCell({ y, x: 0 })?.filtered;\n }\n\n public hasActiveFilters(): boolean {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns true if any data cell in this sheet currently holds a Pending value\n * (i.e. an async formula that hasn't resolved yet).\n */\n public hasPendingCells(): boolean {\n const numRows = this.numRows;\n const numCols = this.numCols;\n for (let y = 1; y <= numRows; y++) {\n for (let x = 1; x <= numCols; x++) {\n const cell = this.getCell({ y, x }, { resolution: 'RESOLVED' });\n if (Pending.is(cell?.value)) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Returns a Promise that resolves when all in-flight async formula computations\n * have completed and no data cells hold Pending values.\n * If nothing is pending, resolves immediately.\n * Useful for waiting before sort/filter so that cell values are fully resolved.\n */\n public waitForPending(): Promise<void> {\n const pendingMap = this.registry.asyncPending;\n // If there are in-flight promises, wait for them first\n if (pendingMap.size > 0) {\n const promises = Array.from(pendingMap.values()).map((p) => p.promise);\n return Promise.all(promises).then(() => this.waitForPending());\n }\n // Even if asyncPending is empty, cells may still hold Pending values\n // (e.g. propagated pending from dependent formulas).\n // In that case, wait for the next transmit cycle and re-check.\n if (this.hasPendingCells()) {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (this.registry.asyncPending.size > 0) {\n const promises = Array.from(this.registry.asyncPending.values()).map((p) => p.promise);\n Promise.all(promises).then(check);\n } else if (this.hasPendingCells()) {\n // Still pending — wait a tick for transmit/re-render\n setTimeout(check, 50);\n } else {\n resolve();\n }\n };\n check();\n });\n }\n return Promise.resolve();\n }\n\n /**\n * Returns the addresses that were changed in the most recent `_update()` call.\n * Useful inside `onChange` to know which cells were modified.\n */\n public getLastChangedAddresses(): Address[] {\n return this.lastChangedAddresses;\n }\n\n /**\n * Capture the full cell state of all filter-related header cells as a CellsByIdType snapshot.\n * @internal\n */\n private _captureFilterCellStates(): CellsByIdType {\n const snapshot: CellsByIdType = {};\n const numCols = this.numCols;\n const numRows = this.numRows;\n // Column header cells: capture the 'filter' field.\n // Use null instead of undefined so the value survives JSON serialization\n // (undefined is stripped by JSON.stringify, causing undo to silently no-op in environments\n // that serialize/deserialize state such as StackBlitz hot-reload).\n for (let col = 1; col <= numCols; col++) {\n const id = this.idMatrix[0]?.[col];\n if (id != null) {\n snapshot[id] = { filter: this.registry.data[id]?.filter ?? null };\n }\n }\n // Row header cells: capture the 'filtered' field.\n // Use false instead of undefined so the value survives JSON serialization\n // (undefined is stripped by JSON.stringify, causing undo to silently no-op in environments\n // that serialize/deserialize state such as StackBlitz hot-reload).\n for (let y = 1; y <= numRows; y++) {\n const id = this.idMatrix[y]?.[0];\n if (id != null) {\n snapshot[id] = { filtered: this.registry.data[id]?.filtered ?? false };\n }\n }\n return snapshot;\n }\n\n public filterRows({\n x,\n filter,\n }: {\n x?: number;\n filter?: FilterConfig;\n } = {}) {\n const diffBefore = this._captureFilterCellStates();\n\n if (x == null) {\n const numCols = this.numCols;\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n delete colCell?.filter;\n }\n } else {\n const colCell = this._pointToRawCell({ y: 0, x });\n if (colCell) {\n if (filter) {\n colCell.filter = filter;\n } else {\n delete colCell.filter;\n }\n }\n }\n this._reapplyFilters();\n\n const diffAfter = this._captureFilterCellStates();\n\n // Only keep cells whose state actually changed\n const changedIds = Object.keys(diffBefore).filter(\n (id) => JSON.stringify(diffBefore[id]) !== JSON.stringify(diffAfter[id]),\n );\n\n if (changedIds.length > 0) {\n const trimmedBefore: CellsByIdType = {};\n const trimmedAfter: CellsByIdType = {};\n for (const id of changedIds) {\n trimmedBefore[id] = diffBefore[id];\n trimmedAfter[id] = diffAfter[id];\n }\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n diffBefore: trimmedBefore,\n diffAfter: trimmedAfter,\n partial: true,\n });\n }\n\n return this.refresh(false, true);\n }\n\n /** @internal */\n private _reapplyFilters() {\n // Collect active filters from column header cells\n const numCols = this.numCols;\n const activeFilters: { x: number; filter: FilterConfig }[] = [];\n const changedAddresses: Address[] = [];\n for (let col = 1; col <= numCols; col++) {\n const colCell = this._pointToRawCell({ y: 0, x: col });\n if (colCell?.filter && colCell.filter.conditions.length > 0) {\n activeFilters.push({ x: col, filter: colCell.filter });\n }\n // Track column header cells that have filter config changes\n changedAddresses.push(p2a({ y: 0, x: col }));\n }\n\n const numRows = this.numRows;\n\n // Evaluate each row and update filtered flag\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (!rowCell) {\n continue;\n }\n\n if (rowCell.filterFixed) {\n continue;\n }\n\n let shouldFilter = false;\n for (const { x: col, filter } of activeFilters) {\n const cell = this.getCell({ y, x: col }, { resolution: 'RESOLVED' });\n if (!evaluateFilterConfig(filter, cell?.value)) {\n shouldFilter = true;\n break;\n }\n }\n\n const wasFiltered = !!rowCell.filtered;\n if (shouldFilter) {\n rowCell.filtered = true;\n } else {\n delete rowCell.filtered;\n }\n if (wasFiltered !== shouldFilter) {\n changedAddresses.push(p2a({ y, x: 0 }));\n }\n }\n\n this.lastChangedAddresses = changedAddresses;\n }\n\n public sortRows({ x, direction }: { x: number; direction: 'asc' | 'desc' }) {\n const numRows = this.numRows;\n if (numRows <= 1) {\n return this;\n }\n\n // Collect row indices (data rows: 1..numRows), separating fixed rows\n const fixedPositions = new Set<number>();\n const sortableIndices: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n const rowCell = this._pointToRawCell({ y, x: 0 });\n if (rowCell?.sortFixed) {\n fixedPositions.add(y);\n } else {\n sortableIndices.push(y);\n }\n }\n\n // Sort by resolved cell value at column x\n sortableIndices.sort((a, b) => {\n const cellA = this.getCell({ y: a, x }, { resolution: 'RESOLVED' });\n const cellB = this.getCell({ y: b, x }, { resolution: 'RESOLVED' });\n const valA = cellA?.value;\n const valB = cellB?.value;\n\n // null/undefined goes to the end\n if (valA == null && valB == null) {\n return 0;\n }\n if (valA == null) {\n return 1;\n }\n if (valB == null) {\n return -1;\n }\n\n let cmp = 0;\n if (typeof valA === 'number' && typeof valB === 'number') {\n cmp = valA - valB;\n } else if (valA instanceof Date && valB instanceof Date) {\n cmp = valA.getTime() - valB.getTime();\n } else {\n cmp = String(valA).localeCompare(String(valB));\n }\n return direction === 'asc' ? cmp : -cmp;\n });\n\n // Check if order actually changed (only among sortable rows)\n // Assign sortable rows to the positions not occupied by fixed rows\n const availablePositions: number[] = [];\n for (let y = 1; y <= numRows; y++) {\n if (!fixedPositions.has(y)) {\n availablePositions.push(y);\n }\n }\n\n let changed = false;\n for (let i = 0; i < sortableIndices.length; i++) {\n if (sortableIndices[i] !== availablePositions[i]) {\n changed = true;\n break;\n }\n }\n if (!changed) {\n return this;\n }\n\n // Build row mapping: original position -> new position\n // Fixed rows map to themselves; sortable rows map to available positions in sorted order\n const sortedRowMapping: { [beforeY: number]: number } = {};\n for (const y of fixedPositions) {\n sortedRowMapping[y] = y;\n }\n for (let i = 0; i < sortableIndices.length; i++) {\n sortedRowMapping[sortableIndices[i]] = availablePositions[i];\n }\n\n // Save row references before rearranging (rows are re-slotted, not mutated).\n const matrixSnapshot = this.idMatrix.slice();\n\n for (const [oldY, newY] of Object.entries(sortedRowMapping)) {\n this.idMatrix[Number(newY)] = matrixSnapshot[Number(oldY)];\n }\n this.addressCaches.clear();\n\n const preserver = new ReferencePreserver(this);\n preserver.buildMap(matrixSnapshot.flat(), this.idMatrix.flat());\n preserver.resolveDependents();\n\n this._pushHistory({\n applyed: true,\n operation: 'SORT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n sortedRowMapping,\n } as HistorySortRowsType);\n\n return this.refresh(true, true);\n }\n\n /** @internal */\n private _sortRowMapping(sortedRowMapping: { [beforeY: number]: number }, inverse = false) {\n // Convert mapping to array and apply the sort order\n const numRows = this.numRows;\n const newOrder: number[] = new Array(numRows);\n\n if (inverse) {\n // Undo: reverse the mapping\n // If sortedRowMapping says \"oldY -> newY\", then to undo we put \"newY -> oldY\"\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[oldY - 1] = newY;\n }\n } else {\n // Redo: apply the mapping\n // sortedRowMapping[oldY] = newY means row oldY goes to position newY\n for (const [oldYStr, newY] of Object.entries(sortedRowMapping)) {\n const oldY = Number(oldYStr);\n newOrder[newY - 1] = oldY;\n }\n }\n\n // Apply the sort order: newOrder[i] = original row index that should end up at position i+1\n const savedRows: Ids[] = [];\n for (let i = 0; i < newOrder.length; i++) {\n savedRows.push(this.idMatrix[newOrder[i]]);\n }\n for (let i = 0; i < newOrder.length; i++) {\n this.idMatrix[i + 1] = savedRows[i];\n }\n this.addressCaches.clear();\n }\n\n get isInitialized() {\n return this.status === 2;\n }\n\n get policies() {\n return this.registry.policies;\n }\n\n /** @internal */\n public getSystem(point: PointType): System | undefined {\n const id = this.getId(point);\n if (id == null) {\n return undefined;\n }\n return this.registry.systems[id];\n }\n\n /** @internal */\n public processFormula(value: any, { idMap, ...props }: ProcessFormulaProps): any {\n if (typeof value === 'string' || value instanceof String) {\n if (value.charAt(0) === '=') {\n const lexer = new Lexer(value.substring(1));\n lexer.tokenize(idMap);\n lexer.identify({ ...props, sheet: this });\n lexer.dependencyIds.forEach((id) => this.addDependency(id, props.dependency));\n return '=' + lexer.identifiedFormula;\n }\n }\n return value;\n }\n\n /** @internal */\n public resolveFormulas() {\n this.idsToBeIdentified.forEach((id) => {\n const cell = this.registry.data[id];\n if (this.registry.systems[id]?.sheetId == null) {\n return;\n }\n if (cell == null) {\n return;\n }\n this.clearDependencies(id);\n cell.value = this.processFormula(cell?.value, { dependency: id });\n });\n this.idsToBeIdentified = [];\n this.status = 2;\n }\n\n /** @internal */\n public getSheetBySheetName(sheetName: string) {\n const sheetId = this.registry.sheetIdsByName[sheetName];\n return this.getSheetBySheetId(sheetId);\n }\n /** @internal */\n public getSheetBySheetId(sheetId: number) {\n return this.registry.contextsBySheetId[sheetId]?.store?.sheetReactive?.current;\n }\n\n /** @internal */\n private static _stack(...cells: (CellType | undefined)[]) {\n const extension: CellType = {};\n cells.forEach((cell) => {\n if (cell?.style) {\n extension.style = { ...extension.style, ...cell.style };\n }\n if (cell?.prevention) {\n extension.prevention = (extension.prevention || 0) | cell.prevention;\n }\n });\n return extension;\n }\n\n /** @internal */\n public initialize(cells: CellsByAddressType) {\n if (this.status > 1) {\n return;\n }\n if (cells[0] == null) {\n cells[0] = { width: HEADER_WIDTH, height: HEADER_HEIGHT };\n }\n const auto = getMaxSizesFromCells(cells);\n const changedTime = Date.now();\n this.area = {\n top: 1,\n left: 1,\n bottom: auto.numRows,\n right: auto.numCols,\n };\n\n // make idMatrix beforehand\n for (let y = 0; y < auto.numRows + 1; y++) {\n const ids: Ids = [];\n this.idMatrix.push(ids);\n for (let x = 0; x < auto.numCols + 1; x++) {\n const id = this._generateId();\n ids.push(id);\n const address = p2a({ y, x });\n this.addressCaches.set(id, address);\n }\n }\n Object.keys(cells).forEach((address) => {\n if (address === DEFAULT_KEY || address === DEFAULT_COL_KEY || address === DEFAULT_ROW_KEY) {\n return;\n }\n const range = expandRange(address);\n const data = cells[address];\n\n range.forEach((address) => {\n const origin = cells[address];\n cells[address] = {\n ...origin,\n ...data,\n ...Sheet._stack(origin, data),\n };\n });\n });\n\n const common = cells?.[DEFAULT_KEY];\n const commonCol = cells?.[DEFAULT_COL_KEY];\n const commonRow = cells?.[DEFAULT_ROW_KEY];\n if (commonCol?.width != null) {\n this.defaultColWidth = commonCol.width;\n }\n if (commonRow?.height != null) {\n this.defaultRowHeight = commonRow.height;\n }\n for (let y = 0; y < auto.numRows + 1; y++) {\n const rowId = y2r(y);\n for (let x = 0; x < auto.numCols + 1; x++) {\n const id = this.getId({ y, x });\n const colId = x2c(x);\n let stacked: CellType;\n if (y === 0 && x > 0) {\n // Column header: defaultCol as base (width, style, etc.),\n // then 'A' layout props (width, label, no style), then 'A0' overrides.\n const colDefault = cells?.[colId];\n const { style: _cs, ...colDefaultLayout } = colDefault ?? {};\n const headerCell = cells?.[colId + '0'];\n stacked = {\n ...commonCol,\n ...colDefaultLayout,\n ...headerCell,\n ...Sheet._stack(commonCol, headerCell),\n } as CellType;\n } else if (x === 0 && y > 0) {\n // Row header: defaultRow as base (height, style, etc.),\n // then '1' layout props (height, no style), then '01' overrides.\n const rowDefault = cells?.[rowId];\n const { style: _rs, ...rowDefaultLayout } = rowDefault ?? {};\n const headerCell = cells?.['0' + rowId];\n stacked = {\n ...commonRow,\n ...rowDefaultLayout,\n ...headerCell,\n ...Sheet._stack(commonRow, headerCell),\n } as CellType;\n } else if (y === 0 && x === 0) {\n // Corner cell (y=0, x=0): excluded from all defaults to keep headerHeight correct.\n const cell = cells?.['0'];\n stacked = { ...cell, ...Sheet._stack(cell) } as CellType;\n } else {\n // Data cell: 'A' applies to all column-A cells, '1' to all row-1 cells.\n const address = p2a({ y, x });\n const rowDefault = cells?.[rowId];\n const colDefault = cells?.[colId];\n const cell = cells?.[address];\n stacked = {\n ...common,\n ...rowDefault,\n ...colDefault,\n ...cell,\n ...Sheet._stack(common, rowDefault, colDefault, cell),\n } as CellType;\n }\n\n if (stacked?.value?.startsWith?.('=') && (stacked?.formulaEnabled ?? true)) {\n this.idsToBeIdentified.push(id);\n }\n if (y === 0) {\n if (stacked.width == null) {\n stacked.width = DEFAULT_WIDTH;\n }\n } else if (x === 0) {\n if (stacked.height == null) {\n stacked.height = DEFAULT_HEIGHT;\n }\n } else {\n delete stacked.height;\n delete stacked.width;\n delete stacked.label;\n }\n\n const policy = this.policies[stacked.policy ?? ''] ?? this.defaultPolicy;\n stacked = policy.deserializeValue(stacked.value, stacked) ?? {};\n this.registry.systems[id] = { id, changedTime, sheetId: this.id };\n this.registry.data[id] = stacked;\n }\n }\n this.status = 1; // initialized\n this.registry.sheetIdsByName[this.name] = this.id;\n }\n\n /** @internal */\n private _incrementVersion() {\n this.version++;\n if (this.version >= Number.MAX_SAFE_INTEGER) {\n this.version = 1;\n }\n }\n\n /** @internal */\n private _xsheetDispatch(otherSheet: Sheet) {\n if (otherSheet === this) {\n return;\n }\n otherSheet.refresh(true);\n const context = this.registry.contextsBySheetId[otherSheet.id];\n if (context !== null) {\n const { dispatch } = context;\n requestAnimationFrame(() => {\n dispatch(updateSheet(otherSheet));\n });\n }\n }\n\n /** @internal */\n private _generateId() {\n return (this.registry.cellHead++).toString();\n }\n\n public getRectSize({ top, left, bottom, right }: AreaType): RectType {\n // Use System.offsetLeft / System.offsetTop stored on header cells for O(1) lookup.\n // offsetLeft on (y=0, x) = absolute left of column x\n // offsetTop on (y, x=0) = absolute top of row y\n const l = left || 1;\n const t = top || 1;\n\n const rw = this.registry.systems[this.getId({ y: 0, x: right })]?.offsetLeft ?? 0;\n const lw = this.registry.systems[this.getId({ y: 0, x: l })]?.offsetLeft ?? 0;\n const rh = this.registry.systems[this.getId({ y: bottom, x: 0 })]?.offsetTop ?? 0;\n const th = this.registry.systems[this.getId({ y: t, x: 0 })]?.offsetTop ?? 0;\n\n const width = Math.max(0, rw - lw);\n const height = Math.max(0, rh - th);\n return { y: t, x: l, height, width };\n }\n\n /** @internal */\n public setTotalSize() {\n const numCols = this.numCols;\n const numRows = this.numRows;\n const headerW = this.headerWidth;\n const headerH = this.headerHeight;\n\n // Write offsetLeft into column-header cells (y=0, x=1..numCols)\n let accW = 0;\n for (let x = 1; x <= numCols; x++) {\n const cell = this.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const w = cell?.width || this.defaultColWidth || DEFAULT_WIDTH;\n const colSys = this.registry.systems[this.getId({ y: 0, x })];\n if (colSys != null) {\n colSys.offsetLeft = headerW + accW;\n }\n accW += w;\n }\n this.totalWidth = headerW + accW;\n\n // Write offsetTop into row-header cells (y=1..numRows, x=0)\n let accH = 0;\n let fullH = 0;\n for (let y = 1; y <= numRows; y++) {\n const cell = this.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const h = cell?.height || this.defaultRowHeight || DEFAULT_HEIGHT;\n const rowSys = this.registry.systems[this.getId({ y, x: 0 })];\n if (rowSys != null) {\n rowSys.offsetTop = headerH + accH;\n }\n if (!cell?.filtered) {\n accH += h;\n }\n fullH += h;\n }\n this.totalHeight = headerH + accH;\n this.fullHeight = headerH + fullH;\n }\n\n /** @internal */\n public refresh(relocate = false, resize = false): Sheet {\n this._incrementVersion();\n this.lastChangedTime = this.changedTime;\n this.changedTime = Date.now();\n\n this.clearSolvedCaches();\n\n if (relocate) {\n // force reset\n this.addressCaches.clear();\n }\n if (resize) {\n this.setTotalSize();\n }\n return this;\n }\n\n /** @internal */\n public clone(relocate = false): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n return copied.refresh(relocate);\n }\n\n /** @internal */\n public getPointById(\n id: Id,\n slideY = 0,\n slideX = 0,\n ): PointType & {\n absCol: boolean;\n absRow: boolean;\n } {\n const absCol = id.startsWith('$');\n if (absCol) {\n id = id.slice(1);\n slideX = 0;\n }\n const absRow = id.endsWith('$');\n if (absRow) {\n id = id.slice(0, -1);\n slideY = 0;\n }\n const cache = this.addressCaches.get(id);\n if (cache) {\n const p = a2p(cache);\n return { y: p.y + slideY, x: p.x + slideX, absCol, absRow };\n }\n\n for (let y = 0; y < this.idMatrix.length; y++) {\n const ids = this.idMatrix[y];\n for (let x = 0; x < ids.length; x++) {\n const existing = ids[x];\n const address = p2a({ y, x });\n this.addressCaches.set(existing, address);\n if (existing === id) {\n return {\n y: y + slideY,\n x: x + slideX,\n absCol,\n absRow,\n };\n }\n }\n }\n return { y: -1, x: -1, absCol, absRow };\n }\n\n /** @internal */\n public getAddressById(id: Id, slideY = 0, slideX = 0): string | undefined {\n const { y, x, absCol, absRow } = this.getPointById(id, slideY, slideX);\n return grantAddressAbsolute(p2a({ y, x }), absCol, absRow);\n }\n\n /** @internal */\n public clearAddressCaches() {\n this.addressCaches.clear();\n }\n\n /** @internal */\n private _warmAddressCaches() {\n for (let y = 0; y < this.idMatrix.length; y++) {\n const row = this.idMatrix[y];\n for (let x = 0; x < row.length; x++) {\n this.addressCaches.set(row[x], p2a({ y, x }));\n }\n }\n }\n\n /** @internal */\n public getId(point: PointType) {\n const { y, x } = point;\n return this.idMatrix[y]?.[x];\n }\n\n /** @internal */\n public getCell(point: PointType, { resolution = 'RESOLVED', raise = false }: SolveOptions = {}) {\n const { y, x } = point;\n if (y === -1 || x === -1) {\n return undefined;\n }\n const id = this.idMatrix[y]?.[x];\n if (id == null) {\n return undefined;\n }\n const cell = this.registry.data[id];\n if (cell == null) {\n return undefined;\n }\n let value = cell.value;\n if (resolution !== 'SYSTEM' && (cell.formulaEnabled ?? true)) {\n value = solveFormula({ value, sheet: this, point, raise, resolution, at: id });\n }\n return { ...cell, value } as CellType;\n }\n\n /** @internal */\n public get numRows() {\n const { top, bottom } = this.area;\n return 1 + bottom - top;\n }\n\n public get numCols() {\n const { left, right } = this.area;\n return 1 + right - left;\n }\n\n public get top() {\n return this.area.top;\n }\n public get left() {\n return this.area.left;\n }\n public get bottom() {\n return this.area.bottom;\n }\n public get right() {\n return this.area.right;\n }\n\n /** @internal */\n public _toValueMatrix({\n area,\n at,\n resolution = 'RESOLVED',\n raise = false,\n filter = noFilter,\n asScalar = false,\n }: InternalToValueMatrixProps = {}) {\n const { top, left, bottom, right } = area ?? this.area;\n const matrix = createMatrix(bottom - top + 1, right - left + 1);\n\n // Normalize `at` check to ensure we only throw circular ref if the `at` is from this sheet\n for (let y = top; y <= bottom; y++) {\n for (let x = left; x <= right; x++) {\n const id = this.getId({ y, x });\n if (at === id) {\n throw new FormulaError('#REF!', 'References are circulating.');\n }\n const cell = this.getCell({ y, x }, { resolution, raise }) ?? {};\n if (filter(cell)) {\n let fieldValue = cell.value;\n if (asScalar) {\n const policy = this.getPolicy({ y, x });\n fieldValue = policy.toScalar({ value: cell.value, cell, sheet: this, point: { y, x } });\n }\n matrix[y - top][x - left] = fieldValue;\n }\n }\n }\n return matrix;\n }\n\n /** @internal */\n private _pushHistory(history: HistoryType) {\n const book = this.registry;\n const strayedHistories = book.histories.splice(book.historyIndex + 1, book.histories.length);\n strayedHistories.forEach(this._cleanStrayed.bind(this));\n book.histories.push(history);\n book.lastHistory = book.currentHistory = history;\n if (book.histories.length > book.historyLimit) {\n const kickedOut = book.histories.splice(0, 1)[0];\n this._cleanObsolete(kickedOut);\n } else {\n book.historyIndex++;\n }\n }\n\n /** @internal */\n private _cleanObsolete(history: HistoryType) {\n if (history.operation === 'REMOVE_ROWS' || history.operation === 'REMOVE_COLS') {\n history.deleted.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n if (history.operation === 'MOVE') {\n history.moveRelations.forEach((rel) => {\n if (rel.new != null) {\n this._deleteOrphanedId(rel.new);\n }\n if (rel.lost != null) {\n this._deleteOrphanedId(rel.lost);\n }\n });\n }\n }\n\n /** @internal */\n private _cleanStrayed(history: HistoryType) {\n /**\n * Cleans up IDs that were created by a history entry that has been discarded\n * (\"strayed\") due to a new operation being pushed while the history index was\n * not at the end (i.e. after undo).\n *\n * When the user undoes one or more steps and then performs a new operation,\n * the previously-redoable future histories are removed from the history stack.\n * Any cells that were **inserted** by those discarded histories (INSERT_ROWS /\n * INSERT_COLS) have IDs that are no longer reachable from the id-matrix, so\n * their registry entries must be deleted to avoid memory leaks.\n * @internal\n */\n if (history.operation === 'INSERT_ROWS' || history.operation === 'INSERT_COLS') {\n history.idMatrix.forEach((ids) => {\n ids.forEach((id) => {\n this._deleteOrphanedId(id);\n });\n });\n }\n }\n\n /**\n * Remove an id from registry.data and registry.dependents entirely.\n * @internal\n */\n private _deleteOrphanedId(id: Id) {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n delete this.registry.data[id];\n delete this.registry.systems[id];\n }\n\n /** @internal */\n private _copyCellLayout(cell: CellType | undefined) {\n if (cell == null) {\n return undefined;\n }\n const newCell: CellType = {};\n if (cell.style != null) {\n newCell.style = cell.style;\n }\n if (cell.justifyContent != null) {\n newCell.justifyContent = cell.justifyContent;\n }\n if (cell.alignItems != null) {\n newCell.alignItems = cell.alignItems;\n }\n if (cell.policy != null) {\n newCell.policy = cell.policy;\n }\n if (cell.width != null) {\n newCell.width = cell.width;\n }\n if (cell.height != null) {\n newCell.height = cell.height;\n }\n return newCell;\n }\n\n public move({\n srcSheet = this,\n src,\n dst,\n historicize = true,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: MoveProps) {\n const srcSheetRaw = srcSheet.__raw__;\n const moveRelations = this._createMoveRelations(srcSheetRaw, src, this, dst);\n const { diffBefore, diffAfter } = this._moveCells(srcSheetRaw, this, moveRelations, false, operator);\n\n this._xsheetDispatch(srcSheetRaw);\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'MOVE',\n srcSheetId: srcSheetRaw.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n moveRelations,\n });\n }\n\n return this.refresh(true);\n }\n\n /**\n * Build MoveRelations from src area to dst area, skipping filtered rows.\n *\n * Layout of the returned array (processed in this order by _moveCells):\n * 1. Entries where [0] is a newly-generated ID — these fill the vacated src cells (processed last in forward order)\n * 2. Entries where [0] is a src address and [1] is a dst address — the actual moves (processed first in forward order, descending)\n * Entries whose [1] is an existing ID mean the destination cell is displaced/overflowed and\n * is no longer addressable; on forward pass they are skipped; on reverse pass the ID is written back.\n */\n /** @internal */\n private _createMoveRelations(srcSheet: Sheet, src: AreaType, dstSheet: Sheet, dst: AreaType): MoveRelations {\n const { top: srcTop, left: srcLeft, bottom: srcBottom, right: srcRight } = src;\n const { top: dstTop, left: dstLeft } = dst;\n\n const dstNumRows = dstSheet.numRows;\n const dstNumCols = dstSheet.numCols;\n\n // Collect visible (non-filtered) rows for src\n const srcVisibleRows: number[] = [];\n for (let y = srcTop; y <= srcBottom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const srcNumCols = srcRight - srcLeft + 1;\n const srcNumVisibleRows = srcVisibleRows.length;\n\n // Collect corresponding visible dst rows (skip filtered rows in dst, matching count)\n const dstVisibleRows: number[] = [];\n {\n let di = 0;\n let y = dstTop;\n while (di < srcNumVisibleRows) {\n if (!dstSheet.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n di++;\n }\n y++;\n }\n }\n\n // Build sets for quick lookup\n const srcCellSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n for (let j = 0; j < srcNumCols; j++) {\n srcCellSet.add(p2a({ y: srcVisibleRows[di], x: srcLeft + j }));\n }\n }\n\n const dstAddrSet = new Set<string>();\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const dstX = dstLeft + j;\n if (dstY <= dstNumRows && dstX <= dstNumCols) {\n dstAddrSet.add(p2a({ y: dstY, x: dstX }));\n }\n }\n }\n\n const moveRelations: MoveRelations = [];\n\n for (let di = 0; di < srcNumVisibleRows; di++) {\n const srcY = srcVisibleRows[di];\n const dstY = dstVisibleRows[di];\n for (let j = 0; j < srcNumCols; j++) {\n const srcX = srcLeft + j;\n const dstX = dstLeft + j;\n const srcAddr = p2a({ y: srcY, x: srcX });\n const isDstInBounds = dstY <= dstNumRows && dstX <= dstNumCols;\n const dstAddr = isDstInBounds ? p2a({ y: dstY, x: dstX }) : undefined;\n\n let newId: Id | undefined;\n // Vacate: src cell is NOT covered by any dst write in the same sheet overlap\n if (!(srcSheet === dstSheet && dstAddrSet.has(srcAddr))) {\n newId = srcSheet._generateId();\n }\n\n let lostId: Id | undefined;\n if (isDstInBounds) {\n // Displace: dst cell is overwritten but was NOT part of the src area being moved\n if (!(srcSheet === dstSheet && srcCellSet.has(dstAddr!))) {\n const existingId = dstSheet.getId({ y: dstY, x: dstX });\n if (existingId != null) {\n lostId = existingId;\n }\n }\n } else {\n // Overflow: the src ID itself is pushed out of bounds and lost\n const srcId = srcSheet.getId({ y: srcY, x: srcX });\n if (srcId != null) {\n lostId = srcId;\n }\n }\n\n const srcCell = srcSheet.getCell({ y: srcY, x: srcX }, { resolution: 'SYSTEM' });\n const dstCell = isDstInBounds ? dstSheet.getCell({ y: dstY, x: dstX }, { resolution: 'SYSTEM' }) : undefined;\n\n moveRelations.push({\n before: srcCell?.policy,\n after: dstCell?.policy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n });\n }\n }\n\n return moveRelations;\n }\n\n get defaultPolicy(): PolicyType {\n return this.policies[DEFAULT_POLICY_NAME] ?? nonePolicy;\n }\n\n /**\n * Apply (or reverse) a MoveRelations list.\n *\n * Forward (reverse=false): process descending — actual ID moves happen bottom-up so\n * earlier entries don't clobber later ones; vacate entries (at front of array) are\n * applied last.\n * Reverse (reverse=true): process ascending — restores IDs in the natural order.\n *\n * On forward pass: applies policy, collects diffBefore, runs ReferencePreserver.\n * On reverse pass: only moves IDs (caller is responsible for applyDiff(diffBefore)).\n */\n /** @internal */\n private _moveCells(\n srcSheet: Sheet,\n dstSheet: Sheet,\n moveRelations: MoveRelations,\n reverse: boolean,\n operator: OperatorType = 'SYSTEM',\n ): { diffBefore: CellsByIdType; diffAfter: CellsByIdType } {\n const diffBefore: CellsByIdType = {};\n const preserver = new ReferencePreserver(dstSheet);\n\n const wireWrites: CellsByIdType = {};\n const idWritesSrc: Array<{ y: Y; x: X; id: Id }> = [];\n const idWritesDst: Array<{ y: Y; x: X; id: Id }> = [];\n\n // Forward pass: collect diffs and temporary buffer writes\n if (!reverse) {\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n const srcPoint = a2p(srcAddr);\n const srcId = srcSheet.getId(srcPoint);\n const dstPoint = dstAddr != null ? a2p(dstAddr) : undefined;\n const dstId = dstPoint != null ? dstSheet.getId(dstPoint) : undefined;\n\n const srcCell = srcId != null ? srcSheet.registry.data[srcId] : undefined;\n const dstCell = dstId != null ? dstSheet.registry.data[dstId] : undefined;\n\n if (\n operator === 'USER' &&\n (operation.hasOperation(srcCell?.prevention, operation.MoveFrom) ||\n operation.hasOperation(dstCell?.prevention, operation.MoveTo))\n ) {\n continue;\n }\n\n // Vacate\n if (newId != null) {\n const policyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const policy = srcSheet.policies[policyKey] ?? srcSheet.defaultPolicy;\n const restricted = policy.select({\n sheet: srcSheet,\n point: srcPoint,\n next: { value: null },\n current: srcCell,\n operation: operation.MoveFrom,\n });\n\n wireWrites[newId] = {\n ...restricted,\n policy: beforePolicy,\n };\n this.registry.systems[newId] = { id: newId, sheetId: srcSheet.id, changedTime: Date.now() };\n idWritesSrc.push({ y: srcPoint.y, x: srcPoint.x, id: newId });\n }\n\n // Actual Move\n if (dstId != null && dstPoint != null && dstAddr != null) {\n const dstPolicyKey = afterPolicy || DEFAULT_POLICY_NAME;\n const srcPolicyKey = beforePolicy || DEFAULT_POLICY_NAME;\n const dstPolicyVal = dstSheet.policies[dstPolicyKey] ?? dstSheet.defaultPolicy;\n const srcPolicyVal = srcSheet.policies[srcPolicyKey] ?? srcSheet.defaultPolicy;\n const isSrcWinner = srcPolicyVal.priority > dstPolicyVal.priority;\n const policy = isSrcWinner ? srcPolicyVal : dstPolicyVal;\n\n const restricted = policy.select({\n sheet: dstSheet,\n point: dstPoint,\n next: srcCell,\n current: dstCell,\n operation: operation.MoveTo,\n });\n\n if (restricted) {\n diffBefore[srcId] = srcCell ?? {};\n wireWrites[srcId] = {\n ...srcCell,\n ...restricted,\n policy: isSrcWinner ? beforePolicy : afterPolicy,\n };\n }\n if (srcCell != null) {\n const srcSys = this.registry.systems[srcId];\n if (srcSys) {\n srcSys.changedTime = Date.now();\n }\n }\n\n idWritesDst.push({ y: dstPoint.y, x: dstPoint.x, id: srcId });\n }\n }\n } else {\n // Reverse pass: collect id buffer writes (no registry.data modification)\n for (const {\n before: beforePolicy,\n after: afterPolicy,\n src: srcAddr,\n dst: dstAddr,\n new: newId,\n lost: lostId,\n } of moveRelations) {\n // Move ID that landed at dst back to src\n if (dstAddr != null) {\n const toPoint = a2p(dstAddr);\n const movedId = dstSheet.getId(toPoint);\n if (movedId != null) {\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: movedId });\n }\n }\n\n // Restore lost ID to where it was lost from\n if (lostId != null) {\n if (dstAddr != null) {\n // It was displaced from dst\n const toPoint = a2p(dstAddr);\n idWritesDst.push({ y: toPoint.y, x: toPoint.x, id: lostId });\n } else {\n // It overflowed from src\n const fromPoint = a2p(srcAddr);\n idWritesSrc.push({ y: fromPoint.y, x: fromPoint.x, id: lostId });\n }\n }\n }\n }\n\n // Snapshot idMatrix before flush\n const srcSnapshot = !reverse ? srcSheet.idMatrix.flat() : null;\n const dstSnapshot = !reverse && srcSheet !== dstSheet ? dstSheet.idMatrix.flat() : null;\n\n // Flush registry.data writes first\n Object.assign(this.registry.data, wireWrites);\n // Then flush idMatrix writes\n for (const { y, x, id } of idWritesSrc) {\n srcSheet.idMatrix[y][x] = id;\n }\n for (const { y, x, id } of idWritesDst) {\n dstSheet.idMatrix[y][x] = id;\n }\n\n // Update lastChangedAddresses\n const changedAddresses: Address[] = moveRelations.filter((r) => r.dst != null).map((r) => r.dst as Address);\n const srcAddresses: Address[] = moveRelations.map((r) => r.src);\n\n if (srcSheet === dstSheet) {\n dstSheet.lastChangedAddresses = [...new Set([...srcAddresses, ...changedAddresses])];\n } else {\n dstSheet.lastChangedAddresses = changedAddresses;\n srcSheet.lastChangedAddresses = srcAddresses;\n }\n\n if (!reverse) {\n preserver.buildMap(srcSnapshot!.flat(), srcSheet.idMatrix.flat());\n if (srcSheet !== dstSheet) {\n preserver.buildMap(dstSnapshot!.flat(), dstSheet.idMatrix.flat());\n }\n const resolvedDiff = preserver.resolveDependents('move');\n Object.assign(diffBefore, resolvedDiff);\n }\n\n return { diffBefore, diffAfter: {} };\n }\n\n public copy({\n srcSheet = this,\n src,\n dst,\n onlyValue = false,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: MoveProps & { onlyValue?: boolean }) {\n const isXSheet = srcSheet !== this;\n const { top: topFrom, left: leftFrom, bottom: bottomFrom, right: rightFrom } = src;\n const { top: topTo, left: leftTo, bottom: bottomTo, right: rightTo } = dst;\n const diff: CellsByAddressType = {};\n const changedTime = Date.now();\n\n // Build list of visible (non-filtered) rows for src and dst\n const srcVisibleRows: number[] = [];\n for (let y = topFrom; y <= bottomFrom; y++) {\n if (!srcSheet.isRowFiltered(y)) {\n srcVisibleRows.push(y);\n }\n }\n const dstVisibleRows: number[] = [];\n for (let y = topTo; y <= bottomTo; y++) {\n if (y > this.numRows) {\n continue;\n }\n if (!this.isRowFiltered(y)) {\n dstVisibleRows.push(y);\n }\n }\n\n const srcNumVisibleRows = srcVisibleRows.length;\n const srcNumCols = rightFrom - leftFrom + 1;\n const dstNumCols = rightTo - leftTo + 1;\n\n for (let di = 0; di < dstVisibleRows.length; di++) {\n const toY = dstVisibleRows[di];\n const fromY = srcVisibleRows[di % srcNumVisibleRows];\n for (let j = 0; j <= dstNumCols - 1; j++) {\n const toX = leftTo + j;\n if (toX > this.numCols) {\n continue;\n }\n const fromX = leftFrom + (j % srcNumCols);\n const slideY = isXSheet ? 0 : toY - fromY;\n const slideX = isXSheet ? 0 : toX - fromX;\n const cell: CellType = {\n ...srcSheet.getCell({ y: fromY, x: fromX }, { resolution: 'SYSTEM' }),\n };\n const dstPoint = { y: toY, x: toX };\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n const dstPolicy = this.getPolicy(dstPoint);\n const srcPoint = { y: fromY, x: fromX };\n const srcPolicy = srcSheet.getPolicy(srcPoint);\n const srcCell = srcSheet.getCell(srcPoint, { resolution: 'SYSTEM' });\n\n const isSrcWinner = srcPolicy.priority > dstPolicy.priority;\n cell.policy = isSrcWinner ? srcCell?.policy : dstCell?.policy;\n const dstIdForClear = this.getId(dstPoint);\n this.clearDependencies(dstIdForClear);\n const value =\n (cell?.formulaEnabled ?? true)\n ? this.processFormula(cell?.value, {\n dependency: dstIdForClear,\n slideY,\n slideX,\n })\n : cell?.value;\n const dstId = this.getId(dstPoint);\n const dstSys = this.registry.systems[dstId];\n if (dstSys != null) {\n dstSys.changedTime = changedTime;\n }\n const address = p2a(dstPoint);\n if (onlyValue) {\n const dstCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n cell.style = dstCell?.style;\n cell.justifyContent = dstCell?.justifyContent;\n cell.alignItems = dstCell?.alignItems;\n }\n diff[address] = { ...cell, value };\n }\n }\n return this.update({\n diff,\n partial: false,\n operator,\n operation: operation.Copy,\n undoReflection,\n redoReflection,\n });\n }\n\n public getPolicy(point: PointType): PolicyType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' });\n if (cell?.policy == null) {\n return this.defaultPolicy;\n }\n return this.policies[cell.policy] ?? this.defaultPolicy;\n }\n\n /** @internal */\n private _update({\n diff,\n partial = true,\n updateChangedTime = true,\n ignoreFields = ['label'],\n operator = 'SYSTEM',\n operation: op = operation.Update,\n formulaIdentify = true,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n ignoreFields?: CellField[];\n operator?: OperatorType;\n operation?: OperationType;\n formulaIdentify?: boolean;\n }) {\n const diffBefore: CellsByIdType = {};\n const diffAfter: CellsByIdType = {};\n const changedAddresses: Address[] = [];\n const changedTime = Date.now();\n\n let resized = false;\n Object.keys(diff).forEach((address) => {\n const point = a2p(address);\n const id = this.getId(point);\n const current = this.registry.data[id];\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Update)) {\n return;\n }\n\n let next: Record<string, any> = { ...diff[address] };\n\n if (formulaIdentify) {\n const formulaEnabled = next.formulaEnabled ?? current?.formulaEnabled ?? true;\n if (formulaEnabled) {\n this.clearDependencies(id);\n next.value = this.processFormula(next.value, { dependency: id });\n }\n }\n ignoreFields.forEach((key) => {\n next[key] = current?.[key];\n });\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Write)) {\n delete next.value;\n }\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Style)) {\n delete next?.style?.justifyContent;\n delete next?.style?.alignItems;\n }\n if (operator === 'USER' && operation.hasOperation(current?.prevention, operation.Resize)) {\n delete next?.style?.width;\n delete next?.style?.height;\n }\n if (next.width != null || next.height != null) {\n resized = true;\n }\n diffBefore[id] = current ?? {};\n\n const policy = this.policies[current?.policy || DEFAULT_POLICY_NAME] ?? this.defaultPolicy;\n const p = policy.select({\n sheet: this,\n point,\n next,\n current,\n operation: op,\n });\n next = { ...p };\n if (updateChangedTime) {\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = changedTime;\n }\n }\n if (partial) {\n const merged = { ...current, ...next };\n this.registry.data[id] = merged;\n diffAfter[id] = merged;\n } else {\n this.registry.data[id] = next;\n diffAfter[id] = next;\n }\n changedAddresses.push(address);\n });\n\n // Store the changed addresses for retrieval via getLastChangedAddresses()\n this.lastChangedAddresses = changedAddresses;\n\n //this.clearSolvedCaches();\n return {\n diffBefore,\n diffAfter,\n resized,\n };\n }\n\n public update({\n diff,\n partial = true,\n updateChangedTime = true,\n historicize = true,\n operator = 'SYSTEM',\n operation: op = operation.Update,\n ignoreFields,\n undoReflection,\n redoReflection,\n }: {\n diff: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n operation?: OperationType;\n ignoreFields?: CellField[];\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { diffBefore, diffAfter, resized } = this._update({\n diff,\n partial,\n operator,\n operation: op,\n updateChangedTime,\n ...(ignoreFields != null ? { ignoreFields } : {}),\n });\n\n if (historicize) {\n this._pushHistory({\n applyed: true,\n operation: 'UPDATE',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n diffBefore,\n diffAfter,\n partial,\n });\n }\n return this.refresh(false, resized);\n }\n\n /** @internal */\n public writeRawCellMatrix({\n point,\n matrix,\n updateChangedTime = true,\n historicize = true,\n onlyValue = false,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n point: PointType;\n matrix: MatrixType<RawCellType>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n onlyValue?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { y: baseY, x: baseX } = point;\n const diff: CellsByAddressType = {};\n\n // Build list of visible (non-filtered) rows starting from baseY\n // Map src row index (i) -> dst y, skipping filtered rows\n let srcRowIndex = 0;\n let dstY = baseY;\n while (srcRowIndex < matrix.length) {\n if (dstY > this.bottom) {\n break;\n }\n if (this.isRowFiltered(dstY)) {\n dstY++;\n continue;\n }\n const cells = matrix[srcRowIndex];\n cells.forEach((newCell, j) => {\n const x = baseX + j;\n if (x > this.right) {\n return;\n }\n const dstPoint = { y: dstY, x };\n const parsed = this.parse(dstPoint, newCell.value ?? '');\n parsed.style = { ...newCell.style, ...parsed.style };\n if (onlyValue) {\n const currentCell = this.getCell(dstPoint, { resolution: 'SYSTEM' });\n parsed.style = currentCell?.style;\n parsed.justifyContent = currentCell?.justifyContent;\n parsed.alignItems = currentCell?.alignItems;\n }\n diff[p2a(dstPoint)] = parsed;\n });\n srcRowIndex++;\n dstY++;\n }\n return this.update({\n diff,\n partial: true,\n updateChangedTime,\n historicize,\n operator,\n operation: operation.Write,\n undoReflection,\n redoReflection,\n });\n }\n\n public writeMatrix(props: {\n point: PointType;\n matrix: MatrixType<string>;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const matrixWithStyle: MatrixType<RawCellType> = props.matrix.map((row) => row.map((value) => ({ value })));\n return this.writeRawCellMatrix({ ...props, matrix: matrixWithStyle });\n }\n\n public write(props: {\n point: PointType;\n value: string;\n updateChangedTime?: boolean;\n historicize?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n const { point, value } = props;\n const parsed = this.parse(point, value ?? '');\n const current = this.getCell(point, { resolution: 'RAW' });\n if ((current?.value ?? null) === parsed.value) {\n // no change (treat undefined and null as equivalent empty values)\n return this;\n }\n const diff = { [p2a(point)]: parsed };\n return this.update({\n ...props,\n diff,\n partial: true,\n operation: operation.Write,\n });\n }\n\n public insertRows({\n y,\n numRows,\n baseY,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n baseY: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumRows !== -1 && this.numRows + numRows > this.maxNumRows) {\n console.error(`Rows are limited to ${this.maxNumRows}.`);\n return this;\n }\n const numCols = this.numCols;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i < numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j <= numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: baseY, x: j }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.idMatrix.splice(y, 0, ...rows);\n this.area.bottom += numRows;\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n y,\n numRows,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertRows) {\n const cloned = this.clone();\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n this.registry.onInsertRows({ sheet: cloned, y, numRows });\n }\n return this.refresh(true, true);\n }\n public removeRows({\n y,\n numRows,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n y: number;\n numRows: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumRows !== -1 && this.numRows - numRows < this.minNumRows) {\n console.error(`At least ${this.minNumRows} row(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const ys: number[] = [];\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let yi = y; yi < y + numRows; yi++) {\n const cell = this.getCell({ y: yi, x: 0 }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveRows)) {\n console.warn(`Cannot delete row ${yi}.`);\n return this;\n }\n for (let xi = 1; xi <= this.numCols; xi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi + numRows, x: xi });\n }\n ys.unshift(yi);\n }\n const deleted: MatrixType = [];\n ys.forEach((y) => {\n const row = this.idMatrix.splice(y, 1);\n deleted.unshift(row[0]);\n });\n this.area.bottom -= ys.length;\n\n const diffBefore = preserver.resolveDependents('removeRows');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_ROWS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection,\n redoReflection,\n ys: ys.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveRows) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: y,\n bottom: y + numRows - 1,\n left: this.area.left,\n right: this.area.right,\n };\n cloned.addressCaches = new Map();\n this.registry.onRemoveRows({ sheet: cloned, ys: ys.reverse() });\n }\n return this.refresh(true, true);\n }\n\n public insertCols({\n x,\n numCols,\n baseX,\n diff,\n partial,\n updateChangedTime,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n baseX: number;\n diff?: CellsByAddressType;\n partial?: boolean;\n updateChangedTime?: boolean;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.maxNumCols !== -1 && this.numCols + numCols > this.maxNumCols) {\n console.error(`Columns are limited to ${this.maxNumCols}.`);\n return this;\n }\n const numRows = this.numRows;\n const rows: IdMatrix = [];\n const changedTime = Date.now();\n for (let i = 0; i <= numRows; i++) {\n const row: Ids = [];\n for (let j = 0; j < numCols; j++) {\n const id = this._generateId();\n row.push(id);\n const cell = this.getCell({ y: i, x: baseX }, { resolution: 'SYSTEM' });\n const copied = this._copyCellLayout(cell);\n this.idMatrix[i].splice(x, 0, id);\n this.registry.data[id] = { ...copied };\n this.registry.systems[id] = { id, sheetId: this.id, changedTime };\n }\n rows.push(row);\n }\n this.area.right += numCols;\n\n this._pushHistory({\n applyed: true,\n operation: 'INSERT_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n x,\n numCols,\n idMatrix: rows,\n });\n\n // If diff is provided, update the cells after insertion\n if (diff) {\n Object.assign(this.registry.lastHistory!, this._update({ diff, partial, updateChangedTime, operator }), {\n partial,\n });\n }\n if (this.registry.onInsertCols) {\n const cloned = this.clone();\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n this.registry.onInsertCols({ sheet: cloned, x, numCols });\n }\n return this.refresh(true, true);\n }\n public removeCols({\n x,\n numCols,\n operator = 'SYSTEM',\n undoReflection,\n redoReflection,\n }: {\n x: number;\n numCols: number;\n operator?: OperatorType;\n undoReflection?: StorePatchType;\n redoReflection?: StorePatchType;\n }) {\n if (this.minNumCols !== -1 && this.numCols - numCols < this.minNumCols) {\n console.error(`At least ${this.minNumCols} column(s) are required.`);\n return this;\n }\n\n const preserver = new ReferencePreserver(this);\n const xs: number[] = [];\n const backup = this.idMatrix.map((ids) => [...ids]); // backup before deletion\n\n for (let xi = x; xi < x + numCols; xi++) {\n const cell = this.getCell({ y: 0, x: xi }, { resolution: 'SYSTEM' });\n if (operator === 'USER' && operation.hasOperation(cell?.prevention, operation.RemoveCols)) {\n console.warn(`Cannot delete col ${xi}.`);\n continue;\n }\n for (let yi = 1; yi <= this.numRows; yi++) {\n const id = this.getId({ y: yi, x: xi });\n if (id == null) {\n continue;\n }\n preserver.collectDependents(id);\n preserver.map[id] = this.getId({ y: yi, x: xi + numCols });\n }\n xs.unshift(xi);\n }\n\n const deleted: MatrixType = [];\n this.idMatrix.forEach((row) => {\n const deleting: Ids = [];\n deleted.push(deleting);\n // reverse and delete\n xs.forEach((x) => {\n deleting.unshift(...row.splice(x, 1));\n });\n });\n this.area.right -= xs.length;\n const diffBefore = preserver.resolveDependents('removeCols');\n\n this._pushHistory({\n applyed: true,\n operation: 'REMOVE_COLS',\n srcSheetId: this.id,\n dstSheetId: this.id,\n undoReflection: undoReflection,\n redoReflection: redoReflection,\n xs: xs.reverse(),\n diffBefore,\n deleted,\n });\n\n if (this.registry.onRemoveCols) {\n const cloned = this.clone();\n cloned.idMatrix = backup;\n cloned.area = {\n top: this.area.top,\n bottom: this.area.bottom,\n left: x,\n right: x + numCols - 1,\n };\n cloned.addressCaches = new Map();\n this.registry.onRemoveCols({ sheet: cloned, xs: xs.reverse() });\n }\n return this.refresh(true, true);\n }\n /** @internal */\n public histories() {\n return [...this.registry.histories];\n }\n /** @internal */\n public historyIndex() {\n return this.registry.historyIndex;\n }\n /** @internal */\n public historySize() {\n return this.registry.histories.length;\n }\n /** @internal */\n public getHistoryLimit() {\n return this.registry.historyLimit;\n }\n\n /** @internal */\n public parse(point: PointType, value: any): CellType {\n const cell = this.getCell(point, { resolution: 'SYSTEM' }) ?? {};\n const policy = this.getPolicy(point);\n return policy.deserializeValue(value, cell);\n }\n\n /** @internal */\n public render(props: RenderProps) {\n const { point, apply } = props;\n const at = this.getId(point);\n const policy = this.getPolicy(point);\n return policy.render({ sheet: this, point, apply, value: undefined });\n }\n\n public getSerializedValue({\n point,\n cell,\n resolution = 'RESOLVED',\n }: {\n point: PointType;\n cell?: CellType;\n resolution?: Resolution;\n }) {\n if (cell == null) {\n // Use raw cell from registry so cell.value is the original formula string.\n // getCell(raise=false) would replace cell.value with undefined, losing the formula.\n const id = this.idMatrix[point.y]?.[point.x];\n cell = id != null ? this.registry.data[id] : undefined;\n }\n if (cell == null) {\n return '';\n }\n const policy = this.getPolicy(point);\n const raw = cell.value;\n\n if (typeof raw === 'string' && raw[0] === '=') {\n if (resolution === 'SYSTEM') {\n return raw; // do not evaluate system references\n }\n if (resolution === 'RAW') {\n const lexer = new Lexer(raw.substring(1));\n lexer.tokenize();\n return '=' + lexer.display({ sheet: this });\n }\n try {\n const id = this.idMatrix[point.y]?.[point.x];\n const solved = solveFormula({ value: raw, sheet: this, point, raise: true, resolution, at: id });\n const value = stripSheet({ value: solved, raise: false });\n return policy.serialize({ value, cell, sheet: this, point });\n } catch (e) {\n return policy.serialize({ value: e, cell, sheet: this, point });\n }\n }\n return policy.serialize({ value: raw, cell, sheet: this, point });\n }\n\n /** @internal */\n public trim(area: AreaType): Sheet {\n const copied: Sheet = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n copied.area = area;\n // this causes RangeError on circular reference(maximum call stack size exceeded)\n // copied.solvedCaches = {};\n return copied;\n }\n\n /**\n * Solve all formulas in this sheet and return a 2D matrix of resolved values.\n * @internal\n */\n public solve({ raise = false, at }: { raise?: boolean; at: Id }): any[][] {\n return solveSheet({ sheet: this, raise, at });\n }\n\n /**\n * Collapse this sheet to a scalar (top-left cell value).\n * @internal\n */\n public strip({ raise = false, at }: { raise?: boolean; at?: Id }): any {\n return stripSheet({ value: this, raise, at });\n }\n\n /** @internal */\n private _applyDiff(diff: CellsByIdType = {}, partial = true) {\n const ids = Object.keys(diff);\n ids.forEach((id) => {\n const cell = diff[id] ?? {};\n let merged: CellType;\n if (partial) {\n merged = { ...this.registry.data[id] };\n (Object.keys(cell) as (keyof CellType)[]).forEach((key) => {\n if (cell[key] === undefined) {\n delete merged[key];\n } else {\n (merged as any)[key] = cell[key];\n }\n });\n } else {\n merged = { ...cell };\n }\n const sys = this.registry.systems[id];\n if (sys != null) {\n sys.changedTime = Date.now();\n }\n this.registry.data[id] = merged;\n this.clearDependencies(id);\n this.processFormula(merged.value, { dependency: id });\n });\n this._warmAddressCaches();\n const addresses: Address[] = [];\n for (const id of ids) {\n const address = this.getAddressById(id);\n if (address) {\n addresses.push(address);\n }\n }\n this.lastChangedAddresses = addresses;\n }\n\n public undo() {\n if (this.registry.historyIndex < 0) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[this.registry.historyIndex--];\n history.applyed = false;\n this.registry.currentHistory = this.registry.histories[this.registry.historyIndex];\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffBefore, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.splice(history.y, rows);\n dstSheet.area.bottom -= rows;\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffBefore) {\n dstSheet._applyDiff(history.diffBefore, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.forEach((row) => {\n row.splice(history.x, cols);\n });\n dstSheet.area.right -= cols;\n break;\n }\n case 'REMOVE_ROWS': {\n const { ys, deleted } = history;\n ys.forEach((y, i) => {\n dstSheet.idMatrix.splice(y, 0, deleted[i]);\n });\n dstSheet.area.bottom += ys.length;\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'REMOVE_COLS': {\n const { xs, deleted } = history;\n dstSheet.idMatrix.forEach((row, i) => {\n for (let j = 0; j < xs.length; j++) {\n row.splice(xs[j], 0, deleted[i][j]);\n }\n });\n dstSheet.area.right += xs.length;\n this._applyDiff(history.diffBefore, false);\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, true);\n }\n const movedAddresses = dstSheet.lastChangedAddresses;\n dstSheet._applyDiff(history.diffBefore, false);\n dstSheet.lastChangedAddresses = [...new Set([...movedAddresses, ...dstSheet.lastChangedAddresses])];\n break;\n }\n case 'SORT_ROWS': {\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, true);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: StoreType) => {\n sheetRef.current?.registry.transmit(history.undoReflection?.transmit);\n },\n };\n }\n\n public redo() {\n if (this.registry.historyIndex + 1 >= this.registry.histories.length) {\n return { history: null, newSheet: this.__raw__ };\n }\n const history = this.registry.histories[++this.registry.historyIndex];\n history.applyed = true;\n this.registry.currentHistory = history;\n\n const srcSheet = this.getSheetBySheetId(history.srcSheetId);\n const dstSheet = this.getSheetBySheetId(history.dstSheetId);\n\n if (!dstSheet) {\n return { history: null, newSheet: this.__raw__ };\n }\n\n switch (history.operation) {\n case 'UPDATE':\n dstSheet._applyDiff(history.diffAfter, history.partial ?? false);\n break;\n case 'INSERT_ROWS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { rows } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.splice(history.y, 0, ...history.idMatrix);\n dstSheet.area.bottom += rows;\n break;\n }\n case 'INSERT_COLS': {\n if (history.diffAfter) {\n dstSheet._applyDiff(history.diffAfter, false);\n }\n const { cols } = matrixShape({ matrix: history.idMatrix });\n dstSheet.idMatrix.map((row, i) => {\n row.splice(history.x, 0, ...history.idMatrix[i]);\n });\n dstSheet.area.right += cols;\n break;\n }\n case 'REMOVE_ROWS': {\n dstSheet.removeRows({\n y: history.ys[0],\n numRows: history.ys.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'REMOVE_COLS': {\n dstSheet.removeCols({\n x: history.xs[0],\n numCols: history.xs.length,\n operator: 'SYSTEM',\n undoReflection: history.undoReflection,\n redoReflection: history.redoReflection,\n });\n break;\n }\n case 'MOVE': {\n if (srcSheet) {\n this._moveCells(srcSheet, dstSheet, history.moveRelations, false);\n }\n break;\n }\n case 'SORT_ROWS': {\n const snapshotIds = dstSheet.idMatrix.flat();\n dstSheet._sortRowMapping(history.sortedRowMapping, false);\n const preserver = new ReferencePreserver(dstSheet);\n preserver.buildMap(snapshotIds, dstSheet.idMatrix.flat());\n preserver.resolveDependents();\n dstSheet._reapplyFilters();\n break;\n }\n }\n this.refresh(shouldTracking(history.operation), true);\n if (dstSheet !== this) {\n dstSheet.addressCaches.clear();\n dstSheet.setTotalSize();\n }\n if (history.operation === 'MOVE' && srcSheet && srcSheet !== dstSheet) {\n this._xsheetDispatch(srcSheet);\n }\n return {\n history,\n callback: ({ sheetReactive: sheetRef }: StoreType) => {\n sheetRef.current?.registry.transmit(history.redoReflection?.transmit);\n },\n };\n }\n /** @internal */\n public getFunctionByName(name: string) {\n return this.registry.functions[name];\n }\n\n /** @internal */\n public clearDependencies(id: Id): void {\n const sys = this.registry.systems[id];\n sys?.dependencies?.forEach((depId) => {\n this.registry.systems[depId]?.dependents?.delete(id);\n });\n if (sys != null) {\n sys.dependencies = new Set();\n }\n }\n\n /** @internal */\n public addDependency(id: Id, dependency: Id): void {\n const sys = ensureSys(this.registry, id);\n if (sys.dependents == null) {\n sys.dependents = new Set();\n }\n sys.dependents.add(dependency);\n const depSys = ensureSys(this.registry, dependency);\n if (depSys.dependencies == null) {\n depSys.dependencies = new Set();\n }\n depSys.dependencies.add(id);\n }\n\n /** @internal */\n public getSolvedCache(point: PointType): [boolean, any] {\n const id = this.getId(point);\n return [this.registry.solvedCaches.has(id), this.registry.solvedCaches.get(id)];\n }\n /** @internal */\n public setSolvingCache(point: PointType) {\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, SOLVING);\n ensureSys(this.registry, id, { tmpAsyncCaches: {} });\n }\n\n /** @internal */\n public finishSolvedCache(point: PointType, value: any) {\n if (SOLVING.is(value)) {\n return;\n }\n\n const id = this.getId(point);\n this.registry.solvedCaches.set(id, value);\n\n const cell = this.registry.data[id];\n if (cell == null) {\n return;\n }\n const sys = this.registry.systems[id];\n const tmp = sys?.tmpAsyncCaches;\n\n if (tmp != null) {\n if (Object.keys(tmp).length > 0) {\n cell.asyncCaches = tmp;\n } else {\n delete cell.asyncCaches;\n }\n delete sys!.tmpAsyncCaches;\n }\n }\n\n /** @internal */\n public clearSolvedCaches() {\n this.registry.solvedCaches.clear();\n for (const id of this.registry.lastSpilledTargetIds) {\n const sys = this.registry.systems[id];\n if (sys?.spilledFrom != null) {\n delete sys.spilledFrom;\n }\n }\n this.registry.lastSpilledTargetIds.clear();\n }\n\n /**\n * Spill a 2D matrix of values starting from the origin cell.\n * The origin cell receives matrix[0][0] and adjacent cells receive spill values in solvedCaches.\n * For a 1×1 matrix, no spill occurs — the single value is cached directly.\n * Throws FormulaError('#REF!') if the spill range is obstructed.\n *\n * @param origin The anchor cell that produced the spill.\n * @param matrix The 2D array of resolved scalar values.\n * @returns The top-left value (matrix[0][0]).\n * @internal\n */\n public spill(origin: PointType, matrix: any[][]): any {\n const numRows = matrix.length;\n const numCols = numRows > 0 ? matrix[0].length : 0;\n\n // Single cell result (1×1) — no spill needed\n if (numRows <= 1 && numCols <= 1) {\n return matrix[0]?.[0];\n }\n\n // Multi-cell result — check for obstructions\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n if (i === 0 && j === 0) {\n continue;\n }\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n const address = p2a(targetPoint);\n if (targetId == null) {\n console.warn(`Spill target ${address} is out of bounds.`);\n continue;\n }\n const targetCell = this.registry.data[targetId];\n if (targetCell?.value != null && targetCell.value !== '') {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because it would overwrite data in ${address}.`,\n );\n }\n // If solvedCaches already has an entry for this cell, another formula\n // (including another spill) has already written here — treat as obstruction.\n if (this.registry.solvedCaches.has(targetId)) {\n throw new FormulaError(\n '#REF!',\n `Array result was not expanded because ${address} is already occupied by another formula.`,\n );\n }\n }\n }\n\n // All clear — write values into solvedCaches\n const originId = this.getId(origin);\n const spilledAddresses: Address[] = [];\n for (let i = 0; i < numRows; i++) {\n for (let j = 0; j < numCols; j++) {\n const targetPoint = { y: origin.y + i, x: origin.x + j };\n const targetId = this.getId(targetPoint);\n if (targetId == null) {\n continue;\n }\n this.finishSolvedCache(targetPoint, matrix[i][j]);\n if (i !== 0 || j !== 0) {\n spilledAddresses.push(p2a(targetPoint));\n // Mark target cell as spilled from the origin formula cell\n if (originId != null) {\n const targetCell = this.registry.data[targetId];\n if (targetCell != null) {\n const sys = ensureSys(this.registry, targetId, {});\n sys.spilledFrom = p2a(origin);\n this.registry.lastSpilledTargetIds.add(targetId);\n }\n }\n }\n }\n }\n\n return matrix[0][0];\n }\n\n /** @internal */\n public sheetPrefix(omit = false) {\n if (omit) {\n return '';\n }\n return toSheetPrefix(this.name);\n }\n /** @internal */\n public rangeToArea(range: string) {\n const cells = range.split(':');\n let [start, end] = cells;\n if (start.match(/[a-zA-Z]$/)) {\n start += '1';\n }\n if (start.match(/^[1-9]/)) {\n start = `A${start}`;\n }\n if (end?.match(/[a-zA-Z]$/)) {\n end += this.bottom;\n }\n if (end?.match(/^[1-9]/)) {\n end = `${x2c(this.right)}${end}`;\n }\n const { y: top, x: left } = a2p(start);\n const { y: bottom, x: right } = a2p(end || start);\n return {\n top: Math.abs(top),\n left: Math.abs(left),\n bottom: Math.abs(bottom),\n right: Math.abs(right),\n };\n }\n\n get __raw__(): Sheet {\n return this;\n }\n\n get shape() {\n return areaShape(this.area);\n }\n get hasSingleCell() {\n const shape = this.shape;\n return shape.rows === 1 && shape.cols === 1;\n }\n get currentVersion() {\n return this.version;\n }\n}\n","import { Pending, SOLVING, Spilling } from '../sentinels';\nimport { Sheet } from '../lib/sheet';\nimport type { Id, MatrixType, PointType, Resolution } from '../types';\nimport { Lexer, Parser } from './evaluator';\nimport { FormulaError } from './formula-error';\n\nexport type SolveOptions = {\n raise?: boolean;\n resolution?: Resolution;\n};\n\ntype SolveFormulaProps = {\n value: any;\n sheet: Sheet;\n point: PointType;\n raise?: boolean;\n resolution?: Resolution;\n at?: Id;\n};\n\n/**\n * Evaluates a single cell value (formula or literal) within the context of a sheet.\n * Handles caching, circular reference detection, spilling, and async pending states.\n * Returns the resolved scalar value (or error) for the given cell.\n */\nexport const solveFormula = ({ value, sheet, point, raise = true, resolution = 'RESOLVED', at }: SolveFormulaProps) => {\n const [hit, cache] = sheet.getSolvedCache(point);\n if (hit && value == null && !SOLVING.is(cache)) {\n // spilled value\n return cache;\n }\n\n if (typeof value !== 'string') {\n return value;\n }\n if (resolution === 'SYSTEM') {\n return value;\n }\n if (value.charAt(0) === \"'\") {\n return resolution === 'RAW' ? value : value.substring(1);\n }\n if (value.charAt(0) !== '=') {\n return value;\n }\n if (resolution === 'RAW') {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n return '=' + lexer.display({ sheet });\n }\n\n let solved: any = value;\n if (hit && !SOLVING.is(cache)) {\n solved = cache;\n } else {\n try {\n const lexer = new Lexer(value.substring(1), { at });\n lexer.tokenize();\n const parser = new Parser(lexer.tokens);\n const expr = parser.build();\n solved = expr?.evaluate?.({ sheet });\n } catch (e) {\n if (raise) {\n sheet.finishSolvedCache(point, e);\n throw e;\n }\n return e;\n }\n }\n\n if (resolution === 'RESOLVED' && solved instanceof Sheet) {\n // Unwrap to scalar (top-left cell of the sheet's area).\n // NOTE: We intentionally call solveSheet directly here instead of stripSheet,\n // to avoid a three-way cycle: solveFormula → stripSheet → solveSheet → solveFormula.\n // The mutual recursion between solveFormula and solveSheet is unavoidable by design,\n // but routing through stripSheet would make the call graph harder to follow and reason about.\n solved = solveSheet({ sheet: solved, raise, at })[0]?.[0];\n }\n // 'EVALUATED' resolution: keep Sheet objects intact (range formulas return Sheet, not scalar).\n\n if (Spilling.is(solved)) {\n solved = sheet.spill(point, solved.matrix);\n } else {\n sheet.finishSolvedCache(point, solved);\n }\n if (Pending.is(solved)) {\n sheet.finishSolvedCache(point, solved);\n }\n return solved;\n};\n\nexport type SolveSheetProps = {\n sheet: Sheet;\n raise?: boolean;\n at?: Id;\n};\n\n/**\n * Evaluates all cells in a Sheet and returns the results as a 2D array (MatrixType).\n * Each cell formula is resolved in order, with caching to avoid redundant computation.\n * Use this when you need the full evaluated contents of a range.\n */\nexport const solveSheet = ({ sheet, raise = true, at }: SolveSheetProps): MatrixType => {\n const area = sheet.area;\n const matrix = sheet._toValueMatrix({ area, at, resolution: 'SYSTEM' });\n return matrix.map((row, i) => {\n const y = area.top + i;\n return row.map((value, j) => {\n const x = area.left + j;\n const point = { y, x };\n const [hit, cache] = sheet.getSolvedCache(point);\n try {\n if (SOLVING.is(cache)) {\n throw new FormulaError('#REF!', 'References are circulating.', new Error(value as string));\n } else if (Pending.is(cache)) {\n return cache;\n } else if (FormulaError.is(cache)) {\n throw cache;\n } else if (cache != null) {\n return cache;\n }\n sheet.setSolvingCache(point);\n const solved = solveFormula({ value, sheet, point, raise, at, resolution: 'RESOLVED' });\n sheet.finishSolvedCache(point, solved);\n return solved;\n } catch (e) {\n sheet.finishSolvedCache(point, e);\n if (raise) {\n throw e;\n }\n return e;\n }\n });\n });\n};\n\nexport type StripSheetProps = {\n value: any;\n at?: Id;\n raise?: boolean;\n};\n\nexport const stripSheet = ({ value, at, raise = true }: StripSheetProps): any => {\n while (value instanceof Sheet) {\n value = solveSheet({ sheet: value, raise, at })[0]?.[0];\n }\n return value;\n};\n","import { Pending, Sentinel, Spilling } from '../../sentinels';\nimport { FormulaError } from '../formula-error';\nimport { ensureSys, setAsyncCache } from '../../lib/cell';\nimport type { Registry } from '../../lib/book';\nimport type { CellType, Id, PointType } from '../../types';\nimport type { Sheet } from '../../lib/sheet';\nimport { toValueMatrix } from '../../lib/sheet_utils';\n\n/**\n * Sentinel value to distinguish cache miss from user-returned undefined/null.\n * Since user functions can return undefined or null, we need a special marker\n * to indicate \"no cache entry found\" vs \"cache entry is undefined\".\n */\nexport const asyncCacheMiss = new Sentinel('asyncCacheMiss');\n\n/** Returns true if any element of `args` is a Pending sentinel. */\nexport const hasPendingArg = (args: any[]): boolean => {\n return args.some((v) => Pending.is(v));\n};\n\nconst isSheet = (value: any): value is Sheet => {\n return value?.__gsType === 'Sheet';\n};\n\n/**\n * Recursively check whether any value in the structure is a Pending sentinel.\n * Handles flat values, nested arrays, and Sheet objects (via getFieldMatrix).\n */\nexport const hasDeepPending = (values: any[], at: Id): boolean => {\n for (const v of values) {\n if (Pending.is(v)) {\n return true;\n }\n if (Array.isArray(v)) {\n if (hasDeepPending(v, at)) {\n return true;\n }\n }\n if (Spilling.is(v)) {\n if (hasDeepPending(v.matrix, at)) {\n return true;\n }\n }\n if (isSheet(v)) {\n if (hasDeepPending(v._toValueMatrix({ at }), at)) {\n return true;\n }\n }\n }\n return false;\n};\n\n/**\n * cyrb53 – a fast, high-quality 53-bit string hash.\n * Returns a non-negative integer that fits safely in a JS Number.\n */\nconst cyrb53 = (str: string, seed = 0): number => {\n let h1 = 0xdeadbeef ^ seed;\n let h2 = 0x41c6ce57 ^ seed;\n for (let i = 0; i < str.length; i++) {\n const ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n};\n\n/**\n * Build a cache key from function name + hashed serialised arguments.\n *\n * Format: `funcName:length:hash1-hash2-...`\n * - length: byte length of the JSON-serialised args\n * - hash: cyrb53 hash of the JSON string, repeated hashPrecision times with different seeds\n *\n * When a Sheet appears as an argument its trimmed area is converted to a\n * value matrix (`any[][]`) via `getFieldMatrix()` so the key reflects the\n * actual cell values the function will operate on.\n */\nexport const buildAsyncCacheKey = (funcName: string, args: any[], hashPrecision: number = 1): string => {\n const argsJson = JSON.stringify(args, (_key, value) => {\n if (isSheet(value)) {\n return toValueMatrix(value);\n }\n if (Pending.is(value)) {\n return null;\n }\n return value;\n });\n const hashes = Array.from({ length: hashPrecision }, (_, i) => cyrb53(argsJson, i).toString(36));\n return `${funcName}:${argsJson.length}:${hashes.join('-')}`;\n};\n\n/**\n * Try to retrieve a cached or pending async result for the given cache key.\n *\n * Returns:\n * - Cached value if present, valid, and not expired\n * - Pending if there is an in-flight promise for this cell\n * - asyncCacheMiss if no cache/pending exists (distinguishes from user-returned undefined/null)\n */\nexport const getAsyncCache = (\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n useInflight: boolean = false,\n): any => {\n const registry = sheet.registry;\n const cell: CellType | undefined = registry.data[id];\n\n if (cell == null) {\n return asyncCacheMiss;\n }\n\n const sys = ensureSys(registry, id, { tmpAsyncCaches: {} });\n\n // Check for a cached result from a previous async run\n if (cell.asyncCaches != null) {\n const ac = cell.asyncCaches[key];\n if (ac != null) {\n // Check expiry\n if (ac.expireTime == null || Date.now() < ac.expireTime) {\n sys.tmpAsyncCaches![key] = ac;\n return ac.value;\n }\n // Expired — will not be copied to tmpAsyncCaches\n }\n }\n\n const compositeKey = `${id}:${key}`;\n\n // Check if there is already a pending promise for this cell+key\n if (registry.asyncPending.has(compositeKey)) {\n return registry.asyncPending.get(compositeKey)!;\n }\n\n // If useInflight is enabled, check for an in-flight promise with the same cache key\n if (useInflight && registry.asyncInflight?.has(key)) {\n const inflight = registry.asyncInflight.get(key)!;\n // Track for this cell+key to prevent duplicate `.then` attachment and correctly yield the pending sentinel\n registry.asyncPending.set(compositeKey, inflight.pending);\n\n // Chain to the shared promise to populate this cell's cache when it resolves\n inflight.pending.promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime: inflight.expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime: inflight.expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n });\n\n return inflight.pending;\n }\n\n return asyncCacheMiss;\n};\n\n/**\n * Handle an async (Promise) result returned by BaseFunction.main().\n *\n * Cache is stored per-cell in cell.asyncCache.\n * In-flight tracking uses Binding.asyncPending (keyed by cell ID).\n * If useInflight is true, also tracks by cache key in Binding.asyncInflight.\n *\n * Flow:\n * 1. If cell has asyncCache and the key matches (inputs unchanged) and not expired → return cached value\n * 2. If there is already an in-flight promise for this cell → return its Pending\n * 3. If useInflight is true and there is an in-flight promise for this key → return its Pending\n * 4. Otherwise start the async work, return a new Pending, and on completion\n * write the result into cell.asyncCache and trigger a re-render.\n *\n * @param ttlMilliseconds - Cache time-to-live in **milliseconds**. undefined = never expires.\n * @param useInflight - If true, reuse the same promise for matching cache keys across different cells.\n */\nexport const awaitAndSave = (\n promise: Promise<any>,\n sheet: { registry: Registry; getId: (p: PointType) => string },\n id: Id,\n key: string,\n ttlMilliseconds?: number,\n useInflight: boolean = false,\n): Pending => {\n const registry = sheet.registry;\n\n // Compute expireTime from ttl (ms)\n const expireTime = ttlMilliseconds != null ? Date.now() + ttlMilliseconds : undefined;\n\n const compositeKey = `${id}:${key}`;\n\n // Start the async computation\n const pending = new Pending(promise);\n registry.asyncPending.set(compositeKey, pending);\n\n // If useInflight is enabled, also track by cache key\n if (useInflight) {\n if (!registry.asyncInflight) {\n registry.asyncInflight = new Map();\n }\n registry.asyncInflight.set(key, { pending, expireTime });\n }\n\n promise\n .then((result: any) => {\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: result, expireTime });\n }\n })\n .catch((e: any) => {\n if (!FormulaError.is(e)) {\n e = new FormulaError('#ASYNC!', e?.message ?? String(e), e instanceof Error ? e : undefined);\n }\n const c = registry.data[id];\n if (c != null) {\n setAsyncCache(c, key, { value: e, expireTime });\n }\n })\n .finally(() => {\n registry.asyncPending.delete(compositeKey);\n // If useInflight was enabled, also remove from asyncInflight\n if (useInflight) {\n if (registry.asyncInflight) {\n registry.asyncInflight.delete(key);\n }\n }\n // Clear solvedCaches so dependent formulas re-evaluate\n registry.solvedCaches.clear();\n // Trigger re-render of all sheets\n registry.transmit();\n });\n\n return pending;\n};\n\n/**\n * Create a Pending sentinel that resolves immediately.\n * Used when an argument is already pending — the result is propagated.\n */\nexport const createPropagatedPending = (): Pending => {\n return new Pending(Promise.resolve());\n};\n","import { type Sheet } from '../../lib/sheet';\n\n/** Duck-type check for Sheet instances (avoids runtime import cycle). */\nexport const isSheet = (v: any): v is Sheet => v?.__gsType === 'Sheet';\n/** Duck-type check for Time instances (avoids runtime import cycle). */\nconst isTime = (v: any): boolean => v != null && v.__gsType === 'Time';\nimport { Spilling } from '../../sentinels';\nimport type { Id } from '../../types';\nimport { FormulaError } from '../formula-error';\nimport { stripSheet } from '../../formula/solver';\nimport type { Expression } from '../evaluator';\nimport {\n hasPendingArg,\n hasDeepPending,\n buildAsyncCacheKey,\n awaitAndSave,\n createPropagatedPending,\n getAsyncCache,\n asyncCacheMiss,\n} from './__async';\nimport { Time } from '../../lib/time';\n\nexport type FunctionCategory =\n | 'math'\n | 'statistics'\n | 'text'\n | 'time'\n | 'lookup'\n | 'information'\n | 'finance'\n | 'engineering'\n | 'logical'\n | 'other';\n\nexport type FunctionProps = {\n args: Expression[];\n sheet: Sheet;\n at?: Id;\n};\n\nexport type FunctionArgumentType = 'number' | 'string' | 'boolean' | 'date' | 'time' | 'matrix' | 'reference' | 'any';\n\nexport type FunctionArgumentDefinition = {\n name: string;\n description: string;\n // if true, this argument can be omitted (i.e. fewer args than defs.length is allowed)\n optional?: boolean;\n // If true, blank will be treated as 0 for numbers, \"\" for strings, etc. Default: true\n nullable?: boolean;\n variadic?: boolean;\n\n errorTolerant?: boolean;\n acceptedTypes?: FunctionArgumentType[];\n /** When true, this argument takes a range/matrix value — broadcasting is suppressed for it. */\n takesMatrix?: boolean;\n};\n\nexport const conditionArg: FunctionArgumentDefinition = {\n name: 'condition',\n description:\n 'The condition to evaluate. Use \"=\" for equal, \"<\" for less than, \">\" for greater than, \"<=\" for less than or equal, \">=\" for greater than or equal, \"<>\" for not equal.',\n acceptedTypes: ['any'],\n};\n\n/**\n * Check whether a value matches one of the allowed type names\n * from a FunctionArgumentDefinition.acceptedTypes array.\n */\nconst matchesType = (\n value: any,\n { nullable = true, errorTolerant = false, acceptedTypes }: FunctionArgumentDefinition,\n): boolean => {\n if (!acceptedTypes || acceptedTypes.length === 0) {\n return true;\n }\n if (value == null) {\n return nullable;\n }\n if (FormulaError.is(value) || value instanceof Error) {\n if (errorTolerant) {\n return true;\n }\n throw value;\n }\n for (const t of acceptedTypes) {\n switch (t) {\n case 'any':\n return true;\n case 'number':\n if (typeof value === 'number') {\n return true;\n }\n break;\n case 'string':\n if (typeof value === 'string') {\n return true;\n }\n break;\n case 'boolean':\n if (typeof value === 'boolean') {\n return true;\n }\n break;\n case 'date':\n if (value instanceof Date) {\n return true;\n }\n break;\n case 'time':\n if (Time.is(value)) {\n return true;\n }\n break;\n case 'matrix':\n if (isMatrix(value)) {\n return true;\n }\n break;\n case 'reference':\n if (isSheet(value)) {\n return true;\n }\n break;\n }\n }\n return false;\n};\n\n/**\n * Check if a value is a \"matrix\" (Sheet, Spilling, or 2D array).\n */\nexport const isMatrix = (value: any): boolean => {\n return isSheet(value) || Spilling.is(value) || (Array.isArray(value) && Array.isArray(value[0]));\n};\n\n/**\n * Extract the scalar from a 1×1 matrix (Sheet, Spilling, or plain 2D array).\n * Returns the value unchanged if it is not a matrix.\n */\nexport const stripMatrix = (value: any, at: Id): any => {\n if (!isMatrix(value)) {\n return value;\n }\n if (isSheet(value)) {\n return stripSheet({ value, raise: false, at });\n }\n const m: any[][] = Spilling.is(value) ? value.matrix : value;\n let val = m?.[0]?.[0];\n return val;\n};\n\n/**\n * Check if a value is a matrix that is larger than 1×1.\n */\nexport const isMultiCell = (value: any): boolean => {\n if (isSheet(value)) {\n return !value.hasSingleCell;\n }\n if (Spilling.is(value)) {\n const m = value.matrix;\n return m.length > 1 || (m.length === 1 && m[0].length > 1);\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value.length > 1 || value[0].length > 1;\n }\n return false;\n};\n\n/**\n * Resolve which FunctionArgumentDefinition index each args position maps to,\n * accounting for variadic args at the tail.\n *\n * Example: args = [A, B(variadic), C(variadic)], args has 7 elements\n * positions 0 → A, 1 → B, 2 → C, 3 → B, 4 → C, 5 → B, 6 → C\n */\nconst resolveParamIndex = (defs: FunctionArgumentDefinition[], argCount: number): number[] => {\n const indices: number[] = [];\n\n // Find the first variadic arg position\n let iterStart = -1;\n let iterCount = 0;\n for (let i = 0; i < defs.length; i++) {\n if (defs[i].variadic) {\n if (iterStart < 0) {\n iterStart = i;\n }\n iterCount++;\n }\n }\n\n for (let i = 0; i < argCount; i++) {\n if (iterStart >= 0 && i >= iterStart) {\n // Map extra args round-robin across variadic args\n const j = (i - iterStart) % iterCount;\n indices.push(iterStart + j);\n } else if (i < defs.length) {\n indices.push(i);\n } else {\n // Beyond defs and no variadic — fall back to last def\n indices.push(defs.length - 1);\n }\n }\n return indices;\n};\n\nexport class BaseFunction {\n public defs: FunctionArgumentDefinition[] = [];\n public example: string | undefined;\n public description = '';\n public category: FunctionCategory = 'other';\n /** Indicates if this function is async. Override in subclass or use BaseFunctionAsync. */\n protected isAsync: boolean = false;\n /** Cache TTL in milliseconds. Override in subclass to set expiry. undefined = never expires. */\n protected ttlMilliseconds?: number;\n /** Hash precision for cache key generation. Higher values reduce collision risk. Default: 1 */\n protected hashPrecision: number = 1;\n /** If true, reuse the same in-flight promise for matching cache keys across different cells. */\n protected useInflight: boolean = true;\n /** If true, broadcasting is unconditionally disabled for this function. */\n protected broadcastDisabled: boolean = false;\n protected args: any[];\n protected autoSpilling: boolean = false;\n public sheet: Sheet;\n public at: Id;\n static __name = '';\n\n constructor({ args, sheet, at }: FunctionProps) {\n this.args = args.map((a) => {\n try {\n return a.evaluate({ sheet });\n } catch (e) {\n return e;\n }\n });\n this.sheet = sheet;\n this.at = at ?? '?';\n }\n\n private _main(...args: any[]): any {\n if (this.autoSpilling) {\n // @ts-expect-error main is not defined in BaseFunction\n return new Spilling(this.main(...args));\n }\n // @ts-expect-error main is not defined in BaseFunction\n return this.main(...args);\n }\n\n /**\n * Validate and normalise arguments before `main()` is called.\n *\n * Checks:\n * 1. Argument count satisfies defs (respecting optional / variadic).\n * 2. Each argument's runtime type matches the corresponding def's `type` list.\n *\n * Subclasses may override for additional coercion / spreading.\n */\n protected validate(args: any[]): any[] {\n const validatedArgs = [...args];\n\n const defs = this.defs;\n if (defs.length === 0) {\n if (args.length !== 0) {\n throw new FormulaError('#N/A', 'Too many arguments: expected 0, got ' + args.length + '.');\n }\n return validatedArgs;\n }\n\n // --- argument count check ---\n // minArgs: count of defs that are neither optional nor variadic,\n // plus non-optional variadic defs (need at least one instance each).\n let minArgs = 0;\n let hasIterable = false;\n let variadicCount = 0;\n for (const d of defs) {\n if (d.variadic) {\n hasIterable = true;\n variadicCount++;\n if (!d.optional) {\n minArgs++;\n }\n } else if (!d.optional) {\n minArgs++;\n }\n }\n\n if (args.length < minArgs) {\n throw new FormulaError('#N/A', `Too few arguments: expected at least ${minArgs}, got ${args.length}.`);\n }\n\n // maxArgs: if no variadic defs, max = defs.length\n if (!hasIterable && args.length > defs.length) {\n throw new FormulaError('#N/A', `Too many arguments: expected at most ${defs.length}, got ${args.length}.`);\n }\n\n // --- per-argument type check ---\n const indices = resolveParamIndex(defs, args.length);\n for (let i = 0; i < args.length; i++) {\n const def = defs[indices[i]];\n if (!def) {\n continue;\n }\n let value = args[i];\n if (!def.acceptedTypes || def.acceptedTypes.length === 0) {\n continue;\n }\n\n if (isMultiCell(value)) {\n if (!def.takesMatrix) {\n continue;\n }\n } else if (isMatrix(value)) {\n // For 1x1 Sheet, Spilling, or plain 2D array, extract the single value for validation.\n // UNLESS the definition explicitly takes a matrix (e.g. SUM(A1) — let it pass through).\n if (!def.takesMatrix) {\n value = stripMatrix(value, this.at);\n }\n }\n if (!matchesType(value, def)) {\n throw new FormulaError(\n '#VALUE!',\n `Argument \"${def.name}\" (position ${i + 1}) expected ${def.acceptedTypes.join(' | ')}, got ${typeof value}.`,\n );\n }\n validatedArgs[i] = value;\n }\n return validatedArgs;\n }\n\n eachMatrix = (value: any, callback: (v: any) => void) => {\n if (isSheet(value)) {\n const matrix = value.solve({ at: this.at, raise: true });\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let r = 0; r < matrix.length; r++) {\n for (let c = 0; c < matrix[r].length; c++) {\n callback(matrix[r][c]);\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let r = 0; r < value.length; r++) {\n for (let c = 0; c < value[r].length; c++) {\n callback(value[r][c]);\n }\n }\n } else {\n callback(value);\n }\n };\n\n /**\n * Extract a 2D array from a matrix value (Spilling, Sheet, or nested array).\n * Default behavior for Sheet is value.solve(). Functions like COL can override\n * this to preserve Sheet metadata per cell.\n */\n protected toMatrix(value: any): any[][] {\n if (Spilling.is(value)) {\n return value.matrix;\n }\n if (isSheet(value)) {\n return value.solve({ at: this.at });\n }\n if (Array.isArray(value) && Array.isArray(value[0])) {\n return value;\n }\n return [[value]];\n }\n\n /**\n * Collapse a 1×1 matrix value (Sheet, Spilling, or 2D array) to a scalar.\n * Non-matrix values pass through unchanged.\n *\n * Override in sub-classes that need the original Sheet / reference\n * metadata (e.g. COL, ROW) — for instance, to extract position\n * information before collapsing.\n */\n protected toScalar(value: any): any {\n if (isSheet(value)) {\n const { rows, cols } = value.shape;\n if (rows === 1 && cols === 1) {\n return value.strip({});\n }\n return value;\n }\n if (Spilling.is(value)) {\n return value.matrix?.[0]?.[0];\n }\n if (Array.isArray(value)) {\n if (Array.isArray(value[0])) {\n return value[0]?.[0];\n }\n return value[0];\n }\n return value;\n }\n\n public call() {\n // Broadcast BEFORE validate, because validate may strip Tables to scalars.\n // broadcast only activates when there are 2+ args and at least one\n // broadcastable arg is a multi-cell matrix.\n const broadcastResult = this.broadcast();\n if (broadcastResult !== undefined) {\n return broadcastResult;\n }\n\n // If any argument is still pending, propagate before validate runs\n // (Pending values would fail type checks in validate).\n if (hasDeepPending(this.args, this.at)) {\n return createPropagatedPending();\n }\n\n this.args = this.validate(this.args);\n\n // For async functions, build cache key and check cache before execution\n if (this.isAsync) {\n const key = buildAsyncCacheKey(this.constructor.name, this.args, this.hashPrecision);\n const cached = getAsyncCache(this.sheet, this.at, key, this.useInflight);\n if (cached !== asyncCacheMiss) {\n return cached;\n }\n\n const promise = this._main(...this.args);\n return awaitAndSave(promise, this.sheet, this.at, key, this.ttlMilliseconds, this.useInflight);\n }\n\n // For sync functions, just call and return\n return this._main(...this.args);\n }\n\n /**\n * If any broadcastable argument is a matrix (multi-cell), expand the call\n * across all element positions and return a Spilling.\n * Returns `undefined` when no broadcast is necessary.\n *\n * Rules:\n * - broadcastDisabled = true → never broadcast\n * - An arg is broadcastable when its corresponding args[].takesMatrix is not true\n * - A Sheet/Spilling/2D-array whose size is (1,1) is treated as a scalar\n * (not broadcast); only multi-cell matrices trigger broadcast\n * - For variadic args, extra args are assigned round-robin\n * across the variadic helpArg positions\n */\n private broadcast(): any[][] | undefined {\n if (this.broadcastDisabled) {\n return undefined;\n }\n\n // Map each args index to its corresponding args index\n const helpIndices = resolveParamIndex(this.defs, this.args.length);\n\n // Determine which arg positions are broadcastable (takesMatrix: true suppresses broadcasting).\n const broadcastable: boolean[] = this.args.map((_, i) => {\n const hIdx = helpIndices[i];\n return !this.defs[hIdx]?.takesMatrix;\n });\n\n // Collect matrices only for broadcastable positions whose value is a multi-cell matrix\n const matrices: (any[][] | null)[] = this.args.map((arg, i) => {\n if (broadcastable[i] && isMultiCell(arg)) {\n return this.toMatrix(arg);\n }\n return null;\n });\n\n // If no broadcastable arg is actually a multi-cell matrix, nothing to do\n if (matrices.every((m) => m === null)) {\n return undefined;\n }\n\n // Collapse 1×1 matrix args (non-broadcast) to scalars for the cell-level calls\n const scalarArgs = this.args.map((arg, i) => {\n if (matrices[i] !== null) {\n return arg;\n } // will be expanded per-cell\n return this.toScalar(arg);\n });\n\n // Compute the max rows / cols across all matrix arguments\n let maxRows = 1;\n let maxCols = 1;\n for (const m of matrices) {\n if (m) {\n maxRows = Math.max(maxRows, m.length);\n maxCols = Math.max(\n maxCols,\n m.reduce((acc, row) => Math.max(acc, row.length), 0),\n );\n }\n }\n\n // Save original args so we can restore after each cell iteration\n const originalBareArgs = this.args;\n\n // Iterate over every (row, col) position\n const result: any[][] = [];\n for (let r = 0; r < maxRows; r++) {\n const row: any[] = [];\n for (let c = 0; c < maxCols; c++) {\n // Build the argument list for this cell position\n const cellArgs = scalarArgs.map((arg, i) => {\n const m = matrices[i];\n if (m) {\n // If the position exists in the matrix, use it; otherwise null\n return m?.[r]?.[c] ?? null;\n }\n return arg;\n });\n try {\n if (hasPendingArg(cellArgs)) {\n row.push(createPropagatedPending());\n } else {\n // Validate cell-level args\n const validatedArgs = this.validate(cellArgs);\n if (hasDeepPending(validatedArgs, this.at)) {\n row.push(createPropagatedPending());\n } else {\n row.push(this._main(...validatedArgs));\n }\n }\n } catch (e) {\n row.push(e);\n }\n }\n result.push(row);\n }\n\n // Restore original args\n this.args = originalBareArgs;\n\n return result;\n }\n}\n\n/**\n * Base class for async functions.\n * Extend this class to create async functions that support caching.\n */\nexport class BaseFunctionAsync extends BaseFunction {\n protected isAsync: boolean = true;\n}\n\nexport type FunctionMapping = { [functionName: string]: typeof BaseFunction };\n","import { stripSheet } from '../solver';\nimport { Sheet } from '../../lib/sheet';\nimport { FormulaError } from '../formula-error';\nimport dayjs from 'dayjs';\nimport { FULLDATE_FORMAT_UTC } from '../../constants';\nimport { Pending, Spilling } from '../../sentinels';\nimport type { Id, PointType } from '../../types';\nimport { Time } from '../../lib/time';\n\nexport const gt = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) > ensureString(right);\n }\n try {\n return ensureNumber(left) > ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const gte = (left: any, right: any): boolean => {\n if (typeof left === 'string' || typeof right === 'string') {\n return ensureString(left) >= ensureString(right);\n }\n try {\n return ensureNumber(left) >= ensureNumber(right);\n } catch {\n return false;\n }\n};\n\nexport const lt = (left: any, right: any): boolean => {\n return !gte(left, right);\n};\n\nexport const lte = (left: any, right: any): boolean => {\n return !gt(left, right);\n};\n\nexport const eq = (left: any, right: any): boolean => {\n return ensureString(left).toLowerCase() === ensureString(right).toLowerCase();\n};\n\nexport const ne = (left: any, right: any): boolean => {\n return !eq(left, right);\n};\n\nexport type EnsureNumberOptions = {\n alternative?: number;\n ignore?: boolean;\n};\n\nexport type EnsureBooleanOptions = {\n alternative?: boolean;\n ignore?: boolean;\n};\n\nexport const ensureNumber = (value: any, options?: EnsureNumberOptions): number => {\n const { alternative, ignore } = options || {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (!value) {\n // falsy is 0\n return 0;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureNumber(v, { alternative });\n }\n if (value instanceof Date) {\n return value.getTime();\n }\n if (Time.is(value)) {\n return value.days;\n }\n\n if (typeof value === 'string' && value.endsWith('%')) {\n const num = parseFloat(value.slice(0, -1));\n if (!isNaN(num)) {\n return num / 100;\n }\n }\n\n const num = parseFloat(value as string);\n if (isNaN(num)) {\n if (ignore) {\n return alternative ?? 0;\n }\n throw new FormulaError('#VALUE!', `${value} cannot be converted to a number`);\n }\n return num;\n};\n\nexport const ensureString = (value: any): string => {\n if (Pending.is(value)) {\n return value as any;\n }\n if (value === 0) {\n return '0';\n }\n if (!value) {\n return '';\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureString(v);\n }\n switch (value.constructor.name) {\n case 'Date': {\n const d: Date = value;\n return dayjs(d).format(FULLDATE_FORMAT_UTC);\n }\n default:\n return String(value);\n }\n};\n\nexport const ensureBoolean = (value: any, options?: EnsureBooleanOptions): boolean => {\n const { alternative, ignore } = options ?? {};\n if (Pending.is(value)) {\n return value as any;\n }\n if (typeof value === 'undefined' && typeof alternative !== 'undefined') {\n return alternative;\n }\n if (value === null) {\n return false;\n }\n if (value instanceof Sheet) {\n const v = stripSheet({ value });\n return ensureBoolean(v, options);\n }\n if (typeof value === 'string' || value instanceof String) {\n const bool = { true: true, false: false }[value.toLowerCase()];\n if (bool == null) {\n if (ignore) {\n return false;\n }\n throw new FormulaError('#VALUE!', `text '${value as string}' cannot be converted to a boolean`);\n }\n return bool;\n }\n return Boolean(value);\n};\n\nconst CONDITION_REGEX = /^(<=|>=|<>|>|<|=)?(.*)$/;\n\nexport const check = (value: any, condition: string): boolean => {\n const m = condition.match(CONDITION_REGEX);\n\n const [, expr = '', target = ''] = m || [];\n let comparison: any = target;\n if (expr === '>' || expr === '<' || expr === '>=' || expr === '<=') {\n if (typeof value === 'number') {\n comparison = parseFloat(target);\n }\n switch (expr) {\n case '>':\n return gt(value, comparison);\n case '>=':\n return gte(value, comparison);\n case '<':\n return lt(value, comparison);\n case '<=':\n return lte(value, comparison);\n }\n }\n\n const equals = expr === '' || expr === '=';\n if (target === '') {\n // empty target means \"\" or \"<>\"\n return (value == null || value === '') === equals;\n }\n\n if (typeof value === 'string' || value instanceof String) {\n const replaced = target\n .replace(/~\\*/g, '(\\\\*)')\n .replace(/~\\?/g, '(\\\\?)')\n .replace(/\\*/g, '(.*)')\n .replace(/\\?/g, '(.)');\n const regex = RegExp(`^${replaced}$`, 'i');\n return regex.test(value as string) === equals;\n }\n return eq(value, comparison) === equals;\n};\n\nexport const eachMatrix = (value: any, callback: (v: any, relativePoint: PointType) => void, at: Id) => {\n if (value instanceof Sheet) {\n const matrix = value.solve({ at });\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Spilling.is(value)) {\n const matrix = value.matrix;\n for (let y = 0; y < matrix.length; y++) {\n for (let x = 0; x < matrix[y].length; x++) {\n callback(matrix[y][x], { y, x });\n }\n }\n } else if (Array.isArray(value) && Array.isArray(value[0])) {\n for (let y = 0; y < value.length; y++) {\n for (let x = 0; x < value[y].length; x++) {\n callback(value[y][x], { y, x });\n }\n }\n } else {\n callback(value, { y: 0, x: 0 });\n }\n};\n\nexport const createBooleanMask = (sheets: Sheet[], conditions: string[], at: Id): boolean[][] => {\n if (sheets.length === 0) {\n return [];\n }\n const refRange = sheets[0];\n const numRows = refRange.numRows;\n const numCols = refRange.numCols;\n\n const mask: boolean[][] = Array.from({ length: numRows }, () => Array(numCols).fill(true));\n\n for (let p = 0; p < sheets.length; p++) {\n const condRange = sheets[p];\n const condition = conditions[p];\n eachMatrix(\n condRange,\n (v: any, pt: PointType) => {\n mask[pt.y][pt.x] &&= check(v, condition);\n },\n at,\n );\n }\n return mask;\n};\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { BaseFunction, type FunctionCategory, type FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { Time } from '../../lib/time';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the sum of two numbers.\nThis is the same as the '+' operator.`;\n\nexport class AddFunction extends BaseFunction {\n example = 'ADD(2, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First additive.', acceptedTypes: ['number', 'date', 'time'] },\n { name: 'value2', description: 'Second additive.', acceptedTypes: ['number', 'date', 'time'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 + v2;\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).add(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).add(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .add(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n if (typeof v1 === 'number' && v2 instanceof Date) {\n return dayjs(v2)\n .add(v1 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) + ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for augend or addend.');\n }\n }\n}\n","import dayjs from 'dayjs';\n\nimport { FormulaError } from '../formula-error';\nimport { Time } from '../../lib/time';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\nimport { SECONDS_IN_DAY } from '../../constants';\n\nconst description = `Returns the difference of two numbers.\nThis is the same as the '-' operator.`;\n\nexport class MinusFunction extends BaseFunction {\n example = 'MINUS(8, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number', 'date', 'time'] },\n {\n name: 'value2',\n description: 'A number that will subtract from value1.',\n acceptedTypes: ['number', 'date', 'time'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: number | Date | Time, v2: number | Date | Time) {\n if (typeof v1 === 'number' && typeof v2 === 'number') {\n return v1 - v2;\n }\n if (v1 instanceof Date && v2 instanceof Date) {\n return Time.fromDates(v1, v2);\n }\n if (v1 instanceof Date && Time.is(v2)) {\n return Time.ensure(v2).sub(v1);\n }\n if (Time.is(v1) && v2 instanceof Date) {\n return Time.ensure(v1).sub(v2);\n }\n if (v1 instanceof Date && typeof v2 === 'number') {\n return dayjs(v1)\n .subtract(v2 * SECONDS_IN_DAY, 'second')\n .toDate();\n }\n try {\n return ensureNumber(v1, { alternative: 0 }) - ensureNumber(v2, { alternative: 0 });\n } catch (e) {\n throw new FormulaError('#VALUE!', 'Mismatched types for minuend or subtrahend.');\n }\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the product of two numbers.\nThis is the same as the '*' operator.`;\n\nexport class MultiplyFunction extends BaseFunction {\n example = 'MULTIPLY(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'factor1', description: 'First factor.', acceptedTypes: ['number'] },\n { name: 'factor2', description: 'Second factor.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any, v2: any) {\n return ensureNumber(v1) * ensureNumber(v2);\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the result of dividing one number by another.\nThis is the same as the '/' operator.`;\n\nexport class DivideFunction extends BaseFunction {\n example = 'DIVIDE(4, 2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'dividend',\n description: 'A number that will be divided by divisor.',\n acceptedTypes: ['number'],\n },\n {\n name: 'divisor',\n description: 'A number that will divide a dividend. Must be non-zero.',\n acceptedTypes: ['number'],\n },\n ];\n category: FunctionCategory = 'math';\n\n protected validate(args: any[]): any[] {\n const validated = super.validate(args).map((arg) => ensureNumber(arg));\n if (validated[1] === 0) {\n throw new FormulaError('#DIV/0!', 'The second argument must be non-zero.');\n }\n return validated;\n }\n\n protected main(divided: number, divisor: number) {\n return divided / divisor;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the sum of a series of numbers or cells.`;\n\nexport class SumFunction extends BaseFunction {\n example = 'SUM(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to sum.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n if (values.length === 0) {\n return 0;\n }\n let sum = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n sum += ensureNumber(v, { ignore: true });\n },\n this.at,\n );\n });\n return sum;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the concatenation of two values.\nThis is the same as the '&' operator.`;\n\nexport class ConcatFunction extends BaseFunction {\n example = 'CONCAT(\"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value1',\n description: 'A value to be concatenated with value2.',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n {\n name: 'value2',\n description: 'A value to be concatenated with value1',\n acceptedTypes: ['string', 'number', 'boolean'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(v1: any, v2: any) {\n return ensureString(v1) + ensureString(v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eq } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are equal, FALSE if they are not.\nThis is the same as the '=' operator.`;\n\nexport class EqFunction extends BaseFunction {\n example = 'EQ(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return eq(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ne } from './__utils';\n\nconst description = `Returns TRUE if the two specified values are not equal, FALSE if they are.\nThis is the same as the '<>' operator.`;\n\nexport class NeFunction extends BaseFunction {\n example = 'NE(6, 7)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: number, v2: number) {\n return ne(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truly greater than the second, FALSE otherwise.\nThis is the same as the '>' operator.`;\n\nexport class GtFunction extends BaseFunction {\n example = 'GT(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { gte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is greater than the second, FALSE otherwise.\nThis is the same as the '>=' operator.`;\n\nexport class GteFunction extends BaseFunction {\n example = 'GTE(5, 3)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return gte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lt } from './__utils';\n\nconst description = `Returns TRUE if the first argument is truely less than the second argument, FALSE otherwise.\nThis is the same as the '<' operator.`;\n\nexport class LtFunction extends BaseFunction {\n example = 'LT(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lt(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { lte } from './__utils';\n\nconst description = `Returns TRUE if the first argument is less than the second argument, FALSE otherwise.\nThis is the same as the '<=' operator.`;\n\nexport class LteFunction extends BaseFunction {\n example = 'LTE(3, 6)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'First value.', acceptedTypes: ['any'] },\n { name: 'value2', description: 'A value to be compared with value1.', acceptedTypes: ['any'] },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any, v2: any) {\n return lte(v1, v2);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Returns a serial value corresponding to the current date and time.`;\n\nexport class NowFunction extends BaseFunction {\n example = 'NOW()';\n description = description;\n defs: FunctionArgumentDefinition[] = [];\n category: FunctionCategory = 'time';\n\n protected main() {\n return new Date();\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if all arguments are logically TRUE.\nReturns FALSE if any argument is logically FALSE.`;\n\nexport class AndFunction extends BaseFunction {\n example = 'AND(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a && b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns TRUE if any argument is logically true.\nReturns FALSE if all arguments are logically false.`;\n\nexport class OrFunction extends BaseFunction {\n example = 'OR(A1=1, A2=2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'expression',\n description: 'Logical expressions to evaluate.',\n acceptedTypes: ['boolean', 'number'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(...values: any[]) {\n return values.map((v) => ensureBoolean(v)).reduce((a, b) => a || b);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `If the logical expression is TRUE, the second argument is returned.\nIf FALSE, the third argument is returned.`;\n\nexport class IfFunction extends BaseFunction {\n example = 'IF(A2 = \"Human\", \"Hello\", \"World\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'condition', description: 'An expression as a condition', acceptedTypes: ['any'] },\n {\n name: 'value1',\n description: 'value to be returned if the condition is true.',\n acceptedTypes: ['any'],\n },\n {\n name: 'value2',\n description: 'value to be returned if the condition is false.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(condition: any, v1: any, v2: any = false) {\n return ensureBoolean(condition) ? v1 : v2;\n }\n}\n","// DO NOT COPY THIS CODE FOR THE OTHER.\nimport { FormulaError } from '../formula-error';\nimport {\n FunctionArgumentDefinition,\n BaseFunction,\n FunctionCategory,\n isMatrix,\n isMultiCell,\n stripMatrix,\n} from './__base';\n\nconst description = `Returns the first argument if it is not an error value, otherwise returns the second argument if present, or a blank if the second argument is absent.`;\n\nexport class IfErrorFunction extends BaseFunction {\n example = 'IFERROR(A1, \"Error in cell A1\")';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The value to return if value itself is not an error.',\n acceptedTypes: ['any'],\n errorTolerant: true,\n },\n {\n name: 'value_if_error',\n description: 'The value the function returns if value is an error.',\n optional: true,\n acceptedTypes: ['any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any, valueIfError?: any) {\n if (FormulaError.is(value) || value instanceof Error) {\n return valueIfError;\n }\n return value;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureBoolean } from './__utils';\n\nconst description = `Returns the inverse of the Boolean; if TRUE, NOT returns FALSE.\nIf FALSE, NOT returns TRUE.`;\n\nexport class NotFunction extends BaseFunction {\n example = 'NOT(TRUE)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'logical expression',\n description: 'A logical expression as a boolean.',\n acceptedTypes: ['boolean', 'number'],\n },\n ];\n category: FunctionCategory = 'logical';\n\n protected main(v1: any) {\n return !ensureBoolean(v1);\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the count of a series of numbers or cells.`;\n\nexport class CountFunction extends BaseFunction {\n example = 'COUNT(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n count++;\n }\n },\n this.at,\n );\n } else {\n ensureNumber(val);\n count++;\n }\n });\n return count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns the absolute value of a number`;\n\nexport class AbsFunction extends BaseFunction {\n example = 'ABS(-2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [{ name: 'value', description: 'target number', acceptedTypes: ['number'] }];\n category: FunctionCategory = 'math';\n\n protected main(value: any) {\n return Math.abs(ensureNumber(value));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number multiplied by an exponent.`;\n\nexport class PowerFunction extends BaseFunction {\n example = 'POWER(4,0.5)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'base', description: 'A number to be multiplied by an exponent.', acceptedTypes: ['number'] },\n { name: 'exponent', description: 'An exponent to power the base.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(base: any, exponent: any) {\n return Math.pow(ensureNumber(base), ensureNumber(exponent));\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { eachMatrix } from './__utils';\n\nconst description = `Returns the number of values in the data set.`;\n\nexport class CountaFunction extends BaseFunction {\n example = 'COUNTA(A2:A100,B2:B100,4,26)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Values or ranges to count.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'math';\n\n protected main(...values: any[]) {\n let count = 0;\n values.forEach((val) => {\n eachMatrix(\n val,\n (v) => {\n if (v != null && v !== '') {\n count++;\n }\n },\n this.at,\n );\n });\n return count;\n }\n}\n","import { FormulaError } from '../formula-error';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the average of a series of numbers or cells.`;\n\nexport class AverageFunction extends BaseFunction {\n example = 'AVERAGE(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to average.',\n takesMatrix: true,\n acceptedTypes: ['number', 'matrix'],\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let sum = 0;\n let count = 0;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n sum += v;\n count++;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n sum += num;\n count++;\n }\n });\n\n if (count === 0) {\n throw new FormulaError('#DIV/0!', 'Evaluation of function AVERAGE caused a divide by zero error.');\n }\n return sum / count;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the max in a series of numbers or cells.`;\n\nexport class MaxFunction extends BaseFunction {\n example = 'MAX(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find max from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let max = -Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n if (v > max) {\n max = v;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num > max) {\n max = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? max : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition, isMatrix } from './__base';\nimport { ensureNumber, eachMatrix } from './__utils';\n\nconst description = `Returns the min in a series of numbers or cells.`;\n\nexport class MinFunction extends BaseFunction {\n example = 'MIN(A2:A100, 101)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'Numbers or ranges to find min from.',\n acceptedTypes: ['number', 'matrix'],\n takesMatrix: true,\n variadic: true,\n },\n ];\n category: FunctionCategory = 'statistics';\n\n protected main(...values: any[]) {\n let min = Infinity;\n let hasValues = false;\n values.forEach((val) => {\n if (isMatrix(val)) {\n eachMatrix(\n val,\n (v) => {\n if (typeof v === 'number') {\n if (v < min) {\n min = v;\n }\n hasValues = true;\n }\n },\n this.at,\n );\n } else {\n const num = ensureNumber(val);\n if (num < min) {\n min = num;\n }\n hasValues = true;\n }\n });\n return hasValues ? min : 0;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureString } from './__utils';\n\nconst description = `Returns the length of a string.`;\n\nexport class LenFunction extends BaseFunction {\n example = 'LEN(A2)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'text',\n description: 'A text to be returned the length.',\n acceptedTypes: ['string', 'number'],\n },\n ];\n category: FunctionCategory = 'text';\n\n protected main(text: any) {\n return ensureString(text).length;\n }\n}\n","import { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\nimport { ensureNumber } from './__utils';\n\nconst description = `Returns a number with positive and negative values reversed.`;\n\nexport class UminusFunction extends BaseFunction {\n example = 'UMINUS(4)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n { name: 'value1', description: 'A number that will be subtracted.', acceptedTypes: ['number'] },\n ];\n category: FunctionCategory = 'math';\n\n protected main(v1: any) {\n return -ensureNumber(v1);\n }\n}\n","import { Sheet } from '../../lib/sheet';\nimport { Spilling } from '../../sentinels';\nimport { BaseFunction, FunctionCategory, FunctionArgumentDefinition } from './__base';\n\nconst description = `Enables the display of values returned from an array formula into multiple rows and/or columns.\nIf the argument is already a Spilling, it is returned as-is. If it is a Sheet (range reference), the field matrix is extracted and wrapped in a Spilling. Otherwise the value is wrapped as a single-element Spilling.`;\n\nexport class ArrayformulaFunction extends BaseFunction {\n autoSpilling = true;\n example = 'ARRAYFORMULA(A1:A10 * B1:B10)';\n description = description;\n defs: FunctionArgumentDefinition[] = [\n {\n name: 'value',\n description: 'The array expression or value to evaluate.',\n takesMatrix: true,\n acceptedTypes: ['matrix', 'any'],\n },\n ];\n category: FunctionCategory = 'logical';\n protected broadcastDisabled = true;\n\n protected main(value: any) {\n if (Spilling.is(value)) {\n return value;\n }\n if (value instanceof Sheet) {\n return value._toValueMatrix();\n }\n if (Array.isArray(value)) {\n return value;\n }\n return [[value]];\n }\n}\n","import { AddFunction } from './functions/add';\nimport { MinusFunction } from './functions/minus';\nimport { MultiplyFunction } from './functions/multiply';\nimport { DivideFunction } from './functions/divide';\nimport { SumFunction } from './functions/sum';\nimport { ConcatFunction } from './functions/concat';\nimport { EqFunction } from './functions/eq';\nimport { NeFunction } from './functions/ne';\nimport { GtFunction } from './functions/gt';\nimport { GteFunction } from './functions/gte';\nimport { LtFunction } from './functions/lt';\nimport { LteFunction } from './functions/lte';\nimport { NowFunction } from './functions/now';\nimport { AndFunction } from './functions/and';\nimport { OrFunction } from './functions/or';\nimport { IfFunction } from './functions/if';\nimport { IfErrorFunction } from './functions/iferror';\nimport { NotFunction } from './functions/not';\nimport { CountFunction } from './functions/count';\nimport { AbsFunction } from './functions/abs';\nimport { PowerFunction } from './functions/power';\nimport { CountaFunction } from './functions/counta';\nimport { AverageFunction } from './functions/average';\nimport { MaxFunction } from './functions/max';\nimport { MinFunction } from './functions/min';\nimport { LenFunction } from './functions/len';\nimport { UminusFunction } from './functions/uminus';\nimport { ArrayformulaFunction } from './functions/arrayformula';\nimport type { FunctionCategory, FunctionMapping, FunctionArgumentDefinition } from './functions/__base';\n\nexport const functions: FunctionMapping = {\n // Arithmetic & Comparison\n add: AddFunction,\n minus: MinusFunction,\n uminus: UminusFunction,\n multiply: MultiplyFunction,\n divide: DivideFunction,\n pow: PowerFunction,\n power: PowerFunction,\n concat: ConcatFunction,\n eq: EqFunction,\n ne: NeFunction,\n gt: GtFunction,\n gte: GteFunction,\n lt: LtFunction,\n lte: LteFunction,\n\n // Logical\n if: IfFunction,\n iferror: IfErrorFunction,\n and: AndFunction,\n or: OrFunction,\n not: NotFunction,\n arrayformula: ArrayformulaFunction,\n\n // Statistics & Aggregation\n sum: SumFunction,\n max: MaxFunction,\n min: MinFunction,\n average: AverageFunction,\n count: CountFunction,\n counta: CountaFunction,\n\n // Text\n len: LenFunction,\n\n // Math\n abs: AbsFunction,\n\n // Time\n now: NowFunction,\n};\n\nexport type FunctionHelp = {\n name: string;\n category: FunctionCategory;\n example: string;\n description: string;\n defs: FunctionArgumentDefinition[];\n};\n\nconst _functionHelpsCache = new Map<FunctionMapping, FunctionHelp[]>();\n\nexport const getFunctionHelps = (customFunctions: FunctionMapping = functions): FunctionHelp[] => {\n let helps = _functionHelpsCache.get(customFunctions);\n if (!helps) {\n helps = Object.keys(customFunctions).map((name) => {\n const FnClass = customFunctions[name];\n const instance = new FnClass({ args: [], sheet: {} as any });\n return {\n name: name.toUpperCase(),\n category: instance.category,\n example: instance.example ?? FnClass?.__name ?? 'Unknown',\n description: instance.description ?? '',\n defs: instance.defs || [],\n };\n });\n _functionHelpsCache.set(customFunctions, helps);\n }\n return helps;\n};\n","import { useState, useMemo, useCallback } from 'react';\nimport { getFunctionHelps, type FunctionHelp } from '../formula/mapping';\nimport type { FunctionMapping } from '../formula/functions/__base';\nimport type { AutocompleteOption } from '../policy/core';\nimport { Lexer } from '../formula/evaluator';\n\ntype UseAutocompleteProps = {\n inputting: string;\n selectionStart: number;\n optionsAll: AutocompleteOption[];\n functions?: FunctionMapping;\n};\n\nexport const useAutocomplete = ({ inputting, selectionStart, optionsAll, functions }: UseAutocompleteProps) => {\n const [selected, setSelected] = useState(0);\n\n const { filteredOptions, matchParams, activeFunctionHelp, activeArgIndex } = useMemo(() => {\n const isFormula = inputting.startsWith('=');\n\n let activeFunctionHelp: FunctionHelp | null = null;\n let activeArgIndex: number = 0;\n\n const textBeforeCursor = inputting.slice(0, selectionStart);\n const textAfterCursor = inputting.slice(selectionStart);\n\n // --- Active Argument Context Tracking ---\n if (isFormula && textBeforeCursor.length > 1) {\n try {\n const textToCursor = textBeforeCursor.slice(1); // skip '='\n const lexer = new Lexer(textToCursor);\n lexer.tokenize();\n\n const functionStack: { name: string; argIndex: number; hasWaitComma: boolean }[] = [];\n\n for (let i = 0; i < lexer.tokens.length; i++) {\n const token = lexer.tokens[i];\n if (token.type === 'FUNCTION') {\n const nextToken = lexer.tokens[i + 1];\n if (nextToken?.type === 'OPEN') {\n functionStack.push({ name: token.entity as string, argIndex: 0, hasWaitComma: false });\n i++; // skip OPEN\n } else if (i === lexer.tokens.length - 1) {\n // Function keyword right before cursor but without paren yet!\n // Do nothing special here, autocomplete dropdown will handle it.\n }\n } else if (token.type === 'COMMA') {\n if (functionStack.length > 0) {\n functionStack[functionStack.length - 1].argIndex++;\n functionStack[functionStack.length - 1].hasWaitComma = true;\n }\n } else if (token.type === 'CLOSE') {\n if (functionStack.length > 0) {\n functionStack.pop();\n }\n } else if (token.type !== 'SPACE' && functionStack.length > 0) {\n functionStack[functionStack.length - 1].hasWaitComma = false;\n }\n }\n\n if (functionStack.length > 0) {\n const activeItem = functionStack[functionStack.length - 1];\n const helps = getFunctionHelps(functions);\n activeArgIndex = activeItem.argIndex;\n activeFunctionHelp = helps.find((h: any) => h.name === activeItem.name.toUpperCase()) || null;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n const wordBefore = textBeforeCursor.match(/[a-zA-Z0-9_.]+$/)?.[0] || '';\n const wordAfter = textAfterCursor.match(/^[a-zA-Z0-9_.]+/)?.[0] || '';\n\n // For regular cells, we use the whole word as the search target.\n // For formulas, we extract the word under the cursor.\n const currentWord = isFormula ? (wordBefore + wordAfter).toLowerCase() : inputting.toLocaleLowerCase();\n const hasOpenParenAssigned = isFormula && textAfterCursor.slice(wordAfter.length).trimStart().startsWith('(');\n\n let filtered: any[] = [];\n\n let isOnAddress = false;\n if (isFormula) {\n try {\n const fullLexer = new Lexer(inputting.slice(1));\n fullLexer.tokenize();\n let currentIndex = 1; // start after '='\n for (const token of fullLexer.tokens) {\n const tLen = token.length();\n if (selectionStart > currentIndex && selectionStart < currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n // Inside a string literal (VALUE token whose entity is a string)\n if (token.type === 'VALUE' && typeof token.entity === 'string') {\n isOnAddress = true;\n }\n break;\n }\n if (selectionStart === currentIndex || selectionStart === currentIndex + tLen) {\n if (['REF', 'RANGE', 'ID', 'ID_RANGE', 'UNREFERENCED'].includes(token.type)) {\n isOnAddress = true;\n }\n }\n currentIndex += tLen;\n }\n } catch (e) {\n /* ignore parse errors */\n }\n }\n\n if (isFormula && !isOnAddress) {\n // Suggest if we have at least 1 letter, and there isn't already an opening parenthesis attached\n if (currentWord.length > 0 && !hasOpenParenAssigned) {\n filtered = getFunctionHelps(functions)\n .map((help: any) => {\n const keywordLower = help.name.toLowerCase();\n const startsWith = keywordLower.startsWith(currentWord);\n const index = startsWith ? 0 : -1;\n const hasNoArgs = help.defs.length === 0;\n return {\n option: { ...help, value: help.name + (hasNoArgs ? '()' : '('), isFunction: true, label: help.name },\n index,\n startsWith,\n keywordCount: 1,\n keyword: keywordLower,\n };\n })\n .filter(({ startsWith }: { startsWith: boolean }) => startsWith)\n .sort((a: any, b: any) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }: { option: any }) => option);\n }\n } else {\n filtered = optionsAll\n .map((option) => {\n const keywords = option.keywords ?? [String(option.value)];\n let bestMatch = { index: -1, startsWith: false, keyword: '' };\n\n for (const keyword of keywords) {\n const keywordLower = keyword.toLowerCase();\n const index = keywordLower.indexOf(currentWord);\n if (index !== -1) {\n const startsWith = keywordLower.startsWith(currentWord);\n if (\n bestMatch.index === -1 ||\n index < bestMatch.index ||\n (index === bestMatch.index && startsWith && !bestMatch.startsWith)\n ) {\n bestMatch = { index, startsWith, keyword };\n }\n }\n }\n\n return {\n option,\n ...bestMatch,\n keywordCount: keywords.length,\n };\n })\n .filter(({ index }) => index !== -1)\n .sort((a, b) => {\n if (a.startsWith !== b.startsWith) {\n return b.startsWith ? 1 : -1;\n }\n if (a.index !== b.index) {\n return a.index - b.index;\n }\n if (a.keywordCount !== b.keywordCount) {\n return b.keywordCount - a.keywordCount;\n }\n return a.keyword.localeCompare(b.keyword);\n })\n .map(({ option }) => option);\n }\n\n return {\n filteredOptions: filtered,\n matchParams: {\n isFormula,\n currentWord,\n matchLengthBefore: wordBefore.length,\n matchLengthAfter: wordAfter.length,\n },\n activeFunctionHelp,\n activeArgIndex,\n };\n }, [inputting, selectionStart, optionsAll, functions]);\n\n useMemo(() => {\n if (selected >= filteredOptions.length) {\n setSelected(0);\n }\n }, [filteredOptions.length, selected]);\n\n const replaceWithOption = useCallback(\n (option: any) => {\n if (!option) {\n return { value: inputting, selectionStart };\n }\n\n if (matchParams.isFormula) {\n const beforeMatch = inputting.slice(0, selectionStart - matchParams.matchLengthBefore);\n const afterMatch = inputting.slice(selectionStart + matchParams.matchLengthAfter);\n const newValue = beforeMatch + option.value + afterMatch;\n return { value: newValue, selectionStart: beforeMatch.length + option.value.length };\n } else {\n return { value: String(option.value), selectionStart: String(option.value).length };\n }\n },\n [inputting, selectionStart, matchParams],\n );\n\n const handleArrowUp = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s <= 0 ? filteredOptions.length - 1 : s - 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n const handleArrowDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (filteredOptions.length > 1) {\n setSelected((s) => (s >= filteredOptions.length - 1 ? 0 : s + 1));\n e.preventDefault();\n return true;\n }\n return false;\n },\n [filteredOptions.length],\n );\n\n return {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula: matchParams.isFormula,\n activeFunctionHelp,\n activeArgIndex,\n };\n};\n","import { useEffect, useState, useRef } from 'react';\n\n// Return the document object with SSR.\nexport const useBrowser = () => {\n const [ok, setOk] = useState(false);\n useEffect(() => {\n setOk(true);\n }, []);\n if (ok && typeof window !== 'undefined') {\n return { window, document };\n }\n return { window: null, document: null };\n};\n\nexport const useDebounce = <T>(value: T, delay = 100) => {\n const [debouncedValue, setDebouncedValue] = useState(value);\n const timerRef = useRef<number>();\n\n useEffect(() => {\n timerRef.current = window.setTimeout(() => setDebouncedValue(value), delay);\n return () => {\n window.clearTimeout(timerRef.current);\n };\n }, [value, delay]);\n return debouncedValue;\n};\n\nexport const useDebounceCallback = (callback: (...args: any[]) => void, delay = 100) => {\n const debouncedCallback = useRef(callback);\n const timerRef = useRef<number>();\n\n useEffect(() => {\n debouncedCallback.current = callback;\n }, [callback]);\n\n return (...args: any[]) => {\n window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => {\n debouncedCallback.current(...args);\n }, delay);\n };\n};\n","import type { CSSProperties, FC, ReactNode } from 'react';\nimport { useBrowser } from './hooks';\nimport { createPortal } from 'react-dom';\n\ntype Props = {\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n [attr: string]: any;\n};\n\nexport const Fixed: FC<Props> = ({ children, style, className = '', ...attrs }) => {\n const { document } = useBrowser();\n if (document == null) {\n return null;\n }\n return createPortal(\n <div {...attrs} className={`gs-fixed ${className}`} style={style}>\n {children}\n </div>,\n document.body,\n );\n};\n","import React, { type CSSProperties } from 'react';\nimport type { RawCellType } from '../types';\nexport const parseHTML = (html: string, onlyValue = false): RawCellType[][] => {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const results: RawCellType[][] = [];\n\n const processSheet = (sheet: HTMLTableElement) => {\n const spans = new Set<string>();\n const rows = sheet.querySelectorAll('tr,caption');\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (row.tagName === 'CAPTION') {\n const caption = row.textContent?.trim() ?? '';\n if (caption) {\n results.push([{ value: caption }]);\n }\n continue;\n }\n const cells = Array.from(row.querySelectorAll('td, th'));\n const result: RawCellType[] = [];\n let j = 0;\n for (const cell of cells) {\n const value = cell.textContent?.trim() ?? '';\n const style: CSSProperties | undefined = onlyValue\n ? undefined\n : (() => {\n const childStyle = parseStyleString(cell.firstElementChild);\n const parentStyle = parseStyleString(cell);\n return { ...parentStyle, ...childStyle };\n })();\n while (spans.has(`${i}-${++j}`)) {\n result.push({ value: '', style, skip: true });\n }\n result.push({ value, style });\n\n const rowSpan = parseInt(cell.getAttribute('rowspan') ?? '1', 10);\n const colSpan = parseInt(cell.getAttribute('colspan') ?? '1', 10);\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n spans.add(`${i + r}-${j + c}`);\n }\n }\n }\n results.push(result);\n }\n };\n\n const processNodeSequentially = (node: Node, currentLine: RawCellType[] = []) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const tagName = el.tagName;\n\n if (tagName === 'TABLE') {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n processSheet(el as HTMLTableElement);\n } else if (tagName === 'BR') {\n results.push(currentLine.slice());\n currentLine.length = 0;\n } else if (blockTags.has(tagName)) {\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine.slice());\n currentLine.length = 0;\n }\n } else {\n el.childNodes.forEach((child) => processNodeSequentially(child, currentLine));\n }\n } else if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n const lines = text.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n currentLine.push({ value: trimmed });\n }\n }\n }\n };\n\n const currentLine: RawCellType[] = [];\n doc.body.childNodes.forEach((node) => processNodeSequentially(node, currentLine));\n if (currentLine.length > 0) {\n results.push(currentLine);\n }\n\n return results;\n};\n\nfunction parseStyleString(element: Element | null): React.CSSProperties | undefined {\n if (!element) {\n return undefined;\n }\n const styleString = element.getAttribute('style') ?? '';\n const styleObj: React.CSSProperties = {};\n\n styleString.split(';').forEach((d) => {\n let [rawKey, rawValue] = d.split(':');\n if (!rawKey || !rawValue) {\n return;\n }\n rawKey = rawKey.trim();\n if (rawKey === 'height' || rawKey === 'width') {\n return;\n }\n const key = rawKey.trim().replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n if (key === 'float' || key === 'display' || key.startsWith('padding')) {\n return;\n }\n if (key === 'border') {\n Object.assign(styleObj, {\n borderTop: rawValue,\n borderRight: rawValue,\n borderBottom: rawValue,\n borderLeft: rawValue,\n });\n return;\n }\n if (key === 'borderColor') {\n Object.assign(styleObj, {\n borderTopColor: rawValue,\n borderRightColor: rawValue,\n borderBottomColor: rawValue,\n borderLeftColor: rawValue,\n });\n return;\n }\n if (key === 'borderStyle') {\n Object.assign(styleObj, {\n borderTopStyle: rawValue,\n borderRightStyle: rawValue,\n borderBottomStyle: rawValue,\n borderLeftStyle: rawValue,\n });\n return;\n }\n if (key === 'borderWidth') {\n Object.assign(styleObj, {\n borderTopWidth: rawValue,\n borderRightWidth: rawValue,\n borderBottomWidth: rawValue,\n borderLeftWidth: rawValue,\n });\n return;\n }\n const value = rawValue.trim();\n (styleObj as any)[key] = value;\n });\n\n return styleObj;\n}\n\nexport const parseText = (tsv: string, sep = '\\t'): RawCellType[][] => {\n tsv = tsv.replace(/\"\"/g, '\\x00');\n const rows: RawCellType[][] = [[]];\n let row = rows[0];\n let entering = false;\n let word = '';\n for (let i = 0; i < tsv.length; i++) {\n const s = tsv[i];\n if (s === '\\n' && !entering) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n row = [];\n rows.push(row);\n continue;\n }\n if (s === sep) {\n row.push({ value: restoreDoubleQuote(word) });\n word = '';\n continue;\n }\n if (s === '\"' && !entering && word === '') {\n entering = true;\n continue;\n }\n if (s === '\"' && entering) {\n entering = false;\n continue;\n }\n word += s;\n }\n if (word) {\n row.push({ value: restoreDoubleQuote(word) });\n }\n return rows;\n};\n\nconst restoreDoubleQuote = (text: string) => text.replace(/\\x00/g, '\"');\n\nconst blockTags = new Set([\n 'ADDRESS',\n 'ARTICLE',\n 'ASIDE',\n 'BLOCKQUOTE',\n 'DETAILS',\n 'DIALOG',\n 'DD',\n 'DIV',\n 'DL',\n 'DT',\n 'FIELDSET',\n 'FIGCAPTION',\n 'FIGURE',\n 'FOOTER',\n 'FORM',\n 'H1',\n 'H2',\n 'H3',\n 'H4',\n 'H5',\n 'H6',\n 'HEADER',\n 'HR',\n 'LI',\n 'MAIN',\n 'NAV',\n 'OL',\n 'P',\n 'PRE',\n 'SECTION',\n 'TABLE',\n 'UL',\n]);\n","import type { FC } from 'react';\nimport { useContext, useEffect, useState, useCallback, memo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { x2c, y2r } from '../lib/coords';\nimport { clip } from '../lib/clipboard';\nimport {\n clear,\n escape,\n select,\n setEditingAddress,\n undo,\n redo,\n arrow,\n walk,\n write,\n copy,\n cut,\n paste,\n setSearchQuery,\n setEntering,\n setInputting,\n setEditorHovering,\n updateSheet,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { areaToZone, zoneToArea } from '../lib/spatial';\nimport * as prevention from '../lib/operation';\nimport {\n expandInput,\n handleFormulaQuoteAutoClose,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n} from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { Lexer } from '../formula/evaluator';\nimport { COLOR_PALETTE } from '../lib/palette';\nimport { useAutocomplete } from './useAutocomplete';\nimport { EditorEventWithNativeEvent, FeedbackType, ModeType } from '../types';\nimport { Fixed } from './Fixed';\nimport { parseHTML, parseText } from '../lib/paste';\nimport React from 'react';\n\ntype Props = {\n mode: ModeType;\n};\n\nexport const Editor: FC<Props> = ({ mode }: Props) => {\n const { store, dispatch } = useContext(Context);\n const [shiftKey, setShiftKey] = useState(false);\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n inputting,\n selectingZone,\n editorRect,\n editingAddress,\n entering,\n matchingCells,\n matchingCellIndex,\n searchQuery,\n editorRef,\n largeEditorRef,\n searchInputRef,\n editingOnEnter,\n sheetReactive: sheetRef,\n sheetId,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n\n const renderOverlays = () => {\n if (!isFocused || !editing || typeof document === 'undefined') {\n return null;\n }\n if (editorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = editorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n const { bottom: top, left } = rect;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() ?? [];\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n useEffect(() => {\n focus(editorRef?.current);\n }, [editorRef]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheet.registry.lastFocused == null) {\n return;\n }\n if (sheet.registry.lastFocused !== editorRef.current) {\n return;\n }\n if (sheet.registry.lastFocused !== largeEditorRef.current) {\n return;\n }\n\n dispatch(setEditingAddress(''));\n }, [sheet?.registry.lastFocused, sheet, editorRef, largeEditorRef, dispatch]);\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.editingSheetId = sheetId;\n sheet.registry.editingAddress = editingAddress;\n }, [editingAddress, sheet, sheetId]);\n\n useEffect(() => {\n //sheet.registry.transmit();\n expandInput(editorRef.current);\n }, [inputting, editingAddress, editorRef]);\n\n const { y, x } = choosing;\n const rowId = `${y2r(y)}`;\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const editing = editingAddress === address;\n\n // Use 'RAW' so that spilled values (stored in solvedCaches) are already\n // reflected in cell.value without re-evaluating the formula.\n const cell = sheet?.getCell({ y, x }, { resolution: 'RAW' });\n const currentString = sheet ? sheet.getSerializedValue({ point: choosing, cell, resolution: 'RAW' }) : '';\n const [before, setBefore] = useState<string>(currentString);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n setBefore(value);\n },\n [before, dispatch],\n );\n\n const selectValue = useCallback(\n (selectedIndex: number) => {\n if (!sheet) {\n return;\n }\n const option = filteredOptions[selectedIndex];\n if (option) {\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n\n setTimeout(() => {\n if (editorRef.current) {\n focus(editorRef.current);\n editorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n } else {\n const t = sheet.update({\n diff: { [address]: { value: option.value } },\n partial: true,\n });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n setSelected(0);\n }\n },\n [filteredOptions, sheet, address, inputting, writeCell, dispatch, editorRef],\n );\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setBefore(currentString);\n dispatch(setInputting(currentString));\n resetInput(editorRef.current, sheet, choosing);\n }, [choosing, currentString, dispatch, editorRef, sheet]);\n\n const { y: top, x: left, height, width } = editorRect;\n\n const numLines = currentString.split('\\n').length;\n const [isKeyDown, setIsKeyDown] = useState(false);\n const handleKeyDown = useCallback(\n (e: EditorEventWithNativeEvent) => {\n if (!sheet) {\n return;\n }\n if (isKeyDown) {\n return;\n }\n // do not debounce it if control key is down.\n if (!(e.key === 'Meta' || e.key === 'Control')) {\n setIsKeyDown(true);\n requestAnimationFrame(() => {\n setIsKeyDown(false);\n });\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n const shiftKey = e.shiftKey;\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n return false;\n }\n } else {\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: shiftKey ? -1 : 1,\n }),\n );\n dispatch(setEditingAddress(''));\n return false;\n\n case 'Enter': // ENTER\n if (editing) {\n if (filteredOptions.length) {\n const isFunction = filteredOptions[selected]?.isFunction;\n selectValue(selected);\n if (isFunction) {\n e.preventDefault();\n return false;\n }\n } else if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n dispatch(setInputting(input.value));\n e.preventDefault();\n return false;\n } else {\n if (e.nativeEvent.isComposing) {\n return false;\n }\n writeCell(input.value);\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n } else if (editingOnEnter && selectingZone.endY === -1) {\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input.dispatchEvent(dblclick);\n e.preventDefault();\n return false;\n }\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: shiftKey ? -1 : 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n\n case 'Backspace': // BACKSPACE\n if (!editing) {\n // Spilled cells are read-only — clearing them would only erase the\n // cached spill value while the origin formula remains intact, causing\n // a confusing state where the FormulaBar goes blank but the cell\n // visually still shows the spilled value after re-evaluation.\n // e.preventDefault() is required here: without it the browser still\n // fires the default textarea behavior (deletes one char), which\n // triggers onInput → setInputting, making the value shrink character\n // by character on each Backspace press.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Delete': // DELETE\n if (!editing) {\n // Same guard as Backspace — spilled cells must not be cleared directly.\n if (sheet.getSystem({ y, x })?.spilledFrom != null) {\n e.preventDefault();\n return false;\n }\n dispatch(clear(null));\n dispatch(setInputting(''));\n return false;\n }\n break;\n case 'Shift': // SHIFT\n setShiftKey(true);\n return false;\n\n case 'Control': // CTRL\n return false;\n\n case 'Alt': // OPTION\n return false;\n\n case 'Meta': // COMMAND\n return false;\n\n case 'NumLock': // NUMLOCK\n return false;\n\n case 'Escape': // ESCAPE\n dispatch(escape(null));\n dispatch(setSearchQuery(undefined));\n dispatch(setInputting(before));\n // input.blur();\n return false;\n\n case 'ArrowLeft': // LEFT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: -1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowUp': // UP\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: -1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowRight': // RIGHT\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 0,\n deltaX: 1,\n }),\n );\n return false;\n }\n break;\n case 'ArrowDown': // DOWN\n if (!editing) {\n dispatch(\n arrow({\n shiftKey,\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n return false;\n }\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n return false;\n }\n }\n break;\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(input); // refocus\n return false;\n }\n return true;\n }\n break;\n case 'f': // F\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (typeof searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(searchInputRef.current));\n return false;\n }\n }\n break;\n case 'r': // R\n case 'y': // Y\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(redo(null));\n requestAnimationFrame(() => dispatch(setInputting(''))); // resetting textarea\n return false;\n }\n }\n break;\n case 's': // S\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n sheet.registry.onSave?.({\n sheet,\n points: {\n pointing: choosing,\n selectingFrom: {\n y: selectingZone.startY,\n x: selectingZone.startX,\n },\n selectingTo: {\n y: selectingZone.endY,\n x: selectingZone.endX,\n },\n },\n });\n return false;\n }\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n // moved to onPaste\n e.stopPropagation();\n return false;\n }\n break;\n case 'x': // X\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(input); // refocus\n\n return false;\n }\n }\n break;\n case 'z': // Z\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n if (e.shiftKey) {\n dispatch(redo(null));\n //window.setTimeout(() => apply(setInputting('')), 100); // resetting textarea\n } else {\n dispatch(undo(null));\n }\n return false;\n }\n }\n break;\n case ';': // semicolon\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n // MAYBE: need to aware timezone.\n writeCell(new Date().toDateString());\n }\n }\n break;\n }\n if (e.ctrlKey || e.metaKey) {\n return false;\n }\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return false;\n }\n dispatch(setEditingAddress(address));\n if (!editing) {\n dispatch(setInputting(''));\n }\n setSelected(0);\n return false;\n },\n [\n isKeyDown,\n editing,\n filteredOptions,\n selected,\n editingOnEnter,\n selectingZone,\n before,\n sheet,\n choosing,\n store,\n cell,\n address,\n writeCell,\n searchQuery,\n inputting,\n ],\n );\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(true);\n if (!sheet) {\n return;\n }\n sheet.registry.lastFocused = e.currentTarget;\n },\n [sheet],\n );\n\n const handleDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n return;\n }\n const input = e.currentTarget;\n if (!editing) {\n dispatch(setInputting(currentString));\n dispatch(setEditingAddress(address));\n requestAnimationFrame(() => {\n input.style.width = `${input.scrollWidth}px`;\n input.style.height = `${input.scrollHeight}px`;\n const length = new String(currentString).length;\n input.setSelectionRange(length, length);\n });\n }\n },\n [cell, editing, currentString, address],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (isRefInsertable(e.currentTarget)) {\n return true;\n } else {\n if (editing) {\n writeCell(e.currentTarget.value);\n }\n }\n dispatch(setEditingAddress(''));\n },\n [editing, writeCell, dispatch],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n return;\n }\n dispatch(setInputting(e.currentTarget.value));\n setSelected(0);\n },\n [cell],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (editing) {\n return true;\n }\n\n const onlyValue = shiftKey;\n const html = e.clipboardData?.getData?.('text/html');\n if (html) {\n dispatch(paste({ matrix: parseHTML(html), onlyValue }));\n } else {\n const text = e.clipboardData?.getData?.('text/plain');\n if (text) {\n dispatch(paste({ matrix: parseText(text), onlyValue }));\n } else {\n console.warn('No clipboard data found.');\n }\n }\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [editing, shiftKey],\n );\n\n const handleKeyUpInternal = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n setShiftKey(false);\n const selectingArea = zoneToArea(store.selectingZone);\n sheet?.registry.onKeyUp?.({\n e,\n points: {\n pointing: choosing,\n selectingFrom: { y: selectingArea.top, x: selectingArea.left },\n selectingTo: { y: selectingArea.bottom, x: selectingArea.right },\n },\n });\n },\n [store.selectingZone, choosing, sheet],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent<HTMLLIElement>, index: number) => {\n selectValue(index);\n e.preventDefault();\n e.stopPropagation();\n return false;\n },\n [selectValue],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <Fixed\n className={`gs-editor ${editing ? 'gs-editing' : ''}`}\n style={editing ? { top, left, height } : {}}\n {...{\n 'data-mode': mode,\n 'data-sheet-id': sheetId,\n }}\n >\n <div className={`gs-cell-label ${editing ? ' gs-hidden' : ''}`}>{address}</div>\n <div className=\"gs-editor-inner\" style={{ width }}>\n <pre\n className=\"gs-editor-hl\"\n style={{\n //...cell?.style,\n height: editorRef.current?.scrollHeight,\n width: (editorRef.current?.scrollWidth ?? 0) - 4,\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </pre>\n <textarea\n data-sheet-id={sheetId}\n name=\"gs-editor-input\"\n data-size=\"small\"\n autoFocus={true}\n spellCheck={false}\n draggable={false}\n ref={editorRef}\n rows={numLines}\n onFocus={handleFocus}\n style={{ minWidth: width, minHeight: height }}\n onDoubleClick={handleDoubleClick}\n onBlur={handleBlur}\n value={inputting}\n onChange={handleChange}\n onSelect={handleSelect}\n onPaste={handlePaste}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUpInternal}\n onMouseEnter={() => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={() => {\n dispatch(setEditorHovering(false));\n }}\n />\n </div>\n {renderOverlays()}\n </Fixed>\n );\n};\n\n// Memoized token span component to prevent unnecessary re-renders\nconst TokenSpan = memo<{\n token: any;\n tokenKey: string;\n color?: string;\n className?: string;\n}>(\n ({ token, tokenKey, color, className }) => {\n return (\n <span key={tokenKey} style={color ? { color } : undefined} className={className}>\n {token.stringify()}\n </span>\n );\n },\n (prevProps, nextProps) => {\n // Custom comparison to prevent unnecessary re-renders\n return (\n prevProps.tokenKey === nextProps.tokenKey &&\n prevProps.color === nextProps.color &&\n prevProps.className === nextProps.className &&\n prevProps.token.stringify() === nextProps.token.stringify()\n );\n },\n);\n\nexport const editorStyle = (text: string) => {\n if (text[0] !== '=') {\n return <>{text}</>;\n }\n\n const lexer = new Lexer(text.substring(1));\n lexer.tokenize();\n let palletIndex = 0;\n const exists: { [ref: string]: number } = {};\n\n // Create a simple hash of the formula for stable keys\n const formulaHash = text.split('').reduce((hash, char) => {\n return ((hash << 5) - hash + char.charCodeAt(0)) & 0xffffffff;\n }, 0);\n\n return (\n <>\n =\n {lexer.tokens.map((token, i) => {\n // Handle SPACE tokens differently - render as plain text\n if (token.type === 'SPACE') {\n return <React.Fragment key={`${formulaHash}-SPACE-${i}`}>{token.stringify()}</React.Fragment>;\n }\n\n // Create a stable key based on formula hash, token content and index\n const tokenKey = `${formulaHash}-${token.type}-${token.stringify()}-${i}`;\n\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedToken = token.stringify();\n const existsIndex = exists[normalizedToken];\n if (existsIndex !== undefined) {\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={COLOR_PALETTE[existsIndex % COLOR_PALETTE.length]}\n />\n );\n }\n const color = COLOR_PALETTE[palletIndex % COLOR_PALETTE.length];\n exists[normalizedToken] = palletIndex++;\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n color={color}\n className={`gs-token-type-${token.type}`}\n />\n );\n }\n\n return (\n <TokenSpan\n key={tokenKey}\n token={token}\n tokenKey={tokenKey}\n className={`gs-token-type-${token.type} gs-token-entity-type-${typeof token.entity}`}\n />\n );\n })}\n </>\n );\n};\n","import type { ReactNode } from 'react';\nimport { createContext, useContext, useState } from 'react';\n\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\n\nexport type PluginContextType = {\n provided: boolean;\n store?: StoreType;\n apply?: Dispatcher;\n setStore: (store: StoreType) => void;\n setApply: (apply: Dispatcher) => void;\n};\n\nexport const PluginContext = createContext({} as PluginContextType);\n\nexport function useInitialPluginContext(): PluginContextType {\n const [store, setStore] = useState<StoreType | undefined>(undefined);\n const [apply, setApply] = useState<Dispatcher>();\n return {\n provided: true,\n store,\n apply,\n setStore,\n setApply,\n };\n}\n\nexport function usePluginContext(): [boolean, PluginContextType] {\n const ctx = useContext(PluginContext);\n if (ctx?.provided == null) {\n return [false, ctx];\n }\n return [true, ctx];\n}\n\nexport function usePluginDispatch() {\n const sync = useContext(PluginContext);\n if (!sync) {\n return undefined;\n }\n return sync;\n}\n\ntype Props = {\n children: ReactNode;\n context: PluginContextType;\n};\n\nexport function PluginBase({ children, context }: Props) {\n const [provided] = usePluginContext();\n if (provided) {\n return <>{children}</>;\n }\n return <PluginContext.Provider value={context}>{children}</PluginContext.Provider>;\n}\n","import type { FC, MutableRefObject } from 'react';\nimport { createRef, useContext, useEffect, useRef, useState } from 'react';\n\nimport type { OptionsType, Props, SheetHandle, StoreHandle } from '../types';\nimport { Context } from '../store';\n\nimport { setStore, updateSheet } from '../store/actions';\n\nimport { usePluginContext } from './PluginBase';\nimport { Sheet } from '../lib/sheet';\n\ntype StoreObserverProps = OptionsType & {\n sheetName?: string;\n sheetRef?: MutableRefObject<SheetHandle | null>;\n storeRef?: MutableRefObject<StoreHandle | null>;\n};\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\nexport const StoreObserver: FC<StoreObserverProps> = ({\n sheetName,\n sheetHeight,\n sheetWidth,\n sheetRef,\n storeRef,\n editingOnEnter,\n mode,\n}) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n if (sheetName && sheetName !== sheet.name) {\n sheet.name = sheetName;\n sheet.registry.sheetIdsByName[sheetName] = sheet.id;\n delete sheet.registry.sheetIdsByName[sheet.prevName];\n sheet.prevName = sheetName;\n //book.transmit();\n }\n }, [sheetName]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const { registry } = sheet;\n requestAnimationFrame(() => registry.boot());\n registry.contextsBySheetId[sheet.id] = { store, dispatch };\n registry.transmit();\n\n if (sheetRef) {\n sheetRef.current = {\n sheet,\n apply: (sheet) => {\n dispatch(updateSheet(sheet as Sheet));\n },\n };\n }\n if (storeRef) {\n storeRef.current = {\n store,\n apply: (store) => {\n dispatch(setStore(store));\n },\n dispatch,\n };\n }\n }, [store, sheet, sheetRef, storeRef]);\n\n useEffect(() => {\n if (sheetHeight) {\n dispatch(setStore({ sheetHeight }));\n }\n }, [sheetHeight, dispatch]);\n useEffect(() => {\n if (sheetWidth) {\n dispatch(setStore({ sheetWidth }));\n }\n }, [sheetWidth]);\n useEffect(() => {\n if (typeof editingOnEnter !== 'undefined') {\n dispatch(setStore({ editingOnEnter }));\n }\n }, [editingOnEnter]);\n useEffect(() => {\n if (mode) {\n dispatch(setStore({ mode }));\n }\n }, [mode]);\n\n const [pluginProvided, pluginContext] = usePluginContext();\n useEffect(() => {\n if (!pluginProvided) {\n return;\n }\n pluginContext.setStore(store);\n pluginContext.setApply(() => dispatch);\n }, [store, pluginProvided, pluginContext]);\n\n return <></>;\n};\n","import { useContext } from 'react';\nimport type { MouseEvent } from 'react';\n\nimport { Context } from '../store';\nimport { setResizingPositionY, setResizingPositionX, updateSheet, setStore } from '../store/actions';\n\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_WIDTH, MIN_HEIGHT } from '../constants';\nimport { zoneToArea, makeSequence, between } from '../lib/spatial';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '../lib/coords';\nimport { focus } from '../lib/dom';\n\nexport const Resizer = () => {\n const { store, dispatch } = useContext(Context);\n const {\n resizingPositionY: posY,\n resizingPositionX: posX,\n sheetReactive: sheetRef,\n leftHeaderSelecting,\n topHeaderSelecting,\n selectingZone,\n editorRef,\n mainRef,\n } = store;\n const sheet = sheetRef.current;\n\n const [y, startY, endY] = posY;\n const [x, startX, endX] = posX;\n\n if (mainRef.current == null || editorRef.current == null || !sheet) {\n return <div className=\"gs-resizing gs-hidden\" />;\n }\n\n const cell = sheet.getCell({ y: y === -1 ? 0 : y, x: x === -1 ? 0 : x }, { resolution: 'SYSTEM' });\n const { y: offsetY, x: offsetX } = mainRef.current.getBoundingClientRect();\n\n const baseWidth = cell?.width || DEFAULT_WIDTH;\n const baseHeight = cell?.height || DEFAULT_HEIGHT;\n\n const width = baseWidth + (endX - startX);\n const height = baseHeight + (endY - startY);\n\n const handleResizeEnd = () => {\n const selectingArea = zoneToArea(selectingZone);\n const { top, left, bottom, right } = selectingArea;\n const diff: CellsByAddressType = {};\n if (x !== -1) {\n let xs = [x];\n if (topHeaderSelecting && between({ start: left, end: right }, x)) {\n xs = makeSequence(left, right + 1);\n }\n xs.forEach((x) => {\n diff[p2a({ y: 0, x })] = { width };\n });\n }\n if (y !== -1) {\n let ys = [y];\n if (leftHeaderSelecting && between({ start: top, end: bottom }, y)) {\n ys = makeSequence(top, bottom + 1);\n }\n ys.forEach((y) => {\n diff[p2a({ y, x: 0 })] = { height };\n });\n }\n sheet.update({\n diff,\n partial: true,\n operator: 'USER',\n undoReflection: { selectingZone, sheetId: sheet.id },\n });\n dispatch(\n setStore({\n sheetReactive: { current: sheet },\n }),\n );\n dispatch(setResizingPositionY([-1, -1, -1]));\n dispatch(setResizingPositionX([-1, -1, -1]));\n focus(editorRef.current);\n };\n const handleResizeMove = (e: MouseEvent) => {\n if (y !== -1) {\n let endY = e.clientY;\n const height = baseHeight + (endY - startY);\n if (height < MIN_HEIGHT) {\n endY += MIN_HEIGHT - height;\n }\n dispatch(setResizingPositionY([y, startY, endY]));\n } else if (x !== -1) {\n let endX = e.clientX;\n const width = baseWidth + (endX - startX);\n if (width < MIN_WIDTH) {\n endX += MIN_WIDTH - width;\n }\n dispatch(setResizingPositionX([x, startX, endX]));\n }\n };\n\n return (\n <div\n className={`gs-resizing ${y === -1 && x === -1 ? 'gs-hidden' : ''}`}\n onMouseUp={handleResizeEnd}\n onMouseMove={handleResizeMove}\n >\n <div className={`gs-line-vertical ${x === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: 1, height: '100%', left: endX - offsetX }}>\n <span style={{ left: '-50%' }}>{width}px</span>\n </div>\n </div>\n <div className={`gs-line-horizontal ${y === -1 ? 'gs-hidden' : ''}`}>\n <div className={'gs-line'} style={{ width: '100%', height: 1, top: endY - offsetY }}>\n <span style={{ top: '-50%' }}>{height}px</span>\n </div>\n </div>\n </div>\n );\n};\n","import type { FC } from 'react';\nimport { useContext, useEffect, useRef } from 'react';\nimport { Context } from '../store';\n\nexport const Emitter: FC = () => {\n const { store } = useContext(Context);\n const { choosing: pointing, selectingZone: zone, sheetReactive } = store;\n const sheet = sheetReactive.current;\n\n useEffect(() => {\n if (sheet?.isInitialized && sheet.currentVersion > 0 && sheet.registry.onChange) {\n sheet.registry.onChange({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [sheetReactive]);\n\n useEffect(() => {\n if (sheet && sheet.registry.onSelect) {\n sheet.registry.onSelect({\n sheet,\n points: {\n pointing,\n selectingFrom: { y: zone.startY, x: zone.startX },\n selectingTo: { y: zone.endY, x: zone.endX },\n },\n });\n }\n }, [pointing, zone]);\n return null;\n};\n","import type { StoreDispatchType, FilterConfig, RawCellType } from '../types';\nimport { areaToZone, zoneShape, zoneToArea } from '../lib/spatial';\nimport { focus } from '../lib/dom';\nimport { p2a } from '../lib/coords';\nimport {\n copy,\n cut,\n paste,\n undo,\n redo,\n insertRowsAbove,\n insertRowsBelow,\n insertColsLeft,\n insertColsRight,\n removeRows,\n removeCols,\n sortRows,\n filterRows,\n setSearchQuery,\n setEntering,\n updateSheet,\n} from './actions';\nimport { clip } from '../lib/clipboard';\nimport { parseHTML, parseText } from '../lib/paste';\n\nexport const copier = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(copy(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const cutter = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n const area = clip(store);\n dispatch(cut(areaToZone(area)));\n focus(editorRef.current);\n};\n\nexport const paster = async ({ store, dispatch }: StoreDispatchType, onlyValue = false) => {\n const { editorRef } = store;\n const items = await navigator.clipboard.read();\n let cells: RawCellType[][] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.types.indexOf('text/html') !== -1) {\n const blob = await item.getType('text/html');\n const html = await blob.text();\n if (html) {\n cells = parseHTML(html, onlyValue);\n break;\n }\n } else if (item.types.indexOf('text/plain') !== -1) {\n const blob = await item.getType('text/plain');\n const text = await blob.text();\n if (text) {\n cells = parseText(text);\n break;\n }\n }\n }\n dispatch(paste({ matrix: cells, onlyValue }));\n focus(editorRef.current);\n};\n\nexport const undoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(undo(null));\n focus(editorRef.current);\n};\n\nexport const redoer = async ({ store, dispatch }: StoreDispatchType) => {\n const { editorRef } = store;\n dispatch(redo(null));\n focus(editorRef.current);\n};\n\nexport const rowsInserterAbove = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsAbove({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsInserterBelow = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { bottom } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(insertRowsBelow({ numRows, y: bottom, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterLeft = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsLeft({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsInserterRight = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { right } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(insertColsRight({ numCols, x: right, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { top } = zoneToArea(selectingZone);\n const numRows = zoneShape(selectingZone).rows;\n dispatch(removeRows({ numRows, y: top, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const colsRemover = async ({ store, dispatch }: StoreDispatchType) => {\n const { selectingZone, editorRef } = store;\n const { left } = zoneToArea(selectingZone);\n const numCols = zoneShape(selectingZone).cols;\n dispatch(removeCols({ numCols, x: left, operator: 'USER' }));\n focus(editorRef.current);\n};\n\nexport const rowsSorterAsc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'asc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsSorterDesc = async ({ store, dispatch }: StoreDispatchType, x: number) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(sortRows({ x, direction: 'desc' }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterer = async ({ store, dispatch }: StoreDispatchType, x: number, filter: FilterConfig) => {\n const sheet = store.sheetReactive.current;\n if (sheet && (sheet.hasPendingCells() || sheet.registry.asyncPending.size > 0)) {\n await sheet.waitForPending();\n }\n dispatch(filterRows({ x, filter }));\n focus(store.editorRef.current);\n};\n\nexport const rowsFilterClearer = async ({ store, dispatch }: StoreDispatchType, x?: number) => {\n dispatch(filterRows({ x }));\n focus(store.editorRef.current);\n};\n\nexport const rowSortFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.sortFixed || undefined;\n sheet.update({ diff: { [addr]: { sortFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const rowFilterFixedToggler = ({ store, dispatch }: StoreDispatchType, y: number) => {\n const sheet = store.sheetReactive.current;\n if (!sheet) {\n return;\n }\n const addr = p2a({ y, x: 0 });\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const next = !rowCell?.filterFixed || undefined;\n sheet.update({ diff: { [addr]: { filterFixed: next } }, partial: true });\n dispatch(updateSheet(sheet));\n focus(store.editorRef.current);\n};\n\nexport const searcher = async ({ store, dispatch }: StoreDispatchType) => {\n if (typeof store.searchQuery === 'undefined') {\n dispatch(setSearchQuery(''));\n }\n dispatch(setEntering(false));\n requestAnimationFrame(() => focus(store.searchInputRef.current));\n};\n\nexport const applyers = {\n copy: copier,\n cut: cutter,\n paste: paster,\n undo: undoer,\n redo: redoer,\n insertRowsAbove: rowsInserterAbove,\n insertRowsBelow: rowsInserterBelow,\n insertColsLeft: colsInserterLeft,\n insertColsRight: colsInserterRight,\n removeRows: rowsRemover,\n removeCols: colsRemover,\n sortRowsAsc: rowsSorterAsc,\n sortRowsDesc: rowsSorterDesc,\n filterRows: rowsFilterer,\n clearFilter: rowsFilterClearer,\n toggleSortFixed: rowSortFixedToggler,\n toggleFilterFixed: rowFilterFixedToggler,\n search: searcher,\n};\n","/**\n * Menu system — types, default descriptors, and MenuContext builder.\n */\n\n// ---- types ----------------------------------------------------------------\n\nimport type { PointType, ZoneType, FilterConfig } from '../types';\nimport type { UserSheet } from './sheet';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport * as prevention from './operation';\nimport { zoneShape } from './spatial';\nimport { p2a } from './coords';\nimport {\n copier,\n cutter,\n paster,\n undoer,\n redoer,\n rowsSorterAsc,\n rowsSorterDesc,\n rowsFilterer,\n rowsFilterClearer,\n rowSortFixedToggler,\n rowFilterFixedToggler,\n searcher,\n} from '../store/dispatchers';\nimport {\n insertRowsAbove as _insertRowsAbove,\n insertRowsBelow as _insertRowsBelow,\n removeRows as _removeRows,\n insertColsLeft as _insertColsLeft,\n insertColsRight as _insertColsRight,\n removeCols as _removeCols,\n setStore as _setStore,\n} from '../store/actions';\n\nexport type MenuContext = {\n /** Current sheet instance */\n sheet: UserSheet;\n /** Currently focused cell */\n choosing: PointType;\n /** Currently selected zone */\n selectingZone: ZoneType;\n /** True when the left (row) header is being selected */\n leftHeaderSelecting: boolean;\n /** True when the top (column) header is being selected */\n topHeaderSelecting: boolean;\n\n // ---- actions ----\n cut(): Promise<void>;\n copy(): Promise<void>;\n paste(onlyValue?: boolean): Promise<void>;\n undo(): void;\n redo(): void;\n insertRowsAbove(y: number, numRows: number): void;\n insertRowsBelow(y: number, numRows: number): void;\n removeRows(y: number, numRows: number): void;\n insertColsLeft(x: number, numCols: number): void;\n insertColsRight(x: number, numCols: number): void;\n removeCols(x: number, numCols: number): void;\n sortRows(x: number, direction: 'asc' | 'desc'): Promise<void>;\n filterRows(x: number, filter?: FilterConfig): Promise<void>;\n clearFilter(x?: number): void;\n toggleSortFixed(y: number): void;\n toggleFilterFixed(y: number): void;\n search(): void;\n updateColLabel(x: number, label: string | undefined): void;\n /** Close the currently open menu */\n close(): void;\n};\n\nexport type MenuDividerItem = { type: 'divider'; visible?: (ctx: MenuContext) => boolean };\n\n/**\n * Base structure shared by all menu item descriptors.\n * `Args` is the tuple of coordinate arguments passed after `ctx`:\n * - `[]` → ContextMenu (no coordinate)\n * - `[y: number]` → RowMenu\n * - `[x: number]` → ColMenu\n */\nexport type MenuItemBase<Args extends unknown[] = []> = {\n type?: 'item';\n id?: string;\n label: string | ((ctx: MenuContext, ...args: Args) => string);\n shortcuts?: string[] | ((ctx: MenuContext, ...args: Args) => string[]);\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n disabled?: (ctx: MenuContext, ...args: Args) => boolean;\n /** Render a checkmark prefix when defined. */\n checked?: (ctx: MenuContext, ...args: Args) => boolean;\n onClick: (ctx: MenuContext, ...args: Args) => void | Promise<void>;\n};\n\n/**\n * A menu entry that renders a registered React component.\n * Use `registerMenuComponent(id, Component)` to associate an id with a component,\n * then reference it here as `{ type: 'component', componentId: id }`.\n */\nexport type MenuComponentItem<Args extends unknown[] = []> = {\n type: 'component';\n componentId: string;\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n};\n\nexport type ContextMenuItemDescriptor = MenuDividerItem | MenuItemBase | MenuComponentItem;\nexport type RowMenuItemDescriptor = MenuDividerItem | MenuItemBase<[y: number]> | MenuComponentItem<[y: number]>;\nexport type ColMenuItemDescriptor = MenuDividerItem | MenuItemBase<[x: number]> | MenuComponentItem<[x: number]>;\n\n// ---- helpers ---------------------------------------------------------------\n\nconst rowInsertCount = (ctx: MenuContext, y: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startY, selectingZone.endY);\n const selEnd = Math.max(selectingZone.startY, selectingZone.endY);\n const isFullRow = selectingZone.startX === 1 && selectingZone.endX === ctx.sheet.numCols;\n return isFullRow && y >= selStart && y <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\nconst colInsertCount = (ctx: MenuContext, x: number): number => {\n const { selectingZone } = ctx;\n const selStart = Math.min(selectingZone.startX, selectingZone.endX);\n const selEnd = Math.max(selectingZone.startX, selectingZone.endX);\n const isFullCol = selectingZone.startY === 1 && selectingZone.endY === ctx.sheet.numRows;\n return isFullCol && x >= selStart && x <= selEnd ? selEnd - selStart + 1 : 1;\n};\n\n// ---- default descriptors ---------------------------------------------------\n\nexport const defaultContextMenuDescriptors: ContextMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider', visible: (ctx) => ctx.leftHeaderSelecting || ctx.topHeaderSelecting },\n {\n id: 'insert-rows-above',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx) => ctx.insertRowsAbove(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-rows-below',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx) => ctx.insertRowsBelow(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'insert-cols-left',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx) => ctx.insertColsLeft(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'insert-cols-right',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx) => ctx.insertColsRight(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n {\n id: 'remove-rows',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.leftHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).rows;\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y: ctx.choosing.y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx) => ctx.removeRows(ctx.choosing.y, zoneShape(ctx.selectingZone).rows),\n },\n {\n id: 'remove-cols',\n label: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n visible: (ctx) => ctx.topHeaderSelecting,\n disabled: (ctx) => {\n const n = zoneShape(ctx.selectingZone).cols;\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x: ctx.choosing.x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx) => ctx.removeCols(ctx.choosing.x, zoneShape(ctx.selectingZone).cols),\n },\n { type: 'divider' },\n {\n id: 'undo',\n label: 'Undo',\n shortcuts: ['Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() <= -1,\n onClick: (ctx) => ctx.undo(),\n },\n {\n id: 'redo',\n label: 'Redo',\n shortcuts: ['R', 'Y', 'Shift+Z'],\n disabled: (ctx) => ctx.sheet.historyIndex() >= ctx.sheet.historySize() - 1,\n onClick: (ctx) => ctx.redo(),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\nexport const defaultRowMenuDescriptors: RowMenuItemDescriptor[] = [\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-rows-above',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} above`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsAbove)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsAbove(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'insert-rows-below',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Insert ${n} row${n > 1 ? 's' : ''} below`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumRows !== -1 && sheet.numRows + n > sheet.maxNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.InsertRowsBelow)\n );\n },\n onClick: (ctx, y) => ctx.insertRowsBelow(y, rowInsertCount(ctx, y)),\n },\n {\n id: 'remove-rows',\n label: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n return `Remove ${n} row${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, y) => {\n const n = rowInsertCount(ctx, y);\n const sheet = ctx.sheet;\n const rowCell = sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumRows !== -1 && sheet.numRows - n < sheet.minNumRows) ||\n prevention.hasOperation(rowCell?.prevention, prevention.RemoveRows)\n );\n },\n onClick: (ctx, y) => ctx.removeRows(y, rowInsertCount(ctx, y)),\n },\n { type: 'divider' },\n {\n id: 'toggle-sort-fixed',\n label: 'Fix row for sorting',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.sortFixed,\n onClick: (ctx, y) => ctx.toggleSortFixed(y),\n },\n {\n id: 'toggle-filter-fixed',\n label: 'Fix row for filtering',\n checked: (ctx, y) => !!ctx.sheet.getCell({ y, x: 0 }, { resolution: 'SYSTEM' })?.filterFixed,\n onClick: (ctx, y) => ctx.toggleFilterFixed(y),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n];\n\n// The col menu composes registered section components (filter, sort, label) and\n// simple menu items. Use `registerMenuComponent` to override built-in sections.\nexport const defaultColMenuDescriptors: ColMenuItemDescriptor[] = [\n { type: 'component', componentId: 'col-filter' },\n { type: 'divider' },\n { type: 'component', componentId: 'col-sort' },\n { type: 'divider' },\n {\n id: 'cut',\n label: 'Cut',\n shortcuts: ['X'],\n onClick: (ctx) => ctx.cut(),\n },\n {\n id: 'copy',\n label: 'Copy',\n shortcuts: ['C'],\n onClick: (ctx) => ctx.copy(),\n },\n {\n id: 'paste',\n label: 'Paste',\n shortcuts: ['V'],\n onClick: (ctx) => ctx.paste(false),\n },\n {\n id: 'paste-only-value',\n label: 'Paste only value',\n shortcuts: ['Shift+V'],\n onClick: (ctx) => ctx.paste(true),\n },\n { type: 'divider' },\n {\n id: 'insert-cols-left',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} left`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsLeft)\n );\n },\n onClick: (ctx, x) => ctx.insertColsLeft(x, colInsertCount(ctx, x)),\n },\n {\n id: 'insert-cols-right',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Insert ${n} column${n > 1 ? 's' : ''} right`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.maxNumCols !== -1 && sheet.numCols + n > sheet.maxNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.InsertColsRight)\n );\n },\n onClick: (ctx, x) => ctx.insertColsRight(x, colInsertCount(ctx, x)),\n },\n {\n id: 'remove-cols',\n label: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n return `Remove ${n} column${n > 1 ? 's' : ''}`;\n },\n disabled: (ctx, x) => {\n const n = colInsertCount(ctx, x);\n const sheet = ctx.sheet;\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n return (\n (sheet.minNumCols !== -1 && sheet.numCols - n < sheet.minNumCols) ||\n prevention.hasOperation(colCell?.prevention, prevention.RemoveCols)\n );\n },\n onClick: (ctx, x) => ctx.removeCols(x, colInsertCount(ctx, x)),\n },\n { type: 'divider' },\n {\n id: 'search',\n label: 'Search',\n shortcuts: ['F'],\n onClick: (ctx) => ctx.search(),\n },\n { type: 'divider' },\n { type: 'component', componentId: 'col-label' },\n];\n\n// ---- buildMenuContext -------------------------------------------------------\n\nexport function buildMenuContext(store: StoreType, dispatch: Dispatcher, close: () => void): MenuContext {\n const props = { store, dispatch };\n const sheet = store.sheetReactive.current!;\n\n return {\n sheet,\n choosing: store.choosing,\n selectingZone: store.selectingZone,\n leftHeaderSelecting: store.leftHeaderSelecting,\n topHeaderSelecting: store.topHeaderSelecting,\n\n cut: () => cutter(props),\n copy: () => copier(props),\n paste: (onlyValue = false) => paster(props, onlyValue),\n undo: () => undoer(props),\n redo: () => redoer(props),\n\n insertRowsAbove: (y, numRows) => {\n dispatch(_insertRowsAbove({ numRows, y, operator: 'USER' }));\n },\n insertRowsBelow: (y, numRows) => {\n dispatch(_insertRowsBelow({ numRows, y, operator: 'USER' }));\n },\n removeRows: (y, numRows) => {\n dispatch(_removeRows({ numRows, y, operator: 'USER' }));\n },\n insertColsLeft: (x, numCols) => {\n dispatch(_insertColsLeft({ numCols, x, operator: 'USER' }));\n },\n insertColsRight: (x, numCols) => {\n dispatch(_insertColsRight({ numCols, x, operator: 'USER' }));\n },\n removeCols: (x, numCols) => {\n dispatch(_removeCols({ numCols, x, operator: 'USER' }));\n },\n\n sortRows: async (x, direction) => {\n if (direction === 'asc') {\n await rowsSorterAsc(props, x);\n } else {\n await rowsSorterDesc(props, x);\n }\n },\n filterRows: async (x, filter) => {\n if (filter) {\n await rowsFilterer(props, x, filter);\n } else {\n rowsFilterClearer(props, x);\n }\n },\n clearFilter: (x) => rowsFilterClearer(props, x),\n\n toggleSortFixed: (y) => rowSortFixedToggler(props, y),\n toggleFilterFixed: (y) => rowFilterFixedToggler(props, y),\n\n search: () => searcher(props),\n\n updateColLabel: (x, label) => {\n if (!sheet) {\n return;\n }\n const addr = p2a({ y: 0, x });\n sheet.update({\n diff: { [addr]: { label: label || undefined } },\n partial: true,\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(_setStore({ sheetReactive: { current: sheet } }));\n },\n\n close,\n };\n}\n\n// ---- menu component registry -----------------------------------------------\n\nimport type { FC } from 'react';\n\nexport type ContextMenuSectionProps = {\n close: () => void;\n};\n\nexport type RowMenuSectionProps = {\n y: number;\n close: () => void;\n};\n\nexport type ColMenuSectionProps = {\n x: number;\n close: () => void;\n /** Signal waiting state to parent menu. Pass null to clear. */\n onWaiting?: (message: string | null, cancel?: () => void) => void;\n};\n\nconst _menuComponentRegistry = new Map<string, FC<any>>();\n\n/**\n * Register a React component under a string id so it can be referenced in menu\n * descriptors via `{ type: 'component', componentId: '...' }`.\n *\n * Built-in ids: `'col-filter'`, `'col-sort'`, `'col-label'`.\n * You can override any built-in by registering your own component with the same id.\n */\n\nexport function registerMenuComponent(id: string, component: FC<any>): void {\n _menuComponentRegistry.set(id, component);\n}\n\n/** Look up a previously registered component by id. */\n\nexport function getMenuComponent(id: string): FC<any> | undefined {\n return _menuComponentRegistry.get(id);\n}\n","import type { FC } from 'react';\n\ntype MenuItemProps = {\n label: string;\n shortcuts?: string[];\n disabled?: boolean;\n /**\n * undefined → no check column\n * true/false → displayed as a toggle row with a checkmark\n */\n checked?: boolean;\n testId?: string;\n onClick?: () => void;\n className?: string;\n};\n\nexport const MenuItem: FC<MenuItemProps> = ({\n label,\n shortcuts,\n disabled = false,\n checked,\n testId,\n onClick,\n className,\n}) => {\n const hasCheck = checked !== undefined;\n return (\n <li\n className={`gs-menu-item ${disabled ? 'gs-disabled' : 'gs-enabled'}${className ? ` ${className}` : ''}`}\n data-testid={testId}\n onClick={disabled ? undefined : onClick}\n >\n <div className={`gs-menu-name${hasCheck ? ' gs-row-fixed-toggle' : ''}`}>\n {hasCheck && <span className={`gs-row-fixed-check${checked ? ' gs-row-fixed-active' : ''}`}>✓</span>}\n {label}\n </div>\n {shortcuts != null && shortcuts.length > 0 && (\n <div className=\"gs-menu-shortcut\">\n {shortcuts.map((shortcut, i) => (\n <span key={i}>\n {i > 0 && <span className=\"gs-menu-shortcut-sep\">, </span>}\n <span className=\"gs-menu-shortcut-badge\">\n {shortcut.split('+').map((part, j, arr) =>\n j < arr.length - 1 ? (\n <span key={j}>{part}+</span>\n ) : (\n <span key={j} className=\"gs-menu-underline\">\n {part}\n </span>\n ),\n )}\n </span>\n </span>\n ))}\n </div>\n )}\n </li>\n );\n};\n\nexport const MenuDivider: FC = () => <li className=\"gs-menu-divider\" />;\n","import { useContext, useRef, useLayoutEffect } from 'react';\n\nimport { setContextMenuPosition } from '../store/actions';\n\nimport { Context } from '../store';\nimport { Fixed } from './Fixed';\nimport type { ContextMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\nimport { clampPopup } from '../lib/popup';\n\nexport const ContextMenu = () => {\n const { store, dispatch } = useContext(Context);\n const { contextMenuPosition, contextMenu } = store;\n const { y: top, x: left } = contextMenuPosition;\n const menuRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n if (menuRef.current) {\n clampPopup(menuRef.current);\n }\n });\n\n if (top === -1) {\n return null;\n }\n\n const close = () => dispatch(setContextMenuPosition({ y: -1, x: -1 }));\n const ctx = buildMenuContext(store, dispatch, close);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-context-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n close();\n return false;\n }}\n >\n <div ref={menuRef} className={'gs-context-menu'} style={{ top: top, left: left }}>\n <ul className=\"gs-menu-items\">\n {contextMenu.map((d, i) => {\n if (d.type === 'divider') {\n if (d.visible && !d.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={i} />;\n }\n if (d.type === 'component') {\n return null;\n }\n const visible = !d.visible || d.visible(ctx);\n if (!visible) {\n return null;\n }\n const disabled = d.disabled?.(ctx) ?? false;\n const label = typeof d.label === 'function' ? d.label(ctx) : d.label;\n const shortcuts = typeof d.shortcuts === 'function' ? d.shortcuts(ctx) : d.shortcuts;\n const checked = d.checked?.(ctx);\n return (\n <MenuItem\n key={i}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={d.id ? `${d.id}-item` : undefined}\n onClick={() => d.onClick(ctx)}\n />\n );\n })}\n </ul>\n </div>\n </Fixed>\n );\n};\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { filterRows } from '../store/actions';\nimport type { FilterCondition, FilterConditionMethod } from '../types';\nimport * as prevention from '../lib/operation';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst METHOD_LABELS: Record<FilterConditionMethod, string> = {\n eq: '=',\n ne: '≠',\n gt: '>',\n gte: '≥',\n lt: '<',\n lte: '≤',\n blank: 'Blank',\n nonblank: 'Nonblank',\n includes: 'Includes',\n excludes: 'Excludes',\n};\n\nconst NO_VALUE_METHODS: FilterConditionMethod[] = ['blank', 'nonblank'];\nconst DEFAULT_CONDITION: FilterCondition = { method: 'eq', value: [''] };\n\ntype PendingFilter = {\n x: number;\n conditions: FilterCondition[];\n mode: 'and' | 'or';\n};\n\nconst FilterSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [conditions, setConditions] = useState<FilterCondition[]>([{ ...DEFAULT_CONDITION }]);\n const [mode, setMode] = useState<'and' | 'or'>('or');\n const [pending, setPending] = useState<PendingFilter | null>(null);\n\n // Auto-focus first value input when x changes\n const firstValueRef = useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.focus();\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [x],\n );\n\n // Restore conditions from existing filter on the column cell when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const existing = colCell?.filter;\n if (existing && existing.conditions.length > 0) {\n setConditions(existing.conditions.map((c) => ({ ...c, value: [...c.value] })));\n setMode(existing.mode || 'or');\n } else {\n setConditions([{ ...DEFAULT_CONDITION, value: [''] }]);\n setMode('or');\n }\n }\n }, [x, sheet]);\n\n // Escape key cancels during waiting\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Filtering…', handleCancel);\n }\n // Do NOT include onWaiting/handleCancel in deps to avoid re-triggering execute\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending filter after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n const { x: actionX, conditions: validConditions, mode: filterMode } = pending;\n if (validConditions.length > 0) {\n dispatch(filterRows({ x: actionX, filter: { mode: filterMode, conditions: validConditions } }));\n } else {\n dispatch(filterRows({ x: actionX }));\n }\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n const updateCondition = useCallback((index: number, patch: Partial<FilterCondition>) => {\n setConditions((prev) => {\n const next = [...prev];\n next[index] = { ...next[index], ...patch };\n return next;\n });\n }, []);\n\n const addCondition = useCallback(() => {\n setConditions((prev) => [...prev, { ...DEFAULT_CONDITION, value: [''] }]);\n }, []);\n\n const removeCondition = useCallback((index: number) => {\n setConditions((prev) => {\n if (prev.length <= 1) {\n return [{ ...DEFAULT_CONDITION, value: [''] }];\n }\n return prev.filter((_, i) => i !== index);\n });\n }, []);\n\n const handleApplyFilter = useCallback(() => {\n const valid = conditions.filter((c) => {\n if (NO_VALUE_METHODS.includes(c.method)) {\n return true;\n }\n return c.value.some((v) => v.trim() !== '');\n });\n setPending({ x, conditions: valid, mode });\n }, [x, conditions, mode]);\n\n const handleResetColumn = useCallback(() => {\n setPending(null);\n dispatch(filterRows({ x }));\n close();\n }, [dispatch, x, close]);\n\n const handleResetAll = useCallback(() => {\n setPending(null);\n dispatch(filterRows({}));\n close();\n }, [dispatch, close]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const filterDisabled = prevention.hasOperation(colCell?.prevention, prevention.Filter);\n const hasAnyFilter = sheet.hasActiveFilters();\n\n return (\n <li className={`gs-column-menu-filter${filterDisabled ? ' gs-disabled' : ''}`}>\n <>\n <div className=\"gs-filter-header\">\n <div className=\"gs-menu-name\">Filter:</div>\n <button className=\"gs-filter-add-btn\" onClick={addCondition} disabled={filterDisabled}>\n + ADD\n </button>\n <div className={`gs-filter-mode-toggle${conditions.length <= 1 ? ' gs-disabled' : ''}`}>\n <label className={mode === 'and' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'and'}\n onChange={() => setMode('and')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n AND\n </label>\n <label className={mode === 'or' ? 'gs-active' : ''}>\n <input\n type=\"radio\"\n name=\"gs-filter-mode\"\n checked={mode === 'or'}\n onChange={() => setMode('or')}\n disabled={filterDisabled || conditions.length <= 1}\n />\n OR\n </label>\n </div>\n </div>\n <div className=\"gs-filter-conditions\">\n {conditions.map((cond, i) => (\n <div className=\"gs-filter-condition-row\" key={i}>\n <select\n className=\"gs-filter-method-select\"\n value={cond.method}\n disabled={filterDisabled}\n tabIndex={i * 2 + 1}\n onChange={(e) => updateCondition(i, { method: e.target.value as FilterConditionMethod })}\n >\n {(Object.keys(METHOD_LABELS) as FilterConditionMethod[]).map((m) => (\n <option key={m} value={m}>\n {METHOD_LABELS[m]}\n </option>\n ))}\n </select>\n {!NO_VALUE_METHODS.includes(cond.method) && (\n <input\n ref={i === 0 ? firstValueRef : undefined}\n className=\"gs-filter-value-input\"\n type=\"text\"\n placeholder=\"Value\"\n value={cond.value[0] || ''}\n disabled={filterDisabled}\n tabIndex={i * 2 + 2}\n onChange={(e) => updateCondition(i, { value: [e.target.value] })}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyFilter();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n )}\n <button\n className=\"gs-filter-remove-btn\"\n onClick={() => removeCondition(i)}\n disabled={filterDisabled}\n title=\"Remove condition\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n <div className=\"gs-filter-actions\">\n {hasAnyFilter && (\n <button className=\"gs-filter-reset-all-btn\" onClick={handleResetAll}>\n RESET ALL\n </button>\n )}\n <div className=\"gs-filter-actions-right\">\n {colCell?.filter && (\n <button className=\"gs-filter-reset-btn\" onClick={handleResetColumn}>\n RESET\n </button>\n )}\n <button className=\"gs-filter-apply-btn\" onClick={handleApplyFilter} disabled={filterDisabled}>\n APPLY\n </button>\n </div>\n </div>\n </>\n </li>\n );\n};\n\nregisterMenuComponent('col-filter', FilterSection);\nexport { FilterSection };\n","import { type FC, useContext, useState, useCallback, useEffect } from 'react';\nimport { Context } from '../store';\nimport { sortRows } from '../store/actions';\nimport * as prevention from '../lib/operation';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\ntype PendingSort = {\n x: number;\n direction: 'asc' | 'desc';\n};\n\nconst SortSection: FC<ColMenuSectionProps> = ({ x, close, onWaiting }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n\n const [pending, setPending] = useState<PendingSort | null>(null);\n\n const handleCancel = useCallback(() => {\n setPending(null);\n onWaiting?.(null);\n close();\n }, [close, onWaiting]);\n\n // Notify parent about waiting state\n useEffect(() => {\n if (pending) {\n onWaiting?.('Sorting\\u2026', handleCancel);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n // Execute pending sort after async formulas resolve\n useEffect(() => {\n if (!pending) {\n return;\n }\n let cancelled = false;\n const execute = () => {\n if (cancelled) {\n return;\n }\n const currentSheet = sheetRef.current;\n if (!currentSheet) {\n return;\n }\n dispatch(sortRows({ x: pending.x, direction: pending.direction }));\n onWaiting?.(null);\n setPending(null);\n close();\n };\n const currentSheet = sheetRef.current;\n if (currentSheet && (currentSheet.hasPendingCells() || currentSheet.registry.asyncPending.size > 0)) {\n currentSheet.waitForPending().then(execute);\n } else {\n execute();\n }\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pending]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const sortDisabled = prevention.hasOperation(colCell?.prevention, prevention.Sort);\n\n return (\n <li className={`gs-menu-item gs-column-menu-sort${sortDisabled ? ' gs-disabled' : ''}`}>\n <div className=\"gs-menu-name\">Sort:</div>\n <div className=\"gs-sort-buttons\">\n <button\n className=\"gs-sort-btn gs-sort-btn-asc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'asc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↓ A to Z\n </button>\n <button\n className=\"gs-sort-btn gs-sort-btn-desc\"\n onClick={(e) => {\n e.stopPropagation();\n if (!sortDisabled) {\n setPending({ x, direction: 'desc' });\n }\n }}\n disabled={sortDisabled}\n >\n ↑ Z to A\n </button>\n </div>\n </li>\n );\n};\n\nregisterMenuComponent('col-sort', SortSection);\nexport { SortSection };\n","import type { PointType } from '../types';\nimport type { UserSheet } from './sheet';\n\nexport const getLabel = (sheet: UserSheet, label: string | undefined, point: PointType, n: number): string | null => {\n if (label != null) {\n return label;\n }\n const policy = sheet.getPolicy(point);\n return (point.x === 0 ? policy.renderRowHeaderLabel(n) : policy.renderColHeaderLabel(n)) ?? null;\n};\n","import { type FC, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { Context } from '../store';\nimport { setStore } from '../store/actions';\nimport * as prevention from '../lib/operation';\nimport { x2c, p2a } from '../lib/coords';\nimport { getLabel } from '../lib/label';\nimport { registerMenuComponent, type ColMenuSectionProps } from '../lib/menu';\n\nconst LabelSection: FC<ColMenuSectionProps> = ({ x, close }) => {\n const { store, dispatch } = useContext(Context);\n const { sheetReactive: sheetRef } = store;\n const sheet = sheetRef.current;\n const labelInputRef = useRef<HTMLInputElement>(null);\n const [label, setLabel] = useState('');\n\n // Restore label value when x changes\n useEffect(() => {\n if (sheet) {\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n setLabel(colCell?.label ?? '');\n }\n }, [x, sheet]);\n\n const handleApplyLabel = useCallback(() => {\n if (!sheet) {\n return;\n }\n const address = p2a({ y: 0, x });\n sheet.update({\n diff: { [address]: { label: label || undefined } },\n partial: true,\n ignoreFields: [],\n undoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n redoReflection: {\n sheetId: sheet.id,\n selectingZone: store.selectingZone,\n choosing: store.choosing,\n },\n });\n dispatch(setStore({ sheetReactive: { current: sheet } }));\n close();\n }, [dispatch, x, label, close, sheet, store.selectingZone, store.choosing]);\n\n if (!sheet) {\n return null;\n }\n\n const colCell = sheet.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const labelDisabled = prevention.hasOperation(colCell?.prevention, prevention.SetLabel);\n const labelPlaceholder = getLabel(sheet, colCell?.label, { y: 0, x }, x) ?? x2c(x);\n\n return (\n <li className={`gs-menu-item gs-column-menu-label${labelDisabled ? ' gs-disabled' : ''}`}>\n <label className=\"gs-label-input-row\">\n <div className=\"gs-label-input-label\">Label:</div>\n <input\n ref={labelInputRef}\n className=\"gs-label-input\"\n type=\"text\"\n placeholder={labelPlaceholder}\n value={label}\n disabled={labelDisabled}\n onChange={(e) => setLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.nativeEvent.isComposing) {\n return;\n }\n if (e.key === 'Enter') {\n handleApplyLabel();\n }\n if (e.key === 'Escape') {\n close();\n }\n }}\n />\n <button className=\"gs-label-apply-btn\" onClick={handleApplyLabel} disabled={labelDisabled}>\n UPDATE\n </button>\n </label>\n </li>\n );\n};\n\nregisterMenuComponent('col-label', LabelSection);\nexport { LabelSection };\n","import { type FC, useContext, useCallback, useState } from 'react';\nimport { Context } from '../store';\nimport { setColumnMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '../lib/dom';\nimport { buildMenuContext } from '../lib/menu';\nimport { getMenuComponent } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\n// Import section modules so their registerMenuComponent() calls run at load time.\n// Users may override any of these ids via registerMenuComponent() after import.\nimport './ColumnMenuFilterSection';\nimport './ColumnMenuSortSection';\nimport './ColumnMenuLabelSection';\n\nexport const ColumnMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { columnMenuState, editorRef, colMenu } = store;\n const sheet = store.sheetReactive.current;\n\n const x = columnMenuState?.x;\n const position = columnMenuState?.position;\n\n const [waitingState, setWaitingState] = useState<{ message: string; cancel: () => void } | null>(null);\n\n const handleClose = useCallback(() => {\n dispatch(setColumnMenu(null));\n focus(editorRef.current);\n }, [dispatch, editorRef]);\n\n const handleWaiting = useCallback(\n (message: string | null, cancel?: () => void) => {\n if (message) {\n setWaitingState({ message, cancel: cancel ?? handleClose });\n } else {\n setWaitingState(null);\n }\n },\n [handleClose],\n );\n\n if (!columnMenuState || !sheet || x == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-column-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (!waitingState) {\n handleClose();\n }\n return false;\n }}\n >\n <div\n className=\"gs-column-menu\"\n style={{ top: position.y, left: position.x, display: waitingState ? 'none' : undefined }}\n onClick={(e) => e.stopPropagation()}\n >\n <ul className=\"gs-menu-items\">\n {colMenu.map((descriptor, index) => {\n if (descriptor.type === 'component') {\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const Section = getMenuComponent(descriptor.componentId);\n if (!Section) {\n return null;\n }\n return <Section key={index} x={x} close={handleClose} onWaiting={handleWaiting} />;\n }\n if (descriptor.type === 'divider') {\n if (descriptor.visible && !descriptor.visible(ctx)) {\n return null;\n }\n return <MenuDivider key={index} />;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, x);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, x) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, x) : descriptor.label;\n const shortcuts =\n typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, x) : descriptor.shortcuts;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, x);\n dispatch(setColumnMenu(null));\n }}\n />\n );\n })}\n </ul>\n </div>\n {waitingState && (\n <div\n className=\"gs-column-menu gs-column-menu-waiting\"\n style={{ top: position.y, left: position.x }}\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"gs-waiting-message\">{waitingState.message}</div>\n <div className=\"gs-waiting-spinner\" />\n <button className=\"gs-waiting-cancel-btn\" onClick={waitingState.cancel}>\n CANCEL\n </button>\n </div>\n )}\n </Fixed>\n );\n};\n","import { type FC, useContext } from 'react';\nimport { Context } from '../store';\nimport { setRowMenu } from '../store/actions';\nimport { Fixed } from './Fixed';\nimport { focus } from '../lib/dom';\nimport type { RowMenuItemDescriptor } from '../lib/menu';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\nfunction renderRowDescriptor(\n descriptor: RowMenuItemDescriptor,\n ctx: ReturnType<typeof buildMenuContext>,\n y: number,\n index: number,\n close: () => void,\n) {\n if (descriptor.type === 'divider') {\n return <MenuDivider key={index} />;\n }\n if (descriptor.type === 'component') {\n return null;\n }\n const visible = !descriptor.visible || descriptor.visible(ctx, y);\n if (!visible) {\n return null;\n }\n const disabled = descriptor.disabled?.(ctx, y) ?? false;\n const label = typeof descriptor.label === 'function' ? descriptor.label(ctx, y) : descriptor.label;\n const shortcuts = typeof descriptor.shortcuts === 'function' ? descriptor.shortcuts(ctx, y) : descriptor.shortcuts;\n const checked = descriptor.checked != null ? descriptor.checked(ctx, y) : undefined;\n return (\n <MenuItem\n key={index}\n label={label}\n shortcuts={shortcuts}\n disabled={disabled}\n checked={checked}\n testId={descriptor.id ? `${descriptor.id}-item` : undefined}\n onClick={() => {\n descriptor.onClick(ctx, y);\n close();\n }}\n />\n );\n}\n\nexport const RowMenu: FC = () => {\n const { store, dispatch } = useContext(Context);\n const { rowMenuState, sheetReactive: sheetRef, editorRef, rowMenu } = store;\n const sheet = sheetRef.current;\n\n const y = rowMenuState?.y;\n const position = rowMenuState?.position;\n\n const handleClose = () => {\n dispatch(setRowMenu(null));\n focus(editorRef.current);\n };\n\n if (!rowMenuState || !sheet || y == null || !position) {\n return null;\n }\n\n const ctx = buildMenuContext(store, dispatch, handleClose);\n\n return (\n <Fixed\n className=\"gs-menu-modal gs-row-menu-modal\"\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n handleClose();\n return false;\n }}\n >\n <div className=\"gs-row-menu\" style={{ top: position.y, left: position.x }} onClick={(e) => e.stopPropagation()}>\n <ul className=\"gs-menu-items\">\n {rowMenu.map((descriptor, index) => renderRowDescriptor(descriptor, ctx, y, index, handleClose))}\n </ul>\n </div>\n </Fixed>\n );\n};\n","export const isTouching = (e: React.TouchEvent | React.MouseEvent): boolean => {\n if (e.type.startsWith('touch')) {\n return (e as React.TouchEvent).touches.length > 0;\n }\n if (e.type.startsWith('mouse')) {\n const mouseEvent = e as React.MouseEvent;\n // left click only\n return !!(mouseEvent.buttons & 1) && mouseEvent.button === 0;\n }\n return false;\n};\n\n/**\n * Safely call preventDefault to avoid errors on touch events\n */\nexport const safePreventDefault = (e: React.MouseEvent | React.TouchEvent): void => {\n if (!e.type.startsWith('touch')) {\n e.preventDefault();\n }\n};\n","import { useContext, useRef, useCallback, useEffect, memo, useMemo, useState } from 'react';\nimport { x2c, y2r } from '../lib/coords';\nimport { zoneToArea, among, areaToRange } from '../lib/spatial';\nimport {\n choose,\n select,\n drag,\n write,\n setEditorRect,\n setContextMenuPosition,\n setAutofillDraggingTo,\n setEditingAddress,\n setDragging,\n submitAutofill,\n setStore,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { FormulaError } from '../formula/formula-error';\nimport { Pending } from '../sentinels';\nimport { insertRef, isRefInsertable } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '../lib/sheet';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '../lib/popup';\n\ntype Props = {\n y: number;\n x: number;\n};\n\nexport const Cell: FC<Props> = memo(({ y, x }) => {\n const rowId = y2r(y);\n const colId = x2c(x);\n const address = `${colId}${rowId}`;\n const { store, dispatch } = useContext(Context);\n const isFirstPointed = useRef(true);\n\n const cellRef = useRef<HTMLTableCellElement>(null);\n const [errorTooltipPos, setErrorTooltipPos] = useState<PopupPosition | null>(null);\n const {\n sheetReactive,\n editingAddress,\n choosing,\n selectingZone,\n leftHeaderSelecting,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n // Whether the focus is on another sheet\n const xSheetFocused = isXSheetFocused(store);\n\n const lastFocused = sheet?.registry.lastFocused;\n\n const selectingArea = zoneToArea(selectingZone); // (top, left) -> (bottom, right)\n\n const editing = editingAddress === address;\n const pointed = choosing.y === y && choosing.x === x;\n const _setEditorRect = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (rect == null) {\n return null;\n }\n dispatch(\n setEditorRect({\n y: rect.y,\n x: rect.x,\n height: rect.height,\n width: rect.width,\n }),\n );\n }, [dispatch]);\n\n useEffect(() => {\n // Avoid setting coordinates on the initial render to account for shifts caused by redrawing due to virtualization.\n if (pointed && !isFirstPointed.current) {\n _setEditorRect();\n return;\n }\n isFirstPointed.current = false;\n }, [pointed, editing, _setEditorRect]);\n\n const cell = sheet?.getCell({ y, x }, { resolution: 'SYSTEM' });\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value }));\n },\n [dispatch],\n );\n\n const apply = useCallback(\n (sheet: UserSheet) => {\n dispatch(setStore({ sheetReactive: { current: sheet.__raw__ } }));\n },\n [dispatch],\n );\n\n let errorMessage = '';\n let rendered: any;\n try {\n if (sheet) {\n rendered = sheet.render({ sheet, point: { y, x }, apply, value: undefined });\n }\n } catch (e: any) {\n if (FormulaError.is(e)) {\n errorMessage = e.message;\n rendered = e.code;\n } else {\n errorMessage = e.message;\n rendered = '#UNKNOWN';\n }\n }\n const [, v] = sheet?.getSolvedCache({ y, x }) ?? [undefined, undefined];\n const isPendingCell = Pending.is(v);\n const input = editorRef.current;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!sheet) {\n return false;\n }\n if (!isTouching(e)) {\n return false;\n }\n if (!input) {\n return false;\n }\n\n // Single cell selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && input) {\n input.blur();\n }\n dispatch(choose({ y, x }));\n dispatch(select({ startY: y, startX: x, endY: y, endX: x }));\n return true;\n }\n\n // Normal drag operation for mouse events\n if (e.shiftKey) {\n dispatch(drag({ y, x }));\n } else {\n dispatch(select({ startY: y, startX: x, endY: -1, endX: -1 }));\n }\n\n dispatch(setDragging(true));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${address}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n return false;\n }\n }\n\n sheet.registry.lastFocused = input;\n focus(input);\n dispatch(setEditingAddress(''));\n\n if (autofillDraggingTo) {\n return false;\n }\n\n if (editingAnywhere) {\n writeCell(input.value);\n }\n if (!e.shiftKey) {\n dispatch(choose({ y, x }));\n }\n return true;\n },\n [editingAnywhere, input, address, xSheetFocused, lastFocused, autofillDraggingTo, writeCell, sheet],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n dispatch(submitAutofill(autofillDraggingTo));\n focus(input);\n return false;\n }\n if (editingAnywhere) {\n dispatch(drag({ y: -1, x: -1 }));\n }\n },\n [autofillDraggingTo, editingAnywhere, input],\n );\n\n const handleDragging = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e)) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n if (!sheet) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ x, y }));\n return false;\n }\n if (leftHeaderSelecting) {\n dispatch(drag({ y, x: sheet.numCols }));\n return false;\n }\n if (topHeaderSelecting) {\n dispatch(drag({ y: sheet.numRows, x }));\n return false;\n }\n if (editingAnywhere && !isRefInsertable(lastFocused || null)) {\n return false;\n }\n dispatch(drag({ y, x }));\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${areaToRange(newArea)}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n //sheet.registry.transmit(); // Force drawing because the formula is not reflected in largeInput\n return true;\n },\n [\n autofillDraggingTo,\n leftHeaderSelecting,\n topHeaderSelecting,\n sheet,\n editingAnywhere,\n lastFocused,\n selectingZone,\n xSheetFocused,\n ],\n );\n\n const handleAutofillMouseDown = useCallback(\n (e: React.MouseEvent) => {\n dispatch(setAutofillDraggingTo({ x, y }));\n dispatch(setDragging(true));\n e.stopPropagation();\n },\n [dispatch, x, y],\n );\n\n const handleErrorTriangleEnter = useCallback(() => {\n const rect = cellRef.current?.getBoundingClientRect();\n if (!rect) {\n return;\n }\n setErrorTooltipPos(calcBelowPosition(rect));\n }, []);\n\n const handleErrorTriangleLeave = useCallback(() => {\n setErrorTooltipPos(null);\n }, []);\n\n // --- Memoize event handlers with useCallback ---\n const onContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n const onDoubleClick = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n e.stopPropagation();\n safePreventDefault(e);\n setEditingAddress(address);\n const dblclick = document.createEvent('MouseEvents');\n dblclick.initEvent('dblclick', true, true);\n input?.dispatchEvent(dblclick);\n return false;\n },\n [address, input],\n );\n\n const autofillDragClass = useMemo(() => {\n if (!editing && pointed && selectingArea.bottom === -1) {\n return 'gs-autofill-drag';\n }\n\n if (selectingArea.bottom === y && selectingArea.right === x) {\n return 'gs-autofill-drag';\n }\n return 'gs-autofill-drag gs-hidden';\n }, [editing, pointed, selectingArea]);\n\n if (!sheet) {\n return null;\n }\n\n if (!input) {\n return (\n <td key={x} data-x={x} data-y={y} data-address={address} className=\"gs-cell gs-hidden\">\n <div className=\"gs-cell-inner-wrap\">\n <div className=\"gs-cell-inner\">\n <div className=\"gs-cell-rendered\"></div>\n </div>\n <div className=\"gs-autofill-drag\"></div>\n </div>\n </td>\n );\n }\n\n return (\n <td\n key={x}\n ref={cellRef}\n data-x={x}\n data-y={y}\n data-address={address}\n className={`gs-cell ${among(selectingArea, { y, x }) ? 'gs-selecting' : ''} ${pointed ? 'gs-choosing' : ''} ${\n editing ? 'gs-editing' : ''\n } ${isPendingCell ? 'gs-pending' : ''}`}\n style={{\n ...cell?.style,\n }}\n onContextMenu={onContextMenu}\n onDoubleClick={onDoubleClick}\n >\n <div\n className={`gs-cell-inner-wrap`}\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div\n className={'gs-cell-inner'}\n style={{\n ...cell?.style,\n justifyContent: cell?.justifyContent || 'left',\n alignItems: cell?.alignItems || 'start',\n }}\n >\n {errorMessage && (\n <div\n className=\"gs-formula-error-triangle\"\n onMouseEnter={handleErrorTriangleEnter}\n onMouseLeave={handleErrorTriangleLeave}\n />\n )}\n <div className=\"gs-cell-rendered\">{rendered}</div>\n </div>\n {errorMessage && errorTooltipPos && (\n <div\n className=\"gs-formula-error-tooltip\"\n style={{\n top: errorTooltipPos.y + 4,\n left: errorTooltipPos.x,\n transform: hAlignTransform(errorTooltipPos.hAlign),\n }}\n >\n {errorMessage}\n </div>\n )}\n <div className={autofillDragClass} onMouseDown={handleAutofillMouseDown}></div>\n </div>\n </td>\n );\n});\n","import type { CSSProperties } from 'react';\nimport { useEffect, useRef, useContext, useCallback } from 'react';\nimport { Context } from '../store';\nimport { drag, setAutofillDraggingTo, setDragging, submitAutofill } from '../store/actions';\nimport { getAreaInTabular } from '../lib/virtualization';\nimport { insertRef, isFocus } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { areaToRange, zoneToArea } from '../lib/spatial';\nimport { isXSheetFocused } from '../store/helpers';\n\ntype Props = {\n className?: string;\n style: CSSProperties;\n horizontal?: number;\n vertical?: number;\n};\n\nconst acceleration = 0.4;\nconst maxSpeed = 200;\n\nlet lastScrollTime = new Date().getTime();\nlet currentSpeed = 0;\n\nexport function ScrollHandle({ style, horizontal = 0, vertical = 0, className = '' }: Props) {\n const scrollRef = useRef<number | null>(null);\n const { store, dispatch } = useContext(Context);\n const {\n tabularRef,\n autofillDraggingTo,\n dragging,\n selectingZone,\n editorRef,\n sheetReactive: sheetRef,\n searchInputRef,\n editingAddress,\n } = store;\n const sheet = sheetRef.current;\n\n let isScrolling = false;\n const xSheetFocused = isXSheetFocused(store);\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const getDestEdge = useCallback(\n (e: React.MouseEvent) => {\n if (!sheet) {\n return { x: -1, y: -1 };\n }\n if (horizontal == 0 && vertical == 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n horizontal = e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical = e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n const area = getAreaInTabular(tabularRef.current!);\n let { endX: x, endY: y } = selectingZone;\n if (horizontal) {\n x = horizontal > 0 ? area.right : area.left;\n } else if (vertical) {\n y = vertical > 0 ? area.bottom : area.top;\n }\n return { x, y };\n },\n [sheet, horizontal, vertical, selectingZone],\n );\n\n const scrollStep = useCallback(\n (e: React.MouseEvent) => {\n if (!isScrolling || tabularRef.current === null || !sheet) {\n return;\n }\n const now = new Date().getTime();\n if (now - lastScrollTime > 1000) {\n currentSpeed = 0;\n }\n lastScrollTime = now;\n\n tabularRef.current.scrollBy({\n left: currentSpeed * horizontal!,\n top: currentSpeed * vertical!,\n });\n focus(editorRef.current);\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(setAutofillDraggingTo({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n } else {\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: x });\n const sheetPrefix = sheet.sheetPrefix(!xSheetFocused);\n const sheetRange = areaToRange(newArea);\n const fullRange = `${sheetPrefix}${sheetRange}`;\n insertRef({ input: editorRef.current, ref: fullRange });\n }\n dispatch(drag({ y, x }));\n }\n currentSpeed = Math.min(currentSpeed + acceleration, maxSpeed);\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [\n isScrolling,\n sheet,\n horizontal,\n vertical,\n autofillDraggingTo,\n editingAnywhere,\n selectingZone,\n xSheetFocused,\n getDestEdge,\n ],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (isScrolling) {\n return;\n }\n isScrolling = true;\n\n if (horizontal === 0 || vertical === 0) {\n const tabularRect = tabularRef.current!.getBoundingClientRect();\n const { left, top, right, bottom } = tabularRect;\n\n horizontal ||= e.pageX > right ? 1 : e.pageX < left ? -1 : 0;\n if (horizontal === 0) {\n vertical ||= e.pageY > bottom ? 1 : e.pageY < top ? -1 : 0;\n }\n }\n scrollRef.current = requestAnimationFrame(() => scrollStep(e));\n },\n [isScrolling, horizontal, vertical, scrollStep],\n );\n\n const stopScroll = useCallback(() => {\n if (scrollRef.current !== null) {\n cancelAnimationFrame(scrollRef.current);\n scrollRef.current = null;\n }\n isScrolling = false;\n if (!isFocus(searchInputRef.current)) {\n // Pressing Enter on a search result will not focus the editor.\n focus(editorRef.current);\n }\n }, []);\n\n const handleMouseUp = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const area = getAreaInTabular(tabularRef.current!);\n if (area.bottom === -1 || area.right === -1) {\n return;\n }\n\n const { x, y } = getDestEdge(e);\n if (autofillDraggingTo) {\n const { y: curY, x: curX } = autofillDraggingTo;\n dispatch(submitAutofill({ y: y === -1 ? curY : y, x: x === -1 ? curX : x }));\n focus(editorRef.current);\n } else {\n if (editingAnywhere) {\n // inserting a range\n dispatch(drag({ y: -1, x: -1 })); // Reset dragging\n }\n }\n },\n [autofillDraggingTo, editingAnywhere, getDestEdge],\n );\n\n const handleMouseUpWrapper = useCallback(\n (e: React.MouseEvent) => {\n stopScroll();\n dispatch(setDragging(false));\n requestAnimationFrame(() => handleMouseUp(e));\n },\n [stopScroll, handleMouseUp],\n );\n\n const handleMouseLeave = useCallback(() => {\n stopScroll();\n }, [stopScroll]);\n\n useEffect(() => {\n return stopScroll;\n }, [stopScroll]);\n\n if (!editorRef.current || (!dragging && !autofillDraggingTo)) {\n return <div className={`gs-scroll-handle gs-hidden ${className}`} />;\n }\n\n return (\n <div\n style={style}\n className={`gs-scroll-handle ${className}`}\n onMouseUp={(e) => {\n handleMouseUpWrapper(e);\n }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n />\n );\n}\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { x2c } from '../lib/coords';\nimport { getLabel } from '../lib/label';\nimport { between, zoneToArea } from '../lib/spatial';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectCols,\n setAutofillDraggingTo,\n setColumnMenu,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionX,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_WIDTH } from '../constants';\nimport * as prevention from '../lib/operation';\nimport { insertRef } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from './hooks';\n\ntype Props = {\n x: number;\n};\n\nexport const HeaderCellTop: FC<Props> = memo(({ x }) => {\n const colId = x2c(x);\n const { store, dispatch } = useContext(Context);\n\n const {\n sheetReactive: sheetRef,\n editingAddress,\n choosing,\n selectingZone,\n topHeaderSelecting,\n editorRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n columnMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const col = sheet?.getCell({ y: 0, x }, { resolution: 'SYSTEM' });\n const width = col?.width || DEFAULT_WIDTH;\n const hasFilter = !!(col?.filter && col.filter.conditions.length > 0);\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionX([x, e.clientX, e.clientX]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (dragging) {\n return false;\n }\n\n // Single column selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y: 1, x }));\n dispatch(select({ startY: 1, startX: x, endY: sheet.numRows, endX: x }));\n return true;\n }\n\n dispatch(select({ startY: 1, startX: x, endY: -1, endX: x }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${colId}:${colId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: sheet.numRows, startX: x, endY: 0, endX: x }));\n return false;\n }\n }\n\n let startX = e.shiftKey ? selectingZone.startX : x;\n if (startX === -1) {\n startX = choosing.x;\n }\n\n dispatch(\n selectCols({\n range: { start: startX, end: x },\n numRows: sheet.numRows,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n colId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y: 1, x }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: 1, endX: x });\n const [left, right] = [x2c(newArea.left), x2c(newArea.right)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${left}:${right}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startY } = selectingZone;\n if (startY === 1) {\n dispatch(drag({ y: sheet.numRows, x }));\n } else {\n dispatch(drag({ y: 1, x }));\n }\n }\n return false;\n }, 100);\n\n if (!sheet) {\n return (\n <th data-x={x} className=\"gs-th gs-th-top gs-hidden\">\n <div className=\"gs-th-inner-wrap\">\n <div className=\"gs-th-inner\">\n <ScrollHandle style={{ position: 'absolute' }} vertical={-1} />\n <div className=\"gs-resizer\"></div>\n </div>\n </div>\n </th>\n );\n }\n\n return (\n <th\n data-x={x}\n className={`gs-th gs-th-top ${choosing.x === x ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startX, end: selectingZone.endX }, x)\n ? topHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n }`}\n style={{ ...col?.style, width, minWidth: width, maxWidth: width }}\n onContextMenu={(e) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n }}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ height: sheet.headerHeight, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: topHeaderSelecting ? -1 : 1,\n }}\n vertical={-1}\n />\n {(() => {\n const displayedLabel = getLabel(sheet, col?.label, { y: 0, x }, x) ?? colId;\n if (displayedLabel !== colId) {\n return (\n <>\n <span className=\"gs-col-addr\">{colId}</span>\n {displayedLabel}\n </>\n );\n }\n return displayedLabel;\n })()}\n {!prevention.hasOperation(col?.prevention, prevention.ColumnMenu) && (\n <button\n className={`gs-menu-btn gs-column-menu-btn ${hasFilter ? 'gs-filtered' : ''} ${columnMenuState?.x === x ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (columnMenuState?.x === x) {\n dispatch(setColumnMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startX, end: selectingZone.endX }, x) &&\n selectingZone.startY === 1 &&\n selectingZone.endY === sheet.numRows;\n if (!alreadySelected) {\n dispatch(selectCols({ range: { start: x, end: x }, numRows: sheet.numRows }));\n }\n dispatch(setColumnMenu({ x, position: { y: rect.bottom, x: rect.left } }));\n }\n }}\n title=\"Sort & Filter\"\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer \n ${prevention.hasOperation(col?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ height: sheet.headerHeight }}\n onMouseDown={handleResizeMouseDown}\n >\n <i />\n </div>\n </div>\n </div>\n </th>\n );\n});\n","import type { FC } from 'react';\nimport { useContext, useCallback, memo, useRef } from 'react';\nimport { y2r } from '../lib/coords';\nimport { getLabel } from '../lib/label';\nimport { between, zoneToArea } from '../lib/spatial';\nimport { Context } from '../store';\nimport {\n choose,\n drag,\n select,\n selectRows,\n setAutofillDraggingTo,\n setContextMenuPosition,\n setDragging,\n setEditingAddress,\n setResizingPositionY,\n setRowMenu,\n submitAutofill,\n write,\n} from '../store/actions';\nimport { DEFAULT_HEIGHT } from '../constants';\nimport * as prevention from '../lib/operation';\nimport { insertRef } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from './hooks';\n\ntype Props = {\n y: number;\n};\n\nexport const HeaderCellLeft: FC<Props> = memo(({ y }) => {\n const rowId = `${y2r(y)}`;\n const { store, dispatch } = useContext(Context);\n\n const {\n choosing,\n editingAddress,\n selectingZone,\n leftHeaderSelecting,\n editorRef,\n sheetReactive: sheetRef,\n autofillDraggingTo,\n dragging,\n contextMenu,\n rowMenuState,\n } = store;\n const sheet = sheetRef.current;\n\n const row = sheet?.getCell({ y, x: 0 }, { resolution: 'SYSTEM' });\n const height = row?.height || DEFAULT_HEIGHT;\n\n const xSheetFocused = isXSheetFocused(store);\n const lastFocused = sheet?.registry.lastFocused;\n\n const editingAnywhere = !!(sheet?.registry.editingAddress || editingAddress);\n\n const writeCell = useCallback(\n (value: string) => {\n dispatch(write({ value, point: choosing }));\n },\n [choosing],\n );\n\n const handleResizeMouseDown = useCallback((e: React.MouseEvent) => {\n dispatch(setResizingPositionY([y, e.clientY, e.clientY]));\n e.stopPropagation();\n safePreventDefault(e);\n }, []);\n\n const handleDragStart = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n safePreventDefault(e);\n\n if (!isTouching(e) || !sheet) {\n return false;\n }\n if (dragging) {\n return false;\n }\n\n // Single row selection only for touch events\n if (e.type.startsWith('touch')) {\n // Blur the input field to commit current value when selecting via touch\n if (editingAnywhere && editorRef.current) {\n editorRef.current.blur();\n }\n dispatch(choose({ y, x: 1 }));\n dispatch(select({ startY: y, startX: 1, endY: y, endX: sheet.numCols }));\n return true;\n }\n\n // Normal drag operation for mouse events\n dispatch(select({ startY: y, startX: 1, endY: y, endX: -1 }));\n const fullAddress = `${sheet.sheetPrefix(!xSheetFocused)}${rowId}:${rowId}`;\n if (editingAnywhere) {\n const inserted = insertRef({ input: lastFocused || null, ref: fullAddress });\n if (inserted) {\n dispatch(select({ startY: y, startX: sheet.numCols, endY: y, endX: 0 }));\n return false;\n }\n }\n\n let startY = e.shiftKey ? selectingZone.startY : y;\n if (startY === -1) {\n startY = choosing.y;\n }\n\n dispatch(\n selectRows({\n range: { start: startY, end: y },\n numCols: sheet.numCols,\n }),\n );\n\n if (editingAnywhere) {\n writeCell(lastFocused?.value ?? '');\n }\n dispatch(setEditingAddress(''));\n dispatch(setDragging(true));\n focus(editorRef.current);\n\n if (autofillDraggingTo) {\n return false;\n }\n return true;\n },\n [\n dragging,\n editingAnywhere,\n xSheetFocused,\n rowId,\n lastFocused,\n selectingZone,\n choosing,\n autofillDraggingTo,\n editorRef,\n ],\n );\n\n const handleDragEnd = useCallback(\n (e: React.MouseEvent | React.TouchEvent) => {\n e.stopPropagation();\n if (e.type.startsWith('touch')) {\n return;\n }\n\n safePreventDefault(e);\n dispatch(setDragging(false));\n if (autofillDraggingTo) {\n focus(editorRef.current);\n return false;\n }\n },\n [autofillDraggingTo],\n );\n\n const handleDragging = useDebounceCallback((e: React.MouseEvent | React.TouchEvent) => {\n if (!isTouching(e) || !sheet) {\n return false;\n }\n\n // Do nothing for touch events\n if (e.type.startsWith('touch')) {\n return false;\n }\n\n safePreventDefault(e);\n e.stopPropagation();\n\n if (autofillDraggingTo) {\n dispatch(setAutofillDraggingTo({ y, x: 1 }));\n return false;\n }\n\n if (editingAnywhere) {\n const newArea = zoneToArea({ ...selectingZone, endY: y, endX: 1 });\n const [top, bottom] = [y2r(newArea.top), y2r(newArea.bottom)];\n const fullRange = `${sheet.sheetPrefix(!xSheetFocused)}${top}:${bottom}`;\n insertRef({ input: lastFocused || null, ref: fullRange });\n }\n\n if (autofillDraggingTo == null) {\n const { startX } = selectingZone;\n if (startX === 1) {\n dispatch(drag({ y, x: sheet.numCols }));\n } else {\n dispatch(drag({ y, x: 1 }));\n }\n }\n return false;\n }, 100);\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (contextMenu.length > 0) {\n e.stopPropagation();\n safePreventDefault(e);\n dispatch(setContextMenuPosition({ y: e.clientY, x: e.clientX }));\n return false;\n }\n return true;\n },\n [contextMenu.length],\n );\n\n if (!sheet) {\n return null;\n }\n\n return (\n <th\n data-y={y}\n className={`gs-th gs-th-left ${choosing.y === y ? 'gs-choosing' : ''} ${\n between({ start: selectingZone.startY, end: selectingZone.endY }, y)\n ? leftHeaderSelecting\n ? 'gs-th-selecting'\n : 'gs-selecting'\n : ''\n } ${row?.filterFixed ? 'gs-filter-fixed' : ''} ${row?.sortFixed ? 'gs-sort-fixed' : ''}`}\n style={{ ...row?.style, height }}\n onContextMenu={handleContextMenu}\n >\n <div\n className=\"gs-th-inner-wrap\"\n onMouseDown={handleDragStart}\n onTouchStart={handleDragStart}\n onMouseEnter={handleDragging}\n onMouseUp={handleDragEnd}\n >\n <div className=\"gs-th-inner\" style={{ width: sheet.headerWidth, position: 'relative' }}>\n <ScrollHandle\n style={{\n position: 'absolute',\n zIndex: leftHeaderSelecting ? -1 : 1,\n }}\n horizontal={-1}\n />\n {getLabel(sheet, row?.label, { y, x: 0 }, y) ?? rowId}\n {!prevention.hasOperation(row?.prevention, prevention.RowMenu) && (\n <button\n className={`gs-menu-btn gs-row-menu-btn ${rowMenuState?.y === y ? 'gs-active' : ''}`}\n onMouseDown={(e) => {\n e.stopPropagation();\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return; // was a drag, ignore\n }\n const rect = btn.getBoundingClientRect();\n if (rowMenuState?.y === y) {\n dispatch(setRowMenu(null));\n } else {\n const alreadySelected =\n between({ start: selectingZone.startY, end: selectingZone.endY }, y) &&\n selectingZone.startX === 1 &&\n selectingZone.endX === sheet.numCols;\n if (!alreadySelected) {\n dispatch(selectRows({ range: { start: y, end: y }, numCols: sheet.numCols }));\n }\n dispatch(setRowMenu({ y, position: { y: rect.bottom, x: rect.right } }));\n }\n }}\n title=\"Row menu\"\n >\n ⋮\n </button>\n )}\n <div\n className={`\n gs-resizer\n ${prevention.hasOperation(row?.prevention, prevention.Resize) ? 'gs-protected' : ''}\n ${dragging ? 'gs-hidden' : ''}`}\n style={{ width: sheet.headerWidth }}\n onMouseDown={handleResizeMouseDown}\n ></div>\n </div>\n </div>\n </th>\n );\n});\n","import { useContext, useEffect, useRef, useCallback } from 'react';\nimport { Context } from '../store';\nimport { zoneToArea } from '../lib/spatial';\nimport { between } from '../lib/spatial';\nimport { a2p } from '../lib/coords';\nimport { COLOR_PALETTE } from '../lib/palette';\nimport { Autofill } from '../lib/autofill';\nimport { getCellRectPositions } from '../lib/virtualization';\nimport type { Sheet } from '../lib/sheet';\nimport type { FC } from 'react';\nimport type { RefPaletteType, AreaType, ModeType } from '../types';\n\nconst COLOR_POINTED = 'rgba(0, 119, 255, 1)';\nconst COLOR_SELECTED = 'rgba(0, 119, 255, 0.6)';\nconst SELECTING_FILL = 'rgba(0, 128, 255, 0.2)';\nconst COLOR_COPYING = '#0077ff';\nconst COLOR_CUTTING = '#0077ff';\nconst SEARCH_MATCHING_BACKGROUND = 'rgba(0, 200, 100, 0.2)';\nconst COLOR_SEARCH_MATCHING = '#00aa78';\nconst COLOR_AUTOFILL = '#0077aa';\n\nconst HEADER_COLORS = {\n light: {\n selecting: 'rgba(0, 0, 0, 0.1)',\n choosing: 'rgba(0, 0, 0, 0.2)',\n thSelecting: 'rgba(0, 0, 0, 0.55)',\n },\n dark: {\n selecting: 'rgba(255, 255, 255, 0.08)',\n choosing: 'rgba(255, 255, 255, 0.18)',\n thSelecting: 'rgba(255, 255, 255, 0.4)',\n },\n} as const;\n\ntype Props = {\n refs?: RefPaletteType;\n};\n\ntype Ctx2D = CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;\n\nconst fillRect = (ctx: Ctx2D, x: number, y: number, width: number, height: number, color: string) => {\n ctx.fillStyle = color;\n ctx.fillRect(x, y, width, height);\n};\n\nconst drawRect = (\n ctx: Ctx2D,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n if (fillColor) {\n ctx.fillStyle = fillColor;\n ctx.fillRect(x, y, width, height);\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(dashPattern);\n ctx.strokeRect(x + lineWidth / 2, y + lineWidth / 2, width - lineWidth, height - lineWidth);\n ctx.setLineDash([]);\n};\n\n// Draw an area rect in viewport coordinates (absolute coords - scroll offset, clamped to viewport)\nconst drawAreaRectViewport = (\n ctx: Ctx2D,\n sheet: Sheet,\n scrollTop: number,\n scrollLeft: number,\n viewW: number,\n viewH: number,\n area: AreaType,\n color: string,\n lineWidth: number = 2,\n dashPattern: number[] = [],\n fillColor?: string,\n) => {\n const { top, left, bottom, right } = area;\n if (top === -1 || left === -1 || bottom === -1 || right === -1) {\n return;\n }\n\n const topLeft = getCellRectPositions(sheet, { y: top, x: left });\n const bottomRight = getCellRectPositions(sheet, { y: bottom, x: right });\n\n const x1 = topLeft.left - scrollLeft;\n const y1 = topLeft.top - scrollTop;\n const x2 = bottomRight.right - scrollLeft;\n const y2 = bottomRight.bottom - scrollTop;\n\n // Quick reject if entirely off-screen\n if (x2 < 0 || x1 > viewW || y2 < 0 || y1 > viewH) {\n return;\n }\n\n drawRect(ctx, x1, y1, x2 - x1, y2 - y1, color, lineWidth, dashPattern, fillColor);\n};\n\nexport const CellStateOverlay: FC<Props> = ({ refs = {} }) => {\n const { store } = useContext(Context);\n const {\n sheetReactive,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n } = store;\n const sheet = sheetReactive.current;\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafIdRef = useRef<number>(0);\n const storeRef = useRef(store);\n storeRef.current = store;\n\n const drawCanvas = useCallback(() => {\n if (!sheet || !tabularRef.current || !canvasRef.current) {\n return;\n }\n\n const canvas = canvasRef.current;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n\n const container = tabularRef.current;\n const dpr = window.devicePixelRatio || 1;\n const w = container.clientWidth;\n const h = container.clientHeight;\n\n // Resize canvas to viewport\n if (canvas.width !== w * dpr || canvas.height !== h * dpr) {\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n }\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n const { registry } = sheet;\n const scrollTop = container.scrollTop;\n const scrollLeft = container.scrollLeft;\n const headerW = sheet.headerWidth;\n const headerH = sheet.headerHeight;\n\n // Clip cell-area drawing to exclude header region\n ctx.save();\n ctx.beginPath();\n ctx.rect(headerW, headerH, w - headerW, h - headerH);\n ctx.clip();\n\n // 1. Selecting zone (border + fill)\n const selectingArea = zoneToArea(selectingZone);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, selectingArea, COLOR_SELECTED, 1, [], SELECTING_FILL);\n\n // 2. Autofill dragging\n if (autofillDraggingTo) {\n const autofill = new Autofill(storeRef.current, autofillDraggingTo);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, autofill.wholeArea, COLOR_AUTOFILL, 1, [5, 5]);\n }\n\n // 3. Choosing (pointed cell)\n {\n const { y, x } = choosing;\n if (y !== -1 && x !== -1) {\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n drawRect(ctx, vx, vy, pos.width, pos.height, COLOR_POINTED, 2, []);\n }\n }\n\n // 4. Copying/Cutting zone\n const { copyingSheetId, copyingZone, cutting } = registry;\n if (sheet.id === copyingSheetId) {\n const copyingArea = zoneToArea(copyingZone);\n const color = cutting ? COLOR_CUTTING : COLOR_COPYING;\n const dashPattern = cutting ? [4, 4] : [6, 4];\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, copyingArea, color, 2.5, dashPattern);\n }\n\n // 5. Formula references (from palette)\n Object.entries(refs).forEach(([ref, i]) => {\n const palette = COLOR_PALETTE[i % COLOR_PALETTE.length];\n try {\n const refArea = sheet.rangeToArea(ref);\n drawAreaRectViewport(ctx, sheet, scrollTop, scrollLeft, w, h, refArea, palette, 2, [5, 5]);\n } catch (e) {\n // Invalid reference, skip\n }\n });\n\n // 6. Search matching cells\n matchingCells.forEach((address, index) => {\n const { y, x } = a2p(address);\n const pos = getCellRectPositions(sheet, { y, x });\n const vx = pos.left - scrollLeft;\n const vy = pos.top - scrollTop;\n\n // Skip if off-screen\n if (vx + pos.width < 0 || vx > w || vy + pos.height < 0 || vy > h) {\n return;\n }\n\n const isCurrentMatch = index === matchingCellIndex;\n drawRect(\n ctx,\n vx,\n vy,\n pos.width,\n pos.height,\n isCurrentMatch ? COLOR_SEARCH_MATCHING : 'transparent',\n isCurrentMatch ? 2 : 0,\n [],\n SEARCH_MATCHING_BACKGROUND,\n );\n });\n\n // Restore full canvas for header drawing\n ctx.restore();\n\n // 7. Header highlights (top and left) — draw bottom border for top headers, right border for left headers\n const numCols = sheet.numCols;\n const numRows = sheet.numRows;\n\n // Top headers - draw bottom border and background\n for (let x = 1; x <= numCols; x++) {\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startX, end: selectingZone.endX }, x)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.x === x) {\n color = COLOR_POINTED;\n backgroundColor = topHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y: 1, x });\n const left = pos.left - scrollLeft;\n if (left + pos.width < headerW || left > w) {\n continue;\n }\n const drawLeft = Math.max(left, headerW);\n const drawWidth = Math.min(left + pos.width, w) - drawLeft;\n if (drawWidth > 0) {\n if (backgroundColor) {\n fillRect(ctx, drawLeft, 0, drawWidth, headerH, backgroundColor);\n }\n // Draw bottom border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(drawLeft, headerH + 1);\n ctx.lineTo(drawLeft + drawWidth, headerH + 1);\n ctx.stroke();\n }\n }\n\n // Left headers - draw right border and background\n for (let y = 1; y <= numRows; y++) {\n if (sheet.isRowFiltered(y)) {\n continue;\n }\n let color: string | null = null;\n let backgroundColor: string | null = null;\n if (between({ start: selectingZone.startY, end: selectingZone.endY }, y)) {\n color = 'rgba(80, 180, 255, 1)';\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.25)' : 'rgba(0, 119, 255, 0.05)';\n }\n if (choosing.y === y) {\n color = COLOR_POINTED;\n backgroundColor = leftHeaderSelecting ? 'rgba(128, 128, 128, 0.45)' : 'rgba(0, 119, 255, 0.15)';\n }\n if (!color) {\n continue;\n }\n\n const pos = getCellRectPositions(sheet, { y, x: 1 });\n const top = pos.top - scrollTop;\n if (top + pos.height < headerH || top > h) {\n continue;\n }\n const drawTop = Math.max(top, headerH);\n const drawHeight = Math.min(top + pos.height, h) - drawTop;\n if (drawHeight > 0) {\n if (backgroundColor) {\n fillRect(ctx, 0, drawTop, headerW, drawHeight, backgroundColor);\n }\n // Draw right border of the header\n ctx.strokeStyle = color;\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.moveTo(headerW + 1, drawTop);\n ctx.lineTo(headerW + 1, drawTop + drawHeight);\n ctx.stroke();\n }\n }\n }, [\n sheet,\n tabularRef,\n choosing,\n selectingZone,\n matchingCells,\n matchingCellIndex,\n autofillDraggingTo,\n topHeaderSelecting,\n leftHeaderSelecting,\n mode,\n dragging,\n refs,\n ]);\n\n // Schedule a draw on the next animation frame (for state changes)\n const scheduleDrawCanvas = useCallback(() => {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(drawCanvas);\n }, [drawCanvas]);\n\n // Draw synchronously on scroll to avoid 1-frame lag\n const handleScroll = useCallback(() => {\n drawCanvas();\n }, [drawCanvas]);\n\n useEffect(() => {\n scheduleDrawCanvas();\n return () => cancelAnimationFrame(rafIdRef.current);\n }, [scheduleDrawCanvas]);\n\n useEffect(() => {\n const container = tabularRef.current;\n if (!container) {\n return;\n }\n container.addEventListener('scroll', handleScroll);\n return () => {\n container.removeEventListener('scroll', handleScroll);\n };\n }, [tabularRef, handleScroll]);\n\n return (\n <div\n style={{\n position: 'sticky',\n top: 0,\n left: 0,\n width: 0,\n height: 0,\n overflow: 'visible',\n pointerEvents: 'none',\n zIndex: 10,\n }}\n >\n <canvas\n ref={canvasRef}\n className=\"gs-cell-state-overlay\"\n style={{\n pointerEvents: 'none',\n display: 'block',\n }}\n />\n </div>\n );\n};\n","import { useEffect, useContext, useState, useCallback } from 'react';\n\nimport { Cell } from './Cell';\nimport { HeaderCellTop } from './HeaderCellTop';\nimport { HeaderCellLeft } from './HeaderCellLeft';\nimport { CellStateOverlay } from './CellStateOverlay';\n\nimport { Context } from '../store';\nimport { choose, select, setContextMenuPosition } from '../store/actions';\n\nimport type { RefPaletteType, Virtualization } from '../types';\nimport { virtualize } from '../lib/virtualization';\nimport { p2a, stripAddressAbsolute } from '../lib/coords';\nimport { Lexer, stripSheetName } from '../formula/evaluator';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '../lib/dom';\n\nexport const Tabular = () => {\n const [palette, setPalette] = useState<RefPaletteType>({});\n const { store, dispatch } = useContext(Context);\n const {\n sheetReactive,\n choosing,\n editingAddress,\n tabularRef,\n mainRef,\n sheetWidth,\n sheetHeight,\n inputting,\n leftHeaderSelecting,\n topHeaderSelecting,\n contextMenu,\n } = store;\n const sheet = sheetReactive.current;\n\n const [virtualized, setVirtualized] = useState<Virtualization | null>(null);\n\n const handleMouseMove = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleScroll = useCallback(\n (e: React.UIEvent<HTMLDivElement>) => {\n if (sheet) {\n setVirtualized(virtualize(sheet, e.currentTarget));\n }\n },\n [sheetReactive],\n );\n\n const handleSelectAllClick = useCallback(() => {\n if (!sheet) {\n return;\n }\n dispatch(choose({ y: -1, x: -1 }));\n requestAnimationFrame(() => {\n dispatch(choose({ y: 1, x: 1 }));\n dispatch(\n select({\n startY: 1,\n startX: 1,\n endY: sheet.numRows,\n endX: sheet.numCols,\n }),\n );\n });\n }, [sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n const formulaEditing = editingAddress && inputting.startsWith('=');\n if (!formulaEditing) {\n setPalette({});\n sheet.registry.paletteBySheetName = {};\n return;\n }\n const palette: RefPaletteType = {};\n const paletteBySheetName: { [sheetName: string]: RefPaletteType } = {};\n const lexer = new Lexer(inputting.substring(1));\n lexer.tokenize();\n\n let i = 0;\n for (const token of lexer.tokens) {\n if (token.type === 'REF' || token.type === 'RANGE') {\n const normalizedRef = stripAddressAbsolute(token.stringify());\n const splitterIndex = normalizedRef.indexOf('!');\n if (splitterIndex !== -1) {\n const sheetName = normalizedRef.substring(0, splitterIndex);\n const ref = normalizedRef.substring(splitterIndex + 1);\n const stripped = stripSheetName(sheetName);\n const upperRef = ref.toUpperCase();\n if (paletteBySheetName[stripped] == null) {\n paletteBySheetName[stripped] = {};\n }\n if (paletteBySheetName[stripped][upperRef] == null) {\n paletteBySheetName[stripped][upperRef] = i++;\n }\n } else {\n const upperRef = normalizedRef.toUpperCase();\n if (palette[upperRef] == null) {\n palette[upperRef] = i++;\n }\n }\n }\n }\n setPalette(palette);\n sheet.registry.paletteBySheetName = paletteBySheetName;\n }, [store.inputting, store.editingAddress, sheetReactive]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n sheet.registry.choosingAddress = p2a(choosing);\n sheet.registry.choosingSheetId = sheet.id;\n }, [choosing]);\n\n useEffect(() => {\n if (!sheet) {\n return;\n }\n setVirtualized(virtualize(sheet, tabularRef.current));\n }, [tabularRef.current, sheetReactive, mainRef.current?.clientHeight, mainRef.current?.clientWidth]);\n\n useEffect(() => {\n const el = tabularRef.current;\n if (!el) {\n return;\n }\n return preventSafariBounce(el);\n }, [sheetReactive]);\n\n const mergedRefs: RefPaletteType = {\n ...palette,\n ...(sheet ? sheet.registry.paletteBySheetName[sheet.name] : {}),\n };\n\n if (!sheet || !sheet.registry.ready) {\n return null;\n }\n\n return (\n <>\n <div\n className=\"gs-tabular\"\n style={{\n width: sheetWidth === -1 ? undefined : sheetWidth,\n height: sheetHeight === -1 ? undefined : sheetHeight,\n }}\n ref={tabularRef}\n onMouseMove={handleMouseMove}\n onScroll={handleScroll}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: sheet.totalWidth + 1,\n height: sheet.totalHeight + 1,\n }}\n >\n <CellStateOverlay refs={mergedRefs} />\n <table className={`gs-table`}>\n <thead className=\"gs-thead\" style={{ height: sheet.headerHeight }}>\n <tr className=\"gs-row\">\n <th\n className=\"gs-th gs-th-left gs-th-top\"\n style={{ position: 'sticky', width: sheet.headerWidth, height: sheet.headerHeight }}\n onClick={handleSelectAllClick}\n >\n <div className=\"gs-th-inner\">\n <ScrollHandle\n className={leftHeaderSelecting || topHeaderSelecting ? 'gs-hidden' : ''}\n style={{ position: 'absolute' }}\n horizontal={leftHeaderSelecting ? 0 : -1}\n vertical={topHeaderSelecting ? 0 : -1}\n />\n {contextMenu.length > 0 && (\n <button\n className=\"gs-menu-btn gs-corner-menu-btn\"\n title=\"Menu\"\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => {\n e.preventDefault();\n (e.currentTarget as HTMLElement).dataset.pressX = String(e.clientX);\n (e.currentTarget as HTMLElement).dataset.pressY = String(e.clientY);\n }}\n onMouseUp={(e) => {\n e.stopPropagation();\n const btn = e.currentTarget as HTMLElement;\n const pressX = Number(btn.dataset.pressX ?? e.clientX);\n const pressY = Number(btn.dataset.pressY ?? e.clientY);\n const moved = Math.abs(e.clientX - pressX) > 4 || Math.abs(e.clientY - pressY) > 4;\n if (moved) {\n return;\n }\n const rect = btn.getBoundingClientRect();\n dispatch(setContextMenuPosition({ y: rect.bottom, x: rect.left }));\n }}\n >\n ⋮\n </button>\n )}\n </div>\n </th>\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\"\n style={{ width: virtualized?.adjuster?.left ?? 1 }}\n ></th>\n {virtualized?.xs?.map?.((x) => <HeaderCellTop x={x} key={x} />)}\n <th\n className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\"\n style={{ width: virtualized?.adjuster?.right }}\n ></th>\n </tr>\n </thead>\n\n <tbody className=\"gs-sheet-body-adjuster\">\n <tr className=\"gs-row\">\n <th\n className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}\n style={{ height: virtualized?.adjuster?.top ?? 1 }}\n ></th>\n <td className=\"gs-adjuster gs-adjuster-vertical\"></td>\n {virtualized?.xs?.map((x) => <td className=\"gs-adjuster gs-adjuster-vertical\" key={x}></td>)}\n <th className={`gs-adjuster gs-adjuster-horizontal gs-adjuster-vertical`}></th>\n </tr>\n </tbody>\n\n <tbody className=\"gs-sheet-body-data\">\n {virtualized?.ys?.map((y) => {\n return (\n <tr key={y} className={`gs-row ${y % 2 === 0 ? 'gs-row-even' : 'gs-row-odd'}`}>\n <HeaderCellLeft y={y} />\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-left\" />\n {virtualized?.xs?.map((x) => <Cell key={x} y={y} x={x} />)}\n <td className=\"gs-adjuster gs-adjuster-horizontal gs-adjuster-horizontal-right\" />\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </>\n );\n};\n","// pnpm generate-style\nexport const LAST_MODIFIED = 1774701851;\nexport const CSS = `.gs-root1{display:inline-block;position:relative;border-spacing:0;width:fit-content;max-width:100%;overflow:auto;font-family:\"SF Pro Text\",\"SF Pro Icons\",\"Helvetica Neue\",Helvetica,Arial,Meiryo,sans-serif;visibility:hidden;opacity:0}.gs-root1.gs-initialized{visibility:visible;opacity:1;transition:opacity .2s ease-in-out}.gs-root1 .gs-main{flex:1;max-width:100%;overflow:hidden;position:relative;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.gs-root1 .gs-resizing{width:100%;height:100%;position:absolute;background-color:rgba(0,127,255,.08);top:0;left:0;z-index:2}.gs-root1 .gs-line-horizontal{width:100%}.gs-root1 .gs-line-vertical{height:100%}.gs-root1 .gs-line{position:relative;top:0;left:0;border:dotted 1px #07f;box-sizing:border-box}.gs-root1 .gs-line span{font-size:10px;padding:3px;background-color:#07f;color:#fff;margin:0;position:absolute;top:0;left:0}.gs-root1 .gs-scroll-handle{width:100%;height:100%;cursor:cell}.gs-hidden{visibility:hidden;position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;pointer-events:none;z-index:-1}.gs-fixed{position:fixed;top:0;left:0;z-index:1}.gs-root1[data-mode=light]{background-color:#e2e2e2;color:#000}.gs-root1[data-mode=light] .gs-main{background-color:#e2e2e2;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd}.gs-root1[data-mode=light] .gs-tabular{background-color:#e2e2e2}.gs-root1[data-mode=light] .gs-sheet-body-data{background-color:#f7f7f7}.gs-root1[data-mode=light] .gs-formula-bar{background-color:#efefef}.gs-root1[data-mode=light] .gs-formula-bar-editor-inner{color:#555}.gs-root1[data-mode=light] .gs-cell{border:solid 1px #ddd}.gs-root1[data-mode=light] .gs-adjuster{background-color:#ddd}.gs-root1[data-mode=light] .gs-tabular-inner{background-color:#ddd}.gs-root1[data-mode=light] .gs-th{background-color:#efefef;color:#666}.gs-root1[data-mode=light] .gs-th-top{border-left:solid 1px #ddd}.gs-root1[data-mode=light] .gs-th-top .gs-th-inner{border-top:solid 1px #ddd}.gs-root1[data-mode=light] .gs-th-left{border-top:solid 1px #ddd}.gs-root1[data-mode=light] .gs-th-left .gs-th-inner{border-left:solid 1px #ddd}.gs-root1[data-mode=light] .gs-search-bar{color:rgba(0,0,0,.3)}.gs-editor[data-mode=light].gs-editing textarea{caret-color:#000000}.gs-editor[data-mode=light].gs-editing .gs-editor-hl{background-color:#f7f7f7;color:#000}.gs-editor[data-mode=light] .gs-editor-options{color:#000;background-color:#f7f7f7;border:solid 1px #ddd}.gs-root1[data-mode=dark]{background-color:#5a5a5a;color:#eee}.gs-root1[data-mode=dark] .gs-main{background-color:#3f3f3f;border-right:solid 1px #5a5a5a;border-bottom:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-tabular{background-color:#3f3f3f}.gs-root1[data-mode=dark] .gs-sheet-body-data{background-color:#212121}.gs-root1[data-mode=dark] .gs-formula-bar{background-color:#4f4f4f}.gs-root1[data-mode=dark] .gs-formula-bar-editor-inner{color:#bbb}.gs-root1[data-mode=dark] .gs-cell{background-color:#212121;border:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-adjuster{background-color:#5a5a5a}.gs-root1[data-mode=dark] .gs-tabular-inner{background-color:#5a5a5a}.gs-root1[data-mode=dark] .gs-large-editor textarea{color:#eee;caret-color:#eeeeee}.gs-root1[data-mode=dark] .gs-th{background-color:#4f4f4f;color:#eee}.gs-root1[data-mode=dark] .gs-th-top{border-left:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-th-top .gs-th-inner{border-top:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-th-left{border-top:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-th-left .gs-th-inner{border-left:solid 1px #5a5a5a}.gs-root1[data-mode=dark] .gs-search-bar textarea{color:#eee;caret-color:#eeeeee}.gs-root1[data-mode=dark] .gs-search-bar{color:rgba(255,255,255,.3)}.gs-editor[data-mode=dark].gs-editing textarea{caret-color:#eeeeee}.gs-editor[data-mode=dark].gs-editing .gs-editor-hl{background-color:#212121;color:#eee}.gs-editor[data-mode=dark] .gs-editor-options{color:#eee;background-color:#5a5a5a;border:solid 1px #5a5a5a}.gs-cell{transition:border-color .2s ease;padding:0;margin:0;box-sizing:border-box;position:relative;font-size:13px;letter-spacing:1px;line-height:24px;cursor:cell;user-select:none;-webkit-user-select:none;-moz-user-select:none}.gs-cell.gs-copying textarea:focus{outline:solid 1px #0077ff}.gs-cell.gs-selecting{z-index:1}.gs-cell.gs-selecting .gs-cell-label{display:block}.gs-cell.gs-choosing{margin-top:-1px;margin-left:-1px;z-index:1}.gs-cell.gs-choosing.gs-editing{color:transparent}.gs-cell.gs-choosing .gs-cell-label{display:block}.gs-cell.gs-pending .gs-cell-rendered{position:relative;overflow:hidden}.gs-cell.gs-pending .gs-cell-rendered::after{content:'';position:absolute;bottom:0;left:0;height:4px;width:40%;border-radius:1px;background:rgba(100,140,255,.6);animation:gs-pending-slide 1.4s ease-in-out infinite}.gs-cell .gs-formula-error-triangle{position:absolute;top:0;right:0;border-top:4px solid rgba(200,0,0,.9);border-right:4px solid rgba(200,0,0,.9);border-bottom:4px solid transparent;border-left:4px solid transparent;z-index:2;cursor:help}.gs-cell .gs-cell-label{font-size:8px;font-weight:400;font-style:normal;font-family:math,monospace,serif;letter-spacing:1px;line-height:14px;position:absolute;top:0;right:0;background-color:rgba(0,128,255,.6);color:rgba(255,255,255,.6);padding:0 2px;display:none;opacity:.7}.gs-cell .gs-cell-inner-wrap{width:100%;height:100%;position:absolute;top:0;left:0}.gs-cell .gs-cell-inner{width:100%;height:100%;overflow:hidden;display:flex;box-sizing:border-box;border:none!important}.gs-cell .gs-cell-rendered{overflow:hidden;white-space:pre-wrap;cursor:cell;word-wrap:break-word;word-break:break-all;padding:0 2px;width:100%;height:100%}.gs-cell .gs-cell-rendered>*{position:relative}.gs-cell .gs-cell-rendered>.backface{z-index:0}.gs-cell .gs-autofill-drag{background-color:#07f;position:absolute;width:7px;height:7px;bottom:0;right:0;margin-right:-3.5px;margin-bottom:-3.5px;cursor:crosshair;z-index:1}.gs-th[data-x=\"1\"] .gs-th-inner-wrap{border-left:none}.gs-th[data-y=\"1\"] .gs-th-inner-wrap{border-top:none}.gs-formula-error-tooltip{position:fixed;background-color:rgba(35,8,8,.94);color:#fff;padding:6px 10px;border-radius:4px;border-left:3px solid rgba(220,50,50,.8);font-size:12px;line-height:1.5;max-width:260px;white-space:pre-wrap;word-break:break-word;box-shadow:0 3px 10px rgba(0,0,0,.4);z-index:100;pointer-events:none;letter-spacing:.3px}.gs-menu-modal{width:100%;height:100vh;z-index:12}.gs-label-input-label{font-size:13px;letter-spacing:1px}.gs-menu-divider{background-color:#aaa;padding:0;margin:5px 0;height:1px;list-style-type:none}.gs-menu-btn{position:absolute;background-color:rgba(128,128,128,.3);border:1px solid #ccc;border-radius:50%;cursor:pointer;font-size:12px;font-weight:700;line-height:1;color:#888;width:18px;height:18px;padding:0;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .15s ease;z-index:2}.gs-context-menu{z-index:12;position:fixed;background-color:#fff;padding:5px 0;border-radius:5px;box-shadow:rgba(60,64,67,.3) 0 1px 2px 0,rgba(60,64,67,.15) 0 1px 3px 1px;opacity:.9;transition:opacity .15s ease}.gs-context-menu:hover{opacity:1}.gs-context-menu .gs-menu-items{color:#555;margin:0;padding:0;min-width:250px}.gs-menu-item{padding:5px 10px;list-style-type:none;display:flex}.gs-menu-item.gs-enabled{cursor:pointer}.gs-menu-item.gs-enabled:hover{background-color:#eee}.gs-menu-item.gs-disabled{opacity:.5;cursor:not-allowed}.gs-menu-item .gs-menu-name{font-size:13px;letter-spacing:1px;flex:1}.gs-menu-shortcut{font-size:10px;line-height:20px;color:#999}.gs-menu-shortcut:before{content:\"( \"}.gs-menu-shortcut:after{content:\" )\"}.gs-menu-shortcut .gs-menu-underline{text-decoration:underline}.gs-column-menu{z-index:12;position:fixed;background-color:#fff;padding:5px 0;border-radius:5px;box-shadow:rgba(60,64,67,.3) 0 1px 2px 0,rgba(60,64,67,.15) 0 1px 3px 1px;opacity:.9;transition:opacity .15s ease}.gs-column-menu:hover{opacity:1}.gs-column-menu ul{color:#555;margin:0;padding:0;min-width:200px}.gs-column-menu .gs-column-menu-sort{align-items:center}.gs-column-menu .gs-column-menu-sort .gs-sort-buttons{display:flex;gap:4px;margin-left:auto}.gs-column-menu .gs-column-menu-sort .gs-sort-btn{font-size:12px;padding:4px 8px;border:1px solid transparent;border-radius:3px;background-color:rgba(180,180,180,.1);cursor:pointer;color:#555;font-weight:700;letter-spacing:.5px}.gs-column-menu .gs-column-menu-sort .gs-sort-btn:hover:not(:disabled){border-color:#555}.gs-column-menu .gs-column-menu-sort .gs-sort-btn:disabled{opacity:.5;cursor:not-allowed}.gs-column-menu .gs-column-menu-label{padding:5px 10px}.gs-column-menu .gs-label-input-row{display:flex;gap:4px;align-items:center}.gs-column-menu .gs-label-input{flex:1;font-size:13px;padding:4px 6px;border:none;border-bottom:1px solid #ccc;border-radius:0;outline:0;min-width:0;width:100px;background-color:transparent;box-shadow:none}.gs-column-menu .gs-label-input:focus{border-bottom-color:#07f;outline:0;box-shadow:none}.gs-column-menu .gs-label-apply-btn{font-size:12px;padding:4px 8px;border:1px solid transparent;border-radius:3px;background-color:rgba(180,180,180,.1);cursor:pointer;color:#555;font-weight:700;letter-spacing:.5px}.gs-column-menu .gs-label-apply-btn:hover:not(:disabled){border-color:#555}.gs-column-menu .gs-label-apply-btn:disabled{opacity:.5;cursor:not-allowed}.gs-column-menu .gs-column-menu-filter{padding:5px 10px;list-style-type:none;font-size:13px}.gs-column-menu .gs-filter-header{display:flex;align-items:center;gap:8px}.gs-column-menu .gs-filter-header .gs-filter-add-btn{font-size:12px;padding:3px 9px;border:1px solid transparent;border-radius:3px;background-color:rgba(180,180,180,.1);cursor:pointer;color:#555;letter-spacing:1px}.gs-column-menu .gs-filter-header .gs-filter-add-btn:hover{border-color:#555}.gs-column-menu .gs-filter-mode-toggle{display:flex;gap:6px;margin-left:auto}.gs-column-menu .gs-filter-mode-toggle label{display:flex;align-items:center;gap:3px;font-size:11px;font-weight:700;letter-spacing:.5px;color:#888;cursor:pointer;user-select:none}.gs-column-menu .gs-filter-mode-toggle label input[type=radio]{margin:0;cursor:pointer}.gs-column-menu .gs-filter-mode-toggle label.gs-active{color:#07f}.gs-column-menu .gs-filter-mode-toggle.gs-disabled{opacity:.4;pointer-events:none}.gs-column-menu .gs-filter-conditions{display:flex;flex-direction:column;gap:5px;margin-top:6px;max-height:200px;overflow-y:auto}.gs-column-menu .gs-filter-condition-row{display:flex;gap:4px;align-items:normal}.gs-column-menu .gs-filter-method-select{font-size:12px;padding:4px 4px;border:none;border-bottom:1px solid #ccc;border-radius:0;outline:0;background-color:#fff;box-shadow:none;min-width:40px;max-width:80px;cursor:pointer}.gs-column-menu .gs-filter-method-select:focus{border-bottom-color:#07f;outline:0;box-shadow:none}.gs-column-menu .gs-filter-value-input{flex:1;font-size:13px;padding:4px 6px;border:none;border-bottom:1px solid #ccc;border-radius:0;outline:0;min-width:0;width:80px;background-color:transparent;box-shadow:none}.gs-column-menu .gs-filter-value-input:focus{border-bottom-color:#07f;outline:0;box-shadow:none}.gs-column-menu .gs-filter-remove-btn{font-size:12px;padding:0;border:none;border-radius:3px;background-color:transparent;cursor:pointer;color:#999;line-height:1;flex-shrink:0}.gs-column-menu .gs-filter-remove-btn:hover{color:#c33}.gs-column-menu .gs-filter-actions{display:flex;gap:4px;margin-top:10px;align-items:center}.gs-column-menu .gs-filter-actions .gs-filter-reset-all-btn{font-size:12px;padding:3px 9px;border:1px solid transparent;border-radius:3px;background-color:transparent;cursor:pointer;color:#c33;font-weight:700;letter-spacing:1px}.gs-column-menu .gs-filter-actions .gs-filter-reset-all-btn:hover{border-color:#c33}.gs-column-menu .gs-filter-actions .gs-filter-actions-right{display:flex;gap:4px;margin-left:auto}.gs-column-menu .gs-filter-actions .gs-filter-reset-btn{font-size:12px;padding:3px 9px;border:1px solid transparent;border-radius:3px;background-color:transparent;cursor:pointer;color:#e08000;font-weight:700;letter-spacing:1px}.gs-column-menu .gs-filter-actions .gs-filter-reset-btn:hover{border-color:#e08000}.gs-column-menu .gs-filter-actions .gs-filter-apply-btn{font-size:12px;padding:3px 6px;border:1px solid transparent;border-radius:3px;background-color:transparent;color:#07f;cursor:pointer;font-weight:700;letter-spacing:1px}.gs-column-menu .gs-filter-actions .gs-filter-apply-btn:hover{border-color:#07f}.gs-column-menu-waiting{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px 30px;gap:12px;min-width:180px}.gs-column-menu-waiting .gs-waiting-message{font-size:13px;font-weight:700;color:#555;letter-spacing:.5px}.gs-column-menu-waiting .gs-waiting-spinner{width:24px;height:24px;border:3px solid #e0e0e0;border-top-color:#07f;border-radius:50%;animation:spin .8s linear infinite}.gs-column-menu-waiting .gs-waiting-cancel-btn{font-size:12px;padding:4px 18px;border:1px solid #c33;border-radius:3px;background-color:transparent;color:#c33;cursor:pointer;font-weight:700;letter-spacing:1px}.gs-column-menu-waiting .gs-waiting-cancel-btn:hover{background-color:#c33;color:#fff}.gs-column-menu-btn{right:4px;top:50%;transform:translateY(-50%)}.gs-column-menu-btn.gs-filtered{opacity:1;background-color:#e0edff;border-color:#07f;color:#07f}.gs-column-menu-btn.gs-active{opacity:1;background-color:#d0e0ff;border-color:#07f;color:#07f}.gs-th-top:hover .gs-column-menu-btn{opacity:1}.gs-row-menu{z-index:12;position:fixed;background-color:#fff;padding:5px 0;border-radius:5px;box-shadow:rgba(60,64,67,.3) 0 1px 2px 0,rgba(60,64,67,.15) 0 1px 3px 1px;opacity:.9;transition:opacity .15s ease}.gs-row-menu:hover{opacity:1}.gs-row-menu ul{color:#555;margin:0;padding:0;min-width:200px}.gs-row-menu .gs-row-fixed-toggle{display:flex;align-items:center;gap:6px}.gs-row-menu .gs-row-fixed-check{font-size:12px;width:14px;text-align:center;color:rgba(0,119,255,.1)}.gs-row-menu .gs-row-fixed-check.gs-row-fixed-active{color:#07f}.gs-row-menu-btn{top:50%;transform:translateY(-50%);right:2px}.gs-row-menu-btn.gs-active{opacity:1;background-color:#d0e0ff;border-color:#07f;color:#07f}.gs-th-left:hover .gs-row-menu-btn{opacity:1}.gs-corner-menu-btn{bottom:2px;right:2px}.gs-corner-menu-btn:hover{opacity:1;background-color:#d0e0ff;border-color:#07f;color:#07f}.gs-th-left.gs-th-top:hover .gs-corner-menu-btn{opacity:1}.gs-editor-hl{padding:0 2px!important;position:absolute;font-family:monospace,Arial;font-size:12px;line-height:24px;letter-spacing:1px}.gs-formula-bar-editor-inner{position:relative;display:table-cell}.gs-editor{opacity:0;z-index:-1}.gs-editor .gs-editor-inner{position:relative}.gs-editor .gs-editor-hl{box-sizing:content-box;border:solid 2px #07f;margin:-2px -1px}.gs-editor textarea{width:100%;padding:0 2px!important;position:absolute;font-size:12px;font-family:monospace,Arial;line-height:24px;letter-spacing:1px;top:0;left:0;border:none;outline:0;background-color:transparent;color:transparent;resize:none;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;overflow:hidden;cursor:default;white-space:pre;height:auto}.gs-editor.gs-editing{z-index:11;opacity:1}.gs-editor.gs-editing .gs-cell-label{pointer-events:none;font-family:math,monospace,serif;position:absolute;top:0;right:0;margin-top:-15px;margin-right:-2px;padding:0 2px;font-size:10px;background-color:rgba(0,119,255,.75);color:#fff;z-index:1}.gs-formula-bar{width:100%;position:relative;display:table;align-items:center;justify-content:center;border-top:solid 1px rgba(128,128,128,.3);border-left:solid 1px rgba(128,128,128,.3);border-right:solid 1px rgba(128,128,128,.3);box-sizing:border-box}.gs-formula-bar .gs-selecting-address{display:table-cell;vertical-align:middle;width:60px;color:rgba(200,200,200);font-size:13px;text-align:center}.gs-formula-bar[data-spill=true]{background-color:rgba(0,119,255,.04)}.gs-formula-bar[data-spill=true] .gs-selecting-address{color:rgba(80,160,255,.9);font-style:italic}.gs-formula-bar[data-spill=true] .gs-selecting-address::after{content:\"\\\\2196\";margin-left:2px;font-style:normal;font-size:9px}.gs-formula-bar .gs-fx{display:table-cell;vertical-align:middle;width:30px;color:rgba(200,200,200);font-style:italic;font-family:cursive;text-align:center;border-left:solid 1px rgba(128,128,128,.5);font-size:15px}.gs-formula-bar .gs-editor-hl{z-index:0;overflow-y:auto;box-sizing:border-box;white-space:pre-wrap;word-break:break-all}.gs-formula-bar textarea{position:relative;z-index:1;width:100%;vertical-align:bottom;color:transparent;border:none;background-color:transparent;padding:0 2px;box-sizing:border-box;outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:12px;font-family:monospace,Arial;height:24px;line-height:24px;min-height:24px;letter-spacing:1px;resize:vertical;caret-color:rgba(128,128,128);white-space:pre-wrap;word-break:break-all}.gs-token-type-INVALID_REF{color:red}.gs-token-type-VALUE.gs-token-entity-type-boolean,.gs-token-type-VALUE.gs-token-entity-type-number{color:#39f}.gs-token-type-VALUE.gs-token-entity-type-string{color:#090}.gs-editor-options{position:fixed;z-index:1000;padding:4px;background:var(--gs-bg,#fff);box-shadow:0 4px 12px rgba(0,0,0,.15);border:1px solid rgba(0,0,0,.1);border-radius:6px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;overflow:visible}.gs-editor-option{position:relative;cursor:pointer;list-style:none;padding:6px 12px;font-size:13px;border-radius:4px;color:#333;margin-bottom:2px}.gs-editor-option-content{display:flex;justify-content:space-between;width:100%;align-items:center}.gs-editor-option-tab{font-size:10px;color:#aaa;margin-left:8px;padding:2px 4px;border:1px solid #ddd;border-radius:3px;background:#f9f9f9}.gs-editor-option:last-child{margin-bottom:0}.gs-editor-option:hover{background-color:#f5f5f5}.gs-editor-option-selected{background-color:#ebf5ff;color:#06c;font-weight:500}.gs-editor-option-selected:hover{background-color:#e0f0ff}.gs-fn-guide1{position:absolute;top:-4px;left:calc(100% + 8px);background:#fff;border:1px solid rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.12);border-radius:6px;padding:16px;width:280px;z-index:1000;cursor:default;white-space:normal;color:#333}.gs-fn-guide1-tooltip{margin-bottom:8px;line-height:1.4;font-size:13px}.gs-fn-guide1-example{font-family:monospace;font-weight:600;font-size:13px;margin-bottom:8px;color:#1a1a1a;background:#f5f5f5;padding:6px 8px;border-radius:4px;border:1px solid #eee;display:flex;align-items:center;gap:6px;flex-wrap:wrap}.gs-fn-guide1-desc{font-size:13px;color:#555;margin-bottom:12px;line-height:1.4}.gs-fn-guide1-desc p{margin:0 0 6px 0}.gs-fn-guide1-desc p:last-child{margin-bottom:0}.gs-fn-guide1-args{border-top:1px solid #eee;padding-top:10px}.gs-fn-guide1-arg{margin-bottom:6px;line-height:1.4;font-size:12px}.gs-fn-guide1-arg-name{font-weight:600;color:#06c}.gs-fn-guide1-arg-opt{color:#888;font-size:11px}.gs-fn-guide1-arg-iter{font-weight:600;color:#06c}.gs-fn-guide1-arg-type{color:#06c;padding:0 4px;background:#ebf5ff;border-radius:3px;font-size:11px;margin:0 4px}.gs-fn-guide1-arg-desc{color:#666}.gs-fn-guide-category{position:absolute;top:-11px;right:8px;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;padding:2px 7px;border-radius:4px;background:#e8eaf6;color:#3949ab;border:1px solid #c5cae9;white-space:nowrap}.gs-fn-guide-category.gs-fn-guide-category-math{background:#e3f2fd;color:#1565c0;border-color:#bbdefb}.gs-fn-guide-category.gs-fn-guide-category-statistics{background:#e8f5e9;color:#2e7d32;border-color:#c8e6c9}.gs-fn-guide-category.gs-fn-guide-category-text{background:#fff8e1;color:#f57f17;border-color:#ffecb3}.gs-fn-guide-category.gs-fn-guide-category-time{background:#fce4ec;color:#880e4f;border-color:#f8bbd0}.gs-fn-guide-category.gs-fn-guide-category-lookup{background:#f3e5f5;color:#6a1b9a;border-color:#e1bee7}.gs-fn-guide-category.gs-fn-guide-category-logical{background:#e0f2f1;color:#00695c;border-color:#b2dfdb}.gs-fn-guide-category.gs-fn-guide-category-information{background:#e0f7fa;color:#006064;border-color:#b2ebf2}.gs-fn-guide-category.gs-fn-guide-category-finance{background:#fff3e0;color:#e65100;border-color:#ffe0b2}.gs-fn-guide-category.gs-fn-guide-category-engineering{background:#efebe9;color:#4e342e;border-color:#d7ccc8}.gs-fn-guide-category.gs-fn-guide-category-other{background:#f5f5f5;color:#616161;border-color:#e0e0e0}.gs-editor[data-mode=dark] .gs-editor-options{background:#252526;border-color:#454545;box-shadow:0 4px 12px rgba(0,0,0,.5)}.gs-editor[data-mode=dark] .gs-editor-option{color:#ccc}.gs-editor[data-mode=dark] .gs-editor-option:hover{background-color:#333}.gs-editor[data-mode=dark] .gs-editor-option-selected{background-color:#094771;color:#fff}.gs-editor[data-mode=dark] .gs-editor-option-selected:hover{background-color:#0d5a8f}.gs-editor[data-mode=dark] .gs-editor-option-tab{color:#777;background:#333;border-color:#444}.gs-editor[data-mode=dark] .gs-fn-guide1{background:#252526;border-color:#454545;color:#ccc}.gs-editor[data-mode=dark] .gs-fn-guide1-example{background:#1e1e1e;border-color:#333;color:#d4d4d4}.gs-editor[data-mode=dark] .gs-fn-guide1-desc{color:#aaa}.gs-editor[data-mode=dark] .gs-fn-guide1-args{border-color:#333}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-iter,.gs-editor[data-mode=dark] .gs-fn-guide1-arg-name{color:#4fc1ff}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-opt{color:#777}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-type{background:#094771;color:#4fc1ff}.gs-editor[data-mode=dark] .gs-fn-guide1-arg-desc{color:#999}.gs-editor[data-mode=dark] .gs-fn-guide-category{background:#2a2d3e;color:#7986cb;border-color:#3d4166}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-math{background:#0d2137;color:#64b5f6;border-color:#1a3a5c}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-statistics{background:#0d2218;color:#66bb6a;border-color:#1a3d2a}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-text{background:#2e2200;color:#ffd54f;border-color:#4d3900}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-time{background:#2d0d1e;color:#f48fb1;border-color:#4d1a33}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-lookup{background:#260d33;color:#ce93d8;border-color:#3d1a54}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-logical{background:#0d2421;color:#4db6ac;border-color:#1a3d39}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-information{background:#0d2426;color:#4dd0e1;border-color:#1a3d40}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-finance{background:#2e1500;color:#ffb74d;border-color:#4d2800}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-engineering{background:#1e1714;color:#bcaaa4;border-color:#332c28}.gs-editor[data-mode=dark] .gs-fn-guide-category.gs-fn-guide-category-other{background:#1e1e1e;color:#9e9e9e;border-color:#333}.gs-editor[data-mode=dark] .gs-fn-guide2{background:#252526;border-color:#454545;box-shadow:0 4px 12px rgba(0,0,0,.5);color:#ccc}.gs-editor[data-mode=dark] .gs-fn-guide2-name{color:#dfdbdb;background:#333;border-color:#444}.gs-editor[data-mode=dark] .gs-fn-guide2 .gs-active-arg{color:#fff;background-color:#094771}.gs-editor[data-mode=dark] .gs-fn-guide2-arg-type{background:#094771;color:#4fc1ff}.gs-editor[data-mode=dark] .gs-fn-guide2-desc{color:#aaa;border-top-color:#333}.gs-fn-guide2{position:fixed;left:0;background:#fff;border:1px solid rgba(0,0,0,.1);box-shadow:0 4px 16px rgba(0,0,0,.12);border-radius:6px;padding:12px 16px;width:280px;z-index:1000;cursor:default;white-space:normal;color:#333;font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;transition:opacity .1s ease-in-out}.gs-fn-guide2.gs-fn-guide2-hidden{opacity:0!important;pointer-events:none!important}.gs-fn-guide2-name{font-family:monospace;font-weight:700;font-size:13px;color:#1a1a1a;background:#f5f5f5;padding:6px 8px;border-radius:4px;border:1px solid #eee;display:flex;align-items:center;gap:6px;flex-wrap:wrap;width:100%;box-sizing:border-box;margin-bottom:8px}.gs-fn-guide2-args-inline{font-size:13px;font-family:monospace;line-height:1.5;margin-bottom:8px;color:#666}.gs-fn-guide2-args-inline span{transition:all .2s ease-in-out}.gs-fn-guide2 .gs-active-arg{font-weight:700;color:#06c;background-color:#ebf5ff;padding:2px 4px;margin:0 -4px;border-radius:4px}.gs-fn-guide2-arg-type{color:#06c;padding:0 4px;background:#ebf5ff;border-radius:3px;font-size:11px;margin:0 4px}.gs-fn-guide2-desc{font-size:12px;color:#555;line-height:1.4;border-top:1px solid #eee;padding-top:8px;margin-top:4px}.gs-fn-guide2-desc p{margin:0}.gs-fn-guide2-desc-more{font-style:italic;color:#888;margin-top:4px!important;font-size:11px}.gs-adjuster{padding:0}.gs-table{margin:0}.gs-tabular{overflow:auto;display:block;box-sizing:border-box;position:relative}.gs-tabular-inner>table{table-layout:fixed;border-collapse:collapse;border-spacing:0}.gs-th{z-index:2;padding:0;position:sticky;font-size:13px;font-weight:400;box-sizing:border-box;vertical-align:top}.gs-th .gs-resizer{position:absolute;border-color:transparent;box-sizing:border-box;z-index:2}.gs-th .gs-resizer:hover{background-color:#07f}.gs-th .gs-resizer.gs-protected{display:none}.gs-th-inner{height:100%;box-sizing:border-box;vertical-align:middle;overflow:hidden;display:flex;align-items:center;justify-content:center}.gs-th-inner-wrap{height:100%;box-sizing:border-box;background-color:transparent}.gs-th-top{top:0;overflow:hidden}.gs-th-top .gs-resizer{top:0;right:0;width:3px;cursor:e-resize}.gs-th-top .gs-resizer.gs-dragging{border-right-style:dotted;height:1000000px!important;cursor:e-resize}.gs-th-left{left:0;overflow:hidden;min-width:30px;border-top:solid 1px #ddd}.gs-th-left .gs-resizer{left:0;bottom:0;height:3px;cursor:n-resize}.gs-th-left .gs-resizer.gs-dragging{border-bottom-style:dotted;width:1000000px!important;cursor:n-resize}.gs-th-top.gs-th-left{top:0;left:0;z-index:3;border:none!important}.gs-th-left.gs-filter-fixed .gs-th-inner::before{content:'‹\\\\00a0'}.gs-th-left.gs-sort-fixed .gs-th-inner::after{content:'\\\\00a0›'}.gs-col-addr{position:absolute;top:2px;right:4px;font-size:9px;opacity:.5;line-height:1;letter-spacing:.3px;pointer-events:none}.gs-search-bar{width:100%;display:flex;align-items:center;border-top:solid 1px rgba(128,128,128,.3);border-left:solid 1px rgba(128,128,128,.3);border-right:solid 1px rgba(128,128,128,.3);box-sizing:border-box;background-color:rgba(200,50,0,.2)}.gs-search-bar.gs-search-found{background-color:rgba(0,200,100,.2)}.gs-search-bar .gs-search-bar-inner{border-left:solid 1px rgba(128,128,128,.5)}.gs-search-bar .gs-search-bar-icon{border-left:solid 1px rgba(128,128,128,.3);display:flex;align-items:center;justify-content:center;width:30px;flex-shrink:0}.gs-search-bar .gs-search-input-wrapper{flex-grow:1;position:relative;display:flex;align-items:center;height:100%}.gs-search-bar .gs-search-input-ghost{position:absolute;left:2px;right:2px;top:0;bottom:0;pointer-events:none;font-size:12px;font-family:monospace,Arial;line-height:24px;letter-spacing:1px;white-space:pre-wrap;word-break:break-all;color:transparent;overflow:hidden}.gs-search-bar .gs-search-input-ghost .gs-search-ghost-hint{color:#aaa}.gs-search-bar textarea{background-color:transparent;border:none;padding:0 2px;box-sizing:border-box;outline:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;font-size:12px;font-family:monospace,Arial;height:24px;line-height:24px;min-height:24px;letter-spacing:1px;caret-color:rgba(128,128,128);white-space:pre-wrap;word-break:break-all;flex-grow:1;width:100%;resize:none}.gs-search-progress{color:#999;font-size:13px;width:60px;flex-shrink:0;white-space:nowrap;text-align:center}.gs-search-close{cursor:pointer;display:flex;align-items:center;justify-content:center;width:24px;flex-shrink:0}.gs-search-buttons{display:flex;align-items:center;white-space:nowrap;flex-shrink:0}.gs-search-button{display:inline-flex;cursor:pointer;margin:0 2px}.gs-search-button span{display:inline-block;font-size:11px;padding:3px 5px;background-color:rgba(128,128,128,.1);border:1px solid rgba(128,128,128,.3);border-radius:3px;transition:all .15s ease;line-height:1}.gs-search-button span:hover{background-color:rgba(128,128,128,.2)}.gs-search-button span.gs-search-button-on{color:#07f;background-color:rgba(200,200,255,.5);border-color:#07f}.gs-search-range span{white-space:nowrap;font-family:monospace}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes gs-pending-slide{0%{left:-40%}100%{left:100%}}@keyframes gs-pending-pulse{0%{left:0;width:0}50%{left:0;width:100%}100%{left:100%;width:0}}@keyframes gs-flash{0%{opacity:0}20%{opacity:1}100%{opacity:0}}.gs-flash-overlay{position:absolute;inset:0;pointer-events:none;z-index:9999;background:rgba(0,119,255,.15);opacity:0}.gs-flash-overlay--active{animation:gs-flash .6s ease-out forwards}`;\n","import { CSS, LAST_MODIFIED } from './minified';\n\nexport const embedStyle = () => {\n if (typeof window === 'undefined') {\n return;\n }\n const exists = document.querySelector(`style.gs-styling[data-modified-at='${LAST_MODIFIED}']`);\n if (exists) {\n return;\n }\n const style = document.createElement('style');\n document.head.appendChild(style);\n style.setAttribute('class', 'gs-styling');\n style.setAttribute('data-modified-at', `${LAST_MODIFIED}`);\n style.innerText = CSS;\n};\n","import type { KeyboardEvent } from 'react';\nimport React, { useCallback, useEffect, useRef, useState, useContext } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { Context } from '../store';\nimport { p2a, a2p } from '../lib/coords';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport * as prevention from '../lib/operation';\nimport { handleFormulaQuoteAutoClose, insertTextAtCursor, isFocus } from '../lib/input';\nimport { focus } from '../lib/dom';\nimport { editorStyle } from './Editor';\nimport { ScrollHandle } from './ScrollHandle';\nimport { useAutocomplete } from './useAutocomplete';\n\ntype FormulaBarProps = {\n ready: boolean;\n};\n\nexport const FormulaBar = ({ ready }: FormulaBarProps) => {\n const { store, dispatch } = useContext(Context);\n const [before, setBefore] = useState('');\n const [selectionStart, setSelectionStart] = useState(0);\n const [isFocused, setIsFocused] = useState(false);\n const {\n choosing,\n selectingZone,\n editorRef,\n largeEditorRef,\n sheetReactive: sheetRef,\n inputting,\n editingAddress: editingCell,\n dragging,\n } = store;\n const sheet = sheetRef.current;\n const hlRef = useRef<HTMLDivElement | null>(null);\n\n const address = choosing.x === -1 ? '' : p2a(choosing);\n const cell = sheet?.getCell(choosing, { resolution: 'SYSTEM' });\n const spilledFromAddress = sheet?.getSystem(choosing)?.spilledFrom;\n const originPoint = spilledFromAddress ? a2p(spilledFromAddress) : undefined;\n const originAddress = originPoint != null ? p2a(originPoint) : undefined;\n useEffect(() => {\n if (!sheet) {\n return;\n }\n let value = sheet.getCell(choosing, { resolution: 'SYSTEM' })?.value ?? '';\n // debug to remove this line\n value = sheet.getSerializedValue({ point: choosing, cell: { ...cell, value }, resolution: 'RAW' });\n largeEditorRef.current!.value = value;\n setBefore(value as string);\n }, [address, sheet]);\n\n const writeCell = useCallback(\n (value: string) => {\n if (before !== value) {\n dispatch(write({ value }));\n }\n dispatch(setEditingAddress(''));\n focus(editorRef.current);\n },\n [before],\n );\n\n useEffect(() => {\n const observer = new ResizeObserver((entries) => {\n entries.forEach(updateScroll);\n });\n if (largeEditorRef.current) {\n observer.observe(largeEditorRef.current);\n }\n return () => {\n observer.disconnect();\n };\n }, []);\n\n const policy = sheet?.getPolicy(choosing);\n const optionsAll = policy?.getSelectOptions() || [];\n\n const {\n filteredOptions,\n selected,\n setSelected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n isFormula,\n activeFunctionHelp,\n activeArgIndex,\n } = useAutocomplete({\n inputting,\n selectionStart,\n optionsAll,\n functions: sheet?.registry.functions,\n });\n\n const largeInput = largeEditorRef.current;\n\n const handleInput = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n dispatch(setInputting(e.currentTarget.value));\n }, []);\n\n const handleSelect = useCallback((e: React.SyntheticEvent<HTMLTextAreaElement>) => {\n setSelectionStart(e.currentTarget.selectionStart);\n }, []);\n\n const updateScroll = useCallback(() => {\n if (!hlRef.current || !largeEditorRef.current) {\n return;\n }\n hlRef.current.style.height = `${largeEditorRef.current.clientHeight}px`;\n hlRef.current.scrollLeft = largeEditorRef.current.scrollLeft;\n hlRef.current.scrollTop = largeEditorRef.current.scrollTop;\n }, []);\n\n const handleFocus = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n if (!largeInput || !sheet) {\n return;\n }\n setIsFocused(true);\n dispatch(setEditingAddress(address));\n sheet.registry.lastFocused = e.currentTarget;\n },\n [largeInput, address, sheet],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLTextAreaElement>) => {\n setIsFocused(false);\n if (e.currentTarget.value!.startsWith('=')) {\n return true;\n } else {\n if (editingCell) {\n writeCell(e.currentTarget.value);\n }\n }\n },\n [editingCell, writeCell],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.ctrlKey || !sheet) {\n return true;\n }\n const input = e.currentTarget;\n\n // Auto-close double quotes in formula mode\n if (handleFormulaQuoteAutoClose(e, inputting)) {\n dispatch(setInputting(input.value));\n return false;\n }\n\n switch (e.key) {\n case 'Tab': // TAB\n e.preventDefault();\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n const isFunc = option?.isFunction;\n\n if (isFunc) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n return false;\n } else {\n // ... regular completion ...\n const t = sheet.update({ diff: { [address]: { value: option.value } }, partial: true });\n dispatch(updateSheet(t.clone()));\n dispatch(setEditingAddress(''));\n dispatch(setInputting(''));\n }\n }\n break;\n case 'ArrowUp':\n if (handleArrowUp(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'ArrowDown':\n if (handleArrowDown(e as unknown as React.KeyboardEvent<HTMLTextAreaElement>)) {\n return true;\n }\n break;\n case 'Enter': {\n if (filteredOptions.length) {\n const option = filteredOptions[selected];\n if (option?.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n e.preventDefault();\n return false;\n }\n }\n\n if (e.altKey) {\n insertTextAtCursor(input, '\\n');\n } else {\n writeCell(input.value);\n dispatch(setInputting(''));\n dispatch(\n walk({\n numRows: sheet.numRows,\n numCols: sheet.numCols,\n deltaY: 1,\n deltaX: 0,\n }),\n );\n e.preventDefault();\n return false;\n }\n break;\n }\n case 'Escape': {\n input.value = before;\n dispatch(setInputting(before));\n dispatch(setEditingAddress(''));\n e.preventDefault();\n focus(editorRef.current);\n\n break;\n }\n case 'a': // A\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n case 'c': // C\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n case 'v': // V\n if (e.ctrlKey || e.metaKey) {\n return true;\n }\n break;\n }\n\n const cell = sheet.getCell(choosing, { resolution: 'SYSTEM' });\n if (prevention.hasOperation(cell?.prevention, prevention.Write)) {\n console.warn('This cell is protected from writing.');\n e.preventDefault();\n }\n updateScroll();\n return false;\n },\n [\n sheet,\n choosing,\n address,\n before,\n writeCell,\n updateScroll,\n filteredOptions,\n selected,\n replaceWithOption,\n handleArrowUp,\n handleArrowDown,\n inputting,\n ],\n );\n\n const handleOptionMouseDown = useCallback(\n (e: React.MouseEvent, i: number) => {\n e.preventDefault();\n e.stopPropagation();\n const option = filteredOptions[i];\n if (option.isFunction) {\n const { value: newValue, selectionStart: newCursor } = replaceWithOption(option);\n writeCell(newValue);\n dispatch(setInputting(newValue));\n setTimeout(() => {\n if (largeEditorRef.current) {\n focus(largeEditorRef.current);\n largeEditorRef.current.setSelectionRange(newCursor, newCursor);\n }\n }, 0);\n }\n },\n [filteredOptions, replaceWithOption, writeCell, dispatch],\n );\n\n const style: React.CSSProperties = ready ? {} : { visibility: 'hidden' };\n if (!sheet) {\n return (\n <label className=\"gs-formula-bar gs-hidden\" style={style}>\n <div className=\"gs-selecting-address\"></div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <textarea />\n </div>\n </label>\n );\n }\n const renderOverlays = () => {\n if (!isFocused || typeof document === 'undefined') {\n return null;\n }\n if (largeEditorRef.current !== document.activeElement) {\n return null;\n }\n\n const rect = largeEditorRef.current?.getBoundingClientRect();\n if (!rect) {\n return null;\n }\n\n const top = rect.bottom;\n const left = rect.left;\n\n return createPortal(\n <>\n {activeFunctionHelp &&\n filteredOptions.length === 0 &&\n (!selectingZone || (selectingZone.endY === -1 && selectingZone.endX === -1)) && (\n <FunctionGuide\n activeFunctionGuide={activeFunctionHelp}\n activeArgIndex={activeArgIndex}\n top={top}\n left={left}\n />\n )}\n {filteredOptions.length > 0 && choosing.x !== -1 && (\n <EditorOptions\n filteredOptions={filteredOptions}\n top={top}\n left={left}\n selected={selected}\n onOptionMouseDown={handleOptionMouseDown}\n />\n )}\n </>,\n document.body,\n );\n };\n\n return (\n <div\n className=\"gs-formula-bar\"\n data-sheet-id={store.sheetId}\n data-spill={originAddress != null ? 'true' : undefined}\n style={style}\n >\n <ScrollHandle style={{ position: 'absolute', left: 0, top: 0, zIndex: 2 }} vertical={-1} />\n <div className=\"gs-selecting-address\">{originAddress != null ? originAddress : address}</div>\n <div className=\"gs-fx\">Fx</div>\n <div className=\"gs-formula-bar-editor-inner\">\n <div\n className=\"gs-editor-hl\"\n ref={hlRef}\n style={{\n height: largeEditorRef.current?.clientHeight,\n width: '100%',\n }}\n >\n {(cell?.formulaEnabled ?? true) ? editorStyle(inputting) : inputting}\n </div>\n <textarea\n name=\"gs-formula-bar-editor\"\n data-sheet-id={store.sheetId}\n data-size=\"large\"\n rows={1}\n spellCheck={false}\n ref={largeEditorRef}\n value={inputting}\n // Spilled cells must not be edited from the FormulaBar — input here\n // would modify `inputting` one character at a time (via onInput) even\n // though the underlying cell cannot be written to.\n readOnly={originAddress != null}\n onInput={handleInput}\n onFocus={handleFocus}\n onSelect={handleSelect}\n onPaste={(e) => {\n e.stopPropagation();\n }}\n onKeyDown={handleKeyDown}\n onKeyUp={updateScroll}\n onScroll={updateScroll}\n onMouseEnter={(e) => {\n dispatch(setEditorHovering(true));\n }}\n onMouseLeave={(e) => {\n dispatch(setEditorHovering(false));\n }}\n ></textarea>\n {renderOverlays()}\n </div>\n </div>\n );\n};\n","import type { ReactNode, CSSProperties } from 'react';\n\nexport interface IconProps {\n style?: CSSProperties;\n color?: string;\n size?: number;\n}\n\ninterface BaseProps extends IconProps {\n children?: ReactNode;\n}\n\n// https://tabler.io/icons\n\nexport const Base = ({ style, size = 24, children }: BaseProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox={`0 0 24 24`}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n className=\"icon-tabler\"\n >\n {children}\n </svg>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const SearchIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0\" fill={color} />\n <path d=\"M21 21l-6 -6\" fill={color} />\n </Base>\n );\n};\n","import { type IconProps, Base } from './Base';\n\n// https://tabler.io/icons\n\nexport const CloseIcon = ({ style, color = 'none', size = 24 }: IconProps) => {\n return (\n <Base style={style} size={size}>\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill={color} />\n <path d=\"M18 6l-12 12\" fill={color} />\n <path d=\"M6 6l12 12\" fill={color} />\n </Base>\n );\n};\n","import { useContext, useEffect, useRef, useCallback, useMemo } from 'react';\n\nimport { a2p, x2c, y2r } from '../lib/coords';\nimport { isZoneNotSelected } from '../lib/spatial';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '../lib/virtualization';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '../lib/dom';\n\nexport const SearchBar = () => {\n const { store, dispatch } = useContext(Context);\n const {\n rootRef,\n editorRef,\n searchInputRef,\n tabularRef,\n searchQuery,\n searchCaseSensitive,\n searchRegex,\n searchRange,\n selectingZone,\n matchingCellIndex,\n matchingCells,\n sheetReactive: sheetRef,\n } = store;\n const sheet = sheetRef.current;\n\n const matchingCell = matchingCells[matchingCellIndex];\n useEffect(() => {\n if (!matchingCell || !sheet) {\n return;\n }\n const point = a2p(matchingCell);\n if (typeof point === 'undefined') {\n return;\n }\n smartScroll(sheet, tabularRef.current, point);\n }, [searchQuery, matchingCellIndex, searchCaseSensitive, searchRegex, sheet, tabularRef]);\n\n const handleProgressClick = useCallback((e: React.MouseEvent) => {\n const input = e.currentTarget.previousSibling as HTMLInputElement;\n input?.nodeName === 'INPUT' && focus(input);\n }, []);\n\n const handleSearchClick = useCallback(() => {\n dispatch(search(1));\n }, []);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n dispatch(setSearchQuery(e.currentTarget.value));\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Escape') {\n const el = editorRef?.current;\n if (el) {\n focus(el);\n }\n dispatch(setSearchQuery(undefined));\n }\n if (e.key === 'f' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n return false;\n }\n if (e.key === 'Enter') {\n dispatch(search(e.shiftKey ? -1 : 1));\n e.preventDefault();\n return false;\n }\n return true;\n },\n [editorRef],\n );\n\n const handleCaseSensitiveClick = useCallback(() => {\n dispatch(setSearchCaseSensitive(!searchCaseSensitive));\n }, [searchCaseSensitive]);\n\n const handleRegexClick = useCallback(() => {\n dispatch(setSearchRegex(!searchRegex));\n }, [searchRegex]);\n\n const hasSelection = useMemo(() => {\n if (!selectingZone) {\n return false;\n }\n if (isZoneNotSelected(selectingZone)) {\n return false;\n }\n const { startY, startX, endY, endX } = selectingZone;\n return !(startY === endY && startX === endX);\n }, [selectingZone]);\n\n const selectionLabel = useMemo(() => {\n if (!selectingZone || !hasSelection) {\n return '';\n }\n const { startY, startX, endY, endX } = selectingZone;\n const topLeft = `${x2c(Math.min(startX, endX))}${y2r(Math.min(startY, endY))}`;\n const bottomRight = `${x2c(Math.max(startX, endX))}${y2r(Math.max(startY, endY))}`;\n return `${topLeft}:${bottomRight}`;\n }, [selectingZone, hasSelection]);\n\n const handleRangeClick = useCallback(() => {\n if (searchRange) {\n // Clear search range\n dispatch(setSearchRange(undefined));\n } else if (selectingZone && hasSelection) {\n // Set search range to current selection\n const { startY, startX, endY, endX } = selectingZone;\n dispatch(\n setSearchRange({\n startY: Math.min(startY, endY),\n startX: Math.min(startX, endX),\n endY: Math.max(startY, endY),\n endX: Math.max(startX, endX),\n }),\n );\n }\n }, [searchRange, selectingZone, hasSelection]);\n\n const searchRangeLabel = useMemo(() => {\n if (!searchRange) {\n return '';\n }\n const { startY, startX, endY, endX } = searchRange;\n const topLeft = `${x2c(startX)}${y2r(startY)}`;\n const bottomRight = `${x2c(endX)}${y2r(endY)}`;\n return `${topLeft}:${bottomRight}`;\n }, [searchRange]);\n\n const handleCloseClick = useCallback(() => {\n dispatch(setSearchQuery(undefined));\n focus(editorRef.current);\n }, [editorRef]);\n\n if (typeof searchQuery === 'undefined') {\n return null;\n }\n if (rootRef.current === null) {\n return null;\n }\n return (\n <label className={`gs-search-bar ${matchingCells.length > 0 ? 'gs-search-found' : ''}`}>\n <div className=\"gs-search-progress\" onClick={handleProgressClick}>\n {matchingCells.length === 0 ? 0 : matchingCellIndex + 1} / {matchingCells.length}\n </div>\n <div className=\"gs-search-bar-icon\" onClick={handleSearchClick}>\n <SearchIcon style={{ verticalAlign: 'middle', marginLeft: '5px' }} />\n </div>\n <div className=\"gs-search-input-wrapper\">\n <div className=\"gs-search-input-ghost\">\n <span className=\"gs-search-ghost-text\">{searchQuery}</span>\n {searchQuery && <span className=\"gs-search-ghost-hint\"> ↵ Next</span>}\n </div>\n <textarea\n ref={searchInputRef}\n value={searchQuery}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder=\"Search\"\n title=\"Press Enter to next, Shift+Enter to previous\"\n ></textarea>\n </div>\n <div className=\"gs-search-buttons\">\n {searchRange && (\n <div className=\"gs-search-button gs-search-range\">\n <span\n className=\"gs-search-button-on\"\n onClick={handleRangeClick}\n title={`Search range: ${searchRangeLabel}`}\n >\n in {searchRangeLabel}\n </span>\n </div>\n )}\n {!searchRange && hasSelection && (\n <div className=\"gs-search-button gs-search-range\">\n <span onClick={handleRangeClick} title={`Limit to range: ${selectionLabel}`}>\n in {selectionLabel}\n </span>\n </div>\n )}\n <div className=\"gs-search-button gs-search-casesensitive\">\n <span\n className={`${searchCaseSensitive ? 'gs-search-button-on' : ''}`}\n onClick={handleCaseSensitiveClick}\n title={`Case sensitive`}\n >\n Aa\n </span>\n </div>\n <div className=\"gs-search-button gs-search-regex\">\n <span\n className={`${searchRegex ? 'gs-search-button-on' : ''}`}\n onClick={handleRegexClick}\n title={`Regular expression`}\n >\n .*\n </span>\n </div>\n </div>\n <a className=\"gs-search-close\" onClick={handleCloseClick}>\n <CloseIcon style={{ verticalAlign: 'middle' }} />\n </a>\n </label>\n );\n};\n","import { useEffect, useState, useRef, useReducer, createRef } from 'react';\nimport type { CellsByAddressType, SheetHandle, StoreHandle, OptionsType, Props, StoreType } from '../types';\nimport {\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n HEADER_HEIGHT,\n HEADER_WIDTH,\n SHEET_HEIGHT,\n SHEET_WIDTH,\n DEFAULT_COL_KEY,\n DEFAULT_ROW_KEY,\n} from '../constants';\nimport { Context } from '../store';\nimport { reducer as defaultReducer } from '../store/actions';\nimport { Editor } from './Editor';\nimport { StoreObserver } from './StoreObserver';\nimport { Resizer } from './Resizer';\nimport { Emitter } from './Emitter';\nimport { ContextMenu } from './ContextMenu';\nimport { ColumnMenu } from './ColumnMenu';\nimport { RowMenu } from './RowMenu';\nimport { Sheet } from '../lib/sheet';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '../lib/spatial';\nimport { x2c, y2r } from '../lib/coords';\nimport { embedStyle } from '../styles/embedder';\nimport { FormulaBar } from './FormulaBar';\nimport { SearchBar } from './SearchBar';\nimport { useBook } from '../lib/book';\nimport { ScrollHandle } from './ScrollHandle';\nimport { defaultContextMenuDescriptors, defaultRowMenuDescriptors, defaultColMenuDescriptors } from '../lib/menu';\n\nexport const createSheetRef = () => createRef<SheetHandle | null>();\nexport const useSheetRef = () => useRef<SheetHandle | null>(null);\nexport const createStoreRef = () => createRef<StoreHandle | null>();\nexport const useStoreRef = () => useRef<StoreHandle | null>(null);\n\nexport function GridSheet({\n initialCells,\n sheetName = '',\n sheetRef: initialSheetRef,\n storeRef: initialStoreRef,\n options = {},\n className,\n style,\n book: initialBook,\n}: Props) {\n const { sheetResize, showFormulaBar = true, mode = 'light' } = options;\n const rootRef = useRef<HTMLDivElement>(null);\n const flashRef = useRef<HTMLDivElement>(null);\n const mainRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLTextAreaElement>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n const largeEditorRef = useRef<HTMLTextAreaElement>(null);\n const tabularRef = useRef<HTMLDivElement>(null);\n\n const internalSheetRef = useSheetRef();\n const sheetRef = initialSheetRef ?? internalSheetRef;\n const internalStoreRef = useStoreRef();\n const storeRef = initialStoreRef ?? internalStoreRef;\n\n const internalBook = useBook({});\n const book = initialBook ?? internalBook;\n const { registry } = book;\n\n const [sheetId] = useState<number>(() => {\n if (sheetName) {\n // Named sheets: use sheetName as stable dedup key to prevent double-increment in Strict Mode.\n if (!registry._componentSheetIds.has(sheetName)) {\n registry._componentSheetIds.set(sheetName, ++registry.sheetHead);\n }\n return registry._componentSheetIds.get(sheetName)!;\n }\n // Unnamed sheets: accept double-increment in Strict Mode (IDs may skip, but remain unique).\n return ++registry.sheetHead;\n });\n\n // Initialize sheetReactive\n const sheetReactive = useRef<Sheet | null>(null);\n\n const [initialState] = useState<StoreType>(() => {\n if (!sheetName) {\n sheetName = `Sheet${sheetId}`;\n console.debug('GridSheet: sheetName is not provided, using default name:', sheetName);\n }\n const { limits, contextMenu, rowMenu, colMenu } = options;\n const sheet = new Sheet({\n limits,\n name: sheetName,\n registry,\n });\n sheet.id = sheetId;\n registry.sheetIdsByName[sheetName] = sheetId;\n\n sheet.initialize(initialCells);\n registry.onInit?.({ sheet });\n\n sheet.setTotalSize();\n sheetReactive.current = sheet;\n\n const store: StoreType = {\n sheetId,\n sheetReactive,\n rootRef,\n flashRef,\n mainRef,\n searchInputRef,\n editorRef,\n largeEditorRef,\n tabularRef,\n choosing: { y: 1, x: 1 },\n inputting: '',\n selectingZone: { startY: 1, startX: 1, endY: -1, endX: -1 },\n autofillDraggingTo: null,\n leftHeaderSelecting: false,\n topHeaderSelecting: false,\n editingAddress: '',\n editorRect: { y: 0, x: 0, height: 0, width: 0 },\n dragging: false,\n sheetHeight: 0,\n sheetWidth: 0,\n entering: false,\n matchingCells: [],\n matchingCellIndex: 0,\n searchCaseSensitive: false,\n searchRegex: false,\n editingOnEnter: true,\n contextMenuPosition: { y: -1, x: -1 },\n contextMenu: contextMenu ?? defaultContextMenuDescriptors,\n rowMenu: rowMenu ?? defaultRowMenuDescriptors,\n colMenu: colMenu ?? defaultColMenuDescriptors,\n resizingPositionY: [-1, -1, -1],\n resizingPositionX: [-1, -1, -1],\n columnMenuState: null,\n rowMenuState: null,\n editorHovering: true,\n mode: 'light',\n };\n return store;\n });\n\n type ReducerWithoutAction<S> = (prevState: S) => S;\n\n const [store, dispatch] = useReducer(\n defaultReducer as unknown as ReducerWithoutAction<StoreType>,\n initialState,\n () => initialState,\n );\n\n useEffect(() => {\n embedStyle();\n }, []);\n\n const [sheetHeight, setSheetHeight] = useState(options?.sheetHeight || estimateSheetHeight(initialCells));\n const [sheetWidth, setSheetWidth] = useState(options?.sheetWidth || estimateSheetWidth(initialCells));\n useEffect(() => {\n const intervalId = window.setInterval(() => {\n setSheetHeight(mainRef.current?.clientHeight || 0);\n setSheetWidth(mainRef.current?.clientWidth || 0);\n }, 1000);\n return () => window.clearInterval(intervalId);\n }, []);\n useEffect(() => {\n if (options.sheetHeight) {\n setSheetHeight(options.sheetHeight);\n }\n }, [options.sheetHeight]);\n useEffect(() => {\n if (options.sheetWidth) {\n setSheetWidth(options.sheetWidth);\n }\n }, [options.sheetWidth]);\n\n return (\n <Context.Provider value={{ store, dispatch }}>\n <div\n className={`gs-root1 ${registry.ready ? 'gs-initialized' : ''}`}\n ref={rootRef}\n data-sheet-name={sheetName}\n data-mode={mode}\n data-rows={store.sheetReactive.current?.numRows ?? 0}\n data-cols={store.sheetReactive.current?.numCols ?? 0}\n >\n <div className=\"gs-flash-overlay\" ref={flashRef} />\n <ScrollHandle style={{ position: 'fixed', top: 0, left: 0 }} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, right: 0, top: 0, width: 5 }} horizontal={1} />\n <ScrollHandle style={{ position: 'absolute', zIndex: 4, left: 0, bottom: 0, height: 5 }} vertical={1} />\n\n {typeof store.searchQuery === 'undefined' ? (\n showFormulaBar && <FormulaBar ready={registry.ready} />\n ) : (\n <SearchBar />\n )}\n <div\n className={`gs-main ${className || ''}`}\n ref={mainRef}\n style={{\n //width: '100%',\n maxWidth: (store.sheetReactive.current?.totalWidth || 0) + 2,\n maxHeight: (store.sheetReactive.current?.fullHeight || 0) + 2,\n overflow: 'auto',\n resize: sheetResize,\n ...style,\n }}\n >\n <Editor mode={mode} />\n <Tabular />\n <StoreObserver {...{ ...options, sheetHeight, sheetWidth, sheetName, sheetRef, storeRef }} />\n <ContextMenu />\n <ColumnMenu />\n <RowMenu />\n <Resizer />\n <Emitter />\n </div>\n </div>\n </Context.Provider>\n );\n}\n\nconst estimateSheetHeight = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedHeight = initialCells[0]?.height ?? HEADER_HEIGHT;\n for (let y = 1; y <= auto.numRows; y++) {\n const row = y2r(y);\n const height =\n initialCells?.[row]?.height ||\n initialCells?.['0' + row]?.height ||\n initialCells?.[DEFAULT_ROW_KEY]?.height ||\n initialCells?.default?.height ||\n DEFAULT_HEIGHT;\n if (estimatedHeight + height > SHEET_HEIGHT) {\n return SHEET_HEIGHT;\n }\n estimatedHeight += height;\n }\n return estimatedHeight + 3;\n};\n\nconst estimateSheetWidth = (initialCells: CellsByAddressType) => {\n const auto = getMaxSizesFromCells(initialCells);\n let estimatedWidth = initialCells[0]?.width ?? HEADER_WIDTH;\n for (let x = 1; x <= auto.numCols; x++) {\n const col = x2c(x);\n const width =\n initialCells?.[col]?.width ||\n initialCells?.[col + '0']?.width ||\n initialCells?.[DEFAULT_COL_KEY]?.width ||\n initialCells?.default?.width ||\n DEFAULT_WIDTH;\n if (estimatedWidth + width > SHEET_WIDTH) {\n return SHEET_WIDTH;\n }\n estimatedWidth += width;\n }\n return estimatedWidth + 3;\n};\n","import type { PolicyMixinType, RenderProps } from './core';\n\nconst makeThousandSeparatorMixin = (sep: string): PolicyMixinType => ({\n renderNumber({ value }: RenderProps<number>): any {\n if (value == null || isNaN(value)) {\n return 'NaN';\n }\n const [int, fraction] = String(parseFloat(value.toPrecision(this.decimalPrecision))).split('.');\n const result = int.replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, `$1${sep}`);\n if (fraction == null) {\n return result;\n }\n return `${result}.${fraction}`;\n },\n});\n\nexport const ThousandSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(',');\nexport const ThousandSpaceSeparatorPolicyMixin: PolicyMixinType = makeThousandSeparatorMixin(' ');\n","import type { PolicyMixinType, RenderProps } from './core';\n\nexport const CheckboxPolicyMixin: PolicyMixinType = {\n renderBool({ value, apply, sheet, point }: RenderProps<boolean>): any {\n return (\n <input\n type=\"checkbox\"\n checked={value}\n onChange={(e) => {\n if (apply) {\n apply(sheet.write({ point, value: e.currentTarget.checked.toString() }));\n }\n e.currentTarget.blur();\n }}\n />\n );\n },\n};\n","import { CSSProperties } from 'react';\n\ntype BorderStyleValue = string;\n\ninterface BorderOptions {\n /**\n * Border CSS value to apply uniformly to all sides.\n * Individual sides (top, right, etc.) will override this if specified.\n *\n * Example: \"1px solid #000\"\n */\n all?: BorderStyleValue;\n\n /**\n * Border CSS value for the top side.\n *\n * Example: \"2px dashed red\"\n */\n top?: BorderStyleValue;\n\n /**\n * Border CSS value for the right side.\n */\n right?: BorderStyleValue;\n\n /**\n * Border CSS value for the bottom side.\n */\n bottom?: BorderStyleValue;\n\n /**\n * Border CSS value for the left side.\n */\n left?: BorderStyleValue;\n}\n\n/**\n * Generates a CSSProperties object with individual border styles.\n *\n * - If `all` is provided, it applies the same border style to all sides.\n * - If individual sides (top, right, bottom, left) are specified, they override `all`.\n * - Sides that are not specified will be omitted from the result,\n * which avoids unintentionally removing existing border styles during re-renders.\n * - The function does not output the shorthand `border` property, only individual sides.\n *\n * @param options Border configuration options.\n * @returns CSSProperties object with border styles.\n *\n * @example\n * makeBorder({ all: \"1px solid #000\" });\n * // → { borderTop: \"1px solid #000\", borderRight: \"1px solid #000\", borderBottom: \"1px solid #000\", borderLeft: \"1px solid #000\" }\n *\n * @example\n * makeBorder({ top: \"2px dashed red\", left: \"1px solid blue\" });\n * // → { borderTop: \"2px dashed red\", borderLeft: \"1px solid blue\" }\n */\nexport function makeBorder(options: BorderOptions): CSSProperties {\n const result: CSSProperties = {};\n\n const all = options.all;\n\n if (options.top ?? all) {\n result.borderTop = options.top ?? all;\n }\n\n if (options.right ?? all) {\n result.borderRight = options.right ?? all;\n }\n\n if (options.bottom ?? all) {\n result.borderBottom = options.bottom ?? all;\n }\n\n if (options.left ?? all) {\n result.borderLeft = options.left ?? all;\n }\n\n return result;\n}\n"],"names":["DEFAULT_HISTORY_LIMIT","DEFAULT_HEIGHT","DEFAULT_WIDTH","SHEET_HEIGHT","SHEET_WIDTH","HEADER_HEIGHT","HEADER_WIDTH","MIN_WIDTH","MIN_HEIGHT","OVERSCAN_X","OVERSCAN_Y","DEFAULT_ALPHABET_CACHE_SIZE","SECONDS_IN_DAY","FULLDATE_FORMAT_UTC","RESET_ZONE","BASE_DATE","DEFAULT_KEY","DEFAULT_COL_KEY","DEFAULT_ROW_KEY","Context","createContext","ALPHABET","N2C_CACHE","C2N_CACHE","getColumnLetterFromNumber","key","cacheSize","cached","num","result","it","st","getNumberFromColumnLetter","alpha","digit","x2c","x","c","c2x","col","absolute","n","y2r","y","r2y","row","p2a","absX","absY","colPart","rowPart","a2p","address","m","_absX","_absY","grantAddressAbsolute","absCol","absRow","rh","ch","stripAddressAbsolute","buildIdentifiedRef","id","superposeArea","srcArea","dstArea","srcRows","srcCols","areaDiff","dstRows","dstCols","concatAreas","area1","area2","zoneToArea","zone","top","bottom","left","right","areaToZone","area","areaToRange","leftTop","rightBottom","between","range","index","among","point","zoneDiff","zoneShape","areaShape","matrixShape","base","matrix","h","makeSequence","start","stop","step","_","i","oa2aa","oa","fields","aa","o","a","field","aa2oa","v","createMatrix","numRows","numCols","fill","buildInitialCellsFromOrigin","cells","ensured","flattenAs","origin","buildInitialCells","matrices","buildCells","baseAddress","baseY","baseX","e","cell","getMaxSizesFromCells","lastY","lastX","end","list","complementSelectingArea","selectingArea","choosing","expandRange","startRow","endRow","match","startCol","endCol","startColIndex","endColIndex","currentColumn","restrictZone","s","binarySearch","low","high","predicate","lessThan","mid","addressesToAreas","addresses","points","addr","pointSet","p","visited","areas","k","queue","dy","dx","nk","addressesToCols","asc","seen","cols","b","addressesToRows","rows","isZoneNotSelected","compactReflection","reflection","restrictPoints","store","sheet","selectingZone","y1","x1","y2","x2","FLASH_CLASS","FLASH_DURATION_MS","flashSheet","el","flashWithCallback","callback","shouldTracking","operation","initSearchStatement","searchQuery","searchCaseSensitive","searchRegex","searchRange","matchingCells","matcher","flags","regex","q","startY","endY","startX","endX","matchingCellIndex","isXSheetFocused","sheetId","sheetRef","getCellRectPositions","colCell","rowCell","_a","_b","w","getScreenRect","height","width","virtualize","boundaryTop","boundaryLeft","boundaryBottom","boundaryRight","ys","xs","before","after","smartScroll","targetPoint","behavior","screen","target","up","down","isTopOver","isLeftOver","isBottomOver","isRightOver","findVisibleElement","elements","getPosition","boundary","dataKey","getAreaInTabular","tabularElement","topPosition","leftPosition","bottomPosition","rightPosition","rect","RemoveRows","RemoveCols","InsertRowsAbove","InsertRowsBelow","InsertColsLeft","InsertColsRight","MoveFrom","MoveTo","Write","Style","Copy","Resize","SetPolicy","Sort","Filter","SetLabel","NoOperation","Move","Update","InsertRows","InsertCols","Add","Delete","ReadOnly","ColumnMenu","RowMenu","ViewOnly","hasOperation","flag","debugOperations","prevention","operations","MS_PER_DAY","Time","days","format","date","totalMs","absMs","sign","millis","remaining","seconds","minutes","hours","milliseconds","ms","timeMs","date1","date2","obj","value","strict","formattedMatcher","dayjsFormatToNamedRegex","_sign","msecs","tokenRegexMap","sortedTokens","tokenPattern","regexSource","BORDER_AUTOFILL_DRAGGING","DirectionMapping","Autofill","draggingTo","orientation","sTop","sLeft","sBottom","sRight","srcShape","dstShape","diff","patterns","j","baseCell","px","nextValue","py","style","autofillDraggingTo","horizontal","vertical","groups","groupByType","group","lastValue","pass","generateFormula","slide","skip","generateNumber","g","next","d","generateDate","generateStringNumber","prefix","extractStringNumber","lastNumber","StringNumberPattern","TypedGroup","kind","prefix1","number1","prefix2","number2","news","lastGroup","eq","dayjs","basePrefix","number","nexts","firstNumber","nextGroup","resetZone","actions","reducer","action","act","registry","newStore","_CoreAction","payload","CoreAction","SetSearchQueryAction","setSearchQuery","SetSearchCaseSensitiveAction","setSearchCaseSensitive","SetSearchRegexAction","setSearchRegex","SetSearchRangeAction","setSearchRange","SetEditingAddressAction","setEditingAddress","SetAutofillDraggingToAction","setAutofillDraggingTo","SubmitAutofillAction","autofill","submitAutofill","SetContextMenuPositionAction","setContextMenuPosition","SetResizingPositionYAction","setResizingPositionY","SetResizingPositionXAction","setResizingPositionX","SetEnteringAction","setEntering","UpdateSheetAction","updateSheet","SetEditorRectAction","setEditorRect","SetDragging","setDragging","BlurAction","blur","CopyAction","copy","CutAction","cut","PasteAction","dstSheetRef","dstSheet","copyingSheetId","copyingZone","cutting","srcSheet","copyingArea","onlyValue","src","dst","nextSelectingZone","newSheet","superposed","paste","EscapeAction","escape","ChooseAction","choose","SelectAction","select","SelectRowsAction","choosingY","selectRows","SelectColsAction","selectCols","DragAction","drag","SearchAction","search","WriteAction","write","ClearAction","diffCount","prevention.hasOperation","prevention.Write","clear","UndoAction","history","dispatch","dstStore","setStore","undo","RedoAction","redo","ArrowAction","shiftKey","deltaY","deltaX","tabularRef","dragEndY","dragEndX","nextY","nextX","resolvedY","dir","editorTop","editorLeft","_c","_d","arrow","WalkAction","gridOuterRef","lo","hi","walk","SetInputtingAction","setInputting","InsertRowsAboveAction","operator","insertRowsAbove","InsertRowsBelowAction","editorRef","nextChoosing","insertRowsBelow","InsertColsLeftAction","insertColsLeft","InsertColsRightAction","insertColsRight","RemoveRowsAction","removeRows","RemoveColsAction","removeCols","SortRowsAction","direction","sortRows","FilterRowsAction","filter","newChoosing","t","filterRows","SetColumnMenuAction","setColumnMenu","SetRowMenuAction","setRowMenu","SetEditorHoveringAction","setEditorHovering","setStoreAction","userActions","MARGIN","calcBelowPosition","maxWidth","margin","clampLeft","overflow","calcSideStyle","gap","flipped","clampPopup","vw","vh","hAlignTransform","hAlign","FunctionGuide","option","activeFunctionGuide","activeArgIndex","ref","useRef","guide1Ref","useContext","isHidden","useLayoutEffect","jsxs","jsx","React","Fragment","arg","args","numIterable","variadicStart","isActive","offset","resolvedIndex","activeArg","EditorOptions","filteredOptions","selected","onOptionMouseDown","ulRef","adjustedLeft","setAdjustedLeft","useState","focus","isSafari","preventSafariBounce","preventBounce","scrollTop","scrollHeight","clientHeight","scrollLeft","scrollWidth","clientWidth","atTop","atBottom","atLeft","atRight","touchStartX","touchStartY","onTouchStart","preventTouchBounce","clip","input","trimmed","tsv","sheet2csv","html","sheet2html","tsvBlob","htmlBlob","getter","filteredRowsIncluded","trailingEmptyRowsOmitted","separator","newline","rowIsEmpty","r","valueEscaped","FormulaError","code","message","error","stripId","idString","stripAbsolute","Entity","ValueEntity","UnreferencedEntity","InvalidRefEntity","RefEntity","parsed","parseRef","props","slideY","slideX","newPoint","RangeEntity","formulas","IdEntity","sheetIdStr","formula","ids","IdRangeEntity","idRange","ps","p1","p2","FunctionEntity","name","precedence","at","Func","ZERO","INFIX_FUNCTION_NAME_MAP","PREFIX_FUNCTION_NAME_MAP","WHITESPACE_CHARS","SPECIAL_CHARS","Token","type","entity","closed","isWhiteSpace","char","BOOLS","TOKEN_OPEN","TOKEN_CLOSE","TOKEN_COMMA","INFIX_OPERATOR","PREFIX_OPERATOR","POSTFIX_OPERATOR","Lexer","options","pos","token","parts","idMap","prev1","prev2","buf","bool","resolveIdRange","space","quote","refString","refs","done","replaced","suffix","Parser","tokens","expr","underFunction","stack","lastOperator","complement","hasNext","outer","divideBy100","func","FormulaParser","stripSheetName","sheetName","splitRef","nextChar","excl","dependency","filterCellFields","ignoreFields","ensureSys","defaults","sys","setAsyncCache","ac","noFilter","getCellByAddress","toValueMatrix","resolution","raise","asScalar","toValueObject","fieldValue","toValueRows","toValueCols","toCellMatrix","filteredCell","toCellObject","toCellRows","escapeSheetName","toSheetPrefix","toCellCols","insertTextAtCursor","text","insertRef","dryRun","lexer","tokenIndex","refSheetName","refAddresses","tokenAddresses","tokenAbsolutes","isRefInsertable","expandInput","resetInput","isFocus","handleFormulaQuoteAutoClose","inputting","selectionStart","selectionEnd","selectedText","charAfter","beforeCursor","quoteCount","COLOR_PALETTE","Sentinel","SOLVING","Pending","promise","Spilling","Registry","historyLimit","additionalFunctions","policies","onSave","onChange","onRemoveRows","onRemoveCols","onInsertRows","onInsertCols","onSelect","onKeyUp","onInit","newBook","functionsDefault","fnName","fn","keys","tobe","storeDispatch","createRegistry","createBook","useBook","book","setBook","patch","useEffect","timezone","utc","NUMS","NUMS_Z","JFMASOND","NBRYNLGPTVC","DATE_WORDS","parseDate","first","words","word","timeZone","Policy","mixins","subclassProto","mixin","rendered","isSheet","_props","childSheet","rest","stripped","_n","_cell","DEFAULT_POLICY_NAME","nonePolicy","_str","detectType","cellValue","parseAsType","scale","td","bv","toNumeric","filterEq","condition","vt","cellNum","filterNe","filterGt","filterGte","filterLt","filterLte","filterBlank","_condition","filterNonblank","filterIncludes","filterExcludes","filterFunctions","evaluateFilterCondition","evaluateFilterConfig","mode","ReferencePreserver","did","prevId","currId","diffBefore","dep","Sheet","limits","historicize","pendingMap","promises","resolve","check","snapshot","diffAfter","changedIds","trimmedBefore","trimmedAfter","activeFilters","changedAddresses","shouldFilter","wasFiltered","fixedPositions","sortableIndices","cellA","cellB","valA","valB","cmp","availablePositions","changed","sortedRowMapping","matrixSnapshot","oldY","newY","preserver","inverse","newOrder","oldYStr","savedRows","extension","auto","changedTime","data","common","commonCol","commonRow","rowId","colId","stacked","colDefault","_cs","colDefaultLayout","headerCell","rowDefault","_rs","rowDefaultLayout","otherSheet","context","l","rw","lw","th","headerW","headerH","accW","colSys","accH","fullH","rowSys","relocate","resize","cache","existing","solveFormula","kickedOut","rel","depId","newCell","undoReflection","redoReflection","srcSheetRaw","moveRelations","srcTop","srcLeft","srcBottom","srcRight","dstTop","dstLeft","dstNumRows","dstNumCols","srcVisibleRows","srcNumCols","srcNumVisibleRows","dstVisibleRows","di","srcCellSet","dstAddrSet","dstY","dstX","srcY","srcX","srcAddr","isDstInBounds","dstAddr","newId","lostId","existingId","srcId","srcCell","dstCell","reverse","wireWrites","idWritesSrc","idWritesDst","beforePolicy","afterPolicy","toPoint","movedId","fromPoint","srcPoint","dstPoint","dstId","operation.hasOperation","operation.MoveFrom","operation.MoveTo","policyKey","restricted","dstPolicyKey","srcPolicyKey","dstPolicyVal","srcPolicyVal","isSrcWinner","srcSys","srcSnapshot","dstSnapshot","srcAddresses","resolvedDiff","isXSheet","topFrom","leftFrom","bottomFrom","rightFrom","topTo","leftTo","bottomTo","rightTo","toY","fromY","toX","fromX","dstPolicy","srcPolicy","dstIdForClear","dstSys","operation.Copy","partial","updateChangedTime","op","operation.Update","formulaIdentify","resized","current","operation.Write","operation.Style","operation.Resize","merged","srcRowIndex","currentCell","matrixWithStyle","copied","cloned","backup","yi","operation.RemoveRows","xi","deleted","operation.RemoveCols","deleting","apply","policy","raw","solved","stripSheet","solveSheet","movedAddresses","snapshotIds","depSys","tmp","targetId","targetCell","originId","spilledAddresses","omit","shape","hit","asyncCacheMiss","hasPendingArg","hasDeepPending","values","cyrb53","str","seed","h1","h2","buildAsyncCacheKey","funcName","hashPrecision","argsJson","_key","hashes","getAsyncCache","useInflight","compositeKey","inflight","awaitAndSave","ttlMilliseconds","expireTime","pending","createPropagatedPending","conditionArg","matchesType","nullable","errorTolerant","acceptedTypes","isMatrix","stripMatrix","isMultiCell","resolveParamIndex","defs","argCount","indices","iterStart","iterCount","_BaseFunction","validatedArgs","minArgs","hasIterable","def","broadcastResult","helpIndices","broadcastable","hIdx","scalarArgs","maxRows","maxCols","acc","originalBareArgs","cellArgs","BaseFunction","BaseFunctionAsync","gt","ensureString","ensureNumber","gte","lt","lte","ne","alternative","ignore","ensureBoolean","CONDITION_REGEX","comparison","equals","eachMatrix","createBooleanMask","sheets","conditions","refRange","mask","condRange","pt","description","AddFunction","v1","v2","MinusFunction","MultiplyFunction","DivideFunction","validated","divided","divisor","SumFunction","sum","val","ConcatFunction","EqFunction","NeFunction","GtFunction","GteFunction","LtFunction","LteFunction","NowFunction","AndFunction","OrFunction","IfFunction","IfErrorFunction","valueIfError","NotFunction","CountFunction","count","AbsFunction","PowerFunction","exponent","CountaFunction","AverageFunction","MaxFunction","max","hasValues","MinFunction","min","LenFunction","UminusFunction","ArrayformulaFunction","functions","_functionHelpsCache","getFunctionHelps","customFunctions","helps","FnClass","instance","useAutocomplete","optionsAll","setSelected","matchParams","activeFunctionHelp","useMemo","isFormula","textBeforeCursor","textAfterCursor","textToCursor","functionStack","nextToken","activeItem","wordBefore","wordAfter","currentWord","hasOpenParenAssigned","filtered","isOnAddress","fullLexer","currentIndex","tLen","help","keywordLower","startsWith","hasNoArgs","keywords","bestMatch","keyword","replaceWithOption","useCallback","beforeMatch","afterMatch","handleArrowUp","handleArrowDown","useBrowser","ok","setOk","useDebounceCallback","delay","debouncedCallback","timerRef","Fixed","children","className","attrs","document","createPortal","parseHTML","doc","results","processSheet","spans","caption","childStyle","parseStyleString","rowSpan","colSpan","processNodeSequentially","node","currentLine","tagName","blockTags","child","lines","line","element","styleString","styleObj","rawKey","rawValue","letter","parseText","sep","entering","restoreDoubleQuote","Editor","setShiftKey","setSelectionStart","isFocused","setIsFocused","editorRect","editingAddress","largeEditorRef","searchInputRef","editingOnEnter","dragging","renderOverlays","editing","handleOptionMouseDown","handleSelect","currentString","setBefore","writeCell","selectValue","selectedIndex","newValue","newCursor","numLines","isKeyDown","setIsKeyDown","handleKeyDown","isFunction","dblclick","_f","_e","handleFocus","handleDoubleClick","length","handleBlur","handleChange","handlePaste","handleKeyUpInternal","editorStyle","TokenSpan","memo","tokenKey","color","prevProps","nextProps","palletIndex","exists","formulaHash","hash","normalizedToken","existsIndex","PluginContext","useInitialPluginContext","setApply","usePluginContext","ctx","PluginBase","provided","StoreObserver","sheetHeight","sheetWidth","storeRef","sheetReactive","pluginProvided","pluginContext","Resizer","posY","posX","leftHeaderSelecting","topHeaderSelecting","mainRef","offsetY","offsetX","baseWidth","baseHeight","Emitter","pointing","copier","cutter","paster","items","item","undoer","redoer","rowsInserterAbove","rowsInserterBelow","colsInserterLeft","colsInserterRight","rowsRemover","colsRemover","rowsSorterAsc","rowsSorterDesc","rowsFilterer","rowsFilterClearer","rowSortFixedToggler","rowFilterFixedToggler","searcher","applyers","rowInsertCount","selStart","selEnd","colInsertCount","defaultContextMenuDescriptors","prevention.InsertRowsAbove","prevention.InsertRowsBelow","prevention.InsertColsLeft","prevention.InsertColsRight","prevention.RemoveRows","prevention.RemoveCols","defaultRowMenuDescriptors","defaultColMenuDescriptors","buildMenuContext","close","_insertRowsAbove","_insertRowsBelow","_removeRows","_insertColsLeft","_insertColsRight","_removeCols","label","_setStore","_menuComponentRegistry","registerMenuComponent","component","getMenuComponent","MenuItem","shortcuts","disabled","checked","testId","onClick","hasCheck","shortcut","part","arr","MenuDivider","ContextMenu","contextMenuPosition","contextMenu","menuRef","METHOD_LABELS","NO_VALUE_METHODS","DEFAULT_CONDITION","FilterSection","onWaiting","setConditions","setMode","setPending","firstValueRef","handleCancel","cancelled","execute","actionX","validConditions","filterMode","currentSheet","updateCondition","prev","addCondition","removeCondition","handleApplyFilter","valid","handleResetColumn","handleResetAll","filterDisabled","prevention.Filter","hasAnyFilter","cond","SortSection","sortDisabled","prevention.Sort","getLabel","LabelSection","labelInputRef","setLabel","handleApplyLabel","labelDisabled","prevention.SetLabel","labelPlaceholder","columnMenuState","colMenu","position","waitingState","setWaitingState","handleClose","handleWaiting","cancel","descriptor","Section","renderRowDescriptor","rowMenuState","rowMenu","isTouching","mouseEvent","safePreventDefault","Cell","isFirstPointed","cellRef","errorTooltipPos","setErrorTooltipPos","xSheetFocused","lastFocused","pointed","_setEditorRect","errorMessage","isPendingCell","editingAnywhere","handleDragStart","fullAddress","handleDragEnd","handleDragging","newArea","fullRange","handleAutofillMouseDown","handleErrorTriangleEnter","handleErrorTriangleLeave","onContextMenu","onDoubleClick","autofillDragClass","acceleration","maxSpeed","lastScrollTime","currentSpeed","ScrollHandle","scrollRef","isScrolling","getDestEdge","tabularRect","scrollStep","now","curY","curX","sheetPrefix","sheetRange","handleMouseEnter","stopScroll","handleMouseUp","handleMouseUpWrapper","handleMouseLeave","HeaderCellTop","hasFilter","handleResizeMouseDown","displayedLabel","prevention.ColumnMenu","btn","pressX","pressY","prevention.Resize","HeaderCellLeft","handleContextMenu","prevention.RowMenu","COLOR_POINTED","COLOR_SELECTED","SELECTING_FILL","COLOR_COPYING","COLOR_CUTTING","SEARCH_MATCHING_BACKGROUND","COLOR_SEARCH_MATCHING","COLOR_AUTOFILL","fillRect","drawRect","lineWidth","dashPattern","fillColor","drawAreaRectViewport","viewW","viewH","topLeft","bottomRight","CellStateOverlay","canvasRef","rafIdRef","drawCanvas","canvas","container","dpr","vx","vy","palette","refArea","isCurrentMatch","backgroundColor","drawLeft","drawWidth","drawTop","drawHeight","scheduleDrawCanvas","handleScroll","Tabular","setPalette","virtualized","setVirtualized","handleMouseMove","handleSelectAllClick","paletteBySheetName","normalizedRef","splitterIndex","upperRef","mergedRefs","_g","_h","LAST_MODIFIED","CSS","embedStyle","FormulaBar","ready","editingCell","hlRef","spilledFromAddress","originPoint","originAddress","observer","entries","updateScroll","largeInput","handleInput","Base","size","SearchIcon","CloseIcon","SearchBar","rootRef","matchingCell","handleProgressClick","handleSearchClick","handleCaseSensitiveClick","handleRegexClick","hasSelection","selectionLabel","handleRangeClick","searchRangeLabel","handleCloseClick","createSheetRef","createRef","useSheetRef","createStoreRef","useStoreRef","GridSheet","initialCells","initialSheetRef","initialStoreRef","initialBook","sheetResize","showFormulaBar","flashRef","internalSheetRef","internalStoreRef","internalBook","initialState","useReducer","defaultReducer","setSheetHeight","estimateSheetHeight","setSheetWidth","estimateSheetWidth","intervalId","estimatedHeight","estimatedWidth","makeThousandSeparatorMixin","int","fraction","ThousandSeparatorPolicyMixin","CheckboxPolicyMixin","makeBorder","all"],"mappings":"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"}
|