@comitor/ui 3.0.0 → 3.1.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 (110) hide show
  1. package/README.md +5 -1
  2. package/dist/components/composite/confirm-dialog.js +56 -35
  3. package/dist/components/composite/confirm-dialog.js.map +1 -1
  4. package/dist/components/composite/search-filter-bar-constants.d.ts +3 -0
  5. package/dist/components/composite/search-filter-bar-constants.js.map +1 -1
  6. package/dist/components/composite/table-pagination-constants.d.ts +3 -1
  7. package/dist/components/composite/table-pagination-constants.js.map +1 -1
  8. package/dist/components/composite/table-pagination.js +10 -2
  9. package/dist/components/composite/table-pagination.js.map +1 -1
  10. package/dist/components/composite/text-utils.d.ts +4 -23
  11. package/dist/components/composite/text-utils.js +1 -11
  12. package/dist/components/composite/text-utils.js.map +1 -1
  13. package/dist/components/composite/toast.d.ts +2 -1
  14. package/dist/components/composite/toast.js +3 -9
  15. package/dist/components/composite/toast.js.map +1 -1
  16. package/dist/components/ui/action-bar.js +45 -1
  17. package/dist/components/ui/action-bar.js.map +1 -1
  18. package/dist/components/ui/banner.d.ts +8 -0
  19. package/dist/components/ui/banner.js +149 -35
  20. package/dist/components/ui/banner.js.map +1 -1
  21. package/dist/components/ui/circular-progress.js +10 -2
  22. package/dist/components/ui/circular-progress.js.map +1 -1
  23. package/dist/components/ui/kanban.js +9 -3
  24. package/dist/components/ui/kanban.js.map +1 -1
  25. package/dist/components/ui/key-value.js +70 -76
  26. package/dist/components/ui/key-value.js.map +1 -1
  27. package/dist/components/ui/mask-input-constants.d.ts +34 -2
  28. package/dist/components/ui/mask-input-constants.js +87 -76
  29. package/dist/components/ui/mask-input-constants.js.map +1 -1
  30. package/dist/components/ui/mask-input.d.ts +6 -5
  31. package/dist/components/ui/mask-input.js +23 -21
  32. package/dist/components/ui/mask-input.js.map +1 -1
  33. package/dist/components/ui/mention.d.ts +14 -2
  34. package/dist/components/ui/mention.js +33 -6
  35. package/dist/components/ui/mention.js.map +1 -1
  36. package/dist/components/ui/phone-input.d.ts +18 -8
  37. package/dist/components/ui/phone-input.js +125 -35
  38. package/dist/components/ui/phone-input.js.map +1 -1
  39. package/dist/components/ui/rating.js +4 -2
  40. package/dist/components/ui/rating.js.map +1 -1
  41. package/dist/components/ui/scroll-spy.js +46 -31
  42. package/dist/components/ui/scroll-spy.js.map +1 -1
  43. package/dist/components/ui/slider.d.ts +1 -1
  44. package/dist/components/ui/slider.js +15 -1
  45. package/dist/components/ui/slider.js.map +1 -1
  46. package/dist/components/ui/sonner.js +2 -0
  47. package/dist/components/ui/sonner.js.map +1 -1
  48. package/dist/components/ui/stepper.js +26 -3
  49. package/dist/components/ui/stepper.js.map +1 -1
  50. package/dist/components/ui/time-picker.d.ts +24 -4
  51. package/dist/components/ui/time-picker.js +425 -162
  52. package/dist/components/ui/time-picker.js.map +1 -1
  53. package/dist/components/ui/timeline.js +45 -9
  54. package/dist/components/ui/timeline.js.map +1 -1
  55. package/dist/components/ui/toggle-group.js +12 -1
  56. package/dist/components/ui/toggle-group.js.map +1 -1
  57. package/dist/components/ui/tour.js +3 -2
  58. package/dist/components/ui/tour.js.map +1 -1
  59. package/dist/data-grid/data-grid-cell-variants.js +4 -4
  60. package/dist/data-grid/data-grid-cell-variants.js.map +1 -1
  61. package/dist/data-grid/data-grid-cell-wrapper.d.ts +1 -1
  62. package/dist/data-grid/data-grid-cell-wrapper.js +6 -0
  63. package/dist/data-grid/data-grid-cell-wrapper.js.map +1 -1
  64. package/dist/data-grid/data-grid-row.js +1 -1
  65. package/dist/data-grid/data-grid-row.js.map +1 -1
  66. package/dist/data-grid/data-grid-select-column.js +6 -2
  67. package/dist/data-grid/data-grid-select-column.js.map +1 -1
  68. package/dist/data-grid/data-grid-skeleton.d.ts +5 -0
  69. package/dist/data-grid/data-grid-skeleton.js +1 -4
  70. package/dist/data-grid/data-grid-skeleton.js.map +1 -1
  71. package/dist/data-grid/data-grid.d.ts +1 -1
  72. package/dist/data-grid/data-grid.js +3 -2
  73. package/dist/data-grid/data-grid.js.map +1 -1
  74. package/dist/data-grid/filters.js +3 -2
  75. package/dist/data-grid/filters.js.map +1 -1
  76. package/dist/data-grid/types.d.ts +7 -0
  77. package/dist/data-grid/use-data-grid.d.ts +1 -0
  78. package/dist/data-grid/use-data-grid.js +70 -24
  79. package/dist/data-grid/use-data-grid.js.map +1 -1
  80. package/dist/data-grid/utils.d.ts +7 -0
  81. package/dist/data-grid/utils.js +3 -1
  82. package/dist/data-grid/utils.js.map +1 -1
  83. package/dist/i18n/locale-provider.d.ts +18 -0
  84. package/dist/i18n/locale-provider.js.map +1 -1
  85. package/dist/i18n/namespaces/rating.js +2 -1
  86. package/dist/i18n/namespaces/rating.js.map +1 -1
  87. package/dist/i18n/namespaces/search-filter-bar.js +8 -6
  88. package/dist/i18n/namespaces/search-filter-bar.js.map +1 -1
  89. package/dist/i18n/namespaces/shell.d.ts +4 -0
  90. package/dist/i18n/namespaces/shell.js +1 -1
  91. package/dist/i18n/namespaces/shell.js.map +1 -1
  92. package/dist/i18n/namespaces/table-pagination.js +6 -4
  93. package/dist/i18n/namespaces/table-pagination.js.map +1 -1
  94. package/dist/i18n/namespaces/toast.d.ts +3 -2
  95. package/dist/i18n/namespaces/toast.js.map +1 -1
  96. package/dist/index.d.ts +2 -1
  97. package/dist/lib/collect-item-elements.d.ts +47 -0
  98. package/dist/lib/collect-item-elements.js +22 -0
  99. package/dist/lib/collect-item-elements.js.map +1 -0
  100. package/dist/lib/text-search.d.ts +32 -0
  101. package/dist/lib/text-search.js +17 -0
  102. package/dist/lib/text-search.js.map +1 -0
  103. package/dist/lib/toast-language.d.ts +8 -0
  104. package/dist/lib/toast-language.js +19 -0
  105. package/dist/lib/toast-language.js.map +1 -0
  106. package/dist/shell/app-shell.d.ts +1 -0
  107. package/dist/shell/index.d.ts +2 -1
  108. package/dist/shell/shell-context.d.ts +1 -0
  109. package/dist/shell/utils.d.ts +2 -1
  110. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/data-grid/use-data-grid.ts"],"sourcesContent":["\"use client\";\n\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport {\n type ColumnDef,\n type ColumnFiltersState,\n getCoreRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n type Row,\n type RowSelectionState,\n type SortingState,\n type TableMeta,\n type TableOptions,\n type TableState,\n type Updater,\n useReactTable\n} from \"@tanstack/react-table\";\nimport { useVirtualizer, type Virtualizer } from \"@tanstack/react-virtual\";\nimport * as React from \"react\";\nimport { useAsRef } from \"../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../lib/use-lazy-ref.js\";\nimport { useResolvedDataGridLocale } from \"./data-grid-locale.js\";\nimport type { DataGridLocale, DataGridMessages } from \"./messages.js\";\nimport { toastError, toastSuccess } from \"./toast.js\";\nimport type {\n CellPosition,\n CellUpdate,\n ContextMenuState,\n Direction,\n FileCellData,\n NavigationDirection,\n PasteDialogState,\n RowHeightValue,\n SearchState,\n SelectionState\n} from \"./types.js\";\nimport {\n formatDate,\n getCellKey,\n getEmptyCellValue,\n getIsFileCellData,\n getIsInPopover,\n getRowHeightValue,\n getScrollDirection,\n matchSelectOption,\n parseCellKey,\n parseDateInput,\n parseTsv,\n readClipboardText,\n scrollCellIntoView,\n writeClipboardText\n} from \"./utils.js\";\n\nconst DEFAULT_ROW_HEIGHT = \"short\";\nconst OVERSCAN = 6;\nconst VIEWPORT_OFFSET = 1;\nconst HORIZONTAL_PAGE_SIZE = 5;\nconst SCROLL_SYNC_RETRY_COUNT = 16;\nconst MIN_COLUMN_SIZE = 60;\nconst MAX_COLUMN_SIZE = 800;\nconst SEARCH_SHORTCUT_KEY = \"f\";\nconst NON_NAVIGABLE_COLUMN_IDS = new Set([\"select\", \"actions\"]);\nconst AUTO_SCROLL_EDGE_ZONE = 50;\nconst AUTO_SCROLL_SPEED_RAMP_ZONE = AUTO_SCROLL_EDGE_ZONE * 3;\nconst AUTO_SCROLL_MIN_SPEED = 8;\nconst AUTO_SCROLL_MAX_SPEED = 40;\nconst AUTO_SCROLL_SELECTION_THROTTLE_MS = 32;\n\nconst DOMAIN_REGEX = /^[\\w.-]+\\.[a-z]{2,}(\\/\\S*)?$/i;\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}.*)?$/;\nconst TRUTHY_BOOLEANS = new Set([\"true\", \"1\", \"yes\", \"checked\"]);\nconst VALID_BOOLEANS = new Set([\"true\", \"false\", \"1\", \"0\", \"yes\", \"no\", \"checked\", \"unchecked\"]);\n\ninterface DataGridState {\n sorting: SortingState;\n columnFilters: ColumnFiltersState;\n rowHeight: RowHeightValue;\n rowSelection: RowSelectionState;\n selectionState: SelectionState;\n focusedCell: CellPosition | null;\n editingCell: CellPosition | null;\n cutCells: Set<string>;\n contextMenu: ContextMenuState;\n searchQuery: string;\n searchMatches: CellPosition[];\n matchIndex: number;\n searchOpen: boolean;\n lastClickedRowId: string | null;\n pasteDialog: PasteDialogState;\n}\n\ninterface DataGridStore {\n subscribe: (callback: () => void) => () => void;\n getState: () => DataGridState;\n setState: <K extends keyof DataGridState>(key: K, value: DataGridState[K]) => void;\n notify: () => void;\n batch: (fn: () => void) => void;\n}\n\nfunction useStore<T>(store: DataGridStore, selector: (state: DataGridState) => T): T {\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\n/**\n * Tuỳ chọn của {@link useDataGrid} — mở rộng `TableOptions` của TanStack Table v8.\n *\n * Hook KHÔNG tự gọi API nào: mọi thay đổi dữ liệu đều đi ra ngoài qua callback\n * (`onDataChange`, `onRowAdd`, `onRowsDelete`, `onFilesUpload`…) để ứng dụng tự\n * quyết định lưu ở đâu (REST, GraphQL, state cục bộ…).\n */\ninterface UseDataGridProps<TData> extends Omit<TableOptions<TData>, \"pageCount\" | \"getCoreRowModel\"> {\n /**\n * Nhận MẢNG DỮ LIỆU MỚI sau mỗi lần sửa ô/dán/xoá nội dung.\n * Ứng dụng tự setState + gọi API lưu (thường lưu lạc quan rồi rollback khi lỗi).\n */\n onDataChange?: (data: TData[]) => void;\n /**\n * Người dùng bấm \"Thêm dòng\" (hoặc Shift+Enter). Trả về ô cần focus sau khi thêm\n * (`{ rowIndex, columnId }`), hoặc `null` để lưới không cuộn/focus.\n */\n onRowAdd?: (\n event?: React.MouseEvent<HTMLDivElement>\n ) => Partial<CellPosition> | Promise<Partial<CellPosition> | null> | null;\n /** Dán nhiều dòng hơn số dòng hiện có → thêm `count` dòng trong MỘT lần gọi API */\n onRowsAdd?: (count: number) => void | Promise<void>;\n /** Xoá dòng (menu chuột phải hoặc Ctrl+Backspace) — nhận cả bản ghi lẫn chỉ số dòng */\n onRowsDelete?: (rows: TData[], rowIndices: number[]) => void | Promise<void>;\n /** Chạy TRƯỚC khi áp dụng dữ liệu dán — dùng để gọi API bulk update nếu cần */\n onPaste?: (updates: Array<CellUpdate>) => void | Promise<void>;\n /**\n * Tải tệp lên cho ô `variant: \"file\"`. Không truyền thì tệp chỉ nằm trong bộ nhớ\n * trình duyệt (blob URL) và mất khi tải lại trang.\n */\n onFilesUpload?: (params: { files: File[]; rowIndex: number; columnId: string }) => Promise<FileCellData[]>;\n onFilesDelete?: (params: { fileIds: string[]; rowIndex: number; columnId: string }) => void | Promise<void>;\n /** Chiều cao dòng ban đầu (mặc định \"short\" = 36px) */\n rowHeight?: RowHeightValue;\n onRowHeightChange?: (rowHeight: RowHeightValue) => void;\n /** Số dòng render thêm ngoài vùng nhìn thấy (mặc định 6) */\n overscan?: number;\n dir?: Direction;\n /** Tự focus ô đầu tiên (hoặc ô chỉ định) khi có dữ liệu */\n autoFocus?: boolean | Partial<CellPosition>;\n /** Bấm chuột vào ô là chọn luôn ô đó (mặc định chỉ focus) */\n enableSingleCellSelection?: boolean;\n /** Bấm tiêu đề cột để chọn cả cột */\n enableColumnSelection?: boolean;\n /** Bật tìm trong bảng (Ctrl+F) */\n enableSearch?: boolean;\n /** Bật dán từ clipboard (Ctrl+V) */\n enablePaste?: boolean;\n /** Chỉ xem: khoá mọi thao tác sửa/xoá/dán */\n readOnly?: boolean;\n /**\n * Ngôn ngữ của lưới: `\"en\"` · `\"vi\"`, hoặc cả một bảng chuỗi tự soạn. Bỏ trống thì theo\n * `DataGridLocaleProvider`, rồi ngôn ngữ của `ComitorLocaleProvider`, rồi `\"en\"` — app đã đặt\n * `ComitorLocaleProvider` ở root thì không cần truyền.\n *\n * Giá trị này đi ra NGUYÊN VẸN theo kết quả của hook (kể cả khi bỏ trống), nên\n * `<DataGrid {...gridProps}>` tự nhận được và tự giải lại trong cây của nó. Hook cũng giải một\n * bản cho RIÊNG nó — cho toast (render ở `<Toaster />`, ngoài cây của lưới) và cho phép đọc ngày\n * khi dán — từ context của component ĐANG GỌI hook. ⚠ Vì vậy một `DataGridLocaleProvider` đặt\n * trong chính component đó (hoặc sâu hơn) không với tới toast: truyền `locale` ở đây, hoặc đưa\n * provider lên component cha. `ComitorLocaleProvider` ở root thì luôn với tới.\n *\n * ⚠ Thanh công cụ nằm ngoài `<DataGrid>` nên KHÔNG nhận được giá trị này: chúng theo provider\n * (`DataGridLocaleProvider` / `ComitorLocaleProvider`), hoặc nhận `locale` riêng từng menu.\n */\n locale?: DataGridLocale | DataGridMessages;\n}\n\nfunction useDataGrid<TData>({\n data,\n columns,\n rowHeight: rowHeightProp = DEFAULT_ROW_HEIGHT,\n overscan = OVERSCAN,\n dir: dirProp,\n initialState,\n locale,\n ...props\n}: UseDataGridProps<TData>) {\n // Ngôn ngữ đọc LÚC GỌI HOOK, theo cùng luật ưu tiên với cây của lưới: `locale` → provider\n // `DataGridLocaleProvider` bọc NGOÀI component đang gọi → `ComitorLocaleProvider` → `\"en\"`.\n // Hook cần bản của riêng nó vì toast render ở `<Toaster />`, ngoài cây của lưới.\n const { messages: msg, dateLocale } = useResolvedDataGridLocale(locale);\n // Callback của hook ổn định theo thiết kế (chúng đọc `propsRef`), nên bảng chuỗi cũng đi qua\n // ref — đưa `msg` vào dependency sẽ dựng lại toàn bộ handler mỗi lần đổi ngôn ngữ.\n const msgRef = useAsRef(msg);\n const dateLocaleRef = useAsRef(dateLocale);\n const dir = useDirection(dirProp);\n const dataGridRef = React.useRef<HTMLDivElement>(null);\n const tableRef = React.useRef<ReturnType<typeof useReactTable<TData>>>(null);\n const rowVirtualizerRef = React.useRef<Virtualizer<HTMLDivElement, Element>>(null);\n const headerRef = React.useRef<HTMLDivElement>(null);\n const rowMapRef = React.useRef<Map<number, HTMLDivElement>>(new Map());\n const cellMapRef = React.useRef<Map<string, HTMLDivElement>>(new Map());\n const footerRef = React.useRef<HTMLDivElement>(null);\n const focusGuardRef = React.useRef(false);\n\n const propsRef = useAsRef({\n ...props,\n data,\n columns,\n initialState\n });\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n\n const stateRef = useLazyRef<DataGridState>(() => {\n return {\n sorting: initialState?.sorting ?? [],\n columnFilters: initialState?.columnFilters ?? [],\n rowHeight: rowHeightProp,\n rowSelection: initialState?.rowSelection ?? {},\n selectionState: {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false\n },\n focusedCell: null,\n editingCell: null,\n cutCells: new Set(),\n contextMenu: {\n open: false,\n x: 0,\n y: 0\n },\n searchQuery: \"\",\n searchMatches: [],\n matchIndex: -1,\n searchOpen: false,\n lastClickedRowId: null,\n pasteDialog: {\n open: false,\n rowsNeeded: 0,\n clipboardText: \"\"\n }\n };\n });\n\n const store = React.useMemo<DataGridStore>(() => {\n let isBatching = false;\n let pendingNotification = false;\n\n return {\n subscribe: (callback) => {\n listenersRef.current.add(callback);\n return () => listenersRef.current.delete(callback);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n\n if (isBatching) {\n pendingNotification = true;\n } else {\n if (!pendingNotification) {\n pendingNotification = true;\n queueMicrotask(() => {\n pendingNotification = false;\n store.notify();\n });\n }\n }\n },\n notify: () => {\n for (const listener of listenersRef.current) {\n listener();\n }\n },\n batch: (fn) => {\n if (isBatching) {\n fn();\n return;\n }\n\n isBatching = true;\n const wasPending = pendingNotification;\n pendingNotification = false;\n\n try {\n fn();\n } finally {\n isBatching = false;\n if (pendingNotification || wasPending) {\n pendingNotification = false;\n store.notify();\n }\n }\n }\n };\n }, [listenersRef, stateRef]);\n\n const focusedCell = useStore(store, (state) => state.focusedCell);\n const editingCell = useStore(store, (state) => state.editingCell);\n const selectionState = useStore(store, (state) => state.selectionState);\n const searchQuery = useStore(store, (state) => state.searchQuery);\n const searchMatches = useStore(store, (state) => state.searchMatches);\n const matchIndex = useStore(store, (state) => state.matchIndex);\n const searchOpen = useStore(store, (state) => state.searchOpen);\n const sorting = useStore(store, (state) => state.sorting);\n const columnFilters = useStore(store, (state) => state.columnFilters);\n const rowSelection = useStore(store, (state) => state.rowSelection);\n const rowHeight = useStore(store, (state) => state.rowHeight);\n const contextMenu = useStore(store, (state) => state.contextMenu);\n const pasteDialog = useStore(store, (state) => state.pasteDialog);\n\n const rowHeightValue = getRowHeightValue(rowHeight);\n\n // Ứng dụng có thể tự giữ state khi sắp xếp/lọc ở phía máy chủ (manualSorting,\n // manualFiltering, lưu trên URL…): truyền `state.sorting` / `state.columnFilters`\n // thì giá trị đó ghi đè state nội bộ của lưới.\n const controlledSorting = props.state?.sorting;\n const controlledColumnFilters = props.state?.columnFilters;\n\n useIsomorphicLayoutEffect(() => {\n if (!controlledSorting && !controlledColumnFilters) return;\n\n store.batch(() => {\n if (controlledSorting) store.setState(\"sorting\", controlledSorting);\n if (controlledColumnFilters) {\n store.setState(\"columnFilters\", controlledColumnFilters);\n }\n });\n }, [store, controlledSorting, controlledColumnFilters]);\n\n const prevCellSelectionMapRef = useLazyRef(() => new Map<number, Set<string>>());\n\n // Memoize per-row selection sets to prevent unnecessary row re-renders\n // Each row gets a stable Set reference that only changes when its cells' selection changes\n const cellSelectionMap = React.useMemo(() => {\n const selectedCells = selectionState.selectedCells;\n\n if (selectedCells.size === 0) {\n prevCellSelectionMapRef.current.clear();\n return null;\n }\n\n const newRowCells = new Map<number, Set<string>>();\n for (const cellKey of selectedCells) {\n const { rowIndex } = parseCellKey(cellKey);\n let rowSet = newRowCells.get(rowIndex);\n if (!rowSet) {\n rowSet = new Set<string>();\n newRowCells.set(rowIndex, rowSet);\n }\n rowSet.add(cellKey);\n }\n\n const stableMap = new Map<number, Set<string>>();\n for (const [rowIndex, newSet] of newRowCells) {\n const prevSet = prevCellSelectionMapRef.current.get(rowIndex);\n if (prevSet && prevSet.size === newSet.size && [...newSet].every((key) => prevSet.has(key))) {\n stableMap.set(rowIndex, prevSet);\n } else {\n stableMap.set(rowIndex, newSet);\n }\n }\n\n prevCellSelectionMapRef.current = stableMap;\n return stableMap;\n }, [selectionState.selectedCells, prevCellSelectionMapRef]);\n\n const visualRowIndexCacheRef = React.useRef<{\n rows: Row<TData>[] | null;\n map: Map<string, number>;\n } | null>(null);\n\n // Pre-compute visual row index map for O(1) lookups (used by select column)\n // Cache is invalidated when row model identity changes (sorting/filtering)\n const getVisualRowIndex = React.useCallback((rowId: string): number | undefined => {\n const rows = tableRef.current?.getRowModel().rows;\n if (!rows) return undefined;\n\n if (visualRowIndexCacheRef.current?.rows !== rows) {\n const map = new Map<string, number>();\n for (const [i, row] of rows.entries()) {\n map.set(row.id, i + 1);\n }\n visualRowIndexCacheRef.current = { rows, map };\n }\n\n return visualRowIndexCacheRef.current.map.get(rowId);\n }, []);\n\n const columnIds = React.useMemo(() => {\n return columns\n .map((c) => {\n if (c.id) return c.id;\n if (\"accessorKey\" in c) return c.accessorKey as string;\n return undefined;\n })\n .filter((id): id is string => Boolean(id));\n }, [columns]);\n\n const navigableColumnIds = React.useMemo(() => {\n return columnIds.filter((c) => !NON_NAVIGABLE_COLUMN_IDS.has(c));\n }, [columnIds]);\n\n const onDataUpdate = React.useCallback(\n (updates: CellUpdate | Array<CellUpdate>) => {\n if (propsRef.current.readOnly) return;\n\n const updateArray = Array.isArray(updates) ? updates : [updates];\n\n if (updateArray.length === 0) return;\n\n const currentTable = tableRef.current;\n const currentData = propsRef.current.data;\n const rows = currentTable?.getRowModel().rows;\n\n const rowUpdatesMap = new Map<number, Array<Omit<CellUpdate, \"rowIndex\">>>();\n\n for (const update of updateArray) {\n if (!rows || !currentTable) {\n const existingUpdates = rowUpdatesMap.get(update.rowIndex) ?? [];\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value\n });\n rowUpdatesMap.set(update.rowIndex, existingUpdates);\n } else {\n const row = rows[update.rowIndex];\n if (!row) continue;\n\n const originalData = row.original;\n const originalRowIndex = currentData.indexOf(originalData);\n\n const targetIndex = originalRowIndex !== -1 ? originalRowIndex : update.rowIndex;\n\n const existingUpdates = rowUpdatesMap.get(targetIndex) ?? [];\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value\n });\n rowUpdatesMap.set(targetIndex, existingUpdates);\n }\n }\n\n const maxUpdateIndex = rowUpdatesMap.size > 0 ? Math.max(...Array.from(rowUpdatesMap.keys())) : -1;\n const dataLength = Math.max(currentData.length, maxUpdateIndex + 1);\n\n const newData: TData[] = new Array(dataLength);\n\n for (let i = 0; i < dataLength; i++) {\n const updates = rowUpdatesMap.get(i);\n // Fall back to the table's row data for rows not yet in currentData\n const existingRow = currentData[i] ?? rows?.[i]?.original;\n\n if (existingRow == null) continue;\n\n if (updates) {\n const updatedRow = { ...existingRow } as Record<string, unknown>;\n for (const { columnId, value } of updates) {\n updatedRow[columnId] = value;\n }\n newData[i] = updatedRow as TData;\n } else {\n newData[i] = existingRow;\n }\n }\n\n propsRef.current.onDataChange?.(newData);\n },\n [propsRef]\n );\n\n const getIsCellSelected = React.useCallback(\n (rowIndex: number, columnId: string) => {\n const currentSelectionState = store.getState().selectionState;\n return currentSelectionState.selectedCells.has(getCellKey(rowIndex, columnId));\n },\n [store]\n );\n\n const onSelectionClear = React.useCallback(() => {\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false\n });\n store.setState(\"rowSelection\", {});\n });\n }, [store]);\n\n const selectAll = React.useCallback(() => {\n const allCells = new Set<string>();\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n for (const columnId of columnIds) {\n allCells.add(getCellKey(rowIndex, columnId));\n }\n }\n\n const firstColumnId = columnIds[0];\n const lastColumnId = columnIds[columnIds.length - 1];\n\n store.setState(\"selectionState\", {\n selectedCells: allCells,\n selectionRange:\n columnIds.length > 0 && rowCount > 0 && firstColumnId && lastColumnId\n ? {\n start: { rowIndex: 0, columnId: firstColumnId },\n end: { rowIndex: rowCount - 1, columnId: lastColumnId }\n }\n : null,\n isSelecting: false\n });\n }, [columnIds, propsRef, store]);\n\n const selectColumn = React.useCallback(\n (columnId: string) => {\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n if (rowCount === 0) return;\n\n const selectedCells = new Set<string>();\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n selectedCells.add(getCellKey(rowIndex, columnId));\n }\n\n store.setState(\"selectionState\", {\n selectedCells,\n selectionRange: {\n start: { rowIndex: 0, columnId },\n end: { rowIndex: rowCount - 1, columnId }\n },\n isSelecting: false\n });\n },\n [propsRef, store]\n );\n\n const selectRange = React.useCallback(\n (start: CellPosition, end: CellPosition, isSelecting = false) => {\n const startColIndex = columnIds.indexOf(start.columnId);\n const endColIndex = columnIds.indexOf(end.columnId);\n\n const minRow = Math.min(start.rowIndex, end.rowIndex);\n const maxRow = Math.max(start.rowIndex, end.rowIndex);\n const minCol = Math.min(startColIndex, endColIndex);\n const maxCol = Math.max(startColIndex, endColIndex);\n\n const selectedCells = new Set<string>();\n\n for (let rowIndex = minRow; rowIndex <= maxRow; rowIndex++) {\n for (let colIndex = minCol; colIndex <= maxCol; colIndex++) {\n const columnId = columnIds[colIndex];\n if (columnId) {\n selectedCells.add(getCellKey(rowIndex, columnId));\n }\n }\n }\n\n store.setState(\"selectionState\", {\n selectedCells,\n selectionRange: { start, end },\n isSelecting\n });\n },\n [columnIds, store]\n );\n\n const dragDepsRef = useAsRef({\n selectRange,\n dir,\n rowHeightValue,\n columnIds\n });\n\n const serializeCellsToTsv = React.useCallback(() => {\n const currentState = store.getState();\n\n let selectedCellsArray: string[];\n if (!currentState.selectionState.selectedCells.size) {\n if (!currentState.focusedCell) return null;\n const focusedCellKey = getCellKey(currentState.focusedCell.rowIndex, currentState.focusedCell.columnId);\n selectedCellsArray = [focusedCellKey];\n } else {\n selectedCellsArray = Array.from(currentState.selectionState.selectedCells);\n }\n\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows;\n if (!rows) return null;\n\n const selectedColumnIds: string[] = [];\n const seenColumnIds = new Set<string>();\n const cellData = new Map<string, string>();\n const rowIndices = new Set<number>();\n const rowCellMaps = new Map<number, Map<string, ReturnType<Row<TData>[\"getVisibleCells\"]>[number]>>();\n const navigableCells: string[] = [];\n\n for (const cellKey of selectedCellsArray) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n\n if (columnId && NON_NAVIGABLE_COLUMN_IDS.has(columnId)) {\n continue;\n }\n\n navigableCells.push(cellKey);\n\n if (columnId && !seenColumnIds.has(columnId)) {\n seenColumnIds.add(columnId);\n selectedColumnIds.push(columnId);\n }\n\n rowIndices.add(rowIndex);\n\n const row = rows[rowIndex];\n if (row) {\n let cellMap = rowCellMaps.get(rowIndex);\n if (!cellMap) {\n cellMap = new Map(row.getVisibleCells().map((c) => [c.column.id, c]));\n rowCellMaps.set(rowIndex, cellMap);\n }\n const cell = cellMap.get(columnId);\n if (cell) {\n const value = cell.getValue();\n const cellVariant = cell.column.columnDef?.meta?.cell?.variant;\n\n let serializedValue = \"\";\n if (cellVariant === \"file\" || cellVariant === \"multi-select\") {\n serializedValue = value ? JSON.stringify(value) : \"\";\n } else if (value instanceof Date) {\n serializedValue = value.toISOString();\n } else {\n serializedValue = String(value ?? \"\");\n }\n\n cellData.set(cellKey, serializedValue);\n }\n }\n }\n\n const colIndices = new Set<number>();\n for (const cellKey of navigableCells) {\n const { columnId } = parseCellKey(cellKey);\n const colIndex = selectedColumnIds.indexOf(columnId);\n if (colIndex >= 0) {\n colIndices.add(colIndex);\n }\n }\n\n const sortedRowIndices = Array.from(rowIndices).sort((a, b) => a - b);\n const sortedColIndices = Array.from(colIndices).sort((a, b) => a - b);\n const sortedColumnIds = sortedColIndices.map((i) => selectedColumnIds[i]);\n\n const tsvData = sortedRowIndices\n .map((rowIndex) =>\n sortedColumnIds\n .map((columnId) => {\n const cellKey = `${rowIndex}:${columnId}`;\n return cellData.get(cellKey) ?? \"\";\n })\n .join(\"\\t\")\n )\n .join(\"\\n\");\n\n return { tsvData, selectedCellsArray: navigableCells };\n }, [store]);\n\n const onCellsCopy = React.useCallback(async () => {\n const result = serializeCellsToTsv();\n if (!result) return;\n\n const { tsvData, selectedCellsArray } = result;\n\n try {\n await writeClipboardText(tsvData);\n\n const currentState = store.getState();\n if (currentState.cutCells.size > 0) {\n store.setState(\"cutCells\", new Set());\n }\n\n toastSuccess(msgRef.current.toast.cellsCopied(selectedCellsArray.length));\n } catch {\n toastError(msgRef.current.toast.copyFailed);\n }\n }, [store, serializeCellsToTsv, msgRef]);\n\n const onCellsCut = React.useCallback(async () => {\n if (propsRef.current.readOnly) return;\n\n const result = serializeCellsToTsv();\n if (!result) return;\n\n const { tsvData, selectedCellsArray } = result;\n\n try {\n await writeClipboardText(tsvData);\n\n store.setState(\"cutCells\", new Set(selectedCellsArray));\n\n toastSuccess(msgRef.current.toast.cellsCut(selectedCellsArray.length));\n } catch {\n toastError(msgRef.current.toast.cutFailed);\n }\n }, [store, propsRef, serializeCellsToTsv, msgRef]);\n\n const restoreFocus = React.useCallback((element: HTMLDivElement | null) => {\n if (element && document.activeElement !== element) {\n requestAnimationFrame(() => {\n element.focus();\n });\n }\n }, []);\n\n const onCellsPaste = React.useCallback(\n async (expandRows = false, clipboardTextArg?: string) => {\n if (propsRef.current.readOnly) return;\n\n const currentState = store.getState();\n if (!currentState.focusedCell) return;\n\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows;\n if (!rows) return;\n\n try {\n // Ưu tiên nội dung lấy từ sự kiện `paste` (chạy được cả ở http nội bộ),\n // sau đó tới nội dung đã giữ lại khi mở hộp thoại \"thêm dòng\",\n // cuối cùng mới đọc clipboard qua API (chỉ có ở secure context).\n let clipboardText = clipboardTextArg ?? currentState.pasteDialog.clipboardText;\n\n if (!clipboardText) {\n clipboardText = (await readClipboardText()) ?? \"\";\n }\n\n if (!clipboardText) return;\n\n const rawPastedData = parseTsv(clipboardText, navigableColumnIds.length);\n\n // Fill entire selection when clipboard has a single value and multiple cells are selected\n const selectionCells = currentState.selectionState.selectedCells;\n const isSingleCellClipboard = rawPastedData.length === 1 && (rawPastedData[0]?.length ?? 0) === 1;\n\n let pastedData = rawPastedData;\n let startRowIndex = currentState.focusedCell.rowIndex;\n let startColIndex = navigableColumnIds.indexOf(currentState.focusedCell.columnId);\n\n if (isSingleCellClipboard && selectionCells.size > 1) {\n const singleValue = rawPastedData[0]?.[0] ?? \"\";\n let minRow = Infinity;\n let maxRow = -Infinity;\n let minColIdx = Infinity;\n let maxColIdx = -Infinity;\n\n for (const cellKey of selectionCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n const colIdx = navigableColumnIds.indexOf(columnId);\n if (colIdx === -1) continue;\n minRow = Math.min(minRow, rowIndex);\n maxRow = Math.max(maxRow, rowIndex);\n minColIdx = Math.min(minColIdx, colIdx);\n maxColIdx = Math.max(maxColIdx, colIdx);\n }\n\n if (minRow !== Infinity) {\n startRowIndex = minRow;\n startColIndex = minColIdx;\n const numRows = maxRow - minRow + 1;\n const numCols = maxColIdx - minColIdx + 1;\n pastedData = Array.from({ length: numRows }, () => Array.from({ length: numCols }, () => singleValue));\n }\n }\n\n if (startColIndex === -1) return;\n\n const rowCount = rows.length ?? propsRef.current.data.length;\n const rowsNeeded = startRowIndex + pastedData.length - rowCount;\n\n if (rowsNeeded > 0 && !expandRows && propsRef.current.onRowAdd && !currentState.pasteDialog.clipboardText) {\n store.setState(\"pasteDialog\", {\n open: true,\n rowsNeeded,\n clipboardText\n });\n return;\n }\n\n if (expandRows && rowsNeeded > 0) {\n const expectedRowCount = rowCount + rowsNeeded;\n\n if (propsRef.current.onRowsAdd) {\n await propsRef.current.onRowsAdd(rowsNeeded);\n } else if (propsRef.current.onRowAdd) {\n for (let i = 0; i < rowsNeeded; i++) {\n await propsRef.current.onRowAdd();\n }\n }\n\n let attempts = 0;\n const maxAttempts = 50;\n let currentTableRowCount = tableRef.current?.getRowModel().rows.length ?? 0;\n\n while (currentTableRowCount < expectedRowCount && attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n currentTableRowCount = tableRef.current?.getRowModel().rows.length ?? 0;\n attempts++;\n }\n }\n\n const updates: Array<CellUpdate> = [];\n const tableColumns = currentTable?.getAllColumns() ?? [];\n let cellsUpdated = 0;\n let endRowIndex = startRowIndex;\n let endColIndex = startColIndex;\n\n const updatedTable = tableRef.current;\n const updatedRows = updatedTable?.getRowModel().rows;\n const currentRowCount = updatedRows?.length ?? 0;\n\n let cellsSkipped = 0;\n\n const columnMap = new Map(tableColumns.map((c) => [c.id, c]));\n\n for (let pasteRowIdx = 0; pasteRowIdx < pastedData.length; pasteRowIdx++) {\n const pasteRow = pastedData[pasteRowIdx];\n if (!pasteRow) continue;\n\n const targetRowIndex = startRowIndex + pasteRowIdx;\n if (targetRowIndex >= currentRowCount) break;\n\n for (let pasteColIdx = 0; pasteColIdx < pasteRow.length; pasteColIdx++) {\n const targetColIndex = startColIndex + pasteColIdx;\n if (targetColIndex >= navigableColumnIds.length) break;\n\n const targetColumnId = navigableColumnIds[targetColIndex];\n if (!targetColumnId) continue;\n\n const pastedValue = pasteRow[pasteColIdx] ?? \"\";\n const column = columnMap.get(targetColumnId);\n const cellOpts = column?.columnDef?.meta?.cell;\n const cellVariant = cellOpts?.variant;\n\n let processedValue: unknown = pastedValue;\n let shouldSkip = false;\n\n switch (cellVariant) {\n case \"number\": {\n if (!pastedValue) {\n processedValue = null;\n } else {\n const num = Number.parseFloat(pastedValue);\n if (Number.isNaN(num)) shouldSkip = true;\n else processedValue = num;\n }\n break;\n }\n\n case \"checkbox\": {\n if (!pastedValue) {\n processedValue = false;\n } else {\n const lower = pastedValue.toLowerCase();\n if (VALID_BOOLEANS.has(lower)) {\n processedValue = TRUTHY_BOOLEANS.has(lower);\n } else {\n shouldSkip = true;\n }\n }\n break;\n }\n\n case \"date\": {\n if (!pastedValue) {\n processedValue = null;\n } else {\n // Đọc theo dạng ngày của ngôn ngữ lưới trước (đúng dạng đang hiển thị), rồi ISO.\n const date = parseDateInput(pastedValue, dateLocaleRef.current);\n if (!date) shouldSkip = true;\n else processedValue = date;\n }\n break;\n }\n\n case \"select\": {\n const options = cellOpts?.options ?? [];\n if (!pastedValue) {\n processedValue = null;\n } else {\n const matched = matchSelectOption(pastedValue, options);\n if (matched) processedValue = matched;\n else shouldSkip = true;\n }\n break;\n }\n\n case \"multi-select\": {\n const options = cellOpts?.options ?? [];\n let values: string[] = [];\n try {\n const parsed = JSON.parse(pastedValue);\n if (Array.isArray(parsed)) {\n values = parsed.filter((v): v is string => typeof v === \"string\");\n }\n } catch {\n values = pastedValue ? pastedValue.split(\",\").map((v) => v.trim()) : [];\n }\n\n const validated = values.map((v) => matchSelectOption(v, options)).filter(Boolean) as string[];\n\n if (values.length > 0 && validated.length === 0) {\n shouldSkip = true;\n } else {\n processedValue = validated;\n }\n break;\n }\n\n case \"file\": {\n if (!pastedValue) {\n processedValue = [];\n } else {\n try {\n const parsed = JSON.parse(pastedValue);\n if (!Array.isArray(parsed)) {\n shouldSkip = true;\n } else {\n const validFiles = parsed.filter(getIsFileCellData);\n if (parsed.length > 0 && validFiles.length === 0) {\n shouldSkip = true;\n } else {\n processedValue = validFiles;\n }\n }\n } catch {\n shouldSkip = true;\n }\n }\n break;\n }\n\n case \"url\": {\n if (!pastedValue) {\n processedValue = \"\";\n } else {\n const firstChar = pastedValue[0];\n if (firstChar === \"[\" || firstChar === \"{\") {\n shouldSkip = true;\n } else {\n try {\n new URL(pastedValue);\n processedValue = pastedValue;\n } catch {\n if (DOMAIN_REGEX.test(pastedValue)) {\n processedValue = pastedValue;\n } else {\n shouldSkip = true;\n }\n }\n }\n }\n break;\n }\n\n default: {\n if (!pastedValue) {\n processedValue = \"\";\n break;\n }\n\n if (ISO_DATE_REGEX.test(pastedValue)) {\n const date = new Date(pastedValue);\n if (!Number.isNaN(date.getTime())) {\n processedValue = formatDate(date, dateLocaleRef.current);\n break;\n }\n }\n\n const firstChar = pastedValue[0];\n if (firstChar === \"[\" || firstChar === \"{\" || firstChar === \"t\" || firstChar === \"f\") {\n try {\n const parsed = JSON.parse(pastedValue);\n\n if (Array.isArray(parsed)) {\n if (parsed.length > 0 && parsed.every(getIsFileCellData)) {\n processedValue = parsed.map((f) => f.name).join(\", \");\n } else if (parsed.every((v) => typeof v === \"string\")) {\n processedValue = (parsed as string[]).join(\", \");\n }\n } else if (typeof parsed === \"boolean\") {\n processedValue = parsed\n ? msgRef.current.booleanText.checked\n : msgRef.current.booleanText.unchecked;\n }\n } catch {\n const lower = pastedValue.toLowerCase();\n if (lower === \"true\" || lower === \"false\") {\n processedValue =\n lower === \"true\" ? msgRef.current.booleanText.checked : msgRef.current.booleanText.unchecked;\n }\n }\n }\n }\n }\n\n if (shouldSkip) {\n cellsSkipped++;\n endRowIndex = Math.max(endRowIndex, targetRowIndex);\n endColIndex = Math.max(endColIndex, targetColIndex);\n continue;\n }\n\n updates.push({\n rowIndex: targetRowIndex,\n columnId: targetColumnId,\n value: processedValue\n });\n cellsUpdated++;\n\n endRowIndex = Math.max(endRowIndex, targetRowIndex);\n endColIndex = Math.max(endColIndex, targetColIndex);\n }\n }\n\n if (updates.length > 0) {\n if (propsRef.current.onPaste) {\n await propsRef.current.onPaste(updates);\n }\n\n const allUpdates = [...updates];\n\n if (currentState.cutCells.size > 0) {\n const columnById = new Map(tableColumns.map((c) => [c.id, c]));\n\n for (const cellKey of currentState.cutCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n const column = columnById.get(columnId);\n const cellVariant = column?.columnDef?.meta?.cell?.variant;\n const emptyValue = getEmptyCellValue(cellVariant);\n allUpdates.push({ rowIndex, columnId, value: emptyValue });\n }\n\n store.setState(\"cutCells\", new Set());\n }\n\n onDataUpdate(allUpdates);\n\n if (cellsSkipped > 0) {\n toastSuccess(msgRef.current.toast.cellsPastedWithSkipped(cellsUpdated, cellsSkipped));\n } else {\n toastSuccess(msgRef.current.toast.cellsPasted(cellsUpdated));\n }\n\n const endColumnId = navigableColumnIds[endColIndex];\n if (endColumnId) {\n selectRange(\n {\n rowIndex: startRowIndex,\n columnId: currentState.focusedCell.columnId\n },\n { rowIndex: endRowIndex, columnId: endColumnId }\n );\n }\n\n restoreFocus(dataGridRef.current);\n } else if (cellsSkipped > 0) {\n toastError(msgRef.current.toast.pasteSkipped(cellsSkipped));\n }\n\n if (currentState.pasteDialog.open) {\n store.setState(\"pasteDialog\", {\n open: false,\n rowsNeeded: 0,\n clipboardText: \"\"\n });\n }\n } catch {\n toastError(msgRef.current.toast.pasteFailed);\n }\n },\n [store, navigableColumnIds, propsRef, onDataUpdate, selectRange, restoreFocus, msgRef, dateLocaleRef]\n );\n\n // Release focus guard after delay to allow async data re-renders to settle.\n // 300ms accounts for db sync and virtualized cell mounting\n const releaseFocusGuard = React.useCallback((immediate = false) => {\n if (immediate) {\n focusGuardRef.current = false;\n return;\n }\n\n setTimeout(() => {\n focusGuardRef.current = false;\n }, 300);\n }, []);\n\n const focusCellWrapper = React.useCallback(\n (rowIndex: number, columnId: string) => {\n focusGuardRef.current = true;\n\n requestAnimationFrame(() => {\n const cellKey = getCellKey(rowIndex, columnId);\n const cellWrapperElement = cellMapRef.current.get(cellKey);\n\n if (!cellWrapperElement) {\n const container = dataGridRef.current;\n if (container) {\n container.focus();\n }\n releaseFocusGuard();\n return;\n }\n\n cellWrapperElement.focus();\n releaseFocusGuard();\n });\n },\n [releaseFocusGuard]\n );\n\n const focusCell = React.useCallback(\n (rowIndex: number, columnId: string) => {\n store.batch(() => {\n store.setState(\"focusedCell\", { rowIndex, columnId });\n store.setState(\"editingCell\", null);\n });\n\n const currentState = store.getState();\n\n if (currentState.searchOpen) return;\n\n focusCellWrapper(rowIndex, columnId);\n },\n [store, focusCellWrapper]\n );\n\n const onRowsDelete = React.useCallback(\n async (rowIndices: number[]) => {\n if (propsRef.current.readOnly || !propsRef.current.onRowsDelete || rowIndices.length === 0) return;\n\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows;\n\n if (!rows || rows.length === 0) return;\n\n const currentState = store.getState();\n const currentFocusedColumn = currentState.focusedCell?.columnId ?? navigableColumnIds[0];\n\n const minDeletedRowIndex = Math.min(...rowIndices);\n\n const rowsToDelete: TData[] = [];\n for (const rowIndex of rowIndices) {\n const row = rows[rowIndex];\n if (row) {\n rowsToDelete.push(row.original);\n }\n }\n\n await propsRef.current.onRowsDelete(rowsToDelete, rowIndices);\n\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false\n });\n store.setState(\"rowSelection\", {});\n store.setState(\"editingCell\", null);\n });\n\n requestAnimationFrame(() => {\n const currentTable = tableRef.current;\n const currentRows = currentTable?.getRowModel().rows ?? [];\n const newRowCount = currentRows.length ?? propsRef.current.data.length;\n\n if (newRowCount > 0 && currentFocusedColumn) {\n const targetRowIndex = Math.min(minDeletedRowIndex, newRowCount - 1);\n focusCell(targetRowIndex, currentFocusedColumn);\n }\n });\n },\n [propsRef, store, navigableColumnIds, focusCell]\n );\n\n const navigateCell = React.useCallback(\n (direction: NavigationDirection) => {\n const currentState = store.getState();\n if (!currentState.focusedCell) return;\n\n const { rowIndex, columnId } = currentState.focusedCell;\n const currentColIndex = navigableColumnIds.indexOf(columnId);\n const rowVirtualizer = rowVirtualizerRef.current;\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n let newRowIndex = rowIndex;\n let newColumnId = columnId;\n\n const isRtl = dir === \"rtl\";\n\n switch (direction) {\n case \"up\":\n newRowIndex = Math.max(0, rowIndex - 1);\n break;\n case \"down\":\n newRowIndex = Math.min(rowCount - 1, rowIndex + 1);\n break;\n case \"left\":\n if (isRtl) {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n } else {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n }\n break;\n case \"right\":\n if (isRtl) {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n } else {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n }\n break;\n case \"home\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[0] ?? columnId;\n }\n break;\n case \"end\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[navigableColumnIds.length - 1] ?? columnId;\n }\n break;\n case \"ctrl+home\":\n newRowIndex = 0;\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[0] ?? columnId;\n }\n break;\n case \"ctrl+end\":\n newRowIndex = Math.max(0, rowCount - 1);\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[navigableColumnIds.length - 1] ?? columnId;\n }\n break;\n case \"ctrl+up\":\n newRowIndex = 0;\n break;\n case \"ctrl+down\":\n newRowIndex = Math.max(0, rowCount - 1);\n break;\n case \"pageup\":\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems();\n const pageSize = visibleRange.length ?? 10;\n newRowIndex = Math.max(0, rowIndex - pageSize);\n } else {\n newRowIndex = Math.max(0, rowIndex - 10);\n }\n break;\n case \"pagedown\":\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems();\n const pageSize = visibleRange.length ?? 10;\n newRowIndex = Math.min(rowCount - 1, rowIndex + pageSize);\n } else {\n newRowIndex = Math.min(rowCount - 1, rowIndex + 10);\n }\n break;\n case \"pageleft\":\n if (currentColIndex > 0) {\n const targetIndex = Math.max(0, currentColIndex - HORIZONTAL_PAGE_SIZE);\n const targetColumnId = navigableColumnIds[targetIndex];\n if (targetColumnId) newColumnId = targetColumnId;\n }\n break;\n case \"pageright\":\n if (currentColIndex < navigableColumnIds.length - 1) {\n const targetIndex = Math.min(navigableColumnIds.length - 1, currentColIndex + HORIZONTAL_PAGE_SIZE);\n const targetColumnId = navigableColumnIds[targetIndex];\n if (targetColumnId) newColumnId = targetColumnId;\n }\n break;\n }\n\n if (newRowIndex !== rowIndex || newColumnId !== columnId) {\n focusCell(newRowIndex, newColumnId);\n\n // Calculate and apply scrolls synchronously to avoid flashing\n const container = dataGridRef.current;\n if (!container) return;\n\n const targetRow = rowMapRef.current.get(newRowIndex);\n const cellKey = getCellKey(newRowIndex, newColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n\n // If target row is not rendered, scroll it into view first\n if (!targetRow) {\n if (rowVirtualizer) {\n const align =\n direction === \"up\" || direction === \"pageup\" || direction === \"ctrl+up\" || direction === \"ctrl+home\"\n ? \"start\"\n : direction === \"down\" ||\n direction === \"pagedown\" ||\n direction === \"ctrl+down\" ||\n direction === \"ctrl+end\"\n ? \"end\"\n : \"center\";\n\n rowVirtualizer.scrollToIndex(newRowIndex, { align });\n\n // Wait for row to render before horizontal scroll\n if (newColumnId !== columnId) {\n requestAnimationFrame(() => {\n const cellKeyRetry = getCellKey(newRowIndex, newColumnId);\n const targetCellRetry = cellMapRef.current.get(cellKeyRetry);\n\n if (targetCellRetry) {\n const scrollDirection = getScrollDirection(direction);\n\n scrollCellIntoView({\n container,\n targetCell: targetCellRetry,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: scrollDirection,\n isRtl: dir === \"rtl\"\n });\n }\n });\n }\n } else {\n // Use direct scroll calculation when virtualizer is not available\n const rowHeightValue = getRowHeightValue(rowHeight);\n const estimatedScrollTop = newRowIndex * rowHeightValue;\n container.scrollTop = estimatedScrollTop;\n }\n\n return;\n }\n\n // Vertical scrolling for rendered rows that changed\n if (newRowIndex !== rowIndex && targetRow) {\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0;\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0;\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET;\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom;\n\n if (!isFullyVisible) {\n // Only apply vertical scroll for vertical navigation\n const isVerticalNavigation =\n direction === \"up\" ||\n direction === \"down\" ||\n direction === \"pageup\" ||\n direction === \"pagedown\" ||\n direction === \"ctrl+up\" ||\n direction === \"ctrl+down\" ||\n direction === \"ctrl+home\" ||\n direction === \"ctrl+end\";\n\n if (isVerticalNavigation) {\n if (\n direction === \"down\" ||\n direction === \"pagedown\" ||\n direction === \"ctrl+down\" ||\n direction === \"ctrl+end\"\n ) {\n container.scrollTop += rowRect.bottom - viewportBottom;\n } else {\n container.scrollTop -= viewportTop - rowRect.top;\n }\n }\n }\n });\n }\n\n // Horizontal scrolling for rendered cells\n if (newColumnId !== columnId && targetCell) {\n requestAnimationFrame(() => {\n const scrollDirection = getScrollDirection(direction);\n\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: scrollDirection,\n isRtl: dir === \"rtl\"\n });\n });\n }\n }\n },\n [dir, store, navigableColumnIds, focusCell, propsRef, rowHeight]\n );\n\n const onCellEditingStart = React.useCallback(\n (rowIndex: number, columnId: string) => {\n if (propsRef.current.readOnly) return;\n\n store.batch(() => {\n store.setState(\"focusedCell\", { rowIndex, columnId });\n store.setState(\"editingCell\", { rowIndex, columnId });\n });\n },\n [store, propsRef]\n );\n\n const onCellEditingStop = React.useCallback(\n (opts?: { moveToNextRow?: boolean; direction?: NavigationDirection }) => {\n const currentState = store.getState();\n const currentEditing = currentState.editingCell;\n\n store.setState(\"editingCell\", null);\n\n if (opts?.moveToNextRow && currentEditing) {\n const { rowIndex, columnId } = currentEditing;\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n const nextRowIndex = rowIndex + 1;\n if (nextRowIndex < rowCount) {\n requestAnimationFrame(() => {\n focusCell(nextRowIndex, columnId);\n });\n }\n } else if (opts?.direction && currentEditing) {\n const { rowIndex, columnId } = currentEditing;\n focusCell(rowIndex, columnId);\n requestAnimationFrame(() => {\n navigateCell(opts.direction ?? \"right\");\n });\n } else if (currentEditing) {\n const { rowIndex, columnId } = currentEditing;\n focusCellWrapper(rowIndex, columnId);\n }\n },\n [store, propsRef, focusCell, navigateCell, focusCellWrapper]\n );\n\n const onSearchOpenChange = React.useCallback(\n (open: boolean) => {\n if (open) {\n store.setState(\"searchOpen\", true);\n return;\n }\n\n const currentState = store.getState();\n const currentMatch = currentState.matchIndex >= 0 && currentState.searchMatches[currentState.matchIndex];\n\n store.batch(() => {\n store.setState(\"searchOpen\", false);\n store.setState(\"searchQuery\", \"\");\n store.setState(\"searchMatches\", []);\n store.setState(\"matchIndex\", -1);\n\n if (currentMatch) {\n store.setState(\"focusedCell\", {\n rowIndex: currentMatch.rowIndex,\n columnId: currentMatch.columnId\n });\n }\n });\n\n if (dataGridRef.current && document.activeElement !== dataGridRef.current) {\n dataGridRef.current.focus();\n }\n },\n [store]\n );\n\n const onSearch = React.useCallback(\n (query: string) => {\n if (!query.trim()) {\n store.batch(() => {\n store.setState(\"searchMatches\", []);\n store.setState(\"matchIndex\", -1);\n });\n return;\n }\n\n const matches: CellPosition[] = [];\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n\n const lowerQuery = query.toLowerCase();\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex];\n if (!row) continue;\n\n const cellById = new Map(row.getVisibleCells().map((c) => [c.column.id, c]));\n\n for (const columnId of columnIds) {\n const cell = cellById.get(columnId);\n if (!cell) continue;\n\n const value = cell.getValue();\n const stringValue = String(value ?? \"\").toLowerCase();\n\n if (stringValue.includes(lowerQuery)) {\n matches.push({ rowIndex, columnId });\n }\n }\n }\n\n store.batch(() => {\n store.setState(\"searchMatches\", matches);\n store.setState(\"matchIndex\", matches.length > 0 ? 0 : -1);\n });\n\n if (matches.length > 0 && matches[0]) {\n const firstMatch = matches[0];\n rowVirtualizerRef.current?.scrollToIndex(firstMatch.rowIndex, {\n align: \"center\"\n });\n }\n },\n [columnIds, store]\n );\n\n const onSearchQueryChange = React.useCallback((query: string) => store.setState(\"searchQuery\", query), [store]);\n\n const onNavigateToPrevMatch = React.useCallback(() => {\n const currentState = store.getState();\n if (currentState.searchMatches.length === 0) return;\n\n const prevIndex =\n currentState.matchIndex - 1 < 0 ? currentState.searchMatches.length - 1 : currentState.matchIndex - 1;\n const match = currentState.searchMatches[prevIndex];\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: \"center\"\n });\n\n requestAnimationFrame(() => {\n store.setState(\"matchIndex\", prevIndex);\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId);\n });\n });\n }\n }, [store, focusCell]);\n\n const onNavigateToNextMatch = React.useCallback(() => {\n const currentState = store.getState();\n if (currentState.searchMatches.length === 0) return;\n\n const nextIndex = (currentState.matchIndex + 1) % currentState.searchMatches.length;\n const match = currentState.searchMatches[nextIndex];\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: \"center\"\n });\n\n requestAnimationFrame(() => {\n store.setState(\"matchIndex\", nextIndex);\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId);\n });\n });\n }\n }, [store, focusCell]);\n\n const searchMatchSet = React.useMemo(() => {\n return new Set(searchMatches.map((m) => getCellKey(m.rowIndex, m.columnId)));\n }, [searchMatches]);\n\n const getIsSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n return searchMatchSet.has(getCellKey(rowIndex, columnId));\n },\n [searchMatchSet]\n );\n\n const getIsActiveSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n const currentState = store.getState();\n if (currentState.matchIndex < 0) return false;\n const currentMatch = currentState.searchMatches[currentState.matchIndex];\n return currentMatch?.rowIndex === rowIndex && currentMatch?.columnId === columnId;\n },\n [store]\n );\n\n // Compute search match data for targeted row re-renders\n const searchMatchesByRow = React.useMemo(() => {\n if (searchMatches.length === 0) return null;\n const rowMap = new Map<number, Set<string>>();\n for (const match of searchMatches) {\n let columnSet = rowMap.get(match.rowIndex);\n if (!columnSet) {\n columnSet = new Set<string>();\n rowMap.set(match.rowIndex, columnSet);\n }\n columnSet.add(match.columnId);\n }\n return rowMap;\n }, [searchMatches]);\n\n const activeSearchMatch = React.useMemo<CellPosition | null>(() => {\n if (matchIndex < 0 || searchMatches.length === 0) return null;\n return searchMatches[matchIndex] ?? null;\n }, [searchMatches, matchIndex]);\n\n const blurCell = React.useCallback(() => {\n const currentState = store.getState();\n if (currentState.editingCell && document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n\n store.batch(() => {\n store.setState(\"focusedCell\", null);\n store.setState(\"editingCell\", null);\n });\n }, [store]);\n\n const scrollToCell = React.useCallback(\n (rowIndex: number, columnId: string) => {\n requestAnimationFrame(() => {\n const container = dataGridRef.current;\n const cellKey = getCellKey(rowIndex, columnId);\n const targetCell = cellMapRef.current.get(cellKey);\n\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n isRtl: dir === \"rtl\"\n });\n }\n });\n },\n [dir]\n );\n\n const onCellClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n if (event?.button === 2) return;\n\n const currentState = store.getState();\n const currentFocused = currentState.focusedCell;\n\n if (event) {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const cellKey = getCellKey(rowIndex, columnId);\n const newSelectedCells = new Set(currentState.selectionState.selectedCells);\n\n if (newSelectedCells.has(cellKey)) {\n newSelectedCells.delete(cellKey);\n } else {\n newSelectedCells.add(cellKey);\n }\n\n store.setState(\"selectionState\", {\n selectedCells: newSelectedCells,\n selectionRange: null,\n isSelecting: false\n });\n focusCell(rowIndex, columnId);\n scrollToCell(rowIndex, columnId);\n return;\n }\n\n if (event.shiftKey && currentState.focusedCell) {\n event.preventDefault();\n selectRange(currentState.focusedCell, { rowIndex, columnId });\n scrollToCell(rowIndex, columnId);\n return;\n }\n }\n\n const hasSelectedCells = currentState.selectionState.selectedCells.size > 0;\n const hasSelectedRows = Object.keys(currentState.rowSelection).length > 0;\n\n if (hasSelectedCells && !currentState.selectionState.isSelecting) {\n const cellKey = getCellKey(rowIndex, columnId);\n const isClickingSelectedCell = currentState.selectionState.selectedCells.has(cellKey);\n\n if (!isClickingSelectedCell) {\n onSelectionClear();\n } else {\n focusCell(rowIndex, columnId);\n scrollToCell(rowIndex, columnId);\n return;\n }\n } else if (hasSelectedRows && columnId !== \"select\") {\n onSelectionClear();\n }\n\n if (currentFocused?.rowIndex === rowIndex && currentFocused?.columnId === columnId) {\n onCellEditingStart(rowIndex, columnId);\n } else {\n focusCell(rowIndex, columnId);\n scrollToCell(rowIndex, columnId);\n }\n },\n [store, focusCell, scrollToCell, onCellEditingStart, selectRange, onSelectionClear]\n );\n\n const onCellDoubleClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n if (event?.defaultPrevented) return;\n\n onCellEditingStart(rowIndex, columnId);\n },\n [onCellEditingStart]\n );\n\n const onCellMouseDown = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n if (event.button === 2) {\n return;\n }\n\n event.preventDefault();\n\n if (!event.ctrlKey && !event.metaKey && !event.shiftKey) {\n const cellKey = getCellKey(rowIndex, columnId);\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: propsRef.current.enableSingleCellSelection ? new Set([cellKey]) : new Set(),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId }\n },\n isSelecting: true\n });\n store.setState(\"rowSelection\", {});\n });\n }\n },\n [store, propsRef]\n );\n\n const onCellMouseEnter = React.useCallback(\n (rowIndex: number, columnId: string) => {\n const currentState = store.getState();\n if (currentState.selectionState.isSelecting && currentState.selectionState.selectionRange) {\n const start = currentState.selectionState.selectionRange.start;\n const end = { rowIndex, columnId };\n\n if (\n currentState.focusedCell?.rowIndex !== start.rowIndex ||\n currentState.focusedCell?.columnId !== start.columnId\n ) {\n focusCell(start.rowIndex, start.columnId);\n }\n\n selectRange(start, end, true);\n }\n },\n [store, selectRange, focusCell]\n );\n\n const onCellMouseUp = React.useCallback(() => {\n const currentState = store.getState();\n store.setState(\"selectionState\", {\n ...currentState.selectionState,\n isSelecting: false\n });\n }, [store]);\n\n const onCellContextMenu = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const currentState = store.getState();\n const cellKey = getCellKey(rowIndex, columnId);\n const isTargetCellSelected = currentState.selectionState.selectedCells.has(cellKey);\n\n if (!isTargetCellSelected) {\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: new Set([cellKey]),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId }\n },\n isSelecting: false\n });\n store.setState(\"focusedCell\", { rowIndex, columnId });\n });\n }\n\n store.setState(\"contextMenu\", {\n open: true,\n x: event.clientX,\n y: event.clientY\n });\n },\n [store]\n );\n\n const onContextMenuOpenChange = React.useCallback(\n (open: boolean) => {\n if (!open) {\n const currentMenu = store.getState().contextMenu;\n store.setState(\"contextMenu\", {\n open: false,\n x: currentMenu.x,\n y: currentMenu.y\n });\n }\n },\n [store]\n );\n\n const onSortingChange = React.useCallback(\n (updater: Updater<SortingState>) => {\n const currentState = store.getState();\n const newSorting = typeof updater === \"function\" ? updater(currentState.sorting) : updater;\n store.setState(\"sorting\", newSorting);\n\n propsRef.current.onSortingChange?.(newSorting);\n },\n [store, propsRef]\n );\n\n const onColumnFiltersChange = React.useCallback(\n (updater: Updater<ColumnFiltersState>) => {\n const currentState = store.getState();\n const newColumnFilters = typeof updater === \"function\" ? updater(currentState.columnFilters) : updater;\n store.setState(\"columnFilters\", newColumnFilters);\n\n propsRef.current.onColumnFiltersChange?.(newColumnFilters);\n },\n [store, propsRef]\n );\n\n const onRowSelectionChange = React.useCallback(\n (updater: Updater<RowSelectionState>) => {\n const currentState = store.getState();\n const newRowSelection = typeof updater === \"function\" ? updater(currentState.rowSelection) : updater;\n\n const selectedRows = Object.keys(newRowSelection).filter((key) => newRowSelection[key]);\n\n const selectedCells = new Set<string>();\n const rows = tableRef.current?.getRowModel().rows ?? [];\n\n for (const rowId of selectedRows) {\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n if (rowIndex === -1) continue;\n\n for (const columnId of columnIds) {\n selectedCells.add(getCellKey(rowIndex, columnId));\n }\n }\n\n store.batch(() => {\n store.setState(\"rowSelection\", newRowSelection);\n store.setState(\"selectionState\", {\n selectedCells,\n selectionRange: null,\n isSelecting: false\n });\n store.setState(\"focusedCell\", null);\n store.setState(\"editingCell\", null);\n });\n\n propsRef.current.onRowSelectionChange?.(updater);\n },\n [store, columnIds, propsRef]\n );\n\n const onRowSelect = React.useCallback(\n (rowId: string, selected: boolean, shiftKey: boolean) => {\n const currentState = store.getState();\n const rows = tableRef.current?.getRowModel().rows ?? [];\n const currentRowIndex = rows.findIndex((r) => r.id === rowId);\n const currentRow = currentRowIndex >= 0 ? rows[currentRowIndex] : null;\n if (!currentRow) return;\n\n if (shiftKey && currentState.lastClickedRowId !== null) {\n const lastClickedRowIndex = rows.findIndex((r) => r.id === currentState.lastClickedRowId);\n if (lastClickedRowIndex >= 0) {\n const startIndex = Math.min(lastClickedRowIndex, currentRowIndex);\n const endIndex = Math.max(lastClickedRowIndex, currentRowIndex);\n\n const newRowSelection: RowSelectionState = {\n ...currentState.rowSelection\n };\n\n for (let i = startIndex; i <= endIndex; i++) {\n const row = rows[i];\n if (row) {\n newRowSelection[row.id] = selected;\n }\n }\n\n onRowSelectionChange(newRowSelection);\n } else {\n onRowSelectionChange({\n ...currentState.rowSelection,\n [currentRow.id]: selected\n });\n }\n } else {\n onRowSelectionChange({\n ...currentState.rowSelection,\n [currentRow.id]: selected\n });\n }\n\n store.setState(\"lastClickedRowId\", rowId);\n },\n [store, onRowSelectionChange]\n );\n\n const onRowHeightChange = React.useCallback(\n (updater: Updater<RowHeightValue>) => {\n const currentState = store.getState();\n const newRowHeight = typeof updater === \"function\" ? updater(currentState.rowHeight) : updater;\n store.setState(\"rowHeight\", newRowHeight);\n propsRef.current.onRowHeightChange?.(newRowHeight);\n },\n [store, propsRef]\n );\n\n const onColumnClick = React.useCallback(\n (columnId: string) => {\n if (!propsRef.current.enableColumnSelection) {\n onSelectionClear();\n return;\n }\n\n selectColumn(columnId);\n },\n [propsRef, selectColumn, onSelectionClear]\n );\n\n const onPasteDialogOpenChange = React.useCallback(\n (open: boolean) => {\n if (!open) {\n store.setState(\"pasteDialog\", {\n open: false,\n rowsNeeded: 0,\n clipboardText: \"\"\n });\n }\n },\n [store]\n );\n\n const defaultColumn: Partial<ColumnDef<TData>> = React.useMemo(\n () => ({\n // Cell is rendered directly in DataGridRow to bypass flexRender's\n // unstable cell.getContext() (https://github.com/TanStack/table/issues/4794)\n minSize: MIN_COLUMN_SIZE,\n maxSize: MAX_COLUMN_SIZE\n }),\n []\n );\n\n // Có hay không các callback tuỳ chọn: lưới bật/tắt tính năng theo cờ này\n // (dòng \"Thêm dòng\", mục \"Xoá dòng\" ở menu chuột phải, tải tệp lên…).\n // Phải là dependency thật, nếu đọc propsRef.current trong useMemo thì\n // ứng dụng truyền callback muộn (sau khi tải quyền chẳng hạn) sẽ không có tác dụng.\n const hasRowAdd = Boolean(props.onRowAdd);\n const hasRowsDelete = Boolean(props.onRowsDelete);\n const hasFilesUpload = Boolean(props.onFilesUpload);\n const hasFilesDelete = Boolean(props.onFilesDelete);\n\n const onFilesUpload = React.useCallback(\n (params: { files: File[]; rowIndex: number; columnId: string }) => {\n const upload = propsRef.current.onFilesUpload;\n return upload ? upload(params) : Promise.resolve([]);\n },\n [propsRef]\n );\n\n const onFilesDelete = React.useCallback(\n async (params: { fileIds: string[]; rowIndex: number; columnId: string }) => {\n await propsRef.current.onFilesDelete?.(params);\n },\n [propsRef]\n );\n\n const tableMeta = React.useMemo<TableMeta<TData>>(() => {\n return {\n ...propsRef.current.meta,\n dataGridRef,\n cellMapRef,\n get focusedCell() {\n return store.getState().focusedCell;\n },\n get editingCell() {\n return store.getState().editingCell;\n },\n get selectionState() {\n return store.getState().selectionState;\n },\n get searchOpen() {\n return store.getState().searchOpen;\n },\n get contextMenu() {\n return store.getState().contextMenu;\n },\n get pasteDialog() {\n return store.getState().pasteDialog;\n },\n get rowHeight() {\n return store.getState().rowHeight;\n },\n get readOnly() {\n return propsRef.current.readOnly;\n },\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n getVisualRowIndex,\n scrollToCell: (rowIndex, columnId, align = \"auto\") => {\n const container = dataGridRef.current;\n if (!container) return;\n\n rowVirtualizerRef.current?.scrollToIndex(rowIndex, { align });\n\n const scrollRowIntoView = (retries = 1) => {\n requestAnimationFrame(() => {\n const targetRow = rowMapRef.current.get(rowIndex);\n if (!targetRow) {\n if (retries > 0) scrollRowIntoView(retries - 1);\n return;\n }\n\n const headerBottom =\n headerRef.current?.getBoundingClientRect().bottom ?? container.getBoundingClientRect().top;\n\n const viewportTop = headerBottom + VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n\n if (rowRect.top < viewportTop) {\n container.scrollTop -= viewportTop - rowRect.top;\n }\n\n const cellKey = getCellKey(rowIndex, columnId);\n const targetCell = cellMapRef.current.get(cellKey);\n if (targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n isRtl: dir === \"rtl\"\n });\n }\n });\n };\n\n scrollRowIntoView();\n },\n onRowHeightChange,\n onRowSelect,\n onDataUpdate,\n onRowsDelete: hasRowsDelete ? onRowsDelete : undefined,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n onCellsCopy,\n onCellsCut,\n onCellsPaste,\n onSelectionClear,\n onFilesUpload: hasFilesUpload ? onFilesUpload : undefined,\n onFilesDelete: hasFilesDelete ? onFilesDelete : undefined,\n onContextMenuOpenChange,\n onPasteDialogOpenChange\n };\n }, [\n propsRef,\n store,\n dir,\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n getVisualRowIndex,\n onRowHeightChange,\n onRowSelect,\n onDataUpdate,\n onRowsDelete,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n onCellsCopy,\n onCellsCut,\n onCellsPaste,\n onSelectionClear,\n onContextMenuOpenChange,\n onPasteDialogOpenChange,\n hasRowsDelete,\n hasFilesUpload,\n hasFilesDelete,\n onFilesUpload,\n onFilesDelete\n ]);\n\n const getMemoizedCoreRowModel = React.useMemo(() => getCoreRowModel(), []);\n const getMemoizedFilteredRowModel = React.useMemo(() => getFilteredRowModel(), []);\n const getMemoizedSortedRowModel = React.useMemo(() => getSortedRowModel(), []);\n\n // Memoize state object to reduce shallow equality checks\n const tableState = React.useMemo<Partial<TableState>>(\n () => ({\n ...propsRef.current.state,\n sorting,\n columnFilters,\n rowSelection\n }),\n [propsRef, sorting, columnFilters, rowSelection]\n );\n\n const tableOptions = React.useMemo<TableOptions<TData>>(() => {\n return {\n ...propsRef.current,\n data,\n columns,\n defaultColumn,\n initialState: propsRef.current.initialState,\n state: tableState,\n onRowSelectionChange,\n onSortingChange,\n onColumnFiltersChange,\n columnResizeMode: \"onChange\",\n columnResizeDirection: dir,\n getCoreRowModel: getMemoizedCoreRowModel,\n getFilteredRowModel: getMemoizedFilteredRowModel,\n getSortedRowModel: getMemoizedSortedRowModel,\n meta: tableMeta\n };\n }, [\n propsRef,\n data,\n columns,\n defaultColumn,\n tableState,\n dir,\n onRowSelectionChange,\n onSortingChange,\n onColumnFiltersChange,\n getMemoizedCoreRowModel,\n getMemoizedFilteredRowModel,\n getMemoizedSortedRowModel,\n tableMeta\n ]);\n\n const table = useReactTable(tableOptions);\n\n if (!tableRef.current) {\n tableRef.current = table;\n }\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: columnSizingInfo and columnSizing are used for calculating the column size vars\n const columnSizeVars = React.useMemo(() => {\n const headers = table.getFlatHeaders();\n const colSizes: { [key: string]: number } = {};\n for (const header of headers) {\n colSizes[`--header-${header.id}-size`] = header.getSize();\n colSizes[`--col-${header.column.id}-size`] = header.column.getSize();\n }\n return colSizes;\n }, [table.getState().columnSizingInfo, table.getState().columnSizing]);\n\n const isFirefox = React.useSyncExternalStore(\n React.useCallback(() => () => {}, []),\n React.useCallback(() => {\n if (typeof window === \"undefined\" || typeof navigator === \"undefined\") {\n return false;\n }\n return navigator.userAgent.indexOf(\"Firefox\") !== -1;\n }, []),\n React.useCallback(() => false, [])\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: columnPinning is used for calculating the adjustLayout\n const adjustLayout = React.useMemo(() => {\n const columnPinning = table.getState().columnPinning;\n return isFirefox && ((columnPinning.left?.length ?? 0) > 0 || (columnPinning.right?.length ?? 0) > 0);\n }, [isFirefox, table.getState().columnPinning]);\n\n const rowVirtualizer = useVirtualizer({\n count: table.getRowModel().rows.length,\n getScrollElement: () => dataGridRef.current,\n estimateSize: () => rowHeightValue,\n overscan,\n measureElement: !isFirefox ? (element) => element?.getBoundingClientRect().height : undefined,\n scrollPaddingStart:\n (headerRef.current?.getBoundingClientRect().bottom ?? 0) -\n (dataGridRef.current?.getBoundingClientRect().top ?? 0) +\n VIEWPORT_OFFSET,\n // Add extra row buffer to absorb virtual position drift after render measurements\n scrollPaddingEnd:\n (dataGridRef.current?.getBoundingClientRect().bottom ?? 0) -\n (footerRef.current?.getBoundingClientRect().top ?? dataGridRef.current?.getBoundingClientRect().bottom ?? 0) +\n rowHeightValue +\n VIEWPORT_OFFSET\n });\n\n if (!rowVirtualizerRef.current) {\n rowVirtualizerRef.current = rowVirtualizer;\n }\n\n const onScrollToRow = React.useCallback(\n async (opts: Partial<CellPosition>) => {\n const rowIndex = opts?.rowIndex ?? 0;\n const columnId = opts?.columnId;\n\n focusGuardRef.current = true;\n\n const navigableIds = propsRef.current.columns\n .map((c) => {\n if (c.id) return c.id;\n if (\"accessorKey\" in c) return c.accessorKey as string;\n return undefined;\n })\n .filter((id): id is string => Boolean(id))\n .filter((c) => !NON_NAVIGABLE_COLUMN_IDS.has(c));\n\n const targetColumnId = columnId ?? navigableIds[0];\n\n if (!targetColumnId) {\n releaseFocusGuard(true);\n return;\n }\n\n async function onScrollAndFocus(retryCount: number) {\n if (!targetColumnId) return;\n const currentRowCount = propsRef.current.data.length;\n\n // If the requested row doesn't exist yet, wait for data to update\n if (rowIndex >= currentRowCount && retryCount > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n await onScrollAndFocus(retryCount - 1);\n return;\n }\n\n const safeRowIndex = Math.min(rowIndex, Math.max(0, currentRowCount - 1));\n\n const isBottomHalf = safeRowIndex > currentRowCount / 2;\n rowVirtualizer.scrollToIndex(safeRowIndex, {\n align: isBottomHalf ? \"end\" : \"start\"\n });\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n\n // Adjust scroll position to account for sticky header/footer\n const container = dataGridRef.current;\n const targetRow = rowMapRef.current.get(safeRowIndex);\n\n if (container && targetRow) {\n const containerRect = container.getBoundingClientRect();\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0;\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0;\n\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET;\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom;\n\n if (!isFullyVisible) {\n if (rowRect.top < viewportTop) {\n // Scroll up as row is partially hidden by header\n container.scrollTop -= viewportTop - rowRect.top;\n } else if (rowRect.bottom > viewportBottom) {\n // Scroll down as row is partially hidden by footer\n container.scrollTop += rowRect.bottom - viewportBottom;\n }\n }\n }\n\n store.batch(() => {\n store.setState(\"focusedCell\", {\n rowIndex: safeRowIndex,\n columnId: targetColumnId\n });\n store.setState(\"editingCell\", null);\n });\n\n const cellKey = getCellKey(safeRowIndex, targetColumnId);\n const cellElement = cellMapRef.current.get(cellKey);\n\n if (cellElement) {\n cellElement.focus();\n releaseFocusGuard();\n } else if (retryCount > 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await onScrollAndFocus(retryCount - 1);\n } else {\n dataGridRef.current?.focus();\n releaseFocusGuard();\n }\n }\n\n await onScrollAndFocus(SCROLL_SYNC_RETRY_COUNT);\n },\n [rowVirtualizer, propsRef, store, releaseFocusGuard]\n );\n\n const onRowAdd = React.useCallback(\n async (event?: React.MouseEvent<HTMLDivElement>) => {\n if (propsRef.current.readOnly || !propsRef.current.onRowAdd) return;\n\n const initialRowCount = propsRef.current.data.length;\n\n let result: Partial<CellPosition> | null;\n try {\n result = await propsRef.current.onRowAdd(event);\n } catch {\n // Callback threw an error, don't proceed with scroll/focus\n return;\n }\n\n if (result === null || event?.defaultPrevented) return;\n\n onSelectionClear();\n\n // onScrollToRow will handle retries if the row isn't rendered yet\n const targetRowIndex = result.rowIndex ?? initialRowCount;\n const targetColumnId = result.columnId;\n\n onScrollToRow({\n rowIndex: targetRowIndex,\n columnId: targetColumnId\n });\n },\n [propsRef, onScrollToRow, onSelectionClear]\n );\n\n const onDataGridKeyDown = React.useCallback(\n (event: KeyboardEvent) => {\n const currentState = store.getState();\n const { key, ctrlKey, metaKey, shiftKey, altKey } = event;\n const isCtrlPressed = ctrlKey || metaKey;\n\n if (propsRef.current.enableSearch && isCtrlPressed && !shiftKey && key === SEARCH_SHORTCUT_KEY) {\n event.preventDefault();\n onSearchOpenChange(true);\n return;\n }\n\n if (propsRef.current.enableSearch && currentState.searchOpen && !currentState.editingCell) {\n if (key === \"Enter\") {\n event.preventDefault();\n if (shiftKey) {\n onNavigateToPrevMatch();\n } else {\n onNavigateToNextMatch();\n }\n return;\n }\n if (key === \"Escape\") {\n event.preventDefault();\n onSearchOpenChange(false);\n return;\n }\n return;\n }\n\n // Cell editing keyboard events (Enter, Tab, Escape) are handled by the cell variants\n // to ensure proper value commitment before navigation\n if (currentState.editingCell) return;\n\n if (\n isCtrlPressed &&\n (key === \"Backspace\" || key === \"Delete\") &&\n !propsRef.current.readOnly &&\n propsRef.current.onRowsDelete\n ) {\n const rowIndices = new Set<number>();\n\n const selectedRowIds = Object.keys(currentState.rowSelection);\n if (selectedRowIds.length > 0) {\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n for (const row of rows) {\n if (currentState.rowSelection[row.id]) {\n rowIndices.add(row.index);\n }\n }\n } else if (currentState.selectionState.selectedCells.size > 0) {\n for (const cellKey of currentState.selectionState.selectedCells) {\n const { rowIndex } = parseCellKey(cellKey);\n rowIndices.add(rowIndex);\n }\n } else if (currentState.focusedCell) {\n rowIndices.add(currentState.focusedCell.rowIndex);\n }\n\n if (rowIndices.size > 0) {\n event.preventDefault();\n onRowsDelete(Array.from(rowIndices));\n }\n return;\n }\n\n if (!currentState.focusedCell) return;\n\n let direction: NavigationDirection | null = null;\n\n if (isCtrlPressed && !shiftKey && key === \"a\") {\n event.preventDefault();\n selectAll();\n return;\n }\n\n if (isCtrlPressed && !shiftKey && key === \"c\") {\n event.preventDefault();\n onCellsCopy();\n return;\n }\n\n if (isCtrlPressed && !shiftKey && key === \"x\" && !propsRef.current.readOnly) {\n event.preventDefault();\n onCellsCut();\n return;\n }\n\n if (propsRef.current.enablePaste && isCtrlPressed && !shiftKey && key === \"v\" && !propsRef.current.readOnly) {\n // KHÔNG preventDefault: để trình duyệt bắn tiếp sự kiện `paste` (xem effect\n // đăng ký \"paste\" bên dưới) — cách đó đọc được clipboard cả ở http nội bộ.\n return;\n }\n\n if ((key === \"Delete\" || key === \"Backspace\") && !isCtrlPressed && !propsRef.current.readOnly) {\n const cellsToClear =\n currentState.selectionState.selectedCells.size > 0\n ? Array.from(currentState.selectionState.selectedCells)\n : currentState.focusedCell\n ? [getCellKey(currentState.focusedCell.rowIndex, currentState.focusedCell.columnId)]\n : [];\n\n if (cellsToClear.length > 0) {\n event.preventDefault();\n\n const updates: Array<{\n rowIndex: number;\n columnId: string;\n value: unknown;\n }> = [];\n\n const currentTable = tableRef.current;\n const tableColumns = currentTable?.getAllColumns() ?? [];\n const columnById = new Map(tableColumns.map((c) => [c.id, c]));\n\n for (const cellKey of cellsToClear) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n const column = columnById.get(columnId);\n const cellVariant = column?.columnDef?.meta?.cell?.variant;\n const emptyValue = getEmptyCellValue(cellVariant);\n updates.push({ rowIndex, columnId, value: emptyValue });\n }\n\n onDataUpdate(updates);\n\n if (currentState.selectionState.selectedCells.size > 0) {\n onSelectionClear();\n }\n\n if (currentState.cutCells.size > 0) {\n store.setState(\"cutCells\", new Set());\n }\n }\n return;\n }\n\n if (key === \"Enter\" && shiftKey && !propsRef.current.readOnly && propsRef.current.onRowAdd) {\n event.preventDefault();\n const initialRowCount = propsRef.current.data.length;\n const currentColumnId = currentState.focusedCell.columnId;\n\n Promise.resolve(propsRef.current.onRowAdd())\n .then(async (result) => {\n if (result === null) return;\n\n onSelectionClear();\n\n const targetRowIndex = result.rowIndex ?? initialRowCount;\n const targetColumnId = result.columnId ?? currentColumnId;\n\n onScrollToRow({\n rowIndex: targetRowIndex,\n columnId: targetColumnId\n });\n })\n .catch(() => {\n // Callback threw an error, don't proceed with scroll/focus\n });\n return;\n }\n\n switch (key) {\n case \"ArrowUp\":\n if (altKey && !isCtrlPressed && !shiftKey) {\n direction = \"pageup\";\n } else if (isCtrlPressed && shiftKey) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const currentColIndex = navigableColumnIds.indexOf(selectionEdge.columnId);\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n\n selectRange(selectionStart, {\n rowIndex: 0,\n columnId: navigableColumnIds[currentColIndex] ?? selectionEdge.columnId\n });\n\n const rowVirtualizer = rowVirtualizerRef.current;\n if (rowVirtualizer) {\n rowVirtualizer.scrollToIndex(0, { align: \"start\" });\n }\n\n restoreFocus(dataGridRef.current);\n\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"ctrl+up\";\n } else {\n direction = \"up\";\n }\n break;\n case \"ArrowDown\":\n if (altKey && !isCtrlPressed && !shiftKey) {\n direction = \"pagedown\";\n } else if (isCtrlPressed && shiftKey) {\n const rowCount = tableRef.current?.getRowModel().rows.length || propsRef.current.data.length;\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const currentColIndex = navigableColumnIds.indexOf(selectionEdge.columnId);\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n\n selectRange(selectionStart, {\n rowIndex: Math.max(0, rowCount - 1),\n columnId: navigableColumnIds[currentColIndex] ?? selectionEdge.columnId\n });\n\n const rowVirtualizer = rowVirtualizerRef.current;\n if (rowVirtualizer) {\n rowVirtualizer.scrollToIndex(Math.max(0, rowCount - 1), {\n align: \"end\"\n });\n }\n\n restoreFocus(dataGridRef.current);\n\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"ctrl+down\";\n } else {\n direction = \"down\";\n }\n break;\n case \"ArrowLeft\":\n if (isCtrlPressed && shiftKey) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n const targetColumnId =\n dir === \"rtl\" ? navigableColumnIds[navigableColumnIds.length - 1] : navigableColumnIds[0];\n\n if (targetColumnId) {\n selectRange(selectionStart, {\n rowIndex: selectionEdge.rowIndex,\n columnId: targetColumnId\n });\n\n const container = dataGridRef.current;\n const cellKey = getCellKey(selectionEdge.rowIndex, targetColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: \"home\",\n isRtl: dir === \"rtl\"\n });\n }\n\n restoreFocus(container);\n }\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"home\";\n } else {\n direction = \"left\";\n }\n break;\n case \"ArrowRight\":\n if (isCtrlPressed && shiftKey) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n const targetColumnId =\n dir === \"rtl\" ? navigableColumnIds[0] : navigableColumnIds[navigableColumnIds.length - 1];\n\n if (targetColumnId) {\n selectRange(selectionStart, {\n rowIndex: selectionEdge.rowIndex,\n columnId: targetColumnId\n });\n\n const container = dataGridRef.current;\n const cellKey = getCellKey(selectionEdge.rowIndex, targetColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: \"end\",\n isRtl: dir === \"rtl\"\n });\n }\n\n restoreFocus(container);\n }\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"end\";\n } else {\n direction = \"right\";\n }\n break;\n case \"Home\":\n direction = isCtrlPressed ? \"ctrl+home\" : \"home\";\n break;\n case \"End\":\n direction = isCtrlPressed ? \"ctrl+end\" : \"end\";\n break;\n case \"PageUp\":\n direction = altKey ? \"pageleft\" : \"pageup\";\n break;\n case \"PageDown\":\n direction = altKey ? \"pageright\" : \"pagedown\";\n break;\n case \"Escape\":\n event.preventDefault();\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n onSelectionClear();\n } else {\n blurCell();\n }\n return;\n case \"Tab\":\n event.preventDefault();\n if (dir === \"rtl\") {\n direction = event.shiftKey ? \"right\" : \"left\";\n } else {\n direction = event.shiftKey ? \"left\" : \"right\";\n }\n break;\n }\n\n if (direction) {\n event.preventDefault();\n\n if (shiftKey && key !== \"Tab\" && currentState.focusedCell) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n\n const currentColIndex = navigableColumnIds.indexOf(selectionEdge.columnId);\n let newRowIndex = selectionEdge.rowIndex;\n let newColumnId = selectionEdge.columnId;\n\n const isRtl = dir === \"rtl\";\n\n const rowCount = tableRef.current?.getRowModel().rows.length || propsRef.current.data.length;\n\n switch (direction) {\n case \"up\":\n newRowIndex = Math.max(0, selectionEdge.rowIndex - 1);\n break;\n case \"down\":\n newRowIndex = Math.min(rowCount - 1, selectionEdge.rowIndex + 1);\n break;\n case \"left\":\n if (isRtl) {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n } else {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n }\n break;\n case \"right\":\n if (isRtl) {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n } else {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n }\n break;\n case \"home\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[0] ?? newColumnId;\n }\n break;\n case \"end\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[navigableColumnIds.length - 1] ?? newColumnId;\n }\n break;\n }\n\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n\n selectRange(selectionStart, {\n rowIndex: newRowIndex,\n columnId: newColumnId\n });\n\n const container = dataGridRef.current;\n const targetRow = rowMapRef.current.get(newRowIndex);\n const cellKey = getCellKey(newRowIndex, newColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n\n if (newRowIndex !== selectionEdge.rowIndex && (direction === \"up\" || direction === \"down\")) {\n if (container && targetRow) {\n const containerRect = container.getBoundingClientRect();\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0;\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0;\n\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET;\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom;\n\n if (!isFullyVisible) {\n const scrollNeeded = direction === \"down\" ? rowRect.bottom - viewportBottom : viewportTop - rowRect.top;\n\n if (direction === \"down\") {\n container.scrollTop += scrollNeeded;\n } else {\n container.scrollTop -= scrollNeeded;\n }\n\n restoreFocus(container);\n }\n } else {\n const rowVirtualizer = rowVirtualizerRef.current;\n if (rowVirtualizer) {\n const align = direction === \"up\" ? \"start\" : \"end\";\n rowVirtualizer.scrollToIndex(newRowIndex, { align });\n\n restoreFocus(container);\n }\n }\n }\n\n if (\n newColumnId !== selectionEdge.columnId &&\n (direction === \"left\" || direction === \"right\" || direction === \"home\" || direction === \"end\")\n ) {\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction,\n isRtl\n });\n }\n }\n } else {\n if (currentState.selectionState.selectedCells.size > 0) {\n onSelectionClear();\n }\n navigateCell(direction);\n }\n }\n },\n [\n dir,\n store,\n propsRef,\n blurCell,\n navigateCell,\n selectAll,\n onCellsCopy,\n onCellsCut,\n onDataUpdate,\n onSelectionClear,\n navigableColumnIds,\n selectRange,\n onSearchOpenChange,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n onRowsDelete,\n restoreFocus,\n onScrollToRow\n ]\n );\n\n const searchState = React.useMemo<SearchState | undefined>(() => {\n if (!propsRef.current.enableSearch) return undefined;\n\n return {\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch\n };\n }, [\n propsRef,\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch\n ]);\n\n React.useEffect(() => {\n const dataGridElement = dataGridRef.current;\n if (!dataGridElement) return;\n\n dataGridElement.addEventListener(\"keydown\", onDataGridKeyDown);\n return () => {\n dataGridElement.removeEventListener(\"keydown\", onDataGridKeyDown);\n };\n }, [onDataGridKeyDown]);\n\n // Dán: lấy nội dung từ chính sự kiện `paste` thay vì gọi navigator.clipboard.readText —\n // API đó chỉ chạy ở secure context (https/localhost) và Firefox còn hỏi quyền mỗi lần.\n React.useEffect(() => {\n const dataGridElement = dataGridRef.current;\n if (!dataGridElement) return;\n\n function onPaste(event: ClipboardEvent) {\n if (!propsRef.current.enablePaste || propsRef.current.readOnly) return;\n\n const currentState = store.getState();\n // Đang sửa ô: để ô tự nhận nội dung dán như input bình thường\n if (currentState.editingCell || !currentState.focusedCell) return;\n\n const clipboardText = event.clipboardData?.getData(\"text/plain\") ?? \"\";\n if (!clipboardText) return;\n\n event.preventDefault();\n onCellsPaste(false, clipboardText);\n }\n\n dataGridElement.addEventListener(\"paste\", onPaste);\n return () => {\n dataGridElement.removeEventListener(\"paste\", onPaste);\n };\n }, [propsRef, store, onCellsPaste]);\n\n React.useEffect(() => {\n function onGlobalKeyDown(event: KeyboardEvent) {\n const dataGridElement = dataGridRef.current;\n if (!dataGridElement) return;\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n\n const { key, ctrlKey, metaKey, shiftKey } = event;\n const isCommandPressed = ctrlKey || metaKey;\n\n if (propsRef.current.enableSearch && isCommandPressed && !shiftKey && key === SEARCH_SHORTCUT_KEY) {\n const isInInput = target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\";\n const isInDataGrid = dataGridElement.contains(target);\n const isInSearchInput = target.closest('[role=\"search\"]') !== null;\n\n if (isInDataGrid || isInSearchInput || !isInInput) {\n event.preventDefault();\n event.stopPropagation();\n\n const nextSearchOpen = !store.getState().searchOpen;\n onSearchOpenChange(nextSearchOpen);\n\n if (nextSearchOpen && !isInDataGrid && !isInSearchInput) {\n requestAnimationFrame(() => {\n dataGridElement.focus();\n });\n }\n return;\n }\n }\n\n const isInDataGrid = dataGridElement.contains(target);\n if (!isInDataGrid) return;\n\n if (key === \"Escape\") {\n const currentState = store.getState();\n const hasSelections =\n currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0;\n\n if (hasSelections) {\n event.preventDefault();\n event.stopPropagation();\n onSelectionClear();\n }\n }\n }\n\n window.addEventListener(\"keydown\", onGlobalKeyDown, true);\n return () => {\n window.removeEventListener(\"keydown\", onGlobalKeyDown, true);\n };\n }, [propsRef, onSearchOpenChange, store, onSelectionClear]);\n\n React.useEffect(() => {\n const currentState = store.getState();\n const autoFocus = propsRef.current.autoFocus;\n\n if (autoFocus && data.length > 0 && columns.length > 0 && !currentState.focusedCell) {\n if (navigableColumnIds.length > 0) {\n const rafId = requestAnimationFrame(() => {\n if (typeof autoFocus === \"object\") {\n const { rowIndex, columnId } = autoFocus;\n if (columnId) {\n focusCell(rowIndex ?? 0, columnId);\n }\n return;\n }\n\n const firstColumnId = navigableColumnIds[0];\n if (firstColumnId) {\n focusCell(0, firstColumnId);\n }\n });\n return () => cancelAnimationFrame(rafId);\n }\n }\n }, [store, propsRef, data, columns, navigableColumnIds, focusCell]);\n\n // Restore focus to container when virtualized cells are unmounted\n React.useEffect(() => {\n const container = dataGridRef.current;\n if (!container) return;\n\n function onFocusOut(event: FocusEvent) {\n if (focusGuardRef.current) return;\n\n const currentContainer = dataGridRef.current;\n if (!currentContainer) return;\n\n const currentState = store.getState();\n\n if (!currentState.focusedCell || currentState.editingCell) return;\n\n const relatedTarget = event.relatedTarget;\n\n const isFocusMovingOutsideGrid = !relatedTarget || !currentContainer.contains(relatedTarget as Node);\n\n const isFocusMovingToPopover = getIsInPopover(relatedTarget);\n\n if (isFocusMovingOutsideGrid && !isFocusMovingToPopover) {\n const { rowIndex, columnId } = currentState.focusedCell;\n const cellKey = getCellKey(rowIndex, columnId);\n const cellElement = cellMapRef.current.get(cellKey);\n\n requestAnimationFrame(() => {\n if (focusGuardRef.current) return;\n\n if (cellElement && document.body.contains(cellElement)) {\n cellElement.focus();\n } else {\n currentContainer.focus();\n }\n });\n }\n }\n\n container.addEventListener(\"focusout\", onFocusOut);\n\n return () => {\n container.removeEventListener(\"focusout\", onFocusOut);\n };\n }, [store]);\n\n React.useEffect(() => {\n function onOutsideClick(event: MouseEvent) {\n if (event.button === 2) {\n return;\n }\n\n if (dataGridRef.current && !dataGridRef.current.contains(event.target as Node)) {\n const elements = document.elementsFromPoint(event.clientX, event.clientY);\n\n // Compensate for event.target bubbling up\n const isInsidePopover = elements.some((element) => getIsInPopover(element));\n\n if (!isInsidePopover) {\n blurCell();\n const currentState = store.getState();\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n onSelectionClear();\n }\n }\n }\n }\n\n document.addEventListener(\"mousedown\", onOutsideClick);\n return () => {\n document.removeEventListener(\"mousedown\", onOutsideClick);\n };\n }, [store, blurCell, onSelectionClear]);\n\n React.useEffect(() => {\n function onSelectStart(event: Event) {\n event.preventDefault();\n }\n\n function onContextMenu(event: Event) {\n event.preventDefault();\n }\n\n function onCleanup() {\n document.removeEventListener(\"selectstart\", onSelectStart);\n document.removeEventListener(\"contextmenu\", onContextMenu);\n document.body.style.userSelect = \"\";\n }\n\n const onUnsubscribe = store.subscribe(() => {\n const currentState = store.getState();\n if (currentState.selectionState.isSelecting) {\n document.addEventListener(\"selectstart\", onSelectStart);\n document.addEventListener(\"contextmenu\", onContextMenu);\n document.body.style.userSelect = \"none\";\n } else {\n onCleanup();\n }\n });\n\n return () => {\n onCleanup();\n onUnsubscribe();\n };\n }, [store]);\n\n React.useEffect(() => {\n let rafId: number | null = null;\n let mouseX = 0;\n let mouseY = 0;\n let mouseReady = false;\n let active = false;\n let lastSelectionTime = 0;\n let resizeObserver: ResizeObserver | null = null;\n\n let cachedRect: DOMRect | null = null;\n let cachedHdrH = 0;\n let cachedFtrH = 0;\n let cachedLpw = 0;\n let cachedRpw = 0;\n\n function getAutoScrollSpeed(dist: number): number {\n const t = Math.min(dist / AUTO_SCROLL_SPEED_RAMP_ZONE, 1);\n return Math.round(AUTO_SCROLL_MIN_SPEED + (AUTO_SCROLL_MAX_SPEED - AUTO_SCROLL_MIN_SPEED) * t);\n }\n\n function cacheLayout(container: HTMLDivElement) {\n cachedRect = container.getBoundingClientRect();\n cachedHdrH = headerRef.current?.getBoundingClientRect().height ?? 0;\n cachedFtrH = footerRef.current?.getBoundingClientRect().height ?? 0;\n const tbl = tableRef.current;\n if (tbl) {\n cachedLpw = tbl.getLeftVisibleLeafColumns().reduce((s, c) => s + c.getSize(), 0);\n cachedRpw = tbl.getRightVisibleLeafColumns().reduce((s, c) => s + c.getSize(), 0);\n }\n }\n\n function tick() {\n if (!active) return;\n const container = dataGridRef.current;\n const tbl = tableRef.current;\n\n if (!container || !tbl) {\n onAutoScrollStop();\n return;\n }\n\n if (!mouseReady || !cachedRect) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n const rect = cachedRect;\n const { dir } = dragDepsRef.current;\n const hasNegativeScroll = container.scrollLeft < 0;\n const isActuallyRtl = dir === \"rtl\" || hasNegativeScroll;\n\n const dataTop = rect.top + cachedHdrH;\n const dataBottom = rect.bottom - cachedFtrH;\n\n const scrollAreaLeft = isActuallyRtl ? rect.left + cachedRpw : rect.left + cachedLpw;\n const scrollAreaRight = isActuallyRtl ? rect.right - cachedLpw : rect.right - cachedRpw;\n\n let dy = 0;\n let dx = 0;\n\n if (mouseY < dataTop) dy = -getAutoScrollSpeed(dataTop - mouseY);\n else if (mouseY > dataBottom) dy = getAutoScrollSpeed(mouseY - dataBottom);\n\n if (mouseX < scrollAreaLeft) dx = -getAutoScrollSpeed(scrollAreaLeft - mouseX);\n else if (mouseX > scrollAreaRight) dx = getAutoScrollSpeed(mouseX - scrollAreaRight);\n\n if (dx === 0 && dy === 0) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n container.scrollTop += dy;\n container.scrollLeft += dx;\n\n const now = performance.now();\n if (now - lastSelectionTime < AUTO_SCROLL_SELECTION_THROTTLE_MS) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n const { rowHeightValue: rh, columnIds } = dragDepsRef.current;\n if (columnIds.length === 0) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n const totalRows = tbl.getRowModel().rows.length;\n const clampedY = Math.max(dataTop, Math.min(mouseY, dataBottom));\n const absY = container.scrollTop + (clampedY - dataTop);\n const rowIndex = Math.max(0, Math.min(Math.floor(absY / rh), totalRows - 1));\n\n const st = store.getState();\n const range = st.selectionState.selectionRange;\n\n let columnId: string | undefined;\n\n if (dx !== 0) {\n const clampedX = Math.max(rect.left, Math.min(mouseX, rect.right));\n const relX = clampedX - rect.left;\n\n const leftZoneWidth = isActuallyRtl ? cachedRpw : cachedLpw;\n const rightZoneWidth = isActuallyRtl ? cachedLpw : cachedRpw;\n\n if (relX < leftZoneWidth) {\n const columns = isActuallyRtl ? tbl.getRightVisibleLeafColumns() : tbl.getLeftVisibleLeafColumns();\n columnId = columns[0]?.id ?? columnIds[0] ?? \"\";\n let cx = 0;\n for (const col of columns) {\n if (relX < cx + col.getSize()) {\n columnId = col.id;\n break;\n }\n cx += col.getSize();\n }\n } else if (relX > rect.width - rightZoneWidth) {\n const columns = isActuallyRtl ? tbl.getLeftVisibleLeafColumns() : tbl.getRightVisibleLeafColumns();\n columnId = columns[0]?.id ?? columnIds[columnIds.length - 1] ?? \"\";\n let cx = rect.width - rightZoneWidth;\n for (const col of columns) {\n if (relX < cx + col.getSize()) {\n columnId = col.id;\n break;\n }\n cx += col.getSize();\n }\n } else {\n const center = tbl.getCenterVisibleLeafColumns();\n const centerZoneWidth = rect.width - leftZoneWidth - rightZoneWidth;\n const distFromVisualLeft = relX - leftZoneWidth;\n\n let absX: number;\n if (isActuallyRtl) {\n const scrollFromRight = hasNegativeScroll\n ? -container.scrollLeft\n : container.scrollWidth - container.clientWidth - container.scrollLeft;\n absX = scrollFromRight + (centerZoneWidth - distFromVisualLeft);\n } else {\n absX = container.scrollLeft + distFromVisualLeft;\n }\n\n columnId = center[center.length - 1]?.id ?? columnIds[columnIds.length - 1] ?? \"\";\n let cw = 0;\n for (const col of center) {\n cw += col.getSize();\n if (absX < cw) {\n columnId = col.id;\n break;\n }\n }\n }\n }\n\n if (!columnId) {\n columnId = range?.end.columnId ?? columnIds[0] ?? \"\";\n }\n\n if (range && (rowIndex !== range.end.rowIndex || columnId !== range.end.columnId)) {\n dragDepsRef.current.selectRange(range.start, { rowIndex, columnId }, true);\n lastSelectionTime = now;\n }\n\n rafId = requestAnimationFrame(tick);\n }\n\n function onMove(event: MouseEvent) {\n mouseX = event.clientX;\n mouseY = event.clientY;\n mouseReady = true;\n }\n\n function onUp() {\n onAutoScrollStop();\n const st = store.getState();\n if (st.selectionState.isSelecting) {\n store.setState(\"selectionState\", {\n ...st.selectionState,\n isSelecting: false\n });\n }\n }\n\n function onAutoScrollStart() {\n if (active) return;\n\n const container = dataGridRef.current;\n if (!container) return;\n\n active = true;\n mouseReady = false;\n cachedRect = null;\n lastSelectionTime = 0;\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n resizeObserver = new ResizeObserver(() => {\n const currentContainer = dataGridRef.current;\n if (currentContainer) cacheLayout(currentContainer);\n });\n resizeObserver.observe(container);\n rafId = requestAnimationFrame(() => {\n const currentContainer = dataGridRef.current;\n if (currentContainer) cacheLayout(currentContainer);\n rafId = requestAnimationFrame(tick);\n });\n }\n\n function onAutoScrollStop() {\n if (!active) return;\n active = false;\n cachedRect = null;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n resizeObserver?.disconnect();\n resizeObserver = null;\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n\n if (store.getState().selectionState.isSelecting) onAutoScrollStart();\n\n const onUnsubscribe = store.subscribe(() => {\n const st = store.getState();\n if (st.selectionState.isSelecting && !active) onAutoScrollStart();\n else if (!st.selectionState.isSelecting && active) onAutoScrollStop();\n });\n\n return () => {\n onAutoScrollStop();\n onUnsubscribe();\n };\n }, [store, dragDepsRef]);\n\n useIsomorphicLayoutEffect(() => {\n const rafId = requestAnimationFrame(() => {\n rowVirtualizer.measure();\n });\n return () => cancelAnimationFrame(rafId);\n }, [\n rowHeight,\n table.getState().columnFilters,\n table.getState().columnOrder,\n table.getState().columnPinning,\n table.getState().columnSizing,\n table.getState().columnVisibility,\n table.getState().expanded,\n table.getState().globalFilter,\n table.getState().grouping,\n table.getState().rowSelection,\n table.getState().sorting\n ]);\n\n const virtualTotalSize = rowVirtualizer.getTotalSize();\n const virtualItems = rowVirtualizer.getVirtualItems();\n const measureElement = rowVirtualizer.measureElement;\n\n return React.useMemo(\n () => ({\n dataGridRef,\n headerRef,\n rowMapRef,\n footerRef,\n dir,\n table,\n tableMeta,\n virtualTotalSize,\n virtualItems,\n measureElement,\n columns,\n columnSizeVars,\n searchState,\n searchMatchesByRow,\n activeSearchMatch,\n cellSelectionMap,\n focusedCell,\n editingCell,\n rowHeight,\n contextMenu,\n pasteDialog,\n onRowAdd: hasRowAdd ? onRowAdd : undefined,\n adjustLayout,\n locale\n }),\n [\n hasRowAdd,\n dir,\n table,\n tableMeta,\n virtualTotalSize,\n virtualItems,\n measureElement,\n columns,\n columnSizeVars,\n searchState,\n searchMatchesByRow,\n activeSearchMatch,\n cellSelectionMap,\n focusedCell,\n editingCell,\n rowHeight,\n contextMenu,\n pasteDialog,\n onRowAdd,\n adjustLayout,\n locale\n ]\n );\n}\n\nexport { type UseDataGridProps, useDataGrid };\n"],"mappings":"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","names":["updates","currentTable","rowVirtualizer","rowHeightValue","isInDataGrid","dir","columnIds","columns"]}
1
+ {"version":3,"sources":["../../src/data-grid/use-data-grid.ts"],"sourcesContent":["\"use client\";\n\nimport { useDirection } from \"@radix-ui/react-direction\";\nimport {\n type ColumnDef,\n type ColumnFiltersState,\n getCoreRowModel,\n getFilteredRowModel,\n getSortedRowModel,\n type Row,\n type RowSelectionState,\n type SortingState,\n type TableMeta,\n type TableOptions,\n type TableState,\n type Updater,\n useReactTable\n} from \"@tanstack/react-table\";\nimport { useVirtualizer, type Virtualizer } from \"@tanstack/react-virtual\";\nimport * as React from \"react\";\nimport { normalizeVi } from \"../lib/text-search.js\";\nimport { useAsRef } from \"../lib/use-as-ref.js\";\nimport { useIsomorphicLayoutEffect } from \"../lib/use-isomorphic-layout-effect.js\";\nimport { useLazyRef } from \"../lib/use-lazy-ref.js\";\nimport { useResolvedDataGridLocale } from \"./data-grid-locale.js\";\nimport type { DataGridLocale, DataGridMessages } from \"./messages.js\";\nimport { toastError, toastSuccess } from \"./toast.js\";\nimport type {\n CellOpts,\n CellPosition,\n CellUpdate,\n ContextMenuState,\n Direction,\n FileCellData,\n NavigationDirection,\n PasteDialogState,\n RowHeightValue,\n SearchState,\n SelectionState\n} from \"./types.js\";\nimport {\n formatDate,\n getCellKey,\n getEmptyCellValue,\n getIsFileCellData,\n getIsInPopover,\n getRowHeightValue,\n getScrollDirection,\n matchSelectOption,\n parseCellKey,\n parseDateInput,\n parseTsv,\n readClipboardText,\n scrollCellIntoView,\n writeClipboardText\n} from \"./utils.js\";\n\nconst DEFAULT_ROW_HEIGHT = \"short\";\nconst OVERSCAN = 6;\nconst VIEWPORT_OFFSET = 1;\nconst HORIZONTAL_PAGE_SIZE = 5;\nconst SCROLL_SYNC_RETRY_COUNT = 16;\nconst MIN_COLUMN_SIZE = 60;\nconst MAX_COLUMN_SIZE = 800;\nconst SEARCH_SHORTCUT_KEY = \"f\";\nconst NON_NAVIGABLE_COLUMN_IDS = new Set([\"select\", \"actions\"]);\nconst AUTO_SCROLL_EDGE_ZONE = 50;\nconst AUTO_SCROLL_SPEED_RAMP_ZONE = AUTO_SCROLL_EDGE_ZONE * 3;\nconst AUTO_SCROLL_MIN_SPEED = 8;\nconst AUTO_SCROLL_MAX_SPEED = 40;\nconst AUTO_SCROLL_SELECTION_THROTTLE_MS = 32;\n\n/** Cột có `meta.readOnly` (3.1.0) — khoá sửa riêng cột đó, lưới vẫn sửa được. */\nfunction getIsColumnReadOnly<TData>(table: ReturnType<typeof useReactTable<TData>> | null, columnId: string): boolean {\n return table?.getColumn(columnId)?.columnDef.meta?.readOnly === true;\n}\n\n/** Chữ NGƯỜI DÙNG THẤY trong ô: nhãn của `select` / `multi-select`, còn lại là chính giá trị. */\nfunction getCellDisplayText(value: unknown, cellOpts: CellOpts | undefined): string {\n if (cellOpts?.variant === \"select\") {\n return cellOpts.options.find((option) => option.value === value)?.label ?? String(value ?? \"\");\n }\n if (cellOpts?.variant === \"multi-select\" && Array.isArray(value)) {\n return value\n .map((item) => cellOpts.options.find((option) => option.value === item)?.label ?? String(item))\n .join(\", \");\n }\n return String(value ?? \"\");\n}\n\n/**\n * ⚠ Khác bản gốc (3.1.0): cột chữ (`short-text` / `long-text` / `url`) và cột `select` sắp xếp theo\n * NGÔN NGỮ của lưới — `Intl.Collator` dựng từ locale date-fns của lưới, cùng thứ tự ưu tiên với phần\n * còn lại — còn `select` theo NHÃN chứ không theo mã. Bản gốc để TanStack so mã ký tự: \"Đặng\", \"Đỗ\"\n * xếp sau \"Vũ\" (Đ là U+0110, sau mọi chữ Latin), \"Nguyễn\" trước \"Ngô\", và cột trạng thái xếp theo\n * id (\"in-progress\" trước \"todo\") thay vì chữ người dùng đọc. Cột app đã tự khai `sortingFn` thì giữ\n * nguyên.\n */\nfunction withLocaleSorting<TData>(column: ColumnDef<TData>, collator: Intl.Collator): ColumnDef<TData> {\n if (column.sortingFn !== undefined) return column;\n if (!(\"accessorKey\" in column) && !(\"accessorFn\" in column)) return column;\n\n const cellOpts = column.meta?.cell;\n const variant = cellOpts?.variant ?? \"short-text\";\n if (variant !== \"short-text\" && variant !== \"long-text\" && variant !== \"url\" && variant !== \"select\") {\n return column;\n }\n\n return {\n ...column,\n sortingFn: (rowA, rowB, columnId) =>\n collator.compare(\n getCellDisplayText(rowA.getValue(columnId), cellOpts),\n getCellDisplayText(rowB.getValue(columnId), cellOpts)\n )\n };\n}\n\nconst DOMAIN_REGEX = /^[\\w.-]+\\.[a-z]{2,}(\\/\\S*)?$/i;\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}.*)?$/;\nconst TRUTHY_BOOLEANS = new Set([\"true\", \"1\", \"yes\", \"checked\"]);\nconst VALID_BOOLEANS = new Set([\"true\", \"false\", \"1\", \"0\", \"yes\", \"no\", \"checked\", \"unchecked\"]);\n\ninterface DataGridState {\n sorting: SortingState;\n columnFilters: ColumnFiltersState;\n rowHeight: RowHeightValue;\n rowSelection: RowSelectionState;\n selectionState: SelectionState;\n focusedCell: CellPosition | null;\n editingCell: CellPosition | null;\n cutCells: Set<string>;\n contextMenu: ContextMenuState;\n searchQuery: string;\n searchMatches: CellPosition[];\n matchIndex: number;\n searchOpen: boolean;\n lastClickedRowId: string | null;\n pasteDialog: PasteDialogState;\n}\n\ninterface DataGridStore {\n subscribe: (callback: () => void) => () => void;\n getState: () => DataGridState;\n setState: <K extends keyof DataGridState>(key: K, value: DataGridState[K]) => void;\n notify: () => void;\n batch: (fn: () => void) => void;\n}\n\nfunction useStore<T>(store: DataGridStore, selector: (state: DataGridState) => T): T {\n const getSnapshot = React.useCallback(() => selector(store.getState()), [store, selector]);\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\n/**\n * Tuỳ chọn của {@link useDataGrid} — mở rộng `TableOptions` của TanStack Table v8.\n *\n * Hook KHÔNG tự gọi API nào: mọi thay đổi dữ liệu đều đi ra ngoài qua callback\n * (`onDataChange`, `onRowAdd`, `onRowsDelete`, `onFilesUpload`…) để ứng dụng tự\n * quyết định lưu ở đâu (REST, GraphQL, state cục bộ…).\n */\ninterface UseDataGridProps<TData> extends Omit<TableOptions<TData>, \"pageCount\" | \"getCoreRowModel\"> {\n /**\n * Nhận MẢNG DỮ LIỆU MỚI sau mỗi lần sửa ô/dán/xoá nội dung.\n * Ứng dụng tự setState + gọi API lưu (thường lưu lạc quan rồi rollback khi lỗi).\n */\n onDataChange?: (data: TData[]) => void;\n /**\n * Người dùng bấm \"Thêm dòng\" (hoặc Shift+Enter). Trả về ô cần focus sau khi thêm\n * (`{ rowIndex, columnId }`), hoặc `null` để lưới không cuộn/focus.\n */\n onRowAdd?: (\n event?: React.MouseEvent<HTMLDivElement>\n ) => Partial<CellPosition> | Promise<Partial<CellPosition> | null> | null;\n /** Dán nhiều dòng hơn số dòng hiện có → thêm `count` dòng trong MỘT lần gọi API */\n onRowsAdd?: (count: number) => void | Promise<void>;\n /** Xoá dòng (menu chuột phải hoặc Ctrl+Backspace) — nhận cả bản ghi lẫn chỉ số dòng */\n onRowsDelete?: (rows: TData[], rowIndices: number[]) => void | Promise<void>;\n /** Chạy TRƯỚC khi áp dụng dữ liệu dán — dùng để gọi API bulk update nếu cần */\n onPaste?: (updates: Array<CellUpdate>) => void | Promise<void>;\n /**\n * Tải tệp lên cho ô `variant: \"file\"`. Không truyền thì tệp chỉ nằm trong bộ nhớ\n * trình duyệt (blob URL) và mất khi tải lại trang.\n */\n onFilesUpload?: (params: { files: File[]; rowIndex: number; columnId: string }) => Promise<FileCellData[]>;\n onFilesDelete?: (params: { fileIds: string[]; rowIndex: number; columnId: string }) => void | Promise<void>;\n /** Chiều cao dòng ban đầu (mặc định \"short\" = 36px) */\n rowHeight?: RowHeightValue;\n onRowHeightChange?: (rowHeight: RowHeightValue) => void;\n /** Số dòng render thêm ngoài vùng nhìn thấy (mặc định 6) */\n overscan?: number;\n dir?: Direction;\n /** Tự focus ô đầu tiên (hoặc ô chỉ định) khi có dữ liệu */\n autoFocus?: boolean | Partial<CellPosition>;\n /** Bấm chuột vào ô là chọn luôn ô đó (mặc định chỉ focus) */\n enableSingleCellSelection?: boolean;\n /** Bấm tiêu đề cột để chọn cả cột */\n enableColumnSelection?: boolean;\n /** Bật tìm trong bảng (Ctrl+F) */\n enableSearch?: boolean;\n /** Bật dán từ clipboard (Ctrl+V) */\n enablePaste?: boolean;\n /** Chỉ xem: khoá mọi thao tác sửa/xoá/dán */\n readOnly?: boolean;\n /**\n * Ngôn ngữ của lưới: `\"en\"` · `\"vi\"`, hoặc cả một bảng chuỗi tự soạn. Bỏ trống thì theo\n * `DataGridLocaleProvider`, rồi ngôn ngữ của `ComitorLocaleProvider`, rồi `\"en\"` — app đã đặt\n * `ComitorLocaleProvider` ở root thì không cần truyền.\n *\n * Giá trị này đi ra NGUYÊN VẸN theo kết quả của hook (kể cả khi bỏ trống), nên\n * `<DataGrid {...gridProps}>` tự nhận được và tự giải lại trong cây của nó. Hook cũng giải một\n * bản cho RIÊNG nó — cho toast (render ở `<Toaster />`, ngoài cây của lưới) và cho phép đọc ngày\n * khi dán — từ context của component ĐANG GỌI hook. ⚠ Vì vậy một `DataGridLocaleProvider` đặt\n * trong chính component đó (hoặc sâu hơn) không với tới toast: truyền `locale` ở đây, hoặc đưa\n * provider lên component cha. `ComitorLocaleProvider` ở root thì luôn với tới.\n *\n * ⚠ Thanh công cụ nằm ngoài `<DataGrid>` nên KHÔNG nhận được giá trị này: chúng theo provider\n * (`DataGridLocaleProvider` / `ComitorLocaleProvider`), hoặc nhận `locale` riêng từng menu.\n */\n locale?: DataGridLocale | DataGridMessages;\n}\n\nfunction useDataGrid<TData>({\n data,\n columns,\n rowHeight: rowHeightProp = DEFAULT_ROW_HEIGHT,\n overscan = OVERSCAN,\n dir: dirProp,\n initialState,\n locale,\n ...props\n}: UseDataGridProps<TData>) {\n // Ngôn ngữ đọc LÚC GỌI HOOK, theo cùng luật ưu tiên với cây của lưới: `locale` → provider\n // `DataGridLocaleProvider` bọc NGOÀI component đang gọi → `ComitorLocaleProvider` → `\"en\"`.\n // Hook cần bản của riêng nó vì toast render ở `<Toaster />`, ngoài cây của lưới.\n const { messages: msg, dateLocale } = useResolvedDataGridLocale(locale);\n // Thứ tự chữ cái của NGÔN NGỮ lưới cho cột chữ và cột `select` — xem `withLocaleSorting`.\n const collator = React.useMemo(() => {\n try {\n return new Intl.Collator(dateLocale.code, { numeric: true });\n } catch {\n return new Intl.Collator(undefined, { numeric: true });\n }\n }, [dateLocale]);\n const tableColumns = React.useMemo(\n () => columns.map((column) => withLocaleSorting(column, collator)),\n [columns, collator]\n );\n // Callback của hook ổn định theo thiết kế (chúng đọc `propsRef`), nên bảng chuỗi cũng đi qua\n // ref — đưa `msg` vào dependency sẽ dựng lại toàn bộ handler mỗi lần đổi ngôn ngữ.\n const msgRef = useAsRef(msg);\n const dateLocaleRef = useAsRef(dateLocale);\n const dir = useDirection(dirProp);\n const dataGridRef = React.useRef<HTMLDivElement>(null);\n /*\n * ⚠ Khác bản gốc (3.1.0): phần tử lưới cũng nằm trong STATE, qua `dataGridElementRef` mà\n * `<DataGrid>` gắn làm `ref`. Các effect gắn listener lên phần tử (keydown, paste, focusout) phụ\n * thuộc vào nó, nên khi `<DataGrid>` unmount rồi mount lại — app đổi lưới sang `EmptyState` lúc hết\n * dòng rồi quay về — chúng gắn lại lên phần tử MỚI. Bản gốc đọc `dataGridRef.current` một lần lúc\n * effect chạy: lưới mount lại thì listener vẫn bám nút cũ đã bị gỡ, và phím, dán, giữ focus đều\n * thôi chạy trên lưới mới.\n */\n const [dataGridElement, setDataGridElement] = React.useState<HTMLDivElement | null>(null);\n const dataGridElementRef = React.useCallback((node: HTMLDivElement | null) => {\n dataGridRef.current = node;\n setDataGridElement(node);\n }, []);\n const tableRef = React.useRef<ReturnType<typeof useReactTable<TData>>>(null);\n const rowVirtualizerRef = React.useRef<Virtualizer<HTMLDivElement, Element>>(null);\n const headerRef = React.useRef<HTMLDivElement>(null);\n const rowMapRef = React.useRef<Map<number, HTMLDivElement>>(new Map());\n const cellMapRef = React.useRef<Map<string, HTMLDivElement>>(new Map());\n const footerRef = React.useRef<HTMLDivElement>(null);\n const focusGuardRef = React.useRef(false);\n\n const propsRef = useAsRef({\n ...props,\n data,\n columns,\n initialState\n });\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n\n const stateRef = useLazyRef<DataGridState>(() => {\n return {\n sorting: initialState?.sorting ?? [],\n columnFilters: initialState?.columnFilters ?? [],\n rowHeight: rowHeightProp,\n rowSelection: initialState?.rowSelection ?? {},\n selectionState: {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false\n },\n focusedCell: null,\n editingCell: null,\n cutCells: new Set(),\n contextMenu: {\n open: false,\n x: 0,\n y: 0\n },\n searchQuery: \"\",\n searchMatches: [],\n matchIndex: -1,\n searchOpen: false,\n lastClickedRowId: null,\n pasteDialog: {\n open: false,\n rowsNeeded: 0,\n clipboardText: \"\"\n }\n };\n });\n\n const store = React.useMemo<DataGridStore>(() => {\n let isBatching = false;\n let pendingNotification = false;\n\n return {\n subscribe: (callback) => {\n listenersRef.current.add(callback);\n return () => listenersRef.current.delete(callback);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n\n if (isBatching) {\n pendingNotification = true;\n } else {\n if (!pendingNotification) {\n pendingNotification = true;\n queueMicrotask(() => {\n pendingNotification = false;\n store.notify();\n });\n }\n }\n },\n notify: () => {\n for (const listener of listenersRef.current) {\n listener();\n }\n },\n batch: (fn) => {\n if (isBatching) {\n fn();\n return;\n }\n\n isBatching = true;\n const wasPending = pendingNotification;\n pendingNotification = false;\n\n try {\n fn();\n } finally {\n isBatching = false;\n if (pendingNotification || wasPending) {\n pendingNotification = false;\n store.notify();\n }\n }\n }\n };\n }, [listenersRef, stateRef]);\n\n const focusedCell = useStore(store, (state) => state.focusedCell);\n const editingCell = useStore(store, (state) => state.editingCell);\n const selectionState = useStore(store, (state) => state.selectionState);\n const searchQuery = useStore(store, (state) => state.searchQuery);\n const searchMatches = useStore(store, (state) => state.searchMatches);\n const matchIndex = useStore(store, (state) => state.matchIndex);\n const searchOpen = useStore(store, (state) => state.searchOpen);\n const sorting = useStore(store, (state) => state.sorting);\n const columnFilters = useStore(store, (state) => state.columnFilters);\n const rowSelection = useStore(store, (state) => state.rowSelection);\n const rowHeight = useStore(store, (state) => state.rowHeight);\n const contextMenu = useStore(store, (state) => state.contextMenu);\n const pasteDialog = useStore(store, (state) => state.pasteDialog);\n\n const rowHeightValue = getRowHeightValue(rowHeight);\n\n // Ứng dụng có thể tự giữ state khi sắp xếp/lọc ở phía máy chủ (manualSorting,\n // manualFiltering, lưu trên URL…): truyền `state.sorting` / `state.columnFilters`\n // thì giá trị đó ghi đè state nội bộ của lưới.\n const controlledSorting = props.state?.sorting;\n const controlledColumnFilters = props.state?.columnFilters;\n\n useIsomorphicLayoutEffect(() => {\n if (!controlledSorting && !controlledColumnFilters) return;\n\n store.batch(() => {\n if (controlledSorting) store.setState(\"sorting\", controlledSorting);\n if (controlledColumnFilters) {\n store.setState(\"columnFilters\", controlledColumnFilters);\n }\n });\n }, [store, controlledSorting, controlledColumnFilters]);\n\n const prevCellSelectionMapRef = useLazyRef(() => new Map<number, Set<string>>());\n\n // Memoize per-row selection sets to prevent unnecessary row re-renders\n // Each row gets a stable Set reference that only changes when its cells' selection changes\n const cellSelectionMap = React.useMemo(() => {\n const selectedCells = selectionState.selectedCells;\n\n if (selectedCells.size === 0) {\n prevCellSelectionMapRef.current.clear();\n return null;\n }\n\n const newRowCells = new Map<number, Set<string>>();\n for (const cellKey of selectedCells) {\n const { rowIndex } = parseCellKey(cellKey);\n let rowSet = newRowCells.get(rowIndex);\n if (!rowSet) {\n rowSet = new Set<string>();\n newRowCells.set(rowIndex, rowSet);\n }\n rowSet.add(cellKey);\n }\n\n const stableMap = new Map<number, Set<string>>();\n for (const [rowIndex, newSet] of newRowCells) {\n const prevSet = prevCellSelectionMapRef.current.get(rowIndex);\n if (prevSet && prevSet.size === newSet.size && [...newSet].every((key) => prevSet.has(key))) {\n stableMap.set(rowIndex, prevSet);\n } else {\n stableMap.set(rowIndex, newSet);\n }\n }\n\n prevCellSelectionMapRef.current = stableMap;\n return stableMap;\n }, [selectionState.selectedCells, prevCellSelectionMapRef]);\n\n const visualRowIndexCacheRef = React.useRef<{\n rows: Row<TData>[] | null;\n map: Map<string, number>;\n } | null>(null);\n\n // Pre-compute visual row index map for O(1) lookups (used by select column)\n // Cache is invalidated when row model identity changes (sorting/filtering)\n const getVisualRowIndex = React.useCallback((rowId: string): number | undefined => {\n const rows = tableRef.current?.getRowModel().rows;\n if (!rows) return undefined;\n\n if (visualRowIndexCacheRef.current?.rows !== rows) {\n const map = new Map<string, number>();\n for (const [i, row] of rows.entries()) {\n map.set(row.id, i + 1);\n }\n visualRowIndexCacheRef.current = { rows, map };\n }\n\n return visualRowIndexCacheRef.current.map.get(rowId);\n }, []);\n\n const columnIds = React.useMemo(() => {\n return columns\n .map((c) => {\n if (c.id) return c.id;\n if (\"accessorKey\" in c) return c.accessorKey as string;\n return undefined;\n })\n .filter((id): id is string => Boolean(id));\n }, [columns]);\n\n const navigableColumnIds = React.useMemo(() => {\n return columnIds.filter((c) => !NON_NAVIGABLE_COLUMN_IDS.has(c));\n }, [columnIds]);\n\n const onDataUpdate = React.useCallback(\n (updates: CellUpdate | Array<CellUpdate>) => {\n if (propsRef.current.readOnly) return;\n\n /*\n * `meta.readOnly` (3.1.0): mọi đường GHI đều đi qua đây — gõ, dán, xoá nội dung, cắt, ô\n * checkbox, tệp — nên lọc một lần ở đây là đủ chặn cả vùng chọn trải qua cột bị khoá.\n */\n const updateArray = (Array.isArray(updates) ? updates : [updates]).filter(\n (update) => !getIsColumnReadOnly(tableRef.current, update.columnId)\n );\n\n if (updateArray.length === 0) return;\n\n const currentTable = tableRef.current;\n const currentData = propsRef.current.data;\n const rows = currentTable?.getRowModel().rows;\n\n const rowUpdatesMap = new Map<number, Array<Omit<CellUpdate, \"rowIndex\">>>();\n\n for (const update of updateArray) {\n if (!rows || !currentTable) {\n const existingUpdates = rowUpdatesMap.get(update.rowIndex) ?? [];\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value\n });\n rowUpdatesMap.set(update.rowIndex, existingUpdates);\n } else {\n const row = rows[update.rowIndex];\n if (!row) continue;\n\n const originalData = row.original;\n const originalRowIndex = currentData.indexOf(originalData);\n\n const targetIndex = originalRowIndex !== -1 ? originalRowIndex : update.rowIndex;\n\n const existingUpdates = rowUpdatesMap.get(targetIndex) ?? [];\n existingUpdates.push({\n columnId: update.columnId,\n value: update.value\n });\n rowUpdatesMap.set(targetIndex, existingUpdates);\n }\n }\n\n const maxUpdateIndex = rowUpdatesMap.size > 0 ? Math.max(...Array.from(rowUpdatesMap.keys())) : -1;\n const dataLength = Math.max(currentData.length, maxUpdateIndex + 1);\n\n const newData: TData[] = new Array(dataLength);\n\n for (let i = 0; i < dataLength; i++) {\n const updates = rowUpdatesMap.get(i);\n // Fall back to the table's row data for rows not yet in currentData\n const existingRow = currentData[i] ?? rows?.[i]?.original;\n\n if (existingRow == null) continue;\n\n if (updates) {\n const updatedRow = { ...existingRow } as Record<string, unknown>;\n for (const { columnId, value } of updates) {\n updatedRow[columnId] = value;\n }\n newData[i] = updatedRow as TData;\n } else {\n newData[i] = existingRow;\n }\n }\n\n propsRef.current.onDataChange?.(newData);\n },\n [propsRef]\n );\n\n const getIsCellSelected = React.useCallback(\n (rowIndex: number, columnId: string) => {\n const currentSelectionState = store.getState().selectionState;\n return currentSelectionState.selectedCells.has(getCellKey(rowIndex, columnId));\n },\n [store]\n );\n\n const onSelectionClear = React.useCallback(() => {\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false\n });\n store.setState(\"rowSelection\", {});\n });\n }, [store]);\n\n const selectAll = React.useCallback(() => {\n const allCells = new Set<string>();\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n for (const columnId of columnIds) {\n allCells.add(getCellKey(rowIndex, columnId));\n }\n }\n\n const firstColumnId = columnIds[0];\n const lastColumnId = columnIds[columnIds.length - 1];\n\n store.setState(\"selectionState\", {\n selectedCells: allCells,\n selectionRange:\n columnIds.length > 0 && rowCount > 0 && firstColumnId && lastColumnId\n ? {\n start: { rowIndex: 0, columnId: firstColumnId },\n end: { rowIndex: rowCount - 1, columnId: lastColumnId }\n }\n : null,\n isSelecting: false\n });\n }, [columnIds, propsRef, store]);\n\n const selectColumn = React.useCallback(\n (columnId: string) => {\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n if (rowCount === 0) return;\n\n const selectedCells = new Set<string>();\n\n for (let rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n selectedCells.add(getCellKey(rowIndex, columnId));\n }\n\n store.setState(\"selectionState\", {\n selectedCells,\n selectionRange: {\n start: { rowIndex: 0, columnId },\n end: { rowIndex: rowCount - 1, columnId }\n },\n isSelecting: false\n });\n },\n [propsRef, store]\n );\n\n const selectRange = React.useCallback(\n (start: CellPosition, end: CellPosition, isSelecting = false) => {\n const startColIndex = columnIds.indexOf(start.columnId);\n const endColIndex = columnIds.indexOf(end.columnId);\n\n const minRow = Math.min(start.rowIndex, end.rowIndex);\n const maxRow = Math.max(start.rowIndex, end.rowIndex);\n const minCol = Math.min(startColIndex, endColIndex);\n const maxCol = Math.max(startColIndex, endColIndex);\n\n const selectedCells = new Set<string>();\n\n for (let rowIndex = minRow; rowIndex <= maxRow; rowIndex++) {\n for (let colIndex = minCol; colIndex <= maxCol; colIndex++) {\n const columnId = columnIds[colIndex];\n if (columnId) {\n selectedCells.add(getCellKey(rowIndex, columnId));\n }\n }\n }\n\n store.setState(\"selectionState\", {\n selectedCells,\n selectionRange: { start, end },\n isSelecting\n });\n },\n [columnIds, store]\n );\n\n const dragDepsRef = useAsRef({\n selectRange,\n dir,\n rowHeightValue,\n columnIds\n });\n\n const serializeCellsToTsv = React.useCallback(() => {\n const currentState = store.getState();\n\n let selectedCellsArray: string[];\n if (!currentState.selectionState.selectedCells.size) {\n if (!currentState.focusedCell) return null;\n const focusedCellKey = getCellKey(currentState.focusedCell.rowIndex, currentState.focusedCell.columnId);\n selectedCellsArray = [focusedCellKey];\n } else {\n selectedCellsArray = Array.from(currentState.selectionState.selectedCells);\n }\n\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows;\n if (!rows) return null;\n\n const selectedColumnIds: string[] = [];\n const seenColumnIds = new Set<string>();\n const cellData = new Map<string, string>();\n const rowIndices = new Set<number>();\n const rowCellMaps = new Map<number, Map<string, ReturnType<Row<TData>[\"getVisibleCells\"]>[number]>>();\n const navigableCells: string[] = [];\n\n for (const cellKey of selectedCellsArray) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n\n if (columnId && NON_NAVIGABLE_COLUMN_IDS.has(columnId)) {\n continue;\n }\n\n navigableCells.push(cellKey);\n\n if (columnId && !seenColumnIds.has(columnId)) {\n seenColumnIds.add(columnId);\n selectedColumnIds.push(columnId);\n }\n\n rowIndices.add(rowIndex);\n\n const row = rows[rowIndex];\n if (row) {\n let cellMap = rowCellMaps.get(rowIndex);\n if (!cellMap) {\n cellMap = new Map(row.getVisibleCells().map((c) => [c.column.id, c]));\n rowCellMaps.set(rowIndex, cellMap);\n }\n const cell = cellMap.get(columnId);\n if (cell) {\n const value = cell.getValue();\n const cellVariant = cell.column.columnDef?.meta?.cell?.variant;\n\n let serializedValue = \"\";\n if (cellVariant === \"file\" || cellVariant === \"multi-select\") {\n serializedValue = value ? JSON.stringify(value) : \"\";\n } else if (value instanceof Date) {\n serializedValue = value.toISOString();\n } else {\n serializedValue = String(value ?? \"\");\n }\n\n cellData.set(cellKey, serializedValue);\n }\n }\n }\n\n const colIndices = new Set<number>();\n for (const cellKey of navigableCells) {\n const { columnId } = parseCellKey(cellKey);\n const colIndex = selectedColumnIds.indexOf(columnId);\n if (colIndex >= 0) {\n colIndices.add(colIndex);\n }\n }\n\n const sortedRowIndices = Array.from(rowIndices).sort((a, b) => a - b);\n const sortedColIndices = Array.from(colIndices).sort((a, b) => a - b);\n const sortedColumnIds = sortedColIndices.map((i) => selectedColumnIds[i]);\n\n const tsvData = sortedRowIndices\n .map((rowIndex) =>\n sortedColumnIds\n .map((columnId) => {\n const cellKey = `${rowIndex}:${columnId}`;\n return cellData.get(cellKey) ?? \"\";\n })\n .join(\"\\t\")\n )\n .join(\"\\n\");\n\n return { tsvData, selectedCellsArray: navigableCells };\n }, [store]);\n\n const onCellsCopy = React.useCallback(async () => {\n const result = serializeCellsToTsv();\n if (!result) return;\n\n const { tsvData, selectedCellsArray } = result;\n\n try {\n await writeClipboardText(tsvData);\n\n const currentState = store.getState();\n if (currentState.cutCells.size > 0) {\n store.setState(\"cutCells\", new Set());\n }\n\n toastSuccess(msgRef.current.toast.cellsCopied(selectedCellsArray.length));\n } catch {\n toastError(msgRef.current.toast.copyFailed);\n }\n }, [store, serializeCellsToTsv, msgRef]);\n\n const onCellsCut = React.useCallback(async () => {\n if (propsRef.current.readOnly) return;\n\n const result = serializeCellsToTsv();\n if (!result) return;\n\n const { tsvData, selectedCellsArray } = result;\n\n try {\n await writeClipboardText(tsvData);\n\n store.setState(\"cutCells\", new Set(selectedCellsArray));\n\n toastSuccess(msgRef.current.toast.cellsCut(selectedCellsArray.length));\n } catch {\n toastError(msgRef.current.toast.cutFailed);\n }\n }, [store, propsRef, serializeCellsToTsv, msgRef]);\n\n const restoreFocus = React.useCallback((element: HTMLDivElement | null) => {\n if (element && document.activeElement !== element) {\n requestAnimationFrame(() => {\n element.focus();\n });\n }\n }, []);\n\n const onCellsPaste = React.useCallback(\n async (expandRows = false, clipboardTextArg?: string) => {\n if (propsRef.current.readOnly) return;\n\n const currentState = store.getState();\n if (!currentState.focusedCell) return;\n\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows;\n if (!rows) return;\n\n try {\n // Ưu tiên nội dung lấy từ sự kiện `paste` (chạy được cả ở http nội bộ),\n // sau đó tới nội dung đã giữ lại khi mở hộp thoại \"thêm dòng\",\n // cuối cùng mới đọc clipboard qua API (chỉ có ở secure context).\n let clipboardText = clipboardTextArg ?? currentState.pasteDialog.clipboardText;\n\n if (!clipboardText) {\n clipboardText = (await readClipboardText()) ?? \"\";\n }\n\n if (!clipboardText) return;\n\n const rawPastedData = parseTsv(clipboardText, navigableColumnIds.length);\n\n // Fill entire selection when clipboard has a single value and multiple cells are selected\n const selectionCells = currentState.selectionState.selectedCells;\n const isSingleCellClipboard = rawPastedData.length === 1 && (rawPastedData[0]?.length ?? 0) === 1;\n\n let pastedData = rawPastedData;\n let startRowIndex = currentState.focusedCell.rowIndex;\n let startColIndex = navigableColumnIds.indexOf(currentState.focusedCell.columnId);\n\n if (isSingleCellClipboard && selectionCells.size > 1) {\n const singleValue = rawPastedData[0]?.[0] ?? \"\";\n let minRow = Infinity;\n let maxRow = -Infinity;\n let minColIdx = Infinity;\n let maxColIdx = -Infinity;\n\n for (const cellKey of selectionCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n const colIdx = navigableColumnIds.indexOf(columnId);\n if (colIdx === -1) continue;\n minRow = Math.min(minRow, rowIndex);\n maxRow = Math.max(maxRow, rowIndex);\n minColIdx = Math.min(minColIdx, colIdx);\n maxColIdx = Math.max(maxColIdx, colIdx);\n }\n\n if (minRow !== Infinity) {\n startRowIndex = minRow;\n startColIndex = minColIdx;\n const numRows = maxRow - minRow + 1;\n const numCols = maxColIdx - minColIdx + 1;\n pastedData = Array.from({ length: numRows }, () => Array.from({ length: numCols }, () => singleValue));\n }\n }\n\n if (startColIndex === -1) return;\n\n const rowCount = rows.length ?? propsRef.current.data.length;\n const rowsNeeded = startRowIndex + pastedData.length - rowCount;\n\n if (rowsNeeded > 0 && !expandRows && propsRef.current.onRowAdd && !currentState.pasteDialog.clipboardText) {\n store.setState(\"pasteDialog\", {\n open: true,\n rowsNeeded,\n clipboardText\n });\n return;\n }\n\n if (expandRows && rowsNeeded > 0) {\n const expectedRowCount = rowCount + rowsNeeded;\n\n if (propsRef.current.onRowsAdd) {\n await propsRef.current.onRowsAdd(rowsNeeded);\n } else if (propsRef.current.onRowAdd) {\n for (let i = 0; i < rowsNeeded; i++) {\n await propsRef.current.onRowAdd();\n }\n }\n\n let attempts = 0;\n const maxAttempts = 50;\n let currentTableRowCount = tableRef.current?.getRowModel().rows.length ?? 0;\n\n while (currentTableRowCount < expectedRowCount && attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n currentTableRowCount = tableRef.current?.getRowModel().rows.length ?? 0;\n attempts++;\n }\n }\n\n const updates: Array<CellUpdate> = [];\n const tableColumns = currentTable?.getAllColumns() ?? [];\n let cellsUpdated = 0;\n let endRowIndex = startRowIndex;\n let endColIndex = startColIndex;\n\n const updatedTable = tableRef.current;\n const updatedRows = updatedTable?.getRowModel().rows;\n const currentRowCount = updatedRows?.length ?? 0;\n\n let cellsSkipped = 0;\n\n const columnMap = new Map(tableColumns.map((c) => [c.id, c]));\n\n for (let pasteRowIdx = 0; pasteRowIdx < pastedData.length; pasteRowIdx++) {\n const pasteRow = pastedData[pasteRowIdx];\n if (!pasteRow) continue;\n\n const targetRowIndex = startRowIndex + pasteRowIdx;\n if (targetRowIndex >= currentRowCount) break;\n\n for (let pasteColIdx = 0; pasteColIdx < pasteRow.length; pasteColIdx++) {\n const targetColIndex = startColIndex + pasteColIdx;\n if (targetColIndex >= navigableColumnIds.length) break;\n\n const targetColumnId = navigableColumnIds[targetColIndex];\n if (!targetColumnId) continue;\n\n const pastedValue = pasteRow[pasteColIdx] ?? \"\";\n const column = columnMap.get(targetColumnId);\n const cellOpts = column?.columnDef?.meta?.cell;\n const cellVariant = cellOpts?.variant;\n\n let processedValue: unknown = pastedValue;\n let shouldSkip = false;\n\n switch (cellVariant) {\n case \"number\": {\n if (!pastedValue) {\n processedValue = null;\n } else {\n const num = Number.parseFloat(pastedValue);\n if (Number.isNaN(num)) shouldSkip = true;\n else processedValue = num;\n }\n break;\n }\n\n case \"checkbox\": {\n if (!pastedValue) {\n processedValue = false;\n } else {\n const lower = pastedValue.toLowerCase();\n if (VALID_BOOLEANS.has(lower)) {\n processedValue = TRUTHY_BOOLEANS.has(lower);\n } else {\n shouldSkip = true;\n }\n }\n break;\n }\n\n case \"date\": {\n if (!pastedValue) {\n processedValue = null;\n } else {\n // Đọc theo dạng ngày của ngôn ngữ lưới trước (đúng dạng đang hiển thị), rồi ISO.\n const date = parseDateInput(pastedValue, dateLocaleRef.current);\n if (!date) shouldSkip = true;\n else processedValue = date;\n }\n break;\n }\n\n case \"select\": {\n const options = cellOpts?.options ?? [];\n if (!pastedValue) {\n processedValue = null;\n } else {\n const matched = matchSelectOption(pastedValue, options);\n if (matched) processedValue = matched;\n else shouldSkip = true;\n }\n break;\n }\n\n case \"multi-select\": {\n const options = cellOpts?.options ?? [];\n let values: string[] = [];\n try {\n const parsed = JSON.parse(pastedValue);\n if (Array.isArray(parsed)) {\n values = parsed.filter((v): v is string => typeof v === \"string\");\n }\n } catch {\n values = pastedValue ? pastedValue.split(\",\").map((v) => v.trim()) : [];\n }\n\n const validated = values.map((v) => matchSelectOption(v, options)).filter(Boolean) as string[];\n\n if (values.length > 0 && validated.length === 0) {\n shouldSkip = true;\n } else {\n processedValue = validated;\n }\n break;\n }\n\n case \"file\": {\n if (!pastedValue) {\n processedValue = [];\n } else {\n try {\n const parsed = JSON.parse(pastedValue);\n if (!Array.isArray(parsed)) {\n shouldSkip = true;\n } else {\n const validFiles = parsed.filter(getIsFileCellData);\n if (parsed.length > 0 && validFiles.length === 0) {\n shouldSkip = true;\n } else {\n processedValue = validFiles;\n }\n }\n } catch {\n shouldSkip = true;\n }\n }\n break;\n }\n\n case \"url\": {\n if (!pastedValue) {\n processedValue = \"\";\n } else {\n const firstChar = pastedValue[0];\n if (firstChar === \"[\" || firstChar === \"{\") {\n shouldSkip = true;\n } else {\n try {\n new URL(pastedValue);\n processedValue = pastedValue;\n } catch {\n if (DOMAIN_REGEX.test(pastedValue)) {\n processedValue = pastedValue;\n } else {\n shouldSkip = true;\n }\n }\n }\n }\n break;\n }\n\n default: {\n if (!pastedValue) {\n processedValue = \"\";\n break;\n }\n\n if (ISO_DATE_REGEX.test(pastedValue)) {\n const date = new Date(pastedValue);\n if (!Number.isNaN(date.getTime())) {\n processedValue = formatDate(date, dateLocaleRef.current);\n break;\n }\n }\n\n const firstChar = pastedValue[0];\n if (firstChar === \"[\" || firstChar === \"{\" || firstChar === \"t\" || firstChar === \"f\") {\n try {\n const parsed = JSON.parse(pastedValue);\n\n if (Array.isArray(parsed)) {\n if (parsed.length > 0 && parsed.every(getIsFileCellData)) {\n processedValue = parsed.map((f) => f.name).join(\", \");\n } else if (parsed.every((v) => typeof v === \"string\")) {\n processedValue = (parsed as string[]).join(\", \");\n }\n } else if (typeof parsed === \"boolean\") {\n processedValue = parsed\n ? msgRef.current.booleanText.checked\n : msgRef.current.booleanText.unchecked;\n }\n } catch {\n const lower = pastedValue.toLowerCase();\n if (lower === \"true\" || lower === \"false\") {\n processedValue =\n lower === \"true\" ? msgRef.current.booleanText.checked : msgRef.current.booleanText.unchecked;\n }\n }\n }\n }\n }\n\n if (shouldSkip) {\n cellsSkipped++;\n endRowIndex = Math.max(endRowIndex, targetRowIndex);\n endColIndex = Math.max(endColIndex, targetColIndex);\n continue;\n }\n\n updates.push({\n rowIndex: targetRowIndex,\n columnId: targetColumnId,\n value: processedValue\n });\n cellsUpdated++;\n\n endRowIndex = Math.max(endRowIndex, targetRowIndex);\n endColIndex = Math.max(endColIndex, targetColIndex);\n }\n }\n\n if (updates.length > 0) {\n if (propsRef.current.onPaste) {\n await propsRef.current.onPaste(updates);\n }\n\n const allUpdates = [...updates];\n\n if (currentState.cutCells.size > 0) {\n const columnById = new Map(tableColumns.map((c) => [c.id, c]));\n\n for (const cellKey of currentState.cutCells) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n const column = columnById.get(columnId);\n const cellVariant = column?.columnDef?.meta?.cell?.variant;\n const emptyValue = getEmptyCellValue(cellVariant);\n allUpdates.push({ rowIndex, columnId, value: emptyValue });\n }\n\n store.setState(\"cutCells\", new Set());\n }\n\n onDataUpdate(allUpdates);\n\n if (cellsSkipped > 0) {\n toastSuccess(msgRef.current.toast.cellsPastedWithSkipped(cellsUpdated, cellsSkipped));\n } else {\n toastSuccess(msgRef.current.toast.cellsPasted(cellsUpdated));\n }\n\n const endColumnId = navigableColumnIds[endColIndex];\n if (endColumnId) {\n selectRange(\n {\n rowIndex: startRowIndex,\n columnId: currentState.focusedCell.columnId\n },\n { rowIndex: endRowIndex, columnId: endColumnId }\n );\n }\n\n restoreFocus(dataGridRef.current);\n } else if (cellsSkipped > 0) {\n toastError(msgRef.current.toast.pasteSkipped(cellsSkipped));\n }\n\n if (currentState.pasteDialog.open) {\n store.setState(\"pasteDialog\", {\n open: false,\n rowsNeeded: 0,\n clipboardText: \"\"\n });\n }\n } catch {\n toastError(msgRef.current.toast.pasteFailed);\n }\n },\n [store, navigableColumnIds, propsRef, onDataUpdate, selectRange, restoreFocus, msgRef, dateLocaleRef]\n );\n\n // Release focus guard after delay to allow async data re-renders to settle.\n // 300ms accounts for db sync and virtualized cell mounting\n const releaseFocusGuard = React.useCallback((immediate = false) => {\n if (immediate) {\n focusGuardRef.current = false;\n return;\n }\n\n setTimeout(() => {\n focusGuardRef.current = false;\n }, 300);\n }, []);\n\n const focusCellWrapper = React.useCallback(\n (rowIndex: number, columnId: string) => {\n focusGuardRef.current = true;\n\n requestAnimationFrame(() => {\n const cellKey = getCellKey(rowIndex, columnId);\n const cellWrapperElement = cellMapRef.current.get(cellKey);\n\n if (!cellWrapperElement) {\n const container = dataGridRef.current;\n if (container) {\n container.focus();\n }\n releaseFocusGuard();\n return;\n }\n\n cellWrapperElement.focus();\n releaseFocusGuard();\n });\n },\n [releaseFocusGuard]\n );\n\n const focusCell = React.useCallback(\n (rowIndex: number, columnId: string) => {\n store.batch(() => {\n store.setState(\"focusedCell\", { rowIndex, columnId });\n store.setState(\"editingCell\", null);\n });\n\n const currentState = store.getState();\n\n if (currentState.searchOpen) return;\n\n focusCellWrapper(rowIndex, columnId);\n },\n [store, focusCellWrapper]\n );\n\n const onRowsDelete = React.useCallback(\n async (rowIndices: number[]) => {\n if (propsRef.current.readOnly || !propsRef.current.onRowsDelete || rowIndices.length === 0) return;\n\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows;\n\n if (!rows || rows.length === 0) return;\n\n const currentState = store.getState();\n const currentFocusedColumn = currentState.focusedCell?.columnId ?? navigableColumnIds[0];\n\n const minDeletedRowIndex = Math.min(...rowIndices);\n\n const rowsToDelete: TData[] = [];\n for (const rowIndex of rowIndices) {\n const row = rows[rowIndex];\n if (row) {\n rowsToDelete.push(row.original);\n }\n }\n\n await propsRef.current.onRowsDelete(rowsToDelete, rowIndices);\n\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: new Set(),\n selectionRange: null,\n isSelecting: false\n });\n store.setState(\"rowSelection\", {});\n store.setState(\"editingCell\", null);\n });\n\n requestAnimationFrame(() => {\n const currentTable = tableRef.current;\n const currentRows = currentTable?.getRowModel().rows ?? [];\n const newRowCount = currentRows.length ?? propsRef.current.data.length;\n\n if (newRowCount > 0 && currentFocusedColumn) {\n const targetRowIndex = Math.min(minDeletedRowIndex, newRowCount - 1);\n focusCell(targetRowIndex, currentFocusedColumn);\n }\n });\n },\n [propsRef, store, navigableColumnIds, focusCell]\n );\n\n const navigateCell = React.useCallback(\n (direction: NavigationDirection) => {\n const currentState = store.getState();\n if (!currentState.focusedCell) return;\n\n const { rowIndex, columnId } = currentState.focusedCell;\n const currentColIndex = navigableColumnIds.indexOf(columnId);\n const rowVirtualizer = rowVirtualizerRef.current;\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n let newRowIndex = rowIndex;\n let newColumnId = columnId;\n\n const isRtl = dir === \"rtl\";\n\n switch (direction) {\n case \"up\":\n newRowIndex = Math.max(0, rowIndex - 1);\n break;\n case \"down\":\n newRowIndex = Math.min(rowCount - 1, rowIndex + 1);\n break;\n case \"left\":\n if (isRtl) {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n } else {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n }\n break;\n case \"right\":\n if (isRtl) {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n } else {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n }\n break;\n case \"home\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[0] ?? columnId;\n }\n break;\n case \"end\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[navigableColumnIds.length - 1] ?? columnId;\n }\n break;\n case \"ctrl+home\":\n newRowIndex = 0;\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[0] ?? columnId;\n }\n break;\n case \"ctrl+end\":\n newRowIndex = Math.max(0, rowCount - 1);\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[navigableColumnIds.length - 1] ?? columnId;\n }\n break;\n case \"ctrl+up\":\n newRowIndex = 0;\n break;\n case \"ctrl+down\":\n newRowIndex = Math.max(0, rowCount - 1);\n break;\n case \"pageup\":\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems();\n const pageSize = visibleRange.length ?? 10;\n newRowIndex = Math.max(0, rowIndex - pageSize);\n } else {\n newRowIndex = Math.max(0, rowIndex - 10);\n }\n break;\n case \"pagedown\":\n if (rowVirtualizer) {\n const visibleRange = rowVirtualizer.getVirtualItems();\n const pageSize = visibleRange.length ?? 10;\n newRowIndex = Math.min(rowCount - 1, rowIndex + pageSize);\n } else {\n newRowIndex = Math.min(rowCount - 1, rowIndex + 10);\n }\n break;\n case \"pageleft\":\n if (currentColIndex > 0) {\n const targetIndex = Math.max(0, currentColIndex - HORIZONTAL_PAGE_SIZE);\n const targetColumnId = navigableColumnIds[targetIndex];\n if (targetColumnId) newColumnId = targetColumnId;\n }\n break;\n case \"pageright\":\n if (currentColIndex < navigableColumnIds.length - 1) {\n const targetIndex = Math.min(navigableColumnIds.length - 1, currentColIndex + HORIZONTAL_PAGE_SIZE);\n const targetColumnId = navigableColumnIds[targetIndex];\n if (targetColumnId) newColumnId = targetColumnId;\n }\n break;\n }\n\n if (newRowIndex !== rowIndex || newColumnId !== columnId) {\n focusCell(newRowIndex, newColumnId);\n\n // Calculate and apply scrolls synchronously to avoid flashing\n const container = dataGridRef.current;\n if (!container) return;\n\n const targetRow = rowMapRef.current.get(newRowIndex);\n const cellKey = getCellKey(newRowIndex, newColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n\n // If target row is not rendered, scroll it into view first\n if (!targetRow) {\n if (rowVirtualizer) {\n const align =\n direction === \"up\" || direction === \"pageup\" || direction === \"ctrl+up\" || direction === \"ctrl+home\"\n ? \"start\"\n : direction === \"down\" ||\n direction === \"pagedown\" ||\n direction === \"ctrl+down\" ||\n direction === \"ctrl+end\"\n ? \"end\"\n : \"center\";\n\n rowVirtualizer.scrollToIndex(newRowIndex, { align });\n\n // Wait for row to render before horizontal scroll\n if (newColumnId !== columnId) {\n requestAnimationFrame(() => {\n const cellKeyRetry = getCellKey(newRowIndex, newColumnId);\n const targetCellRetry = cellMapRef.current.get(cellKeyRetry);\n\n if (targetCellRetry) {\n const scrollDirection = getScrollDirection(direction);\n\n scrollCellIntoView({\n container,\n targetCell: targetCellRetry,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: scrollDirection,\n isRtl: dir === \"rtl\"\n });\n }\n });\n }\n } else {\n // Use direct scroll calculation when virtualizer is not available\n const rowHeightValue = getRowHeightValue(rowHeight);\n const estimatedScrollTop = newRowIndex * rowHeightValue;\n container.scrollTop = estimatedScrollTop;\n }\n\n return;\n }\n\n // Vertical scrolling for rendered rows that changed\n if (newRowIndex !== rowIndex && targetRow) {\n requestAnimationFrame(() => {\n const containerRect = container.getBoundingClientRect();\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0;\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0;\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET;\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom;\n\n if (!isFullyVisible) {\n // Only apply vertical scroll for vertical navigation\n const isVerticalNavigation =\n direction === \"up\" ||\n direction === \"down\" ||\n direction === \"pageup\" ||\n direction === \"pagedown\" ||\n direction === \"ctrl+up\" ||\n direction === \"ctrl+down\" ||\n direction === \"ctrl+home\" ||\n direction === \"ctrl+end\";\n\n if (isVerticalNavigation) {\n if (\n direction === \"down\" ||\n direction === \"pagedown\" ||\n direction === \"ctrl+down\" ||\n direction === \"ctrl+end\"\n ) {\n container.scrollTop += rowRect.bottom - viewportBottom;\n } else {\n container.scrollTop -= viewportTop - rowRect.top;\n }\n }\n }\n });\n }\n\n // Horizontal scrolling for rendered cells\n if (newColumnId !== columnId && targetCell) {\n requestAnimationFrame(() => {\n const scrollDirection = getScrollDirection(direction);\n\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: scrollDirection,\n isRtl: dir === \"rtl\"\n });\n });\n }\n }\n },\n [dir, store, navigableColumnIds, focusCell, propsRef, rowHeight]\n );\n\n const onCellEditingStart = React.useCallback(\n (rowIndex: number, columnId: string) => {\n if (propsRef.current.readOnly || getIsColumnReadOnly(tableRef.current, columnId)) return;\n\n store.batch(() => {\n store.setState(\"focusedCell\", { rowIndex, columnId });\n store.setState(\"editingCell\", { rowIndex, columnId });\n });\n },\n [store, propsRef]\n );\n\n const onCellEditingStop = React.useCallback(\n (opts?: { moveToNextRow?: boolean; direction?: NavigationDirection }) => {\n const currentState = store.getState();\n const currentEditing = currentState.editingCell;\n\n store.setState(\"editingCell\", null);\n\n if (opts?.moveToNextRow && currentEditing) {\n const { rowIndex, columnId } = currentEditing;\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n const rowCount = rows.length ?? propsRef.current.data.length;\n\n const nextRowIndex = rowIndex + 1;\n if (nextRowIndex < rowCount) {\n requestAnimationFrame(() => {\n focusCell(nextRowIndex, columnId);\n });\n }\n } else if (opts?.direction && currentEditing) {\n const { rowIndex, columnId } = currentEditing;\n focusCell(rowIndex, columnId);\n requestAnimationFrame(() => {\n navigateCell(opts.direction ?? \"right\");\n });\n } else if (currentEditing) {\n const { rowIndex, columnId } = currentEditing;\n focusCellWrapper(rowIndex, columnId);\n }\n },\n [store, propsRef, focusCell, navigateCell, focusCellWrapper]\n );\n\n const onSearchOpenChange = React.useCallback(\n (open: boolean) => {\n if (open) {\n store.setState(\"searchOpen\", true);\n return;\n }\n\n const currentState = store.getState();\n const currentMatch = currentState.matchIndex >= 0 && currentState.searchMatches[currentState.matchIndex];\n\n store.batch(() => {\n store.setState(\"searchOpen\", false);\n store.setState(\"searchQuery\", \"\");\n store.setState(\"searchMatches\", []);\n store.setState(\"matchIndex\", -1);\n\n if (currentMatch) {\n store.setState(\"focusedCell\", {\n rowIndex: currentMatch.rowIndex,\n columnId: currentMatch.columnId\n });\n }\n });\n\n if (dataGridRef.current && document.activeElement !== dataGridRef.current) {\n dataGridRef.current.focus();\n }\n },\n [store]\n );\n\n const onSearch = React.useCallback(\n (query: string) => {\n if (!query.trim()) {\n store.batch(() => {\n store.setState(\"searchMatches\", []);\n store.setState(\"matchIndex\", -1);\n });\n return;\n }\n\n const matches: CellPosition[] = [];\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n\n /*\n * ⚠ Khác bản gốc (3.1.0): tìm theo chữ HIỂN THỊ (nhãn của `select` / `multi-select`, không phải\n * mã) và không dấu (`normalizeVi`, cùng luật với bộ lọc và với `Combobox`). Bản gốc so giá trị\n * thô bằng `toLowerCase()`: \"in progress\" không thấy ô trạng thái, \"nguyen\" không thấy \"Nguyễn\".\n */\n const normalizedQuery = normalizeVi(query);\n\n for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {\n const row = rows[rowIndex];\n if (!row) continue;\n\n const cellById = new Map(row.getVisibleCells().map((c) => [c.column.id, c]));\n\n for (const columnId of columnIds) {\n const cell = cellById.get(columnId);\n if (!cell) continue;\n\n const text = getCellDisplayText(cell.getValue(), cell.column.columnDef.meta?.cell);\n\n if (normalizeVi(text).includes(normalizedQuery)) {\n matches.push({ rowIndex, columnId });\n }\n }\n }\n\n store.batch(() => {\n store.setState(\"searchMatches\", matches);\n store.setState(\"matchIndex\", matches.length > 0 ? 0 : -1);\n });\n\n if (matches.length > 0 && matches[0]) {\n const firstMatch = matches[0];\n rowVirtualizerRef.current?.scrollToIndex(firstMatch.rowIndex, {\n align: \"center\"\n });\n }\n },\n [columnIds, store]\n );\n\n const onSearchQueryChange = React.useCallback((query: string) => store.setState(\"searchQuery\", query), [store]);\n\n const onNavigateToPrevMatch = React.useCallback(() => {\n const currentState = store.getState();\n if (currentState.searchMatches.length === 0) return;\n\n const prevIndex =\n currentState.matchIndex - 1 < 0 ? currentState.searchMatches.length - 1 : currentState.matchIndex - 1;\n const match = currentState.searchMatches[prevIndex];\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: \"center\"\n });\n\n requestAnimationFrame(() => {\n store.setState(\"matchIndex\", prevIndex);\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId);\n });\n });\n }\n }, [store, focusCell]);\n\n const onNavigateToNextMatch = React.useCallback(() => {\n const currentState = store.getState();\n if (currentState.searchMatches.length === 0) return;\n\n const nextIndex = (currentState.matchIndex + 1) % currentState.searchMatches.length;\n const match = currentState.searchMatches[nextIndex];\n\n if (match) {\n rowVirtualizerRef.current?.scrollToIndex(match.rowIndex, {\n align: \"center\"\n });\n\n requestAnimationFrame(() => {\n store.setState(\"matchIndex\", nextIndex);\n requestAnimationFrame(() => {\n focusCell(match.rowIndex, match.columnId);\n });\n });\n }\n }, [store, focusCell]);\n\n const searchMatchSet = React.useMemo(() => {\n return new Set(searchMatches.map((m) => getCellKey(m.rowIndex, m.columnId)));\n }, [searchMatches]);\n\n const getIsSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n return searchMatchSet.has(getCellKey(rowIndex, columnId));\n },\n [searchMatchSet]\n );\n\n const getIsActiveSearchMatch = React.useCallback(\n (rowIndex: number, columnId: string) => {\n const currentState = store.getState();\n if (currentState.matchIndex < 0) return false;\n const currentMatch = currentState.searchMatches[currentState.matchIndex];\n return currentMatch?.rowIndex === rowIndex && currentMatch?.columnId === columnId;\n },\n [store]\n );\n\n // Compute search match data for targeted row re-renders\n const searchMatchesByRow = React.useMemo(() => {\n if (searchMatches.length === 0) return null;\n const rowMap = new Map<number, Set<string>>();\n for (const match of searchMatches) {\n let columnSet = rowMap.get(match.rowIndex);\n if (!columnSet) {\n columnSet = new Set<string>();\n rowMap.set(match.rowIndex, columnSet);\n }\n columnSet.add(match.columnId);\n }\n return rowMap;\n }, [searchMatches]);\n\n const activeSearchMatch = React.useMemo<CellPosition | null>(() => {\n if (matchIndex < 0 || searchMatches.length === 0) return null;\n return searchMatches[matchIndex] ?? null;\n }, [searchMatches, matchIndex]);\n\n const blurCell = React.useCallback(() => {\n const currentState = store.getState();\n if (currentState.editingCell && document.activeElement instanceof HTMLElement) {\n document.activeElement.blur();\n }\n\n store.batch(() => {\n store.setState(\"focusedCell\", null);\n store.setState(\"editingCell\", null);\n });\n }, [store]);\n\n const scrollToCell = React.useCallback(\n (rowIndex: number, columnId: string) => {\n requestAnimationFrame(() => {\n const container = dataGridRef.current;\n const cellKey = getCellKey(rowIndex, columnId);\n const targetCell = cellMapRef.current.get(cellKey);\n\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n isRtl: dir === \"rtl\"\n });\n }\n });\n },\n [dir]\n );\n\n const onCellClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n if (event?.button === 2) return;\n\n const currentState = store.getState();\n const currentFocused = currentState.focusedCell;\n\n if (event) {\n if (event.ctrlKey || event.metaKey) {\n event.preventDefault();\n const cellKey = getCellKey(rowIndex, columnId);\n const newSelectedCells = new Set(currentState.selectionState.selectedCells);\n\n if (newSelectedCells.has(cellKey)) {\n newSelectedCells.delete(cellKey);\n } else {\n newSelectedCells.add(cellKey);\n }\n\n store.setState(\"selectionState\", {\n selectedCells: newSelectedCells,\n selectionRange: null,\n isSelecting: false\n });\n focusCell(rowIndex, columnId);\n scrollToCell(rowIndex, columnId);\n return;\n }\n\n if (event.shiftKey && currentState.focusedCell) {\n event.preventDefault();\n selectRange(currentState.focusedCell, { rowIndex, columnId });\n scrollToCell(rowIndex, columnId);\n return;\n }\n }\n\n const hasSelectedCells = currentState.selectionState.selectedCells.size > 0;\n const hasSelectedRows = Object.keys(currentState.rowSelection).length > 0;\n\n if (hasSelectedCells && !currentState.selectionState.isSelecting) {\n const cellKey = getCellKey(rowIndex, columnId);\n const isClickingSelectedCell = currentState.selectionState.selectedCells.has(cellKey);\n\n if (!isClickingSelectedCell) {\n onSelectionClear();\n } else {\n focusCell(rowIndex, columnId);\n scrollToCell(rowIndex, columnId);\n return;\n }\n } else if (hasSelectedRows && columnId !== \"select\") {\n onSelectionClear();\n }\n\n if (currentFocused?.rowIndex === rowIndex && currentFocused?.columnId === columnId) {\n onCellEditingStart(rowIndex, columnId);\n } else {\n focusCell(rowIndex, columnId);\n scrollToCell(rowIndex, columnId);\n }\n },\n [store, focusCell, scrollToCell, onCellEditingStart, selectRange, onSelectionClear]\n );\n\n const onCellDoubleClick = React.useCallback(\n (rowIndex: number, columnId: string, event?: React.MouseEvent) => {\n if (event?.defaultPrevented) return;\n\n onCellEditingStart(rowIndex, columnId);\n },\n [onCellEditingStart]\n );\n\n const onCellMouseDown = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n if (event.button === 2) {\n return;\n }\n\n event.preventDefault();\n\n if (!event.ctrlKey && !event.metaKey && !event.shiftKey) {\n const cellKey = getCellKey(rowIndex, columnId);\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: propsRef.current.enableSingleCellSelection ? new Set([cellKey]) : new Set(),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId }\n },\n isSelecting: true\n });\n store.setState(\"rowSelection\", {});\n });\n }\n },\n [store, propsRef]\n );\n\n const onCellMouseEnter = React.useCallback(\n (rowIndex: number, columnId: string) => {\n const currentState = store.getState();\n if (currentState.selectionState.isSelecting && currentState.selectionState.selectionRange) {\n const start = currentState.selectionState.selectionRange.start;\n const end = { rowIndex, columnId };\n\n if (\n currentState.focusedCell?.rowIndex !== start.rowIndex ||\n currentState.focusedCell?.columnId !== start.columnId\n ) {\n focusCell(start.rowIndex, start.columnId);\n }\n\n selectRange(start, end, true);\n }\n },\n [store, selectRange, focusCell]\n );\n\n const onCellMouseUp = React.useCallback(() => {\n const currentState = store.getState();\n store.setState(\"selectionState\", {\n ...currentState.selectionState,\n isSelecting: false\n });\n }, [store]);\n\n const onCellContextMenu = React.useCallback(\n (rowIndex: number, columnId: string, event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n\n const currentState = store.getState();\n const cellKey = getCellKey(rowIndex, columnId);\n const isTargetCellSelected = currentState.selectionState.selectedCells.has(cellKey);\n\n if (!isTargetCellSelected) {\n store.batch(() => {\n store.setState(\"selectionState\", {\n selectedCells: new Set([cellKey]),\n selectionRange: {\n start: { rowIndex, columnId },\n end: { rowIndex, columnId }\n },\n isSelecting: false\n });\n store.setState(\"focusedCell\", { rowIndex, columnId });\n });\n }\n\n store.setState(\"contextMenu\", {\n open: true,\n x: event.clientX,\n y: event.clientY\n });\n },\n [store]\n );\n\n const onContextMenuOpenChange = React.useCallback(\n (open: boolean) => {\n if (!open) {\n const currentMenu = store.getState().contextMenu;\n store.setState(\"contextMenu\", {\n open: false,\n x: currentMenu.x,\n y: currentMenu.y\n });\n }\n },\n [store]\n );\n\n const onSortingChange = React.useCallback(\n (updater: Updater<SortingState>) => {\n const currentState = store.getState();\n const newSorting = typeof updater === \"function\" ? updater(currentState.sorting) : updater;\n store.setState(\"sorting\", newSorting);\n\n propsRef.current.onSortingChange?.(newSorting);\n },\n [store, propsRef]\n );\n\n const onColumnFiltersChange = React.useCallback(\n (updater: Updater<ColumnFiltersState>) => {\n const currentState = store.getState();\n const newColumnFilters = typeof updater === \"function\" ? updater(currentState.columnFilters) : updater;\n store.setState(\"columnFilters\", newColumnFilters);\n\n propsRef.current.onColumnFiltersChange?.(newColumnFilters);\n },\n [store, propsRef]\n );\n\n const onRowSelectionChange = React.useCallback(\n (updater: Updater<RowSelectionState>) => {\n const currentState = store.getState();\n const newRowSelection = typeof updater === \"function\" ? updater(currentState.rowSelection) : updater;\n\n const selectedRows = Object.keys(newRowSelection).filter((key) => newRowSelection[key]);\n\n const selectedCells = new Set<string>();\n const rows = tableRef.current?.getRowModel().rows ?? [];\n\n for (const rowId of selectedRows) {\n const rowIndex = rows.findIndex((r) => r.id === rowId);\n if (rowIndex === -1) continue;\n\n for (const columnId of columnIds) {\n selectedCells.add(getCellKey(rowIndex, columnId));\n }\n }\n\n store.batch(() => {\n store.setState(\"rowSelection\", newRowSelection);\n store.setState(\"selectionState\", {\n selectedCells,\n selectionRange: null,\n isSelecting: false\n });\n store.setState(\"focusedCell\", null);\n store.setState(\"editingCell\", null);\n });\n\n propsRef.current.onRowSelectionChange?.(updater);\n },\n [store, columnIds, propsRef]\n );\n\n const onRowSelect = React.useCallback(\n (rowId: string, selected: boolean, shiftKey: boolean) => {\n const currentState = store.getState();\n const rows = tableRef.current?.getRowModel().rows ?? [];\n const currentRowIndex = rows.findIndex((r) => r.id === rowId);\n const currentRow = currentRowIndex >= 0 ? rows[currentRowIndex] : null;\n if (!currentRow) return;\n\n if (shiftKey && currentState.lastClickedRowId !== null) {\n const lastClickedRowIndex = rows.findIndex((r) => r.id === currentState.lastClickedRowId);\n if (lastClickedRowIndex >= 0) {\n const startIndex = Math.min(lastClickedRowIndex, currentRowIndex);\n const endIndex = Math.max(lastClickedRowIndex, currentRowIndex);\n\n const newRowSelection: RowSelectionState = {\n ...currentState.rowSelection\n };\n\n for (let i = startIndex; i <= endIndex; i++) {\n const row = rows[i];\n if (row) {\n newRowSelection[row.id] = selected;\n }\n }\n\n onRowSelectionChange(newRowSelection);\n } else {\n onRowSelectionChange({\n ...currentState.rowSelection,\n [currentRow.id]: selected\n });\n }\n } else {\n onRowSelectionChange({\n ...currentState.rowSelection,\n [currentRow.id]: selected\n });\n }\n\n store.setState(\"lastClickedRowId\", rowId);\n },\n [store, onRowSelectionChange]\n );\n\n const onRowHeightChange = React.useCallback(\n (updater: Updater<RowHeightValue>) => {\n const currentState = store.getState();\n const newRowHeight = typeof updater === \"function\" ? updater(currentState.rowHeight) : updater;\n store.setState(\"rowHeight\", newRowHeight);\n propsRef.current.onRowHeightChange?.(newRowHeight);\n },\n [store, propsRef]\n );\n\n const onColumnClick = React.useCallback(\n (columnId: string) => {\n if (!propsRef.current.enableColumnSelection) {\n onSelectionClear();\n return;\n }\n\n selectColumn(columnId);\n },\n [propsRef, selectColumn, onSelectionClear]\n );\n\n const onPasteDialogOpenChange = React.useCallback(\n (open: boolean) => {\n if (!open) {\n store.setState(\"pasteDialog\", {\n open: false,\n rowsNeeded: 0,\n clipboardText: \"\"\n });\n }\n },\n [store]\n );\n\n const defaultColumn: Partial<ColumnDef<TData>> = React.useMemo(\n () => ({\n // Cell is rendered directly in DataGridRow to bypass flexRender's\n // unstable cell.getContext() (https://github.com/TanStack/table/issues/4794)\n minSize: MIN_COLUMN_SIZE,\n maxSize: MAX_COLUMN_SIZE\n }),\n []\n );\n\n // Có hay không các callback tuỳ chọn: lưới bật/tắt tính năng theo cờ này\n // (dòng \"Thêm dòng\", mục \"Xoá dòng\" ở menu chuột phải, tải tệp lên…).\n // Phải là dependency thật, nếu đọc propsRef.current trong useMemo thì\n // ứng dụng truyền callback muộn (sau khi tải quyền chẳng hạn) sẽ không có tác dụng.\n const hasRowAdd = Boolean(props.onRowAdd);\n const hasRowsDelete = Boolean(props.onRowsDelete);\n const hasFilesUpload = Boolean(props.onFilesUpload);\n const hasFilesDelete = Boolean(props.onFilesDelete);\n\n const onFilesUpload = React.useCallback(\n (params: { files: File[]; rowIndex: number; columnId: string }) => {\n const upload = propsRef.current.onFilesUpload;\n return upload ? upload(params) : Promise.resolve([]);\n },\n [propsRef]\n );\n\n const onFilesDelete = React.useCallback(\n async (params: { fileIds: string[]; rowIndex: number; columnId: string }) => {\n await propsRef.current.onFilesDelete?.(params);\n },\n [propsRef]\n );\n\n const tableMeta = React.useMemo<TableMeta<TData>>(() => {\n return {\n ...propsRef.current.meta,\n dataGridRef,\n cellMapRef,\n get focusedCell() {\n return store.getState().focusedCell;\n },\n get editingCell() {\n return store.getState().editingCell;\n },\n get selectionState() {\n return store.getState().selectionState;\n },\n get searchOpen() {\n return store.getState().searchOpen;\n },\n get contextMenu() {\n return store.getState().contextMenu;\n },\n get pasteDialog() {\n return store.getState().pasteDialog;\n },\n get rowHeight() {\n return store.getState().rowHeight;\n },\n get readOnly() {\n return propsRef.current.readOnly;\n },\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n getVisualRowIndex,\n scrollToCell: (rowIndex, columnId, align = \"auto\") => {\n const container = dataGridRef.current;\n if (!container) return;\n\n rowVirtualizerRef.current?.scrollToIndex(rowIndex, { align });\n\n const scrollRowIntoView = (retries = 1) => {\n requestAnimationFrame(() => {\n const targetRow = rowMapRef.current.get(rowIndex);\n if (!targetRow) {\n if (retries > 0) scrollRowIntoView(retries - 1);\n return;\n }\n\n const headerBottom =\n headerRef.current?.getBoundingClientRect().bottom ?? container.getBoundingClientRect().top;\n\n const viewportTop = headerBottom + VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n\n if (rowRect.top < viewportTop) {\n container.scrollTop -= viewportTop - rowRect.top;\n }\n\n const cellKey = getCellKey(rowIndex, columnId);\n const targetCell = cellMapRef.current.get(cellKey);\n if (targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n isRtl: dir === \"rtl\"\n });\n }\n });\n };\n\n scrollRowIntoView();\n },\n onRowHeightChange,\n onRowSelect,\n onDataUpdate,\n onRowsDelete: hasRowsDelete ? onRowsDelete : undefined,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n onCellsCopy,\n onCellsCut,\n onCellsPaste,\n onSelectionClear,\n onFilesUpload: hasFilesUpload ? onFilesUpload : undefined,\n onFilesDelete: hasFilesDelete ? onFilesDelete : undefined,\n onContextMenuOpenChange,\n onPasteDialogOpenChange\n };\n }, [\n propsRef,\n store,\n dir,\n getIsCellSelected,\n getIsSearchMatch,\n getIsActiveSearchMatch,\n getVisualRowIndex,\n onRowHeightChange,\n onRowSelect,\n onDataUpdate,\n onRowsDelete,\n onColumnClick,\n onCellClick,\n onCellDoubleClick,\n onCellMouseDown,\n onCellMouseEnter,\n onCellMouseUp,\n onCellContextMenu,\n onCellEditingStart,\n onCellEditingStop,\n onCellsCopy,\n onCellsCut,\n onCellsPaste,\n onSelectionClear,\n onContextMenuOpenChange,\n onPasteDialogOpenChange,\n hasRowsDelete,\n hasFilesUpload,\n hasFilesDelete,\n onFilesUpload,\n onFilesDelete\n ]);\n\n const getMemoizedCoreRowModel = React.useMemo(() => getCoreRowModel(), []);\n const getMemoizedFilteredRowModel = React.useMemo(() => getFilteredRowModel(), []);\n const getMemoizedSortedRowModel = React.useMemo(() => getSortedRowModel(), []);\n\n // Memoize state object to reduce shallow equality checks\n const tableState = React.useMemo<Partial<TableState>>(\n () => ({\n ...propsRef.current.state,\n sorting,\n columnFilters,\n rowSelection\n }),\n [propsRef, sorting, columnFilters, rowSelection]\n );\n\n const tableOptions = React.useMemo<TableOptions<TData>>(() => {\n return {\n ...propsRef.current,\n data,\n columns: tableColumns,\n defaultColumn,\n initialState: propsRef.current.initialState,\n state: tableState,\n onRowSelectionChange,\n onSortingChange,\n onColumnFiltersChange,\n columnResizeMode: \"onChange\",\n columnResizeDirection: dir,\n getCoreRowModel: getMemoizedCoreRowModel,\n getFilteredRowModel: getMemoizedFilteredRowModel,\n getSortedRowModel: getMemoizedSortedRowModel,\n meta: tableMeta\n };\n }, [\n propsRef,\n data,\n tableColumns,\n defaultColumn,\n tableState,\n dir,\n onRowSelectionChange,\n onSortingChange,\n onColumnFiltersChange,\n getMemoizedCoreRowModel,\n getMemoizedFilteredRowModel,\n getMemoizedSortedRowModel,\n tableMeta\n ]);\n\n const table = useReactTable(tableOptions);\n\n if (!tableRef.current) {\n tableRef.current = table;\n }\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: columnSizingInfo and columnSizing are used for calculating the column size vars\n const columnSizeVars = React.useMemo(() => {\n const headers = table.getFlatHeaders();\n const colSizes: { [key: string]: number } = {};\n for (const header of headers) {\n colSizes[`--header-${header.id}-size`] = header.getSize();\n colSizes[`--col-${header.column.id}-size`] = header.column.getSize();\n }\n return colSizes;\n }, [table.getState().columnSizingInfo, table.getState().columnSizing]);\n\n const isFirefox = React.useSyncExternalStore(\n React.useCallback(() => () => {}, []),\n React.useCallback(() => {\n if (typeof window === \"undefined\" || typeof navigator === \"undefined\") {\n return false;\n }\n return navigator.userAgent.indexOf(\"Firefox\") !== -1;\n }, []),\n React.useCallback(() => false, [])\n );\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: columnPinning is used for calculating the adjustLayout\n const adjustLayout = React.useMemo(() => {\n const columnPinning = table.getState().columnPinning;\n return isFirefox && ((columnPinning.left?.length ?? 0) > 0 || (columnPinning.right?.length ?? 0) > 0);\n }, [isFirefox, table.getState().columnPinning]);\n\n const rowVirtualizer = useVirtualizer({\n count: table.getRowModel().rows.length,\n getScrollElement: () => dataGridRef.current,\n estimateSize: () => rowHeightValue,\n overscan,\n measureElement: !isFirefox ? (element) => element?.getBoundingClientRect().height : undefined,\n scrollPaddingStart:\n (headerRef.current?.getBoundingClientRect().bottom ?? 0) -\n (dataGridRef.current?.getBoundingClientRect().top ?? 0) +\n VIEWPORT_OFFSET,\n // Add extra row buffer to absorb virtual position drift after render measurements\n scrollPaddingEnd:\n (dataGridRef.current?.getBoundingClientRect().bottom ?? 0) -\n (footerRef.current?.getBoundingClientRect().top ?? dataGridRef.current?.getBoundingClientRect().bottom ?? 0) +\n rowHeightValue +\n VIEWPORT_OFFSET\n });\n\n if (!rowVirtualizerRef.current) {\n rowVirtualizerRef.current = rowVirtualizer;\n }\n\n const onScrollToRow = React.useCallback(\n async (opts: Partial<CellPosition>) => {\n const rowIndex = opts?.rowIndex ?? 0;\n const columnId = opts?.columnId;\n\n focusGuardRef.current = true;\n\n const navigableIds = propsRef.current.columns\n .map((c) => {\n if (c.id) return c.id;\n if (\"accessorKey\" in c) return c.accessorKey as string;\n return undefined;\n })\n .filter((id): id is string => Boolean(id))\n .filter((c) => !NON_NAVIGABLE_COLUMN_IDS.has(c));\n\n const targetColumnId = columnId ?? navigableIds[0];\n\n if (!targetColumnId) {\n releaseFocusGuard(true);\n return;\n }\n\n async function onScrollAndFocus(retryCount: number) {\n if (!targetColumnId) return;\n const currentRowCount = propsRef.current.data.length;\n\n // If the requested row doesn't exist yet, wait for data to update\n if (rowIndex >= currentRowCount && retryCount > 0) {\n await new Promise((resolve) => setTimeout(resolve, 50));\n await onScrollAndFocus(retryCount - 1);\n return;\n }\n\n const safeRowIndex = Math.min(rowIndex, Math.max(0, currentRowCount - 1));\n\n const isBottomHalf = safeRowIndex > currentRowCount / 2;\n rowVirtualizer.scrollToIndex(safeRowIndex, {\n align: isBottomHalf ? \"end\" : \"start\"\n });\n\n await new Promise((resolve) => requestAnimationFrame(resolve));\n\n // Adjust scroll position to account for sticky header/footer\n const container = dataGridRef.current;\n const targetRow = rowMapRef.current.get(safeRowIndex);\n\n if (container && targetRow) {\n const containerRect = container.getBoundingClientRect();\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0;\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0;\n\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET;\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom;\n\n if (!isFullyVisible) {\n if (rowRect.top < viewportTop) {\n // Scroll up as row is partially hidden by header\n container.scrollTop -= viewportTop - rowRect.top;\n } else if (rowRect.bottom > viewportBottom) {\n // Scroll down as row is partially hidden by footer\n container.scrollTop += rowRect.bottom - viewportBottom;\n }\n }\n }\n\n store.batch(() => {\n store.setState(\"focusedCell\", {\n rowIndex: safeRowIndex,\n columnId: targetColumnId\n });\n store.setState(\"editingCell\", null);\n });\n\n const cellKey = getCellKey(safeRowIndex, targetColumnId);\n const cellElement = cellMapRef.current.get(cellKey);\n\n if (cellElement) {\n cellElement.focus();\n releaseFocusGuard();\n } else if (retryCount > 0) {\n await new Promise((resolve) => requestAnimationFrame(resolve));\n await onScrollAndFocus(retryCount - 1);\n } else {\n dataGridRef.current?.focus();\n releaseFocusGuard();\n }\n }\n\n await onScrollAndFocus(SCROLL_SYNC_RETRY_COUNT);\n },\n [rowVirtualizer, propsRef, store, releaseFocusGuard]\n );\n\n const onRowAdd = React.useCallback(\n async (event?: React.MouseEvent<HTMLDivElement>) => {\n if (propsRef.current.readOnly || !propsRef.current.onRowAdd) return;\n\n const initialRowCount = propsRef.current.data.length;\n\n let result: Partial<CellPosition> | null;\n try {\n result = await propsRef.current.onRowAdd(event);\n } catch {\n // Callback threw an error, don't proceed with scroll/focus\n return;\n }\n\n if (result === null || event?.defaultPrevented) return;\n\n onSelectionClear();\n\n // onScrollToRow will handle retries if the row isn't rendered yet\n const targetRowIndex = result.rowIndex ?? initialRowCount;\n const targetColumnId = result.columnId;\n\n onScrollToRow({\n rowIndex: targetRowIndex,\n columnId: targetColumnId\n });\n },\n [propsRef, onScrollToRow, onSelectionClear]\n );\n\n const onDataGridKeyDown = React.useCallback(\n (event: KeyboardEvent) => {\n const currentState = store.getState();\n const { key, ctrlKey, metaKey, shiftKey, altKey } = event;\n const isCtrlPressed = ctrlKey || metaKey;\n\n if (propsRef.current.enableSearch && isCtrlPressed && !shiftKey && key === SEARCH_SHORTCUT_KEY) {\n event.preventDefault();\n onSearchOpenChange(true);\n return;\n }\n\n if (propsRef.current.enableSearch && currentState.searchOpen && !currentState.editingCell) {\n if (key === \"Enter\") {\n event.preventDefault();\n if (shiftKey) {\n onNavigateToPrevMatch();\n } else {\n onNavigateToNextMatch();\n }\n return;\n }\n if (key === \"Escape\") {\n event.preventDefault();\n onSearchOpenChange(false);\n return;\n }\n return;\n }\n\n // Cell editing keyboard events (Enter, Tab, Escape) are handled by the cell variants\n // to ensure proper value commitment before navigation\n if (currentState.editingCell) return;\n\n if (\n isCtrlPressed &&\n (key === \"Backspace\" || key === \"Delete\") &&\n !propsRef.current.readOnly &&\n propsRef.current.onRowsDelete\n ) {\n const rowIndices = new Set<number>();\n\n const selectedRowIds = Object.keys(currentState.rowSelection);\n if (selectedRowIds.length > 0) {\n const currentTable = tableRef.current;\n const rows = currentTable?.getRowModel().rows ?? [];\n for (const row of rows) {\n if (currentState.rowSelection[row.id]) {\n rowIndices.add(row.index);\n }\n }\n } else if (currentState.selectionState.selectedCells.size > 0) {\n for (const cellKey of currentState.selectionState.selectedCells) {\n const { rowIndex } = parseCellKey(cellKey);\n rowIndices.add(rowIndex);\n }\n } else if (currentState.focusedCell) {\n rowIndices.add(currentState.focusedCell.rowIndex);\n }\n\n if (rowIndices.size > 0) {\n event.preventDefault();\n onRowsDelete(Array.from(rowIndices));\n }\n return;\n }\n\n if (!currentState.focusedCell) return;\n\n let direction: NavigationDirection | null = null;\n\n if (isCtrlPressed && !shiftKey && key === \"a\") {\n event.preventDefault();\n selectAll();\n return;\n }\n\n if (isCtrlPressed && !shiftKey && key === \"c\") {\n event.preventDefault();\n onCellsCopy();\n return;\n }\n\n if (isCtrlPressed && !shiftKey && key === \"x\" && !propsRef.current.readOnly) {\n event.preventDefault();\n onCellsCut();\n return;\n }\n\n if (propsRef.current.enablePaste && isCtrlPressed && !shiftKey && key === \"v\" && !propsRef.current.readOnly) {\n // KHÔNG preventDefault: để trình duyệt bắn tiếp sự kiện `paste` (xem effect\n // đăng ký \"paste\" bên dưới) — cách đó đọc được clipboard cả ở http nội bộ.\n return;\n }\n\n if ((key === \"Delete\" || key === \"Backspace\") && !isCtrlPressed && !propsRef.current.readOnly) {\n const cellsToClear =\n currentState.selectionState.selectedCells.size > 0\n ? Array.from(currentState.selectionState.selectedCells)\n : currentState.focusedCell\n ? [getCellKey(currentState.focusedCell.rowIndex, currentState.focusedCell.columnId)]\n : [];\n\n if (cellsToClear.length > 0) {\n event.preventDefault();\n\n const updates: Array<{\n rowIndex: number;\n columnId: string;\n value: unknown;\n }> = [];\n\n const currentTable = tableRef.current;\n const tableColumns = currentTable?.getAllColumns() ?? [];\n const columnById = new Map(tableColumns.map((c) => [c.id, c]));\n\n for (const cellKey of cellsToClear) {\n const { rowIndex, columnId } = parseCellKey(cellKey);\n const column = columnById.get(columnId);\n const cellVariant = column?.columnDef?.meta?.cell?.variant;\n const emptyValue = getEmptyCellValue(cellVariant);\n updates.push({ rowIndex, columnId, value: emptyValue });\n }\n\n onDataUpdate(updates);\n\n if (currentState.selectionState.selectedCells.size > 0) {\n onSelectionClear();\n }\n\n if (currentState.cutCells.size > 0) {\n store.setState(\"cutCells\", new Set());\n }\n }\n return;\n }\n\n if (key === \"Enter\" && shiftKey && !propsRef.current.readOnly && propsRef.current.onRowAdd) {\n event.preventDefault();\n const initialRowCount = propsRef.current.data.length;\n const currentColumnId = currentState.focusedCell.columnId;\n\n Promise.resolve(propsRef.current.onRowAdd())\n .then(async (result) => {\n if (result === null) return;\n\n onSelectionClear();\n\n const targetRowIndex = result.rowIndex ?? initialRowCount;\n const targetColumnId = result.columnId ?? currentColumnId;\n\n onScrollToRow({\n rowIndex: targetRowIndex,\n columnId: targetColumnId\n });\n })\n .catch(() => {\n // Callback threw an error, don't proceed with scroll/focus\n });\n return;\n }\n\n switch (key) {\n case \"ArrowUp\":\n if (altKey && !isCtrlPressed && !shiftKey) {\n direction = \"pageup\";\n } else if (isCtrlPressed && shiftKey) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const currentColIndex = navigableColumnIds.indexOf(selectionEdge.columnId);\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n\n selectRange(selectionStart, {\n rowIndex: 0,\n columnId: navigableColumnIds[currentColIndex] ?? selectionEdge.columnId\n });\n\n const rowVirtualizer = rowVirtualizerRef.current;\n if (rowVirtualizer) {\n rowVirtualizer.scrollToIndex(0, { align: \"start\" });\n }\n\n restoreFocus(dataGridRef.current);\n\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"ctrl+up\";\n } else {\n direction = \"up\";\n }\n break;\n case \"ArrowDown\":\n if (altKey && !isCtrlPressed && !shiftKey) {\n direction = \"pagedown\";\n } else if (isCtrlPressed && shiftKey) {\n const rowCount = tableRef.current?.getRowModel().rows.length || propsRef.current.data.length;\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const currentColIndex = navigableColumnIds.indexOf(selectionEdge.columnId);\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n\n selectRange(selectionStart, {\n rowIndex: Math.max(0, rowCount - 1),\n columnId: navigableColumnIds[currentColIndex] ?? selectionEdge.columnId\n });\n\n const rowVirtualizer = rowVirtualizerRef.current;\n if (rowVirtualizer) {\n rowVirtualizer.scrollToIndex(Math.max(0, rowCount - 1), {\n align: \"end\"\n });\n }\n\n restoreFocus(dataGridRef.current);\n\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"ctrl+down\";\n } else {\n direction = \"down\";\n }\n break;\n case \"ArrowLeft\":\n if (isCtrlPressed && shiftKey) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n const targetColumnId =\n dir === \"rtl\" ? navigableColumnIds[navigableColumnIds.length - 1] : navigableColumnIds[0];\n\n if (targetColumnId) {\n selectRange(selectionStart, {\n rowIndex: selectionEdge.rowIndex,\n columnId: targetColumnId\n });\n\n const container = dataGridRef.current;\n const cellKey = getCellKey(selectionEdge.rowIndex, targetColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: \"home\",\n isRtl: dir === \"rtl\"\n });\n }\n\n restoreFocus(container);\n }\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"home\";\n } else {\n direction = \"left\";\n }\n break;\n case \"ArrowRight\":\n if (isCtrlPressed && shiftKey) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n const targetColumnId =\n dir === \"rtl\" ? navigableColumnIds[0] : navigableColumnIds[navigableColumnIds.length - 1];\n\n if (targetColumnId) {\n selectRange(selectionStart, {\n rowIndex: selectionEdge.rowIndex,\n columnId: targetColumnId\n });\n\n const container = dataGridRef.current;\n const cellKey = getCellKey(selectionEdge.rowIndex, targetColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction: \"end\",\n isRtl: dir === \"rtl\"\n });\n }\n\n restoreFocus(container);\n }\n event.preventDefault();\n return;\n } else if (isCtrlPressed && !shiftKey) {\n direction = \"end\";\n } else {\n direction = \"right\";\n }\n break;\n case \"Home\":\n direction = isCtrlPressed ? \"ctrl+home\" : \"home\";\n break;\n case \"End\":\n direction = isCtrlPressed ? \"ctrl+end\" : \"end\";\n break;\n case \"PageUp\":\n direction = altKey ? \"pageleft\" : \"pageup\";\n break;\n case \"PageDown\":\n direction = altKey ? \"pageright\" : \"pagedown\";\n break;\n case \"Escape\":\n event.preventDefault();\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n onSelectionClear();\n } else {\n blurCell();\n }\n return;\n case \"Tab\":\n event.preventDefault();\n if (dir === \"rtl\") {\n direction = event.shiftKey ? \"right\" : \"left\";\n } else {\n direction = event.shiftKey ? \"left\" : \"right\";\n }\n break;\n }\n\n if (direction) {\n event.preventDefault();\n\n if (shiftKey && key !== \"Tab\" && currentState.focusedCell) {\n const selectionEdge = currentState.selectionState.selectionRange?.end || currentState.focusedCell;\n\n const currentColIndex = navigableColumnIds.indexOf(selectionEdge.columnId);\n let newRowIndex = selectionEdge.rowIndex;\n let newColumnId = selectionEdge.columnId;\n\n const isRtl = dir === \"rtl\";\n\n const rowCount = tableRef.current?.getRowModel().rows.length || propsRef.current.data.length;\n\n switch (direction) {\n case \"up\":\n newRowIndex = Math.max(0, selectionEdge.rowIndex - 1);\n break;\n case \"down\":\n newRowIndex = Math.min(rowCount - 1, selectionEdge.rowIndex + 1);\n break;\n case \"left\":\n if (isRtl) {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n } else {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n }\n break;\n case \"right\":\n if (isRtl) {\n if (currentColIndex > 0) {\n const prevColumnId = navigableColumnIds[currentColIndex - 1];\n if (prevColumnId) newColumnId = prevColumnId;\n }\n } else {\n if (currentColIndex < navigableColumnIds.length - 1) {\n const nextColumnId = navigableColumnIds[currentColIndex + 1];\n if (nextColumnId) newColumnId = nextColumnId;\n }\n }\n break;\n case \"home\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[0] ?? newColumnId;\n }\n break;\n case \"end\":\n if (navigableColumnIds.length > 0) {\n newColumnId = navigableColumnIds[navigableColumnIds.length - 1] ?? newColumnId;\n }\n break;\n }\n\n const selectionStart = currentState.selectionState.selectionRange?.start || currentState.focusedCell;\n\n selectRange(selectionStart, {\n rowIndex: newRowIndex,\n columnId: newColumnId\n });\n\n const container = dataGridRef.current;\n const targetRow = rowMapRef.current.get(newRowIndex);\n const cellKey = getCellKey(newRowIndex, newColumnId);\n const targetCell = cellMapRef.current.get(cellKey);\n\n if (newRowIndex !== selectionEdge.rowIndex && (direction === \"up\" || direction === \"down\")) {\n if (container && targetRow) {\n const containerRect = container.getBoundingClientRect();\n const headerHeight = headerRef.current?.getBoundingClientRect().height ?? 0;\n const footerHeight = footerRef.current?.getBoundingClientRect().height ?? 0;\n\n const viewportTop = containerRect.top + headerHeight + VIEWPORT_OFFSET;\n const viewportBottom = containerRect.bottom - footerHeight - VIEWPORT_OFFSET;\n\n const rowRect = targetRow.getBoundingClientRect();\n const isFullyVisible = rowRect.top >= viewportTop && rowRect.bottom <= viewportBottom;\n\n if (!isFullyVisible) {\n const scrollNeeded = direction === \"down\" ? rowRect.bottom - viewportBottom : viewportTop - rowRect.top;\n\n if (direction === \"down\") {\n container.scrollTop += scrollNeeded;\n } else {\n container.scrollTop -= scrollNeeded;\n }\n\n restoreFocus(container);\n }\n } else {\n const rowVirtualizer = rowVirtualizerRef.current;\n if (rowVirtualizer) {\n const align = direction === \"up\" ? \"start\" : \"end\";\n rowVirtualizer.scrollToIndex(newRowIndex, { align });\n\n restoreFocus(container);\n }\n }\n }\n\n if (\n newColumnId !== selectionEdge.columnId &&\n (direction === \"left\" || direction === \"right\" || direction === \"home\" || direction === \"end\")\n ) {\n if (container && targetCell) {\n scrollCellIntoView({\n container,\n targetCell,\n tableRef,\n viewportOffset: VIEWPORT_OFFSET,\n direction,\n isRtl\n });\n }\n }\n } else {\n if (currentState.selectionState.selectedCells.size > 0) {\n onSelectionClear();\n }\n navigateCell(direction);\n }\n }\n },\n [\n dir,\n store,\n propsRef,\n blurCell,\n navigateCell,\n selectAll,\n onCellsCopy,\n onCellsCut,\n onDataUpdate,\n onSelectionClear,\n navigableColumnIds,\n selectRange,\n onSearchOpenChange,\n onNavigateToNextMatch,\n onNavigateToPrevMatch,\n onRowsDelete,\n restoreFocus,\n onScrollToRow\n ]\n );\n\n const searchState = React.useMemo<SearchState | undefined>(() => {\n if (!propsRef.current.enableSearch) return undefined;\n\n return {\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch\n };\n }, [\n propsRef,\n searchMatches,\n matchIndex,\n searchOpen,\n onSearchOpenChange,\n searchQuery,\n onSearchQueryChange,\n onSearch,\n onNavigateToNextMatch,\n onNavigateToPrevMatch\n ]);\n\n React.useEffect(() => {\n if (!dataGridElement) return;\n\n dataGridElement.addEventListener(\"keydown\", onDataGridKeyDown);\n return () => {\n dataGridElement.removeEventListener(\"keydown\", onDataGridKeyDown);\n };\n }, [dataGridElement, onDataGridKeyDown]);\n\n // Dán: lấy nội dung từ chính sự kiện `paste` thay vì gọi navigator.clipboard.readText —\n // API đó chỉ chạy ở secure context (https/localhost) và Firefox còn hỏi quyền mỗi lần.\n React.useEffect(() => {\n if (!dataGridElement) return;\n\n function onPaste(event: ClipboardEvent) {\n if (!propsRef.current.enablePaste || propsRef.current.readOnly) return;\n\n const currentState = store.getState();\n // Đang sửa ô: để ô tự nhận nội dung dán như input bình thường\n if (currentState.editingCell || !currentState.focusedCell) return;\n\n const clipboardText = event.clipboardData?.getData(\"text/plain\") ?? \"\";\n if (!clipboardText) return;\n\n event.preventDefault();\n onCellsPaste(false, clipboardText);\n }\n\n dataGridElement.addEventListener(\"paste\", onPaste);\n return () => {\n dataGridElement.removeEventListener(\"paste\", onPaste);\n };\n }, [dataGridElement, propsRef, store, onCellsPaste]);\n\n React.useEffect(() => {\n function onGlobalKeyDown(event: KeyboardEvent) {\n const dataGridElement = dataGridRef.current;\n if (!dataGridElement) return;\n\n const target = event.target;\n if (!(target instanceof HTMLElement)) return;\n\n const { key, ctrlKey, metaKey, shiftKey } = event;\n const isCommandPressed = ctrlKey || metaKey;\n\n if (propsRef.current.enableSearch && isCommandPressed && !shiftKey && key === SEARCH_SHORTCUT_KEY) {\n const isInInput = target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\";\n const isInDataGrid = dataGridElement.contains(target);\n const isInSearchInput = target.closest('[role=\"search\"]') !== null;\n\n if (isInDataGrid || isInSearchInput || !isInInput) {\n event.preventDefault();\n event.stopPropagation();\n\n const nextSearchOpen = !store.getState().searchOpen;\n onSearchOpenChange(nextSearchOpen);\n\n if (nextSearchOpen && !isInDataGrid && !isInSearchInput) {\n requestAnimationFrame(() => {\n dataGridElement.focus();\n });\n }\n return;\n }\n }\n\n const isInDataGrid = dataGridElement.contains(target);\n if (!isInDataGrid) return;\n\n if (key === \"Escape\") {\n const currentState = store.getState();\n const hasSelections =\n currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0;\n\n if (hasSelections) {\n event.preventDefault();\n event.stopPropagation();\n onSelectionClear();\n }\n }\n }\n\n window.addEventListener(\"keydown\", onGlobalKeyDown, true);\n return () => {\n window.removeEventListener(\"keydown\", onGlobalKeyDown, true);\n };\n }, [propsRef, onSearchOpenChange, store, onSelectionClear]);\n\n React.useEffect(() => {\n const currentState = store.getState();\n const autoFocus = propsRef.current.autoFocus;\n\n if (autoFocus && data.length > 0 && columns.length > 0 && !currentState.focusedCell) {\n if (navigableColumnIds.length > 0) {\n const rafId = requestAnimationFrame(() => {\n if (typeof autoFocus === \"object\") {\n const { rowIndex, columnId } = autoFocus;\n if (columnId) {\n focusCell(rowIndex ?? 0, columnId);\n }\n return;\n }\n\n const firstColumnId = navigableColumnIds[0];\n if (firstColumnId) {\n focusCell(0, firstColumnId);\n }\n });\n return () => cancelAnimationFrame(rafId);\n }\n }\n }, [store, propsRef, data, columns, navigableColumnIds, focusCell]);\n\n // Restore focus to container when virtualized cells are unmounted\n React.useEffect(() => {\n const container = dataGridElement;\n if (!container) return;\n\n function onFocusOut(event: FocusEvent) {\n if (focusGuardRef.current) return;\n\n const currentContainer = dataGridRef.current;\n if (!currentContainer) return;\n\n const currentState = store.getState();\n\n if (!currentState.focusedCell || currentState.editingCell) return;\n\n const relatedTarget = event.relatedTarget;\n\n const isFocusMovingOutsideGrid = !relatedTarget || !currentContainer.contains(relatedTarget as Node);\n\n const isFocusMovingToPopover = getIsInPopover(relatedTarget);\n\n if (isFocusMovingOutsideGrid && !isFocusMovingToPopover) {\n const { rowIndex, columnId } = currentState.focusedCell;\n const cellKey = getCellKey(rowIndex, columnId);\n const cellElement = cellMapRef.current.get(cellKey);\n\n requestAnimationFrame(() => {\n if (focusGuardRef.current) return;\n\n if (cellElement && document.body.contains(cellElement)) {\n cellElement.focus();\n } else {\n currentContainer.focus();\n }\n });\n }\n }\n\n container.addEventListener(\"focusout\", onFocusOut);\n\n return () => {\n container.removeEventListener(\"focusout\", onFocusOut);\n };\n }, [dataGridElement, store]);\n\n React.useEffect(() => {\n function onOutsideClick(event: MouseEvent) {\n if (event.button === 2) {\n return;\n }\n\n if (dataGridRef.current && !dataGridRef.current.contains(event.target as Node)) {\n const elements = document.elementsFromPoint(event.clientX, event.clientY);\n\n // Compensate for event.target bubbling up\n const isInsidePopover = elements.some((element) => getIsInPopover(element));\n\n if (!isInsidePopover) {\n blurCell();\n const currentState = store.getState();\n if (currentState.selectionState.selectedCells.size > 0 || Object.keys(currentState.rowSelection).length > 0) {\n onSelectionClear();\n }\n }\n }\n }\n\n document.addEventListener(\"mousedown\", onOutsideClick);\n return () => {\n document.removeEventListener(\"mousedown\", onOutsideClick);\n };\n }, [store, blurCell, onSelectionClear]);\n\n React.useEffect(() => {\n function onSelectStart(event: Event) {\n event.preventDefault();\n }\n\n function onContextMenu(event: Event) {\n event.preventDefault();\n }\n\n function onCleanup() {\n document.removeEventListener(\"selectstart\", onSelectStart);\n document.removeEventListener(\"contextmenu\", onContextMenu);\n document.body.style.userSelect = \"\";\n }\n\n const onUnsubscribe = store.subscribe(() => {\n const currentState = store.getState();\n if (currentState.selectionState.isSelecting) {\n document.addEventListener(\"selectstart\", onSelectStart);\n document.addEventListener(\"contextmenu\", onContextMenu);\n document.body.style.userSelect = \"none\";\n } else {\n onCleanup();\n }\n });\n\n return () => {\n onCleanup();\n onUnsubscribe();\n };\n }, [store]);\n\n React.useEffect(() => {\n let rafId: number | null = null;\n let mouseX = 0;\n let mouseY = 0;\n let mouseReady = false;\n let active = false;\n let lastSelectionTime = 0;\n let resizeObserver: ResizeObserver | null = null;\n\n let cachedRect: DOMRect | null = null;\n let cachedHdrH = 0;\n let cachedFtrH = 0;\n let cachedLpw = 0;\n let cachedRpw = 0;\n\n function getAutoScrollSpeed(dist: number): number {\n const t = Math.min(dist / AUTO_SCROLL_SPEED_RAMP_ZONE, 1);\n return Math.round(AUTO_SCROLL_MIN_SPEED + (AUTO_SCROLL_MAX_SPEED - AUTO_SCROLL_MIN_SPEED) * t);\n }\n\n function cacheLayout(container: HTMLDivElement) {\n cachedRect = container.getBoundingClientRect();\n cachedHdrH = headerRef.current?.getBoundingClientRect().height ?? 0;\n cachedFtrH = footerRef.current?.getBoundingClientRect().height ?? 0;\n const tbl = tableRef.current;\n if (tbl) {\n cachedLpw = tbl.getLeftVisibleLeafColumns().reduce((s, c) => s + c.getSize(), 0);\n cachedRpw = tbl.getRightVisibleLeafColumns().reduce((s, c) => s + c.getSize(), 0);\n }\n }\n\n function tick() {\n if (!active) return;\n const container = dataGridRef.current;\n const tbl = tableRef.current;\n\n if (!container || !tbl) {\n onAutoScrollStop();\n return;\n }\n\n if (!mouseReady || !cachedRect) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n const rect = cachedRect;\n const { dir } = dragDepsRef.current;\n const hasNegativeScroll = container.scrollLeft < 0;\n const isActuallyRtl = dir === \"rtl\" || hasNegativeScroll;\n\n const dataTop = rect.top + cachedHdrH;\n const dataBottom = rect.bottom - cachedFtrH;\n\n const scrollAreaLeft = isActuallyRtl ? rect.left + cachedRpw : rect.left + cachedLpw;\n const scrollAreaRight = isActuallyRtl ? rect.right - cachedLpw : rect.right - cachedRpw;\n\n let dy = 0;\n let dx = 0;\n\n if (mouseY < dataTop) dy = -getAutoScrollSpeed(dataTop - mouseY);\n else if (mouseY > dataBottom) dy = getAutoScrollSpeed(mouseY - dataBottom);\n\n if (mouseX < scrollAreaLeft) dx = -getAutoScrollSpeed(scrollAreaLeft - mouseX);\n else if (mouseX > scrollAreaRight) dx = getAutoScrollSpeed(mouseX - scrollAreaRight);\n\n if (dx === 0 && dy === 0) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n container.scrollTop += dy;\n container.scrollLeft += dx;\n\n const now = performance.now();\n if (now - lastSelectionTime < AUTO_SCROLL_SELECTION_THROTTLE_MS) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n const { rowHeightValue: rh, columnIds } = dragDepsRef.current;\n if (columnIds.length === 0) {\n rafId = requestAnimationFrame(tick);\n return;\n }\n\n const totalRows = tbl.getRowModel().rows.length;\n const clampedY = Math.max(dataTop, Math.min(mouseY, dataBottom));\n const absY = container.scrollTop + (clampedY - dataTop);\n const rowIndex = Math.max(0, Math.min(Math.floor(absY / rh), totalRows - 1));\n\n const st = store.getState();\n const range = st.selectionState.selectionRange;\n\n let columnId: string | undefined;\n\n if (dx !== 0) {\n const clampedX = Math.max(rect.left, Math.min(mouseX, rect.right));\n const relX = clampedX - rect.left;\n\n const leftZoneWidth = isActuallyRtl ? cachedRpw : cachedLpw;\n const rightZoneWidth = isActuallyRtl ? cachedLpw : cachedRpw;\n\n if (relX < leftZoneWidth) {\n const columns = isActuallyRtl ? tbl.getRightVisibleLeafColumns() : tbl.getLeftVisibleLeafColumns();\n columnId = columns[0]?.id ?? columnIds[0] ?? \"\";\n let cx = 0;\n for (const col of columns) {\n if (relX < cx + col.getSize()) {\n columnId = col.id;\n break;\n }\n cx += col.getSize();\n }\n } else if (relX > rect.width - rightZoneWidth) {\n const columns = isActuallyRtl ? tbl.getLeftVisibleLeafColumns() : tbl.getRightVisibleLeafColumns();\n columnId = columns[0]?.id ?? columnIds[columnIds.length - 1] ?? \"\";\n let cx = rect.width - rightZoneWidth;\n for (const col of columns) {\n if (relX < cx + col.getSize()) {\n columnId = col.id;\n break;\n }\n cx += col.getSize();\n }\n } else {\n const center = tbl.getCenterVisibleLeafColumns();\n const centerZoneWidth = rect.width - leftZoneWidth - rightZoneWidth;\n const distFromVisualLeft = relX - leftZoneWidth;\n\n let absX: number;\n if (isActuallyRtl) {\n const scrollFromRight = hasNegativeScroll\n ? -container.scrollLeft\n : container.scrollWidth - container.clientWidth - container.scrollLeft;\n absX = scrollFromRight + (centerZoneWidth - distFromVisualLeft);\n } else {\n absX = container.scrollLeft + distFromVisualLeft;\n }\n\n columnId = center[center.length - 1]?.id ?? columnIds[columnIds.length - 1] ?? \"\";\n let cw = 0;\n for (const col of center) {\n cw += col.getSize();\n if (absX < cw) {\n columnId = col.id;\n break;\n }\n }\n }\n }\n\n if (!columnId) {\n columnId = range?.end.columnId ?? columnIds[0] ?? \"\";\n }\n\n if (range && (rowIndex !== range.end.rowIndex || columnId !== range.end.columnId)) {\n dragDepsRef.current.selectRange(range.start, { rowIndex, columnId }, true);\n lastSelectionTime = now;\n }\n\n rafId = requestAnimationFrame(tick);\n }\n\n function onMove(event: MouseEvent) {\n mouseX = event.clientX;\n mouseY = event.clientY;\n mouseReady = true;\n }\n\n function onUp() {\n onAutoScrollStop();\n const st = store.getState();\n if (st.selectionState.isSelecting) {\n store.setState(\"selectionState\", {\n ...st.selectionState,\n isSelecting: false\n });\n }\n }\n\n function onAutoScrollStart() {\n if (active) return;\n\n const container = dataGridRef.current;\n if (!container) return;\n\n active = true;\n mouseReady = false;\n cachedRect = null;\n lastSelectionTime = 0;\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n resizeObserver = new ResizeObserver(() => {\n const currentContainer = dataGridRef.current;\n if (currentContainer) cacheLayout(currentContainer);\n });\n resizeObserver.observe(container);\n rafId = requestAnimationFrame(() => {\n const currentContainer = dataGridRef.current;\n if (currentContainer) cacheLayout(currentContainer);\n rafId = requestAnimationFrame(tick);\n });\n }\n\n function onAutoScrollStop() {\n if (!active) return;\n active = false;\n cachedRect = null;\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n resizeObserver?.disconnect();\n resizeObserver = null;\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n }\n\n if (store.getState().selectionState.isSelecting) onAutoScrollStart();\n\n const onUnsubscribe = store.subscribe(() => {\n const st = store.getState();\n if (st.selectionState.isSelecting && !active) onAutoScrollStart();\n else if (!st.selectionState.isSelecting && active) onAutoScrollStop();\n });\n\n return () => {\n onAutoScrollStop();\n onUnsubscribe();\n };\n }, [store, dragDepsRef]);\n\n useIsomorphicLayoutEffect(() => {\n const rafId = requestAnimationFrame(() => {\n rowVirtualizer.measure();\n });\n return () => cancelAnimationFrame(rafId);\n }, [\n rowHeight,\n table.getState().columnFilters,\n table.getState().columnOrder,\n table.getState().columnPinning,\n table.getState().columnSizing,\n table.getState().columnVisibility,\n table.getState().expanded,\n table.getState().globalFilter,\n table.getState().grouping,\n table.getState().rowSelection,\n table.getState().sorting\n ]);\n\n const virtualTotalSize = rowVirtualizer.getTotalSize();\n const virtualItems = rowVirtualizer.getVirtualItems();\n const measureElement = rowVirtualizer.measureElement;\n\n return React.useMemo(\n () => ({\n dataGridRef,\n dataGridElementRef,\n headerRef,\n rowMapRef,\n footerRef,\n dir,\n table,\n tableMeta,\n virtualTotalSize,\n virtualItems,\n measureElement,\n columns,\n columnSizeVars,\n searchState,\n searchMatchesByRow,\n activeSearchMatch,\n cellSelectionMap,\n focusedCell,\n editingCell,\n rowHeight,\n contextMenu,\n pasteDialog,\n onRowAdd: hasRowAdd ? onRowAdd : undefined,\n adjustLayout,\n locale\n }),\n [\n hasRowAdd,\n dataGridElementRef,\n dir,\n table,\n tableMeta,\n virtualTotalSize,\n virtualItems,\n measureElement,\n columns,\n columnSizeVars,\n searchState,\n searchMatchesByRow,\n activeSearchMatch,\n cellSelectionMap,\n focusedCell,\n editingCell,\n rowHeight,\n contextMenu,\n pasteDialog,\n onRowAdd,\n adjustLayout,\n locale\n ]\n );\n}\n\nexport { type UseDataGridProps, useDataGrid };\n"],"mappings":"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","names":["updates","tableColumns","currentTable","rowVirtualizer","rowHeightValue","dataGridElement","isInDataGrid","dir","columnIds","columns"]}