@lembryo/voxsheet 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/hooks/useChunks.ts","../src/hooks/useEditBuffer.ts","../src/core/format.ts","../src/core/range.ts","../src/core/clipboard.ts","../src/icons.tsx","../src/labels.ts","../src/platform.ts","../src/VoxSheet.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\"\nimport type { CellValue, Column, FetchRowsFn, FilterSpec, SortSpec } from \"../types\"\n\nconst CHUNK = 200\nconst FETCH_DEBOUNCE_MS = 80\n\nexport type VisibleRow = { values: CellValue[]; id: number; ordinal: number }\n\nexport type ChunkStatus = \"idle\" | \"loading\" | \"error\"\n\ntype Params = {\n fetchRows: FetchRowsFn\n totalRows: number\n columns: Column[]\n sort: SortSpec[]\n filters: FilterSpec[]\n search: string | undefined\n queryKey: unknown\n frozenRows: number\n startRow: number\n endRow: number\n onError?: (error: unknown, ctx: { phase: \"fetch\" | \"commit\" }) => void\n}\n\n/**\n * ビューポート範囲をチャンク単位で取得・キャッシュするフック。\n * - sort/filters/search/columns/queryKey の変化でキャッシュを無効化して再取得する。\n * - 取得は debounce し、各取得は AbortSignal で中断可能。\n */\nexport const useChunks = (params: Params) => {\n const {\n fetchRows,\n totalRows,\n columns,\n sort,\n filters,\n search,\n queryKey,\n frozenRows,\n startRow,\n endRow,\n onError,\n } = params\n\n const cacheRef = useRef<Map<number, VisibleRow[]>>(new Map())\n const pendingRef = useRef<Set<number>>(new Set())\n const controllersRef = useRef<Set<AbortController>>(new Set())\n const [rows, setRows] = useState<Map<number, VisibleRow>>(new Map())\n const [total, setTotal] = useState(totalRows)\n const [status, setStatus] = useState<ChunkStatus>(\"idle\")\n\n // 無効化キー(controlled なドメイン状態に依存)\n const invalidationKey = JSON.stringify({\n columns: columns.map((c) => c.name),\n sort,\n filters,\n search: search ?? null,\n })\n\n const reset = useCallback(() => {\n for (const controller of controllersRef.current) controller.abort()\n controllersRef.current.clear()\n cacheRef.current.clear()\n pendingRef.current.clear()\n setRows(new Map())\n }, [])\n\n // 無効化(controlled 状態 / queryKey の変化)\n useEffect(() => {\n reset()\n }, [invalidationKey, queryKey, reset])\n\n const rebuildVisible = useCallback(() => {\n const next = new Map<number, VisibleRow>()\n for (const [offset, chunk] of cacheRef.current) {\n chunk.forEach((row, i) => next.set(offset + i, row))\n }\n setRows(next)\n }, [])\n\n const loadChunks = useCallback(async () => {\n const effectiveTotal = total > 0 ? total : totalRows\n const offsets: number[] = []\n if (frozenRows > 0) offsets.push(0)\n const from = Math.floor(startRow / CHUNK) * CHUNK\n const to = Math.ceil(endRow / CHUNK) * CHUNK\n for (let o = from; o < to; o += CHUNK) {\n if (o >= 0) offsets.push(o)\n }\n\n const targets = offsets.filter(\n (o) => o < effectiveTotal && !cacheRef.current.has(o) && !pendingRef.current.has(o),\n )\n if (targets.length === 0) return\n\n setStatus(\"loading\")\n const jobs = targets.map(async (offset) => {\n pendingRef.current.add(offset)\n const controller = new AbortController()\n controllersRef.current.add(controller)\n // 常に 1 チャンク分を要求する。総数が未確定(初回や stale)でも\n // チャンク満杯を取りに行き、サーバ側が末尾でクランプして返す。\n // ここで effectiveTotal でクランプすると、総数が小さく見える初回に\n // limit が極端に小さくなり(例: 1)、そのチャンクが過小取得のまま\n // キャッシュされて二度と取り直されない不具合になる。\n const limit = CHUNK\n try {\n const result = await fetchRows(\n { offset, limit, sort, filters, search },\n controller.signal,\n )\n const chunk: VisibleRow[] = result.data.map((values, i) => ({\n values,\n id: result.ids[i] ?? offset + i + 1,\n ordinal: result.ordinals[i] ?? offset + i + 1,\n }))\n cacheRef.current.set(offset, chunk)\n if (typeof result.total === \"number\") setTotal(result.total)\n } catch (error) {\n if (!controller.signal.aborted) {\n onError?.(error, { phase: \"fetch\" })\n setStatus(\"error\")\n }\n } finally {\n pendingRef.current.delete(offset)\n controllersRef.current.delete(controller)\n }\n })\n\n await Promise.all(jobs)\n rebuildVisible()\n setStatus((prev) => (prev === \"error\" ? prev : \"idle\"))\n }, [\n fetchRows,\n sort,\n filters,\n search,\n startRow,\n endRow,\n frozenRows,\n total,\n totalRows,\n onError,\n rebuildVisible,\n ])\n\n // 範囲変化に対する debounce 付きフェッチ\n useEffect(() => {\n const timer = setTimeout(() => {\n void loadChunks()\n }, FETCH_DEBOUNCE_MS)\n return () => clearTimeout(timer)\n }, [loadChunks])\n\n // totalRows prop の変化を反映(フィルタ解除等)\n useEffect(() => {\n setTotal(totalRows)\n }, [totalRows])\n\n const invalidate = useCallback(() => {\n reset()\n void loadChunks()\n }, [reset, loadChunks])\n\n return { rows, total: total > 0 ? total : totalRows, status, invalidate }\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\"\nimport type { CellEdit, CellValue } from \"../types\"\n\nconst MAX_UNDO = 200\n\nconst keyOf = (row: number, col: number): string => `${row}:${col}`\n\ntype Params = {\n onCellChange?: (edit: CellEdit) => void\n onDirtyChange?: (hasChanges: boolean) => void\n}\n\n/**\n * ローカル編集レイヤー。未コミットの編集を保持し、Undo/Redo と dirty 追跡を行う。\n * 永続化はしない(ホストが getLocalEdits を取り出してコミットする)。\n */\nexport const useEditBuffer = ({ onCellChange, onDirtyChange }: Params) => {\n const editsRef = useRef<Map<string, CellValue>>(new Map())\n const originalRef = useRef<Map<string, CellValue>>(new Map())\n const undoRef = useRef<CellEdit[][]>([])\n const redoRef = useRef<CellEdit[][]>([])\n // 編集の変化で再描画させるためのバージョン\n const [version, setVersion] = useState(0)\n\n const notifyDirty = useCallback(() => {\n onDirtyChange?.(editsRef.current.size > 0)\n }, [onDirtyChange])\n\n // 1 セルへ値を適用する(元値に戻れば dirty 解除)。\n const applyValue = useCallback(\n (\n row: number,\n col: number,\n value: CellValue,\n getBase: (r: number, c: number) => CellValue,\n ) => {\n const key = keyOf(row, col)\n if (!originalRef.current.has(key)) {\n originalRef.current.set(key, getBase(row, col))\n }\n const original = originalRef.current.get(key) ?? null\n if (value === original) {\n editsRef.current.delete(key)\n originalRef.current.delete(key)\n } else {\n editsRef.current.set(key, value)\n }\n onCellChange?.({ row, col, oldValue: original, newValue: value })\n },\n [onCellChange],\n )\n\n /** 1 操作(複数セル)を適用し、Undo スタックに 1 アクションとして積む。 */\n const applyEdits = useCallback(\n (edits: CellEdit[], getBase: (r: number, c: number) => CellValue) => {\n if (edits.length === 0) return\n for (const edit of edits) applyValue(edit.row, edit.col, edit.newValue, getBase)\n undoRef.current.push(edits)\n if (undoRef.current.length > MAX_UNDO) undoRef.current.shift()\n redoRef.current = []\n setVersion((v) => v + 1)\n notifyDirty()\n },\n [applyValue, notifyDirty],\n )\n\n const noBase = useCallback((): CellValue => null, [])\n\n const undo = useCallback(() => {\n const action = undoRef.current.pop()\n if (!action) return\n for (let i = action.length - 1; i >= 0; i--) {\n const edit = action[i]!\n applyValue(edit.row, edit.col, edit.oldValue, noBase)\n }\n redoRef.current.push(action)\n setVersion((v) => v + 1)\n notifyDirty()\n }, [applyValue, noBase, notifyDirty])\n\n const redo = useCallback(() => {\n const action = redoRef.current.pop()\n if (!action) return\n for (const edit of action) applyValue(edit.row, edit.col, edit.newValue, noBase)\n undoRef.current.push(action)\n setVersion((v) => v + 1)\n notifyDirty()\n }, [applyValue, noBase, notifyDirty])\n\n const getEditedValue = useCallback((row: number, col: number): CellValue | undefined => {\n const key = keyOf(row, col)\n return editsRef.current.has(key) ? editsRef.current.get(key) : undefined\n }, [])\n\n const isDirty = useCallback(\n (row: number, col: number): boolean => editsRef.current.has(keyOf(row, col)),\n [],\n )\n\n const getLocalEdits = useCallback((): CellEdit[] => {\n const result: CellEdit[] = []\n for (const [key, newValue] of editsRef.current) {\n const [rs, cs] = key.split(\":\")\n result.push({\n row: Number(rs),\n col: Number(cs),\n oldValue: originalRef.current.get(key) ?? null,\n newValue,\n })\n }\n return result\n }, [])\n\n const clear = useCallback(() => {\n editsRef.current.clear()\n originalRef.current.clear()\n undoRef.current = []\n redoRef.current = []\n setVersion((v) => v + 1)\n onDirtyChange?.(false)\n }, [onDirtyChange])\n\n const canUndo = useCallback(() => undoRef.current.length > 0, [])\n const canRedo = useCallback(() => redoRef.current.length > 0, [])\n\n // 返り値の identity を安定させる。毎レンダーで新オブジェクトを返すと、これに依存する\n // getRawValue や選択統計の effect が毎レンダー再実行され、無限ループ\n //(Maximum update depth exceeded)の原因になる。\n return useMemo(\n () => ({\n version,\n applyEdits,\n undo,\n redo,\n getEditedValue,\n isDirty,\n getLocalEdits,\n clear,\n canUndo,\n canRedo,\n }),\n [\n version,\n applyEdits,\n undo,\n redo,\n getEditedValue,\n isDirty,\n getLocalEdits,\n clear,\n canUndo,\n canRedo,\n ],\n )\n}\n","import type { CellValue, Column, ColumnAlign, ColumnType } from '../types';\n\n/** 型から既定の水平アラインを導出する。 */\nexport const defaultAlign = (type: ColumnType | undefined): ColumnAlign => {\n if (type === \"number\") return \"right\"\n if (type === \"date\") return \"right\"\n if (type === \"boolean\") return \"center\"\n return \"left\"\n}\n\n/** epoch ミリ秒(number)または ISO 文字列を Date に変換する(失敗時 null)。 */\nconst toDate = (value: CellValue): Date | null => {\n if (value === null || value === \"\") return null\n const d = typeof value === \"number\" ? new Date(value) : new Date(String(value))\n return Number.isNaN(d.getTime()) ? null : d\n}\n\n/**\n * セル値を表示文字列に整形する。column.format > 型別既定 の順で解決する。\n */\nexport const formatCellValue = (value: CellValue, column: Column, row: number): string => {\n const format = column.format\n if (typeof format === \"function\") return format(value, { column, row })\n if (value === null) return \"\"\n\n if (format && format.kind === \"number\" && typeof value === \"number\") {\n return new Intl.NumberFormat(undefined, format.options).format(value)\n }\n if (format && format.kind === \"date\") {\n const d = toDate(value)\n if (d) return new Intl.DateTimeFormat(undefined, format.options).format(d)\n }\n\n switch (column.type) {\n case \"boolean\":\n return value ? \"✓\" : \"\"\n case \"date\": {\n const d = toDate(value)\n // 既定は YYYY-MM-DD(ISO のまま表示できる場合はそれを優先)\n if (typeof value === \"string\") return value\n return d ? d.toISOString().slice(0, 10) : \"\"\n }\n case \"number\":\n return typeof value === \"number\" ? String(value) : String(value)\n default:\n return String(value)\n }\n}\n\n/**\n * 編集の生入力文字列を列の型に応じた CellValue へパースする。\n * パースできない場合は raw(文字列)を返し、検証はホスト/列 validate に委ねる。\n */\nexport const parseInputValue = (raw: string, type: ColumnType | undefined): CellValue => {\n if (raw === \"\") return type === \"string\" || type === undefined ? \"\" : null\n switch (type) {\n case \"number\": {\n const n = Number(raw.replace(/,/g, \"\"))\n return Number.isNaN(n) ? raw : n\n }\n case \"boolean\": {\n const lower = raw.trim().toLowerCase()\n if ([\"true\", \"1\", \"yes\", \"y\", \"✓\"].includes(lower)) return true\n if ([\"false\", \"0\", \"no\", \"n\", \"\"].includes(lower)) return false\n return raw\n }\n case \"date\":\n // 日付は ISO 文字列のまま保持する(解釈は表示側)。\n return raw\n default:\n return raw\n }\n}\n\n/** 数値として解釈できる場合に number を返す(統計用)。 */\nexport const numericValue = (value: CellValue): number | null => {\n if (typeof value === \"number\") return value\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const n = Number(value.replace(/,/g, \"\"))\n return Number.isNaN(n) ? null : n\n }\n return null\n}\n","import type { Selection } from \"../types\"\n\n/** 正規化済みの矩形(r1<=r2, c1<=c2)。 */\nexport type Rect = { r1: number; r2: number; c1: number; c2: number }\n\nexport const normalizeRect = (sel: Selection): Rect => ({\n r1: Math.min(sel.start.row, sel.end.row),\n r2: Math.max(sel.start.row, sel.end.row),\n c1: Math.min(sel.start.col, sel.end.col),\n c2: Math.max(sel.start.col, sel.end.col),\n})\n\nexport const normalizeRects = (selections: Selection[]): Rect[] => selections.map(normalizeRect)\n\nexport const rectContains = (rect: Rect, row: number, col: number): boolean =>\n row >= rect.r1 && row <= rect.r2 && col >= rect.c1 && col <= rect.c2\n\nexport const cellInRects = (rects: Rect[], row: number, col: number): boolean =>\n rects.some((rect) => rectContains(rect, row, col))\n\n/** 矩形が「行全体(全列を含む)」かどうか。 */\nexport const isFullRowRect = (rect: Rect, columnCount: number): boolean =>\n rect.c1 === 0 && rect.c2 === columnCount - 1\n\n/** 矩形が「列全体(全行を含む)」かどうか。 */\nexport const isFullColRect = (rect: Rect, totalRows: number): boolean =>\n rect.r1 === 0 && rect.r2 === totalRows - 1\n\n/** レンジ群に含まれる行の和集合(昇順)。 */\nexport const rowsInRects = (rects: Rect[]): number[] => {\n const set = new Set<number>()\n for (const rect of rects) {\n for (let r = rect.r1; r <= rect.r2; r++) set.add(r)\n }\n return Array.from(set).sort((a, b) => a - b)\n}\n\n/** レンジ群の総セル数(未取得行も含む論理的なセル数)。 */\nexport const totalCellCount = (rects: Rect[]): number =>\n rects.reduce((sum, rect) => sum + (rect.r2 - rect.r1 + 1) * (rect.c2 - rect.c1 + 1), 0)\n","import type { Rect } from \"./range\"\n\n/** TSV の 1 セルをエスケープする(タブ/改行/引用符を含む場合はダブルクオートで囲む)。 */\nconst escapeCell = (text: string): string => {\n if (/[\\t\\n\\r\"]/.test(text)) {\n return `\"${text.replace(/\"/g, '\"\"')}\"`\n }\n return text\n}\n\n/**\n * 選択レンジ群から TSV(Excel 互換タブ区切り)テキストを生成する。\n * - 複数レンジで行範囲が一致 → 列方向に連結\n * - 列範囲が一致 → 行方向に連結\n * - それ以外 → アクティブレンジ(末尾)のみ\n */\nexport const buildTsv = (rects: Rect[], getValue: (row: number, col: number) => string): string => {\n if (rects.length === 0) return \"\"\n\n const rectToLines = (rect: Rect): string[] => {\n const lines: string[] = []\n for (let r = rect.r1; r <= rect.r2; r++) {\n const cells: string[] = []\n for (let c = rect.c1; c <= rect.c2; c++) cells.push(escapeCell(getValue(r, c)))\n lines.push(cells.join(\"\\t\"))\n }\n return lines\n }\n\n if (rects.length > 1) {\n const first = rects[0]!\n const sameRows = rects.every((rect) => rect.r1 === first.r1 && rect.r2 === first.r2)\n if (sameRows) {\n const sorted = [...rects].sort((a, b) => a.c1 - b.c1)\n const lines: string[] = []\n for (let r = first.r1; r <= first.r2; r++) {\n const cells: string[] = []\n for (const rect of sorted) {\n for (let c = rect.c1; c <= rect.c2; c++) cells.push(escapeCell(getValue(r, c)))\n }\n lines.push(cells.join(\"\\t\"))\n }\n return lines.join(\"\\n\")\n }\n const sameCols = rects.every((rect) => rect.c1 === first.c1 && rect.c2 === first.c2)\n if (sameCols) {\n const sorted = [...rects].sort((a, b) => a.r1 - b.r1)\n return sorted.flatMap(rectToLines).join(\"\\n\")\n }\n }\n\n return rectToLines(rects[rects.length - 1]!).join(\"\\n\")\n}\n\n/**\n * TSV/Excel 形式のクリップボードテキストを 2 次元配列にパースする。\n * ダブルクオートで囲まれたセル内のタブ・改行・\"\" を正しく扱う。\n */\nexport const parseTsv = (text: string): string[][] => {\n const rows: string[][] = []\n let row: string[] = []\n let cell = \"\"\n let inQuotes = false\n let i = 0\n\n const pushCell = () => {\n row.push(cell)\n cell = \"\"\n }\n const pushRow = () => {\n pushCell()\n rows.push(row)\n row = []\n }\n\n while (i < text.length) {\n const ch = text[i]!\n if (inQuotes) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n cell += '\"'\n i += 2\n continue\n }\n inQuotes = false\n i++\n continue\n }\n cell += ch\n i++\n continue\n }\n if (ch === '\"') {\n inQuotes = true\n i++\n continue\n }\n if (ch === \"\\t\") {\n pushCell()\n i++\n continue\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n // \\r\\n はまとめて 1 改行として扱う\n if (ch === \"\\r\" && text[i + 1] === \"\\n\") i++\n pushRow()\n i++\n continue\n }\n cell += ch\n i++\n }\n // 末尾セル/行の確定(末尾が空でない場合のみ行を作る)\n if (cell !== \"\" || row.length > 0) pushRow()\n return rows\n}\n","import type { IconName, IconProps, IconRenderer, Icons } from \"./types\"\n\n/**\n * 既定アイコン(最小インライン SVG)。FontAwesome 等の外部依存を持たない。\n * `icons` prop で個別に差し替えられる。\n */\n\nconst svgProps = (props: IconProps) => ({\n width: props.size ?? 14,\n height: props.size ?? 14,\n viewBox: \"0 0 16 16\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.6,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n className: props.className,\n \"aria-hidden\": true,\n})\n\nconst SortAscending: IconRenderer = (props) => (\n <svg {...svgProps(props)}>\n <path d=\"M8 12V4M8 4l-3 3M8 4l3 3\" />\n </svg>\n)\n\nconst SortDescending: IconRenderer = (props) => (\n <svg {...svgProps(props)}>\n <path d=\"M8 4v8M8 12l-3-3M8 12l3-3\" />\n </svg>\n)\n\nconst SortUnsorted: IconRenderer = (props) => (\n <svg {...svgProps(props)} opacity={0.45}>\n <path d=\"M5 6l3-3 3 3M5 10l3 3 3-3\" />\n </svg>\n)\n\nconst Filter: IconRenderer = (props) => (\n <svg {...svgProps(props)}>\n <path d=\"M2.5 3.5h11l-4.2 5v4l-2.6 1.3v-5.3z\" />\n </svg>\n)\n\nconst FilterActive: IconRenderer = (props) => (\n <svg {...svgProps(props)} fill=\"currentColor\" stroke=\"none\">\n <path d=\"M2.5 3.5h11l-4.2 5v4l-2.6 1.3v-5.3z\" />\n </svg>\n)\n\nexport const DEFAULT_ICONS: Record<IconName, IconRenderer> = {\n sortAscending: SortAscending,\n sortDescending: SortDescending,\n sortUnsorted: SortUnsorted,\n filter: Filter,\n filterActive: FilterActive,\n}\n\nexport const resolveIcons = (overrides?: Icons): Record<IconName, IconRenderer> =>\n overrides ? { ...DEFAULT_ICONS, ...overrides } : DEFAULT_ICONS\n","import type { VoxLabels } from \"./types\"\n\n/** 内蔵 UI の既定文言(英語)。`labels` prop で部分上書きできる。 */\nexport const DEFAULT_LABELS: VoxLabels = {\n loading: \"Loading…\",\n empty: \"No rows\",\n contextCut: \"Cut\",\n contextCopy: \"Copy\",\n contextPaste: \"Paste\",\n contextInsertRowAbove: \"Insert row above\",\n contextInsertRowBelow: \"Insert row below\",\n contextDeleteRows: \"Delete rows\",\n contextUndo: \"Undo\",\n contextRedo: \"Redo\",\n confirmLargeCopyTitle: \"Copy a large selection\",\n confirmLargeCopyMessage: \"The selection is large and copying may take a while. Continue?\",\n confirmOk: \"OK\",\n confirmCancel: \"Cancel\",\n}\n\nexport const resolveLabels = (overrides?: Partial<VoxLabels>): VoxLabels =>\n overrides ? { ...DEFAULT_LABELS, ...overrides } : DEFAULT_LABELS\n","import type { ConfirmOptions, PlatformAdapter, ToastKind } from \"./types\"\n\n/**\n * 解決済みプラットフォーム。各メソッドは常に存在する(未指定は web 既定にフォールバック)。\n */\nexport type ResolvedPlatform = {\n readText: () => Promise<string>\n writeText: (text: string) => Promise<void>\n notify: (\n kind: ToastKind,\n message: string,\n opts?: { id?: string; durationMs?: number },\n ) => string\n confirm: (opts: ConfirmOptions) => Promise<boolean>\n saveFile: (opts: {\n suggestedName: string\n mimeType?: string\n data: string | Blob\n }) => Promise<void>\n}\n\nconst hasDom = (): boolean => typeof document !== \"undefined\"\n\n// --- 既定クリップボード(navigator.clipboard) ---\n\nconst defaultReadText = async (): Promise<string> => {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n return navigator.clipboard.readText()\n }\n return \"\"\n}\n\nconst defaultWriteText = async (text: string): Promise<void> => {\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n await navigator.clipboard.writeText(text)\n }\n}\n\n// --- 既定トースト(vox- スタイルの最小内蔵 DOM 実装) ---\n\nlet toastSeq = 0\n\nconst ensureToastContainer = (): HTMLElement | null => {\n if (!hasDom()) return null\n let el = document.querySelector<HTMLElement>(\".vox-toast-container\")\n if (!el) {\n el = document.createElement(\"div\")\n el.className = \"vox-toast-container\"\n document.body.appendChild(el)\n }\n return el\n}\n\nconst defaultNotify = (\n kind: ToastKind,\n message: string,\n opts?: { id?: string; durationMs?: number },\n): string => {\n const container = ensureToastContainer()\n const id = opts?.id ?? `vox-toast-${++toastSeq}`\n if (!container) return id\n\n let toast = document.getElementById(id)\n if (!toast) {\n toast = document.createElement(\"div\")\n toast.id = id\n container.appendChild(toast)\n }\n toast.className = `vox-toast vox-toast--${kind}`\n toast.textContent = message\n\n const duration = opts?.durationMs ?? (kind === \"loading\" ? 0 : 3000)\n if (duration > 0) {\n window.setTimeout(() => toast?.remove(), duration)\n }\n return id\n}\n\n// --- 既定確認ダイアログ(vox- スタイルの最小内蔵モーダル) ---\n\nconst defaultConfirm = (opts: ConfirmOptions): Promise<boolean> => {\n if (!hasDom()) return Promise.resolve(false)\n return new Promise<boolean>((resolve) => {\n const backdrop = document.createElement(\"div\")\n backdrop.className = \"vox-modal-backdrop\"\n\n const modal = document.createElement(\"div\")\n modal.className = \"vox-modal\"\n modal.setAttribute(\"role\", \"dialog\")\n modal.setAttribute(\"aria-modal\", \"true\")\n\n const close = (result: boolean) => {\n backdrop.remove()\n resolve(result)\n }\n\n if (opts.title) {\n const title = document.createElement(\"div\")\n title.className = \"vox-modal-title\"\n title.textContent = opts.title\n modal.appendChild(title)\n }\n const body = document.createElement(\"div\")\n body.className = \"vox-modal-body\"\n body.textContent = opts.message\n modal.appendChild(body)\n\n const footer = document.createElement(\"div\")\n footer.className = \"vox-modal-footer\"\n const cancel = document.createElement(\"button\")\n cancel.className = \"vox-btn\"\n cancel.textContent = opts.cancelLabel ?? \"Cancel\"\n cancel.onclick = () => close(false)\n const ok = document.createElement(\"button\")\n ok.className = \"vox-btn vox-btn--primary\"\n ok.textContent = opts.confirmLabel ?? \"OK\"\n ok.onclick = () => close(true)\n footer.append(cancel, ok)\n modal.appendChild(footer)\n\n backdrop.appendChild(modal)\n backdrop.onclick = (e) => {\n if (e.target === backdrop) close(false)\n }\n document.body.appendChild(backdrop)\n ok.focus()\n })\n}\n\n// --- 既定ファイル保存(ブラウザダウンロード) ---\n\nconst defaultSaveFile = async (opts: {\n suggestedName: string\n mimeType?: string\n data: string | Blob\n}): Promise<void> => {\n if (!hasDom()) return\n const blob =\n typeof opts.data === \"string\"\n ? new Blob([opts.data], { type: opts.mimeType ?? \"text/plain\" })\n : opts.data\n const url = URL.createObjectURL(blob)\n const a = document.createElement(\"a\")\n a.href = url\n a.download = opts.suggestedName\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n}\n\n/** props の platform を web 既定とマージして解決する。 */\nexport const resolvePlatform = (platform?: PlatformAdapter): ResolvedPlatform => ({\n readText: platform?.clipboard?.readText ?? defaultReadText,\n writeText: platform?.clipboard?.writeText ?? defaultWriteText,\n notify: platform?.notify ?? defaultNotify,\n confirm: platform?.confirm ?? defaultConfirm,\n saveFile: platform?.saveFile ?? defaultSaveFile,\n})\n","import type { CSSProperties, ReactElement } from \"react\"\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport type {\n CellEdit,\n CellValue,\n Selection,\n SortSpec,\n VoxSheetHandle,\n VoxSheetProps,\n} from \"./types\"\nimport { useChunks } from \"./hooks/useChunks\"\nimport { useEditBuffer } from \"./hooks/useEditBuffer\"\nimport { defaultAlign, formatCellValue, numericValue, parseInputValue } from \"./core/format\"\nimport { cellInRects, normalizeRects, totalCellCount } from \"./core/range\"\nimport { buildTsv, parseTsv } from \"./core/clipboard\"\nimport { resolveIcons } from \"./icons\"\nimport { resolveLabels } from \"./labels\"\nimport { resolvePlatform } from \"./platform\"\nimport \"./styles.css\"\n\nconst DENSITY: Record<\n NonNullable<VoxSheetProps[\"density\"]>,\n { rowHeight: number; fontSize: number }\n> = {\n compact: { rowHeight: 22, fontSize: 12 },\n normal: { rowHeight: 28, fontSize: 13 },\n comfortable: { rowHeight: 34, fontSize: 15 },\n}\n\nconst ROW_HEADER_WIDTH = 52\nconst OVERSCAN = 8\nconst MIN_COL_WIDTH = 40\nconst MAX_AUTOFIT_WIDTH = 600\n/** これを超えるセル数のコピー/集計は重いので抑止する(簡易ガード)。 */\nconst HEAVY_CELL_LIMIT = 100_000\n\ntype Cell = { row: number; col: number }\n\nconst cellToInput = (value: CellValue): string => (value === null ? \"\" : String(value))\n\n/**\n * VoxSheet — DOM ベースの仮想スクロール対応スプレッドシート。\n * 連番列・選択・編集・オートフィル・ソート/フィルタのヘッダ UI を備える。\n */\nconst VoxSheetInner = (props: VoxSheetProps, ref: React.Ref<VoxSheetHandle>): ReactElement => {\n const {\n columns,\n totalRows,\n fetchRows,\n queryKey,\n density = \"normal\",\n defaultColumnWidth = 120,\n frozenRows = 0,\n theme = \"system\",\n className,\n style,\n readOnly = false,\n sort = [],\n filters = [],\n search,\n searchHighlights,\n currentSearchHit,\n renderLoading,\n renderEmpty,\n labels: labelOverrides,\n icons: iconOverrides,\n platform: platformOverride,\n onSortChange,\n onFilterButtonClick,\n onColumnResize,\n onColumnRename,\n onAddColumn,\n onCellChange,\n onDirtyChange,\n onAppendRow,\n onInsertRow,\n onDeleteRows,\n onAutoFill,\n onSelectionChange,\n onSelectionStats,\n onCellKeyDown,\n onError,\n } = props\n\n const labels = useMemo(() => resolveLabels(labelOverrides), [labelOverrides])\n const icons = useMemo(() => resolveIcons(iconOverrides), [iconOverrides])\n const platform = useMemo(() => resolvePlatform(platformOverride), [platformOverride])\n\n const rowHeight = props.rowHeight ?? DENSITY[density].rowHeight\n const fontSize = DENSITY[density].fontSize\n\n const rootRef = useRef<HTMLDivElement>(null)\n const bodyRef = useRef<HTMLDivElement>(null)\n const headerRef = useRef<HTMLDivElement>(null)\n const frozenRef = useRef<HTMLDivElement>(null)\n const [scrollTop, setScrollTop] = useState(0)\n const [viewportHeight, setViewportHeight] = useState(600)\n const [scrollbarWidth, setScrollbarWidth] = useState(0)\n\n // --- 列幅(列名キーで記憶し、リネーム後も引き継ぐ) ---\n const [colWidths, setColWidths] = useState<number[]>([])\n const widthMemoryRef = useRef<Map<string, number>>(new Map())\n const prevNamesRef = useRef<string[] | null>(null)\n useEffect(() => {\n const memory = widthMemoryRef.current\n const prev = prevNamesRef.current\n if (prev && prev.length === columns.length) {\n prev.forEach((oldName, i) => {\n const newName = columns[i]?.name\n if (newName && newName !== oldName && memory.has(oldName)) {\n memory.set(newName, memory.get(oldName)!)\n memory.delete(oldName)\n }\n })\n }\n prevNamesRef.current = columns.map((c) => c.name)\n setColWidths(columns.map((c) => memory.get(c.name) ?? c.width ?? defaultColumnWidth))\n }, [columns, defaultColumnWidth])\n\n const getColWidth = useCallback(\n (i: number): number => colWidths[i] ?? columns[i]?.width ?? defaultColumnWidth,\n [colWidths, columns, defaultColumnWidth],\n )\n // 行ヘッダ込みでの列 c の左端 px。選択枠オーバーレイの位置計算に使う。\n const colLeft = useCallback(\n (c: number): number => {\n let x = ROW_HEADER_WIDTH\n for (let i = 0; i < c; i++) x += getColWidth(i)\n return x\n },\n [getColWidth],\n )\n const applyColWidth = useCallback(\n (col: number, width: number) => {\n const w = Math.max(MIN_COL_WIDTH, Math.round(width))\n setColWidths((prev) => {\n const next = [...prev]\n next[col] = w\n return next\n })\n const name = columns[col]?.name\n if (name) widthMemoryRef.current.set(name, w)\n onColumnResize?.(col, w)\n },\n [columns, onColumnResize],\n )\n\n // --- ビューポート高さ+縦スクロールバー幅の追従 ---\n // 計測は mount 時と ResizeObserver(リサイズ時)のみに限定する。\n // 毎レンダーで計測すると、高 DPI 環境で offsetWidth/clientWidth が 1px 揺れて\n // setState → 再レンダー → 再計測… の無限ループ(Maximum update depth)になりうる。\n // スクロールバー幅はヘッダ右端の padding に反映し、横スクロール時の列ズレを補正する。\n useEffect(() => {\n const el = bodyRef.current\n if (!el) return\n const measure = () => {\n setViewportHeight(el.clientHeight)\n setScrollbarWidth(el.offsetWidth - el.clientWidth)\n }\n measure()\n const observer = new ResizeObserver(() => measure())\n observer.observe(el)\n return () => observer.disconnect()\n }, [])\n\n // --- 可視範囲 ---\n // frozenRows(先頭行の固定表示)は現状未対応。prop は受け付けるが描画には反映しない\n // (チャンク取得側へはヒントとして渡す)。固定バンドの描画は今後の実装。\n const bodyOffset = 0\n // ビューポートから必要な行範囲(+オーバースキャンの余裕)を算出する。\n // 総数が未確定でもまず取得できるよう、ここでは totalRows でクランプしない。\n // 実際の描画範囲は取得後に判明する total でクランプする(下の visibleEnd)。\n const desiredStart = Math.max(0, Math.floor(scrollTop / rowHeight) - OVERSCAN)\n const desiredEnd = Math.ceil((scrollTop + viewportHeight) / rowHeight) + OVERSCAN\n\n // --- データ取得(チャンク) ---\n const { rows, total, status, invalidate } = useChunks({\n fetchRows,\n totalRows,\n columns,\n sort,\n filters,\n search,\n queryKey,\n frozenRows,\n startRow: desiredStart,\n endRow: desiredEnd,\n onError,\n })\n\n // 描画範囲は「ビューポートの要求」と「判明している総数」の小さい方。\n // total はレスポンスの FetchResult.total で自己更新されるため、ホストが\n // totalRows を更新しなくても初回取得後に正しい行数まで広がる。\n const visibleStart = Math.min(desiredStart, Math.max(0, total - 1))\n const visibleEnd = Math.min(total, desiredEnd)\n\n // --- ローカル編集レイヤー ---\n const editBuffer = useEditBuffer({ onCellChange, onDirtyChange })\n\n const getBaseValue = useCallback(\n (r: number, c: number): CellValue => rows.get(r)?.values[c] ?? null,\n [rows],\n )\n const getRawValue = useCallback(\n (r: number, c: number): CellValue => {\n const edited = editBuffer.getEditedValue(r, c)\n return edited !== undefined ? edited : getBaseValue(r, c)\n },\n [editBuffer, getBaseValue],\n )\n const getCellText = useCallback(\n (r: number, c: number): string => {\n const col = columns[c]\n if (!col) return \"\"\n return formatCellValue(getRawValue(r, c), col, r)\n },\n [columns, getRawValue],\n )\n const applyEdits = useCallback(\n (edits: CellEdit[]) => editBuffer.applyEdits(edits, getBaseValue),\n [editBuffer, getBaseValue],\n )\n\n // --- 選択 ---\n const [selections, setSelections] = useState<Selection[]>([])\n const [activeCell, setActiveCell] = useState<Cell | null>(null)\n const selRects = useMemo(() => normalizeRects(selections), [selections])\n const selMin = selRects.length > 0 ? selRects[selRects.length - 1]! : null\n const activeRange = selections.length > 0 ? selections[selections.length - 1]! : null\n\n const setSelection = useCallback((sel: Selection | null) => {\n setSelections(sel ? [sel] : [])\n }, [])\n const updateActiveSelection = useCallback((sel: Selection) => {\n setSelections((prev) => (prev.length > 0 ? [...prev.slice(0, -1), sel] : [sel]))\n }, [])\n const addSelection = useCallback((sel: Selection) => {\n setSelections((prev) => [...prev, sel])\n }, [])\n\n const isDraggingRef = useRef(false)\n const isRowDraggingRef = useRef(false)\n const isColDraggingRef = useRef(false)\n const rowAnchorRef = useRef<number | null>(null)\n const colAnchorRef = useRef<number | null>(null)\n\n // --- 編集状態 ---\n const [editingCell, setEditingCell] = useState<Cell | null>(null)\n const [editValue, setEditValue] = useState(\"\")\n const editInputRef = useRef<HTMLInputElement>(null)\n const composingRef = useRef(false)\n\n // --- ヘッダ名編集 ---\n const [editingHeader, setEditingHeader] = useState<number | null>(null)\n const [headerEditValue, setHeaderEditValue] = useState(\"\")\n const headerInputRef = useRef<HTMLInputElement>(null)\n\n // --- オートフィル ---\n const [fillDragging, setFillDragging] = useState(false)\n const [fillTarget, setFillTarget] = useState<number | null>(null)\n\n // --- リサイズ ---\n const [resizingCol, setResizingCol] = useState<number | null>(null)\n const resizeStartXRef = useRef(0)\n const resizeStartWRef = useRef(0)\n\n // --- コンテキストメニュー ---\n const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number } | null>(null)\n\n // --- 編集可否 ---\n const columnEditable = useCallback(\n (c: number, r: number): boolean => {\n if (readOnly) return false\n const e = columns[c]?.editable\n if (e === undefined) return true\n return typeof e === \"function\" ? e({ row: r }) : e\n },\n [columns, readOnly],\n )\n\n // --- 検索ハイライト ---\n const searchHitSet = useMemo(() => {\n const s = new Set<string>()\n searchHighlights?.forEach((h) => s.add(`${h.row}:${h.col}`))\n return s\n }, [searchHighlights])\n\n // currentSearchHit が変わったらスクロール\n useEffect(() => {\n const el = bodyRef.current\n if (!currentSearchHit || !el) return\n const targetTop = Math.max(0, (currentSearchHit.row - bodyOffset) * rowHeight)\n const viewH = el.clientHeight\n const st = el.scrollTop\n if (targetTop < st || targetTop > st + viewH - rowHeight) {\n el.scrollTop = Math.max(0, targetTop - viewH / 3)\n }\n }, [currentSearchHit, rowHeight, bodyOffset])\n\n // --- 選択の通知 ---\n useEffect(() => {\n onSelectionChange?.(selections)\n }, [selections, onSelectionChange])\n\n // --- 選択統計 ---\n useEffect(() => {\n if (!onSelectionStats) return\n if (selRects.length === 0) {\n onSelectionStats(null)\n return\n }\n const count = totalCellCount(selRects)\n if (count > HEAVY_CELL_LIMIT) {\n onSelectionStats({ count, numericCount: 0, sum: null, average: null })\n return\n }\n let numericCount = 0\n let sum = 0\n for (const rect of selRects) {\n for (let r = rect.r1; r <= rect.r2; r++) {\n for (let c = rect.c1; c <= rect.c2; c++) {\n const n = numericValue(getRawValue(r, c))\n if (n !== null) {\n sum += n\n numericCount++\n }\n }\n }\n }\n onSelectionStats({\n count,\n numericCount,\n sum: numericCount > 0 ? sum : null,\n average: numericCount > 0 ? sum / numericCount : null,\n })\n }, [selRects, rows, editBuffer.version, onSelectionStats, getRawValue])\n\n // --- スクロール(横方向はヘッダ/固定行へ同期) ---\n const handleScroll = useCallback(() => {\n const body = bodyRef.current\n if (!body) return\n if (headerRef.current) headerRef.current.scrollLeft = body.scrollLeft\n if (frozenRef.current) frozenRef.current.scrollLeft = body.scrollLeft\n setScrollTop(body.scrollTop)\n }, [])\n\n // --- 編集 ---\n const startEdit = useCallback(\n (r: number, c: number, initial?: string) => {\n if (!columnEditable(c, r)) return\n setCtxMenu(null)\n setEditingCell({ row: r, col: c })\n setEditValue(initial ?? cellToInput(getRawValue(r, c)))\n },\n [columnEditable, getRawValue],\n )\n const cancelEdit = useCallback(() => setEditingCell(null), [])\n const commitEdit = useCallback(() => {\n if (!editingCell) return\n const { row, col } = editingCell\n const column = columns[col]\n setEditingCell(null)\n if (!column) return\n const oldValue = getRawValue(row, col)\n const newValue = parseInputValue(editValue, column.type)\n if (column.validate) {\n const result = column.validate(newValue, { row })\n if (result === false || typeof result === \"string\") {\n platform.notify(\"error\", typeof result === \"string\" ? result : \"Invalid value\")\n return\n }\n }\n if (newValue !== oldValue) {\n applyEdits([{ row, col, oldValue, newValue }])\n }\n }, [editingCell, columns, editValue, getRawValue, applyEdits, platform])\n\n useEffect(() => {\n if (editingCell && editInputRef.current) {\n editInputRef.current.focus()\n editInputRef.current.select()\n }\n }, [editingCell])\n\n // --- セル操作 ---\n const handleCellMouseDown = useCallback(\n (r: number, c: number, e: React.MouseEvent) => {\n if (editingCell && editingCell.row === r && editingCell.col === c) return\n if (editingCell) commitEdit()\n setCtxMenu(null)\n if (e.shiftKey && activeCell) {\n updateActiveSelection({ start: activeCell, end: { row: r, col: c } })\n } else if (e.ctrlKey || e.metaKey) {\n setActiveCell({ row: r, col: c })\n addSelection({ start: { row: r, col: c }, end: { row: r, col: c } })\n } else {\n setActiveCell({ row: r, col: c })\n setSelection({ start: { row: r, col: c }, end: { row: r, col: c } })\n }\n isDraggingRef.current = true\n },\n [activeCell, editingCell, commitEdit, setSelection, updateActiveSelection, addSelection],\n )\n\n const handleCellMouseEnter = useCallback(\n (r: number, c: number) => {\n if (isDraggingRef.current && activeCell) {\n updateActiveSelection({ start: activeCell, end: { row: r, col: c } })\n }\n if (isRowDraggingRef.current && rowAnchorRef.current !== null) {\n updateActiveSelection({\n start: { row: rowAnchorRef.current, col: 0 },\n end: { row: r, col: columns.length - 1 },\n })\n }\n if (fillDragging) setFillTarget(r)\n },\n [activeCell, fillDragging, columns.length, updateActiveSelection],\n )\n\n // --- オートフィル適用 ---\n const applyFill = useCallback(() => {\n if (!activeRange || fillTarget === null) return\n const sr = Math.min(activeRange.start.row, activeRange.end.row)\n const er = Math.max(activeRange.start.row, activeRange.end.row)\n const sc = Math.min(activeRange.start.col, activeRange.end.col)\n const ec = Math.max(activeRange.start.col, activeRange.end.col)\n const te = Math.max(er, fillTarget)\n if (te <= er) return\n const edits: CellEdit[] = []\n for (let r = er + 1; r <= te; r++) {\n const srcR = sr + ((r - sr) % (er - sr + 1))\n for (let c = sc; c <= ec; c++) {\n if (!columnEditable(c, r)) continue\n edits.push({\n row: r,\n col: c,\n oldValue: getRawValue(r, c),\n newValue: getRawValue(srcR, c),\n })\n }\n }\n applyEdits(edits)\n setSelection({ start: { row: sr, col: sc }, end: { row: te, col: ec } })\n onAutoFill?.({\n sourceRange: { start: { row: sr, col: sc }, end: { row: er, col: ec } },\n direction: \"down\",\n toEnd: false,\n })\n }, [activeRange, fillTarget, columnEditable, getRawValue, applyEdits, setSelection, onAutoFill])\n\n useEffect(() => {\n const up = () => {\n isDraggingRef.current = false\n isRowDraggingRef.current = false\n isColDraggingRef.current = false\n if (fillDragging && fillTarget !== null) applyFill()\n setFillDragging(false)\n setFillTarget(null)\n }\n window.addEventListener(\"mouseup\", up)\n return () => window.removeEventListener(\"mouseup\", up)\n }, [fillDragging, fillTarget, applyFill])\n\n const handleFillHandleMouseDown = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setFillDragging(true)\n }, [])\n\n // --- 行ヘッダ(行全体の選択) ---\n const fullRow = useCallback(\n (a: number, b: number): Selection => ({\n start: { row: a, col: 0 },\n end: { row: b, col: columns.length - 1 },\n }),\n [columns.length],\n )\n const handleRowHeaderMouseDown = useCallback(\n (r: number, e: React.MouseEvent) => {\n if (editingCell) commitEdit()\n setCtxMenu(null)\n if (e.shiftKey && rowAnchorRef.current !== null) {\n updateActiveSelection(fullRow(rowAnchorRef.current, r))\n } else if (e.ctrlKey || e.metaKey) {\n rowAnchorRef.current = r\n setActiveCell({ row: r, col: 0 })\n addSelection(fullRow(r, r))\n } else {\n rowAnchorRef.current = r\n setActiveCell({ row: r, col: 0 })\n setSelection(fullRow(r, r))\n }\n isRowDraggingRef.current = true\n },\n [editingCell, commitEdit, fullRow, setSelection, updateActiveSelection, addSelection],\n )\n\n // --- 列ヘッダ(列全体の選択) ---\n const fullCol = useCallback(\n (a: number, b: number): Selection => ({\n start: { row: 0, col: a },\n end: { row: total - 1, col: b },\n }),\n [total],\n )\n const handleColHeaderMouseDown = useCallback(\n (c: number, e: React.MouseEvent) => {\n if (editingHeader !== null) return\n if (editingCell) commitEdit()\n setCtxMenu(null)\n if (e.shiftKey && colAnchorRef.current !== null) {\n updateActiveSelection(fullCol(colAnchorRef.current, c))\n } else if (e.ctrlKey || e.metaKey) {\n colAnchorRef.current = c\n setActiveCell({ row: 0, col: c })\n addSelection(fullCol(c, c))\n } else {\n colAnchorRef.current = c\n setActiveCell({ row: 0, col: c })\n setSelection(fullCol(c, c))\n }\n isColDraggingRef.current = true\n },\n [\n editingHeader,\n editingCell,\n commitEdit,\n fullCol,\n setSelection,\n updateActiveSelection,\n addSelection,\n ],\n )\n const handleColHeaderMouseEnter = useCallback(\n (c: number) => {\n if (isColDraggingRef.current && colAnchorRef.current !== null) {\n updateActiveSelection(fullCol(colAnchorRef.current, c))\n }\n },\n [fullCol, updateActiveSelection],\n )\n\n const handleSelectAll = useCallback(() => {\n if (editingCell) commitEdit()\n setActiveCell({ row: 0, col: 0 })\n setSelection({\n start: { row: 0, col: 0 },\n end: { row: total - 1, col: columns.length - 1 },\n })\n }, [editingCell, commitEdit, total, columns.length, setSelection])\n\n // --- ヘッダ名編集 ---\n const startHeaderEdit = useCallback(\n (c: number) => {\n if (!onColumnRename) return\n setEditingCell(null)\n setSelection(null)\n setActiveCell(null)\n setEditingHeader(c)\n setHeaderEditValue(columns[c]?.name ?? \"\")\n },\n [onColumnRename, columns, setSelection],\n )\n const commitHeaderEdit = useCallback(() => {\n if (editingHeader === null) return\n const name = headerEditValue.trim()\n if (name && name !== columns[editingHeader]?.name) onColumnRename?.(editingHeader, name)\n setEditingHeader(null)\n }, [editingHeader, headerEditValue, columns, onColumnRename])\n useEffect(() => {\n if (editingHeader !== null && headerInputRef.current) {\n headerInputRef.current.focus()\n headerInputRef.current.select()\n }\n }, [editingHeader])\n\n // --- ソート(none→asc→desc→なし のトグル) ---\n const handleSortClick = useCallback(\n (c: number) => {\n const name = columns[c]?.name\n if (!name || !onSortChange) return\n const current = sort.find((s) => s.column === name)\n let next: SortSpec[]\n if (!current) next = [...sort, { column: name, direction: \"asc\" }]\n else if (current.direction === \"asc\")\n next = sort.map((s) => (s.column === name ? { ...s, direction: \"desc\" } : s))\n else next = sort.filter((s) => s.column !== name)\n onSortChange(next)\n },\n [columns, onSortChange, sort],\n )\n\n const handleFilterClick = useCallback(\n (c: number, e: React.MouseEvent) => {\n e.stopPropagation()\n if (!onFilterButtonClick) return\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n onFilterButtonClick(c, rect)\n },\n [onFilterButtonClick],\n )\n\n // --- リサイズ ---\n const handleResizeStart = useCallback(\n (c: number, e: React.MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setResizingCol(c)\n resizeStartXRef.current = e.clientX\n resizeStartWRef.current = getColWidth(c)\n },\n [getColWidth],\n )\n useEffect(() => {\n if (resizingCol === null) return\n const move = (e: MouseEvent) => {\n applyColWidth(\n resizingCol,\n resizeStartWRef.current + (e.clientX - resizeStartXRef.current),\n )\n }\n const up = () => setResizingCol(null)\n window.addEventListener(\"mousemove\", move)\n window.addEventListener(\"mouseup\", up)\n return () => {\n window.removeEventListener(\"mousemove\", move)\n window.removeEventListener(\"mouseup\", up)\n }\n }, [resizingCol, applyColWidth])\n\n const measureCanvasRef = useRef<HTMLCanvasElement | null>(null)\n const autoFitColumn = useCallback(\n (c: number) => {\n if (!measureCanvasRef.current)\n measureCanvasRef.current = document.createElement(\"canvas\")\n const ctx = measureCanvasRef.current.getContext(\"2d\")\n if (!ctx) return\n const sample = bodyRef.current?.querySelector(\".vox-cell\")\n if (sample) {\n const cs = getComputedStyle(sample)\n ctx.font = `${cs.fontWeight} ${cs.fontSize} ${cs.fontFamily}`\n } else {\n ctx.font = `${fontSize}px sans-serif`\n }\n let max = ctx.measureText(columns[c]?.name ?? \"\").width + 48\n rows.forEach((_, r) => {\n const text = getCellText(r, c)\n if (text) max = Math.max(max, ctx.measureText(text).width)\n })\n applyColWidth(c, Math.min(MAX_AUTOFIT_WIDTH, max + 16))\n },\n [columns, rows, getCellText, applyColWidth, fontSize],\n )\n\n // --- クリップボード ---\n const handleCopy = useCallback(async () => {\n if (selRects.length === 0) return\n if (totalCellCount(selRects) > HEAVY_CELL_LIMIT) {\n platform.notify(\"error\", \"Selection is too large to copy\")\n return\n }\n try {\n await platform.writeText(buildTsv(selRects, getCellText))\n } catch (err) {\n onError?.(err, { phase: \"commit\" })\n }\n }, [selRects, platform, getCellText, onError])\n\n const handleCut = useCallback(async () => {\n if (readOnly) return\n await handleCopy()\n if (selRects.length === 0 || totalCellCount(selRects) > HEAVY_CELL_LIMIT) return\n const edits: CellEdit[] = []\n const seen = new Set<string>()\n for (const rect of selRects) {\n for (let r = rect.r1; r <= rect.r2; r++) {\n for (let c = rect.c1; c <= rect.c2; c++) {\n const key = `${r}:${c}`\n if (seen.has(key) || !columnEditable(c, r)) continue\n seen.add(key)\n edits.push({ row: r, col: c, oldValue: getRawValue(r, c), newValue: null })\n }\n }\n }\n applyEdits(edits)\n }, [readOnly, handleCopy, selRects, columnEditable, getRawValue, applyEdits])\n\n const handlePaste = useCallback(async () => {\n if (readOnly || !activeCell) return\n try {\n const text = await platform.readText()\n const grid = parseTsv(text)\n const edits: CellEdit[] = []\n for (let ri = 0; ri < grid.length; ri++) {\n const line = grid[ri]!\n for (let ci = 0; ci < line.length; ci++) {\n const tr = activeCell.row + ri\n const tc = activeCell.col + ci\n if (tr >= total || tc >= columns.length || !columnEditable(tc, tr)) continue\n edits.push({\n row: tr,\n col: tc,\n oldValue: getRawValue(tr, tc),\n newValue: parseInputValue(line[ci] ?? \"\", columns[tc]?.type),\n })\n }\n }\n applyEdits(edits)\n } catch (err) {\n onError?.(err, { phase: \"commit\" })\n }\n }, [\n readOnly,\n activeCell,\n platform,\n total,\n columns,\n columnEditable,\n getRawValue,\n applyEdits,\n onError,\n ])\n\n // --- キーボード ---\n const moveActive = useCallback(\n (nr: number, nc: number, extend: boolean) => {\n const row = Math.max(0, Math.min(total - 1, nr))\n const col = Math.max(0, Math.min(columns.length - 1, nc))\n setActiveCell({ row, col })\n if (extend && activeRange) {\n updateActiveSelection({ start: activeRange.start, end: { row, col } })\n } else {\n setSelection({ start: { row, col }, end: { row, col } })\n }\n // 可視範囲外なら追従スクロール\n const el = bodyRef.current\n if (el) {\n const top = (row - bodyOffset) * rowHeight\n if (top < el.scrollTop) el.scrollTop = top\n else if (top + rowHeight > el.scrollTop + el.clientHeight)\n el.scrollTop = top + rowHeight - el.clientHeight\n }\n },\n [\n total,\n columns.length,\n activeRange,\n updateActiveSelection,\n setSelection,\n bodyOffset,\n rowHeight,\n ],\n )\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (editingHeader !== null) return\n if (activeCell && onCellKeyDown) {\n const column = columns[activeCell.col]\n if (column) {\n onCellKeyDown(e, {\n row: activeCell.row,\n col: activeCell.col,\n value: getRawValue(activeCell.row, activeCell.col),\n column,\n })\n if (e.defaultPrevented) return\n }\n }\n\n const mod = e.ctrlKey || e.metaKey\n if (mod && !editingCell) {\n if (e.key === \"a\") {\n e.preventDefault()\n handleSelectAll()\n return\n }\n if (e.key === \"c\") {\n e.preventDefault()\n void handleCopy()\n return\n }\n if (!readOnly && e.key === \"x\") {\n e.preventDefault()\n void handleCut()\n return\n }\n if (!readOnly && e.key === \"v\") {\n e.preventDefault()\n void handlePaste()\n return\n }\n if (!readOnly && e.key === \"z\") {\n e.preventDefault()\n editBuffer.undo()\n return\n }\n if (!readOnly && e.key === \"y\") {\n e.preventDefault()\n editBuffer.redo()\n return\n }\n }\n\n if (editingCell) {\n if (e.key === \"Enter\" && !composingRef.current) {\n e.preventDefault()\n commitEdit()\n moveActive(editingCell.row + 1, editingCell.col, false)\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n cancelEdit()\n } else if (e.key === \"Tab\") {\n e.preventDefault()\n commitEdit()\n moveActive(editingCell.row, editingCell.col + (e.shiftKey ? -1 : 1), false)\n }\n return\n }\n\n if (!activeCell) return\n if (readOnly && !e.key.startsWith(\"Arrow\") && e.key !== \"Tab\") return\n const { row: r, col: c } = activeCell\n const extend = e.shiftKey && e.key.startsWith(\"Arrow\")\n if (e.key === \"ArrowDown\") {\n e.preventDefault()\n moveActive(r + 1, c, extend)\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault()\n moveActive(r - 1, c, extend)\n } else if (e.key === \"ArrowRight\") {\n e.preventDefault()\n moveActive(r, c + 1, extend)\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault()\n moveActive(r, c - 1, extend)\n } else if (e.key === \"Tab\") {\n e.preventDefault()\n moveActive(r, c + (e.shiftKey ? -1 : 1), false)\n } else if (e.key === \"Enter\") {\n e.preventDefault()\n if (r >= total - 1) onAppendRow?.(total)\n else moveActive(r + 1, c, false)\n } else if (e.key === \"Home\") {\n e.preventDefault()\n moveActive(r, mod ? 0 : 0, extend)\n if (mod) moveActive(0, 0, extend)\n } else if (e.key === \"End\") {\n e.preventDefault()\n if (mod) moveActive(total - 1, columns.length - 1, extend)\n else moveActive(r, columns.length - 1, extend)\n } else if (e.key === \"PageDown\") {\n e.preventDefault()\n moveActive(r + Math.floor(viewportHeight / rowHeight), c, extend)\n } else if (e.key === \"PageUp\") {\n e.preventDefault()\n moveActive(r - Math.floor(viewportHeight / rowHeight), c, extend)\n } else if (!readOnly && (e.key === \"Delete\" || e.key === \"Backspace\")) {\n e.preventDefault()\n startEdit(r, c, \"\")\n } else if (!readOnly && e.key === \"F2\") {\n e.preventDefault()\n startEdit(r, c)\n } else if (!readOnly && e.key.length === 1 && !mod && !e.altKey) {\n startEdit(r, c, e.key)\n }\n },\n [\n editingHeader,\n activeCell,\n onCellKeyDown,\n columns,\n getRawValue,\n editingCell,\n readOnly,\n handleSelectAll,\n handleCopy,\n handleCut,\n handlePaste,\n editBuffer,\n commitEdit,\n cancelEdit,\n moveActive,\n total,\n onAppendRow,\n viewportHeight,\n rowHeight,\n startEdit,\n ],\n )\n\n // --- コンテキストメニュー ---\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (readOnly) {\n e.preventDefault()\n return\n }\n e.preventDefault()\n setCtxMenu({ x: e.clientX, y: e.clientY })\n },\n [readOnly],\n )\n const deleteSelectedRows = useCallback(() => {\n if (selRects.length === 0) return\n const set = new Set<number>()\n for (const rect of selRects) for (let r = rect.r1; r <= rect.r2; r++) set.add(r)\n onDeleteRows?.(Array.from(set).sort((a, b) => a - b))\n }, [selRects, onDeleteRows])\n\n // --- 命令的ハンドル ---\n useImperativeHandle(\n ref,\n (): VoxSheetHandle => ({\n scrollToRow: (row) => {\n if (bodyRef.current)\n bodyRef.current.scrollTop = Math.max(0, (row - bodyOffset) * rowHeight)\n },\n scrollToCell: (row, col) => {\n if (bodyRef.current)\n bodyRef.current.scrollTop = Math.max(0, (row - bodyOffset) * rowHeight)\n let left = 0\n for (let i = 0; i < col; i++) left += getColWidth(i)\n if (bodyRef.current) bodyRef.current.scrollLeft = left\n },\n focusCell: (row, col) => {\n setActiveCell({ row, col })\n setSelection({ start: { row, col }, end: { row, col } })\n rootRef.current?.focus()\n },\n getSelection: () => selections,\n setSelection: (sel) => setSelections(sel),\n startEdit: (row, col) => startEdit(row, col),\n getLocalEdits: () => editBuffer.getLocalEdits(),\n clearLocalEdits: () => editBuffer.clear(),\n undo: () => editBuffer.undo(),\n redo: () => editBuffer.redo(),\n invalidate: () => invalidate(),\n }),\n [\n bodyOffset,\n rowHeight,\n getColWidth,\n selections,\n setSelection,\n startEdit,\n editBuffer,\n invalidate,\n ],\n )\n\n // --- レンダリング ---\n const headerWidth = ROW_HEADER_WIDTH + columns.reduce((sum, _, i) => sum + getColWidth(i), 0)\n const totalHeight = Math.max(0, total - bodyOffset) * rowHeight\n const fillRow = selMin ? selMin.r2 : null\n const fillCol = selMin ? selMin.c2 : null\n\n const renderHeaderActions = (c: number): ReactElement | null => {\n if (readOnly || (!onSortChange && !onFilterButtonClick)) return null\n const name = columns[c]?.name ?? \"\"\n const sortIndex = sort.findIndex((s) => s.column === name)\n const sortSpec = sortIndex >= 0 ? sort[sortIndex] : undefined\n const hasFilter = filters.some((f) => f.column === name)\n const SortIcon = sortSpec\n ? sortSpec.direction === \"asc\"\n ? icons.sortAscending\n : icons.sortDescending\n : icons.sortUnsorted\n const FilterIcon = hasFilter ? icons.filterActive : icons.filter\n return (\n <span className=\"vox-header-actions\" onMouseDown={(e) => e.stopPropagation()}>\n {onFilterButtonClick && (\n <button\n type=\"button\"\n className=\"vox-header-btn\"\n title=\"Filter\"\n aria-label={`Filter ${name}`}\n onClick={(e) => handleFilterClick(c, e)}\n >\n <FilterIcon size={13} />\n </button>\n )}\n {onSortChange && (\n <button\n type=\"button\"\n className=\"vox-header-btn\"\n title=\"Sort\"\n aria-label={`Sort ${name}`}\n onClick={(e) => {\n e.stopPropagation()\n handleSortClick(c)\n }}\n >\n <SortIcon size={13} />\n {sortSpec && sort.length > 1 && <sup>{sortIndex + 1}</sup>}\n </button>\n )}\n </span>\n )\n }\n\n const renderRow = (rowIdx: number, top: number): ReactElement => {\n const entry = rows.get(rowIdx)\n const rowSelected = selRects.some(\n (rect) =>\n rowIdx >= rect.r1 &&\n rowIdx <= rect.r2 &&\n rect.c1 === 0 &&\n rect.c2 === columns.length - 1,\n )\n const ordinal = entry ? Math.floor(entry.ordinal) : rowIdx + 1\n return (\n <div\n key={rowIdx}\n className=\"vox-row\"\n style={{ top, height: rowHeight }}\n aria-rowindex={rowIdx + 1}\n >\n <div\n className={`vox-row-header${rowSelected ? \" vox-row-header--selected\" : \"\"}`}\n style={{ width: ROW_HEADER_WIDTH, height: rowHeight }}\n onMouseDown={(e) => handleRowHeaderMouseDown(rowIdx, e)}\n onMouseEnter={() =>\n isRowDraggingRef.current &&\n rowAnchorRef.current !== null &&\n updateActiveSelection(fullRow(rowAnchorRef.current, rowIdx))\n }\n >\n {ordinal.toLocaleString()}\n </div>\n {columns.map((col, c) => {\n const selected = cellInRects(selRects, rowIdx, c)\n const isActive = activeCell?.row === rowIdx && activeCell?.col === c\n const isEditing = editingCell?.row === rowIdx && editingCell?.col === c\n const dirty = editBuffer.isDirty(rowIdx, c)\n const hit = searchHitSet.has(`${rowIdx}:${c}`)\n const isCurrent =\n currentSearchHit?.row === rowIdx && currentSearchHit?.col === c\n const showFill =\n !fillDragging &&\n rowIdx === fillRow &&\n c === fillCol &&\n selMin !== null &&\n !readOnly\n const isFillPreview =\n fillDragging &&\n fillTarget !== null &&\n selMin !== null &&\n rowIdx > selMin.r2 &&\n rowIdx <= fillTarget &&\n c >= selMin.c1 &&\n c <= selMin.c2\n const align = col.align ?? defaultAlign(col.type)\n const cls =\n \"vox-cell\" +\n (selected ? \" vox-cell--selected\" : \"\") +\n (isActive ? \" vox-cell--active\" : \"\") +\n (dirty ? \" vox-cell--dirty\" : \"\") +\n (isFillPreview ? \" vox-cell--selected\" : \"\") +\n (hit ? \" vox-cell--search-hit\" : \"\") +\n (isCurrent ? \" vox-cell--search-current\" : \"\")\n return (\n <div\n key={c}\n className={cls}\n role=\"gridcell\"\n aria-selected={selected}\n aria-colindex={c + 1}\n style={{\n width: getColWidth(c),\n height: rowHeight,\n justifyContent: alignToJustify(align),\n }}\n onMouseDown={(e) => handleCellMouseDown(rowIdx, c, e)}\n onMouseEnter={() => handleCellMouseEnter(rowIdx, c)}\n onDoubleClick={() => startEdit(rowIdx, c)}\n onContextMenu={handleContextMenu}\n >\n {isEditing ? (\n <input\n ref={editInputRef}\n className=\"vox-cell-input\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onBlur={commitEdit}\n onCompositionStart={() => (composingRef.current = true)}\n onCompositionEnd={() => (composingRef.current = false)}\n />\n ) : (\n getCellText(rowIdx, c)\n )}\n {showFill && (\n <div\n className=\"vox-fill-handle\"\n onMouseDown={handleFillHandleMouseDown}\n />\n )}\n </div>\n )\n })}\n </div>\n )\n }\n\n const bodyRows: ReactElement[] = []\n for (let r = visibleStart; r < visibleEnd; r++) {\n bodyRows.push(renderRow(r, (r - bodyOffset) * rowHeight))\n }\n\n const rootStyle: CSSProperties = {\n [\"--vox-row-height\" as string]: `${rowHeight}px`,\n [\"--vox-font-size\" as string]: `${fontSize}px`,\n [\"--vox-row-header-width\" as string]: `${ROW_HEADER_WIDTH}px`,\n ...style,\n }\n\n const isEmpty = total === 0 && status !== \"loading\"\n\n return (\n <div\n ref={rootRef}\n className={`vox-sheet${className ? ` ${className}` : \"\"}`}\n data-vox-theme={theme === \"system\" ? undefined : theme}\n role=\"grid\"\n aria-rowcount={total}\n aria-colcount={columns.length}\n aria-readonly={readOnly}\n tabIndex={0}\n style={rootStyle}\n onKeyDown={handleKeyDown}\n onContextMenu={readOnly ? (e) => e.preventDefault() : undefined}\n >\n <div className=\"vox-header-wrap\" style={{ paddingRight: scrollbarWidth }}>\n <div\n className=\"vox-corner\"\n style={{ width: ROW_HEADER_WIDTH }}\n onClick={handleSelectAll}\n />\n <div className=\"vox-header\" ref={headerRef} role=\"row\">\n {columns.map((col, c) => {\n const colSelected = selRects.some(\n (rect) =>\n c >= rect.c1 &&\n c <= rect.c2 &&\n rect.r1 === 0 &&\n rect.r2 === total - 1,\n )\n const sortName = col.name\n const sortSpec = sort.find((s) => s.column === sortName)\n return (\n <div\n key={c}\n className=\"vox-header-cell\"\n role=\"columnheader\"\n aria-colindex={c + 1}\n aria-sort={\n sortSpec\n ? sortSpec.direction === \"asc\"\n ? \"ascending\"\n : \"descending\"\n : \"none\"\n }\n style={{\n width: getColWidth(c),\n background: colSelected\n ? \"var(--vox-color-selection-bg)\"\n : undefined,\n }}\n onMouseDown={(e) => handleColHeaderMouseDown(c, e)}\n onMouseEnter={() => handleColHeaderMouseEnter(c)}\n >\n {editingHeader === c ? (\n <input\n ref={headerInputRef}\n className=\"vox-cell-input\"\n value={headerEditValue}\n onChange={(e) => setHeaderEditValue(e.target.value)}\n onBlur={commitHeaderEdit}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n commitHeaderEdit()\n } else if (e.key === \"Escape\") {\n e.preventDefault()\n setEditingHeader(null)\n }\n }}\n />\n ) : (\n <span\n className=\"vox-header-label\"\n onDoubleClick={\n onColumnRename\n ? (e) => {\n e.stopPropagation()\n startHeaderEdit(c)\n }\n : undefined\n }\n >\n {col.name}\n </span>\n )}\n {renderHeaderActions(c)}\n <div\n className=\"vox-resize-handle\"\n onMouseDown={(e) => handleResizeStart(c, e)}\n onDoubleClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n autoFitColumn(c)\n }}\n />\n </div>\n )\n })}\n {onAddColumn && (\n <button\n type=\"button\"\n className=\"vox-add-column\"\n title=\"Add column\"\n onClick={() => onAddColumn(columns.length)}\n >\n +\n </button>\n )}\n </div>\n </div>\n\n <div className=\"vox-body\" ref={bodyRef} onScroll={handleScroll}>\n <div\n className=\"vox-scroll-spacer\"\n style={{ height: totalHeight, width: headerWidth }}\n >\n {bodyRows}\n {selRects.map((rect, i) => (\n <div\n key={`sel-${i}`}\n className=\"vox-selection-outline\"\n style={{\n left: colLeft(rect.c1),\n top: (rect.r1 - bodyOffset) * rowHeight,\n width: colLeft(rect.c2) + getColWidth(rect.c2) - colLeft(rect.c1),\n height: (rect.r2 - rect.r1 + 1) * rowHeight,\n }}\n />\n ))}\n </div>\n </div>\n\n {status === \"loading\" && total === 0 && (\n <div className=\"vox-overlay\">\n {renderLoading ? renderLoading() : labels.loading}\n </div>\n )}\n {isEmpty && (\n <div className=\"vox-overlay\">{renderEmpty ? renderEmpty() : labels.empty}</div>\n )}\n\n {ctxMenu && (\n <ContextMenu\n x={ctxMenu.x}\n y={ctxMenu.y}\n onClose={() => setCtxMenu(null)}\n items={[\n {\n label: labels.contextCut,\n action: () => void handleCut(),\n disabled: !selMin,\n },\n {\n label: labels.contextCopy,\n action: () => void handleCopy(),\n disabled: !selMin,\n },\n {\n label: labels.contextPaste,\n action: () => void handlePaste(),\n disabled: !activeCell,\n },\n ...(onInsertRow\n ? ([\n \"sep\" as const,\n {\n label: labels.contextInsertRowAbove,\n action: () =>\n activeCell && onInsertRow(activeCell.row, \"above\"),\n disabled: !activeCell,\n },\n {\n label: labels.contextInsertRowBelow,\n action: () =>\n activeCell && onInsertRow(activeCell.row, \"below\"),\n disabled: !activeCell,\n },\n ] as const)\n : []),\n ...(onDeleteRows\n ? ([\n \"sep\" as const,\n {\n label: labels.contextDeleteRows,\n action: deleteSelectedRows,\n disabled: selRects.length === 0,\n },\n ] as const)\n : []),\n \"sep\" as const,\n {\n label: labels.contextUndo,\n action: () => editBuffer.undo(),\n disabled: !editBuffer.canUndo(),\n },\n {\n label: labels.contextRedo,\n action: () => editBuffer.redo(),\n disabled: !editBuffer.canRedo(),\n },\n ]}\n />\n )}\n </div>\n )\n}\n\nconst alignToJustify = (align: \"left\" | \"right\" | \"center\"): string =>\n align === \"right\" ? \"flex-end\" : align === \"center\" ? \"center\" : \"flex-start\"\n\ntype CtxItem = { label: string; action: () => void; disabled?: boolean }\n\nconst ContextMenu = ({\n x,\n y,\n items,\n onClose,\n}: {\n x: number\n y: number\n items: (CtxItem | \"sep\")[]\n onClose: () => void\n}): ReactElement => {\n const ref = useRef<HTMLDivElement>(null)\n useEffect(() => {\n const close = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose()\n }\n document.addEventListener(\"mousedown\", close)\n return () => document.removeEventListener(\"mousedown\", close)\n }, [onClose])\n return (\n <div ref={ref} className=\"vox-context-menu\" style={{ left: x, top: y }} role=\"menu\">\n {items.map((item, i) =>\n item === \"sep\" ? (\n <div key={i} className=\"vox-context-separator\" />\n ) : (\n <button\n key={i}\n type=\"button\"\n className=\"vox-context-item\"\n role=\"menuitem\"\n disabled={item.disabled}\n onClick={() => {\n item.action()\n onClose()\n }}\n >\n {item.label}\n </button>\n ),\n )}\n </div>\n )\n}\n\nexport const VoxSheet = forwardRef<VoxSheetHandle, VoxSheetProps>(VoxSheetInner)\n"],"names":["CHUNK","FETCH_DEBOUNCE_MS","useChunks","params","fetchRows","totalRows","columns","sort","filters","search","queryKey","frozenRows","startRow","endRow","onError","cacheRef","useRef","pendingRef","controllersRef","rows","setRows","useState","total","setTotal","status","setStatus","invalidationKey","c","reset","useCallback","controller","useEffect","rebuildVisible","next","offset","chunk","row","i","loadChunks","effectiveTotal","offsets","from","to","o","targets","jobs","limit","result","values","error","prev","timer","invalidate","MAX_UNDO","keyOf","col","useEditBuffer","onCellChange","onDirtyChange","editsRef","originalRef","undoRef","redoRef","version","setVersion","notifyDirty","applyValue","value","getBase","key","original","applyEdits","edits","edit","v","noBase","undo","action","redo","getEditedValue","isDirty","getLocalEdits","newValue","rs","cs","clear","canUndo","canRedo","useMemo","defaultAlign","type","toDate","formatCellValue","column","format","d","parseInputValue","raw","n","lower","numericValue","normalizeRect","sel","normalizeRects","selections","rectContains","rect","cellInRects","rects","totalCellCount","sum","escapeCell","text","buildTsv","getValue","rectToLines","lines","r","cells","first","sorted","a","b","parseTsv","cell","inQuotes","pushCell","pushRow","ch","svgProps","props","SortAscending","jsx","SortDescending","SortUnsorted","Filter","FilterActive","DEFAULT_ICONS","resolveIcons","overrides","DEFAULT_LABELS","resolveLabels","hasDom","defaultReadText","defaultWriteText","toastSeq","ensureToastContainer","el","defaultNotify","kind","message","opts","container","id","toast","duration","defaultConfirm","resolve","backdrop","modal","close","title","body","footer","cancel","ok","e","defaultSaveFile","blob","url","resolvePlatform","platform","DENSITY","ROW_HEADER_WIDTH","OVERSCAN","MIN_COL_WIDTH","MAX_AUTOFIT_WIDTH","HEAVY_CELL_LIMIT","cellToInput","VoxSheetInner","ref","density","defaultColumnWidth","theme","className","style","readOnly","searchHighlights","currentSearchHit","renderLoading","renderEmpty","labelOverrides","iconOverrides","platformOverride","onSortChange","onFilterButtonClick","onColumnResize","onColumnRename","onAddColumn","onAppendRow","onInsertRow","onDeleteRows","onAutoFill","onSelectionChange","onSelectionStats","onCellKeyDown","labels","icons","rowHeight","fontSize","rootRef","bodyRef","headerRef","frozenRef","scrollTop","setScrollTop","viewportHeight","setViewportHeight","scrollbarWidth","setScrollbarWidth","colWidths","setColWidths","widthMemoryRef","prevNamesRef","memory","oldName","newName","getColWidth","colLeft","x","applyColWidth","width","w","name","measure","observer","bodyOffset","desiredStart","desiredEnd","visibleStart","visibleEnd","editBuffer","getBaseValue","getRawValue","edited","getCellText","setSelections","activeCell","setActiveCell","selRects","selMin","activeRange","setSelection","updateActiveSelection","addSelection","isDraggingRef","isRowDraggingRef","isColDraggingRef","rowAnchorRef","colAnchorRef","editingCell","setEditingCell","editValue","setEditValue","editInputRef","composingRef","editingHeader","setEditingHeader","headerEditValue","setHeaderEditValue","headerInputRef","fillDragging","setFillDragging","fillTarget","setFillTarget","resizingCol","setResizingCol","resizeStartXRef","resizeStartWRef","ctxMenu","setCtxMenu","columnEditable","searchHitSet","s","h","targetTop","viewH","st","count","numericCount","handleScroll","startEdit","initial","cancelEdit","commitEdit","oldValue","handleCellMouseDown","handleCellMouseEnter","applyFill","sr","er","sc","ec","te","srcR","up","handleFillHandleMouseDown","fullRow","handleRowHeaderMouseDown","fullCol","handleColHeaderMouseDown","handleColHeaderMouseEnter","handleSelectAll","startHeaderEdit","commitHeaderEdit","handleSortClick","current","handleFilterClick","handleResizeStart","move","measureCanvasRef","autoFitColumn","ctx","sample","max","_","handleCopy","err","handleCut","seen","handlePaste","grid","ri","line","ci","tr","tc","moveActive","nr","nc","extend","top","handleKeyDown","mod","handleContextMenu","deleteSelectedRows","set","useImperativeHandle","left","headerWidth","totalHeight","fillRow","fillCol","renderHeaderActions","sortIndex","sortSpec","hasFilter","f","SortIcon","FilterIcon","jsxs","renderRow","rowIdx","entry","rowSelected","ordinal","selected","isActive","isEditing","dirty","hit","isCurrent","showFill","isFillPreview","align","cls","alignToJustify","bodyRows","rootStyle","isEmpty","colSelected","sortName","ContextMenu","y","items","onClose","item","VoxSheet","forwardRef"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { VoxSheet } from "./VoxSheet";
2
+ export { DEFAULT_LABELS } from "./labels";
3
+ export { DEFAULT_ICONS } from "./icons";
4
+ export type { CellAddress, CellContext, CellEdit, CellValue, Column, ColumnAlign, ColumnFormat, ColumnType, ConfirmOptions, EditAction, FetchResult, FetchRowsFn, FilterOperator, FilterSpec, IconName, IconProps, IconRenderer, Icons, PlatformAdapter, Query, Selection, SelectionStats, SortDirection, SortSpec, ToastKind, VoxLabels, VoxSheetHandle, VoxSheetProps, } from "./types";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvC,YAAY,EACR,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,MAAM,EACN,WAAW,EACX,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,KAAK,EACL,eAAe,EACf,KAAK,EACL,SAAS,EACT,cAAc,EACd,aAAa,EACb,QAAQ,EACR,SAAS,EACT,SAAS,EACT,cAAc,EACd,aAAa,GAChB,MAAM,SAAS,CAAA"}