@gridsheet/react-core 3.2.0 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/components/AsyncProgressOverlay.d.ts +14 -0
  2. package/dist/components/AsyncProgressOverlay.d.ts.map +1 -0
  3. package/dist/components/Cell.d.ts.map +1 -1
  4. package/dist/components/CellStateOverlay.d.ts.map +1 -1
  5. package/dist/components/ColumnMenu.d.ts.map +1 -1
  6. package/dist/components/ColumnMenuLabelSection.d.ts.map +1 -1
  7. package/dist/components/ContextMenu.d.ts.map +1 -1
  8. package/dist/components/Editor.d.ts.map +1 -1
  9. package/dist/components/FormulaBar.d.ts.map +1 -1
  10. package/dist/components/FunctionGuide.d.ts +1 -1
  11. package/dist/components/FunctionGuide.d.ts.map +1 -1
  12. package/dist/components/GridSheet.d.ts +1 -1
  13. package/dist/components/GridSheet.d.ts.map +1 -1
  14. package/dist/components/HeaderCellTop.d.ts.map +1 -1
  15. package/dist/components/MenuNodes.d.ts +28 -0
  16. package/dist/components/MenuNodes.d.ts.map +1 -0
  17. package/dist/components/ProgressOverlay.d.ts +18 -0
  18. package/dist/components/ProgressOverlay.d.ts.map +1 -0
  19. package/dist/components/RowMenu.d.ts.map +1 -1
  20. package/dist/components/ScrollHandle.d.ts.map +1 -1
  21. package/dist/components/StoreObserver.d.ts.map +1 -1
  22. package/dist/components/Tabular.d.ts.map +1 -1
  23. package/dist/components/useAutocomplete.d.ts +1 -1
  24. package/dist/components/useAutocomplete.d.ts.map +1 -1
  25. package/dist/hooks-Bt6-NgDa.mjs +6784 -0
  26. package/dist/hooks-Bt6-NgDa.mjs.map +1 -0
  27. package/dist/index.d.ts +5 -3
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +2244 -2076
  30. package/dist/index.js.map +1 -1
  31. package/dist/lib/clipboard.d.ts +1 -1
  32. package/dist/lib/clipboard.d.ts.map +1 -1
  33. package/dist/lib/hooks.d.ts +1 -1
  34. package/dist/lib/hooks.d.ts.map +1 -1
  35. package/dist/lib/menu.d.ts +17 -4
  36. package/dist/lib/menu.d.ts.map +1 -1
  37. package/dist/policy/checkbox.d.ts +1 -1
  38. package/dist/policy/checkbox.d.ts.map +1 -1
  39. package/dist/spellbook.d.ts +3 -3
  40. package/dist/spellbook.d.ts.map +1 -1
  41. package/dist/spellbook.js +4 -5
  42. package/dist/spellbook.js.map +1 -1
  43. package/dist/store/actions.d.ts +56 -1
  44. package/dist/store/actions.d.ts.map +1 -1
  45. package/dist/store/helpers.d.ts +1 -1
  46. package/dist/store/helpers.d.ts.map +1 -1
  47. package/dist/types.d.ts +19 -2
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +3 -3
  50. package/dist/hooks-CvkA2lFB.mjs +0 -1186
  51. package/dist/hooks-CvkA2lFB.mjs.map +0 -1
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, useRef, 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 composingRef = useRef(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 (e.nativeEvent.isComposing || composingRef.current) {\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 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 } 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 onCompositionStart={() => {\n composingRef.current = true;\n if (!editing) {\n dispatch(setEditingAddress(address));\n dispatch(setInputting(''));\n }\n }}\n onCompositionEnd={(e) => {\n composingRef.current = false;\n dispatch(setInputting(e.currentTarget.value));\n }}\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 = Omit<OptionsType, 'sheetHeight' | 'sheetWidth'> & {\n // GridSheet always passes the resolved pixel size here, even in string-based fill mode.\n sheetHeight?: number;\n sheetWidth?: number;\n fixedWidth?: boolean;\n fixedHeight?: boolean;\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 fixedWidth,\n fixedHeight,\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 dispatch(setStore({ fixedWidth: !!fixedWidth, fixedHeight: !!fixedHeight }));\n }, [fixedWidth, fixedHeight]);\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 textAlign: cell?.style?.textAlign || 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\n className=\"gs-cell-rendered\"\n style={\n cell?.alignItems\n ? {\n display: 'flex',\n flexDirection: 'column',\n justifyContent:\n cell.alignItems === 'center' ? 'center' : cell.alignItems === 'end' ? 'flex-end' : undefined,\n }\n : undefined\n }\n >\n {rendered}\n </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 // The directional auto-scroll strips (right/bottom/left/top edges) sit on top of the\n // grid (zIndex). At an edge where there is nothing left to scroll to, such a strip only\n // gets in the way — e.g. it covers the rightmost column's cells, so dragging the\n // autofill handle straight down stays over the strip and never reaches the cells below.\n // Only render a directional strip while it can actually scroll in that direction; the\n // beyond-edge catch-all handle (horizontal === 0 && vertical === 0) always renders.\n const t = tabularRef.current;\n const cannotScrollHere =\n !!t &&\n ((horizontal > 0 && t.scrollLeft + t.clientWidth >= t.scrollWidth - 1) ||\n (horizontal < 0 && t.scrollLeft <= 0) ||\n (vertical > 0 && t.scrollTop + t.clientHeight >= t.scrollHeight - 1) ||\n (vertical < 0 && t.scrollTop <= 0));\n\n if (!editorRef.current || (!dragging && !autofillDraggingTo) || cannotScrollHere) {\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 >\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 >\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 // The Sheet instance is mutated in place, so its identity stays stable across structural\n // changes (insert/remove rows & cols, resize, sort, filter). Depend on its monotonic version\n // so the overlay redraws when the grid layout shifts; otherwise the old box stays misaligned.\n sheet?.currentVersion,\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 const ro = new ResizeObserver(() => drawCanvas());\n ro.observe(container);\n return () => {\n container.removeEventListener('scroll', handleScroll);\n ro.disconnect();\n };\n }, [tabularRef, handleScroll, drawCanvas]);\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 fixedWidth,\n fixedHeight,\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 // Mark on .gs-main whether the grid overflows the viewport per axis, so the matrix outer\n // border hugs the content when it fits (border on the inner) and switches to a fixed\n // viewport overlay when it scrolls. Runs after every render (so it always catches the\n // ready flip, content growth and size changes) but reads layout inside rAF — after paint\n // — so it never blocks the render/paint the way a synchronous reflow would, and only\n // writes the attribute when the value actually changes.\n useEffect(() => {\n const t = tabularRef.current;\n const m = mainRef.current;\n if (!t || !m) {\n return;\n }\n const raf = requestAnimationFrame(() => {\n const ox = String(t.scrollWidth > t.clientWidth + 1);\n const oy = String(t.scrollHeight > t.clientHeight + 1);\n if (m.getAttribute('data-overflow-x') !== ox) {\n m.setAttribute('data-overflow-x', ox);\n }\n if (m.getAttribute('data-overflow-y') !== oy) {\n m.setAttribute('data-overflow-y', oy);\n }\n });\n return () => cancelAnimationFrame(raf);\n });\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 }, [\n tabularRef.current,\n sheetReactive,\n mainRef.current?.clientHeight,\n mainRef.current?.clientWidth,\n sheetHeight,\n sheetWidth,\n ]);\n\n useEffect(() => {\n const el = tabularRef.current;\n if (!el) {\n return;\n }\n return preventSafariBounce(el);\n }, [sheetReactive]);\n\n // Eager resolution: virtualization only renders/solves visible cells, so\n // off-screen async formulas would never fire. When the sheet opts in via\n // `eager`, fire every off-screen async cell after each update. resolveAll()\n // is idempotent — resolved/pending cells are cache hits — so it converges\n // once all async formulas have settled.\n useEffect(() => {\n if (!sheet || !sheet.eager || !sheet.registry.ready) {\n return;\n }\n sheet.resolveAll();\n }, [sheet, 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 // When a size is explicitly configured, keep that box so a smaller grid can be\n // centered within it (see .gs-tabular in tabular.less); otherwise shrink to fit.\n width:\n sheetWidth === -1 ? undefined : fixedWidth ? sheetWidth : Math.min(sheetWidth, sheet.totalWidth),\n height:\n sheetHeight === -1 ? undefined : fixedHeight ? sheetHeight : Math.min(sheetHeight, sheet.totalHeight),\n }}\n ref={tabularRef}\n onMouseMove={handleMouseMove}\n onScroll={handleScroll}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: sheet.totalWidth,\n height: sheet.totalHeight,\n overflow: 'clip',\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 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 composingRef = useRef(false);\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.nativeEvent as any).isComposing || composingRef.current) {\n return;\n }\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 onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={(e) => {\n composingRef.current = false;\n dispatch(setInputting(e.currentTarget.value));\n }}\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, useCallback } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { BorderSides, 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, isMutationAction } 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 {\n sheetResize,\n showFormulaBar = true,\n mode = 'light',\n density = 'compact',\n gridLines = 'all',\n formulaBarBorders = { all: true },\n matrixBorders = { all: true },\n } = options;\n // Translate the border config objects into CSS custom properties consumed by the\n // stylesheet (--gs-fb-* for the formula bar, --gs-mx-* for the matrix). A specific side\n // overrides `all`.\n const bw = (b: BorderSides, side: 'left' | 'top' | 'right' | 'bottom') =>\n (b[side] ?? b.all ?? false) ? '1px' : '0';\n const borderVars = {\n '--gs-fb-bl': bw(formulaBarBorders, 'left'),\n '--gs-fb-bt': bw(formulaBarBorders, 'top'),\n '--gs-fb-br': bw(formulaBarBorders, 'right'),\n '--gs-fb-bb': bw(formulaBarBorders, 'bottom'),\n '--gs-mx-bl': bw(matrixBorders, 'left'),\n '--gs-mx-bt': bw(matrixBorders, 'top'),\n '--gs-mx-br': bw(matrixBorders, 'right'),\n '--gs-mx-bb': bw(matrixBorders, 'bottom'),\n } as CSSProperties;\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, eager } = options;\n const sheet = new Sheet({\n limits,\n name: sheetName,\n registry,\n eager,\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 fixedWidth: false,\n fixedHeight: false,\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 // When sheetWidth/sheetHeight is a string, the sheet stretches to its parent (fill mode)\n // and the rendered pixel size is measured via ResizeObserver instead of being fixed.\n const fillWidth = typeof options.sheetWidth === 'string';\n const fillHeight = typeof options.sheetHeight === 'string';\n // matrixAlignment picks which axes may center. A fixed box (that a smaller grid centers\n // within) only exists when the size is *intentionally* larger than the content — an\n // explicit sheetWidth/sheetHeight, or a manual resize — never from the content estimate\n // or the formula-bar width, so nothing but those produces an empty gap. 'none' keeps the\n // old shrink-to-content behavior.\n const matrixAlignment = options.matrixAlignment ?? 'none';\n const centersWidth = matrixAlignment === 'horizontal' || matrixAlignment === 'both';\n const centersHeight = matrixAlignment === 'vertical' || matrixAlignment === 'both';\n const [resizedWidth, setResizedWidth] = useState(false);\n const [resizedHeight, setResizedHeight] = useState(false);\n const fixedWidth = centersWidth && (options.sheetWidth != null || resizedWidth);\n const fixedHeight = centersHeight && (options.sheetHeight != null || resizedHeight);\n const [sheetHeight, setSheetHeight] = useState(\n typeof options?.sheetHeight === 'number' ? options.sheetHeight : estimateSheetHeight(initialCells),\n );\n const [sheetWidth, setSheetWidth] = useState(\n typeof options?.sheetWidth === 'number' ? options.sheetWidth : estimateSheetWidth(initialCells),\n );\n useEffect(() => {\n const el = mainRef.current;\n if (!el) {\n return;\n }\n let first = true;\n const ro = new ResizeObserver(() => {\n // CSS `resize` writes an inline width/height when the user drags the handle; that is\n // the signal that the box was intentionally sized, so a smaller grid may now center.\n if (el.style.width) {\n setResizedWidth(true);\n }\n if (el.style.height) {\n setResizedHeight(true);\n }\n if (first) {\n first = false;\n // In fill mode we want the initial measurement; otherwise keep the provided/estimated size.\n if (!fillWidth && !fillHeight) {\n return;\n }\n }\n const root = rootRef.current;\n setSheetHeight(root ? Math.min(el.clientHeight, root.clientHeight) : el.clientHeight);\n setSheetWidth(root ? Math.min(el.clientWidth, root.clientWidth) : el.clientWidth);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [fillWidth, fillHeight]);\n useEffect(() => {\n if (typeof options.sheetHeight === 'number') {\n setSheetHeight(options.sheetHeight);\n }\n }, [options.sheetHeight]);\n useEffect(() => {\n if (typeof options.sheetWidth === 'number') {\n setSheetWidth(options.sheetWidth);\n }\n }, [options.sheetWidth]);\n\n const [loading, setLoading] = useState(false);\n\n // Remove loading after React re-render completes\n useEffect(() => {\n if (loading) {\n setLoading(false);\n }\n });\n\n const wrappedDispatch = useCallback(\n ((action: { type: number; value: any }) => {\n if (!isMutationAction(action.type)) {\n (dispatch as any)(action);\n return;\n }\n setLoading(true);\n // Defer dispatch to next frame so the loading overlay can paint first\n requestAnimationFrame(() => {\n (dispatch as any)(action);\n });\n }) as typeof dispatch,\n [dispatch],\n );\n\n return (\n <Context.Provider value={{ store, dispatch: wrappedDispatch }}>\n <div\n className={`gs-root1 ${registry.ready ? 'gs-initialized' : ''}`}\n ref={rootRef}\n data-sheet-name={sheetName}\n data-mode={mode}\n data-density={density}\n data-gridlines={gridLines}\n data-matrix-align={matrixAlignment}\n data-rows={store.sheetReactive.current?.numRows ?? 0}\n data-cols={store.sheetReactive.current?.numCols ?? 0}\n style={\n fillWidth || fillHeight\n ? {\n ...borderVars,\n // inline-flex (when width isn't filled) keeps the prior shrink-to-content width.\n display: fillWidth ? 'flex' : 'inline-flex',\n flexDirection: 'column',\n ...(fillWidth ? { width: options.sheetWidth as string } : null),\n ...(fillHeight ? { height: options.sheetHeight as string } : null),\n }\n : borderVars\n }\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 ...(fillWidth ? { width: '100%' } : null),\n maxWidth: '100%',\n // In fill-height mode the parent's height is the limit (flex:1 fills the remaining\n // space below the formula bar); otherwise cap at the viewport bottom as before.\n ...(fillHeight\n ? { flex: 1, minHeight: 0, maxHeight: '100%' }\n : {\n maxHeight: mainRef.current\n ? window.innerHeight - mainRef.current.getBoundingClientRect().top\n : (store.sheetReactive.current?.fullHeight || 0) + 2,\n }),\n resize: sheetResize,\n ...style,\n }}\n >\n <Editor mode={mode} />\n <Tabular />\n <StoreObserver\n {...{ ...options, sheetHeight, sheetWidth, fixedWidth, fixedHeight, sheetName, sheetRef, storeRef }}\n />\n <ContextMenu />\n <ColumnMenu />\n <RowMenu />\n <Resizer />\n <Emitter />\n {loading && (\n <div className=\"gs-loading-overlay\">\n <div className=\"gs-loading-spinner\" />\n </div>\n )}\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","composingRef","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","fixedWidth","fixedHeight","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","cannotScrollHere","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","ro","Tabular","setPalette","virtualized","setVirtualized","raf","ox","oy","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","density","gridLines","formulaBarBorders","matrixBorders","bw","side","borderVars","flashRef","internalSheetRef","internalStoreRef","internalBook","useBook","book","initialState","limits","eager","Sheet","useReducer","defaultReducer","embedStyle","fillWidth","fillHeight","matrixAlignment","centersWidth","centersHeight","resizedWidth","setResizedWidth","resizedHeight","setResizedHeight","setSheetHeight","estimateSheetHeight","setSheetWidth","estimateSheetWidth","first","root","loading","setLoading","wrappedDispatch","action","isMutationAction","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/ProgressOverlay.tsx","../src/components/AsyncProgressOverlay.tsx","../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/MenuNodes.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 type { FC } from 'react';\n\nexport type ProgressOverlayProps = {\n /** 0..1 for a determinate bar; null/undefined for an indeterminate spinner. */\n progress?: number | null;\n /** Text shown before the percentage (e.g. \"Loading\", \"Saving\", \"Pasting\"). */\n label?: string;\n};\n\n/**\n * Shared progress overlay: a centered card with a spinner + label, plus a determinate bar\n * when `progress` is given. One component for initial loading, save, and chunked async\n * mutations so every progress indicator looks and behaves the same. It spans its (positioned)\n * container to capture pointer events — blocking interaction while work runs — but does NOT\n * dim, so the grid stays visible behind it. Drive it with a prop for cheap/occasional updates\n * (load/save); for a high-frequency mutation tick use AsyncProgressOverlay's imperative handle\n * so a tick re-renders only the overlay, not the grid.\n */\nexport const ProgressOverlay: FC<ProgressOverlayProps> = ({ progress, label = 'Loading' }) => {\n const determinate = progress != null;\n const pct = determinate ? Math.max(0, Math.min(100, Math.round(progress * 100))) : 0;\n return (\n <div className=\"gs-progress-overlay\">\n <div className=\"gs-progress-box\">\n <div className=\"gs-progress-head\">\n <span className=\"gs-loading-spinner\" />\n <span>{determinate ? `${label}… ${pct}%` : `${label}…`}</span>\n </div>\n {determinate && (\n <div className=\"gs-progress-track\">\n <div className=\"gs-progress-fill\" style={{ width: `${pct}%` }} />\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { forwardRef, useImperativeHandle, useState } from 'react';\nimport { ProgressOverlay } from './ProgressOverlay';\n\nexport type AsyncProgressHandle = {\n setProgress: (ratio: number) => void;\n};\n\n/**\n * Determinate progress overlay for a chunked async mutation (large fill/paste). Its progress\n * is driven IMPERATIVELY (via the ref) so that a progress tick re-renders only this small\n * component — not the whole grid. Routing progress through the store instead made every tick\n * re-render the (expensive, at deep scroll) grid, so a million-cell fill spent most of its\n * time re-rendering. The visuals come from the shared ProgressOverlay.\n */\nexport const AsyncProgressOverlay = forwardRef<AsyncProgressHandle, { label: string }>(({ label }, ref) => {\n const [progress, setProgress] = useState(0);\n useImperativeHandle(ref, () => ({ setProgress }), []);\n return <ProgressOverlay progress={progress} label={label} />;\n});\n","import React, { useContext, useLayoutEffect, useRef } from 'react';\nimport type { FunctionHelp } from '@gridsheet/web';\nimport type { AutocompleteOption } from '@gridsheet/web';\nimport { Context } from '../store';\nimport { calcSideStyle, clampPopup } from '@gridsheet/web';\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/web';\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/web';\nimport type { Sheet, UserSheet } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\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/web';\nimport type { FunctionMapping } from '@gridsheet/web';\nimport type { AutocompleteOption } from '@gridsheet/web';\nimport { Lexer } from '@gridsheet/web';\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, useRef, memo } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FunctionGuide } from './FunctionGuide';\nimport { EditorOptions } from './EditorOptions';\nimport { x2c, y2r } from '@gridsheet/web';\nimport { clip } from '../lib/clipboard';\nimport {\n clear,\n escape,\n select,\n selectToDataEdge,\n fillDown,\n fillRight,\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/web';\nimport { operations as prevention } from '@gridsheet/web';\nimport {\n expandInput,\n insertTextAtCursor,\n isFocus,\n isRefInsertable,\n resetInput,\n handleFormulaQuoteAutoClose,\n} from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\nimport { Lexer } from '@gridsheet/web';\nimport { COLOR_PALETTE } from '@gridsheet/web';\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 composingRef = useRef(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 // Portaled to <body>, outside .gs-root1 / .gs-editor, so carry data-mode\n // here too — otherwise the theme-specific styles (e.g. the dark function\n // guide) never match and the help renders with the light palette.\n <div className=\"gs-editor-portal\" data-mode={mode}>\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 </div>,\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 (e.nativeEvent.isComposing || composingRef.current) {\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 if ((e.ctrlKey || e.metaKey) && shiftKey) {\n e.preventDefault();\n dispatch(selectToDataEdge({ deltaY: 0, deltaX: -1 }));\n return false;\n }\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 if ((e.ctrlKey || e.metaKey) && shiftKey) {\n e.preventDefault();\n dispatch(selectToDataEdge({ deltaY: -1, deltaX: 0 }));\n return false;\n }\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 if ((e.ctrlKey || e.metaKey) && shiftKey) {\n e.preventDefault();\n dispatch(selectToDataEdge({ deltaY: 0, deltaX: 1 }));\n return false;\n }\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 // Ctrl/Cmd+Shift+arrow: extend the selection to the data-block edge (no drag).\n if ((e.ctrlKey || e.metaKey) && shiftKey) {\n e.preventDefault();\n dispatch(selectToDataEdge({ deltaY: 1, deltaX: 0 }));\n return false;\n }\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 'd': // D — fill down (Excel/Sheets Ctrl+D). Overrides the browser bookmark.\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(fillDown(null));\n requestAnimationFrame(() => dispatch(setInputting(''))); // reset the textarea\n return false;\n }\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 — fill right (Excel/Sheets Ctrl+R). Overrides the browser reload.\n if (e.ctrlKey || e.metaKey) {\n if (!editing) {\n e.preventDefault();\n dispatch(fillRight(null));\n requestAnimationFrame(() => dispatch(setInputting(''))); // reset the textarea\n return false;\n }\n }\n break;\n case 'y': // Y — redo (Ctrl+Shift+Z also redoes)\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 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 } 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 onCompositionStart={() => {\n composingRef.current = true;\n if (!editing) {\n dispatch(setEditingAddress(address));\n dispatch(setInputting(''));\n }\n }}\n onCompositionEnd={(e) => {\n composingRef.current = false;\n dispatch(setInputting(e.currentTarget.value));\n }}\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, submitAutofill, setDragging, setAutofillDraggingTo, drag } from '../store/actions';\n\nimport { usePluginContext } from './PluginBase';\nimport { Sheet } from '@gridsheet/web';\n\ntype StoreObserverProps = Omit<OptionsType, 'sheetHeight' | 'sheetWidth'> & {\n // GridSheet always passes the resolved pixel size here, even in string-based fill mode.\n sheetHeight?: number;\n sheetWidth?: number;\n fixedWidth?: boolean;\n fixedHeight?: boolean;\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 fixedWidth,\n fixedHeight,\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 // Drag-during-scroll + robust drag-end. A capture-phase mousemove tracks the\n // cursor (Tabular stopPropagations mousemove, so bubble listeners never see it over\n // the grid). While a drag is active and the cursor is at/past a container edge (incl.\n // over the toolbar below the grid) an rAF loop scrolls and extends the selection to\n // the cell now under the cursor — but ONLY when that cell CHANGES, so holding at the\n // bottom dispatches nothing (no re-render/edit flood, no freeze). A capture mouseup\n // (and a button-up mousemove for releases we never got a mouseup for) ends it exactly\n // once and submits/clears, so autofillDraggingTo can never stay set and block clicks.\n const dragRef = useRef({ store, dispatch });\n dragRef.current = { store, dispatch };\n useEffect(() => {\n let raf = 0;\n let running = false;\n let dead = false;\n let cx = 0;\n let cy = 0;\n let lastCell = '';\n let lastExtend = 0;\n const EDGE = 0;\n const SPEED = 18;\n\n const stop = () => {\n running = false;\n cancelAnimationFrame(raf);\n };\n\n const finish = () => {\n if (dead) {\n return;\n }\n dead = true;\n stop();\n const { store: s, dispatch: d } = dragRef.current;\n if (s.autofillDraggingTo) {\n d(submitAutofill(s.autofillDraggingTo));\n }\n if (s.dragging) {\n d(setDragging(false));\n }\n };\n\n const tick = () => {\n if (dead || !running) {\n return;\n }\n const { store: s, dispatch: d } = dragRef.current;\n const el = s.tabularRef?.current;\n if (!el || !(s.dragging || s.autofillDraggingTo)) {\n running = false;\n return;\n }\n const r = el.getBoundingClientRect();\n const dy = cy > r.bottom - EDGE ? SPEED : cy < r.top + EDGE ? -SPEED : 0;\n const dx = cx > r.right - EDGE ? SPEED : cx < r.left + EDGE ? -SPEED : 0;\n if (dy || dx) {\n el.scrollTop += dy;\n el.scrollLeft += dx;\n const px = Math.min(Math.max(cx, r.left + 1), r.right - 1);\n const py = Math.min(Math.max(cy, r.top + 1), r.bottom - 1);\n const cell = (document.elementFromPoint(px, py) as HTMLElement | null)?.closest('.gs-cell') as HTMLElement | null;\n if (cell) {\n const y = Number(cell.dataset.y);\n const x = Number(cell.dataset.x);\n const key = y + ':' + x;\n const now = performance.now();\n // Dispatch only when the target cell CHANGES (holding still — e.g. at the\n // bottom over the toolbar — dispatches nothing → no freeze) AND at most every\n // 80ms (so a fast scroll doesn't re-render every frame and starve mousemove,\n // which would freeze `cy` and make the scroll unstoppable).\n if (!Number.isNaN(y) && !Number.isNaN(x) && key !== lastCell && now - lastExtend > 80) {\n lastCell = key;\n lastExtend = now;\n d(s.autofillDraggingTo ? setAutofillDraggingTo({ x, y }) : drag({ y, x }));\n }\n }\n }\n raf = requestAnimationFrame(tick);\n };\n\n const onMove = (e: MouseEvent) => {\n if (e.buttons === 0) {\n // Button up. End the drag once (covers a release we never got a mouseup for).\n const { store: s } = dragRef.current;\n if (!dead && (running || s.autofillDraggingTo != null || s.dragging)) {\n finish();\n }\n return;\n }\n cx = e.clientX;\n cy = e.clientY;\n const { store: s } = dragRef.current;\n if (!dead && !running && (s.dragging || s.autofillDraggingTo)) {\n running = true;\n lastCell = '';\n raf = requestAnimationFrame(tick);\n }\n };\n\n const onDown = () => {\n dead = false;\n };\n\n // onUp is the SOLE authority for ending a mouse drag. It is a capture-phase\n // WINDOW listener, so it fires on every mouseup before anything can stopPropagation\n // it — strictly more reliable than a cell's own onMouseUp, which in the VS Code\n // webview did NOT clear autofillDraggingTo when the release landed on a cell (it\n // stayed set and blocked every later click + froze scrolling). We submit/clear here\n // from the live store; the cell's handleDragEnd no longer submits, so there is no\n // double-fill despite this firing first (capture) then the cell's handler (bubble).\n const onUp = () => {\n dead = true;\n stop();\n const { store: s, dispatch: d } = dragRef.current;\n if (s.autofillDraggingTo) {\n d(submitAutofill(s.autofillDraggingTo));\n }\n if (s.dragging) {\n d(setDragging(false));\n }\n };\n\n // A drag can end WITHOUT a mouseup we ever see: the user drags the autofill\n // handle past the grid, out of the webview/window entirely, and releases there.\n // No mouseup → the old code left dragging/autofillDraggingTo stuck and the\n // rAF loop scrolling+extending forever. Ending the drag when the pointer leaves\n // the document (mouseleave) or the window loses focus (blur) closes that hole.\n // Scrolling OVER the in-grid toolbar still works: that stays inside the document,\n // so neither fires until the cursor exits the webview.\n const onLeaveWindow = () => finish();\n\n window.addEventListener('mousedown', onDown, true);\n window.addEventListener('mousemove', onMove, true);\n window.addEventListener('mouseup', onUp, true);\n window.addEventListener('blur', onLeaveWindow);\n document.addEventListener('mouseleave', onLeaveWindow);\n return () => {\n window.removeEventListener('mousedown', onDown, true);\n window.removeEventListener('mousemove', onMove, true);\n window.removeEventListener('mouseup', onUp, true);\n window.removeEventListener('blur', onLeaveWindow);\n document.removeEventListener('mouseleave', onLeaveWindow);\n cancelAnimationFrame(raf);\n };\n }, []);\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 dispatch(setStore({ fixedWidth: !!fixedWidth, fixedHeight: !!fixedHeight }));\n }, [fixedWidth, fixedHeight]);\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/web';\nimport { zoneToArea, makeSequence, between } from '@gridsheet/web';\nimport type { CellsByAddressType } from '../types';\nimport { p2a } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\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/web';\nimport { focus } from '@gridsheet/web';\nimport { p2a } from '@gridsheet/web';\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/web';\nimport type { StoreType } from '../types';\nimport type { Dispatcher } from '../store';\nimport { operations as prevention } from '@gridsheet/web';\nimport { zoneShape } from '@gridsheet/web';\nimport { p2a } from '@gridsheet/web';\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\n/**\n * A menu entry that opens a nested flyout of child items on hover. `children` uses the same\n * descriptor shape (items, dividers, or further submenus), so menus can nest arbitrarily —\n * useful when a category (e.g. cell \"Format\") has more options than fit in one flat list.\n */\nexport type MenuSubmenuItem<Args extends unknown[] = []> = {\n type: 'submenu';\n id?: string;\n label: string | ((ctx: MenuContext, ...args: Args) => string);\n visible?: (ctx: MenuContext, ...args: Args) => boolean;\n disabled?: (ctx: MenuContext, ...args: Args) => boolean;\n children: (MenuDividerItem | MenuItemBase<Args> | MenuSubmenuItem<Args>)[];\n};\n\nexport type ContextMenuItemDescriptor = MenuDividerItem | MenuItemBase | MenuComponentItem | MenuSubmenuItem;\nexport type RowMenuItemDescriptor =\n | MenuDividerItem\n | MenuItemBase<[y: number]>\n | MenuComponentItem<[y: number]>\n | MenuSubmenuItem<[y: number]>;\nexport type ColMenuItemDescriptor =\n | MenuDividerItem\n | MenuItemBase<[x: number]>\n | MenuComponentItem<[x: number]>\n | MenuSubmenuItem<[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-label' },\n { type: 'divider' },\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];\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 { type FC, type ReactNode, useState, useRef, useLayoutEffect } from 'react';\nimport type { MenuContext } from '../lib/menu';\nimport { MenuItem, MenuDivider } from './MenuItem';\n\n// Loose structural view of a menu descriptor shared by all three menus (context/row/col).\n// The public descriptor unions in menu.ts stay type-safe per menu; this renderer takes the\n// trailing coordinate args generically (`[]` / `[x]` / `[y]`) so one implementation drives\n// items, dividers, registered components, and nested submenus for every menu.\nexport type MenuNode = {\n type?: 'item' | 'divider' | 'component' | 'submenu';\n id?: string;\n componentId?: string;\n label?: string | ((ctx: MenuContext, ...args: any[]) => string);\n shortcuts?: string[] | ((ctx: MenuContext, ...args: any[]) => string[]);\n visible?: (ctx: MenuContext, ...args: any[]) => boolean;\n disabled?: (ctx: MenuContext, ...args: any[]) => boolean;\n checked?: (ctx: MenuContext, ...args: any[]) => boolean;\n onClick?: (ctx: MenuContext, ...args: any[]) => void | Promise<void>;\n children?: MenuNode[];\n};\n\ntype MenuNodesProps = {\n items: MenuNode[];\n ctx: MenuContext;\n /** Trailing coordinate args passed after ctx to every callback: [] | [x] | [y]. */\n args: number[];\n /** Called after a leaf item is chosen, to close the whole menu. */\n onSelect: () => void;\n /** Renders a `type: 'component'` descriptor (e.g. the column menu's sort/filter sections). */\n renderComponent?: (componentId: string, key: number) => ReactNode;\n};\n\n/** Renders a list of menu descriptors (with nested submenu support) as `<li>` rows. */\nexport const MenuNodes: FC<MenuNodesProps> = ({ items, ctx, args, onSelect, renderComponent }) => {\n return (\n <>\n {items.map((d, i) => {\n if (d.type === 'divider') {\n if (d.visible && !d.visible(ctx, ...args)) {\n return null;\n }\n return <MenuDivider key={i} />;\n }\n if (d.type === 'component') {\n if (d.visible && !d.visible(ctx, ...args)) {\n return null;\n }\n return renderComponent && d.componentId ? renderComponent(d.componentId, i) : null;\n }\n if (d.visible && !d.visible(ctx, ...args)) {\n return null;\n }\n const label = typeof d.label === 'function' ? d.label(ctx, ...args) : (d.label ?? '');\n const disabled = d.disabled?.(ctx, ...args) ?? false;\n if (d.type === 'submenu') {\n return (\n <SubmenuNode\n key={i}\n label={label}\n disabled={disabled}\n testId={d.id}\n items={d.children ?? []}\n ctx={ctx}\n args={args}\n onSelect={onSelect}\n renderComponent={renderComponent}\n />\n );\n }\n const shortcuts = typeof d.shortcuts === 'function' ? d.shortcuts(ctx, ...args) : d.shortcuts;\n const checked = d.checked?.(ctx, ...args);\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={() => {\n d.onClick?.(ctx, ...args);\n onSelect();\n }}\n />\n );\n })}\n </>\n );\n};\n\ntype SubmenuNodeProps = {\n label: string;\n disabled: boolean;\n testId?: string;\n items: MenuNode[];\n ctx: MenuContext;\n args: number[];\n onSelect: () => void;\n renderComponent?: (componentId: string, key: number) => ReactNode;\n};\n\nconst SubmenuNode: FC<SubmenuNodeProps> = ({ label, disabled, testId, items, ctx, args, onSelect, renderComponent }) => {\n const [open, setOpen] = useState(false);\n const liRef = useRef<HTMLLIElement>(null);\n const flyoutRef = useRef<HTMLUListElement>(null);\n // The flyout is position:fixed and placed in viewport coordinates so it can never be\n // clipped by an ancestor. Preferred side is to the right of the parent row; it flips left\n // and clamps vertically when it would spill off the viewport. `null` until measured.\n const [pos, setPos] = useState<{ left: number; top: number } | null>(null);\n\n useLayoutEffect(() => {\n if (!open || disabled) {\n setPos(null);\n return;\n }\n const li = liRef.current;\n const fly = flyoutRef.current;\n if (!li || !fly) {\n return;\n }\n const p = li.getBoundingClientRect();\n const f = fly.getBoundingClientRect();\n const margin = 6;\n let left = p.right;\n if (left + f.width > window.innerWidth - margin) {\n left = p.left - f.width; // flip to the left of the parent\n if (left < margin) {\n left = Math.max(margin, window.innerWidth - f.width - margin);\n }\n }\n let top = p.top;\n if (top + f.height > window.innerHeight - margin) {\n top = window.innerHeight - f.height - margin;\n }\n if (top < margin) {\n top = margin;\n }\n setPos({ left, top });\n }, [open, disabled]);\n\n return (\n <li\n ref={liRef}\n className={`gs-menu-item gs-submenu-parent ${disabled ? 'gs-disabled' : 'gs-enabled'}`}\n data-testid={testId ? `${testId}-item` : undefined}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n // Clicking the parent row opens the flyout (so it also works without hover, e.g. touch)\n // but must never bubble to the menu backdrop, which would close the whole menu.\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n >\n <div className=\"gs-menu-name\">{label}</div>\n <span className=\"gs-submenu-arrow\">▸</span>\n {open && !disabled && (\n <ul\n ref={flyoutRef}\n className=\"gs-menu-items gs-submenu-flyout\"\n style={{\n position: 'fixed',\n left: pos ? pos.left : -9999,\n top: pos ? pos.top : -9999,\n visibility: pos ? 'visible' : 'hidden',\n }}\n >\n <MenuNodes items={items} ctx={ctx} args={args} onSelect={onSelect} renderComponent={renderComponent} />\n </ul>\n )}\n </li>\n );\n};\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 { MenuNodes, type MenuNode } from './MenuNodes';\nimport { clampPopup } from '@gridsheet/web';\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 <MenuNodes items={contextMenu as MenuNode[]} ctx={ctx} args={[]} onSelect={close} />\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/web';\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/web';\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/web';\nimport { x2c, p2a } from '@gridsheet/web';\nimport { getLabel } from '@gridsheet/web';\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 // When the menu was opened by double-clicking the header, jump straight into\n // renaming: focus the label input and select its text so a keystroke replaces\n // it. Double rAF so the controlled value has committed to the DOM before we\n // set the selection (otherwise React moves the caret to the end afterwards).\n if (store.columnMenuState?.focusLabel) {\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const input = labelInputRef.current;\n if (input) {\n input.focus();\n input.setSelectionRange(0, input.value.length);\n }\n }),\n );\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\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/web';\nimport { buildMenuContext } from '../lib/menu';\nimport { getMenuComponent } from '../lib/menu';\nimport { MenuNodes, type MenuNode } from './MenuNodes';\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 <MenuNodes\n items={colMenu as MenuNode[]}\n ctx={ctx}\n args={[x]}\n onSelect={() => dispatch(setColumnMenu(null))}\n renderComponent={(componentId, key) => {\n const Section = getMenuComponent(componentId);\n return Section ? <Section key={key} x={x} close={handleClose} onWaiting={handleWaiting} /> : null;\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/web';\nimport { buildMenuContext } from '../lib/menu';\nimport { MenuNodes, type MenuNode } from './MenuNodes';\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 <MenuNodes items={rowMenu as MenuNode[]} ctx={ctx} args={[y]} onSelect={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/web';\nimport { zoneToArea, among, areaToRange } from '@gridsheet/web';\nimport {\n choose,\n select,\n drag,\n write,\n setEditorRect,\n setContextMenuPosition,\n setAutofillDraggingTo,\n setEditingAddress,\n setDragging,\n setStore,\n} from '../store/actions';\n\nimport { Context } from '../store';\nimport { FormulaError } from '@gridsheet/web';\nimport { Pending } from '@gridsheet/web';\nimport { insertRef, isRefInsertable } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\nimport { isXSheetFocused } from '../store/helpers';\nimport type { FC, RefObject } from 'react';\nimport { isTouching, safePreventDefault } from '../lib/events';\nimport type { UserSheet } from '@gridsheet/web';\nimport { calcBelowPosition, hAlignTransform, type PopupPosition } from '@gridsheet/web';\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 // Autofill submit/clear is owned by StoreObserver's capture-phase window mouseup\n // (onUp) — the reliable place that always fires. Doing it here too would double-fill\n // (this bubble handler runs after onUp already cleared the store, with a stale\n // autofillDraggingTo closure). We only handle the formula-range-drag end.\n if (editingAnywhere) {\n dispatch(drag({ y: -1, x: -1 }));\n }\n },\n [editingAnywhere],\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 textAlign: cell?.style?.textAlign || 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\n className=\"gs-cell-rendered\"\n style={\n cell?.alignItems\n ? {\n display: 'flex',\n flexDirection: 'column',\n justifyContent:\n cell.alignItems === 'center' ? 'center' : cell.alignItems === 'end' ? 'flex-end' : undefined,\n }\n : undefined\n }\n >\n {rendered}\n </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/web';\nimport { insertRef, isFocus } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\nimport { areaToRange, zoneToArea } from '@gridsheet/web';\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 // The rAF scroll loop below closes over one render's props. When it dispatches\n // (re-render), the running loop keeps the OLD closure — including a stale, still-truthy\n // autofillDraggingTo — so it re-arms the autofill every frame. Read the LIVE store\n // through a ref instead, so the loop sees the drag end and stops.\n const storeRef = useRef(store);\n storeRef.current = store;\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 // The drag has ended (the mouseup landed off this strip, e.g. on a cell, or the\n // strip hid at the edge so its onMouseUp/onMouseLeave never fired). Stop now —\n // otherwise this loop keeps scrolling and re-dispatching setAutofillDraggingTo\n // forever, so the autofill can never be cleared and the grid can't be scrolled.\n const live = storeRef.current;\n if (!live.dragging && !live.autofillDraggingTo) {\n if (scrollRef.current !== null) {\n cancelAnimationFrame(scrollRef.current);\n scrollRef.current = null;\n }\n isScrolling = false;\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 (live.autofillDraggingTo) {\n const { y: curY, x: curX } = live.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 // The directional auto-scroll strips (right/bottom/left/top edges) sit on top of the\n // grid (zIndex). At an edge where there is nothing left to scroll to, such a strip only\n // gets in the way — e.g. it covers the rightmost column's cells, so dragging the\n // autofill handle straight down stays over the strip and never reaches the cells below.\n // Only render a directional strip while it can actually scroll in that direction; the\n // beyond-edge catch-all handle (horizontal === 0 && vertical === 0) always renders.\n const t = tabularRef.current;\n const cannotScrollHere =\n !!t &&\n ((horizontal > 0 && t.scrollLeft + t.clientWidth >= t.scrollWidth - 1) ||\n (horizontal < 0 && t.scrollLeft <= 0) ||\n (vertical > 0 && t.scrollTop + t.clientHeight >= t.scrollHeight - 1) ||\n (vertical < 0 && t.scrollTop <= 0));\n\n if (!editorRef.current || (!dragging && !autofillDraggingTo) || cannotScrollHere) {\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/web';\nimport { getLabel } from '@gridsheet/web';\nimport { between, zoneToArea } from '@gridsheet/web';\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/web';\nimport { operations as prevention } from '@gridsheet/web';\nimport { insertRef } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\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 onDoubleClick={(e) => {\n // Double-clicking the header opens the column menu straight into label\n // editing (label section is first, its input focused + all-selected).\n // Ignore double-clicks on the resizer or the ⋮ menu button.\n const target = e.target as HTMLElement;\n if (target.closest('.gs-resizer, .gs-menu-btn')) {\n return;\n }\n if (prevention.hasOperation(col?.prevention, prevention.ColumnMenu)) {\n return;\n }\n e.stopPropagation();\n const inner = (e.currentTarget as HTMLElement).querySelector('.gs-th-inner') as HTMLElement | null;\n const rect = (inner ?? (e.currentTarget as HTMLElement)).getBoundingClientRect();\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 }, focusLabel: true }));\n }}\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 >\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/web';\nimport { getLabel } from '@gridsheet/web';\nimport { between, zoneToArea } from '@gridsheet/web';\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/web';\nimport { operations as prevention } from '@gridsheet/web';\nimport { insertRef } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\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 >\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/web';\nimport { between } from '@gridsheet/web';\nimport { a2p } from '@gridsheet/web';\nimport { COLOR_PALETTE } from '@gridsheet/web';\nimport { Autofill } from '@gridsheet/web';\nimport { getCellRectPositions, getVisibleRowRange, getVisibleColRange, toVirtualScrollTop } from '@gridsheet/web';\nimport type { Sheet } from '@gridsheet/web';\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 // Vertical overlay math is all in virtual space (getCellRectPositions.top is virtual),\n // so map the DOM's capped physical scrollTop into virtual space. Horizontal columns\n // aren't remapped, so scrollLeft stays physical.\n const scrollTop = toVirtualScrollTop(sheet, container.scrollTop, container.clientHeight);\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 // Only visible rows/cols can produce an on-screen highlight, so bound the scans to the viewport range.\n // Iterating 1..numRows here made every overlay redraw (e.g. after inserting rows, which bumps the sheet\n // version) O(numRows) AND materialized every row-header cell via isRowFiltered — ~150ms at a million rows.\n const [firstCol, lastCol] = getVisibleColRange(sheet, scrollLeft, w);\n const [firstRow, lastRow] = getVisibleRowRange(sheet, scrollTop, h);\n\n // Top headers - draw bottom border and background\n for (let x = firstCol; x <= lastCol; 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 = firstRow; y <= lastRow; 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 // The Sheet instance is mutated in place, so its identity stays stable across structural\n // changes (insert/remove rows & cols, resize, sort, filter). Depend on its monotonic version\n // so the overlay redraws when the grid layout shifts; otherwise the old box stays misaligned.\n sheet?.currentVersion,\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 const ro = new ResizeObserver(() => drawCanvas());\n ro.observe(container);\n return () => {\n container.removeEventListener('scroll', handleScroll);\n ro.disconnect();\n };\n }, [tabularRef, handleScroll, drawCanvas]);\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, physicalScrollHeight } from '@gridsheet/web';\nimport { p2a, stripAddressAbsolute } from '@gridsheet/web';\nimport { Lexer, stripSheetName } from '@gridsheet/web';\nimport { ScrollHandle } from './ScrollHandle';\nimport { preventSafariBounce } from '@gridsheet/web';\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 fixedWidth,\n fixedHeight,\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 // Mark on .gs-main whether the grid overflows the viewport per axis, so the matrix outer\n // border hugs the content when it fits (border on the inner) and switches to a fixed\n // viewport overlay when it scrolls. Runs after every render (so it always catches the\n // ready flip, content growth and size changes) but reads layout inside rAF — after paint\n // — so it never blocks the render/paint the way a synchronous reflow would, and only\n // writes the attribute when the value actually changes.\n useEffect(() => {\n const t = tabularRef.current;\n const m = mainRef.current;\n if (!t || !m) {\n return;\n }\n const raf = requestAnimationFrame(() => {\n const ox = String(t.scrollWidth > t.clientWidth + 1);\n const oy = String(t.scrollHeight > t.clientHeight + 1);\n if (m.getAttribute('data-overflow-x') !== ox) {\n m.setAttribute('data-overflow-x', ox);\n }\n if (m.getAttribute('data-overflow-y') !== oy) {\n m.setAttribute('data-overflow-y', oy);\n }\n });\n return () => cancelAnimationFrame(raf);\n });\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 }, [\n tabularRef.current,\n sheetReactive,\n mainRef.current?.clientHeight,\n mainRef.current?.clientWidth,\n sheetHeight,\n sheetWidth,\n ]);\n\n useEffect(() => {\n const el = tabularRef.current;\n if (!el) {\n return;\n }\n return preventSafariBounce(el);\n }, [sheetReactive]);\n\n // Eager resolution: virtualization only renders/solves visible cells, so\n // off-screen async formulas would never fire. When the sheet opts in via\n // `eager`, fire every off-screen async cell after each update. resolveAll()\n // is idempotent — resolved/pending cells are cache hits — so it converges\n // once all async formulas have settled.\n useEffect(() => {\n if (!sheet || !sheet.eager || !sheet.registry.ready) {\n return;\n }\n sheet.resolveAll();\n }, [sheet, 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 // When a size is explicitly configured, keep that box so a smaller grid can be\n // centered within it (see .gs-tabular in tabular.less); otherwise shrink to fit.\n width:\n sheetWidth === -1 ? undefined : fixedWidth ? sheetWidth : Math.min(sheetWidth, sheet.totalWidth),\n height:\n sheetHeight === -1 ? undefined : fixedHeight ? sheetHeight : Math.min(sheetHeight, sheet.totalHeight),\n }}\n ref={tabularRef}\n onMouseMove={handleMouseMove}\n onScroll={handleScroll}\n >\n <div\n className={'gs-tabular-inner'}\n style={{\n width: sheet.totalWidth,\n // Physical scroll height is capped below the browser's ~2^24px precision limit;\n // virtualize() maps this back to the sheet's full virtual height (see SCROLL_CAP).\n height: physicalScrollHeight(sheet),\n overflow: 'clip',\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 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/web';\nimport { setEditingAddress, setInputting, setEditorHovering, walk, write, updateSheet } from '../store/actions';\nimport { operations as prevention } from '@gridsheet/web';\nimport { insertTextAtCursor, isFocus } from '@gridsheet/web';\nimport { focus } from '@gridsheet/web';\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 composingRef = useRef(false);\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.nativeEvent as any).isComposing || composingRef.current) {\n return;\n }\n if (e.ctrlKey || !sheet) {\n return true;\n }\n const input = e.currentTarget;\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 onCompositionStart={() => {\n composingRef.current = true;\n }}\n onCompositionEnd={(e) => {\n composingRef.current = false;\n dispatch(setInputting(e.currentTarget.value));\n }}\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/web';\nimport { isZoneNotSelected } from '@gridsheet/web';\n\nimport { Context } from '../store';\nimport { setSearchQuery, search, setSearchCaseSensitive, setSearchRegex, setSearchRange } from '../store/actions';\nimport { smartScroll } from '@gridsheet/web';\nimport { SearchIcon } from './svg/SearchIcon';\nimport { CloseIcon } from './svg/CloseIcon';\nimport { focus } from '@gridsheet/web';\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, useCallback } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { BorderSides, 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/web';\nimport { Context } from '../store';\nimport { reducer as defaultReducer, isMutationAction, isAsyncMutationAction, commitAsyncOp } from '../store/actions';\nimport { AsyncProgressOverlay, type AsyncProgressHandle } from './AsyncProgressOverlay';\nimport { ProgressOverlay } from './ProgressOverlay';\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/web';\nimport { Tabular } from './Tabular';\nimport { getMaxSizesFromCells } from '@gridsheet/web';\nimport { x2c, y2r } from '@gridsheet/web';\nimport { embedStyle } from '@gridsheet/web';\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 loading: loadingProp,\n}: Props) {\n const {\n sheetResize,\n showFormulaBar = true,\n mode = 'light',\n density = 'compact',\n gridLines = 'all',\n formulaBarBorders = { all: true },\n matrixBorders = { all: true },\n } = options;\n // Translate the border config objects into CSS custom properties consumed by the\n // stylesheet (--gs-fb-* for the formula bar, --gs-mx-* for the matrix). A specific side\n // overrides `all`.\n const bw = (b: BorderSides, side: 'left' | 'top' | 'right' | 'bottom') =>\n (b[side] ?? b.all ?? false) ? '1px' : '0';\n const borderVars = {\n '--gs-fb-bl': bw(formulaBarBorders, 'left'),\n '--gs-fb-bt': bw(formulaBarBorders, 'top'),\n '--gs-fb-br': bw(formulaBarBorders, 'right'),\n '--gs-fb-bb': bw(formulaBarBorders, 'bottom'),\n '--gs-mx-bl': bw(matrixBorders, 'left'),\n '--gs-mx-bt': bw(matrixBorders, 'top'),\n '--gs-mx-br': bw(matrixBorders, 'right'),\n '--gs-mx-bb': bw(matrixBorders, 'bottom'),\n } as CSSProperties;\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, eager } = options;\n const sheet = new Sheet({\n limits,\n name: sheetName,\n registry,\n eager,\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 fixedWidth: false,\n fixedHeight: false,\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 pendingAsyncOp: null,\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 // When sheetWidth/sheetHeight is a string, the sheet stretches to its parent (fill mode)\n // and the rendered pixel size is measured via ResizeObserver instead of being fixed.\n const fillWidth = typeof options.sheetWidth === 'string';\n const fillHeight = typeof options.sheetHeight === 'string';\n // matrixAlignment picks which axes may center. A fixed box (that a smaller grid centers\n // within) only exists when the size is *intentionally* larger than the content — an\n // explicit sheetWidth/sheetHeight, or a manual resize — never from the content estimate\n // or the formula-bar width, so nothing but those produces an empty gap. 'none' keeps the\n // old shrink-to-content behavior.\n const matrixAlignment = options.matrixAlignment ?? 'none';\n const centersWidth = matrixAlignment === 'horizontal' || matrixAlignment === 'both';\n const centersHeight = matrixAlignment === 'vertical' || matrixAlignment === 'both';\n const [resizedWidth, setResizedWidth] = useState(false);\n const [resizedHeight, setResizedHeight] = useState(false);\n const fixedWidth = centersWidth && (options.sheetWidth != null || resizedWidth);\n const fixedHeight = centersHeight && (options.sheetHeight != null || resizedHeight);\n const [sheetHeight, setSheetHeight] = useState(\n typeof options?.sheetHeight === 'number' ? options.sheetHeight : estimateSheetHeight(initialCells),\n );\n const [sheetWidth, setSheetWidth] = useState(\n typeof options?.sheetWidth === 'number' ? options.sheetWidth : estimateSheetWidth(initialCells),\n );\n useEffect(() => {\n const el = mainRef.current;\n if (!el) {\n return;\n }\n let first = true;\n const ro = new ResizeObserver(() => {\n // CSS `resize` writes an inline width/height when the user drags the handle; that is\n // the signal that the box was intentionally sized, so a smaller grid may now center.\n if (el.style.width) {\n setResizedWidth(true);\n }\n if (el.style.height) {\n setResizedHeight(true);\n }\n if (first) {\n first = false;\n // In fill mode we want the initial measurement; otherwise keep the provided/estimated size.\n if (!fillWidth && !fillHeight) {\n return;\n }\n }\n const root = rootRef.current;\n setSheetHeight(root ? Math.min(el.clientHeight, root.clientHeight) : el.clientHeight);\n setSheetWidth(root ? Math.min(el.clientWidth, root.clientWidth) : el.clientWidth);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [fillWidth, fillHeight]);\n useEffect(() => {\n if (typeof options.sheetHeight === 'number') {\n setSheetHeight(options.sheetHeight);\n }\n }, [options.sheetHeight]);\n useEffect(() => {\n if (typeof options.sheetWidth === 'number') {\n setSheetWidth(options.sheetWidth);\n }\n }, [options.sheetWidth]);\n\n const [loading, setLoading] = useState(false);\n\n // Latest store, so wrappedDispatch (memoized) can read pendingAsyncOp for the lock.\n const latestStoreRef = useRef(store);\n latestStoreRef.current = store;\n\n const wrappedDispatch = useCallback(\n ((action: { type: number; value: any }) => {\n const async = isAsyncMutationAction(action.type);\n const mutating = isMutationAction(action.type);\n // Lock: while a chunked async op is in flight the sheet is mid-mutation, so\n // reject any other mutation (edit/undo/paste/fill) until it commits. Read-only\n // actions (selection, scroll) still pass through.\n if (latestStoreRef.current.pendingAsyncOp != null && (async || mutating)) {\n return;\n }\n if (async) {\n // Its reduce just sets pendingAsyncOp (cheap); the runner effect drives it.\n (dispatch as any)(action);\n return;\n }\n if (!mutating) {\n (dispatch as any)(action);\n return;\n }\n setLoading(true);\n // TWO rAFs before running the (synchronous, possibly multi-second) mutation:\n // a single rAF fires BEFORE the overlay's first paint, so the overlay never\n // actually showed during the block. The second rAF runs after that paint, so\n // the spinner is on screen (and its compositor-driven animation keeps moving)\n // while the main thread is blocked. Clear right after dispatch — React batches\n // loading:false with the mutation's own re-render, so the overlay lifts exactly\n // when the result appears.\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n (dispatch as any)(action);\n setLoading(false);\n }),\n );\n }) as typeof dispatch,\n [dispatch],\n );\n\n // Runner for chunked async mutations (large fill/paste): when an action sets\n // store.pendingAsyncOp, run it off the reducer — reporting progress into the store\n // and committing the mutated sheet when done. Two rAFs first so the progress\n // overlay paints before the (still-synchronous) diff-build inside run() starts.\n const overlayRef = useRef<AsyncProgressHandle>(null);\n const pendingAsyncOp = store.pendingAsyncOp;\n useEffect(() => {\n if (pendingAsyncOp == null) {\n return;\n }\n let cancelled = false;\n const raf = requestAnimationFrame(() =>\n requestAnimationFrame(async () => {\n if (cancelled) {\n return;\n }\n try {\n const nextSheet = await pendingAsyncOp.run((ratio) => {\n // Imperative — updates only the overlay, never the grid.\n overlayRef.current?.setProgress(ratio);\n });\n if (!cancelled) {\n (dispatch as any)(\n commitAsyncOp({\n sheet: nextSheet,\n selectingZone: pendingAsyncOp.selectingZone,\n finalize: pendingAsyncOp.finalize,\n }),\n );\n pendingAsyncOp.postCommit?.();\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('[gridsheet] async op failed:', e);\n if (!cancelled) {\n (dispatch as any)(commitAsyncOp({ sheet: latestStoreRef.current.sheetReactive.current!, selectingZone: pendingAsyncOp.selectingZone }));\n }\n }\n }),\n );\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n };\n }, [pendingAsyncOp, dispatch]);\n\n return (\n <Context.Provider value={{ store, dispatch: wrappedDispatch }}>\n <div\n className={`gs-root1 ${registry.ready ? 'gs-initialized' : ''}`}\n ref={rootRef}\n data-sheet-name={sheetName}\n data-mode={mode}\n data-density={density}\n data-gridlines={gridLines}\n data-matrix-align={matrixAlignment}\n data-rows={store.sheetReactive.current?.numRows ?? 0}\n data-cols={store.sheetReactive.current?.numCols ?? 0}\n style={\n fillWidth || fillHeight\n ? {\n ...borderVars,\n // inline-flex (when width isn't filled) keeps the prior shrink-to-content width.\n display: fillWidth ? 'flex' : 'inline-flex',\n flexDirection: 'column',\n ...(fillWidth ? { width: options.sheetWidth as string } : null),\n ...(fillHeight ? { height: options.sheetHeight as string } : null),\n }\n : borderVars\n }\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 ...(fillWidth ? { width: '100%' } : null),\n maxWidth: '100%',\n // In fill-height mode the parent's height is the limit (flex:1 fills the remaining\n // space below the formula bar); otherwise cap at the viewport bottom as before.\n ...(fillHeight\n ? { flex: 1, minHeight: 0, maxHeight: '100%' }\n : {\n maxHeight: mainRef.current\n ? window.innerHeight - mainRef.current.getBoundingClientRect().top\n : (store.sheetReactive.current?.fullHeight || 0) + 2,\n }),\n resize: sheetResize,\n ...style,\n }}\n >\n <Editor mode={mode} />\n <Tabular />\n <StoreObserver\n {...{ ...options, sheetHeight, sheetWidth, fixedWidth, fixedHeight, sheetName, sheetRef, storeRef }}\n />\n <ContextMenu />\n <ColumnMenu />\n <RowMenu />\n <Resizer />\n <Emitter />\n {store.pendingAsyncOp != null ? (\n // Chunked async mutation (large fill/paste): imperative progress, grid not re-rendered.\n <AsyncProgressOverlay ref={overlayRef} label={store.pendingAsyncOp.label} />\n ) : loading ? (\n // Internal sync mutation in flight: brief indeterminate spinner.\n <div className=\"gs-loading-overlay\">\n <div className=\"gs-loading-spinner\" />\n </div>\n ) : loadingProp ? (\n // Consumer-driven initial loading (data not ready yet).\n <ProgressOverlay\n progress={typeof loadingProp === 'object' ? (loadingProp.progress ?? null) : null}\n label={typeof loadingProp === 'object' ? loadingProp.label : undefined}\n />\n ) : null}\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/web';\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","ProgressOverlay","progress","label","determinate","pct","jsxs","jsx","AsyncProgressOverlay","forwardRef","ref","setProgress","useState","useImperativeHandle","FunctionGuide","option","activeFunctionGuide","activeArgIndex","top","left","useRef","guide1Ref","store","useContext","isHidden","useLayoutEffect","el","calcSideStyle","clampPopup","e","React","Fragment","arg","j","args","numIterable","a","variadicStart","isActive","offset","resolvedIndex","activeArg","EditorOptions","filteredOptions","selected","onOptionMouseDown","ulRef","adjustedLeft","setAdjustedLeft","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","composingRef","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","selectToDataEdge","arrow","select","copy","areaToZone","fillDown","setEntering","fillRight","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","fixedWidth","fixedHeight","storeRef","sheetReactive","dragRef","raf","running","dead","cx","cy","lastCell","lastExtend","EDGE","SPEED","stop","finish","submitAutofill","setDragging","tick","dy","dx","px","py","now","setAutofillDraggingTo","drag","onMove","onDown","onUp","onLeaveWindow","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","_setStore","_menuComponentRegistry","registerMenuComponent","id","component","getMenuComponent","MenuItem","shortcuts","disabled","checked","testId","onClick","hasCheck","shortcut","part","arr","MenuDivider","MenuNodes","onSelect","renderComponent","SubmenuNode","open","setOpen","liRef","flyoutRef","pos","setPos","li","fly","p","f","margin","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","componentId","Section","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","fullAddress","insertRef","handleDragEnd","handleDragging","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","live","curY","curX","sheetPrefix","sheetRange","handleMouseEnter","stopScroll","isFocus","handleMouseUp","handleMouseUpWrapper","handleMouseLeave","cannotScrollHere","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","toVirtualScrollTop","headerW","headerH","autofill","Autofill","vx","vy","copyingSheetId","copyingZone","cutting","copyingArea","palette","refArea","a2p","isCurrentMatch","firstCol","lastCol","getVisibleColRange","firstRow","lastRow","getVisibleRowRange","backgroundColor","drawLeft","drawWidth","drawTop","drawHeight","scheduleDrawCanvas","handleScroll","ro","Tabular","setPalette","virtualized","setVirtualized","ox","oy","handleMouseMove","virtualize","handleSelectAllClick","paletteBySheetName","normalizedRef","stripAddressAbsolute","splitterIndex","stripped","stripSheetName","upperRef","preventSafariBounce","mergedRefs","physicalScrollHeight","_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","loadingProp","sheetResize","showFormulaBar","density","gridLines","formulaBarBorders","matrixBorders","bw","side","borderVars","flashRef","internalSheetRef","internalStoreRef","internalBook","useBook","book","initialState","limits","eager","Sheet","useReducer","defaultReducer","embedStyle","fillWidth","fillHeight","matrixAlignment","centersWidth","centersHeight","resizedWidth","setResizedWidth","resizedHeight","setResizedHeight","setSheetHeight","estimateSheetHeight","setSheetWidth","estimateSheetWidth","first","root","loading","setLoading","latestStoreRef","wrappedDispatch","action","async","isAsyncMutationAction","mutating","isMutationAction","overlayRef","pendingAsyncOp","nextSheet","ratio","commitAsyncOp","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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"}