@gridsheet/react-core 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/store/index.ts","../src/components/FunctionGuide.tsx","../src/components/EditorOptions.tsx","../src/lib/clipboard.ts","../src/components/useAutocomplete.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/applyers.ts","../src/lib/menu.ts","../src/components/MenuItem.tsx","../src/components/ContextMenu.tsx","../src/components/ColumnMenuFilterSection.tsx","../src/components/ColumnMenuSortSection.tsx","../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/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/checkbox.tsx","../src/lib/style.ts"],"sourcesContent":["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 React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '@gridsheet/core';\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 '@gridsheet/core';\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","import type { StoreType, AreaType, PointType } from '../types';\n\nimport { zoneToArea } from '@gridsheet/core';\nimport type { Sheet, UserSheet } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\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, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\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","import { useState, useMemo, useCallback } from 'react';\nimport { getFunctionHelps, type FunctionHelp } from '@gridsheet/core';\nimport type { FunctionMapping } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\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 type { CSSProperties, FC, ReactNode } from 'react';\nimport { useBrowser } from '../lib/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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport {\n expandInput,\n handleFormulaQuoteAutoClose,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n} from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\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 setSelectionStart(e.currentTarget.selectionStart);\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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { zoneToArea, makeSequence, between } from '@gridsheet/core';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\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 '@gridsheet/core';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport { operations as prevention } from '@gridsheet/core';\nimport { zoneShape } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\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/applyers';\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 '@gridsheet/core';\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 { operations as prevention } from '@gridsheet/core';\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 { operations as prevention } from '@gridsheet/core';\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 FC, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { Context } from '../store';\nimport { setStore } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { x2c, p2a } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\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 '@gridsheet/core';\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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { zoneToArea, among, areaToRange } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { Pending } from '@gridsheet/core';\nimport { insertRef, isRefInsertable } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '@gridsheet/core';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { insertRef, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { areaToRange, zoneToArea } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/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 '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/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 '@gridsheet/core';\nimport { between } from '@gridsheet/core';\nimport { a2p } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\nimport { Autofill } from '@gridsheet/core';\nimport { getCellRectPositions } from '@gridsheet/core';\nimport type { Sheet } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { p2a, stripAddressAbsolute } from '@gridsheet/core';\nimport { Lexer, stripSheetName } from '@gridsheet/core';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '@gridsheet/core';\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","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 '@gridsheet/core';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { handleFormulaQuoteAutoClose, insertTextAtCursor, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\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 setSelectionStart(e.currentTarget.selectionStart);\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 '@gridsheet/core';\nimport { isZoneNotSelected } from '@gridsheet/core';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '@gridsheet/core';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '@gridsheet/core';\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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '@gridsheet/core';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { embedStyle } from '@gridsheet/core';\nimport { FormulaBar } from './FormulaBar';\nimport { SearchBar } from './SearchBar';\nimport { useBook } from '../lib/hooks';\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 '@gridsheet/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 type { CSSProperties } from 'react';\n\ntype BorderStyleValue = string;\n\ninterface BorderOptions {\n all?: BorderStyleValue;\n top?: BorderStyleValue;\n right?: BorderStyleValue;\n bottom?: BorderStyleValue;\n left?: BorderStyleValue;\n}\n\nexport function makeBorder(options: BorderOptions): CSSProperties {\n const result: CSSProperties = {};\n const all = options.all;\n if (options.top ?? all) {\n result.borderTop = options.top ?? all;\n }\n if (options.right ?? all) {\n result.borderRight = options.right ?? all;\n }\n if (options.bottom ?? all) {\n result.borderBottom = options.bottom ?? all;\n }\n if (options.left ?? all) {\n result.borderLeft = options.left ?? all;\n }\n return result;\n}\n"],"names":["Context","createContext","FunctionGuide","option","activeFunctionGuide","activeArgIndex","top","left","ref","useRef","guide1Ref","store","useContext","isHidden","useLayoutEffect","el","calcSideStyle","clampPopup","jsxs","e","jsx","React","Fragment","arg","j","args","numIterable","a","variadicStart","isActive","offset","resolvedIndex","activeArg","EditorOptions","filteredOptions","selected","onOptionMouseDown","ulRef","adjustedLeft","setAdjustedLeft","useState","width","clampLeft","i","clip","selectingZone","choosing","editorRef","sheetRef","sheet","y","x","area","zoneToArea","input","trimmed","tsv","sheet2csv","point","html","sheet2html","tsvBlob","htmlBlob","focus","getter","filteredRowsIncluded","trailingEmptyRowsOmitted","separator","newline","rows","cols","rowIsEmpty","value","r","valueEscaped","useAutocomplete","inputting","selectionStart","optionsAll","functions","setSelected","matchParams","activeFunctionHelp","useMemo","isFormula","textBeforeCursor","textAfterCursor","textToCursor","lexer","Lexer","functionStack","token","nextToken","activeItem","helps","getFunctionHelps","h","wordBefore","_a","wordAfter","_b","currentWord","hasOpenParenAssigned","filtered","isOnAddress","fullLexer","currentIndex","tLen","help","keywordLower","startsWith","index","hasNoArgs","b","keywords","bestMatch","keyword","replaceWithOption","useCallback","beforeMatch","afterMatch","handleArrowUp","s","handleArrowDown","Fixed","children","style","className","attrs","document","useBrowser","createPortal","parseHTML","onlyValue","doc","results","processSheet","spans","row","caption","cells","result","cell","childStyle","parseStyleString","rowSpan","colSpan","c","processNodeSequentially","node","currentLine","tagName","blockTags","child","lines","line","element","styleString","styleObj","d","rawKey","rawValue","key","_","letter","parseText","sep","entering","word","restoreDoubleQuote","text","Editor","mode","dispatch","shiftKey","setShiftKey","setSelectionStart","isFocused","setIsFocused","editorRect","editingAddress","matchingCells","matchingCellIndex","searchQuery","largeEditorRef","searchInputRef","editingOnEnter","sheetId","dragging","renderOverlays","editing","rect","handleOptionMouseDown","policy","handleSelect","useEffect","setEditingAddress","expandInput","rowId","y2r","address","x2c","currentString","before","setBefore","writeCell","write","selectValue","selectedIndex","newValue","newCursor","setInputting","t","updateSheet","resetInput","height","numLines","isKeyDown","setIsKeyDown","handleKeyDown","handleFormulaQuoteAutoClose","isFunction","walk","insertTextAtCursor","dblclick","_c","clear","_d","escape","setSearchQuery","arrow","select","copy","areaToZone","setEntering","redo","_f","_e","cut","undo","prevention","handleFocus","handleDoubleClick","length","handleBlur","isRefInsertable","handleChange","handlePaste","paste","handleKeyUpInternal","selectingArea","editorStyle","setEditorHovering","TokenSpan","memo","tokenKey","color","prevProps","nextProps","palletIndex","exists","formulaHash","hash","char","normalizedToken","existsIndex","COLOR_PALETTE","PluginContext","useInitialPluginContext","setStore","apply","setApply","usePluginContext","ctx","PluginBase","context","provided","StoreObserver","sheetName","sheetHeight","sheetWidth","storeRef","sheetReactive","registry","pluginProvided","pluginContext","Resizer","posY","posX","leftHeaderSelecting","topHeaderSelecting","mainRef","startY","endY","startX","endX","offsetY","offsetX","baseWidth","DEFAULT_WIDTH","baseHeight","DEFAULT_HEIGHT","bottom","right","diff","xs","between","makeSequence","p2a","ys","setResizingPositionY","setResizingPositionX","MIN_HEIGHT","MIN_WIDTH","Emitter","pointing","zone","copier","cutter","paster","items","item","undoer","redoer","rowsInserterAbove","numRows","zoneShape","insertRowsAbove","rowsInserterBelow","insertRowsBelow","colsInserterLeft","numCols","insertColsLeft","colsInserterRight","insertColsRight","rowsRemover","removeRows","colsRemover","removeCols","rowsSorterAsc","sortRows","rowsSorterDesc","rowsFilterer","filter","filterRows","rowsFilterClearer","rowSortFixedToggler","addr","rowCell","next","rowFilterFixedToggler","searcher","applyers","rowInsertCount","selStart","selEnd","colInsertCount","defaultContextMenuDescriptors","colCell","defaultRowMenuDescriptors","n","defaultColMenuDescriptors","buildMenuContext","close","props","_insertRowsAbove","_insertRowsBelow","_removeRows","_insertColsLeft","_insertColsRight","_removeCols","direction","label","_setStore","_menuComponentRegistry","registerMenuComponent","id","component","getMenuComponent","MenuItem","shortcuts","disabled","checked","testId","onClick","hasCheck","shortcut","part","arr","MenuDivider","ContextMenu","contextMenuPosition","contextMenu","menuRef","setContextMenuPosition","METHOD_LABELS","NO_VALUE_METHODS","DEFAULT_CONDITION","FilterSection","onWaiting","conditions","setConditions","setMode","pending","setPending","firstValueRef","existing","handleCancel","cancelled","execute","actionX","validConditions","filterMode","currentSheet","updateCondition","patch","prev","addCondition","removeCondition","handleApplyFilter","valid","v","handleResetColumn","handleResetAll","filterDisabled","hasAnyFilter","cond","m","SortSection","sortDisabled","LabelSection","labelInputRef","setLabel","handleApplyLabel","labelDisabled","labelPlaceholder","getLabel","ColumnMenu","columnMenuState","colMenu","position","waitingState","setWaitingState","handleClose","setColumnMenu","handleWaiting","message","cancel","descriptor","Section","renderRowDescriptor","RowMenu","rowMenuState","rowMenu","setRowMenu","isTouching","mouseEvent","safePreventDefault","Cell","isFirstPointed","cellRef","errorTooltipPos","setErrorTooltipPos","autofillDraggingTo","xSheetFocused","isXSheetFocused","lastFocused","pointed","_setEditorRect","setEditorRect","errorMessage","rendered","FormulaError","isPendingCell","Pending","editingAnywhere","handleDragStart","choose","drag","setDragging","fullAddress","insertRef","handleDragEnd","submitAutofill","handleDragging","setAutofillDraggingTo","newArea","fullRange","areaToRange","handleAutofillMouseDown","handleErrorTriangleEnter","calcBelowPosition","handleErrorTriangleLeave","onContextMenu","onDoubleClick","autofillDragClass","among","hAlignTransform","acceleration","maxSpeed","lastScrollTime","currentSpeed","ScrollHandle","horizontal","vertical","scrollRef","tabularRef","isScrolling","getDestEdge","tabularRect","getAreaInTabular","scrollStep","now","curY","curX","sheetPrefix","sheetRange","handleMouseEnter","stopScroll","isFocus","handleMouseUp","handleMouseUpWrapper","handleMouseLeave","HeaderCellTop","colId","col","hasFilter","handleResizeMouseDown","selectCols","useDebounceCallback","displayedLabel","btn","pressX","pressY","HeaderCellLeft","selectRows","handleContextMenu","COLOR_POINTED","COLOR_SELECTED","SELECTING_FILL","COLOR_COPYING","COLOR_CUTTING","SEARCH_MATCHING_BACKGROUND","COLOR_SEARCH_MATCHING","COLOR_AUTOFILL","fillRect","drawRect","lineWidth","dashPattern","fillColor","drawAreaRectViewport","scrollTop","scrollLeft","viewW","viewH","topLeft","getCellRectPositions","bottomRight","x1","y1","x2","y2","CellStateOverlay","refs","canvasRef","rafIdRef","drawCanvas","canvas","container","dpr","w","headerW","headerH","autofill","Autofill","pos","vx","vy","copyingSheetId","copyingZone","cutting","copyingArea","palette","refArea","a2p","isCurrentMatch","backgroundColor","drawLeft","drawWidth","drawTop","drawHeight","scheduleDrawCanvas","handleScroll","Tabular","setPalette","virtualized","setVirtualized","handleMouseMove","virtualize","handleSelectAllClick","paletteBySheetName","normalizedRef","stripAddressAbsolute","splitterIndex","stripped","stripSheetName","upperRef","preventSafariBounce","mergedRefs","_g","_h","FormulaBar","ready","editingCell","hlRef","spilledFromAddress","originPoint","originAddress","observer","entries","updateScroll","largeInput","handleInput","Base","size","SearchIcon","CloseIcon","SearchBar","rootRef","searchCaseSensitive","searchRegex","searchRange","matchingCell","smartScroll","handleProgressClick","handleSearchClick","search","handleCaseSensitiveClick","setSearchCaseSensitive","handleRegexClick","setSearchRegex","hasSelection","isZoneNotSelected","selectionLabel","handleRangeClick","setSearchRange","searchRangeLabel","handleCloseClick","createSheetRef","createRef","useSheetRef","createStoreRef","useStoreRef","GridSheet","initialCells","initialSheetRef","initialStoreRef","options","initialBook","sheetResize","showFormulaBar","flashRef","internalSheetRef","internalStoreRef","internalBook","useBook","book","initialState","limits","Sheet","useReducer","defaultReducer","embedStyle","setSheetHeight","estimateSheetHeight","setSheetWidth","estimateSheetWidth","intervalId","auto","getMaxSizesFromCells","estimatedHeight","HEADER_HEIGHT","DEFAULT_ROW_KEY","SHEET_HEIGHT","estimatedWidth","HEADER_WIDTH","DEFAULT_COL_KEY","SHEET_WIDTH","CheckboxPolicyMixin","makeBorder","all"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/store/index.ts","../src/components/FunctionGuide.tsx","../src/components/EditorOptions.tsx","../src/lib/clipboard.ts","../src/components/useAutocomplete.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/applyers.ts","../src/lib/menu.ts","../src/components/MenuItem.tsx","../src/components/ContextMenu.tsx","../src/components/ColumnMenuFilterSection.tsx","../src/components/ColumnMenuSortSection.tsx","../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/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/checkbox.tsx","../src/lib/style.ts"],"sourcesContent":["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 React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '@gridsheet/core';\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 '@gridsheet/core';\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","import type { StoreType, AreaType, PointType } from '../types';\n\nimport { zoneToArea } from '@gridsheet/core';\nimport type { Sheet, UserSheet } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\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, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\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","import { useState, useMemo, useCallback } from 'react';\nimport { getFunctionHelps, type FunctionHelp } from '@gridsheet/core';\nimport type { FunctionMapping } from '@gridsheet/core';\nimport type { AutocompleteOption } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\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 type { CSSProperties, FC, ReactNode } from 'react';\nimport { useBrowser } from '../lib/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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport {\n expandInput,\n handleFormulaQuoteAutoClose,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n} from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { Lexer } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\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 setSelectionStart(e.currentTarget.selectionStart);\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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { zoneToArea, makeSequence, between } from '@gridsheet/core';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\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 '@gridsheet/core';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport { operations as prevention } from '@gridsheet/core';\nimport { zoneShape } from '@gridsheet/core';\nimport { p2a } from '@gridsheet/core';\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/applyers';\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, useEffect } 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 '@gridsheet/core';\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 useEffect(() => {\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 { operations as prevention } from '@gridsheet/core';\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 { operations as prevention } from '@gridsheet/core';\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 FC, useContext, useState, useCallback, useEffect, useRef } from 'react';\nimport { Context } from '../store';\nimport { setStore } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { x2c, p2a } from '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\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 '@gridsheet/core';\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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { zoneToArea, among, areaToRange } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { Pending } from '@gridsheet/core';\nimport { insertRef, isRefInsertable } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '@gridsheet/core';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { insertRef, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { areaToRange, zoneToArea } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/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 '@gridsheet/core';\nimport { getLabel } from '@gridsheet/core';\nimport { between, zoneToArea } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { operations as prevention } from '@gridsheet/core';\nimport { insertRef } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\nimport { isXSheetFocused } from '../store/helpers';\nimport { ScrollHandle } from './ScrollHandle';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport { useDebounceCallback } from '../lib/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 '@gridsheet/core';\nimport { between } from '@gridsheet/core';\nimport { a2p } from '@gridsheet/core';\nimport { COLOR_PALETTE } from '@gridsheet/core';\nimport { Autofill } from '@gridsheet/core';\nimport { getCellRectPositions } from '@gridsheet/core';\nimport type { Sheet } from '@gridsheet/core';\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 '@gridsheet/core';\nimport { p2a, stripAddressAbsolute } from '@gridsheet/core';\nimport { Lexer, stripSheetName } from '@gridsheet/core';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '@gridsheet/core';\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","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 '@gridsheet/core';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/core';\nimport { handleFormulaQuoteAutoClose, insertTextAtCursor, isFocus } from '@gridsheet/core';\nimport { focus } from '@gridsheet/core';\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 setSelectionStart(e.currentTarget.selectionStart);\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 '@gridsheet/core';\nimport { isZoneNotSelected } from '@gridsheet/core';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '@gridsheet/core';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '@gridsheet/core';\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 '@gridsheet/core';\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 '@gridsheet/core';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '@gridsheet/core';\nimport { x2c, y2r } from '@gridsheet/core';\nimport { embedStyle } from '@gridsheet/core';\nimport { FormulaBar } from './FormulaBar';\nimport { SearchBar } from './SearchBar';\nimport { useBook } from '../lib/hooks';\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 '@gridsheet/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 type { CSSProperties } from 'react';\n\ntype BorderStyleValue = string;\n\ninterface BorderOptions {\n all?: BorderStyleValue;\n top?: BorderStyleValue;\n right?: BorderStyleValue;\n bottom?: BorderStyleValue;\n left?: BorderStyleValue;\n}\n\nexport function makeBorder(options: BorderOptions): CSSProperties {\n const result: CSSProperties = {};\n const all = options.all;\n if (options.top ?? all) {\n result.borderTop = options.top ?? all;\n }\n if (options.right ?? all) {\n result.borderRight = options.right ?? all;\n }\n if (options.bottom ?? all) {\n result.borderBottom = options.bottom ?? all;\n }\n if (options.left ?? all) {\n result.borderLeft = options.left ?? all;\n }\n return result;\n}\n"],"names":["Context","createContext","FunctionGuide","option","activeFunctionGuide","activeArgIndex","top","left","ref","useRef","guide1Ref","store","useContext","isHidden","useLayoutEffect","el","calcSideStyle","clampPopup","jsxs","e","jsx","React","Fragment","arg","j","args","numIterable","a","variadicStart","isActive","offset","resolvedIndex","activeArg","EditorOptions","filteredOptions","selected","onOptionMouseDown","ulRef","adjustedLeft","setAdjustedLeft","useState","width","clampLeft","i","clip","selectingZone","choosing","editorRef","sheetRef","sheet","y","x","area","zoneToArea","input","trimmed","tsv","sheet2csv","point","html","sheet2html","tsvBlob","htmlBlob","focus","getter","filteredRowsIncluded","trailingEmptyRowsOmitted","separator","newline","rows","cols","rowIsEmpty","value","r","valueEscaped","useAutocomplete","inputting","selectionStart","optionsAll","functions","setSelected","matchParams","activeFunctionHelp","useMemo","isFormula","textBeforeCursor","textAfterCursor","textToCursor","lexer","Lexer","functionStack","token","nextToken","activeItem","helps","getFunctionHelps","h","wordBefore","_a","wordAfter","_b","currentWord","hasOpenParenAssigned","filtered","isOnAddress","fullLexer","currentIndex","tLen","help","keywordLower","startsWith","index","hasNoArgs","b","keywords","bestMatch","keyword","replaceWithOption","useCallback","beforeMatch","afterMatch","handleArrowUp","s","handleArrowDown","Fixed","children","style","className","attrs","document","useBrowser","createPortal","parseHTML","onlyValue","doc","results","processSheet","spans","row","caption","cells","result","cell","childStyle","parseStyleString","rowSpan","colSpan","c","processNodeSequentially","node","currentLine","tagName","blockTags","child","lines","line","element","styleString","styleObj","d","rawKey","rawValue","key","_","letter","parseText","sep","entering","word","restoreDoubleQuote","text","Editor","mode","dispatch","shiftKey","setShiftKey","setSelectionStart","isFocused","setIsFocused","editorRect","editingAddress","matchingCells","matchingCellIndex","searchQuery","largeEditorRef","searchInputRef","editingOnEnter","sheetId","dragging","renderOverlays","editing","rect","handleOptionMouseDown","policy","handleSelect","useEffect","setEditingAddress","expandInput","rowId","y2r","address","x2c","currentString","before","setBefore","writeCell","write","selectValue","selectedIndex","newValue","newCursor","setInputting","t","updateSheet","resetInput","height","numLines","isKeyDown","setIsKeyDown","handleKeyDown","handleFormulaQuoteAutoClose","isFunction","walk","insertTextAtCursor","dblclick","_c","clear","_d","escape","setSearchQuery","arrow","select","copy","areaToZone","setEntering","redo","_f","_e","cut","undo","prevention","handleFocus","handleDoubleClick","length","handleBlur","isRefInsertable","handleChange","handlePaste","paste","handleKeyUpInternal","selectingArea","editorStyle","setEditorHovering","TokenSpan","memo","tokenKey","color","prevProps","nextProps","palletIndex","exists","formulaHash","hash","char","normalizedToken","existsIndex","COLOR_PALETTE","PluginContext","useInitialPluginContext","setStore","apply","setApply","usePluginContext","ctx","PluginBase","context","provided","StoreObserver","sheetName","sheetHeight","sheetWidth","storeRef","sheetReactive","registry","pluginProvided","pluginContext","Resizer","posY","posX","leftHeaderSelecting","topHeaderSelecting","mainRef","startY","endY","startX","endX","offsetY","offsetX","baseWidth","DEFAULT_WIDTH","baseHeight","DEFAULT_HEIGHT","bottom","right","diff","xs","between","makeSequence","p2a","ys","setResizingPositionY","setResizingPositionX","MIN_HEIGHT","MIN_WIDTH","Emitter","pointing","zone","copier","cutter","paster","items","item","undoer","redoer","rowsInserterAbove","numRows","zoneShape","insertRowsAbove","rowsInserterBelow","insertRowsBelow","colsInserterLeft","numCols","insertColsLeft","colsInserterRight","insertColsRight","rowsRemover","removeRows","colsRemover","removeCols","rowsSorterAsc","sortRows","rowsSorterDesc","rowsFilterer","filter","filterRows","rowsFilterClearer","rowSortFixedToggler","addr","rowCell","next","rowFilterFixedToggler","searcher","applyers","rowInsertCount","selStart","selEnd","colInsertCount","defaultContextMenuDescriptors","colCell","defaultRowMenuDescriptors","n","defaultColMenuDescriptors","buildMenuContext","close","props","_insertRowsAbove","_insertRowsBelow","_removeRows","_insertColsLeft","_insertColsRight","_removeCols","direction","label","_setStore","_menuComponentRegistry","registerMenuComponent","id","component","getMenuComponent","MenuItem","shortcuts","disabled","checked","testId","onClick","hasCheck","shortcut","part","arr","MenuDivider","ContextMenu","contextMenuPosition","contextMenu","menuRef","setContextMenuPosition","METHOD_LABELS","NO_VALUE_METHODS","DEFAULT_CONDITION","FilterSection","onWaiting","conditions","setConditions","setMode","pending","setPending","firstValueRef","existing","handleCancel","cancelled","execute","actionX","validConditions","filterMode","currentSheet","updateCondition","patch","prev","addCondition","removeCondition","handleApplyFilter","valid","v","handleResetColumn","handleResetAll","filterDisabled","hasAnyFilter","cond","m","SortSection","sortDisabled","LabelSection","labelInputRef","setLabel","handleApplyLabel","labelDisabled","labelPlaceholder","getLabel","ColumnMenu","columnMenuState","colMenu","position","waitingState","setWaitingState","handleClose","setColumnMenu","handleWaiting","message","cancel","descriptor","Section","renderRowDescriptor","RowMenu","rowMenuState","rowMenu","setRowMenu","isTouching","mouseEvent","safePreventDefault","Cell","isFirstPointed","cellRef","errorTooltipPos","setErrorTooltipPos","autofillDraggingTo","xSheetFocused","isXSheetFocused","lastFocused","pointed","_setEditorRect","setEditorRect","errorMessage","rendered","FormulaError","isPendingCell","Pending","editingAnywhere","handleDragStart","choose","drag","setDragging","fullAddress","insertRef","handleDragEnd","submitAutofill","handleDragging","setAutofillDraggingTo","newArea","fullRange","areaToRange","handleAutofillMouseDown","handleErrorTriangleEnter","calcBelowPosition","handleErrorTriangleLeave","onContextMenu","onDoubleClick","autofillDragClass","among","hAlignTransform","acceleration","maxSpeed","lastScrollTime","currentSpeed","ScrollHandle","horizontal","vertical","scrollRef","tabularRef","isScrolling","getDestEdge","tabularRect","getAreaInTabular","scrollStep","now","curY","curX","sheetPrefix","sheetRange","handleMouseEnter","stopScroll","isFocus","handleMouseUp","handleMouseUpWrapper","handleMouseLeave","HeaderCellTop","colId","col","hasFilter","handleResizeMouseDown","selectCols","useDebounceCallback","displayedLabel","btn","pressX","pressY","HeaderCellLeft","selectRows","handleContextMenu","COLOR_POINTED","COLOR_SELECTED","SELECTING_FILL","COLOR_COPYING","COLOR_CUTTING","SEARCH_MATCHING_BACKGROUND","COLOR_SEARCH_MATCHING","COLOR_AUTOFILL","fillRect","drawRect","lineWidth","dashPattern","fillColor","drawAreaRectViewport","scrollTop","scrollLeft","viewW","viewH","topLeft","getCellRectPositions","bottomRight","x1","y1","x2","y2","CellStateOverlay","refs","canvasRef","rafIdRef","drawCanvas","canvas","container","dpr","w","headerW","headerH","autofill","Autofill","pos","vx","vy","copyingSheetId","copyingZone","cutting","copyingArea","palette","refArea","a2p","isCurrentMatch","backgroundColor","drawLeft","drawWidth","drawTop","drawHeight","scheduleDrawCanvas","handleScroll","Tabular","setPalette","virtualized","setVirtualized","handleMouseMove","virtualize","handleSelectAllClick","paletteBySheetName","normalizedRef","stripAddressAbsolute","splitterIndex","stripped","stripSheetName","upperRef","preventSafariBounce","mergedRefs","_g","_h","FormulaBar","ready","editingCell","hlRef","spilledFromAddress","originPoint","originAddress","observer","entries","updateScroll","largeInput","handleInput","Base","size","SearchIcon","CloseIcon","SearchBar","rootRef","searchCaseSensitive","searchRegex","searchRange","matchingCell","smartScroll","handleProgressClick","handleSearchClick","search","handleCaseSensitiveClick","setSearchCaseSensitive","handleRegexClick","setSearchRegex","hasSelection","isZoneNotSelected","selectionLabel","handleRangeClick","setSearchRange","searchRangeLabel","handleCloseClick","createSheetRef","createRef","useSheetRef","createStoreRef","useStoreRef","GridSheet","initialCells","initialSheetRef","initialStoreRef","options","initialBook","sheetResize","showFormulaBar","flashRef","internalSheetRef","internalStoreRef","internalBook","useBook","book","initialState","limits","Sheet","useReducer","defaultReducer","embedStyle","setSheetHeight","estimateSheetHeight","setSheetWidth","estimateSheetWidth","intervalId","auto","getMaxSizesFromCells","estimatedHeight","HEADER_HEIGHT","DEFAULT_ROW_KEY","SHEET_HEIGHT","estimatedWidth","HEADER_WIDTH","DEFAULT_COL_KEY","SHEET_WIDTH","CheckboxPolicyMixin","makeBorder","all"],"mappings":"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"}