@supos-grid-table/core 0.1.0-alpha.1 → 0.1.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/SHADCN.json +117 -0
- package/dist/{grid-DqJTLeBs.mjs → grid-DeVIC26t.mjs} +109 -124
- package/dist/grid-DeVIC26t.mjs.map +1 -0
- package/dist/grid.d.mts +2 -2
- package/dist/grid.mjs +1 -1
- package/dist/react.d.mts +1 -1
- package/dist/react.mjs +424 -211
- package/dist/react.mjs.map +1 -1
- package/dist/style.css +2 -1
- package/dist/ui-esOhDo-4.mjs +946 -0
- package/dist/ui-esOhDo-4.mjs.map +1 -0
- package/dist/ui.d.mts +183 -0
- package/dist/ui.mjs +2 -0
- package/licenses/@base-ui_react-LICENSE +21 -0
- package/licenses/DEPENDENCIES.json +49 -9
- package/licenses/Shadcn-MIT.txt +21 -0
- package/licenses/class-variance-authority-LICENSE +190 -0
- package/licenses/cmdk-LICENSE.md +21 -0
- package/licenses/cn-LICENSE +21 -0
- package/licenses/lucide-react-LICENSE +7 -3
- package/licenses/tw-animate-css-LICENSE +21 -0
- package/package.json +53 -18
- package/dist/grid-DqJTLeBs.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid-DqJTLeBs.mjs","names":["Search","inRange","inRange","columnStatisticHeight","columnFreezeHandlerWidth","rowHeadIconPaddingTop","groupHeaderHeight","fillHandlerSize","columnHeadPadding","columnResizeHandlerWidth","KeyCode","inRange","Plus","X","ChevronDown","inRange","inRange","KeyCode","Check","cellHorizontalPadding","inRange","positionCache","cellHorizontalPadding","inRange","cellHorizontalPadding","cellVerticalPaddingXS","cellVerticalPaddingXS","cellHorizontalPadding","cellHorizontalPadding","cellVerticalPaddingMD","cellTextLineHeight","maxRowCount","cellHorizontalPadding","cellVerticalPaddingMD","cellTextLineHeight","maxRowCount","cellHorizontalPadding","cellHorizontalPadding","inRange","positionCache","addBtnSize","cellHorizontalPadding","maxRowCount","cellVerticalPaddingMD","cellTextLineHeight","cellHorizontalPadding","maxRowCount","cellVerticalPaddingSM","cellHorizontalPadding","textWidth","cellScrollBarPaddingY","cellScrollBarPaddingY","columnHeadHeight","columnAppendBtnWidth","columnStatisticHeight","defaultRowHeight","X","inRange","columnAppendBtnWidth","inRange","columnHeadHeight","columnAppendBtnWidth","inRange","ReactHammer"],"sources":["../src/grid-adapter/core.ts","../src/grid-adapter/ui.tsx","../src/vendor/grid/renderers/cell-renderer/interface.ts","../src/vendor/grid/interface.ts","../src/vendor/grid/configs/grid.ts","../src/vendor/grid/utils/utils.ts","../src/vendor/grid/utils/range.ts","../src/vendor/grid/utils/group.ts","../src/vendor/grid/utils/rowControl.ts","../src/vendor/grid/utils/region.ts","../src/vendor/grid/utils/hotkey.ts","../src/vendor/grid/utils/measure.ts","../src/vendor/grid/utils/element.ts","../src/vendor/grid/utils/freeze.ts","../src/vendor/grid/utils/paste.ts","../src/vendor/grid/configs/gridTheme.ts","../src/vendor/grid/hooks/useDrag.ts","../src/vendor/grid/managers/image-manager/ImageManager.ts","../src/vendor/grid/managers/sprite-manager/sprites.tsx","../src/vendor/grid/managers/sprite-manager/SpriteManager.ts","../src/vendor/grid/managers/selection-manager/CombinedSelection.ts","../src/vendor/grid/managers/coordinate-manager/interface.ts","../src/vendor/grid/managers/coordinate-manager/CoordinateManager.ts","../src/vendor/grid/managers/performance-tracker/PerformanceTracker.ts","../src/vendor/grid/hooks/useSelection.ts","../src/vendor/grid/hooks/useAutoScroll.ts","../src/vendor/grid/hooks/useColumnResize.ts","../src/vendor/grid/hooks/useColumnFreeze.ts","../src/vendor/grid/hooks/useEventListener.ts","../src/vendor/grid/hooks/useVisibleRegion.ts","../src/vendor/grid/hooks/useResizeObserver.ts","../src/vendor/grid/hooks/useKeyboardSelection.ts","../src/vendor/grid/components/editor/BooleanEditor.tsx","../src/vendor/grid/components/editor/RatingEditor.tsx","../src/grid-adapter/hooks.ts","../src/vendor/grid/components/editor/SelectEditor.tsx","../src/vendor/grid/text-direction.ts","../src/vendor/grid/renderers/base-renderer/baseRenderer.ts","../src/vendor/grid/renderers/cell-renderer/booleanCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/buttonCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/chartCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/imageCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/linkCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/loadingCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/numberCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/ratingCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/selectCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/textCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/userCellRenderer.ts","../src/vendor/grid/renderers/cell-renderer/utils.ts","../src/vendor/grid/renderers/cell-renderer/index.ts","../src/vendor/grid/renderers/layout-renderer/layoutRenderer.ts","../src/vendor/grid/components/editor/TextEditor.tsx","../src/vendor/grid/components/editor/EditorContainer.tsx","../src/vendor/grid/components/LoadingIndicator.tsx","../src/grid-adapter/i18n.ts","../src/vendor/grid/components/ErrorIndicator.tsx","../src/vendor/grid/utils/scrollbar.ts","../src/vendor/grid/InfiniteScroller.tsx","../src/vendor/grid/CellScroller.tsx","../src/vendor/grid/RenderLayer.tsx","../src/vendor/grid/InteractionLayer.tsx","../src/grid-adapter/touch.tsx","../src/vendor/grid/TouchLayer.tsx","../src/vendor/grid/Grid.tsx"],"sourcesContent":["export enum Colors { Gray = 'gray' }\nexport type IButtonFieldCellValue = { count?: number; resetAt?: string } | null;\nexport interface IButtonFieldOptions { label: string; color: string; confirm?: boolean | string }\nexport function getRandomString(length: number) {\n const bytes = crypto.getRandomValues(new Uint8Array(length));\n return Array.from(bytes, (byte) => byte.toString(36)).join('').slice(0, length);\n}\nexport function contractColorForTheme(color: string, _theme?: string) { return color; }\nexport function getSelectColorPairs(color: string, _theme?: string) {\n return color.toLowerCase().includes('gray')\n ? { color: '#475569', backgroundColor: '#e2e8f0' }\n : { color: '#155e75', backgroundColor: '#cffafe' };\n}\n","import {\n createContext, forwardRef, useContext, useState,\n type HTMLAttributes, type InputHTMLAttributes, type ButtonHTMLAttributes, type PropsWithChildren,\n} from 'react';\n\nexport const cn = (...values: (string | false | null | undefined)[]) => values.filter(Boolean).join(' ');\nexport const useUiDirection = () => 'ltr' as const;\nexport const Input = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>((props, ref) => (\n <input {...props} ref={ref} />\n));\nexport const Button = ({ size: _size, variant: _variant, ...props }:\n ButtonHTMLAttributes<HTMLButtonElement> & { size?: string; variant?: string }) => <button type=\"button\" {...props} />;\n\nconst Search = createContext({ query: '', setQuery: (_value: string) => {} });\nexport function Command(props: HTMLAttributes<HTMLDivElement>) {\n const [query, setQuery] = useState('');\n return <Search.Provider value={{ query, setQuery }}><div {...props} role=\"group\" /></Search.Provider>;\n}\nexport const CommandInput = forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>((props, ref) => {\n const search = useContext(Search);\n return <input {...props} ref={ref} value={search.query} onChange={(e) => search.setQuery(e.target.value)} aria-label=\"搜索选项\" />;\n});\nexport const CommandList = (props: HTMLAttributes<HTMLDivElement>) => <div {...props} style={{ maxHeight: 260, overflow: 'auto' }} />;\nexport const CommandGroup = (props: HTMLAttributes<HTMLDivElement>) => <div {...props} />;\nexport const CommandEmpty = (_props: PropsWithChildren) => null;\nexport function CommandItem({ value, onSelect, ...props }: Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onSelect'> & {\n value: string; onSelect: () => void;\n}) {\n const { query } = useContext(Search);\n return value.toLocaleLowerCase().includes(query.toLocaleLowerCase()) ?\n <button {...props} type=\"button\" onClick={onSelect} style={{ display: 'flex', width: '100%', padding: '6px 8px' }} /> : null;\n}\nexport const TooltipProvider = ({ children }: PropsWithChildren<{ delayDuration?: number }>) => children;\nexport const Tooltip = ({ children }: PropsWithChildren) => <span className=\"sg-tooltip\">{children}</span>;\nexport const TooltipTrigger = ({ children }: PropsWithChildren<{ asChild?: boolean }>) => <span tabIndex={0}>{children}</span>;\nexport const TooltipContent = ({ children, className }: PropsWithChildren<{ side?: string; align?: string; className?: string }>) =>\n <span role=\"tooltip\" className={cn('sg-tooltip-content', className)}>{children}</span>;\n","import type { IButtonFieldCellValue, IButtonFieldOptions } from '../../../../grid-adapter/core';\nimport type { CSSProperties, ForwardRefRenderFunction } from 'react';\nimport type { IButtonClickStatusHook } from '../../../../grid-adapter/types';\nimport type { Record as IRecord } from '../../../../grid-adapter/types';\nimport type { IUrlMatch } from '../../../../grid-adapter/types';\nimport type { IEditorProps, IEditorRef } from '../../components';\nimport type { IGridTheme } from '../../configs';\nimport type { IActiveCellBound, ICellPosition, IRectangle } from '../../interface';\nimport type { ImageManager, SpriteManager } from '../../managers';\n\nexport enum CellType {\n Text = 'Text',\n Link = 'Link',\n Number = 'Number',\n Select = 'Select',\n Image = 'Image',\n Chart = 'Chart',\n Rating = 'Rating',\n User = 'User',\n Boolean = 'Boolean',\n Loading = 'Loading',\n Button = 'Button',\n}\n\nexport enum EditorType {\n Text = 'Text',\n Number = 'Number',\n Select = 'Select',\n Custom = 'Custom',\n}\n\nexport type ICustomEditor = ForwardRefRenderFunction<IEditorRef, IEditorProps>;\n\nexport interface IBaseCell {\n id?: string;\n readonly?: boolean;\n cursor?: CSSProperties['cursor'];\n contentAlign?: 'left' | 'right' | 'center';\n lastUpdated?: string;\n customTheme?: Partial<IGridTheme>;\n locked?: boolean;\n hidden?: boolean;\n}\n\nexport interface IEditableCell extends IBaseCell {\n editorWidth?: number;\n customEditor?: ICustomEditor;\n readonlyCustomEditor?: boolean;\n}\n\nexport interface ILoadingCell extends IBaseCell {\n type: CellType.Loading;\n}\n\nexport interface ITextCell extends IEditableCell {\n type: CellType.Text;\n data: string;\n displayData: string;\n isWrap?: boolean;\n // URL ranges inside displayData, drawn and clickable as links\n links?: IUrlMatch[];\n onLinkClick?: (url: string) => void;\n}\n\nexport interface ILinkCell extends IEditableCell {\n type: CellType.Link;\n data: string[];\n displayData: string;\n onClick?: (value: string) => void;\n}\n\nexport enum NumberDisplayType {\n Ring = 'ring',\n Bar = 'bar',\n}\n\nexport interface INumberShowAs {\n type: NumberDisplayType;\n color: string;\n maxValue: number;\n showValue: boolean;\n}\n\nexport interface INumberCell extends IEditableCell {\n type: CellType.Number;\n data: number | null | undefined;\n displayData: string | string[];\n showAs?: INumberShowAs;\n}\n\nexport enum ChartType {\n Bar = 'bar',\n Line = 'line',\n}\n\nexport interface IChartCell extends IEditableCell {\n type: CellType.Chart;\n data: number[];\n displayData: string[];\n chartType?: ChartType;\n color?: string;\n}\n\nexport interface IBooleanCell extends IEditableCell {\n type: CellType.Boolean;\n data: boolean;\n isMultiple?: boolean;\n}\n\nexport interface IRatingCell extends IEditableCell {\n type: CellType.Rating;\n data: number;\n icon: string;\n color: string;\n max: number;\n}\n\nexport interface ISelectChoice {\n id: string;\n name: string;\n color?: string;\n backgroundColor?: string;\n}\n\nexport interface ISelectChoiceSorted {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\nexport interface ISelectCell extends IEditableCell {\n type: CellType.Select;\n data: (string | { title: string; id: string })[];\n displayData: string[];\n choiceMap?: Record<string, ISelectChoice>;\n choiceSorted?: ISelectChoiceSorted[];\n isMultiple?: boolean;\n isEditingOnClick?: boolean;\n showAddButton?: boolean;\n onPreview?: (activeId: string) => void;\n}\n\nexport interface IImageData {\n id: string;\n url: string;\n /** Drawn in place of `url` once loading it has failed. */\n fallbackUrl?: string;\n width?: number;\n height?: number;\n}\n\nexport interface IImageCell extends IEditableCell {\n type: CellType.Image;\n data: IImageData[];\n displayData: string[];\n onPreview?: (activeId: string) => void;\n}\n\nexport interface IUserData {\n id: string;\n name: string;\n email?: string;\n avatarUrl?: string;\n isSystem?: boolean;\n}\n\nexport interface IUserCell extends IEditableCell {\n type: CellType.User;\n data: IUserData[];\n displayData?: string;\n}\n\nexport interface IButtonCell extends IEditableCell {\n type: CellType.Button;\n data: {\n cellValue: IButtonFieldCellValue;\n fieldOptions: IButtonFieldOptions;\n tableId: string;\n statusHook?: IButtonClickStatusHook;\n record?: IRecord;\n };\n}\n\nexport type IInnerCell =\n | ITextCell\n | ILinkCell\n | INumberCell\n | ISelectCell\n | IImageCell\n | IRatingCell\n | IBooleanCell\n | IChartCell\n | IUserCell\n | IButtonCell;\n\nexport type ICell = IInnerCell | ILoadingCell;\n\nexport type ICellRenderProps = {\n ctx: CanvasRenderingContext2D;\n theme: IGridTheme;\n rect: IRectangle;\n rowIndex: number;\n columnIndex: number;\n imageManager: ImageManager;\n spriteManager: SpriteManager;\n hoverCellPosition?: ICellPosition | null;\n isActive?: boolean;\n};\n\nexport interface ICellClickProps {\n width: number;\n height: number;\n theme: IGridTheme;\n isActive: boolean;\n activeCellBound: IActiveCellBound | null;\n hoverCellPosition: ICellPosition;\n}\n\nexport interface ICellMeasureProps {\n ctx: CanvasRenderingContext2D;\n theme: IGridTheme;\n width: number;\n height: number;\n}\n\nexport interface ICellMeasureResult {\n width: number;\n height: number;\n totalHeight: number;\n}\n\nexport enum CellRegionType {\n Blank = 'blank',\n Update = 'update',\n Preview = 'preview',\n ToggleEditing = 'toggleEditing',\n Hover = 'hover',\n}\n\nexport interface ICellRegionWithBlank {\n type: CellRegionType.Blank;\n}\n\nexport interface ICellRegionWithData {\n type:\n | CellRegionType.Update\n | CellRegionType.ToggleEditing\n | CellRegionType.Preview\n | CellRegionType.Blank\n | CellRegionType.Hover;\n data: unknown;\n}\n\nexport type ICellRegion = ICellRegionWithData | ICellRegionWithBlank;\n\nexport type ICellClickCallback = (cellRegion: ICellRegionWithData) => void;\n\nexport interface IBaseCellRenderer<T extends ICell> {\n // Rendering\n type: T['type'];\n draw: (cell: T, props: ICellRenderProps) => void;\n needsHover?: boolean;\n // A function lets a renderer opt in per cell, so only cells that have\n // clickable parts pay for hover-position tracking\n needsHoverPosition?: boolean | ((cell: T) => boolean);\n needsHoverWhenActive?: boolean;\n needsHoverPositionWhenActive?: boolean;\n measure?: (cell: T, props: ICellMeasureProps) => ICellMeasureResult;\n\n // Interaction\n checkRegion?: (cell: T, props: ICellClickProps, shouldCalculate?: boolean) => ICellRegion;\n onClick?: (cell: T, props: ICellClickProps, callback: ICellClickCallback) => void;\n\n // Editing\n provideEditor?: IProvideEditorCallback<T>;\n}\n\nexport type IProvideEditorCallback<T extends ICell> = (cell: T) => void;\n\nexport interface IInternalCellRenderer<T extends ICell> extends IBaseCellRenderer<T> {\n getAccessibilityString?: (cell: T) => string;\n onPaste?: (val: string, cell: T) => T | undefined;\n}\n","import type { IUser } from '../../grid-adapter/types';\nimport type { IGridTheme } from './configs/gridTheme';\nimport type { ICell } from './renderers/cell-renderer/interface';\nexport * from './renderers/cell-renderer/interface';\n\nexport interface IScrollState {\n scrollTop: number;\n scrollLeft: number;\n isScrolling: boolean;\n}\n\nexport interface IPosition {\n x: number;\n y: number;\n}\n\nexport interface IRegionPosition extends IPosition {\n rowIndex: number;\n columnIndex: number;\n}\n\nexport interface IRectangle {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport enum SelectionRegionType {\n Rows = 'Rows',\n Columns = 'Columns',\n Cells = 'Cells',\n None = 'None',\n}\n\nexport enum RegionType {\n Cell = 'Cell',\n ActiveCell = 'ActiveCell',\n CellValue = 'CellValue',\n AppendRow = 'AppendRow',\n AppendColumn = 'AppendColumn',\n ColumnHeader = 'ColumnHeader',\n GroupStatistic = 'GroupStatistic',\n ColumnStatistic = 'ColumnStatistic',\n ColumnHeaderMenu = 'ColumnHeaderMenu',\n ColumnPrimaryIcon = 'ColumnPrimaryIcon',\n ColumnIcon = 'ColumnIcon',\n ColumnDescription = 'ColumnDescription',\n ColumnResizeHandler = 'ColumnResizeHandler',\n ColumnFreezeHandler = 'ColumnFreezeHandler',\n RowHeaderDragHandler = 'RowHeaderDragHandler',\n RowHeaderExpandHandler = 'RowHeaderExpandHandler',\n RowHeaderCheckbox = 'RowHeaderCheckbox',\n RowGroupControl = 'RowGroupControl',\n RowGroupHeader = 'RowGroupHeader',\n RowCountLabel = 'RowCountLabel',\n RowHeader = 'RowHeader',\n AllCheckbox = 'AllCheckbox',\n FillHandler = 'FillHandler',\n Blank = 'Blank',\n None = 'None',\n}\n\nexport type ICellRange = [colIndex: number, rowIndex: number]; // The beginning and the end come in pairs\nexport type IColumnRange = [colStartIndex: number, colEndIndex: number];\nexport type IRowRange = [rowStartIndex: number, rowEndIndex: number];\nexport type IRange = ICellRange | IColumnRange | IRowRange;\n\nexport interface IMouseState extends IRegionPosition {\n type: RegionType;\n isOutOfBounds: boolean;\n}\n\nexport interface IColumnStatistics {\n [columnId: string]: IColumnStatistic | null;\n}\n\nexport interface IColumnStatistic {\n total: string;\n [key: string]: string;\n}\n\nexport interface IGridColumn {\n id?: string;\n name: string;\n icon?: string;\n width?: number;\n hasMenu?: boolean;\n readonly?: boolean;\n isPrimary?: boolean;\n description?: string;\n statisticLabel?: {\n showAlways: boolean;\n label: string;\n };\n customTheme?: Partial<IGridTheme>;\n}\n\nexport interface IColumnResizeState {\n columnIndex: number;\n width: number;\n x: number;\n}\n\nexport interface IColumnFreezeState {\n sourceIndex: number;\n targetIndex: number;\n isFreezing: boolean;\n}\n\nexport interface IDragState {\n type: DragRegionType;\n delta: number;\n ranges: IRange[];\n isDragging: boolean;\n}\n\nexport enum DragRegionType {\n Rows = 'Rows',\n Columns = 'Columns',\n None = 'None',\n}\n\nexport type IScrollDirection = -1 | 0 | 1;\n\nexport enum MouseButtonType {\n Left = 0,\n Center = 1,\n Right = 2,\n}\n\nexport enum RowControlType {\n Spacer = 'Spacer',\n Drag = 'Drag',\n Expand = 'Expand',\n Checkbox = 'Checkbox',\n}\n\nexport interface IRowControlItem {\n type: RowControlType;\n icon?: string;\n}\n\nexport type ICellItem = [colIndex: number, rowIndex: number];\n\nexport type ICollaborator = {\n activeCell?: ICellItem;\n activeCellId: [recordId: string, field: string];\n user: Omit<IUser, 'phone'>;\n borderColor: string;\n timeStamp: number;\n}[];\n\nexport type ICellPosition = [x: number, y: number];\n\nexport interface IPositionWithBounds {\n bounds: IRectangle;\n eventPosition: IPosition;\n}\n\nexport enum DraggableType {\n All = 'all',\n None = 'none',\n Column = 'column',\n Row = 'row',\n}\n\nexport enum GridCustomIcon {\n Description = 'description',\n}\n\nexport enum SelectableType {\n All = 'all',\n None = 'none',\n Column = 'column',\n Row = 'row',\n Cell = 'cell',\n}\n\nexport interface IActiveCellBound {\n rowIndex: number;\n columnIndex: number;\n width: number;\n height: number;\n totalHeight: number;\n scrollTop: number;\n scrollEnable: boolean;\n}\n\nexport enum LinearRowType {\n Group = 0,\n Row = 1,\n Append = 2,\n}\n\nexport interface IGroupHeaderPoint {\n id: string;\n type: LinearRowType.Group;\n depth: number;\n value?: unknown;\n isCollapsed?: boolean;\n}\n\nexport interface IGroupRowPoint {\n type: LinearRowType.Row;\n count: number;\n}\n\nexport interface IGroupAddButtonPoint {\n type: LinearRowType.Append;\n}\n\nexport type IGroupPoint = IGroupHeaderPoint | IGroupRowPoint | IGroupAddButtonPoint;\n\nexport type ILinearRow =\n | {\n type: LinearRowType.Row;\n displayIndex: number;\n realIndex: number;\n }\n | {\n id: string;\n type: LinearRowType.Group;\n value: unknown;\n depth: number;\n realIndex: number;\n isCollapsed: boolean;\n }\n | {\n type: LinearRowType.Append;\n value: unknown;\n realIndex: number;\n };\n\nexport interface IGroupCollection {\n groupColumns: IGridColumn[];\n getGroupCell: (cellValue: unknown, depth: number) => ICell;\n}\n\nexport interface IColumnLoading {\n index: number;\n progress: number;\n onCancel?: () => void;\n}\n\nexport interface ICellError {\n cellItem: ICellItem;\n errorMsg: string;\n onRetry?: () => void;\n onDismiss?: () => void;\n}\n","import { DragRegionType, RegionType } from '../interface';\n\nexport const GRID_CONTAINER_ATTR = 'data-t-grid-container';\n\nexport const GRID_DEFAULT = {\n // Row\n rowHeight: 32,\n rowHeadWidth: 70,\n rowHeadIconPaddingTop: 8,\n appendRowHeight: 32,\n groupHeaderHeight: 48,\n maxRowCount: 5,\n\n // Column\n columnWidth: 150,\n columnHeadHeight: 32,\n columnHeadMenuSize: 12,\n columnHeadMenuClickableSize: 20,\n columnHeadPadding: 8,\n columnAppendBtnWidth: 100,\n columnResizeHandlerWidth: 5,\n columnResizeHandlerPaddingTop: 4,\n columnFreezeHandlerWidth: 8,\n columnFreezeHandlerHeight: 30,\n\n // Cell\n cellHorizontalPadding: 8,\n cellVerticalPaddingXS: 3,\n cellVerticalPaddingSM: 6,\n cellVerticalPaddingMD: 10,\n cellVerticalPaddingLG: 16,\n cellTextLineHeight: 22,\n fillHandlerSize: 5,\n fillHandlerPadding: 8,\n\n // Statistics\n columnStatisticHeight: 40,\n minColumnStatisticWidth: 110,\n\n // Others\n scrollBuffer: 100,\n cellScrollBuffer: 16,\n cellScrollBarWidth: 5,\n cellScrollBarMinHeight: 16,\n cellScrollBarPaddingX: 1,\n cellScrollBarPaddingY: 4,\n cellEditorEdgePadding: 32,\n};\n\nexport const DEFAULT_MOUSE_STATE = {\n x: 0,\n y: 0,\n rowIndex: -Infinity,\n columnIndex: -Infinity,\n type: RegionType.None,\n isOutOfBounds: true,\n};\n\nexport const DEFAULT_SCROLL_STATE = {\n scrollTop: 0,\n scrollLeft: 0,\n isScrolling: false,\n};\n\nexport const DEFAULT_COLUMN_RESIZE_STATE = {\n columnIndex: -1,\n width: 0,\n x: 0,\n};\n\nexport const DEFAULT_DRAG_STATE = {\n type: DragRegionType.None,\n ranges: [],\n delta: 0,\n isDragging: false,\n};\n\nexport const DEFAULT_FREEZE_COLUMN_STATE = {\n sourceIndex: -1,\n targetIndex: -1,\n isFreezing: false,\n};\n\nexport const ROW_RELATED_REGIONS = new Set([\n RegionType.Cell,\n RegionType.RowHeader,\n RegionType.RowHeaderCheckbox,\n RegionType.RowHeaderDragHandler,\n RegionType.RowHeaderExpandHandler,\n]);\n","export type ITimeoutID = {\n id: number;\n};\n\nexport const cancelTimeout = (timeoutID: ITimeoutID) => {\n cancelAnimationFrame(timeoutID.id);\n};\n\nexport const requestTimeout = (callback: () => void, delay: number): ITimeoutID => {\n const start = Date.now();\n\n function tick() {\n if (Date.now() - start >= delay) {\n callback();\n } else {\n timeoutID.id = requestAnimationFrame(tick);\n }\n }\n\n const timeoutID: ITimeoutID = {\n id: requestAnimationFrame(tick),\n };\n return timeoutID;\n};\n\nexport const getWheelDelta = ({\n event,\n pageHeight,\n lineHeight,\n}: {\n event: WheelEvent;\n pageHeight?: number;\n lineHeight?: number;\n}) => {\n let [x, y] = [event.deltaX, event.deltaY];\n if (x === 0 && event.shiftKey) {\n [y, x] = [0, y];\n }\n\n // This value is approximate, it does not have to be precise.\n if (event.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n y *= lineHeight ?? 32;\n } else if (event.deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n y *= pageHeight ?? document.body.clientHeight - 180;\n }\n return [x, y];\n};\n\nexport const hexToRGBA = (hex: string, alpha = 1) => {\n const [r, g, b] = parseToRGB(hex);\n if (r == null || g == null || b == null) return hex;\n return `rgba(${+r},${+g},${+b},${alpha})`;\n};\n\nexport const parseToRGB = (hex: string) => {\n let r, g, b;\n\n if (hex.length === 4) {\n r = '0x' + hex[1] + hex[1];\n g = '0x' + hex[2] + hex[2];\n b = '0x' + hex[3] + hex[3];\n } else if (hex.length === 7) {\n r = '0x' + hex[1] + hex[2];\n g = '0x' + hex[3] + hex[4];\n b = '0x' + hex[5] + hex[6];\n }\n if (r == null || g == null || b == null) return [];\n return [+r, +g, +b];\n};\n","import type { ICellItem, IRange } from '../interface';\nimport type { CombinedSelection } from '../managers';\n\nexport const isRangeWithinRanges = (checkedRange: IRange, ranges: IRange[]) => {\n const [checkedStart, checkedEnd] = checkedRange;\n\n for (const range of ranges) {\n const [rangeStart, rangeEnd] = range;\n\n if (rangeStart <= checkedStart && rangeEnd >= checkedEnd) {\n return true;\n }\n }\n return false;\n};\n\nexport const flatRanges = (ranges: IRange[]): number[] => {\n const result: number[] = [];\n for (const range of ranges) {\n for (let i = range[0]; i <= range[1]; i++) {\n result.push(i);\n }\n }\n return result;\n};\n\nexport const isPointInsideRectangle = (\n checkPoint: [number, number],\n startPoint: [number, number],\n endPoint: [number, number]\n): boolean => {\n const [checkX, checkY] = checkPoint;\n const [startX, startY] = startPoint;\n const [endX, endY] = endPoint;\n\n const minX = Math.min(startX, endX);\n const maxX = Math.max(startX, endX);\n const minY = Math.min(startY, endY);\n const maxY = Math.max(startY, endY);\n\n return checkX >= minX && checkX <= maxX && checkY >= minY && checkY <= maxY;\n};\n\nexport const inRange = (num: number, start: number, end: number) => {\n if (start > end) {\n return num >= end && num <= start;\n }\n return num >= start && num <= end;\n};\n\nexport const serializedRanges = (ranges: IRange[]): IRange[] => {\n if (ranges.length <= 1) {\n return ranges;\n }\n\n const sortedRanges = [...ranges].sort((a, b) => a[0] - b[0]);\n const mergedRanges: IRange[] = [];\n let currentRange: IRange = [...sortedRanges[0]];\n\n for (let i = 1; i < sortedRanges.length; i++) {\n const nextRange = sortedRanges[i];\n if (nextRange[0] <= currentRange[1] + 1) {\n currentRange = [currentRange[0], Math.max(currentRange[1], nextRange[1])];\n } else {\n mergedRanges.push(currentRange);\n currentRange = [...nextRange];\n }\n }\n mergedRanges.push(currentRange);\n\n return mergedRanges;\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const mixRanges = (ranges: IRange[], newRange: IRange): IRange[] => {\n const result: IRange[] = [];\n let added = false;\n\n for (const range of ranges) {\n if (!added && range[0] === newRange[0] && newRange[1] === range[1]) {\n added = true;\n } else if (!added && newRange[0] > range[0] && newRange[1] < range[1]) {\n result.push([range[0], newRange[0] - 1], [newRange[1] + 1, range[1]]);\n added = true;\n } else if (!added && newRange[0] <= range[1] && newRange[1] >= range[0]) {\n if (newRange[0] > range[0]) {\n result.push([range[0], newRange[0] - 1]);\n }\n if (newRange[1] < range[1]) {\n result.push([newRange[1] + 1, range[1]]);\n }\n added = true;\n } else {\n result.push([...range]);\n }\n }\n\n if (!added) {\n result.push(newRange);\n }\n return serializedRanges(result);\n};\n\nexport const calculateMaxRange = (selection: CombinedSelection) => {\n const { isCellSelection, ranges } = selection;\n if (isCellSelection) {\n const [startColIndex, startRowIndex] = ranges[0];\n const [endColIndex, endRowIndex] = ranges[1];\n return [Math.max(startColIndex, endColIndex), Math.max(startRowIndex, endRowIndex)];\n }\n return null;\n};\n\nexport const checkIfRowOrCellActive = (\n activeCell: ICellItem | null,\n rowIndex: number,\n columnIndex: number\n) => {\n if (activeCell == null) {\n return {\n isRowActive: false,\n isCellActive: false,\n };\n }\n const [activeColumnIndex, activeRowIndex] = activeCell;\n return {\n isRowActive: activeRowIndex === rowIndex,\n isCellActive: activeRowIndex === rowIndex && activeColumnIndex === columnIndex,\n };\n};\n\nexport const checkIfRowOrCellSelected = (\n selection: CombinedSelection,\n rowIndex: number,\n columnIndex: number\n) => {\n const { isRowSelection, isCellSelection } = selection;\n if (isRowSelection && selection.includes([rowIndex, rowIndex])) {\n return {\n isRowSelected: true,\n isCellSelected: true,\n };\n }\n if (isCellSelection && selection.includes([columnIndex, rowIndex])) {\n return {\n isRowSelected: false,\n isCellSelected: true,\n };\n }\n return {\n isRowSelected: false,\n isCellSelected: false,\n };\n};\n","import type { IGroupPoint } from '../interface';\n\nexport interface IGroupIndexCollection {\n value: unknown;\n startIndex: number;\n cumulativeCount: number;\n}\n\nexport const createGroupIndexCollections = (data: IGroupPoint[]): IGroupIndexCollection[] => {\n let cumulativeCount = 0;\n const groupIndexCollections: IGroupIndexCollection[] = [];\n\n data.forEach((item, index) => {\n const { type } = item;\n if (type === 0) {\n groupIndexCollections.push({ startIndex: index, cumulativeCount, value: item.value });\n } else if (type === 1) {\n cumulativeCount += item.count ?? 1;\n }\n });\n\n return groupIndexCollections;\n};\n\nexport const binarySearchIndexPoint = (\n indexPoints: IGroupIndexCollection[],\n targetIndex: number\n): IGroupIndexCollection | null => {\n let low = 0;\n let high = indexPoints.length - 1;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const midPoint = indexPoints[mid];\n\n if (midPoint.startIndex === targetIndex) {\n return midPoint;\n } else if (midPoint.startIndex < targetIndex) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n\n return high >= 0 ? indexPoints[high] : null;\n};\n\nexport const getInfoByGroupIndexCollections = (\n groupIndexCollections: IGroupIndexCollection[],\n targetIndex: number\n) => {\n const groupIndexCollection = binarySearchIndexPoint(groupIndexCollections, targetIndex);\n\n if (!groupIndexCollection) {\n return {\n value: null,\n index: -1,\n };\n }\n\n const { value, startIndex, cumulativeCount } = groupIndexCollection;\n const rowsAfterGroupStart = targetIndex - startIndex - 1;\n const realRowIndex = cumulativeCount + rowsAfterGroupStart;\n\n return {\n value,\n index: realRowIndex,\n };\n};\n\n// const indexPoints = createIndexPoints(data);\n\n// const indexToFind = 3;\n// const [groupHeadValue, realRowIndex] = getInfoByIndex(data, indexPoints, indexToFind);\n// console.log(`Group Head Value: ${groupHeadValue}, Real Row Index: ${realRowIndex}`);\n","import type { IGridTheme } from '../configs';\nimport { RowControlType, type IRowControlItem } from '../interface';\n\nexport const getRowControlExtraWidth = (\n theme: IGridTheme,\n rowControlPaddingX: number | undefined\n) => {\n if (!rowControlPaddingX) return 0;\n return Math.max(rowControlPaddingX - (theme.iconSizeMD - theme.iconSizeXS) / 2, 0);\n};\n\nexport const getRowControlLayoutWidth = (\n width: number,\n theme: IGridTheme,\n rowControlPaddingX: number | undefined\n) => {\n return Math.max(width - getRowControlExtraWidth(theme, rowControlPaddingX) * 2, 0);\n};\n\nexport const getRowControlOffsetX = (\n width: number,\n theme: IGridTheme,\n rowControlPaddingX: number | undefined,\n rowControlCount: number,\n rowControlIndex: number\n) => {\n const leadingExtraWidth = getRowControlExtraWidth(theme, rowControlPaddingX);\n const layoutWidth = getRowControlLayoutWidth(width, theme, rowControlPaddingX);\n return leadingExtraWidth + (layoutWidth / (rowControlCount || 1)) * (rowControlIndex + 0.5);\n};\n\n// The comment badge is drawn in place of the expand icon, so it has to sit in\n// the expand control's slot. Hardcoding a slot index breaks as soon as a control\n// is missing — there is no drag handle without `view|update` (a base share, or a\n// read-only collaborator), and the badge then lands on top of the first cell.\nexport const getCommentCountOffsetX = (\n width: number,\n theme: IGridTheme,\n rowControlPaddingX: number | undefined,\n rowControls: IRowControlItem[]\n) => {\n const expandIndex = rowControls.findIndex(({ type }) => type === RowControlType.Expand);\n if (expandIndex === -1) return null;\n return getRowControlOffsetX(width, theme, rowControlPaddingX, rowControls.length, expandIndex);\n};\n\nexport const getRowControlCheckboxOffsetX = ({\n width,\n theme,\n rowControls,\n rowControlPaddingX,\n}: {\n width: number;\n theme: IGridTheme;\n rowControls: IRowControlItem[];\n rowControlPaddingX?: number;\n}) => {\n if (!rowControlPaddingX) return width / 2;\n const checkboxIndex = rowControls.findIndex((item) => item.type === RowControlType.Checkbox);\n if (checkboxIndex < 0) return width / 2;\n return getRowControlOffsetX(width, theme, rowControlPaddingX, rowControls.length, checkboxIndex);\n};\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { GRID_DEFAULT } from '../configs';\nimport { LinearRowType, RegionType, RowControlType } from '../interface';\nimport type {\n IActiveCellBound,\n ICellItem,\n IRectangle,\n IRegionPosition,\n IRowControlItem,\n} from '../interface';\nimport type { IRenderLayerProps } from '../RenderLayer';\nimport { inRange } from './range';\nimport { getRowControlCheckboxOffsetX, getRowControlOffsetX } from './rowControl';\n\ninterface ICheckRegionProps extends Pick<\n IRenderLayerProps,\n | 'theme'\n | 'height'\n | 'columns'\n | 'scrollState'\n | 'dragState'\n | 'selection'\n | 'isSelecting'\n | 'columnResizeState'\n | 'coordInstance'\n | 'columnStatistics'\n | 'isMultiSelectionEnable'\n | 'rowControlPaddingX'\n | 'getLinearRow'\n> {\n rowControls: IRowControlItem[];\n position: IRegionPosition;\n isFreezing: boolean;\n isOutOfBounds: boolean;\n isColumnFreezable: boolean;\n isColumnResizable: boolean;\n isColumnAppendEnable: boolean;\n isColumnHeaderMenuVisible: boolean;\n activeCell: ICellItem | null;\n activeCellBound: IActiveCellBound | null;\n isFillEnabled?: boolean;\n real2RowIndex: (index: number) => number;\n}\n\nexport interface IRegionData extends IRectangle {\n type: RegionType;\n rowIndex?: number;\n columnIndex?: number;\n isOutOfBounds?: boolean;\n}\n\n// Define all possible row controls and their corresponding RegionTypes\nconst rowControlDefinitions: Partial<Record<RowControlType, RegionType>> = {\n [RowControlType.Drag]: RegionType.RowHeaderDragHandler,\n [RowControlType.Checkbox]: RegionType.RowHeaderCheckbox,\n [RowControlType.Expand]: RegionType.RowHeaderExpandHandler,\n};\n\nexport const BLANK_REGION_DATA = {\n type: RegionType.Blank,\n x: Infinity,\n y: Infinity,\n width: 0,\n height: 0,\n};\n\nconst {\n groupHeaderHeight,\n columnHeadPadding,\n columnResizeHandlerWidth,\n rowHeadIconPaddingTop,\n columnStatisticHeight,\n columnFreezeHandlerWidth,\n minColumnStatisticWidth,\n fillHandlerSize,\n fillHandlerPadding,\n} = GRID_DEFAULT;\n\nexport const getRegionData = (props: ICheckRegionProps): IRegionData => {\n return (\n checkIfFreezing(props) ||\n checkIsFillHandler(props) ||\n checkIsActiveCell(props) ||\n checkIsOutOfBounds(props) ||\n checkIfSelecting(props) ||\n checkIfColumnResizing(props) ||\n checkIfDragging(props) ||\n checkIsFreezeColumnHandler(props) ||\n checkIsAppendColumn(props) ||\n checkIsColumnStatistic(props) ||\n checkIsAllCheckbox(props) ||\n checkIsAppendRow(props) ||\n checkIsRowHeader(props) ||\n checkIsRowGroupHeader(props) ||\n checkIsCell(props) ||\n checkIsColumnHeader(props) ||\n BLANK_REGION_DATA\n );\n};\n\nconst checkIfFreezing = (props: ICheckRegionProps): IRegionData | null => {\n const { isFreezing } = props;\n if (!isFreezing) return null;\n return { ...BLANK_REGION_DATA, type: RegionType.ColumnFreezeHandler };\n};\n\nconst checkIsActiveCell = (props: ICheckRegionProps): IRegionData | null => {\n const { coordInstance, scrollState, position, activeCell, activeCellBound, real2RowIndex } =\n props;\n if (activeCell == null || activeCellBound == null) return null;\n const { x, y } = position;\n const { scrollTop, scrollLeft } = scrollState;\n const [columnIndex, rowIndex] = activeCell;\n const linearRowIndex = real2RowIndex(rowIndex);\n // Row not visible (e.g. all groups collapsed): no active-cell region to hit,\n // otherwise getRowOffset falls back to 0 and the phantom region covers the column header\n if (linearRowIndex == null) return null;\n const offsetY = coordInstance.getRowOffset(linearRowIndex) - scrollTop;\n const offsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const { width, height } = activeCellBound;\n\n if (inRange(x, offsetX, offsetX + width) && inRange(y, offsetY, offsetY + height)) {\n return {\n type: RegionType.ActiveCell,\n x: offsetX,\n y: offsetY,\n width,\n height,\n rowIndex: linearRowIndex,\n columnIndex,\n isOutOfBounds: false,\n };\n }\n return null;\n};\n\nconst checkIsOutOfBounds = (props: ICheckRegionProps): IRegionData | null => {\n const { isOutOfBounds } = props;\n return isOutOfBounds ? BLANK_REGION_DATA : null;\n};\n\nconst checkIfSelecting = (props: ICheckRegionProps): IRegionData | null => {\n const { selection, isSelecting } = props;\n if (!isSelecting || !selection.isCellSelection) return null;\n return { ...BLANK_REGION_DATA, type: RegionType.Cell };\n};\n\nconst checkIfColumnResizing = (props: ICheckRegionProps): IRegionData | null => {\n const { columnIndex } = props.columnResizeState;\n if (columnIndex <= -1) return null;\n return { ...BLANK_REGION_DATA, type: RegionType.ColumnResizeHandler };\n};\n\nconst checkIfDragging = (props: ICheckRegionProps): IRegionData | null => {\n const { isDragging } = props.dragState;\n if (!isDragging) return null;\n return { ...BLANK_REGION_DATA, type: RegionType.ColumnHeader };\n};\n\nconst checkIsFreezeColumnHandler = (props: ICheckRegionProps): IRegionData | null => {\n const { position, scrollState, coordInstance, isColumnFreezable } = props;\n if (!isColumnFreezable) return null;\n const { x, y } = position;\n const { scrollTop } = scrollState;\n const { freezeRegionWidth, rowInitSize, rowCount, containerHeight } = coordInstance;\n const offsetY = coordInstance.getRowOffset(rowCount) - scrollTop;\n const maxY = Math.min(offsetY, containerHeight - columnStatisticHeight);\n const halfWidth = columnFreezeHandlerWidth / 2;\n if (\n inRange(x, freezeRegionWidth - halfWidth, freezeRegionWidth + halfWidth) &&\n inRange(y, rowInitSize, maxY)\n ) {\n return { ...BLANK_REGION_DATA, type: RegionType.ColumnFreezeHandler };\n }\n return null;\n};\n\nconst checkIsAppendColumn = (props: ICheckRegionProps): IRegionData | null => {\n const { position, isColumnAppendEnable } = props;\n const { rowIndex, columnIndex } = position;\n if (isColumnAppendEnable && rowIndex >= -1 && columnIndex === -2) {\n return { ...BLANK_REGION_DATA, type: RegionType.AppendColumn };\n }\n return null;\n};\n\nexport const getColumnStatisticData = (\n props: Pick<\n IRenderLayerProps,\n 'height' | 'scrollState' | 'coordInstance' | 'columnStatistics' | 'getLinearRow'\n > & {\n position: IRegionPosition;\n }\n) => {\n const { columnStatistics, scrollState, coordInstance, getLinearRow, position, height } = props;\n if (columnStatistics == null) return null;\n const { scrollLeft, scrollTop } = scrollState;\n const { x, y, rowIndex, columnIndex } = position;\n\n if (rowIndex > -1 && columnIndex > -1) {\n const { type } = getLinearRow(rowIndex);\n const isFirstColumn = columnIndex === 0;\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const columnOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const groupedStatisticX = isFirstColumn\n ? columnOffsetX + columnWidth - minColumnStatisticWidth\n : columnOffsetX;\n\n if (\n type === LinearRowType.Group &&\n inRange(\n x,\n groupedStatisticX,\n groupedStatisticX + (isFirstColumn ? minColumnStatisticWidth : columnWidth)\n )\n ) {\n return {\n type: RegionType.GroupStatistic,\n x: columnOffsetX,\n y: coordInstance.getRowOffset(rowIndex) - scrollTop,\n width: columnWidth,\n height: columnStatisticHeight,\n };\n }\n }\n\n const isBottomRegion = inRange(y, height - columnStatisticHeight, height);\n const isColumnStatistic = isBottomRegion && columnIndex > -1;\n const isRowCountLabel = isBottomRegion && columnIndex === -1;\n\n if (isRowCountLabel) {\n return {\n type: RegionType.RowCountLabel,\n x: 0,\n y: height - columnStatisticHeight,\n width: coordInstance.columnInitSize,\n height: columnStatisticHeight,\n };\n }\n\n if (isColumnStatistic) {\n const { scrollLeft } = scrollState;\n\n return {\n type: RegionType.ColumnStatistic,\n x: coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft),\n y: height - columnStatisticHeight,\n width: coordInstance.getColumnWidth(columnIndex),\n height: columnStatisticHeight,\n };\n }\n\n return null;\n};\n\nconst checkIsColumnStatistic = (props: ICheckRegionProps): IRegionData | null => {\n return getColumnStatisticData(props);\n};\n\nconst checkIsAllCheckbox = (props: ICheckRegionProps): IRegionData | null => {\n const {\n position,\n theme,\n rowControls,\n rowControlPaddingX,\n coordInstance,\n isMultiSelectionEnable,\n } = props;\n const { x, y, rowIndex, columnIndex } = position;\n if (\n !isMultiSelectionEnable ||\n rowIndex !== -1 ||\n columnIndex !== -1 ||\n !rowControls.some((item) => item.type === RowControlType.Checkbox)\n ) {\n return null;\n }\n const { iconSizeXS } = theme;\n const halfIconSize = iconSizeXS / 2;\n const { rowInitSize, columnInitSize } = coordInstance;\n const offsetX = getRowControlCheckboxOffsetX({\n width: columnInitSize,\n theme,\n rowControls,\n rowControlPaddingX,\n });\n const minX = offsetX - halfIconSize;\n const minY = rowInitSize / 2 - halfIconSize;\n if (inRange(x, minX, minX + iconSizeXS) && inRange(y, minY, minY + iconSizeXS)) {\n return {\n type: RegionType.AllCheckbox,\n x: minX,\n y: minY,\n width: iconSizeXS,\n height: iconSizeXS,\n };\n }\n return null;\n};\n\nconst checkIsAppendRow = (props: ICheckRegionProps): IRegionData | null => {\n const { position, getLinearRow } = props;\n const { rowIndex, columnIndex } = position;\n if (columnIndex >= -1 && rowIndex > -1) {\n const { type } = getLinearRow(rowIndex);\n\n if (type !== LinearRowType.Append) return null;\n\n return { ...BLANK_REGION_DATA, type: RegionType.AppendRow };\n }\n return null;\n};\n\nconst checkIsRowHeader = (props: ICheckRegionProps): IRegionData | null => {\n const { position, theme, rowControls, rowControlPaddingX, scrollState, coordInstance } = props;\n const { x, y, rowIndex, columnIndex } = position;\n\n if (rowIndex <= -1 || columnIndex !== -1) return null;\n\n const linearRow = props.getLinearRow(rowIndex);\n\n if (linearRow.type === LinearRowType.Group) {\n return { ...BLANK_REGION_DATA, type: RegionType.RowGroupControl };\n }\n\n if (linearRow.type !== LinearRowType.Row) return null;\n\n const { iconSizeXS } = theme;\n const { scrollTop } = scrollState;\n const { columnInitSize } = coordInstance;\n const halfIconSize = iconSizeXS / 2;\n const offsetY = coordInstance.getRowOffset(rowIndex) - scrollTop;\n\n for (let i = 0; i < rowControls.length; i++) {\n const type = rowControls[i].type;\n const regionType = rowControlDefinitions[type];\n\n const offsetX = getRowControlOffsetX(\n columnInitSize,\n theme,\n rowControlPaddingX,\n rowControls.length,\n i\n );\n const minX = offsetX - halfIconSize;\n const minY = offsetY + rowHeadIconPaddingTop;\n const inControlXRange = inRange(x, minX, minX + iconSizeXS);\n const inYRangeRowHeader = inRange(y, minY, minY + iconSizeXS);\n\n if (regionType && inControlXRange && inYRangeRowHeader) {\n return {\n type: regionType,\n x: minX,\n y: minY,\n width: iconSizeXS,\n height: iconSizeXS,\n };\n }\n }\n\n return { ...BLANK_REGION_DATA, type: RegionType.RowHeader };\n};\n\nconst checkIsRowGroupHeader = (props: ICheckRegionProps): IRegionData | null => {\n const { position, scrollState, coordInstance, getLinearRow } = props;\n const { scrollLeft } = scrollState;\n const { x, y, rowIndex, columnIndex } = position;\n if (rowIndex <= -1 || columnIndex !== 0) return null;\n\n const { type } = getLinearRow(rowIndex);\n\n if (type !== LinearRowType.Group) return null;\n\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const columnOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n\n if (inRange(x, columnOffsetX, columnOffsetX + columnWidth)) {\n return {\n type: RegionType.RowGroupHeader,\n x: columnOffsetX,\n y,\n width: columnWidth,\n height: groupHeaderHeight,\n };\n }\n return null;\n};\n\nconst checkIsFillHandler = (props: ICheckRegionProps): IRegionData | null => {\n const {\n position,\n selection,\n coordInstance: c,\n scrollState,\n activeCell,\n activeCellBound,\n isFillEnabled,\n real2RowIndex,\n } = props;\n if (!isFillEnabled) return null;\n const { isCellSelection, ranges } = selection;\n const { scrollLeft, scrollTop } = scrollState;\n const { x, y, rowIndex: hoverLinearRowIndex, columnIndex: hoverColumnIndex } = position;\n if (!isCellSelection || hoverLinearRowIndex < 0 || hoverColumnIndex < 0) return null;\n const [startColIndex, startRowIndex] = ranges[0];\n const [endColIndex, endRowIndex] = ranges[1];\n const maxColIndex = Math.max(startColIndex, endColIndex);\n const maxRowRealIndex = Math.max(startRowIndex, endRowIndex);\n const maxRowLinearIndex = real2RowIndex(maxRowRealIndex);\n const handlerOffsetX =\n c.getColumnRelativeOffset(maxColIndex, scrollLeft) + c.getColumnWidth(maxColIndex);\n const isSingleCell = startColIndex === endColIndex && startRowIndex === endRowIndex;\n const isSameAsActive =\n isSingleCell &&\n activeCell &&\n activeCellBound &&\n activeCell[0] === maxColIndex &&\n activeCell[1] === maxRowRealIndex;\n const cellHeight =\n isSameAsActive && activeCellBound ? activeCellBound.height : c.getRowHeight(maxRowLinearIndex);\n const handlerOffsetY = c.getRowOffset(maxRowLinearIndex) + cellHeight - scrollTop;\n const halfSize = fillHandlerSize / 2 + fillHandlerPadding;\n\n const minX = handlerOffsetX - halfSize;\n const minY = handlerOffsetY - halfSize;\n if (inRange(x, minX, minX + halfSize * 2) && inRange(y, minY, minY + halfSize * 2)) {\n return {\n type: RegionType.FillHandler,\n x: minX,\n y: minY,\n width: halfSize * 2,\n height: halfSize * 2,\n };\n }\n return null;\n};\n\nconst checkIsCell = (props: ICheckRegionProps): IRegionData | null => {\n const { coordInstance, position, scrollState, getLinearRow } = props;\n const { rowIndex, columnIndex } = position;\n const { scrollLeft, scrollTop } = scrollState;\n if (rowIndex > -1 && columnIndex > -1) {\n const linearRow = getLinearRow(rowIndex);\n\n if (linearRow.type !== LinearRowType.Row) return null;\n\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const y = coordInstance.getRowOffset(rowIndex) - scrollTop;\n const width = coordInstance.getColumnWidth(columnIndex);\n const height = coordInstance.rowHeight;\n return {\n type: RegionType.Cell,\n x,\n y,\n width,\n height,\n };\n }\n return null;\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nconst checkIsColumnHeader = (props: ICheckRegionProps): IRegionData | null => {\n const {\n position,\n scrollState,\n coordInstance,\n columns,\n theme,\n isColumnResizable,\n isColumnHeaderMenuVisible,\n } = props;\n\n const { x, y, rowIndex, columnIndex } = position;\n const { iconSizeXS } = theme;\n\n if (rowIndex === -1 && columnIndex > -1) {\n const { scrollLeft } = scrollState;\n const { rowInitSize } = coordInstance;\n const { icon, isPrimary, description, hasMenu: hasColumnMenu } = columns[columnIndex];\n const hasMenu = hasColumnMenu && isColumnHeaderMenuVisible;\n const width = coordInstance.getColumnWidth(columnIndex);\n const startOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const endOffsetX = startOffsetX + width;\n const columnMenuX = hasMenu ? endOffsetX - columnHeadPadding / 2 - iconSizeXS : endOffsetX;\n\n if (hasMenu && inRange(x, columnMenuX, columnMenuX + iconSizeXS)) {\n return {\n type: RegionType.ColumnHeaderMenu,\n x: startOffsetX,\n y: 0,\n width: iconSizeXS,\n height: rowInitSize,\n };\n }\n\n const descriptionX = columnMenuX - iconSizeXS - columnHeadPadding / 2;\n const descriptionY = (rowInitSize - iconSizeXS) / 2;\n if (\n description &&\n inRange(x, descriptionX, descriptionX + iconSizeXS) &&\n inRange(y, descriptionY, descriptionY + iconSizeXS)\n ) {\n return {\n type: RegionType.ColumnDescription,\n x: descriptionX,\n y: descriptionY,\n width: iconSizeXS,\n height: iconSizeXS,\n };\n }\n\n const primaryIconX = startOffsetX + iconSizeXS / 2;\n const primaryIconY = (rowInitSize - iconSizeXS) / 2;\n\n if (\n isPrimary &&\n inRange(x, primaryIconX, primaryIconX + iconSizeXS) &&\n inRange(y, primaryIconY, primaryIconY + iconSizeXS)\n ) {\n return {\n type: RegionType.ColumnPrimaryIcon,\n x: primaryIconX,\n y: primaryIconY,\n width: iconSizeXS,\n height: iconSizeXS,\n };\n }\n\n const columnIconX =\n startOffsetX + columnHeadPadding + (isPrimary ? iconSizeXS + columnHeadPadding / 2 : 0);\n const columnIconY = (rowInitSize - iconSizeXS) / 2;\n\n if (\n icon === 'calculating' &&\n inRange(x, columnIconX, columnIconX + iconSizeXS) &&\n inRange(y, columnIconY, columnIconY + iconSizeXS)\n ) {\n return {\n type: RegionType.ColumnIcon,\n x: columnIconX,\n y: columnIconY,\n width: iconSizeXS,\n height: iconSizeXS,\n };\n }\n\n if (\n isColumnResizable &&\n ((columnIndex !== 0 &&\n inRange(x, startOffsetX, startOffsetX + columnResizeHandlerWidth / 2)) ||\n inRange(x, endOffsetX - columnResizeHandlerWidth / 2, endOffsetX))\n ) {\n return { ...BLANK_REGION_DATA, type: RegionType.ColumnResizeHandler };\n }\n\n return {\n type: RegionType.ColumnHeader,\n x: startOffsetX,\n y: 0,\n width,\n height: rowInitSize,\n };\n }\n return null;\n};\n","import { Key as KeyCode } from 'ts-keycode-enum';\n\nexport const isPrintableKey = (event: KeyboardEvent) => {\n const { keyCode } = event;\n const { metaKey, ctrlKey } = event;\n\n if (metaKey || ctrlKey || keyCode === KeyCode.Space) return false;\n return (\n (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) ||\n (keyCode >= KeyCode.ClosedParen && keyCode <= KeyCode.OpenParen) ||\n (keyCode >= KeyCode.Numpad0 && keyCode <= KeyCode.Numpad9) ||\n (keyCode >= KeyCode.SemiColon && keyCode <= KeyCode.Tilde) ||\n (keyCode >= KeyCode.OpenBracket && keyCode <= KeyCode.Quote) ||\n (keyCode >= KeyCode.Multiply && keyCode <= KeyCode.Divide) ||\n keyCode === KeyCode.Space ||\n keyCode === 61 ||\n keyCode === 173 ||\n ((keyCode === 229 || keyCode === 0) && event.key !== 'Shift')\n );\n};\n\nexport const isNumberKey = (keyCode: number) => {\n return (\n (keyCode >= KeyCode.ClosedParen && keyCode <= KeyCode.OpenParen) ||\n (keyCode >= KeyCode.Numpad0 && keyCode <= KeyCode.Numpad9)\n );\n};\n","export interface IAutoSize {\n fontFamily?: string;\n fontSize?: number;\n fontWeight?: string;\n fontStyle?: string;\n lineHeight?: number;\n}\n\nexport const MeasuredCanvas = (defaults: IAutoSize = {}) => {\n const {\n fontFamily = 'Inter, Roboto, -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Ubuntu, noto, arial, sans-serif',\n } = defaults;\n if (typeof window === 'undefined' || document?.fonts?.ready == null) return;\n const canvas = document.createElement('canvas');\n const ctx = canvas ? canvas.getContext('2d') : null;\n\n const setFontSize = (fontSize: number) => {\n if (ctx) {\n ctx.font = `${fontSize}px ${fontFamily}`;\n }\n };\n\n const reset = () => setFontSize(13);\n setFontSize(13);\n\n return {\n ctx,\n reset,\n setFontSize,\n };\n};\n\nexport const measuredCanvas = MeasuredCanvas();\n","export const isAncestorOfActiveElement = (id: string): boolean => {\n let activeElement = document.activeElement;\n\n while (activeElement) {\n if (activeElement.id === id) {\n return true;\n }\n activeElement = activeElement.parentElement;\n }\n\n return false;\n};\n","export const MIN_FREEZE_SCROLLABLE_WIDTH = 240;\n\nexport interface IFreezeColumnLimitOptions {\n containerWidth: number;\n columnInitSize: number;\n columnCount: number;\n getColumnWidth: (index: number) => number;\n minScrollableWidth?: number;\n}\n\nexport const getMaxFreezeColumnCount = ({\n containerWidth,\n columnInitSize,\n columnCount,\n getColumnWidth,\n minScrollableWidth = MIN_FREEZE_SCROLLABLE_WIDTH,\n}: IFreezeColumnLimitOptions) => {\n const maxFreezeWidth = containerWidth - minScrollableWidth;\n\n if (maxFreezeWidth <= columnInitSize) {\n return 0;\n }\n\n let freezeWidth = columnInitSize;\n\n for (let index = 0; index < columnCount; index++) {\n freezeWidth += getColumnWidth(index) ?? 0;\n\n if (freezeWidth > maxFreezeWidth) {\n return index;\n }\n }\n\n return columnCount;\n};\n\nexport const canFreezeColumnCount = (\n freezeColumnCount: number,\n options: IFreezeColumnLimitOptions\n) => {\n if (freezeColumnCount <= 0) {\n return true;\n }\n\n return freezeColumnCount <= getMaxFreezeColumnCount(options);\n};\n","/**\n * Decide whether a clipboard paste should go to the grid selection handler.\n *\n * Link/select pickers keep a hidden focus input so Ctrl/Cmd+V can still paste\n * cell values. Visible inputs (search boxes, text editors) keep native paste.\n */\nexport const shouldForwardPasteToGrid = ({\n isEditing,\n eventTarget,\n hiddenFocusEl,\n}: {\n isEditing: boolean;\n eventTarget: EventTarget | null;\n hiddenFocusEl: HTMLElement | null;\n}): boolean => {\n if (!isEditing) {\n return true;\n }\n\n if (eventTarget == null || eventTarget === hiddenFocusEl) {\n return true;\n }\n\n if (!(eventTarget instanceof HTMLElement)) {\n return true;\n }\n\n const tagName = eventTarget.tagName;\n const isContentEditable = eventTarget.isContentEditable || eventTarget.contentEditable === 'true';\n return tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !isContentEditable;\n};\n","import colors from 'tailwindcss/colors';\nimport { hexToRGBA } from '../utils';\n\nexport interface IGridTheme {\n staticWhite: string;\n staticBlack: string;\n iconBgCommon: string;\n iconFgCommon: string;\n iconFgHighlight: string;\n iconBgHighlight: string;\n iconBgSelected: string;\n iconFgSelected: string;\n iconSizeXS: number;\n iconSizeSM: number;\n iconSizeMD: number;\n iconSizeLG: number;\n fontSizeXXS: number;\n fontSizeXS: number;\n fontSizeSM: number;\n fontSizeMD: number;\n fontSizeLG: number;\n fontFamily: string;\n cellBg: string;\n cellBgHovered: string;\n cellBgSelected: string;\n cellBgLoading: string;\n cellLineColor: string;\n cellLineColorActived: string;\n cellTextColor: string;\n cellTextColorHighlight: string;\n cellOptionBg: string;\n cellOptionBgHighlight: string;\n cellOptionTextColor: string;\n groupHeaderBgPrimary: string;\n groupHeaderBgSecondary: string;\n groupHeaderBgTertiary: string;\n columnHeaderBg: string;\n columnHeaderBgHovered: string;\n columnHeaderBgSelected: string;\n columnHeaderNameColor: string;\n columnResizeHandlerBg: string;\n columnDraggingPlaceholderBg: string;\n columnStatisticBgHoveredPrimary: string;\n columnStatisticBgHoveredSecondary: string;\n columnStatisticBgHoveredTertiary: string;\n rowHeaderTextColor: string;\n appendRowBg: string;\n appendRowBgHovered: string;\n avatarBg: string;\n avatarTextColor: string;\n avatarSizeXS: number;\n avatarSizeSM: number;\n avatarSizeMD: number;\n themeKey: string;\n scrollBarBg: string;\n interactionLineColorCommon: string;\n interactionLineColorHighlight: string;\n searchCursorBg: string;\n searchTargetIndexBg: string;\n searchTargetIndexSelectedBg: string;\n commentCountBg: string;\n commentCountTextColor: string;\n}\n\nexport const gridTheme: IGridTheme = {\n // Common\n staticWhite: '#FFFFFF',\n staticBlack: '#000000',\n iconFgCommon: colors.gray[500],\n iconBgCommon: colors.transparent,\n iconFgHighlight: colors.yellow[400],\n iconBgHighlight: colors.yellow[400],\n iconFgSelected: colors.blue[50],\n iconBgSelected: colors.black,\n iconSizeXS: 16,\n iconSizeSM: 20,\n iconSizeMD: 24,\n iconSizeLG: 32,\n fontSizeXXS: 10,\n fontSizeXS: 12,\n fontSizeSM: 13,\n fontSizeMD: 14,\n fontSizeLG: 16,\n fontFamily:\n 'Inter, Roboto, -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, helvetica neue, helvetica, Ubuntu, noto, arial, sans-serif',\n\n // Cell\n cellBg: colors.white,\n cellBgHovered: '#F7F7F7',\n cellBgSelected: '#F0F0F0',\n // cellBgSelected: colors.zinc[100],\n cellBgLoading: hexToRGBA(colors.black, 0.04),\n cellLineColor: colors.zinc[200],\n cellLineColorActived: colors.black,\n cellTextColor: colors.zinc[900],\n cellTextColorHighlight: colors.violet[500],\n cellOptionBg: colors.gray[300],\n cellOptionBgHighlight: colors.zinc[200],\n cellOptionTextColor: colors.black,\n\n // Group Header\n groupHeaderBgPrimary: '#FAFAFA',\n groupHeaderBgSecondary: '#F4F4F5',\n groupHeaderBgTertiary: '#EAEAEB',\n\n // Column Statistic\n columnStatisticBgHoveredPrimary: '#F2F2F2',\n columnStatisticBgHoveredSecondary: '#EDECEC',\n columnStatisticBgHoveredTertiary: '#E3E2E2',\n\n // Column Header\n columnHeaderBg: colors.zinc[50],\n columnHeaderBgHovered: colors.zinc[100],\n columnHeaderBgSelected: colors.zinc[200],\n columnHeaderNameColor: colors.zinc[900],\n columnResizeHandlerBg: colors.blue[500],\n columnDraggingPlaceholderBg: hexToRGBA(colors.black, 0.2),\n\n // Row Header\n rowHeaderTextColor: colors.zinc[500],\n\n // Append Row\n appendRowBg: colors.zinc[50],\n appendRowBgHovered: colors.zinc[100],\n\n // Avatar Theme\n avatarBg: colors.gray[100],\n avatarTextColor: colors.gray[950],\n avatarSizeXS: 16,\n avatarSizeSM: 20,\n avatarSizeMD: 24,\n\n themeKey: 'light',\n\n // ScrollBar\n scrollBarBg: colors.gray[400],\n\n // interaction\n interactionLineColorCommon: colors.zinc[300],\n interactionLineColorHighlight: colors.blue[500],\n\n // search cursor\n searchCursorBg: colors.blue[300],\n searchTargetIndexBg: colors.blue[100],\n searchTargetIndexSelectedBg: colors.blue[200],\n\n // comment\n commentCountBg: colors.orange[400],\n commentCountTextColor: colors.white,\n};\n","import { useRef, useState } from 'react';\nimport { DEFAULT_DRAG_STATE } from '../configs';\nimport type { IDragState, IMouseState, IRange, IScrollState } from '../interface';\nimport { DragRegionType, RegionType, DraggableType } from '../interface';\nimport type { CoordinateManager, CombinedSelection } from '../managers';\nimport { inRange } from '../utils';\n\nexport const getDropTargetIndex = (\n coordInstance: CoordinateManager,\n mouseState: IMouseState,\n scrollState: IScrollState,\n dragType: DragRegionType\n) => {\n const { x, y } = mouseState;\n const { scrollLeft, scrollTop } = scrollState;\n const { freezeRegionWidth, rowInitSize } = coordInstance;\n\n if (dragType === DragRegionType.Columns) {\n const offsetX = x <= freezeRegionWidth ? x : scrollLeft + x;\n const hoverColumnIndex = coordInstance.getColumnStartIndex(offsetX);\n const hoverColumnOffsetX = coordInstance.getColumnOffset(hoverColumnIndex);\n const hoverColumnWidth = coordInstance.getColumnWidth(hoverColumnIndex);\n return inRange(offsetX, hoverColumnOffsetX, hoverColumnOffsetX + hoverColumnWidth / 2)\n ? hoverColumnIndex\n : hoverColumnIndex + 1;\n }\n if (dragType === DragRegionType.Rows) {\n const offsetY = y <= rowInitSize ? y : scrollTop + y;\n const hoverRowIndex = coordInstance.getRowStartIndex(offsetY);\n const hoverRowOffsetY = coordInstance.getRowOffset(hoverRowIndex);\n const hoverRowHeight = coordInstance.getRowHeight(hoverRowIndex);\n return inRange(offsetY, hoverRowOffsetY, hoverRowOffsetY + hoverRowHeight / 2)\n ? hoverRowIndex\n : hoverRowIndex + 1;\n }\n return -Infinity;\n};\n\nexport const useDrag = (\n coordInstance: CoordinateManager,\n scrollState: IScrollState,\n selection: CombinedSelection,\n draggable?: DraggableType\n) => {\n // Prevents Drag and Drop from Being Too Reactive\n const startPosition = useRef(0);\n const [dragState, setDragState] = useState<IDragState>(DEFAULT_DRAG_STATE);\n const { scrollTop, scrollLeft } = scrollState;\n\n const onDragStart = (\n mouseState: IMouseState,\n onEnd: (type: DragRegionType, dragIndexs: IRange[]) => void\n ) => {\n if (draggable === DraggableType.None) return;\n\n const { type, rowIndex: hoverRowIndex, columnIndex: hoverColumnIndex, x, y } = mouseState;\n const { isRowSelection, isColumnSelection, ranges: selectionRanges } = selection;\n\n if (type === RegionType.RowHeaderDragHandler && draggable !== DraggableType.Column) {\n startPosition.current = y;\n const ranges =\n isRowSelection && selection.includes([hoverRowIndex, hoverRowIndex])\n ? selectionRanges\n : ([[hoverRowIndex, hoverRowIndex]] as IRange[]);\n onEnd(DragRegionType.Rows, ranges);\n setDragState({\n type: DragRegionType.Rows,\n ranges,\n delta: y + scrollTop - coordInstance.getRowOffset(hoverRowIndex),\n isDragging: false,\n });\n }\n\n if (type === RegionType.ColumnHeader && draggable !== DraggableType.Row) {\n startPosition.current = x;\n const ranges =\n isColumnSelection && selection.includes([hoverColumnIndex, hoverColumnIndex])\n ? selectionRanges\n : ([[hoverColumnIndex, hoverColumnIndex]] as IRange[]);\n onEnd(DragRegionType.Columns, ranges);\n setDragState({\n type: DragRegionType.Columns,\n ranges,\n delta: x - coordInstance.getColumnRelativeOffset(hoverColumnIndex, scrollLeft),\n isDragging: false,\n });\n }\n };\n\n const onDragChange = (mouseState: IMouseState) => {\n const { type, isDragging } = dragState;\n if (isDragging) return;\n if (![DragRegionType.Rows, DragRegionType.Columns].includes(type)) return;\n\n const { x, y } = mouseState;\n const prevPosition = type === DragRegionType.Rows ? y : x;\n const moveDistance = Math.abs(prevPosition - startPosition.current);\n if (moveDistance < 5) return;\n\n setDragState((prev) => ({ ...prev, isDragging: true }));\n };\n\n const onDragEnd = (\n mouseState: IMouseState,\n onEnd: (dragIndexs: IRange[], dropIndex: number) => void\n ) => {\n const { type, isDragging } = dragState;\n\n if (!isDragging || !onEnd) return setDragState(DEFAULT_DRAG_STATE);\n\n if ([DragRegionType.Columns, DragRegionType.Rows].includes(type)) {\n const { ranges } = dragState;\n const targetIndex = getDropTargetIndex(coordInstance, mouseState, scrollState, type);\n if (!inRange(targetIndex, ranges[0][0], ranges[ranges.length - 1][1])) {\n onEnd(ranges, targetIndex);\n }\n }\n setDragState(DEFAULT_DRAG_STATE);\n };\n\n return {\n dragState,\n setDragState,\n onDragStart,\n onDragChange,\n onDragEnd,\n };\n};\n","import { throttle } from 'lodash';\nimport type { ICellItem, IRectangle } from '../../interface';\n\ninterface ILoadResult {\n img: HTMLImageElement | undefined;\n /** The browser could not load or decode `url`; stays set until the entry is evicted. */\n failed?: boolean;\n cancel: () => void;\n url: string;\n cells: number[];\n}\n\nexport interface IGlobalImageManager {\n setWindow(newWindow: IRectangle, freezeCols: number): void;\n loadOrGetImage(url: string, col: number, row: number): HTMLImageElement | ImageBitmap | undefined;\n /** Whether loading `url` has failed, as opposed to still being in flight. */\n hasFailed(url: string): boolean;\n setCallback(imageLoaded: (locations: ICellItem[]) => void): void;\n}\n\nconst imgPool: HTMLImageElement[] = [];\n\nconst rowShift = 1 << 16;\n\nfunction packColRowToNumber(col: number, row: number) {\n return row * rowShift + col;\n}\n\nfunction unpackCol(packed: number): number {\n return packed % rowShift;\n}\n\nfunction unpackRow(packed: number, col: number): number {\n return (packed - col) / rowShift;\n}\n\nfunction unpackNumberToColRow(packed: number): [number, number] {\n const col = unpackCol(packed);\n const row = unpackRow(packed, col);\n return [col, row];\n}\n\nexport class ImageManager implements IGlobalImageManager {\n private imageLoaded: (locations: ICellItem[]) => void = () => undefined;\n private loadedLocations: [number, number][] = [];\n\n private visibleWindow: IRectangle = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n\n private freezeColumnCount = 0;\n\n private readonly isInWindow = (packed: number) => {\n const col = unpackCol(packed);\n const row = unpackRow(packed, col);\n const w = this.visibleWindow;\n if (col < this.freezeColumnCount && row >= w.y && row <= w.y + w.height) return true;\n return col >= w.x && col <= w.x + w.width && row >= w.y && row <= w.y + w.height;\n };\n\n private cache: Record<string, ILoadResult> = {};\n\n public setCallback(imageLoaded: (locations: ICellItem[]) => void) {\n this.imageLoaded = imageLoaded;\n }\n\n private readonly sendLoaded = throttle(() => {\n this.imageLoaded(this.loadedLocations);\n this.loadedLocations = [];\n }, 20);\n\n private readonly clearOutOfWindow = () => {\n const keys = Object.keys(this.cache);\n for (const key of keys) {\n const obj = this.cache[key];\n\n let keep = false;\n for (let j = 0; j < obj.cells.length; j++) {\n const packed = obj.cells[j];\n if (this.isInWindow(packed)) {\n keep = true;\n break;\n }\n }\n\n if (keep) {\n obj.cells = obj.cells.filter(this.isInWindow);\n } else {\n obj.cancel();\n delete this.cache[key];\n }\n }\n };\n\n public setWindow(newWindow: IRectangle, freezeColumnCount: number): void {\n if (\n this.visibleWindow.x === newWindow.x &&\n this.visibleWindow.y === newWindow.y &&\n this.visibleWindow.width === newWindow.width &&\n this.visibleWindow.height === newWindow.height &&\n this.freezeColumnCount === freezeColumnCount\n )\n return;\n this.visibleWindow = newWindow;\n this.freezeColumnCount = freezeColumnCount;\n this.clearOutOfWindow();\n }\n\n private loadImage(url: string, col: number, row: number, key: string) {\n let loaded = false;\n const img = imgPool.pop() ?? new Image();\n\n let canceled = false;\n const result: ILoadResult = {\n img: undefined,\n cells: [packColRowToNumber(col, row)],\n url,\n cancel: () => {\n if (canceled) return;\n canceled = true;\n if (imgPool.length < 12) {\n imgPool.unshift(img); // never retain more than 12\n } else if (!loaded) {\n img.src = '';\n }\n },\n };\n\n // Cells are redrawn on both outcomes: a failure has to replace the loading\n // placeholder just like a loaded image does.\n const settle = (settled: (entry: ILoadResult) => void) => {\n const entry = this.cache[key];\n if (entry === undefined || canceled) return;\n settled(entry);\n for (const packed of entry.cells) {\n this.loadedLocations.push(unpackNumberToColRow(packed));\n }\n this.sendLoaded();\n };\n // use request animation time to avoid paying src set costs during draw calls\n requestAnimationFrame(async () => {\n // Evicted before the frame: don't start a request nobody will read.\n if (canceled) return;\n // Subscribe right before src is set and await at once, so an early `error`\n // (cancel() assigns src = '') never rejects an unobserved promise.\n const loadPromise = new Promise<void>((resolve, reject) => {\n img.addEventListener('load', () => resolve(), { once: true });\n img.addEventListener('error', () => reject(new Error(`Failed to load ${url}`)), {\n once: true,\n });\n });\n try {\n img.src = url;\n await loadPromise;\n await img.decode();\n settle((entry) => {\n entry.img = img;\n loaded = true;\n });\n } catch {\n settle((entry) => {\n entry.failed = true;\n });\n result.cancel();\n }\n });\n this.cache[key] = result;\n }\n\n public hasFailed(url: string): boolean {\n return this.cache[url]?.failed === true;\n }\n\n public loadOrGetImage(\n url: string,\n col: number,\n row: number\n ): HTMLImageElement | ImageBitmap | undefined {\n const key = url;\n\n const current = this.cache[key];\n if (current !== undefined) {\n const packed = packColRowToNumber(col, row);\n if (!current.cells.includes(packed)) {\n current.cells.push(packed);\n }\n return current.img;\n } else {\n this.loadImage(url, col, row, key);\n }\n return undefined;\n }\n}\n","import {\n DraggableHandle,\n Maximize2,\n Plus,\n X,\n ChevronDown,\n ChevronRight,\n Lock,\n EyeOff,\n Info,\n} from '../../../../grid-adapter/icons';\nimport { renderToString } from 'react-dom/server';\n\nexport interface ISpriteProps {\n fgColor: string;\n bgColor: string;\n}\n\nconst drag = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<DraggableHandle style={{ color: fgColor }} />);\n};\n\nconst detail = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<Maximize2 style={{ color: fgColor }} />);\n};\n\nconst add = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<Plus style={{ color: fgColor }} />);\n};\n\nconst description = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<Info style={{ color: fgColor }} />);\n};\n\nconst close = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<X style={{ color: fgColor }} />);\n};\n\nconst expand = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<ChevronDown style={{ color: fgColor }} />);\n};\n\nconst collapse = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<ChevronRight style={{ color: fgColor }} />);\n};\n\nconst lock = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<Lock style={{ color: fgColor }} />);\n};\n\nexport const eyeOff = (props: ISpriteProps) => {\n const { fgColor } = props;\n return renderToString(<EyeOff style={{ color: fgColor }} />);\n};\n\nexport const sprites = {\n add,\n drag,\n detail,\n description,\n close,\n expand,\n collapse,\n lock,\n eyeOff,\n};\n\nexport enum GridInnerIcon {\n Add = 'add',\n Drag = 'drag',\n Detail = 'detail',\n Description = 'description',\n Close = 'close',\n Expand = 'expand',\n Collapse = 'collapse',\n Lock = 'lock',\n EyeOff = 'eyeOff',\n}\n","import type { IGridTheme } from '../../configs';\nimport type { GridInnerIcon, ISpriteProps } from './sprites';\nimport { sprites } from './sprites';\n\nexport type ISprite = (props: ISpriteProps) => string;\nexport type ISpriteMap = Record<string | GridInnerIcon, ISprite>;\nexport type ISpriteVariant = 'normal' | 'selected';\n\ninterface ISpriteDrawerProps {\n x: number;\n y: number;\n sprite: GridInnerIcon | string;\n size: number;\n theme: IGridTheme;\n colors?: [fgColor: string, bgColor: string];\n variant?: ISpriteVariant;\n alpha?: number;\n}\n\nconst getColors = (variant: ISpriteVariant, theme: IGridTheme): [string, string] => {\n const { iconBgCommon, iconBgSelected, iconFgCommon, iconFgSelected } = theme;\n return variant === 'selected' ? [iconFgSelected, iconBgSelected] : [iconFgCommon, iconBgCommon];\n};\n\nexport class SpriteManager {\n private readonly spriteMap: Map<string, HTMLCanvasElement> = new Map();\n private readonly icons: ISpriteMap;\n private inFlight = 0;\n\n constructor(\n icons?: ISpriteMap,\n private readonly onSettled?: () => void\n ) {\n this.icons = {\n ...sprites,\n ...icons,\n };\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public drawSprite(ctx: CanvasRenderingContext2D, props: ISpriteDrawerProps) {\n const { sprite, variant = 'normal', x, y, size, alpha = 1, theme, colors } = props;\n const [fgColor, bgColor] = colors ?? getColors(variant, theme);\n // Use at least 2x resolution for better anti-aliasing on low DPI screens\n const minPixelRatio = 2;\n const pixelRatio = Math.max(minPixelRatio, Math.ceil(window.devicePixelRatio));\n const rSize = size * pixelRatio;\n const key = `${bgColor}_${fgColor}_${rSize}_${sprite}`;\n\n let spriteCanvas = this.spriteMap.get(key);\n if (spriteCanvas === undefined) {\n const spriteCb = this.icons[sprite];\n\n if (spriteCb === undefined) return;\n\n spriteCanvas = document.createElement('canvas');\n spriteCanvas.width = rSize;\n spriteCanvas.height = rSize;\n const spriteCtx = spriteCanvas.getContext('2d');\n\n if (spriteCtx === null) return;\n\n const imgSource = new Image();\n imgSource.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(\n spriteCb({ fgColor, bgColor })\n )}`;\n this.spriteMap.set(key, spriteCanvas);\n const promise: Promise<void> | undefined = imgSource.decode();\n\n if (promise === undefined) return;\n\n this.inFlight++;\n promise\n .then(() => {\n spriteCtx.drawImage(imgSource, 0, 0, rSize, rSize);\n })\n .finally(() => {\n this.inFlight--;\n if (this.inFlight === 0) {\n this.onSettled?.();\n }\n });\n } else {\n if (alpha < 1) {\n ctx.globalAlpha = alpha;\n }\n ctx.drawImage(spriteCanvas, 0, 0, rSize, rSize, x, y, size, size);\n if (alpha < 1) {\n ctx.globalAlpha = 1;\n }\n }\n }\n}\n","import { isEqual } from 'lodash';\nimport type { IRange } from '../../interface';\nimport { SelectionRegionType } from '../../interface';\nimport {\n flatRanges,\n isPointInsideRectangle,\n isRangeWithinRanges,\n mixRanges,\n serializedRanges,\n} from '../../utils';\n\nexport class CombinedSelection {\n public type: SelectionRegionType;\n public ranges: IRange[];\n\n constructor(type: SelectionRegionType = SelectionRegionType.None, ranges: IRange[] = []) {\n this.type = type;\n this.ranges = ranges;\n }\n\n public get isColumnSelection() {\n return this.type === SelectionRegionType.Columns;\n }\n\n public get isRowSelection() {\n return this.type === SelectionRegionType.Rows;\n }\n\n public get isCellSelection() {\n return this.type === SelectionRegionType.Cells;\n }\n\n public get isNoneSelection() {\n return this.type === SelectionRegionType.None;\n }\n\n public reset(): CombinedSelection {\n return emptySelection;\n }\n\n public set(type: SelectionRegionType, ranges: IRange[]) {\n if (!Array.isArray(ranges)) {\n throw new Error('Ranges of the selection should be an array type!');\n }\n\n if (type === SelectionRegionType.Cells && ranges.length < 2) {\n throw new Error('Ranges of type cells should have a length greater than 2!');\n }\n\n if ([SelectionRegionType.Columns, SelectionRegionType.Rows].includes(type) && !ranges.length) {\n throw new Error('Ranges of type columns or rows should have a length greater than 1!');\n }\n\n return new CombinedSelection(type, ranges);\n }\n\n public setRanges(ranges: IRange[]) {\n return new CombinedSelection(this.type, ranges);\n }\n\n private isOverlap(range1: IRange, range2: IRange): boolean {\n return !(range1[1] < range2[0] || range1[0] > range2[1]);\n }\n\n public expand(range: IRange): CombinedSelection {\n switch (this.type) {\n case SelectionRegionType.Rows:\n case SelectionRegionType.Columns: {\n let hasOverlap = false;\n const newRanges = this.ranges.map((existedRange) => {\n if (this.isOverlap(existedRange, range)) {\n hasOverlap = true;\n return [\n Math.min(existedRange[0], range[0]),\n Math.max(existedRange[1], range[1]),\n ] as IRange;\n }\n return existedRange;\n });\n\n if (!hasOverlap) {\n newRanges.push(range);\n }\n return new CombinedSelection(this.type, serializedRanges(newRanges));\n }\n case SelectionRegionType.Cells:\n return new CombinedSelection(this.type, [this.ranges[0], range]);\n default:\n return emptySelection;\n }\n }\n\n public merge(range: IRange): CombinedSelection {\n switch (this.type) {\n case SelectionRegionType.Rows:\n case SelectionRegionType.Columns: {\n const newRanges = mixRanges(this.ranges, range);\n return newRanges.length ? new CombinedSelection(this.type, newRanges) : emptySelection;\n }\n case SelectionRegionType.Cells:\n return new CombinedSelection(this.type, [this.ranges[0], range]);\n default:\n return emptySelection;\n }\n }\n\n public flatten(): number[] {\n const [start, end] = this.ranges;\n if (this.isCellSelection) return [...start, ...end];\n return flatRanges(this.ranges);\n }\n\n public serialize(): IRange[] {\n switch (this.type) {\n case SelectionRegionType.Rows:\n case SelectionRegionType.Columns:\n return serializedRanges(this.ranges);\n case SelectionRegionType.Cells: {\n const [start, end] = this.ranges;\n return [\n [Math.min(start[0], end[0]), Math.min(start[1], end[1])],\n [Math.max(start[0], end[0]), Math.max(start[1], end[1])],\n ];\n }\n default:\n return [];\n }\n }\n\n public includes(range?: IRange): boolean {\n if (range == null) return false;\n switch (this.type) {\n case SelectionRegionType.Rows:\n case SelectionRegionType.Columns:\n return isRangeWithinRanges(range, this.ranges);\n case SelectionRegionType.Cells:\n return isPointInsideRectangle(range, this.ranges[0], this.ranges[1]);\n default:\n return false;\n }\n }\n\n public equals(comparisonRanges: IRange[]): boolean {\n if (this.ranges.length !== comparisonRanges.length) return false;\n return isEqual(this.ranges, comparisonRanges);\n }\n}\n\nexport const emptySelection = new CombinedSelection(SelectionRegionType.None, []);\n","export interface ICoordinate {\n rowCount: number;\n pureRowCount: number;\n columnCount: number;\n containerWidth: number;\n containerHeight: number;\n rowHeight: number;\n columnWidth: number;\n rowHeightMap?: IIndicesMap;\n columnWidthMap?: IIndicesMap;\n rowInitSize?: number;\n columnInitSize?: number;\n freezeColumnCount?: number;\n}\n\nexport type IIndicesMap = Record<number, number>;\n\nexport type ICellMetaDataMap = Record<number, ICellMetaData>;\n\nexport enum ItemType {\n Row = 'Row',\n Column = 'Column',\n}\n\nexport type ICellMetaData = {\n size: number;\n offset: number;\n};\n","import type { IIndicesMap, ICoordinate, ICellMetaData, ICellMetaDataMap } from './interface';\nimport { ItemType } from './interface';\n\nexport class CoordinateManager implements ICoordinate {\n protected defaultRowHeight: number;\n protected defaultColumnWidth: number;\n public pureRowCount: number;\n public rowCount: number;\n public columnCount: number;\n private _containerWidth: number;\n private _containerHeight: number;\n public rowHeightMap: IIndicesMap = {};\n public columnWidthMap: IIndicesMap = {};\n public rowInitSize: number;\n public columnInitSize: number;\n public lastRowIndex = -1;\n public lastColumnIndex = -1;\n public rowMetaDataMap: ICellMetaDataMap = {};\n public columnMetaDataMap: ICellMetaDataMap = {};\n private _freezeColumnCount: number;\n\n constructor({\n rowHeight,\n columnWidth,\n rowCount,\n pureRowCount,\n columnCount,\n containerWidth,\n containerHeight,\n rowInitSize = 0,\n columnInitSize = 0,\n rowHeightMap = {},\n columnWidthMap = {},\n freezeColumnCount = 1,\n }: ICoordinate) {\n this.defaultRowHeight = rowHeight;\n this.defaultColumnWidth = columnWidth;\n this.rowCount = rowCount;\n this.pureRowCount = pureRowCount;\n this.columnCount = columnCount;\n this.rowInitSize = rowInitSize;\n this.columnInitSize = columnInitSize;\n this._containerWidth = containerWidth;\n this._containerHeight = containerHeight;\n this.rowHeightMap = rowHeightMap;\n this.columnWidthMap = columnWidthMap;\n this._freezeColumnCount = freezeColumnCount;\n }\n\n public get freezeRegionWidth() {\n return this.getColumnOffset(this._freezeColumnCount);\n }\n\n public get freezeColumnCount() {\n return this._freezeColumnCount;\n }\n\n public set freezeColumnCount(count: number) {\n this._freezeColumnCount = count;\n }\n\n public get containerWidth() {\n return this._containerWidth;\n }\n\n public set containerWidth(width: number) {\n this._containerWidth = width;\n }\n\n public get containerHeight() {\n return this._containerHeight;\n }\n\n public set containerHeight(height: number) {\n this._containerHeight = height;\n }\n\n public get columnWidth() {\n return this.defaultColumnWidth;\n }\n\n public set columnWidth(width: number) {\n this.defaultColumnWidth = width;\n }\n\n public get rowHeight() {\n return this.defaultRowHeight;\n }\n\n public set rowHeight(height: number) {\n this.defaultRowHeight = height;\n }\n\n public get totalWidth() {\n const { offset, size } = this.getCellMetaData(this.columnCount - 1, ItemType.Column);\n return offset + size;\n }\n\n public get totalHeight() {\n const { offset, size } = this.getCellMetaData(this.rowCount - 1, ItemType.Row);\n return offset + size;\n }\n\n public getRowHeight(index: number) {\n return this.rowHeightMap[index] ?? this.defaultRowHeight;\n }\n\n public getColumnWidth(index: number) {\n return this.columnWidthMap[index] ?? this.defaultColumnWidth;\n }\n\n /* eslint-disable sonarjs/cognitive-complexity */\n protected getCellMetaData(index: number, itemType: ItemType): ICellMetaData {\n let cellMetadataMap, itemSize, lastMeasuredIndex, offset;\n const isColumnType = itemType === ItemType.Column;\n\n if (isColumnType) {\n itemSize = this.columnWidth;\n offset = this.columnInitSize;\n lastMeasuredIndex = this.lastColumnIndex;\n cellMetadataMap = this.columnMetaDataMap;\n } else {\n itemSize = this.rowHeight;\n offset = this.rowInitSize;\n lastMeasuredIndex = this.lastRowIndex;\n cellMetadataMap = this.rowMetaDataMap;\n }\n if (index > lastMeasuredIndex) {\n const itemMetadata = cellMetadataMap?.[lastMeasuredIndex];\n if (lastMeasuredIndex >= 0 && itemMetadata) {\n offset = itemMetadata.offset + itemMetadata.size;\n }\n\n for (let i = lastMeasuredIndex + 1; i <= index; i++) {\n const size = (isColumnType ? this.columnWidthMap[i] : this.rowHeightMap[i]) ?? itemSize;\n\n cellMetadataMap[i] = {\n offset,\n size,\n };\n offset += size;\n }\n if (isColumnType) {\n this.lastColumnIndex = index;\n } else {\n this.lastRowIndex = index;\n }\n }\n return cellMetadataMap[index] || { size: 0, offset: 0 };\n }\n\n private findNearestCellIndexLinear(index: number, offset: number, itemType: ItemType) {\n const itemCount = itemType === ItemType.Column ? this.columnCount : this.rowCount;\n let interval = 1;\n\n while (index < itemCount && this.getCellMetaData(index, itemType).offset < offset) {\n index += interval;\n interval *= 2;\n }\n\n return this.findNearestCellIndexBinary(\n offset,\n Math.floor(index / 2),\n Math.min(index, itemCount - 1),\n itemType\n );\n }\n\n private findNearestCellIndexBinary(\n offset: number,\n low: number,\n high: number,\n itemType: ItemType\n ) {\n while (low <= high) {\n const middle = low + Math.floor((high - low) / 2);\n const currentOffset = this.getCellMetaData(middle, itemType).offset;\n\n if (currentOffset === offset) {\n return middle;\n } else if (currentOffset < offset) {\n low = middle + 1;\n } else if (currentOffset > offset) {\n high = middle - 1;\n }\n }\n return low > 0 ? low - 1 : 0;\n }\n\n public findNearestCellIndex(offset: number, itemType: ItemType) {\n let itemMetadataMap, lastIndex;\n\n if (itemType === ItemType.Column) {\n itemMetadataMap = this.columnMetaDataMap;\n lastIndex = this.lastColumnIndex;\n } else {\n itemMetadataMap = this.rowMetaDataMap;\n lastIndex = this.lastRowIndex;\n }\n if (lastIndex > 0 && itemMetadataMap[lastIndex] == null) {\n console.warn('lastIndex is not found in itemMetadataMap', lastIndex, itemMetadataMap);\n }\n const lastMeasuredItemOffset = lastIndex > 0 ? (itemMetadataMap[lastIndex]?.offset ?? 0) : 0;\n\n if (lastMeasuredItemOffset >= offset) {\n return this.findNearestCellIndexBinary(offset, 0, lastIndex, itemType);\n }\n return this.findNearestCellIndexLinear(Math.max(0, lastIndex), offset, itemType);\n }\n\n public getRowStartIndex(scrollTop: number) {\n return this.findNearestCellIndex(scrollTop, ItemType.Row);\n }\n\n public getRowStopIndex(startIndex: number, scrollTop: number) {\n const itemMetadata = this.getCellMetaData(startIndex, ItemType.Row);\n const maxOffset = scrollTop + this._containerHeight;\n let offset = itemMetadata.offset + itemMetadata.size;\n let stopIndex = startIndex;\n\n while (stopIndex < this.rowCount - 1 && offset < maxOffset) {\n stopIndex++;\n offset += this.getCellMetaData(stopIndex, ItemType.Row).size;\n }\n return stopIndex;\n }\n\n public getColumnStartIndex(scrollLeft: number) {\n return this.findNearestCellIndex(scrollLeft, ItemType.Column);\n }\n\n public getColumnStopIndex(startIndex: number, scrollLeft: number) {\n const itemMetadata = this.getCellMetaData(startIndex, ItemType.Column);\n const maxOffset = scrollLeft + this._containerWidth;\n let offset = itemMetadata.offset + itemMetadata.size;\n let stopIndex = startIndex;\n\n while (stopIndex < this.columnCount - 1 && offset < maxOffset) {\n stopIndex++;\n offset += this.getCellMetaData(stopIndex, ItemType.Column).size;\n }\n return stopIndex;\n }\n\n public getRowOffset(rowIndex: number) {\n return this.getCellMetaData(rowIndex, ItemType.Row).offset;\n }\n\n public getColumnOffset(columnIndex: number) {\n return this.getCellMetaData(columnIndex, ItemType.Column).offset;\n }\n\n public getColumnRelativeOffset(columnIndex: number, scrollLeft: number) {\n const x = this.getColumnOffset(columnIndex);\n return columnIndex < this._freezeColumnCount ? x : x - scrollLeft;\n }\n\n public refreshColumnDimensions({\n columnCount,\n columnInitSize = 0,\n columnWidthMap = {},\n }: Pick<ICoordinate, 'columnCount' | 'columnInitSize' | 'columnWidthMap'>) {\n this.columnCount = columnCount;\n this.columnInitSize = columnInitSize;\n this.columnWidthMap = columnWidthMap;\n this.lastColumnIndex = -1;\n }\n}\n","class PerformanceTracker {\n private startTimes: { [key: string]: number } = {};\n private totalTimes: { [key: string]: number } = {};\n\n public startTrack(key: string) {\n this.startTimes[key] = performance.now();\n }\n\n public endTrack(key: string) {\n if (this.startTimes[key] == null) {\n console.error(\n `PerformanceTracker: endTrack called with key \"${key}\" without calling startTrack first`\n );\n return;\n }\n\n const endTime = performance.now();\n const sliceTime = endTime - this.startTimes[key];\n this.totalTimes[key] = (this.totalTimes[key] || 0) + sliceTime;\n delete this.startTimes[key];\n }\n\n public getTotalTime(key: string) {\n return this.totalTimes[key] || 0;\n }\n\n public reset() {\n this.startTimes = {};\n this.totalTimes = {};\n }\n\n public getAllTotalTimes() {\n return this.totalTimes;\n }\n}\n\nexport const performanceTracker = new PerformanceTracker();\n","import { useEffect, useRef, useState } from 'react';\nimport { useUpdateEffect } from 'react-use';\nimport type { IGridProps } from '../Grid';\nimport type { ICellItem, ILinearRow, IMouseState, IPosition, IRange } from '../interface';\nimport { RegionType, SelectionRegionType, SelectableType, RowControlType } from '../interface';\nimport { CombinedSelection, type CoordinateManager } from '../managers';\n\ninterface IUseSelectionProps {\n coordInstance: CoordinateManager;\n selectable?: SelectableType;\n isMultiSelectionEnable?: boolean;\n isRowClickSelectionEnabled?: boolean;\n getLinearRow: (index: number) => ILinearRow;\n onSelectionChanged: IGridProps['onSelectionChanged'];\n onRowControlClick?: IGridProps['onRowControlClick'];\n onRowRangeSelected?: IGridProps['onRowRangeSelected'];\n setActiveCell: React.Dispatch<React.SetStateAction<ICellItem | null>>;\n}\n\nexport const useSelection = (props: IUseSelectionProps) => {\n const {\n coordInstance,\n selectable,\n isMultiSelectionEnable,\n isRowClickSelectionEnabled = true,\n getLinearRow,\n setActiveCell,\n onSelectionChanged,\n onRowControlClick,\n onRowRangeSelected,\n } = props;\n const onSelectionChangedRef = useRef<IGridProps['onSelectionChanged'] | undefined>(undefined);\n const onRowControlClickRef = useRef<IGridProps['onRowControlClick'] | undefined>(undefined);\n const onRowRangeSelectedRef = useRef<IGridProps['onRowRangeSelected'] | undefined>(undefined);\n const prevSelectedRowIndex = useRef<number | null>(null);\n const [isSelecting, setSelecting] = useState(false);\n const [selection, setSelection] = useState(() => new CombinedSelection());\n const { pureRowCount } = coordInstance;\n\n useEffect(() => {\n onSelectionChangedRef.current = onSelectionChanged;\n return () => {\n onSelectionChangedRef.current = undefined;\n };\n }, [onSelectionChanged]);\n\n useEffect(() => {\n onRowControlClickRef.current = onRowControlClick;\n return () => {\n onRowControlClickRef.current = undefined;\n };\n }, [onRowControlClick]);\n\n useEffect(() => {\n onRowRangeSelectedRef.current = onRowRangeSelected;\n return () => {\n onRowRangeSelectedRef.current = undefined;\n };\n }, [onRowRangeSelected]);\n\n const onSelectionStart = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>,\n mouseState: IMouseState\n ) => {\n if (selectable !== SelectableType.All && selectable !== SelectableType.Cell) return;\n\n const { type, rowIndex, columnIndex } = mouseState;\n const { isRowSelection: isPrevRowSelection, ranges: prevRanges } = selection;\n const isShiftKey = event.shiftKey && !event.metaKey;\n\n switch (type) {\n case RegionType.Cell:\n case RegionType.ActiveCell: {\n const { realIndex } = getLinearRow(rowIndex);\n const range = [columnIndex, realIndex] as IRange;\n const isExpandSelection = isShiftKey && !isPrevRowSelection && prevRanges[0] != null;\n const ranges = [isExpandSelection ? prevRanges[0] : range, range];\n if (!isExpandSelection) {\n setActiveCell(range);\n }\n isMultiSelectionEnable && setSelecting(true);\n return setSelection(selection.set(SelectionRegionType.Cells, ranges));\n }\n case RegionType.RowHeaderDragHandler:\n case RegionType.RowHeaderCheckbox:\n case RegionType.ColumnHeader:\n case RegionType.AllCheckbox:\n case RegionType.RowHeader:\n case RegionType.AppendRow:\n return;\n default:\n setActiveCell(null);\n return setSelection(selection.reset());\n }\n };\n\n const onSelectionChange = (mouseState: IMouseState) => {\n const { isCellSelection, ranges } = selection;\n const { rowIndex, columnIndex } = mouseState;\n\n if (!isSelecting) return;\n // Dragging above/left of the grid makes getPosition return -Infinity for the\n // row/column index. Left unguarded it poisons the selection range and feeds\n // -Infinity offsets into coordinate/canvas math, freezing the browser. Snap\n // only the non-finite case back to 0; the finite sentinels (-1 header, -2\n // append column) flow through unchanged so existing behavior is untouched.\n const safeRowIndex = Number.isFinite(rowIndex) ? rowIndex : 0;\n const safeColumnIndex = Number.isFinite(columnIndex) ? columnIndex : 0;\n const { realIndex } = getLinearRow(safeRowIndex);\n const newRange = [safeColumnIndex, realIndex] as IRange;\n if (isCellSelection && !selection.equals([ranges[0], newRange])) {\n setSelection(selection.merge(newRange));\n }\n };\n\n const onSelectionEnd = () => {\n setSelecting(false);\n };\n\n const onSelectionClick = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>,\n mouseState: IMouseState\n // eslint-disable-next-line sonarjs/cognitive-complexity\n ) => {\n const { shiftKey, metaKey } = event;\n const isShiftKey = shiftKey && !metaKey;\n const isMetaKey = metaKey && !shiftKey;\n const { type, rowIndex: hoverRowIndex, columnIndex } = mouseState;\n const {\n ranges: prevSelectionRanges,\n isColumnSelection: isPrevColumnSelection,\n isRowSelection: isPrevRowSelection,\n } = selection;\n\n const pureSelectColumnOrRow = (colOrRowIndex: number, type: SelectionRegionType) => {\n const range = [colOrRowIndex, colOrRowIndex] as IRange;\n let newSelection;\n\n if (\n isPrevRowSelection &&\n (isMultiSelectionEnable ||\n (!isMultiSelectionEnable && prevSelectionRanges[0][0] === colOrRowIndex))\n ) {\n newSelection = selection.merge(range);\n } else {\n newSelection = selection.set(type, [range]);\n }\n if (newSelection.includes(range)) {\n prevSelectedRowIndex.current = colOrRowIndex;\n }\n setActiveCell(null);\n setSelection(newSelection);\n };\n\n switch (type) {\n case RegionType.ColumnIcon:\n case RegionType.ColumnHeader: {\n if (selectable !== SelectableType.All && selectable !== SelectableType.Column) return;\n const thresholdColIndex =\n isMultiSelectionEnable && isShiftKey && isPrevColumnSelection\n ? prevSelectionRanges[0][0]\n : columnIndex;\n const ranges = [\n [Math.min(thresholdColIndex, columnIndex), Math.max(thresholdColIndex, columnIndex)],\n ] as IRange[];\n let newSelection = selection.set(SelectionRegionType.Columns, ranges);\n if (isMultiSelectionEnable && isMetaKey && isPrevColumnSelection) {\n newSelection = selection.merge([columnIndex, columnIndex]);\n }\n if (!isShiftKey || !isPrevColumnSelection) {\n const { isNoneSelection, ranges } = newSelection;\n isNoneSelection ? setActiveCell(null) : setActiveCell([ranges[0][0], 0]);\n }\n return setSelection(newSelection);\n }\n case RegionType.RowHeaderCheckbox: {\n const { realIndex: rowIndex } = getLinearRow(hoverRowIndex);\n if (selectable !== SelectableType.All && selectable !== SelectableType.Row) return;\n const range = [rowIndex, rowIndex] as IRange;\n if (\n isMultiSelectionEnable &&\n isShiftKey &&\n isPrevRowSelection &&\n prevSelectedRowIndex.current != null\n ) {\n if (selection.includes(range)) return;\n const prevIndex = prevSelectedRowIndex.current;\n const newRange = [Math.min(rowIndex, prevIndex), Math.max(rowIndex, prevIndex)] as IRange;\n const newSelection = selection.expand(newRange);\n prevSelectedRowIndex.current = rowIndex;\n setActiveCell(null);\n setSelection(newSelection);\n onRowRangeSelectedRef.current?.([newRange]);\n return;\n }\n\n const isCurrentlySelected = selection.includes(range);\n pureSelectColumnOrRow(rowIndex, SelectionRegionType.Rows);\n onRowControlClickRef.current?.(rowIndex, RowControlType.Checkbox, !isCurrentlySelected);\n return;\n }\n case RegionType.Cell: {\n const { realIndex: rowIndex } = getLinearRow(hoverRowIndex);\n if (selectable === SelectableType.Row) {\n if (!isRowClickSelectionEnabled) return;\n const range = [rowIndex, rowIndex] as IRange;\n if (\n isMultiSelectionEnable &&\n isShiftKey &&\n isPrevRowSelection &&\n prevSelectedRowIndex.current != null\n ) {\n if (selection.includes(range)) return;\n const prevIndex = prevSelectedRowIndex.current;\n const newRange = [\n Math.min(rowIndex, prevIndex),\n Math.max(rowIndex, prevIndex),\n ] as IRange;\n const newSelection = selection.expand(newRange);\n prevSelectedRowIndex.current = rowIndex;\n setActiveCell(null);\n setSelection(newSelection);\n onRowRangeSelectedRef.current?.([newRange]);\n return;\n }\n const isCurrentlySelected = selection.includes(range);\n pureSelectColumnOrRow(rowIndex, SelectionRegionType.Rows);\n onRowControlClickRef.current?.(rowIndex, RowControlType.Checkbox, !isCurrentlySelected);\n return;\n }\n if (selectable === SelectableType.Column) {\n return pureSelectColumnOrRow(columnIndex, SelectionRegionType.Columns);\n }\n return;\n }\n case RegionType.AllCheckbox: {\n if (selectable !== SelectableType.All && selectable !== SelectableType.Row) return;\n const allRanges = [[0, pureRowCount - 1]] as IRange[];\n const isPrevAll = isPrevRowSelection && selection.equals(allRanges);\n if (isPrevAll) {\n return setSelection(selection.reset());\n }\n const newSelection = selection.set(SelectionRegionType.Rows, allRanges);\n setSelection(newSelection);\n onRowRangeSelectedRef.current?.(allRanges);\n return;\n }\n }\n };\n\n const onSelectionContextMenu = (\n mouseState: IMouseState,\n callback: (selection: CombinedSelection, position: IPosition) => void\n // eslint-disable-next-line sonarjs/cognitive-complexity\n ) => {\n const { x, y, columnIndex, rowIndex: hoverRowIndex, type } = mouseState;\n if ([RegionType.Blank, RegionType.ColumnStatistic, RegionType.GroupStatistic].includes(type))\n return;\n const {\n isCellSelection: isPrevCellSelection,\n isRowSelection: isPrevRowSelection,\n isColumnSelection: isPrevColumnSelection,\n } = selection;\n const isCellHovered = columnIndex >= -1 && hoverRowIndex > -1;\n const isColumnHovered = columnIndex > -1 && hoverRowIndex === -1;\n\n if (isCellHovered) {\n const { realIndex: rowIndex } = getLinearRow(hoverRowIndex);\n const checkedRange = (\n isPrevCellSelection\n ? [columnIndex, rowIndex]\n : isPrevRowSelection\n ? [rowIndex, rowIndex]\n : isPrevColumnSelection\n ? [columnIndex, columnIndex]\n : undefined\n ) as IRange;\n const inPrevRanges = selection.includes(checkedRange);\n\n if (inPrevRanges) {\n return callback(selection, { x, y });\n }\n if (columnIndex > -1) {\n const range = [columnIndex, rowIndex] as IRange;\n const newSelection = selection.set(SelectionRegionType.Cells, [range, range]);\n setActiveCell(range);\n setSelection(newSelection);\n return callback(newSelection, { x, y });\n }\n }\n\n if (isColumnHovered) {\n const inPrevColumnRanges =\n isPrevColumnSelection && selection.includes([columnIndex, columnIndex]);\n\n if (inPrevColumnRanges) {\n return callback(selection, { x, y });\n }\n const newSelection = selection.set(SelectionRegionType.Columns, [[columnIndex, columnIndex]]);\n setActiveCell([columnIndex, 0]);\n setSelection(newSelection);\n callback(newSelection, { x, y });\n }\n };\n\n useUpdateEffect(() => {\n onSelectionChangedRef.current?.(selection);\n }, [selection]);\n\n return {\n selection,\n isSelecting,\n setActiveCell,\n setSelection,\n onSelectionStart,\n onSelectionChange,\n onSelectionEnd,\n onSelectionClick,\n onSelectionContextMenu,\n };\n};\n","import { inRange } from 'lodash';\nimport { useState, useRef, useEffect } from 'react';\nimport type { IPosition, IScrollDirection } from '../interface';\nimport { DragRegionType } from '../interface';\nimport type { CoordinateManager } from '../managers';\n\nconst threshold = 30;\nconst maxPxPerMs = 2;\nconst msToFullSpeed = 1200;\n\ninterface IUseAutoScroll {\n coordInstance: CoordinateManager;\n scrollBy: (deltaX: number, deltaY: number) => void;\n}\n\nexport const useAutoScroll = (props: IUseAutoScroll) => {\n const { coordInstance, scrollBy } = props;\n const speedScalar = useRef(0);\n const { containerWidth, containerHeight, freezeRegionWidth, rowInitSize } = coordInstance;\n const [scrollDirection, setScrollDirection] = useState<\n [xDir: IScrollDirection, yDir: IScrollDirection]\n >([0, 0]);\n const [xDirection, yDirection] = scrollDirection || [0, 0];\n\n const onAutoScroll = <T extends IPosition>(position: T, dragType?: DragRegionType) => {\n const { x, y } = position;\n let xDir: IScrollDirection = 0;\n let yDir: IScrollDirection = 0;\n\n if (!dragType || dragType === DragRegionType.Columns) {\n if (containerWidth - x < threshold) {\n xDir = 1;\n } else if (inRange(x, freezeRegionWidth, freezeRegionWidth + threshold)) {\n xDir = -1;\n }\n }\n\n if (!dragType || dragType === DragRegionType.Rows) {\n if (containerHeight - y < threshold) {\n yDir = 1;\n } else if (inRange(y, rowInitSize, rowInitSize + threshold)) {\n yDir = -1;\n }\n }\n setScrollDirection([xDir, yDir]);\n };\n\n const onAutoScrollStop = () => {\n setScrollDirection([0, 0]);\n };\n\n useEffect(() => {\n if (xDirection === 0 && yDirection === 0) {\n speedScalar.current = 0;\n return;\n }\n\n let lastTime = 0;\n\n const processFrame = (curTime: number) => {\n if (lastTime !== 0) {\n const step = curTime - lastTime;\n speedScalar.current = Math.min(1, speedScalar.current + step / msToFullSpeed);\n const motion = Math.floor(speedScalar.current * step * maxPxPerMs);\n scrollBy(xDirection * motion, yDirection * motion);\n }\n lastTime = curTime;\n requestFrameId = window.requestAnimationFrame(processFrame);\n };\n let requestFrameId = window.requestAnimationFrame(processFrame);\n return () => window.cancelAnimationFrame(requestFrameId);\n }, [scrollBy, xDirection, yDirection]);\n\n return { onAutoScroll, onAutoScrollStop };\n};\n","import { useState } from 'react';\nimport { DEFAULT_COLUMN_RESIZE_STATE, GRID_DEFAULT } from '../configs';\nimport type { IMouseState, IColumnResizeState, IScrollState } from '../interface';\nimport { RegionType } from '../interface';\nimport type { CoordinateManager } from '../managers';\nimport { inRange } from '../utils';\n\nexport const useColumnResize = (coordInstance: CoordinateManager, scrollState: IScrollState) => {\n const [hoveredColumnResizeIndex, setHoveredColumnResizeIndex] = useState(-1);\n const [columnResizeState, setColumnResizeState] = useState<IColumnResizeState>(\n DEFAULT_COLUMN_RESIZE_STATE\n );\n\n const onColumnResizeStart = (mouseState: IMouseState) => {\n const { scrollLeft } = scrollState;\n const { type, columnIndex, x } = mouseState;\n\n if (type === RegionType.ColumnResizeHandler) {\n const { columnResizeHandlerWidth } = GRID_DEFAULT;\n const startOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const realColumnIndex = inRange(x, startOffsetX, startOffsetX + columnResizeHandlerWidth / 2)\n ? columnIndex - 1\n : columnIndex;\n\n setColumnResizeState({\n x,\n columnIndex: realColumnIndex,\n width: coordInstance.getColumnWidth(realColumnIndex),\n });\n }\n };\n\n const onColumnResizeChange = (\n mouseState: IMouseState,\n onResize?: (newSize: number, colIndex: number) => void\n ) => {\n const { scrollLeft } = scrollState;\n const { type, x, columnIndex } = mouseState;\n const { columnIndex: resizeColumnIndex, x: resizeX } = columnResizeState;\n if (resizeColumnIndex > -1) {\n const columnWidth = coordInstance.getColumnWidth(resizeColumnIndex);\n const newWidth = Math.max(100, Math.round(columnWidth + x - resizeX));\n setColumnResizeState({\n x,\n columnIndex: resizeColumnIndex,\n width: newWidth,\n });\n return onResize?.(newWidth, resizeColumnIndex);\n }\n if (type === RegionType.ColumnResizeHandler) {\n const { columnResizeHandlerWidth } = GRID_DEFAULT;\n const startOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const realColumnIndex = inRange(x, startOffsetX, startOffsetX + columnResizeHandlerWidth / 2)\n ? columnIndex - 1\n : columnIndex;\n\n return setHoveredColumnResizeIndex(realColumnIndex);\n }\n if (hoveredColumnResizeIndex !== -1) {\n setHoveredColumnResizeIndex(-1);\n }\n };\n\n const onColumnResizeEnd = () => {\n setColumnResizeState(DEFAULT_COLUMN_RESIZE_STATE);\n };\n\n return {\n columnResizeState,\n hoveredColumnResizeIndex,\n setHoveredColumnResizeIndex,\n setColumnResizeState,\n onColumnResizeStart,\n onColumnResizeChange,\n onColumnResizeEnd,\n };\n};\n","import { useState } from 'react';\nimport { DEFAULT_FREEZE_COLUMN_STATE } from '../configs';\nimport { RegionType } from '../interface';\nimport type { IScrollState, IColumnFreezeState, IMouseState } from '../interface';\nimport type { CoordinateManager } from '../managers';\nimport { canFreezeColumnCount, inRange } from '../utils';\n\nexport const useColumnFreeze = (coordInstance: CoordinateManager, scrollState: IScrollState) => {\n const [columnFreezeState, setColumnFreezeState] = useState<IColumnFreezeState>(\n DEFAULT_FREEZE_COLUMN_STATE\n );\n\n const onColumnFreezeStart = (mouseState: IMouseState) => {\n const { type } = mouseState;\n\n if (type !== RegionType.ColumnFreezeHandler) return;\n\n const { freezeColumnCount } = coordInstance;\n setColumnFreezeState({\n sourceIndex: freezeColumnCount - 1,\n targetIndex: freezeColumnCount - 1,\n isFreezing: true,\n });\n };\n\n const onColumnFreezeMove = (mouseState: IMouseState) => {\n const { sourceIndex, isFreezing } = columnFreezeState;\n\n if (!isFreezing) return;\n\n const { scrollLeft } = scrollState;\n const { columnIndex, x } = mouseState;\n const { columnCount } = coordInstance;\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const columnOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const targetIndex = inRange(x, columnOffsetX, columnOffsetX + columnWidth / 2)\n ? columnIndex - 1\n : columnIndex;\n\n setColumnFreezeState({\n sourceIndex,\n targetIndex: Math.min(targetIndex, columnCount - 1),\n isFreezing: true,\n });\n };\n\n const onColumnFreezeEnd = (\n callbackFn?: (columnCount: number) => void,\n onFreezeFailed?: () => void\n ) => {\n const { targetIndex, isFreezing } = columnFreezeState;\n if (!isFreezing) return;\n setColumnFreezeState(() => DEFAULT_FREEZE_COLUMN_STATE);\n const columnCount = Math.max(targetIndex + 1, 0);\n\n if (\n !canFreezeColumnCount(columnCount, {\n containerWidth: coordInstance.containerWidth,\n columnInitSize: coordInstance.columnInitSize,\n columnCount: coordInstance.columnCount,\n getColumnWidth: (index) => coordInstance.getColumnWidth(index),\n })\n ) {\n onFreezeFailed?.();\n return;\n }\n\n callbackFn?.(columnCount);\n };\n\n return {\n columnFreezeState,\n onColumnFreezeStart,\n onColumnFreezeMove,\n onColumnFreezeEnd,\n };\n};\n","import { useRef, useEffect } from 'react';\n\nexport const useEventListener = <K extends keyof HTMLElementEventMap>(\n eventName: K,\n handler: (this: HTMLElement, ev: HTMLElementEventMap[K]) => void,\n element: HTMLElement | Window | null,\n passive: boolean,\n capture = false\n) => {\n const savedHandler = useRef<(this: HTMLElement, ev: HTMLElementEventMap[K]) => void>(undefined);\n\n savedHandler.current = handler;\n useEffect(() => {\n if (element?.addEventListener === undefined) return;\n const el = element as HTMLElement;\n const eventListener = (event: HTMLElementEventMap[K]) => {\n savedHandler.current?.call(el, event);\n };\n\n el.addEventListener(eventName, eventListener, { passive, capture });\n\n return () => {\n el.removeEventListener(eventName, eventListener, { capture });\n };\n }, [eventName, element, passive, capture]);\n};\n","import { useMemo } from 'react';\nimport type { IScrollState } from '../interface';\nimport type { CoordinateManager } from '../managers';\n\nexport interface IVisibleRegion {\n startRowIndex: number;\n stopRowIndex: number;\n startColumnIndex: number;\n stopColumnIndex: number;\n}\n\nexport const getVerticalRangeInfo = (coordInstance: CoordinateManager, scrollTop: number) => {\n const { rowCount } = coordInstance;\n const startIndex = coordInstance.getRowStartIndex(scrollTop);\n const stopIndex = coordInstance.getRowStopIndex(startIndex, scrollTop);\n\n return {\n startRowIndex: Math.max(0, startIndex),\n stopRowIndex: Math.max(0, Math.min(rowCount - 1, stopIndex + 1)),\n };\n};\n\nexport const getHorizontalRangeInfo = (coordInstance: CoordinateManager, scrollLeft: number) => {\n const { columnCount } = coordInstance;\n const startIndex = coordInstance.getColumnStartIndex(scrollLeft);\n const stopIndex = coordInstance.getColumnStopIndex(startIndex, scrollLeft);\n\n return {\n startColumnIndex: Math.max(0, startIndex),\n stopColumnIndex: Math.max(0, Math.min(columnCount - 1, stopIndex)),\n };\n};\n\nexport const useVisibleRegion = (\n coordInstance: CoordinateManager,\n scrollState: IScrollState,\n forceRenderFlag: string\n) => {\n const { scrollTop, scrollLeft } = scrollState;\n\n return useMemo(() => {\n const { startRowIndex, stopRowIndex } = getVerticalRangeInfo(coordInstance, scrollTop);\n const { startColumnIndex, stopColumnIndex } = getHorizontalRangeInfo(coordInstance, scrollLeft);\n\n return {\n startRowIndex,\n stopRowIndex,\n startColumnIndex,\n stopColumnIndex,\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [coordInstance, scrollTop, scrollLeft, forceRenderFlag]);\n};\n","import type { MutableRefObject } from 'react';\nimport { useRef, useState, useLayoutEffect } from 'react';\n\ninterface IResizeDetectorDimensions {\n width: number;\n height: number;\n}\n\nexport interface IUseResizeDetectorReturn<T> extends IResizeDetectorDimensions {\n ref: MutableRefObject<T | null>;\n}\n\nexport function useResizeObserver<T extends HTMLElement = HTMLElement>(\n initialSize?: readonly [width: number, height: number]\n): IUseResizeDetectorReturn<T> {\n const ref = useRef<T>(null);\n\n const [size, setSize] = useState<IResizeDetectorDimensions>({\n width: initialSize?.[0] || 0,\n height: initialSize?.[1] || 0,\n });\n\n useLayoutEffect(() => {\n const resizeCallback: ResizeObserverCallback = (entries) => {\n let diffHeight = document.body.clientHeight - window.innerHeight;\n diffHeight = Number.isNaN(diffHeight) ? 0 : diffHeight;\n for (const entry of entries) {\n const { width, height } = entry?.contentRect || {};\n setSize((cv) =>\n cv.width === width && cv.height === height\n ? cv\n : { width: Math.floor(width), height: height - diffHeight }\n );\n }\n };\n\n const resizeObserver = new window.ResizeObserver(resizeCallback);\n\n if (ref.current) {\n resizeObserver.observe(ref.current, undefined);\n }\n\n return () => {\n resizeObserver.disconnect();\n };\n }, []);\n\n return { ref, ...size };\n}\n","import { useHotkeys, isHotkeyPressed } from 'react-hotkeys-hook';\nimport type { IEditorContainerProps, IEditorRef } from '../components';\nimport { SelectionRegionType } from '../interface';\nimport type { IRange } from '../interface';\n\ninterface ISelectionKeyboardProps extends Omit<\n IEditorContainerProps,\n | 'theme'\n | 'onChange'\n | 'scrollState'\n | 'activeCellBound'\n | 'real2RowIndex'\n | 'getCellContent'\n | 'onCellActivated'\n> {\n editorRef: React.MutableRefObject<IEditorRef | null>;\n}\n\nexport const useKeyboardSelection = (props: ISelectionKeyboardProps) => {\n const {\n isEditing,\n activeCell,\n coordInstance,\n selection,\n scrollToItem,\n setEditing,\n setActiveCell,\n setSelection,\n onUndo,\n onRedo,\n onDelete,\n onRowExpand,\n editorRef,\n scrollBy,\n disableEnterMoveDown,\n } = props;\n const { pureRowCount, columnCount } = coordInstance;\n\n useHotkeys(\n 'mod+z',\n () => {\n onUndo?.();\n },\n {\n enabled: !isEditing && selection.type !== SelectionRegionType.None,\n preventDefault: true,\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n ['mod+shift+z', 'mod+y'],\n () => {\n onRedo?.();\n },\n {\n enabled: !isEditing && selection.type !== SelectionRegionType.None,\n preventDefault: true,\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n [\n 'up',\n 'down',\n 'left',\n 'right',\n 'mod+up',\n 'mod+down',\n 'mod+left',\n 'mod+right',\n 'shift+up',\n 'shift+down',\n 'shift+left',\n 'shift+right',\n 'mod+shift+up',\n 'mod+shift+down',\n 'mod+shift+left',\n 'mod+shift+right',\n ],\n (keyboardEvent, hotkeysEvent) => {\n const { shift, mod } = hotkeysEvent;\n const isMod = Boolean(mod);\n const isSelectionExpand = Boolean(shift);\n let [columnIndex, rowIndex] = selection.ranges[isSelectionExpand ? 1 : 0];\n\n if (isMod) {\n if (isHotkeyPressed('up')) {\n rowIndex = 0;\n } else if (isHotkeyPressed('down')) {\n rowIndex = pureRowCount - 1;\n } else if (isHotkeyPressed('left')) {\n columnIndex = 0;\n } else if (isHotkeyPressed('right')) {\n columnIndex = columnCount - 1;\n }\n } else if (isHotkeyPressed('up')) {\n rowIndex = Math.max(rowIndex - 1, 0);\n } else if (isHotkeyPressed('down')) {\n rowIndex = Math.min(rowIndex + 1, pureRowCount - 1);\n } else if (isHotkeyPressed('left')) {\n columnIndex = Math.max(columnIndex - 1, 0);\n } else if (isHotkeyPressed('right')) {\n columnIndex = Math.min(columnIndex + 1, columnCount - 1);\n }\n\n const newRange = <IRange>[columnIndex, rowIndex];\n const ranges = isSelectionExpand ? [selection.ranges[0], newRange] : [newRange, newRange];\n\n scrollToItem([columnIndex, rowIndex]);\n !isSelectionExpand && setActiveCell(newRange);\n setSelection(selection.setRanges(ranges));\n },\n {\n enabled: Boolean(activeCell && !isEditing),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n ['tab', 'shift+tab'],\n () => {\n const [columnIndex, rowIndex] = selection.ranges[0];\n\n let newColumnIndex = Math.min(columnIndex + 1, columnCount - 1);\n if (isHotkeyPressed('shift') && isHotkeyPressed('tab'))\n newColumnIndex = Math.max(columnIndex - 1, 0);\n\n const newRange = <IRange>[newColumnIndex, rowIndex];\n const ranges = [newRange, newRange];\n\n editorRef.current?.saveValue?.();\n scrollToItem([newColumnIndex, rowIndex]);\n setEditing(false);\n setActiveCell(newRange);\n setSelection(selection.setRanges(ranges));\n },\n {\n enabled: Boolean(activeCell),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n ['PageUp', 'PageDown'],\n () => {\n const delta = coordInstance.containerHeight - coordInstance.rowInitSize - 1;\n scrollBy(0, isHotkeyPressed('PageUp') ? -delta : delta);\n },\n {\n enabled: Boolean(activeCell && !isEditing),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n useHotkeys(\n 'mod+a',\n () => {\n const ranges = [\n [0, 0],\n [columnCount - 1, pureRowCount - 1],\n ] as IRange[];\n setSelection(selection.setRanges(ranges));\n },\n {\n enabled: Boolean(activeCell && !isEditing),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n ['delete', 'backspace', 'f2'],\n () => {\n if (isHotkeyPressed('f2')) {\n return setEditing(true);\n }\n if (isHotkeyPressed('backspace') || isHotkeyPressed('delete')) {\n return onDelete?.(selection);\n }\n },\n {\n enabled: Boolean(activeCell && !isEditing),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n ['enter'],\n (keyboardEvent) => {\n if (keyboardEvent.isComposing) return;\n\n const { isColumnSelection, ranges: selectionRanges } = selection;\n if (isEditing) {\n let range = selectionRanges[0];\n if (isColumnSelection) {\n range = [range[0], 0];\n }\n const [columnIndex, rowIndex] = range;\n // Stay on the edited cell so the caller can follow a record that re-positions on edit.\n const nextRowIndex = disableEnterMoveDown\n ? rowIndex\n : Math.min(rowIndex + 1, pureRowCount - 1);\n const newRange = [columnIndex, nextRowIndex] as IRange;\n editorRef.current?.saveValue?.();\n setTimeout(() => {\n setSelection(selection.set(SelectionRegionType.Cells, [newRange, newRange]));\n setActiveCell(newRange);\n setEditing(false);\n scrollToItem(newRange as IRange);\n });\n } else {\n setEditing(true);\n }\n },\n {\n enabled: Boolean(activeCell),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n 'esc',\n () => {\n setEditing(false);\n },\n {\n enabled: Boolean(activeCell),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n\n useHotkeys(\n 'space',\n () => {\n const [, rowIndex] = activeCell!;\n onRowExpand?.(rowIndex);\n },\n {\n enabled: Boolean(activeCell && !isEditing),\n enableOnFormTags: ['input', 'select', 'textarea'],\n }\n );\n};\n","/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { noop } from 'lodash';\nimport type { ForwardRefRenderFunction } from 'react';\nimport { useImperativeHandle, forwardRef, useRef, useState } from 'react';\nimport { Key as KeyCode } from 'ts-keycode-enum';\nimport type { IBooleanCell } from '../../renderers';\nimport type { IEditorRef, IEditorProps } from './EditorContainer';\n\nconst BooleanEditorBase: ForwardRefRenderFunction<\n IEditorRef<IBooleanCell>,\n IEditorProps<IBooleanCell>\n> = (props, ref) => {\n const { cell, onChange } = props;\n const focusRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState(cell.data);\n\n useImperativeHandle(ref, () => ({\n focus: () => focusRef.current?.focus(),\n setValue: (v: boolean) => setValue(v),\n saveValue: noop,\n }));\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.metaKey) return;\n if (e.keyCode === KeyCode.Enter) {\n const newValue = !value;\n setValue(newValue);\n onChange?.(newValue || null);\n }\n };\n\n return (\n <div onKeyDown={onKeyDown} className=\"size-0\">\n <input ref={focusRef} className=\"size-0 border-none p-0 shadow-none outline-none\" />\n </div>\n );\n};\n\nexport const BooleanEditor = forwardRef(BooleanEditorBase);\n","/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { noop } from 'lodash';\nimport type { ForwardRefRenderFunction } from 'react';\nimport { useImperativeHandle, forwardRef, useRef, useState } from 'react';\nimport type { IRatingCell } from '../../renderers';\nimport { isNumberKey } from '../../utils';\nimport type { IEditorRef, IEditorProps } from './EditorContainer';\n\nconst RatingEditorBase: ForwardRefRenderFunction<\n IEditorRef<IRatingCell>,\n IEditorProps<IRatingCell>\n> = (props, ref) => {\n const { cell, onChange } = props;\n const focusRef = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState<number | null>(cell.data);\n const [lastTime, setLastTime] = useState(0);\n\n useImperativeHandle(ref, () => ({\n focus: () => focusRef.current?.focus(),\n setValue: (v: number) => setValue(v),\n saveValue: noop,\n }));\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.metaKey) return;\n if (isNumberKey(e.keyCode)) {\n const currentTime = Date.now();\n let newValue: number | null = Number(e.key);\n if (value === 1 && newValue === 0 && currentTime - lastTime <= 500) {\n newValue = Number(`${value}${newValue}`);\n } else {\n newValue =\n newValue === value || newValue === 0 || Number.isNaN(newValue)\n ? null\n : Math.min(newValue, cell.max);\n }\n setValue(newValue);\n onChange?.(newValue);\n setLastTime(currentTime);\n }\n };\n\n return (\n <div onKeyDown={onKeyDown} className=\"size-0\">\n <input ref={focusRef} className=\"size-0 border-none p-0 shadow-none outline-none\" />\n </div>\n );\n};\n\nexport const RatingEditor = forwardRef(RatingEditorBase);\n","import { useEffect, useState } from 'react';\n\nexport function useIsTouchDevice() {\n const [touch, setTouch] = useState(false);\n useEffect(() => {\n const query = matchMedia('(pointer: coarse)');\n const update = () => setTouch(query.matches);\n update();\n query.addEventListener('change', update);\n return () => query.removeEventListener('change', update);\n }, []);\n return touch;\n}\n\nexport function useContentDir(): 'auto' {\n return 'auto';\n}\n","import { Check } from '../../../../grid-adapter/icons';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '../../../../grid-adapter/ui';\nimport { noop } from 'lodash';\nimport { forwardRef, useImperativeHandle, useRef, useState } from 'react';\nimport type { ForwardRefRenderFunction } from 'react';\nimport { useIsTouchDevice } from '../../../../grid-adapter/hooks';\nimport type { ISelectCell } from '../../renderers';\nimport type { IEditorProps, IEditorRef } from './EditorContainer';\n\nconst SelectEditorBase: ForwardRefRenderFunction<\n IEditorRef<ISelectCell>,\n IEditorProps<ISelectCell>\n> = (props, ref) => {\n const { cell, isEditing, style, onChange, setEditing, theme } = props;\n const { data, isMultiple, choiceSorted = [], choiceMap = {} } = cell;\n const [values, setValues] = useState(data);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const { cellOptionBg, cellOptionTextColor } = theme;\n // Under a finger the list opens without its search field taking focus (and the\n // keyboard with it); the field is there to be tapped.\n const isTouchDevice = useIsTouchDevice();\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n if (!isTouchDevice) inputRef.current?.focus();\n },\n setValue: (data: ISelectCell['data']) => setValues(data),\n saveValue: noop,\n }));\n\n const onSelect = (v: string, id?: string) => {\n const existIndex = values.findIndex((item) => {\n if (typeof item === 'string') return item === v;\n return item.title === v;\n });\n const newCellValue =\n existIndex > -1\n ? values.filter((_, index) => index !== existIndex)\n : [...values, id ? { id, title: v } : v];\n if (!isMultiple) {\n const value = newCellValue.length ? newCellValue[newCellValue.length - 1] : null;\n setTimeout(() => setEditing?.(false));\n setValues(value ? [value] : []);\n return onChange?.(value);\n }\n const value = newCellValue.length ? newCellValue : null;\n setValues(value || []);\n return onChange?.(value);\n };\n\n return (\n <Command className=\"rounded-sm border p-2 shadow-sm\" style={style}>\n <CommandInput ref={inputRef} placeholder=\"Search\" />\n <CommandList>\n <CommandEmpty>No found.</CommandEmpty>\n <CommandGroup aria-valuetext=\"name\">\n {isEditing &&\n choiceSorted.map(({ name, id }) => (\n <CommandItem\n className=\"justify-between\"\n key={name}\n value={name}\n onSelect={() => onSelect(name, id)}\n >\n <div\n className=\"text-ellipsis whitespace-nowrap rounded-[6px] px-2 text-[12px]\"\n style={{\n backgroundColor:\n (choiceMap?.[id] ?? choiceMap?.[name])?.backgroundColor ?? cellOptionBg,\n color: (choiceMap?.[id] ?? choiceMap?.[name])?.color ?? cellOptionTextColor,\n }}\n >\n {name}\n </div>\n {values?.includes(name) && <Check className={'ms-2 size-4'} />}\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n};\n\nexport const SelectEditor = forwardRef(SelectEditorBase);\n","export type ITextDirection = 'ltr' | 'rtl';\n\n/**\n * UI languages whose users get content-level direction handling.\n *\n * The gate exists purely to bound the blast radius of the first rollout — both\n * `dir=\"auto\"` and first-strong detection render LTR content identically with\n * or without it. Widening this set (or dropping the gate) is all that is needed\n * to also cover users who read the UI in English but enter RTL content.\n *\n * `he` was listed here ahead of the locale itself; the Hebrew translation now\n * ships, so both entries are live.\n */\nconst RTL_LANGS = new Set(['ar', 'he']);\n\nexport const isRtlLang = (lang?: string) => Boolean(lang && RTL_LANGS.has(lang.split('-')[0]));\n\n/**\n * Right-to-left scripts. Matched by script rather than by Bidi_Class because JS\n * regexes expose `\\p{Script=...}` but not `\\p{Bidi_Class=...}`.\n */\nconst RTL_SCRIPT =\n /[\\p{Script=Arabic}\\p{Script=Hebrew}\\p{Script=Syriac}\\p{Script=Thaana}\\p{Script=Nko}\\p{Script=Adlam}\\p{Script=Samaritan}\\p{Script=Mandaic}]/u;\n\n/** First character carrying a strong direction — the same signal `dir=\"auto\"` uses. */\nconst FIRST_STRONG = /[\\p{L}\\p{Nl}]/u;\n\n/**\n * Resolve the base direction of a string from its first strong character,\n * mirroring the semantics of the native `dir=\"auto\"` attribute.\n *\n * Returns `null` when the text carries no directional signal at all (digits,\n * punctuation, empty), in which case callers should leave direction untouched.\n */\nexport const detectTextDirection = (text: string): ITextDirection | null => {\n const strong = FIRST_STRONG.exec(text);\n if (strong == null) return null;\n return RTL_SCRIPT.test(strong[0]) ? 'rtl' : 'ltr';\n};\n\n/**\n * Canvas renderers are plain functions drawing outside the React tree, so the\n * language gate is mirrored into a module-level flag that `AppProvider` sets on\n * the client. While it is off, the renderers skip direction detection entirely.\n */\nlet contentDirectionEnabled = false;\n\nexport const setContentDirectionEnabled = (enabled: boolean) => {\n contentDirectionEnabled = enabled;\n};\n\nexport const isContentDirectionEnabled = () => contentDirectionEnabled;\n\n// Direction the content asks for, or null while the gate is off\nexport const resolveContentDirection = (text: string) =>\n isContentDirectionEnabled() ? detectTextDirection(text) : null;\n","import { LRUCache } from 'lru-cache';\nimport { resolveContentDirection } from '../../text-direction';\nimport { parseToRGB } from '../../utils';\nimport type {\n ILineProps,\n IMultiLineTextProps,\n IRectProps,\n IRoundPolyProps,\n ISingleLineTextProps,\n IVector,\n IPoint,\n ICheckboxProps,\n IRingProps,\n IProcessBarProps,\n IChartLineProps,\n IChartBarProps,\n ITextInfo,\n IAvatarProps,\n} from './interface';\n\nconst singleLineTextInfoCache: LRUCache<string, { text: string; width: number }> = new LRUCache({\n max: 1000,\n});\n\nconst multiLineTextInfoCache: LRUCache<string, ITextInfo[]> = new LRUCache({ max: 1000 });\n\nexport const TEXT_ELLIPSIS = '...';\n\nconst createFallbackSegmenter = () => ({\n segment: (text: string) => ({\n [Symbol.iterator]: function* () {\n for (let i = 0; i < text.length; i++) {\n yield { segment: text[i], index: i, input: text };\n }\n },\n }),\n});\n\nconst hasSegmenter = typeof Intl !== 'undefined' && typeof Intl.Segmenter === 'function';\nconst wordSegmenter = hasSegmenter\n ? new Intl.Segmenter(undefined, { granularity: 'word' })\n : createFallbackSegmenter();\nconst graphemeSegmenter = hasSegmenter\n ? new Intl.Segmenter(undefined, { granularity: 'grapheme' })\n : createFallbackSegmenter();\n\n// Longest prefix of text (word-bounded, then grapheme-bounded within the\n// overflowing word) whose measured width stays within budget\nconst truncateToBudget = (ctx: CanvasRenderingContext2D, text: string, budget: number) => {\n let keptText = '';\n let keptWidth = 0;\n\n for (const { segment } of wordSegmenter.segment(text)) {\n const segWidth = ctx.measureText(segment).width;\n if (keptWidth + segWidth > budget) {\n for (const { segment: grapheme } of graphemeSegmenter.segment(segment)) {\n const gWidth = ctx.measureText(grapheme).width;\n if (keptWidth + gWidth > budget) break;\n keptText += grapheme;\n keptWidth += gWidth;\n }\n break;\n }\n keptText += segment;\n keptWidth += segWidth;\n }\n\n return { text: keptText, width: keptWidth };\n};\n\n/**\n * Base direction to draw `text` with, or `null` to leave the canvas direction\n * untouched. Detection is skipped entirely while the language gate is off, so\n * every other locale keeps running the exact code path it ran before.\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const drawMultiLineText = (ctx: CanvasRenderingContext2D, props: IMultiLineTextProps) => {\n const {\n x = 0,\n y = 0,\n text,\n maxWidth,\n maxLines,\n isUnderline,\n fontSize = 13,\n lineHeight = 22,\n fill = 'black',\n textAlign = 'left',\n verticalAlign = 'middle',\n needRender = true,\n } = props;\n\n let lines: ITextInfo[] = [];\n const ellipsis = TEXT_ELLIPSIS;\n const ellipsisWidth = ctx.measureText(ellipsis).width;\n let currentLine = '';\n let currentLineWidth = 0;\n // Source offset where currentLine begins; every emitted line is a verbatim\n // slice of text starting there (plus the ellipsis when truncated)\n let lineStart = 0;\n\n const fontKey = ctx.font || '';\n const cacheKey = `${fontKey}-${text}-${fontSize}-${maxWidth}-${maxLines}`;\n const cachedLines = multiLineTextInfoCache.get(cacheKey);\n\n if (cachedLines) {\n lines = cachedLines;\n } else {\n let consumed = 0;\n\n const pushLine = (lineText: string, lineWidth: number) => {\n lines.push({ text: lineText, width: lineWidth, start: lineStart });\n };\n\n const append = (piece: string, pieceWidth: number, pieceStart: number) => {\n if (currentLine === '') lineStart = pieceStart;\n currentLine += piece;\n currentLineWidth += pieceWidth;\n };\n\n const addEllipsisLine = (overflowSeg?: string, overflowStart = 0) => {\n const budget = maxWidth - ellipsisWidth;\n if (currentLineWidth > budget) {\n const truncated = truncateToBudget(ctx, currentLine, budget);\n currentLine = truncated.text;\n currentLineWidth = truncated.width;\n } else if (overflowSeg) {\n let graphemeStart = overflowStart;\n for (const { segment: grapheme } of graphemeSegmenter.segment(overflowSeg)) {\n const gw = ctx.measureText(grapheme).width;\n if (currentLineWidth + gw > budget) break;\n append(grapheme, gw, graphemeStart);\n graphemeStart += grapheme.length;\n }\n }\n pushLine(currentLine + ellipsis, currentLineWidth + ellipsisWidth);\n currentLine = '';\n currentLineWidth = 0;\n };\n\n const addSegment = (seg: string, segWidth: number, segStart: number) => {\n if (currentLineWidth + segWidth <= maxWidth) {\n append(seg, segWidth, segStart);\n return;\n }\n if (segWidth <= maxWidth) {\n if (lines.length < maxLines - 1) {\n pushLine(currentLine, currentLineWidth);\n currentLine = '';\n currentLineWidth = 0;\n append(seg, segWidth, segStart);\n } else {\n addEllipsisLine(seg, segStart);\n }\n return;\n }\n let graphemeStart = segStart;\n for (const { segment: grapheme } of graphemeSegmenter.segment(seg)) {\n if (lines.length >= maxLines) break;\n const gWidth = ctx.measureText(grapheme).width;\n if (currentLineWidth + gWidth > maxWidth) {\n if (lines.length < maxLines - 1) {\n pushLine(currentLine, currentLineWidth);\n currentLine = '';\n currentLineWidth = 0;\n append(grapheme, gWidth, graphemeStart);\n } else {\n addEllipsisLine();\n }\n } else {\n append(grapheme, gWidth, graphemeStart);\n }\n graphemeStart += grapheme.length;\n }\n };\n\n for (const { segment } of wordSegmenter.segment(text)) {\n if (lines.length >= maxLines) break;\n\n if (segment.includes('\\n')) {\n const parts = segment.split('\\n');\n for (let p = 0; p < parts.length; p++) {\n if (lines.length >= maxLines) break;\n if (p > 0) {\n consumed++;\n if (lines.length + 1 === maxLines && consumed < text.length) {\n addEllipsisLine();\n break;\n }\n pushLine(currentLine, currentLineWidth);\n currentLine = '';\n currentLineWidth = 0;\n lineStart = consumed;\n }\n const part = parts[p];\n if (part.length > 0) {\n consumed += part.length;\n addSegment(part, ctx.measureText(part).width, consumed - part.length);\n }\n }\n continue;\n }\n\n consumed += segment.length;\n addSegment(segment, ctx.measureText(segment).width, consumed - segment.length);\n }\n\n if (lines.length < maxLines && currentLine !== '') {\n pushLine(currentLine, currentLineWidth);\n }\n\n multiLineTextInfoCache.set(cacheKey, lines);\n }\n\n const offsetY = verticalAlign === 'middle' ? fontSize / 2 : 0;\n\n if (needRender) {\n const contentDir = resolveContentDirection(text);\n // Only the direction-agnostic default alignment follows the content; an\n // explicit 'right'/'center' is a layout decision the caller already made.\n const isAutoRtl = contentDir === 'rtl' && textAlign === 'left';\n const finalX = isAutoRtl ? x + maxWidth : x;\n // Reading and writing ctx.direction is a canvas-state round-trip on the\n // grid's hot paint path, so it only happens when the content asks for it.\n const prevDirection = contentDir != null ? ctx.direction : null;\n\n if (fill) {\n ctx.fillStyle = fill;\n ctx.strokeStyle = fill;\n }\n if (contentDir != null) ctx.direction = contentDir;\n ctx.textAlign = isAutoRtl ? 'right' : textAlign;\n ctx.textBaseline = verticalAlign;\n\n for (let j = 0; j < lines.length; j++) {\n ctx.fillText(lines[j].text, finalX, y + j * lineHeight + offsetY);\n if (isUnderline) {\n const textWidth = ctx.measureText(lines[j].text).width;\n // Right-anchored text grows leftwards from finalX.\n const underlineStart = isAutoRtl ? finalX - textWidth : finalX;\n ctx.beginPath();\n ctx.moveTo(underlineStart, y + j * lineHeight + fontSize - 1);\n ctx.lineTo(underlineStart + textWidth, y + j * lineHeight + fontSize - 1);\n ctx.stroke();\n }\n }\n\n if (prevDirection != null) ctx.direction = prevDirection;\n }\n\n return lines;\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const drawSingleLineText = (ctx: CanvasRenderingContext2D, props: ISingleLineTextProps) => {\n const {\n x = 0,\n y = 0,\n text,\n fill,\n fontSize = 13,\n textAlign = 'left',\n verticalAlign = 'middle',\n maxWidth = Infinity,\n needRender = true,\n isUnderline = false,\n } = props;\n\n let width = 0;\n let displayText = '';\n\n const cacheKey = `${text}-${fontSize}-${maxWidth}`;\n const cachedTextInfo = singleLineTextInfoCache.get(cacheKey);\n\n if (cachedTextInfo) {\n width = cachedTextInfo.width;\n displayText = cachedTextInfo.text;\n } else {\n const fullWidth = ctx.measureText(text).width;\n\n if (fullWidth <= maxWidth) {\n displayText = text;\n width = fullWidth;\n } else {\n const ellipsis = TEXT_ELLIPSIS;\n const ellipsisWidth = ctx.measureText(ellipsis).width;\n // Reserve the ellipsis width up front so that the rendered text and the\n // returned width stay within maxWidth (as long as maxWidth fits at\n // least the ellipsis itself)\n const truncated = truncateToBudget(ctx, text, maxWidth - ellipsisWidth);\n\n // Logical order: the bidi algorithm places the ellipsis at the reading\n // end of the run, which is the visual left for RTL content.\n displayText = truncated.text + ellipsis;\n width = truncated.width + ellipsisWidth;\n }\n\n singleLineTextInfoCache.set(cacheKey, { text: displayText, width });\n }\n\n if (needRender) {\n const contentDir = resolveContentDirection(text);\n // Only the direction-agnostic default alignment follows the content; an\n // explicit 'right'/'center' is a layout decision the caller already made.\n // An unbounded maxWidth gives nothing to anchor against, so it stays as is.\n const isAutoRtl = contentDir === 'rtl' && textAlign === 'left' && maxWidth !== Infinity;\n const resolvedAlign = isAutoRtl ? 'right' : textAlign;\n const offsetY = verticalAlign === 'middle' ? fontSize / 2 : 0;\n const finalX = resolvedAlign === 'right' ? x + maxWidth : x;\n // Reading and writing ctx.direction is a canvas-state round-trip on the\n // grid's hot paint path, so it only happens when the content asks for it.\n const prevDirection = contentDir != null ? ctx.direction : null;\n\n if (fill) {\n ctx.fillStyle = fill;\n ctx.strokeStyle = fill;\n }\n if (contentDir != null) ctx.direction = contentDir;\n ctx.textAlign = resolvedAlign;\n ctx.textBaseline = verticalAlign;\n ctx.fillText(displayText, finalX, y + offsetY);\n if (isUnderline) {\n // Right-anchored text grows leftwards from finalX. Corrected only for the\n // content-driven case so existing right-aligned callers keep their geometry.\n const underlineStart = isAutoRtl ? finalX - width : finalX;\n ctx.beginPath();\n ctx.moveTo(underlineStart, y + offsetY + fontSize / 2 - 1);\n ctx.lineTo(underlineStart + width, y + offsetY + fontSize / 2 - 1);\n ctx.stroke();\n }\n\n if (prevDirection != null) ctx.direction = prevDirection;\n }\n\n return {\n text: displayText,\n width,\n };\n};\n\nexport const drawLine = (ctx: CanvasRenderingContext2D, props: ILineProps) => {\n const { x, y, points, stroke, lineWidth = 1, closed = false } = props;\n const length = points.length;\n\n ctx.save();\n ctx.beginPath();\n if (stroke) ctx.strokeStyle = stroke;\n ctx.lineWidth = lineWidth;\n ctx.lineJoin = 'round';\n ctx.translate(x, y);\n ctx.moveTo(points[0], points[1]);\n\n for (let n = 2; n < length; n += 2) {\n ctx.lineTo(points[n], points[n + 1]);\n }\n\n if (closed) {\n ctx.closePath();\n }\n ctx.stroke();\n ctx.restore();\n};\n\nexport const drawRect = (ctx: CanvasRenderingContext2D, props: IRectProps) => {\n const { x, y, width, height, fill, stroke, radius: _radius, opacity } = props;\n\n ctx.beginPath();\n if (fill) ctx.fillStyle = fill;\n if (stroke) ctx.strokeStyle = stroke;\n if (opacity) ctx.globalAlpha = opacity;\n\n if (_radius == null) {\n ctx.rect(x, y, width, height);\n } else {\n const radius =\n typeof _radius === 'number'\n ? { tl: _radius, tr: _radius, br: _radius, bl: _radius }\n : {\n tl: Math.min(_radius.tl, height / 2, width / 2),\n tr: Math.min(_radius.tr, height / 2, width / 2),\n bl: Math.min(_radius.bl, height / 2, width / 2),\n br: Math.min(_radius.br, height / 2, width / 2),\n };\n\n ctx.moveTo(x + radius.tl, y);\n ctx.arcTo(x + width, y, x + width, y + radius.tr, radius.tr);\n ctx.arcTo(x + width, y + height, x + width - radius.br, y + height, radius.br);\n ctx.arcTo(x, y + height, x, y + height - radius.bl, radius.bl);\n ctx.arcTo(x, y, x + radius.tl, y, radius.tl);\n }\n ctx.closePath();\n\n if (fill) ctx.fill();\n if (stroke) ctx.stroke();\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const drawRoundPoly = (ctx: CanvasRenderingContext2D, props: IRoundPolyProps) => {\n const { points, radiusAll, fill, stroke } = props;\n const asVec = function (p: IPoint, pp: IPoint): IVector {\n const vx = pp.x - p.x;\n const vy = pp.y - p.y;\n const vlen = Math.sqrt(vx * vx + vy * vy);\n const vnx = vx / vlen;\n const vny = vy / vlen;\n return {\n x: vx,\n y: pp.y - p.y,\n len: vlen,\n nx: vnx,\n ny: vny,\n ang: Math.atan2(vny, vnx),\n };\n };\n let radius: number;\n const len = points.length;\n let p1 = points[len - 1];\n\n ctx.beginPath();\n if (fill) ctx.fillStyle = fill;\n if (stroke) ctx.strokeStyle = stroke;\n for (let i = 0; i < len; i++) {\n let p2 = points[i % len];\n const p3 = points[(i + 1) % len];\n\n const v1 = asVec(p2, p1);\n const v2 = asVec(p2, p3);\n const sinA = v1.nx * v2.ny - v1.ny * v2.nx;\n const sinA90 = v1.nx * v2.nx - v1.ny * -v2.ny;\n let angle = Math.asin(Math.min(Math.max(sinA, -1), 1));\n let radDirection = 1;\n let drawDirection = false;\n if (sinA90 < 0) {\n if (angle < 0) {\n angle = Math.PI + angle;\n } else {\n angle = Math.PI - angle;\n radDirection = -1;\n drawDirection = true;\n }\n } else if (angle > 0) {\n radDirection = -1;\n drawDirection = true;\n }\n radius = p2.radius !== undefined ? p2.radius : radiusAll;\n\n const halfAngle = angle / 2;\n\n let lenOut = Math.abs((Math.cos(halfAngle) * radius) / Math.sin(halfAngle));\n\n let cRadius: number;\n if (lenOut > Math.min(v1.len / 2, v2.len / 2)) {\n lenOut = Math.min(v1.len / 2, v2.len / 2);\n cRadius = Math.abs((lenOut * Math.sin(halfAngle)) / Math.cos(halfAngle));\n } else {\n cRadius = radius;\n }\n\n let x = p2.x + v2.nx * lenOut;\n let y = p2.y + v2.ny * lenOut;\n\n x += -v2.ny * cRadius * radDirection;\n y += v2.nx * cRadius * radDirection;\n\n ctx.arc(\n x,\n y,\n cRadius,\n v1.ang + (Math.PI / 2) * radDirection,\n v2.ang - (Math.PI / 2) * radDirection,\n drawDirection\n );\n\n p1 = p2;\n p2 = p3;\n }\n ctx.closePath();\n if (fill) ctx.fill();\n if (stroke) ctx.stroke();\n};\n\nexport const drawCheckbox = (ctx: CanvasRenderingContext2D, props: ICheckboxProps) => {\n const { x, y, size, radius = 4, fill, stroke, isChecked = false } = props;\n const dynamicSize = isChecked ? size : size - 1;\n\n ctx.beginPath();\n drawRect(ctx, {\n x,\n y,\n width: dynamicSize,\n height: dynamicSize,\n radius,\n fill,\n stroke,\n });\n\n if (stroke) ctx.strokeStyle = stroke;\n if (isChecked) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(x + size / 4.23, y + size / 1.97);\n ctx.lineTo(x + size / 2.42, y + size / 1.44);\n ctx.lineTo(x + size / 1.29, y + size / 3.25);\n\n ctx.lineJoin = 'round';\n ctx.lineCap = 'round';\n ctx.lineWidth = 1.9;\n ctx.stroke();\n ctx.restore();\n }\n};\n\nexport const drawRing = (ctx: CanvasRenderingContext2D, props: IRingProps) => {\n const { x, y, radius, lineWidth = 5, value, maxValue, color } = props;\n const startAngle = -Math.PI / 2;\n const angle = value > maxValue ? 2 * Math.PI : (value / maxValue) * 2 * Math.PI;\n\n ctx.save();\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.globalAlpha = 0.2;\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI);\n ctx.stroke();\n\n ctx.strokeStyle = color;\n ctx.globalAlpha = 1;\n ctx.beginPath();\n ctx.arc(x, y, radius, startAngle, angle + startAngle);\n ctx.stroke();\n\n ctx.restore();\n};\n\nexport const drawProcessBar = (ctx: CanvasRenderingContext2D, props: IProcessBarProps) => {\n const { x, y, width, height, radius = 4, value, maxValue, color } = props;\n const progressWidth = value > maxValue ? width : (value / maxValue) * width;\n\n ctx.save();\n\n ctx.fillStyle = color;\n ctx.globalAlpha = 0.2;\n\n ctx.beginPath();\n drawRect(ctx, { x, y, width, height, radius });\n ctx.fill();\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, progressWidth, height);\n ctx.clip();\n\n ctx.fillStyle = color;\n ctx.globalAlpha = 1;\n drawRect(ctx, { x, y, width, height, radius });\n ctx.fill();\n ctx.restore();\n\n ctx.restore();\n};\n\nexport const drawChartLine = (ctx: CanvasRenderingContext2D, props: IChartLineProps) => {\n const {\n x,\n y,\n width,\n height,\n values,\n displayValues = [],\n color,\n axisColor,\n yAxis,\n font,\n hoverX,\n hoverAmount = 0,\n } = props;\n const [minY, maxY] = yAxis ?? [Math.min(...values), Math.max(...values)];\n const delta = maxY - minY === 0 ? 1 : maxY - minY;\n const zeroY = maxY <= 0 ? y : minY >= 0 ? y + height : y + height * (maxY / delta);\n\n let drawValues = values.map((d) => Math.min(1, Math.max(0, (d - minY) / delta)));\n\n if (drawValues.length === 1) {\n drawValues = [drawValues[0], drawValues[0]];\n }\n\n if (minY <= 0 && maxY >= 0) {\n ctx.beginPath();\n ctx.moveTo(x, zeroY);\n ctx.lineTo(x + width, zeroY);\n\n ctx.globalAlpha = 0.4;\n ctx.lineWidth = 1;\n ctx.strokeStyle = axisColor;\n ctx.stroke();\n ctx.globalAlpha = 1;\n }\n\n ctx.beginPath();\n\n const xStep = width / (drawValues.length - 1);\n const points = drawValues.map((val, index) => {\n return {\n x: x + xStep * index,\n y: y + height - val * height,\n };\n });\n\n if (points.length > 2) {\n ctx.moveTo(points[0].x, points[0].y);\n for (let i = 0; i < points.length - 2; i++) {\n const xControl = (points[i].x + points[i + 1].x) / 2;\n const yControl = (points[i].y + points[i + 1].y) / 2;\n ctx.quadraticCurveTo(points[i].x, points[i].y, xControl, yControl);\n }\n const curIndex = points.length - 2;\n ctx.quadraticCurveTo(\n points[curIndex].x,\n points[curIndex].y,\n points[curIndex + 1].x,\n points[curIndex + 1].y\n );\n } else {\n ctx.moveTo(points[0].x, points[0].y);\n ctx.lineTo(points[1].x, points[1].y);\n }\n\n ctx.strokeStyle = color;\n ctx.lineWidth = 1 + hoverAmount * 0.5;\n ctx.stroke();\n\n ctx.lineTo(x + width, zeroY);\n ctx.lineTo(x, zeroY);\n ctx.closePath();\n\n ctx.globalAlpha = 0.2 + 0.2 * hoverAmount;\n const grad = ctx.createLinearGradient(0, y, 0, y + height * 1.4);\n grad.addColorStop(0, color);\n\n const [r, g, b] = parseToRGB(color);\n grad.addColorStop(1, `rgba(${r}, ${g}, ${b}, 0)`);\n ctx.fillStyle = grad;\n ctx.fill();\n ctx.globalAlpha = 1;\n\n if (hoverX != null) {\n ctx.beginPath();\n const closest = Math.min(values.length - 1, Math.max(0, Math.round(hoverX / xStep)));\n ctx.moveTo(x + closest * xStep, y);\n ctx.lineTo(x + closest * xStep, y + height);\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = axisColor;\n ctx.stroke();\n\n ctx.save();\n ctx.font = font;\n drawSingleLineText(ctx, {\n x,\n y,\n text: displayValues[closest] ?? values[closest],\n fill: axisColor,\n });\n ctx.restore();\n }\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const drawChartBar = (ctx: CanvasRenderingContext2D, props: IChartBarProps) => {\n const {\n x,\n y,\n width,\n height,\n values,\n displayValues = [],\n color,\n axisColor,\n yAxis,\n font,\n hoverX,\n } = props;\n\n const barMaxWidth = 8;\n const [originMinY, maxY] = yAxis ?? [Math.min(...values), Math.max(...values)];\n const minY = Math.min(originMinY, 0);\n const delta = maxY - minY === 0 ? 1 : maxY - minY;\n const zeroY = maxY <= 0 ? y : minY >= 0 ? y + height : y + height * (maxY / delta);\n\n const drawValues = values.map((d) => Math.min(1, Math.max(0, (d - minY) / delta)));\n\n if (minY <= 0 && maxY >= 0) {\n ctx.beginPath();\n ctx.moveTo(x, zeroY);\n ctx.lineTo(x + width, zeroY);\n\n ctx.globalAlpha = 0.4;\n ctx.lineWidth = 0.5;\n ctx.strokeStyle = axisColor;\n ctx.stroke();\n ctx.globalAlpha = 1;\n }\n\n ctx.beginPath();\n const margin = 2;\n const spacing = (drawValues.length - 1) * margin;\n const barWidth = Math.min((width - spacing) / drawValues.length, barMaxWidth);\n\n let drawX = x;\n for (const val of drawValues) {\n let barY = y + height - val * height;\n barY = barY === zeroY ? zeroY - 0.5 : barY;\n ctx.moveTo(drawX, zeroY);\n ctx.lineTo(drawX + barWidth, zeroY);\n ctx.lineTo(drawX + barWidth, barY);\n ctx.lineTo(drawX, barY);\n\n drawX += barWidth + margin;\n }\n ctx.fillStyle = color;\n ctx.fill();\n\n if (hoverX != null && hoverX >= 0) {\n ctx.beginPath();\n const xStep = Math.min(width / drawValues.length, barMaxWidth + margin);\n const closest =\n hoverX > drawX - x - margin\n ? null\n : Math.min(drawValues.length - 1, Math.max(0, Math.floor(hoverX / xStep)));\n\n if (closest == null) return;\n\n const finalHoverX = x + closest * xStep + (xStep - margin) / 2;\n ctx.moveTo(finalHoverX, y);\n ctx.lineTo(finalHoverX, y + height);\n\n ctx.lineWidth = 1;\n ctx.strokeStyle = axisColor;\n ctx.stroke();\n\n ctx.save();\n ctx.font = font;\n drawSingleLineText(ctx, {\n x,\n y,\n text: displayValues[closest] ?? values[closest],\n fill: axisColor,\n });\n ctx.restore();\n }\n};\n\nexport const drawAvatar = (ctx: CanvasRenderingContext2D, props: IAvatarProps) => {\n const {\n x,\n y,\n width,\n height,\n fill,\n stroke,\n defaultText,\n textColor,\n img,\n fontSize = 10,\n fontFamily,\n } = props;\n\n ctx.save();\n ctx.beginPath();\n\n // wrapper stroke\n if (stroke) ctx.strokeStyle = stroke;\n ctx.arc(x + width / 2, y + height / 2, width / 2, 0, Math.PI * 2, false);\n\n if (fill) ctx.fillStyle = fill;\n if (fill) ctx.fill();\n if (stroke) ctx.stroke();\n\n if (img) {\n ctx.clip();\n ctx.drawImage(img, x, y, width, height);\n if (stroke) ctx.stroke();\n ctx.restore();\n return;\n }\n\n const textAbb = defaultText.slice(0, 1);\n\n ctx.beginPath();\n if (textColor) ctx.fillStyle = textColor;\n ctx.font = `${fontSize}px ${fontFamily}`;\n\n drawSingleLineText(ctx, {\n x: x + width / 2,\n y: y + height / 2 - fontSize / 2,\n text: textAbb,\n textAlign: 'center',\n fontSize: fontSize,\n });\n\n if (fill) ctx.fill();\n if (stroke) ctx.stroke();\n\n ctx.restore();\n};\n","import { GRID_DEFAULT } from '../../configs';\nimport { inRange } from '../../utils';\nimport { drawCheckbox } from '../base-renderer';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ICellRenderProps,\n IBooleanCell,\n ICellClickProps,\n ICellClickCallback,\n} from './interface';\n\nconst { cellHorizontalPadding } = GRID_DEFAULT;\n\nexport const booleanCellRenderer: IInternalCellRenderer<IBooleanCell> = {\n type: CellType.Boolean,\n needsHover: true,\n needsHoverPosition: true,\n draw: (cell: IBooleanCell, props: ICellRenderProps) => {\n const { data, isMultiple, contentAlign = 'center' } = cell;\n const { ctx, rect, theme } = props;\n const { x, y, width, height } = rect;\n const { iconSizeSM, staticWhite, iconBgSelected, rowHeaderTextColor } = theme;\n const halfIconSize = iconSizeSM / 2;\n\n if (!isMultiple) {\n let textOffsetX = width / 2 - halfIconSize;\n\n if (contentAlign === 'left') {\n textOffsetX = cellHorizontalPadding;\n } else if (contentAlign === 'right') {\n textOffsetX = width - cellHorizontalPadding - iconSizeSM;\n }\n\n return drawCheckbox(ctx, {\n x: x + textOffsetX,\n y: y + height / 2 - halfIconSize,\n size: iconSizeSM,\n stroke: data ? staticWhite : rowHeaderTextColor,\n fill: data ? iconBgSelected : undefined,\n isChecked: data,\n });\n }\n\n if (isMultiple && Array.isArray(data)) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n\n let startX = x + cellHorizontalPadding;\n const startY = y + height / 2 - halfIconSize;\n data.forEach((check) => {\n if (check) {\n drawCheckbox(ctx, {\n x: startX,\n y: startY,\n size: iconSizeSM,\n stroke: staticWhite,\n fill: iconBgSelected,\n isChecked: true,\n });\n startX += iconSizeSM + cellHorizontalPadding / 2;\n }\n });\n\n ctx.restore();\n }\n },\n checkRegion: (cell: IBooleanCell, props: ICellClickProps, _shouldCalculate?: boolean) => {\n const { data, readonly } = cell;\n if (readonly) return { type: CellRegionType.Blank };\n const { hoverCellPosition, width, height, theme } = props;\n const [x, y] = hoverCellPosition;\n const { iconSizeSM } = theme;\n const halfIconSize = iconSizeSM / 2;\n\n if (\n inRange(x, width / 2 - halfIconSize, width / 2 + halfIconSize) &&\n inRange(y, height / 2 - halfIconSize, height / 2 + halfIconSize)\n ) {\n return {\n type: CellRegionType.Update,\n data: !data || null,\n };\n }\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: IBooleanCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const cellRegion = booleanCellRenderer.checkRegion?.(cell, props, true);\n if (!cellRegion || cellRegion.type === CellRegionType.Blank) return;\n callback(cellRegion);\n },\n};\n","import { Colors } from '../../../../grid-adapter/core';\nimport { LRUCache } from 'lru-cache';\nimport { getSelectColorPairs } from '../../../../grid-adapter/core';\n\nimport type { IGridTheme } from '../../configs';\nimport { GRID_DEFAULT } from '../../configs';\nimport type { IRectangle } from '../../interface';\nimport { inRange } from '../../utils';\nimport { drawRect, drawSingleLineText } from '../base-renderer';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ICellRenderProps,\n ICellClickProps,\n ICellClickCallback,\n IButtonCell,\n ICellMeasureProps,\n} from './interface';\n\nconst { cellHorizontalPadding } = GRID_DEFAULT;\n\nconst BUTTON_RADIUS = 4;\nconst BUTTON_HEIGHT = 24;\nconst BUTTON_MIN_WIDTH = 60;\nconst BUTTON_MAX_WIDTH = 126;\n\nconst positionCache: LRUCache<string, IRectangle> = new LRUCache({\n max: 10,\n});\n\nconst clickHandler = (cell: IButtonCell) => {\n const { id = '', data, readonly } = cell;\n if (readonly) return;\n\n const { tableId, statusHook, fieldOptions, record } = data;\n const [recordId = '', fieldId = ''] = id.split('-');\n if (!statusHook) return;\n const isLoading = statusHook.checkLoading?.(fieldId, recordId) ?? false;\n if (isLoading) return;\n statusHook.buttonClick({\n tableId,\n recordId,\n fieldId,\n name: fieldOptions.label,\n confirm: fieldOptions.confirm,\n record,\n });\n};\n\nconst drawButton = (\n ctx: CanvasRenderingContext2D,\n props: {\n x: number;\n y: number;\n width: number;\n height: number;\n text: string;\n maxTextWidth: number;\n textColor: string;\n bgColor: string;\n theme: IGridTheme;\n opacity?: number;\n }\n) => {\n const { x, y, width, height, text, maxTextWidth, textColor, bgColor, theme, opacity = 1 } = props;\n const { fontSizeXS, fontFamily } = theme;\n\n ctx.save();\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n radius: BUTTON_RADIUS,\n fill: bgColor,\n opacity,\n });\n\n drawSingleLineText(ctx, {\n text,\n x: x + width / 2,\n y: y + (height - fontSizeXS) / 2 + 0.5,\n fill: textColor,\n maxWidth: maxTextWidth,\n fontSize: fontSizeXS,\n textAlign: 'center',\n });\n\n ctx.restore();\n};\n\nconst calcPosition = (\n cell: IButtonCell,\n props: { width: number; ctx: CanvasRenderingContext2D; theme: IGridTheme; height: number },\n flush = false\n) => {\n const { data } = cell;\n const { fieldOptions } = data;\n const { width, ctx, theme, height } = props;\n const { fontSizeXS, fontFamily } = theme;\n const cacheKey = `${fieldOptions.label}-${width}-${height}`;\n if (!flush) {\n const cachedRect = positionCache.get(cacheKey);\n if (cachedRect) return cachedRect;\n }\n\n ctx.save();\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n const { width: textWidth } = drawSingleLineText(ctx, {\n text: fieldOptions.label,\n maxWidth: BUTTON_MAX_WIDTH - 2 * cellHorizontalPadding,\n fontSize: fontSizeXS,\n needRender: false,\n });\n ctx.restore();\n\n const finnalTextWidth = Math.max(textWidth, BUTTON_MIN_WIDTH - 2 * cellHorizontalPadding);\n const rectWidth = finnalTextWidth + 2 * cellHorizontalPadding;\n\n const position: IRectangle = {\n x: (width - rectWidth) / 2,\n y: (height - BUTTON_HEIGHT) / 2,\n width: rectWidth,\n height: BUTTON_HEIGHT,\n };\n positionCache.set(cacheKey, position);\n return position;\n};\n\nexport const buttonCellRenderer: IInternalCellRenderer<IButtonCell> = {\n type: CellType.Button,\n needsHover: true,\n needsHoverPosition: true,\n needsHoverWhenActive: true,\n needsHoverPositionWhenActive: true,\n measure: (cell: IButtonCell, props: ICellMeasureProps) => {\n const { width, height, ctx, theme } = props;\n const position = calcPosition(\n cell,\n {\n width,\n ctx,\n theme,\n height,\n },\n true\n );\n return {\n width,\n height: Math.max(height, position.height),\n totalHeight: position.height,\n };\n },\n draw: (cell: IButtonCell, props: ICellRenderProps) => {\n const { data, id = '', readonly } = cell;\n const { fieldOptions, statusHook } = data;\n const { ctx, rect, theme } = props;\n const { x, y, width, height } = rect;\n const rectColor = readonly ? Colors.Gray : fieldOptions.color;\n const { color: textColor, backgroundColor: bgColor } = getSelectColorPairs(\n rectColor,\n theme.themeKey\n );\n const position = calcPosition(cell, {\n width,\n ctx,\n theme,\n height,\n });\n\n const [recordId = '', fieldId = ''] = id.split('-');\n const isLoading = statusHook?.checkLoading?.(fieldId, recordId) ?? false;\n\n return drawButton(ctx, {\n x: x + position.x,\n y: y + position.y,\n width: position.width,\n height: position.height,\n text: fieldOptions.label,\n maxTextWidth: position.width - 2 * cellHorizontalPadding,\n textColor,\n bgColor,\n theme,\n opacity: isLoading ? 0.8 : 1,\n });\n },\n checkRegion: (cell: IButtonCell, props: ICellClickProps, _shouldCalculate?: boolean) => {\n const { data } = cell;\n const { fieldOptions } = data;\n const { hoverCellPosition, width, height } = props;\n const [x, y] = hoverCellPosition;\n\n const cacheKey = `${fieldOptions.label}-${width}-${height}`;\n const rect = positionCache.get(cacheKey);\n if (\n rect &&\n inRange(x, rect.x, rect.x + rect.width) &&\n inRange(y, rect.y, rect.y + rect.height)\n ) {\n return {\n type: CellRegionType.Hover,\n data: {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n },\n };\n }\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: IButtonCell, props: ICellClickProps, _callback: ICellClickCallback) => {\n const cellRegion = buttonCellRenderer.checkRegion?.(cell, props, true);\n if (!cellRegion || cellRegion.type === CellRegionType.Blank) return;\n\n clickHandler(cell);\n // callback(cellRegion);\n },\n};\n","import { GRID_DEFAULT } from '../../configs';\nimport { drawChartBar, drawChartLine } from '../base-renderer';\nimport { CellType, ChartType } from './interface';\nimport type { IInternalCellRenderer, ICellRenderProps, IChartCell } from './interface';\n\nconst { cellHorizontalPadding, cellVerticalPaddingXS } = GRID_DEFAULT;\n\nexport const chartCellRenderer: IInternalCellRenderer<IChartCell> = {\n type: CellType.Chart,\n needsHover: true,\n needsHoverPosition: true,\n draw: (cell: IChartCell, props: ICellRenderProps) => {\n const { ctx, rect, theme, hoverCellPosition } = props;\n const { rowHeaderTextColor: lineColor, fontFamily } = theme;\n const { x, y, width, height } = rect;\n const { data, displayData, chartType = ChartType.Line, color = lineColor } = cell;\n\n if (!data?.length || !displayData?.length) return;\n\n const [hoverX] = hoverCellPosition ?? [];\n const hoverAmount = hoverCellPosition ? 1 : 0;\n\n if (chartType === ChartType.Bar) {\n drawChartBar(ctx, {\n x: x + cellHorizontalPadding,\n y: y + cellVerticalPaddingXS,\n width: width - cellHorizontalPadding * 2,\n height: height - cellVerticalPaddingXS * 2,\n values: data,\n color,\n axisColor: lineColor,\n font: `8px ${fontFamily}`,\n hoverX: hoverX ? hoverX - cellHorizontalPadding : undefined,\n displayValues: displayData,\n });\n }\n\n if (chartType === ChartType.Line) {\n drawChartLine(ctx, {\n x: x + cellHorizontalPadding,\n y: y + cellVerticalPaddingXS,\n width: width - cellHorizontalPadding * 2,\n height: height - cellVerticalPaddingXS * 2,\n values: data,\n color,\n axisColor: lineColor,\n font: `8px ${fontFamily}`,\n hoverX: hoverX ? hoverX - cellHorizontalPadding : undefined,\n hoverAmount,\n displayValues: displayData,\n });\n }\n },\n};\n","import { LRUCache } from 'lru-cache';\nimport { GRID_DEFAULT } from '../../configs';\nimport type { IRectangle } from '../../interface';\nimport { GridInnerIcon } from '../../managers';\nimport { isPointInsideRectangle } from '../../utils';\nimport { drawRect } from '../base-renderer';\nimport type {\n ICellClickCallback,\n ICellClickProps,\n ICellRenderProps,\n IImageCell,\n IImageData,\n IInternalCellRenderer,\n} from './interface';\nimport { CellRegionType, CellType } from './interface';\n\nconst imagePositionCache: LRUCache<string, (IRectangle & { id: string })[]> = new LRUCache({\n max: 200,\n});\n\nconst INNER_PADDING = 4;\n\nconst { cellHorizontalPadding, cellVerticalPaddingXS } = GRID_DEFAULT;\n\nconst drawImagePlaceholder = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n fill: string\n) => {\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n radius: INNER_PADDING,\n fill,\n });\n};\n\n// A plain placeholder while the image is in flight; once the load has failed,\n// the file icon (with the placeholder for the frames until the icon is ready).\nconst drawImageFallback = (\n ctx: CanvasRenderingContext2D,\n props: IRectangle & { fallbackImg?: HTMLImageElement | ImageBitmap; fill: string }\n) => {\n const { fallbackImg, x, y, width, height, fill } = props;\n if (!fallbackImg) {\n drawImagePlaceholder(ctx, x, y, width, height, fill);\n return;\n }\n // The file icon is square: fit it into the slot instead of stretching it.\n const side = Math.min(width, height);\n ctx.drawImage(fallbackImg, x + (width - side) / 2, y + (height - side) / 2, side, side);\n};\n\nconst generateCacheKey = (data: IImageData[], width: number) => {\n return `${String(width)}-${data.map(({ id }) => id).join(',')}`;\n};\n\nconst getImageWidth = (\n imageItem: IImageData,\n img: HTMLImageElement | ImageBitmap | undefined,\n imgHeight: number\n) => {\n const imageRatio = img?.height ? img.width / img.height : undefined;\n const { width, height } = imageItem;\n const metadataRatio =\n typeof width === 'number' && typeof height === 'number' && width > 0 && height > 0\n ? width / height\n : undefined;\n const ratio = imageRatio ?? metadataRatio ?? 1;\n return imgHeight * ratio;\n};\n\nexport const imageCellRenderer: IInternalCellRenderer<IImageCell> = {\n type: CellType.Image,\n needsHoverWhenActive: true,\n needsHoverPositionWhenActive: true,\n draw: (cell: IImageCell, props: ICellRenderProps) => {\n const { rect, columnIndex, rowIndex, theme, ctx, imageManager, isActive, spriteManager } =\n props;\n const { iconSizeSM, cellLineColor, cellOptionBgHighlight } = theme;\n const { data, readonly } = cell;\n const { x, y, width, height } = rect;\n const editable = !readonly && isActive;\n const initPadding = editable ? iconSizeSM + 2 : 0;\n const imgHeight = height - cellVerticalPaddingXS * 2;\n\n if (editable) {\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Add,\n x: x + cellHorizontalPadding - 2,\n y: y + (height - iconSizeSM) / 2,\n size: iconSizeSM,\n theme,\n });\n }\n\n if (!data.length) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, width - 0.5, height);\n ctx.clip();\n\n const cacheKey = generateCacheKey(data, width);\n const positions: (IRectangle & { id: string })[] = [];\n\n let drawX = x + cellHorizontalPadding + initPadding;\n\n for (const imageItem of data) {\n if (drawX > x + width) break;\n const { id, url, fallbackUrl } = imageItem;\n const img = imageManager.loadOrGetImage(url, columnIndex, rowIndex);\n const imgWidth = getImageWidth(imageItem, img, imgHeight);\n drawRect(ctx, {\n x: drawX,\n y: y + cellVerticalPaddingXS,\n width: imgWidth,\n height: imgHeight,\n radius: INNER_PADDING,\n stroke: cellLineColor,\n });\n\n if (img) {\n ctx.save();\n drawRect(ctx, {\n x: drawX,\n y: y + cellVerticalPaddingXS,\n width: imgWidth,\n height: imgHeight,\n radius: INNER_PADDING,\n });\n ctx.clip();\n ctx.drawImage(img, drawX, y + cellVerticalPaddingXS, imgWidth, imgHeight);\n ctx.restore();\n } else {\n drawImageFallback(ctx, {\n fallbackImg:\n fallbackUrl && imageManager.hasFailed(url)\n ? imageManager.loadOrGetImage(fallbackUrl, columnIndex, rowIndex)\n : undefined,\n x: drawX,\n y: y + cellVerticalPaddingXS,\n width: imgWidth,\n height: imgHeight,\n fill: cellOptionBgHighlight,\n });\n }\n\n positions.push({\n id,\n x: drawX - x,\n y: cellVerticalPaddingXS,\n width: imgWidth,\n height: imgHeight,\n });\n drawX += imgWidth + INNER_PADDING;\n }\n\n imagePositionCache.set(cacheKey, positions);\n\n ctx.restore();\n },\n checkRegion: (cell: IImageCell, props: ICellClickProps, _shouldCalculate?: boolean) => {\n const { data, readonly } = cell;\n const { width, height, theme, isActive, hoverCellPosition } = props;\n const editable = !readonly && isActive;\n\n const { iconSizeSM } = theme;\n const [hoverX, hoverY] = hoverCellPosition;\n const startX = cellHorizontalPadding;\n const startY = (height - iconSizeSM) / 2;\n\n if (\n editable &&\n isPointInsideRectangle(\n [hoverX, hoverY],\n [startX, startY],\n [startX + iconSizeSM, startY + iconSizeSM]\n )\n ) {\n return { type: CellRegionType.ToggleEditing, data: null };\n }\n\n const cacheKey = generateCacheKey(data, width);\n const imagePositions = imagePositionCache.get(cacheKey);\n\n if (imagePositions == null) return { type: CellRegionType.Blank };\n\n for (let i = 0; i < imagePositions.length; i++) {\n const { id, x, y, width, height } = imagePositions[i];\n\n if (isPointInsideRectangle([hoverX, hoverY], [x, y], [x + width, y + height])) {\n return {\n type: CellRegionType.Preview,\n data: id,\n };\n }\n }\n\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: IImageCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const cellRegion = imageCellRenderer.checkRegion?.(cell, props, true);\n if (!cellRegion || cellRegion.type === CellRegionType.Blank) return;\n if (cellRegion.type === CellRegionType.Preview) {\n cell?.onPreview?.(cellRegion.data as string);\n return callback(cellRegion);\n }\n callback(cellRegion);\n },\n};\n","import { detectTextDirection, isContentDirectionEnabled } from '../../text-direction';\nimport type { IGridTheme } from '../../configs';\nimport { GRID_DEFAULT } from '../../configs';\nimport type { IRectangle } from '../../interface';\nimport { measuredCanvas } from '../../utils';\nimport { drawLine, drawMultiLineText } from '../base-renderer';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ICellRenderProps,\n ILinkCell,\n ICellClickProps,\n ICellClickCallback,\n ICellMeasureProps,\n} from './interface';\n\ninterface ITextPosition {\n x: number;\n y: number;\n key: string;\n text: string;\n link: string;\n width: number;\n}\n\ninterface IComputeTextPositionProps {\n ctx: CanvasRenderingContext2D;\n data: string[];\n rect: IRectangle;\n theme: IGridTheme;\n isActive?: boolean;\n}\n\nconst { cellHorizontalPadding, cellVerticalPaddingMD, cellTextLineHeight, maxRowCount } =\n GRID_DEFAULT;\n\nconst computeTextPositions = ({\n ctx,\n data,\n rect,\n theme,\n isActive,\n}: IComputeTextPositionProps): ITextPosition[] => {\n const positions: ITextPosition[] = [];\n const { x, y, width, height } = rect;\n const { fontSizeSM } = theme;\n const drawWidth = width - 2 * cellHorizontalPadding;\n const drawHeight = height - cellVerticalPaddingMD;\n const maxLines = isActive ? Infinity : Math.max(1, Math.floor(drawHeight / cellTextLineHeight));\n\n let row = 1;\n let index = 0;\n let drawX = x + cellHorizontalPadding;\n let drawY = y + cellVerticalPaddingMD;\n\n for (const text of data) {\n const textLines = drawMultiLineText(ctx, {\n text,\n maxLines,\n maxWidth: drawWidth,\n needRender: false,\n fontSize: fontSizeSM,\n });\n\n for (const { text: lineText, width: textWidth } of textLines) {\n if (row > maxLines) break;\n\n positions.push({\n x: drawX,\n y: drawY,\n text: lineText,\n width: textWidth,\n link: text,\n key: String(index),\n });\n\n row++;\n drawY += cellTextLineHeight;\n drawX = x + cellHorizontalPadding;\n }\n\n index++;\n }\n\n return positions;\n};\n\nexport const linkCellRenderer: IInternalCellRenderer<ILinkCell> = {\n type: CellType.Link,\n needsHover: true,\n needsHoverPosition: true,\n measure: (cell: ILinkCell, props: ICellMeasureProps) => {\n const { data } = cell;\n const { ctx, theme, width, height } = props;\n\n if (!data.length) {\n return { width, height, totalHeight: height };\n }\n\n const textPositions = computeTextPositions({\n ctx,\n data,\n rect: { x: 0, y: 0, width, height },\n theme,\n isActive: true,\n });\n\n const positionLength = textPositions.length;\n if (!positionLength) return { width, height, totalHeight: height };\n\n const totalHeight = textPositions[positionLength - 1].y + cellTextLineHeight;\n const maxHeight = cellVerticalPaddingMD + maxRowCount * cellTextLineHeight;\n const finalHeight = Math.max(Math.min(totalHeight, maxHeight), height);\n\n return {\n width,\n height: finalHeight,\n totalHeight,\n };\n },\n draw: (cell: ILinkCell, props: ICellRenderProps) => {\n const { ctx, rect, theme, hoverCellPosition, isActive } = props;\n const { data } = cell;\n const { x: originX, y: originY, width: originWidth, height: originHeight } = rect;\n const [hoverX, hoverY] = hoverCellPosition || [-1, -1];\n const { fontSizeSM, cellTextColorHighlight } = theme;\n\n ctx.save();\n ctx.beginPath();\n\n if (data.length && !isActive) {\n ctx.rect(originX, originY, originWidth, originHeight);\n ctx.clip();\n }\n\n const textPositions = computeTextPositions({\n ctx,\n data,\n rect,\n theme,\n isActive,\n });\n\n const prevDirection = ctx.direction;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = cellTextColorHighlight;\n\n let hoveredLink = '';\n let hoveredKey = '';\n const offsetY = fontSizeSM / 2;\n\n textPositions.forEach((position) => {\n const { x, y, width, text, link, key } = position;\n const isHovered =\n hoverX >= cellHorizontalPadding &&\n hoverX <= cellHorizontalPadding + width &&\n hoverY >= y - originY &&\n hoverY <= y - originY + cellTextLineHeight;\n\n if (isHovered) {\n hoveredLink = link;\n hoveredKey = key;\n }\n\n // Each linked title is its own bidi run: give it the direction its own\n // content implies so neutrals land correctly, while the chips themselves\n // keep flowing in the grid's own direction.\n const contentDir = isContentDirectionEnabled() ? detectTextDirection(text) : null;\n if (contentDir != null) ctx.direction = contentDir;\n ctx.fillText(text, x, y + offsetY);\n if (contentDir != null) ctx.direction = prevDirection;\n });\n\n if (hoveredLink) {\n textPositions.forEach((position) => {\n const { x, y, width, key } = position;\n\n if (key === hoveredKey) {\n drawLine(ctx, {\n x,\n y,\n points: [0, fontSizeSM - 1, width, fontSizeSM - 1],\n stroke: cellTextColorHighlight,\n });\n }\n });\n }\n\n ctx.restore();\n },\n checkRegion: (cell: ILinkCell, props: ICellClickProps, _shouldCalculate?: boolean) => {\n const { hoverCellPosition, width, height, isActive, theme, activeCellBound } = props;\n const [hoverX, originHoverY] = hoverCellPosition;\n const { fontSizeSM } = theme;\n const { data } = cell;\n\n if (measuredCanvas == null) return { type: CellRegionType.Blank };\n\n const { ctx, setFontSize } = measuredCanvas;\n\n if (!ctx) return { type: CellRegionType.Blank };\n\n // activeCellBound describes the active cell even while hit-testing others\n const scrollTop = isActive ? (activeCellBound?.scrollTop ?? 0) : 0;\n const hoverY = originHoverY + scrollTop;\n\n setFontSize(fontSizeSM);\n\n const textPositions = computeTextPositions({\n ctx,\n data,\n rect: { x: 0, y: 0, width, height },\n theme,\n isActive,\n });\n\n for (const position of textPositions) {\n const { x, y, width, link } = position;\n if (hoverX >= x && hoverX <= x + width && hoverY >= y && hoverY <= y + cellTextLineHeight) {\n return { type: CellRegionType.Preview, data: link };\n }\n }\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: ILinkCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const cellRegion = linkCellRenderer.checkRegion?.(cell, props, true);\n if (cellRegion?.type !== CellRegionType.Preview) return;\n cell.onClick?.(cellRegion.data as string);\n // Lets the touch layer know a link was tapped so it does not also activate the cell\n callback(cellRegion);\n },\n};\n","import { GRID_DEFAULT } from '../../configs';\nimport { drawRect } from '../base-renderer';\nimport type { ICellRenderProps, IInternalCellRenderer, ILoadingCell } from './interface';\nimport { CellType } from './interface';\n\nconst { cellHorizontalPadding, cellVerticalPaddingXS } = GRID_DEFAULT;\n\nexport const loadingCellRenderer: IInternalCellRenderer<ILoadingCell> = {\n type: CellType.Loading,\n draw: (cell: ILoadingCell, props: ICellRenderProps) => {\n const { ctx, theme, rect } = props;\n const { x, y, width, height } = rect;\n const { cellBgLoading } = theme;\n\n drawRect(ctx, {\n x: x + cellHorizontalPadding,\n y: y + cellVerticalPaddingXS,\n width: width - 2 * cellHorizontalPadding,\n height: height - 2 * cellVerticalPaddingXS,\n radius: 4,\n fill: cellBgLoading,\n });\n },\n};\n","import { GRID_DEFAULT } from '../../configs';\nimport { drawMultiLineText, drawProcessBar, drawRing } from '../base-renderer/baseRenderer';\nimport { CellType, NumberDisplayType } from './interface';\nimport type {\n INumberCell,\n ICellRenderProps,\n ICellMeasureProps,\n IInternalCellRenderer,\n} from './interface';\n\nconst RING_RADIUS = 8.5;\nconst RING_LINE_WIDTH = 5;\nconst TEXT_GAP = 4;\n\nconst { maxRowCount, cellVerticalPaddingMD, cellHorizontalPadding, cellTextLineHeight } =\n GRID_DEFAULT;\n\nexport const numberCellRenderer: IInternalCellRenderer<INumberCell> = {\n type: CellType.Number,\n measure: (cell: INumberCell, props: ICellMeasureProps) => {\n const { displayData, showAs } = cell;\n const { width, height } = props;\n\n if (!displayData || typeof displayData === 'string' || showAs != null) {\n return { width, height, totalHeight: height };\n }\n\n const lineCount = displayData.length;\n const totalHeight = cellVerticalPaddingMD + lineCount * cellTextLineHeight;\n const displayRowCount = Math.min(maxRowCount, lineCount);\n\n return {\n width,\n height: Math.max(height, cellVerticalPaddingMD + displayRowCount * cellTextLineHeight),\n totalHeight,\n };\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n draw: (cell: INumberCell, props: ICellRenderProps) => {\n const { data, displayData, showAs, contentAlign = 'right' } = cell;\n\n if (data == null || displayData == null || displayData === '') return;\n\n const { ctx, rect, theme, isActive } = props;\n const { x, y, width } = rect;\n const { cellTextColor } = theme;\n const showText = showAs?.showValue ?? true;\n const isAlignLeft = contentAlign === 'left';\n\n let textX = isAlignLeft ? x + cellHorizontalPadding : x + width - cellHorizontalPadding;\n let textMaxWidth = width - cellHorizontalPadding * 2;\n\n if (showAs != null) {\n const { type, color, maxValue } = showAs;\n\n if (type === NumberDisplayType.Ring) {\n const totalRadius = RING_RADIUS + RING_LINE_WIDTH;\n const offsetX = isAlignLeft\n ? cellHorizontalPadding + totalRadius\n : width - cellHorizontalPadding - totalRadius;\n textX = isAlignLeft\n ? x + cellHorizontalPadding + 2 * totalRadius + TEXT_GAP\n : textX - 2 * totalRadius - TEXT_GAP;\n textMaxWidth = textMaxWidth - 2 * totalRadius - TEXT_GAP;\n\n drawRing(ctx, {\n x: x + offsetX,\n y: y + cellVerticalPaddingMD + RING_RADIUS - 3,\n value: data,\n maxValue,\n color,\n radius: RING_RADIUS,\n lineWidth: RING_LINE_WIDTH,\n });\n }\n\n if (type === NumberDisplayType.Bar) {\n const height = 8;\n const textGap = 4;\n const halfMaxWidth = textMaxWidth / 2;\n const offsetX = isAlignLeft ? cellHorizontalPadding : width / 2;\n textX = isAlignLeft ? x + width / 2 + textGap : x + width / 2 - textGap;\n textMaxWidth = halfMaxWidth - textGap;\n\n drawProcessBar(ctx, {\n x: x + offsetX,\n y: y + cellVerticalPaddingMD + 2,\n width: halfMaxWidth,\n height,\n value: data,\n maxValue,\n color,\n });\n }\n }\n\n if (!showText) return;\n\n const isDataString = typeof displayData === 'string';\n if (isDataString || !isActive) {\n return drawMultiLineText(ctx, {\n x: textX,\n y: y + cellVerticalPaddingMD,\n text: isDataString ? displayData : displayData.join(', '),\n maxLines: 1,\n maxWidth: textMaxWidth,\n fill: cellTextColor,\n textAlign: contentAlign,\n });\n }\n\n let curY = y + cellVerticalPaddingMD;\n displayData.forEach((text, index) => {\n const isLast = index === displayData.length - 1;\n drawMultiLineText(ctx, {\n x: textX,\n y: curY,\n text: isLast ? text : `${text},`,\n maxLines: 1,\n maxWidth: textMaxWidth,\n fill: cellTextColor,\n textAlign: contentAlign,\n });\n curY += cellTextLineHeight;\n });\n },\n};\n","import { GRID_DEFAULT } from '../../configs';\nimport { hexToRGBA, inRange } from '../../utils';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ICellRenderProps,\n IRatingCell,\n ICellClickProps,\n ICellClickCallback,\n} from './interface';\n\nconst gapSize = 3;\n\nconst { cellHorizontalPadding } = GRID_DEFAULT;\n\nexport const ratingCellRenderer: IInternalCellRenderer<IRatingCell> = {\n type: CellType.Rating,\n needsHover: true,\n needsHoverPosition: true,\n draw: (cell: IRatingCell, props: ICellRenderProps) => {\n const { data, icon, color, max, readonly } = cell;\n const { ctx, theme, rect, hoverCellPosition, spriteManager } = props;\n const { x, y, width, height } = rect;\n const [hoverX, hoverY] = hoverCellPosition ?? [0, 0];\n const { iconSizeXS, iconFgHighlight, cellLineColor } = theme;\n\n if (data == null) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n\n let currentX = x + cellHorizontalPadding;\n const verticalPadding = (height - iconSizeXS) / 2;\n const initY = y + verticalPadding;\n const isVerticalRange = inRange(hoverY, verticalPadding, verticalPadding + iconSizeXS);\n const iconColor = color ?? iconFgHighlight;\n const hoverColor = hexToRGBA(iconColor, 0.3);\n const maxHoverX = cellHorizontalPadding + max * (iconSizeXS + gapSize);\n\n for (let i = 0; i < max; i++) {\n const isHighlight = data > i;\n const isHovered = hoverX >= currentX - x && hoverX < maxHoverX;\n let color: string;\n\n if (isHighlight) {\n color = iconColor;\n } else if (!readonly && isVerticalRange && isHovered) {\n color = hoverColor;\n } else {\n color = cellLineColor;\n }\n\n spriteManager.drawSprite(ctx, {\n sprite: icon,\n x: currentX,\n y: initY,\n size: iconSizeXS,\n colors: [color, color],\n theme,\n });\n currentX += iconSizeXS + gapSize;\n }\n\n ctx.restore();\n },\n checkRegion: (cell: IRatingCell, props: ICellClickProps, shouldCalculate?: boolean) => {\n const { data, max, readonly } = cell;\n if (readonly) return { type: CellRegionType.Blank };\n const { hoverCellPosition, height, theme } = props;\n const [x, y] = hoverCellPosition;\n const { iconSizeXS } = theme;\n const minX = cellHorizontalPadding;\n const maxX = minX + max * (iconSizeXS + gapSize);\n\n if (inRange(x, minX, maxX) && inRange(y, height / 2 - iconSizeXS, height / 2 + iconSizeXS)) {\n if (!shouldCalculate) return { type: CellRegionType.Update, data: null };\n const newData = Math.ceil((x - cellHorizontalPadding) / (iconSizeXS + gapSize));\n return {\n type: CellRegionType.Update,\n data: newData !== data ? newData : null,\n };\n }\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: IRatingCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const cellRegion = ratingCellRenderer.checkRegion?.(cell, props, true);\n if (!cellRegion || cellRegion.type === CellRegionType.Blank) return;\n callback(cellRegion);\n },\n};\n","/* eslint-disable sonarjs/cognitive-complexity */\nimport { LRUCache } from 'lru-cache';\nimport type { IGridTheme } from '../../configs';\nimport { GRID_DEFAULT } from '../../configs';\nimport type { IRectangle } from '../../interface';\nimport type { SpriteManager } from '../../managers';\nimport { GridInnerIcon } from '../../managers';\nimport { isPointInsideRectangle } from '../../utils';\nimport { drawRect, drawSingleLineText } from '../base-renderer/baseRenderer';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ICellRenderProps,\n ISelectCell,\n ICellMeasureProps,\n ICellClickProps,\n ICellClickCallback,\n} from './interface';\n\nenum ISelectRegionType {\n Content = 'Content',\n DeleteBtn = 'DeleteBtn',\n AddBtn = 'AddBtn',\n}\n\ninterface ISelectRegion extends IRectangle {\n type: ISelectRegionType;\n}\n\nconst positionCache: LRUCache<string, ISelectRegion[]> = new LRUCache({\n max: 10,\n});\n\nconst OPTION_RADIUS = 6;\nconst OPTION_GAP_SIZE = 6;\nconst OPTION_PADDING_HORIZONTAL = 8;\nconst SELECT_CELL_PADDING_TOP = 6;\n\nconst { cellHorizontalPadding, maxRowCount } = GRID_DEFAULT;\n\n// text must already be truncated to fit by the caller\nconst drawLabel = (\n ctx: CanvasRenderingContext2D,\n props: {\n x: number;\n y: number;\n width: number;\n text: string;\n textColor: string;\n bgColor: string;\n editable?: boolean;\n theme: IGridTheme;\n spriteManager: SpriteManager;\n }\n) => {\n const { x, y, width, text, textColor, bgColor, editable, theme, spriteManager } = props;\n const { fontSizeXS, iconSizeSM } = theme;\n\n drawRect(ctx, {\n x,\n y,\n width,\n height: iconSizeSM,\n radius: OPTION_RADIUS,\n fill: bgColor,\n });\n drawSingleLineText(ctx, {\n text,\n x: x + OPTION_PADDING_HORIZONTAL,\n y: y + (iconSizeSM - fontSizeXS) / 2 + 0.5,\n fill: textColor,\n fontSize: fontSizeXS,\n });\n\n if (editable) {\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Close,\n x: x + width - fontSizeXS - OPTION_PADDING_HORIZONTAL + 2,\n y: y + (iconSizeSM - fontSizeXS) / 2,\n size: fontSizeXS,\n theme,\n colors: [textColor, textColor],\n });\n }\n};\n\nexport const selectCellRenderer: IInternalCellRenderer<ISelectCell> = {\n type: CellType.Select,\n needsHoverPositionWhenActive: true,\n measure: (cell: ISelectCell, props: ICellMeasureProps) => {\n const { displayData, readonly, showAddButton } = cell;\n const { ctx, theme, width, height } = props;\n const { cellTextColor, fontSizeXS, iconSizeXS, iconSizeSM, fontFamily } = theme;\n\n if (!displayData.length) return { width, height, totalHeight: height };\n\n const addBtnSize = iconSizeXS;\n const addBtnOffset = showAddButton && !readonly ? addBtnSize + OPTION_GAP_SIZE : 0;\n const baseX = cellHorizontalPadding;\n const firstRowX = baseX + addBtnOffset;\n\n const drawArea: IRectangle = {\n x: baseX,\n y: SELECT_CELL_PADDING_TOP,\n width: width - 2 * cellHorizontalPadding,\n height: height - SELECT_CELL_PADDING_TOP,\n };\n\n let lineCount = 1;\n let x = firstRowX;\n let y = drawArea.y;\n const deleteBtnWidth = !readonly ? fontSizeXS : 0;\n const maxTextWidth = drawArea.width - OPTION_GAP_SIZE * 2 - deleteBtnWidth;\n const firstRowMaxTextWidth = maxTextWidth - addBtnOffset;\n const totalOptionPadding = OPTION_PADDING_HORIZONTAL * 2 + deleteBtnWidth;\n const rightEdgeOfDrawArea = baseX + drawArea.width;\n const lineHeight = iconSizeSM + OPTION_GAP_SIZE;\n\n const cacheKey = `${String(width)}-${showAddButton ? 'add-' : ''}${displayData.join(',')}`;\n const positions: ISelectRegion[] = [];\n\n for (const text of displayData) {\n // Use different max width for first row\n const currentMaxTextWidth = lineCount === 1 ? firstRowMaxTextWidth : maxTextWidth;\n const currentMaxOptionWidth =\n lineCount === 1 ? drawArea.width - addBtnOffset : drawArea.width;\n\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n const { width: displayWidth } = drawSingleLineText(ctx, {\n text,\n fill: cellTextColor,\n maxWidth: currentMaxTextWidth,\n needRender: false,\n fontSize: fontSizeXS,\n });\n\n const optionWidth = Math.min(displayWidth + totalOptionPadding, currentMaxOptionWidth);\n\n // Check if need to wrap - compare with first row start or base start\n const rowStartX = lineCount === 1 ? firstRowX : baseX;\n if (x !== rowStartX && x + optionWidth > rightEdgeOfDrawArea) {\n lineCount++;\n x = baseX; // New lines start from base position (no add button offset)\n y += lineHeight;\n }\n\n // Recalculate for current row after potential wrap\n const actualMaxOptionWidth = lineCount === 1 ? drawArea.width - addBtnOffset : drawArea.width;\n const actualOptionWidth = Math.min(displayWidth + totalOptionPadding, actualMaxOptionWidth);\n\n positions.push({\n type: ISelectRegionType.Content,\n x,\n y: y + 2,\n width: displayWidth + OPTION_PADDING_HORIZONTAL + 2,\n height: lineHeight,\n });\n\n if (!readonly) {\n positions.push({\n type: ISelectRegionType.DeleteBtn,\n x: x + actualOptionWidth - fontSizeXS - OPTION_PADDING_HORIZONTAL + 2,\n y: y + (iconSizeSM - fontSizeXS) / 2,\n width: fontSizeXS,\n height: lineHeight,\n });\n }\n\n x += actualOptionWidth + OPTION_PADDING_HORIZONTAL;\n }\n\n positionCache.set(cacheKey, positions);\n\n const totalHeight = SELECT_CELL_PADDING_TOP + lineCount * lineHeight;\n const displayRowCount = Math.min(maxRowCount, lineCount);\n\n return {\n width,\n height: Math.max(height, SELECT_CELL_PADDING_TOP + displayRowCount * lineHeight),\n totalHeight,\n };\n },\n draw: (cell: ISelectCell, props: ICellRenderProps) => {\n const { ctx, rect, theme, isActive, spriteManager } = props;\n const { displayData, choiceMap, readonly, showAddButton } = cell;\n const { x: _x, y: _y, width, height } = rect;\n const clipEnable = !isActive && displayData.length;\n const { fontSizeXS, fontFamily, iconSizeSM, iconSizeXS, cellOptionBg, cellOptionTextColor } =\n theme;\n\n const addBtnSize = iconSizeXS;\n const addBtnOffset = isActive && showAddButton && !readonly ? addBtnSize + OPTION_GAP_SIZE : 0;\n const baseX = _x + cellHorizontalPadding;\n const firstRowX = baseX + addBtnOffset;\n\n const drawArea: IRectangle = {\n x: baseX,\n y: _y + SELECT_CELL_PADDING_TOP,\n width: width - 2 * cellHorizontalPadding,\n height: height - SELECT_CELL_PADDING_TOP,\n };\n const combinedHeight = iconSizeSM + OPTION_GAP_SIZE;\n const rows = isActive\n ? Infinity\n : Math.max(1, Math.floor((drawArea.height - iconSizeSM) / combinedHeight) + 1);\n const editable = !readonly && isActive;\n const deleteBtnWidth = editable ? fontSizeXS : 0;\n const maxTextWidth = drawArea.width - OPTION_GAP_SIZE * 2 - deleteBtnWidth;\n const firstRowMaxTextWidth = maxTextWidth - addBtnOffset;\n const totalOptionPadding = OPTION_PADDING_HORIZONTAL * 2 + deleteBtnWidth;\n const rightEdgeOfDrawArea = baseX + drawArea.width;\n\n let row = 1;\n let x = firstRowX;\n let y = drawArea.y;\n\n ctx.save();\n ctx.beginPath();\n\n if (clipEnable) {\n ctx.rect(_x, _y, width, height);\n ctx.clip();\n }\n\n if (isActive && showAddButton && !readonly) {\n const addBtnX = baseX;\n const addBtnY = _y + SELECT_CELL_PADDING_TOP + (iconSizeSM - addBtnSize) / 2;\n\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Add,\n x: addBtnX,\n y: addBtnY,\n size: addBtnSize,\n theme,\n colors: [cellOptionTextColor, cellOptionTextColor],\n });\n }\n\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n\n for (const text of displayData) {\n const choice = choiceMap?.[text];\n const bgColor = choice?.backgroundColor || cellOptionBg;\n const textColor = choice?.color || cellOptionTextColor;\n\n // Use different max width for first row\n const currentMaxTextWidth = row === 1 ? firstRowMaxTextWidth : maxTextWidth;\n const currentMaxOptionWidth = row === 1 ? drawArea.width - addBtnOffset : drawArea.width;\n\n const { width: displayWidth, text: displayText } = drawSingleLineText(ctx, {\n text,\n fill: textColor,\n maxWidth: currentMaxTextWidth,\n fontSize: fontSizeXS,\n needRender: false,\n });\n\n const optionWidth = Math.min(displayWidth + totalOptionPadding, currentMaxOptionWidth);\n\n const rowStartX = row === 1 ? firstRowX : baseX;\n if (x !== rowStartX && x + optionWidth > rightEdgeOfDrawArea && row < rows) {\n row++;\n y += combinedHeight;\n x = baseX;\n }\n\n // Recalculate for current row after potential wrap\n const actualMaxOptionWidth = row === 1 ? drawArea.width - addBtnOffset : drawArea.width;\n const actualOptionWidth = Math.min(displayWidth + totalOptionPadding, actualMaxOptionWidth);\n\n drawLabel(ctx, {\n x,\n y,\n width: actualOptionWidth,\n text: displayText,\n textColor,\n bgColor,\n editable,\n theme,\n spriteManager,\n });\n\n x += actualOptionWidth + OPTION_PADDING_HORIZONTAL;\n if (x > rightEdgeOfDrawArea && row >= rows) break;\n }\n\n ctx.restore();\n },\n // eslint-disable-next-line sonarjs/cognitive-complexity\n checkRegion: (cell: ISelectCell, props: ICellClickProps, shouldCalculate?: boolean) => {\n const { data, displayData, readonly, showAddButton } = cell;\n const { width, isActive, hoverCellPosition, activeCellBound, theme } = props;\n const editable = !readonly && isActive && activeCellBound;\n if (!editable) return { type: CellRegionType.Blank };\n\n const { scrollTop } = activeCellBound;\n const [hoverX, hoverY] = hoverCellPosition;\n\n if (showAddButton) {\n const addBtnSize = theme.iconSizeXS;\n const addBtnX = cellHorizontalPadding;\n const addBtnY = SELECT_CELL_PADDING_TOP;\n\n if (\n isPointInsideRectangle(\n [hoverX, scrollTop + hoverY],\n [addBtnX, addBtnY],\n [addBtnX + addBtnSize, addBtnY + addBtnSize]\n )\n ) {\n return { type: CellRegionType.ToggleEditing, data: null };\n }\n }\n\n const cacheKey = `${String(width)}-${showAddButton ? 'add-' : ''}${displayData.join(',')}`;\n const positions = positionCache.get(cacheKey);\n\n if (!positions) return { type: CellRegionType.Blank };\n\n for (let i = 0; i < positions.length; i++) {\n const { type, x, y, width, height } = positions[i];\n\n if (isPointInsideRectangle([hoverX, scrollTop + hoverY], [x, y], [x + width, y + height])) {\n if (!shouldCalculate) {\n return {\n type:\n type === ISelectRegionType.DeleteBtn ? CellRegionType.Update : CellRegionType.Preview,\n data: null,\n };\n }\n\n const realIndex = Math.floor(i / 2);\n\n if (type === ISelectRegionType.DeleteBtn) {\n const result = data.filter((_, index) => index !== realIndex);\n return {\n type: CellRegionType.Update,\n data: result.length ? result : null,\n };\n }\n return {\n type: CellRegionType.Preview,\n data: (data[realIndex] as { id: string; title: string })?.id,\n };\n }\n }\n\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: ISelectCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const { readonly, isEditingOnClick, showAddButton } = cell;\n const { isActive } = props;\n const cellRegion = selectCellRenderer.checkRegion?.(cell, props, true);\n if (!cellRegion) return;\n if (cellRegion.type === CellRegionType.Blank) {\n const editable = !readonly && isActive;\n if (editable && isEditingOnClick) {\n return callback({ type: CellRegionType.ToggleEditing, data: null });\n }\n return;\n }\n if (cellRegion.type === CellRegionType.ToggleEditing && showAddButton) {\n return callback(cellRegion);\n }\n if (cellRegion.type === CellRegionType.Preview) {\n return cell?.onPreview?.(cellRegion.data as string);\n }\n callback(cellRegion);\n },\n};\n","import type { IUrlMatch } from '../../../../grid-adapter/types';\nimport { resolveContentDirection } from '../../text-direction';\nimport { GRID_DEFAULT } from '../../configs';\nimport { isPointInsideRectangle, measuredCanvas } from '../../utils';\nimport {\n TEXT_ELLIPSIS,\n drawMultiLineText,\n drawSingleLineText,\n} from '../base-renderer/baseRenderer';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ITextCell,\n ICellRenderProps,\n ICellMeasureProps,\n ICellClickProps,\n ICellClickCallback,\n} from './interface';\n\nconst { maxRowCount, cellHorizontalPadding, cellVerticalPaddingMD, cellTextLineHeight } =\n GRID_DEFAULT;\n\ninterface ITextSegment {\n // Position relative to the cell origin\n x: number;\n y: number;\n width: number;\n text: string;\n // Set when the segment is part of a detected link\n link?: IUrlMatch;\n}\n\ninterface IComputeSegmentsProps {\n ctx: CanvasRenderingContext2D;\n text: string;\n links: IUrlMatch[];\n width: number;\n height: number;\n fontSize: number;\n isActive?: boolean;\n}\n\nconst getMaxLines = (height: number, isActive?: boolean) =>\n isActive\n ? Infinity\n : Math.max(Math.floor((height - cellVerticalPaddingMD) / cellTextLineHeight), 1);\n\n// Lays the text out with the shared wrapper, then splits every wrapped line at\n// link boundaries so links can be drawn in their own color and hit-tested.\n// Right-to-left content mirrors the plain rendering: segments are placed from\n// the line's right edge in logical order, and each segment reorders its own\n// characters when drawn.\nconst computeSegments = (props: IComputeSegmentsProps): ITextSegment[] => {\n const { ctx, text, links, width, height, fontSize, isActive } = props;\n const lines = drawMultiLineText(ctx, {\n text,\n maxLines: getMaxLines(height, isActive),\n lineHeight: cellTextLineHeight,\n maxWidth: width - cellHorizontalPadding * 2,\n needRender: false,\n });\n const isRtl = resolveContentDirection(text) === 'rtl';\n const lineRight = width - cellHorizontalPadding;\n const segments: ITextSegment[] = [];\n // Links and lines are both ordered by source offset, so one cursor walks the\n // links instead of scanning the whole list for every line\n let linkIndex = 0;\n\n lines.forEach((line, row) => {\n const { text: lineText, start: lineStart } = line;\n // A truncated line carries a trailing ellipsis that is not part of the text\n const isTruncated = !text.startsWith(lineText, lineStart);\n const coreLength = isTruncated ? lineText.length - TEXT_ELLIPSIS.length : lineText.length;\n const lineEnd = lineStart + coreLength;\n const y = cellVerticalPaddingMD + row * cellTextLineHeight;\n let segmentStart = 0;\n let offset = 0;\n\n const pushSegment = (end: number, link?: IUrlMatch) => {\n if (end <= segmentStart) return;\n const segmentText = lineText.slice(segmentStart, end);\n const { width: segmentWidth } = drawSingleLineText(ctx, {\n text: segmentText,\n fontSize,\n needRender: false,\n });\n const x = isRtl ? lineRight - offset - segmentWidth : cellHorizontalPadding + offset;\n segments.push({ x, y, width: segmentWidth, text: segmentText, link });\n offset += segmentWidth;\n segmentStart = end;\n };\n\n while (linkIndex < links.length && links[linkIndex].end <= lineStart) linkIndex++;\n // A link that continues past this line stays under the cursor for the next one\n for (let i = linkIndex; i < links.length && links[i].start < lineEnd; i++) {\n const link = links[i];\n pushSegment(Math.max(link.start - lineStart, 0));\n pushSegment(Math.min(link.end - lineStart, coreLength), link);\n }\n pushSegment(lineText.length);\n });\n\n return segments;\n};\n\nconst findHoveredLink = (segments: ITextSegment[], hoverX: number, hoverY: number) =>\n segments.find(\n ({ x, y, width, link }) =>\n link != null &&\n isPointInsideRectangle([hoverX, hoverY], [x, y], [x + width, y + cellTextLineHeight])\n )?.link;\n\nexport const textCellRenderer: IInternalCellRenderer<ITextCell> = {\n type: CellType.Text,\n needsHoverPosition: (cell: ITextCell) => Boolean(cell.links?.length),\n measure: (cell: ITextCell, props: ICellMeasureProps) => {\n const { displayData } = cell;\n const { ctx, theme, width, height } = props;\n const { cellTextColor, fontSizeSM, fontFamily } = theme;\n\n if (!displayData) {\n return { width, height, totalHeight: height };\n }\n\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n\n const lineCount = drawMultiLineText(ctx, {\n text: displayData,\n maxLines: Infinity,\n lineHeight: cellTextLineHeight,\n maxWidth: width - cellHorizontalPadding * 2,\n fill: cellTextColor,\n needRender: false,\n }).length;\n\n const totalHeight = cellVerticalPaddingMD + lineCount * cellTextLineHeight;\n const displayRowCount = Math.min(maxRowCount, lineCount);\n\n return {\n width,\n height: Math.max(height, cellVerticalPaddingMD + displayRowCount * cellTextLineHeight),\n totalHeight,\n };\n },\n draw: (cell: ITextCell, props: ICellRenderProps) => {\n const { displayData, links } = cell;\n const { ctx, rect, theme, isActive, hoverCellPosition } = props;\n const { x, y, width, height } = rect;\n\n if (!displayData) return;\n\n const { cellTextColor, cellTextColorHighlight, fontSizeSM } = theme;\n\n if (!links?.length) {\n drawMultiLineText(ctx, {\n x: x + cellHorizontalPadding,\n y: y + cellVerticalPaddingMD,\n text: displayData,\n maxLines: getMaxLines(height, isActive),\n lineHeight: cellTextLineHeight,\n maxWidth: width - cellHorizontalPadding * 2,\n fill: cellTextColor,\n });\n return;\n }\n\n const segments = computeSegments({\n ctx,\n text: displayData,\n links,\n width,\n height,\n fontSize: fontSizeSM,\n isActive,\n });\n const hoveredLink = hoverCellPosition\n ? findHoveredLink(segments, hoverCellPosition[0], hoverCellPosition[1])\n : undefined;\n\n segments.forEach((segment) => {\n const { link, text } = segment;\n drawSingleLineText(ctx, {\n x: x + segment.x,\n y: y + segment.y,\n text,\n fontSize: fontSizeSM,\n fill: link ? cellTextColorHighlight : cellTextColor,\n isUnderline: link != null && link === hoveredLink,\n });\n });\n },\n checkRegion: (cell: ITextCell, props: ICellClickProps, _shouldCalculate?: boolean) => {\n const { displayData, links } = cell;\n const { hoverCellPosition, width, height, isActive, theme, activeCellBound } = props;\n\n if (!links?.length || measuredCanvas == null) {\n return { type: CellRegionType.Blank };\n }\n\n const { ctx, setFontSize } = measuredCanvas;\n if (!ctx) return { type: CellRegionType.Blank };\n setFontSize(theme.fontSizeSM);\n\n const [hoverX, hoverY] = hoverCellPosition;\n // activeCellBound describes the active cell even while hit-testing others\n const scrollTop = isActive ? (activeCellBound?.scrollTop ?? 0) : 0;\n const segments = computeSegments({\n ctx,\n text: displayData,\n links,\n width,\n height,\n fontSize: theme.fontSizeSM,\n isActive,\n });\n const hoveredLink = findHoveredLink(segments, hoverX, hoverY + scrollTop);\n\n return hoveredLink\n ? { type: CellRegionType.Preview, data: hoveredLink.url }\n : { type: CellRegionType.Blank };\n },\n onClick: (cell: ITextCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const cellRegion = textCellRenderer.checkRegion?.(cell, props, true);\n if (cellRegion?.type !== CellRegionType.Preview) return;\n cell.onLinkClick?.(cellRegion.data as string);\n // Lets the touch layer know a link was tapped so it does not also activate the cell\n callback(cellRegion);\n },\n};\n","import { LRUCache } from 'lru-cache';\nimport { GRID_DEFAULT } from '../../configs';\nimport type { IRectangle } from '../../interface';\nimport { GridInnerIcon } from '../../managers';\nimport { isPointInsideRectangle } from '../../utils';\nimport { drawAvatar, drawRect, drawSingleLineText } from '../base-renderer';\nimport { CellRegionType, CellType } from './interface';\nimport type {\n IInternalCellRenderer,\n ICellRenderProps,\n IUserCell,\n ICellMeasureProps,\n ICellClickProps,\n ICellClickCallback,\n} from './interface';\n\nconst ITEM_HEIGHT = 24;\nconst ITEM_HORIZONTAL_GAP = 6;\nconst ITEM_PADDING_LEFT = 2;\nconst CELL_VERTICAL_PADDING = 4;\n\nenum IUserRegionType {\n DeleteBtn = 'DeleteBtn',\n Chip = 'Chip',\n}\n\ninterface IUserRegion extends IRectangle {\n type: IUserRegionType;\n index: number;\n}\n\nconst positionCache: LRUCache<string, IUserRegion[]> = new LRUCache({\n max: 10,\n});\n\nconst { cellHorizontalPadding, cellVerticalPaddingSM, maxRowCount } = GRID_DEFAULT;\n\ntype IUserCellRegionResult =\n | {\n type: CellRegionType.Update;\n data: IUserCell['data'] | null;\n }\n | {\n type: CellRegionType.Hover;\n data: IRectangle & { user: IUserCell['data'][number] };\n };\n\nconst getCacheKey = (width: number, userSets: IUserCell['data']) => {\n return `${String(width)}-${userSets.map((u) => u.id).join(',')}`;\n};\n\nconst getVisibleRows = (isActive: boolean, drawAreaHeight: number) => {\n if (isActive) return Infinity;\n return Math.max(\n 1,\n Math.floor((drawAreaHeight - ITEM_HEIGHT) / (ITEM_HEIGHT + cellVerticalPaddingSM)) + 1\n );\n};\n\nconst clipInactiveCell = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n isActive: boolean\n) => {\n if (isActive) return;\n ctx.rect(x, y, width, height);\n ctx.clip();\n};\n\nconst getDeleteRegionResult = (\n positions: IUserRegion[],\n hoverX: number,\n adjustedY: number,\n data: IUserCell['data'],\n shouldCalculate?: boolean\n): IUserCellRegionResult | null => {\n for (const pos of positions) {\n if (pos.type !== IUserRegionType.DeleteBtn) continue;\n const { x, y, width, height } = pos;\n if (isPointInsideRectangle([hoverX, adjustedY], [x, y], [x + width, y + height])) {\n if (!shouldCalculate) return { type: CellRegionType.Update, data: null };\n const result = data.filter((_, index) => index !== pos.index);\n return {\n type: CellRegionType.Update,\n data: result.length ? result : null,\n };\n }\n }\n\n return null;\n};\n\nconst getChipRegionResult = (\n positions: IUserRegion[],\n hoverX: number,\n adjustedY: number,\n scrollTop: number,\n data: IUserCell['data']\n): IUserCellRegionResult | null => {\n for (const pos of positions) {\n if (pos.type !== IUserRegionType.Chip) continue;\n const { x, y, width, height } = pos;\n if (isPointInsideRectangle([hoverX, adjustedY], [x, y], [x + width, y + height])) {\n return {\n type: CellRegionType.Hover,\n data: { x, y: y - scrollTop, width, height, user: data[pos.index] },\n };\n }\n }\n\n return null;\n};\n\nexport const userCellRenderer: IInternalCellRenderer<IUserCell> = {\n type: CellType.User,\n needsHover: false,\n needsHoverPosition: false,\n needsHoverPositionWhenActive: true,\n measure: (cell: IUserCell, props: ICellMeasureProps) => {\n const { data: userSets, readonly } = cell;\n const { ctx, theme, width, height } = props;\n const { fontSizeXS, iconSizeSM, cellOptionTextColor, fontFamily } = theme;\n\n if (!userSets.length) return { width, height, totalHeight: height };\n\n const drawArea: IRectangle = {\n x: cellHorizontalPadding,\n y: CELL_VERTICAL_PADDING,\n width: width - 2 * cellHorizontalPadding,\n height: height - CELL_VERTICAL_PADDING,\n };\n\n let lineCount = 1;\n let x = drawArea.x;\n let y = drawArea.y;\n const deleteBtnWidth = !readonly ? fontSizeXS : 0;\n const fixedWidthWithoutText =\n ITEM_PADDING_LEFT +\n iconSizeSM +\n ITEM_HORIZONTAL_GAP +\n (deleteBtnWidth ? ITEM_HORIZONTAL_GAP + deleteBtnWidth : 0) +\n cellHorizontalPadding;\n const maxTextWidth = Math.max(0, drawArea.width - fixedWidthWithoutText);\n const rightEdgeOfDrawArea = drawArea.x + drawArea.width;\n const lineHeight = ITEM_HEIGHT + cellVerticalPaddingSM;\n\n const cacheKey = getCacheKey(width, userSets);\n const positions: IUserRegion[] = [];\n\n for (let i = 0; i < userSets.length; i++) {\n const user = userSets[i];\n const text = user.name;\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n const { width: displayWidth } = drawSingleLineText(ctx, {\n text,\n fill: cellOptionTextColor,\n maxWidth: maxTextWidth,\n needRender: false,\n fontSize: fontSizeXS,\n });\n\n const textWidth = displayWidth;\n const chipWidth = Math.min(fixedWidthWithoutText + textWidth, drawArea.width);\n\n if (x !== drawArea.x && x + chipWidth > rightEdgeOfDrawArea) {\n lineCount++;\n x = drawArea.x;\n y += lineHeight;\n }\n\n const rectX = x;\n const rectY = y;\n\n positions.push({\n type: IUserRegionType.Chip,\n index: i,\n x: rectX,\n y: rectY,\n width: chipWidth,\n height: ITEM_HEIGHT,\n });\n\n if (!readonly) {\n const deleteX = rectX + chipWidth - cellHorizontalPadding - fontSizeXS;\n positions.push({\n type: IUserRegionType.DeleteBtn,\n index: i,\n x: deleteX,\n y: rectY + (ITEM_HEIGHT - fontSizeXS) / 2,\n width: fontSizeXS,\n height: fontSizeXS,\n });\n }\n\n x += chipWidth + 8;\n }\n\n positionCache.set(cacheKey, positions);\n\n const totalHeight = CELL_VERTICAL_PADDING + lineCount * lineHeight;\n const displayRowCount = Math.min(maxRowCount, lineCount);\n\n return {\n width,\n height: Math.max(height, CELL_VERTICAL_PADDING + displayRowCount * lineHeight),\n totalHeight,\n };\n },\n draw: (cell: IUserCell, props: ICellRenderProps) => {\n const { ctx, rect, theme, imageManager, columnIndex, rowIndex, spriteManager, isActive } =\n props;\n const { data: userSets, readonly } = cell;\n const { x: _x, y: _y, width, height } = rect;\n const {\n fontSizeXS,\n fontSizeSM,\n fontFamily,\n iconSizeSM,\n cellOptionBg,\n cellOptionTextColor,\n avatarBg,\n avatarTextColor,\n } = theme;\n\n if (!userSets.length) return;\n\n const drawArea: IRectangle = {\n x: _x + cellHorizontalPadding,\n y: _y + CELL_VERTICAL_PADDING,\n width: width - 2 * cellHorizontalPadding,\n height: height - 2 * CELL_VERTICAL_PADDING,\n };\n const rows = getVisibleRows(!!isActive, drawArea.height);\n const editable = !readonly && !!isActive;\n const deleteBtnWidth = editable ? fontSizeXS : 0;\n const fixedWidthWithoutText =\n ITEM_PADDING_LEFT +\n iconSizeSM +\n ITEM_HORIZONTAL_GAP +\n (deleteBtnWidth ? ITEM_HORIZONTAL_GAP + deleteBtnWidth : 0) +\n cellHorizontalPadding;\n const maxTextWidth = Math.max(0, drawArea.width - fixedWidthWithoutText);\n\n ctx.save();\n ctx.beginPath();\n clipInactiveCell(ctx, _x, _y, width, height, !!isActive);\n\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n\n let row = 1;\n let x = drawArea.x;\n let y = drawArea.y;\n\n for (const user of userSets) {\n const { name: text, avatarUrl } = user;\n\n const { width: displayWidth, text: displayText } = drawSingleLineText(ctx, {\n text,\n fill: cellOptionTextColor,\n maxWidth: maxTextWidth,\n needRender: false,\n fontSize: fontSizeXS,\n });\n\n const textWidth = displayWidth;\n const chipWidth = Math.min(fixedWidthWithoutText + textWidth, drawArea.width);\n\n if (x !== drawArea.x && x + chipWidth > drawArea.x + drawArea.width && row < rows) {\n row++;\n y += ITEM_HEIGHT + cellVerticalPaddingSM;\n x = drawArea.x;\n }\n\n const rectX = x;\n const rectY = y;\n drawRect(ctx, {\n x: rectX,\n y: rectY,\n width: chipWidth,\n height: ITEM_HEIGHT,\n radius: ITEM_HEIGHT / 2,\n fill: cellOptionBg,\n });\n drawSingleLineText(ctx, {\n text: displayText,\n x: rectX + ITEM_PADDING_LEFT + iconSizeSM + ITEM_HORIZONTAL_GAP,\n y: rectY + (ITEM_HEIGHT - fontSizeXS) / 2 + 0.5,\n fill: cellOptionTextColor,\n // The width this text was actually given, not the cell-wide budget it\n // was truncated against: the chip was sized to `textWidth`, and RTL text\n // anchors to the far side of whatever width it is handed — passing the\n // budget here would park an Arabic name outside its own chip.\n maxWidth: textWidth,\n });\n\n if (editable) {\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Close,\n x: rectX + chipWidth - cellHorizontalPadding - fontSizeXS,\n y: rectY + (ITEM_HEIGHT - fontSizeXS) / 2,\n size: fontSizeXS,\n theme,\n colors: [cellOptionTextColor, cellOptionTextColor],\n });\n }\n\n const img = avatarUrl\n ? imageManager.loadOrGetImage(avatarUrl, columnIndex, rowIndex)\n : undefined;\n\n drawAvatar(ctx, {\n x: rectX + ITEM_PADDING_LEFT,\n y: rectY + (ITEM_HEIGHT - iconSizeSM) / 2,\n width: iconSizeSM,\n height: iconSizeSM,\n fill: avatarBg,\n stroke: cellOptionBg,\n defaultText: text,\n textColor: avatarTextColor,\n fontSize: fontSizeSM,\n fontFamily,\n img,\n });\n\n x += chipWidth + 8;\n if (x > drawArea.x + drawArea.width && row >= rows) break;\n }\n\n ctx.restore();\n },\n checkRegion: (cell: IUserCell, props: ICellClickProps, shouldCalculate?: boolean) => {\n const { data, readonly } = cell;\n const { width, isActive, hoverCellPosition, activeCellBound } = props;\n\n const [hoverX, hoverY] = hoverCellPosition;\n const cacheKey = getCacheKey(width, data);\n const positions = positionCache.get(cacheKey);\n\n if (!positions) return { type: CellRegionType.Blank };\n\n const editable = !readonly && isActive && activeCellBound;\n const scrollTop = activeCellBound?.scrollTop ?? 0;\n const adjustedY = scrollTop + hoverY;\n\n if (editable) {\n const deleteRegion = getDeleteRegionResult(\n positions,\n hoverX,\n adjustedY,\n data,\n shouldCalculate\n );\n if (deleteRegion) return deleteRegion;\n }\n\n const chipRegion = getChipRegionResult(positions, hoverX, adjustedY, scrollTop, data);\n if (chipRegion) return chipRegion;\n\n return { type: CellRegionType.Blank };\n },\n onClick: (cell: IUserCell, props: ICellClickProps, callback: ICellClickCallback) => {\n const cellRegion = userCellRenderer.checkRegion?.(cell, props, true);\n if (!cellRegion) return;\n if (cellRegion.type === CellRegionType.Update) {\n return callback(cellRegion);\n }\n },\n};\n","import { GRID_DEFAULT } from '../../configs';\nimport type { IActiveCellBound } from '../../interface';\n\nconst { cellScrollBarPaddingY, cellScrollBarMinHeight } = GRID_DEFAULT;\n\nexport const getCellScrollState = (activeCellBound: IActiveCellBound) => {\n const { height, totalHeight, scrollTop } = activeCellBound;\n const sliderHeight = height - cellScrollBarPaddingY * 2;\n const ratio = sliderHeight / totalHeight;\n const originScrollBarHeight = sliderHeight * ratio;\n const scrollBarHeight = Math.max(originScrollBarHeight, cellScrollBarMinHeight);\n const scrollTopPercent = scrollTop / (totalHeight - height);\n const scrollBarSupplementHeight = scrollBarHeight - originScrollBarHeight;\n const scrollBarSupplementScrollTop =\n scrollBarSupplementHeight > 0 ? scrollBarSupplementHeight * scrollTopPercent : 0;\n const scrollBarScrollTop = scrollTop * ratio - scrollBarSupplementScrollTop;\n const contentScrollTop = Math.min(scrollTop, totalHeight - height);\n\n return {\n scrollBarHeight,\n scrollBarScrollTop,\n contentScrollTop,\n };\n};\n","import { booleanCellRenderer } from './booleanCellRenderer';\nimport { buttonCellRenderer } from './buttonCellRenderer';\nimport { chartCellRenderer } from './chartCellRenderer';\nimport { imageCellRenderer } from './imageCellRenderer';\nimport { CellType } from './interface';\nimport { linkCellRenderer } from './linkCellRenderer';\nimport { loadingCellRenderer } from './loadingCellRenderer';\nimport { numberCellRenderer } from './numberCellRenderer';\nimport { ratingCellRenderer } from './ratingCellRenderer';\nimport { selectCellRenderer } from './selectCellRenderer';\nimport { textCellRenderer } from './textCellRenderer';\nimport { userCellRenderer } from './userCellRenderer';\n\nexport * from './interface';\nexport * from './utils';\n\nexport const getCellRenderer = (cellType: CellType) => {\n switch (cellType) {\n case CellType.Text:\n return textCellRenderer;\n case CellType.Link:\n return linkCellRenderer;\n case CellType.Number:\n return numberCellRenderer;\n case CellType.Boolean:\n return booleanCellRenderer;\n case CellType.Select:\n return selectCellRenderer;\n case CellType.Image:\n return imageCellRenderer;\n case CellType.Rating:\n return ratingCellRenderer;\n case CellType.Chart:\n return chartCellRenderer;\n case CellType.User:\n return userCellRenderer;\n case CellType.Button:\n return buttonCellRenderer;\n case CellType.Loading:\n default:\n return loadingCellRenderer;\n }\n};\n","import { contractColorForTheme } from '../../../../grid-adapter/core';\nimport { isEqual, groupBy, cloneDeep } from 'lodash';\nimport type { IGridTheme } from '../../configs';\nimport { GRID_DEFAULT, ROW_RELATED_REGIONS } from '../../configs';\nimport type { IVisibleRegion } from '../../hooks';\nimport { getDropTargetIndex } from '../../hooks';\nimport type { ICellItem, ICell, IRectangle, ICollaborator, ILinearRow } from '../../interface';\nimport { DragRegionType, LinearRowType, RegionType, RowControlType } from '../../interface';\nimport { GridInnerIcon } from '../../managers';\nimport {\n checkIfRowOrCellActive,\n checkIfRowOrCellSelected,\n calculateMaxRange,\n getCommentCountOffsetX,\n getRowControlCheckboxOffsetX,\n getRowControlOffsetX,\n hexToRGBA,\n} from '../../utils';\nimport type { ISingleLineTextProps } from '../base-renderer';\nimport {\n drawCheckbox,\n drawLine,\n drawMultiLineText,\n drawRect,\n drawRoundPoly,\n drawSingleLineText,\n} from '../base-renderer';\nimport { getCellRenderer, getCellScrollState } from '../cell-renderer';\nimport type {\n ICacheDrawerProps,\n ICellDrawerProps,\n IGroupRowDrawerProps,\n IFieldHeadDrawerProps,\n IGridHeaderDrawerProps,\n ILayoutDrawerProps,\n IRowHeaderDrawerProps,\n IGroupRowHeaderDrawerProps,\n IAppendRowDrawerProps,\n IGroupStatisticDrawerProps,\n} from './interface';\nimport { RenderRegion, DividerRegion } from './interface';\n\nconst spriteIconMap = {\n [RowControlType.Drag]: GridInnerIcon.Drag,\n [RowControlType.Expand]: GridInnerIcon.Detail,\n};\n\nconst {\n fillHandlerSize,\n cellTextLineHeight,\n rowHeadIconPaddingTop,\n columnStatisticHeight,\n columnHeadHeight,\n columnHeadPadding,\n columnHeadMenuSize,\n columnAppendBtnWidth,\n columnResizeHandlerWidth,\n columnResizeHandlerPaddingTop,\n cellScrollBarWidth,\n cellScrollBarPaddingX,\n cellScrollBarPaddingY,\n cellVerticalPaddingSM,\n cellVerticalPaddingMD,\n cellHorizontalPadding,\n columnFreezeHandlerWidth,\n columnFreezeHandlerHeight,\n} = GRID_DEFAULT;\n\nexport const drawCellContent = (ctx: CanvasRenderingContext2D, props: ICellDrawerProps) => {\n const {\n x,\n y,\n width,\n height,\n theme,\n rowIndex,\n columnIndex,\n imageManager,\n spriteManager,\n isActive,\n hoverCellPosition,\n getCellContent,\n } = props;\n\n const cell = getCellContent([columnIndex, rowIndex]);\n const cellRenderer = getCellRenderer(cell.type);\n cellRenderer.draw(cell as never, {\n ctx,\n theme,\n rect: {\n x,\n y,\n width: width,\n height,\n },\n rowIndex,\n columnIndex,\n imageManager,\n spriteManager,\n hoverCellPosition,\n isActive,\n });\n if (cell.hidden) {\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.EyeOff,\n x: x + width - 14,\n y: y - 1,\n size: 12,\n theme,\n colors: [theme.cellLineColorActived, theme.cellBg],\n });\n } else if (isActive && cell.locked) {\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Lock,\n x: x + width - 13,\n y: y + 1,\n size: 12,\n theme,\n colors: [theme.cellLineColorActived, theme.cellBg],\n });\n }\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const calcCells = (props: ILayoutDrawerProps, renderRegion: RenderRegion) => {\n const {\n coordInstance,\n visibleRegion,\n activeCell,\n highlightedRowIndex,\n mouseState,\n scrollState,\n selection,\n isSelecting,\n rowControls,\n rowControlPaddingX,\n rowIndexVisible,\n hoverCellPosition,\n theme,\n columns,\n commentCountMap,\n imageManager,\n spriteManager,\n groupCollection,\n getLinearRow,\n getCellContent,\n } = props;\n const {\n startRowIndex,\n stopRowIndex,\n startColumnIndex: originStartColumnIndex,\n stopColumnIndex: originStopColumnIndex,\n } = visibleRegion;\n const { freezeColumnCount, columnInitSize, totalWidth, rowCount } = coordInstance;\n const { isRowSelection, isColumnSelection } = selection;\n const { scrollLeft, scrollTop } = scrollState;\n const {\n columnIndex: hoverColumnIndex,\n rowIndex: hoverRowIndex,\n type: hoverRegionType,\n isOutOfBounds,\n } = mouseState;\n\n const cellPropList: ICellDrawerProps[] = [];\n const rowHeaderPropList: IRowHeaderDrawerProps[] = [];\n const groupRowList: IGroupRowDrawerProps[] = [];\n const groupRowHeaderList: IGroupRowHeaderDrawerProps[] = [];\n const appendRowList: IAppendRowDrawerProps[] = [];\n\n if (!rowCount) {\n return {\n cellPropList,\n rowHeaderPropList,\n groupRowList,\n groupRowHeaderList,\n appendRowList,\n };\n }\n\n const isFreezeRegion = renderRegion === RenderRegion.Freeze;\n const startColumnIndex = isFreezeRegion ? 0 : Math.max(freezeColumnCount, originStartColumnIndex);\n const stopColumnIndex = isFreezeRegion\n ? Math.max(freezeColumnCount - 1, 0)\n : originStopColumnIndex;\n const isFreezeWithoutColumns = isFreezeRegion && freezeColumnCount === 0;\n\n for (let columnIndex = startColumnIndex; columnIndex <= stopColumnIndex; columnIndex++) {\n const column = columns[columnIndex];\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const isColumnActive = isColumnSelection && selection.includes([columnIndex, columnIndex]);\n const isFirstColumn = columnIndex === 0;\n const isColumnHovered = hoverColumnIndex === columnIndex;\n const finalTheme = column?.customTheme ? { ...theme, ...column.customTheme } : theme;\n const { cellBg, cellBgHovered, cellBgSelected } = finalTheme;\n\n for (let rowIndex = startRowIndex; rowIndex <= stopRowIndex; rowIndex++) {\n const linearRow = getLinearRow(rowIndex);\n const { type: linearRowType } = linearRow;\n const rowHeight = coordInstance.getRowHeight(rowIndex);\n const y = coordInstance.getRowOffset(rowIndex) - scrollTop;\n\n const cell = getCellContent([columnIndex, linearRow.realIndex]);\n const recordId = cell.id?.split('-')[0];\n\n if (linearRowType === LinearRowType.Group) {\n const { depth, value, isCollapsed, realIndex } = linearRow;\n if (isFirstColumn) {\n groupRowHeaderList.push({\n x: 0.5,\n y,\n width: columnInitSize,\n height: rowHeight,\n spriteManager,\n depth,\n theme,\n isCollapsed,\n groupCollection,\n });\n }\n\n if (isFreezeWithoutColumns) continue;\n\n groupRowList.push({\n x: x + 0.5,\n y,\n width: columnWidth,\n height: rowHeight,\n columnIndex,\n rowIndex: realIndex,\n depth,\n theme,\n value,\n isHover: false,\n isCollapsed,\n imageManager,\n spriteManager,\n groupCollection,\n });\n continue;\n }\n\n if (linearRowType === LinearRowType.Append) {\n if (isFirstColumn) {\n const isHover = hoverRegionType === RegionType.AppendRow && hoverRowIndex === rowIndex;\n\n appendRowList.push({\n x: 0.5,\n y: y + 0.5,\n width: totalWidth - scrollLeft,\n height: rowHeight,\n theme,\n isHover,\n spriteManager,\n coordInstance,\n });\n }\n continue;\n }\n\n const { displayIndex, realIndex: realRowIndex } = linearRow;\n const isRowHovered =\n !isOutOfBounds &&\n !isSelecting &&\n ROW_RELATED_REGIONS.has(hoverRegionType) &&\n rowIndex === hoverRowIndex;\n const { isCellActive, isRowActive } = checkIfRowOrCellActive(\n activeCell,\n realRowIndex,\n columnIndex\n );\n const { isRowSelected, isCellSelected } = checkIfRowOrCellSelected(\n selection,\n realRowIndex,\n columnIndex\n );\n const isRowHighlighted = highlightedRowIndex === realRowIndex;\n let fill;\n\n if (isCellSelected || isRowSelected || isColumnActive) {\n fill = cellBgSelected;\n } else if (isRowHovered || isRowActive || isRowHighlighted) {\n fill = cellBgHovered;\n }\n\n if (isFirstColumn) {\n rowHeaderPropList.push({\n x: 0.5,\n y: y + 0.5,\n width: columnInitSize + 0.5,\n height: rowHeight,\n displayIndex: String(displayIndex),\n isHover: isRowHovered || isRowActive || isRowHighlighted,\n isChecked: isRowSelection && isRowSelected,\n rowIndexVisible,\n rowControls,\n rowControlPaddingX,\n theme,\n spriteManager,\n commentCount: recordId ? commentCountMap?.[recordId] : undefined,\n });\n }\n\n if (isFreezeWithoutColumns) continue;\n\n cellPropList.push({\n x: x + 0.5,\n y: y + 0.5,\n width: columnWidth,\n height: rowHeight,\n rowIndex: realRowIndex,\n columnIndex,\n hoverCellPosition: isColumnHovered && isRowHovered ? hoverCellPosition : null,\n getCellContent,\n imageManager,\n spriteManager,\n theme: finalTheme,\n fill: isCellActive ? cellBg : (fill ?? cellBg),\n });\n }\n }\n\n return {\n cellPropList,\n rowHeaderPropList,\n groupRowList,\n groupRowHeaderList,\n appendRowList,\n };\n};\n\nexport const drawClipRegion = (\n ctx: CanvasRenderingContext2D,\n clipRect: IRectangle,\n draw: (ctx: CanvasRenderingContext2D) => void\n) => {\n const { x, y, width, height } = clipRect;\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n\n draw(ctx);\n\n ctx.restore();\n};\n\nexport const drawCells = (\n mainCtx: CanvasRenderingContext2D,\n cacheCtx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps\n) => {\n const { coordInstance, theme, shouldRerender } = props;\n const { fontFamily, fontSizeSM, fontSizeXS, cellLineColor } = theme;\n const { rowInitSize, freezeRegionWidth, containerWidth, containerHeight } = coordInstance;\n\n const { cellPropList: otherCellPropList, groupRowList } = calcCells(props, RenderRegion.Other);\n const {\n cellPropList: freezeCellPropList,\n groupRowList: freezeGroupRowList,\n rowHeaderPropList,\n groupRowHeaderList,\n appendRowList,\n } = calcCells(props, RenderRegion.Freeze);\n\n appendRowList.forEach((props) => drawAppendRow(mainCtx, props));\n\n // Render freeze region\n drawClipRegion(\n mainCtx,\n {\n x: 0,\n y: rowInitSize + 1,\n width: freezeRegionWidth + 1,\n height: containerHeight - rowInitSize - 1,\n },\n (ctx: CanvasRenderingContext2D) => {\n freezeCellPropList.forEach((cellProps) => {\n const { x, y, width, height, fill } = cellProps;\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill,\n stroke: cellLineColor,\n });\n });\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n rowHeaderPropList.forEach((rowHeaderProps) => drawRowHeader(ctx, rowHeaderProps));\n freezeGroupRowList.forEach((props) => drawGroupRow(ctx, props));\n groupRowHeaderList.forEach((props) => drawGroupRowHeader(ctx, props));\n }\n );\n\n // Render other region\n drawClipRegion(\n mainCtx,\n {\n x: freezeRegionWidth + 1,\n y: rowInitSize + 1,\n width: containerWidth - freezeRegionWidth,\n height: containerHeight - rowInitSize - 1,\n },\n (ctx: CanvasRenderingContext2D) => {\n otherCellPropList.forEach((cellProps) => {\n const { x, y, width, height, fill } = cellProps;\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill,\n stroke: cellLineColor,\n });\n });\n groupRowList.forEach((props) => drawGroupRow(ctx, props));\n }\n );\n\n // Cache for cells content\n if (shouldRerender) {\n drawClipRegion(\n cacheCtx,\n {\n x: 0,\n y: rowInitSize + 1,\n width: freezeRegionWidth + 1,\n height: containerHeight - rowInitSize - 1,\n },\n (ctx: CanvasRenderingContext2D) => {\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n freezeCellPropList.forEach((cellProps) => {\n drawCellContent(ctx, cellProps);\n });\n }\n );\n\n drawClipRegion(\n cacheCtx,\n {\n x: freezeRegionWidth + 1,\n y: rowInitSize + 1,\n width: containerWidth - freezeRegionWidth,\n height: containerHeight - rowInitSize - 1,\n },\n (ctx: CanvasRenderingContext2D) => {\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n otherCellPropList.forEach((cellProps) => {\n drawCellContent(ctx, cellProps);\n });\n }\n );\n }\n};\n\nexport const drawGroupRowHeader = (\n ctx: CanvasRenderingContext2D,\n props: IGroupRowHeaderDrawerProps\n) => {\n const { x, y, width, height, theme, depth, isCollapsed, spriteManager, groupCollection } = props;\n const {\n iconSizeSM,\n cellLineColor,\n groupHeaderBgPrimary,\n groupHeaderBgSecondary,\n groupHeaderBgTertiary,\n } = theme;\n\n if (groupCollection == null) return;\n\n const { groupColumns } = groupCollection;\n\n if (!groupColumns.length) return;\n\n const bgList = [groupHeaderBgTertiary, groupHeaderBgSecondary, groupHeaderBgPrimary].slice(\n -groupColumns.length\n );\n\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill: bgList[depth],\n });\n drawRect(ctx, {\n x,\n y,\n width,\n height: 1,\n fill: cellLineColor,\n });\n\n spriteManager.drawSprite(ctx, {\n sprite: isCollapsed ? GridInnerIcon.Collapse : GridInnerIcon.Expand,\n x: (width - iconSizeSM) / 2 + (depth - 1) * 16,\n y: y + (height - iconSizeSM) / 2,\n size: iconSizeSM,\n theme,\n });\n};\n\nexport const drawGroupRow = (ctx: CanvasRenderingContext2D, props: IGroupRowDrawerProps) => {\n const {\n x,\n y,\n width,\n height,\n theme,\n columnIndex,\n rowIndex,\n depth,\n value,\n imageManager,\n spriteManager,\n groupCollection,\n } = props;\n const {\n fontSizeSM,\n fontFamily,\n cellLineColor,\n rowHeaderTextColor,\n groupHeaderBgPrimary,\n groupHeaderBgTertiary,\n groupHeaderBgSecondary,\n } = theme;\n\n if (groupCollection == null) return;\n\n const { groupColumns, getGroupCell } = groupCollection;\n\n if (!groupColumns.length) return;\n\n const bgList = [groupHeaderBgTertiary, groupHeaderBgSecondary, groupHeaderBgPrimary].slice(\n -groupColumns.length\n );\n\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill: bgList[depth],\n });\n drawRect(ctx, {\n x,\n y,\n width,\n height: 1,\n fill: cellLineColor,\n });\n\n if (columnIndex !== 0) return;\n\n const groupColumn = groupColumns[depth];\n\n if (groupColumn == null) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n\n drawSingleLineText(ctx, {\n x: x + cellHorizontalPadding,\n y: y + cellVerticalPaddingSM,\n text: groupColumn.name,\n fill: rowHeaderTextColor,\n });\n\n const cell = getGroupCell(value, depth);\n const cellRenderer = getCellRenderer(cell.type);\n const offsetY = 18;\n cellRenderer.draw(cell as never, {\n ctx,\n theme,\n rect: {\n x,\n y: y + offsetY,\n width,\n height: height - offsetY,\n },\n rowIndex,\n columnIndex,\n imageManager,\n spriteManager,\n });\n ctx.restore();\n};\n\nexport const drawActiveCell = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const {\n theme,\n mouseState,\n scrollState,\n coordInstance,\n activeCellBound,\n hoverCellPosition,\n imageManager,\n spriteManager,\n real2RowIndex,\n getLinearRow,\n getCellContent,\n } = props;\n\n if (activeCellBound == null) return;\n\n const { scrollTop, scrollLeft } = scrollState;\n const { width, height, columnIndex, rowIndex: activeRowIndex } = activeCellBound;\n const { rowIndex: hoverLinearRowIndex, columnIndex: hoverColumnIndex } = mouseState;\n const { cellBg, cellLineColorActived, fontSizeSM, fontFamily, scrollBarBg } = theme;\n const {\n freezeColumnCount,\n freezeRegionWidth,\n containerWidth,\n containerHeight,\n columnCount,\n rowInitSize,\n } = coordInstance;\n const activeLinearRowIndex = real2RowIndex(activeRowIndex);\n const linearRow = getLinearRow(activeLinearRowIndex);\n\n if (columnIndex >= columnCount || linearRow?.type !== LinearRowType.Row) return;\n\n const isFreezeRegion = columnIndex < freezeColumnCount;\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const y = coordInstance.getRowOffset(activeLinearRowIndex) - scrollTop;\n const { realIndex: hoverRowIndex } = getLinearRow(hoverLinearRowIndex);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n isFreezeRegion ? 0 : freezeRegionWidth,\n rowInitSize,\n isFreezeRegion ? freezeRegionWidth + 1 : containerWidth - freezeRegionWidth,\n containerHeight - rowInitSize\n );\n ctx.clip();\n\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n\n drawRect(ctx, {\n x: x + 0.5,\n y: y + 0.5,\n width,\n height,\n fill: cellBg,\n stroke: cellLineColorActived,\n radius: 2,\n });\n\n const cellScrollState = getCellScrollState(activeCellBound);\n const { scrollBarHeight, scrollBarScrollTop, contentScrollTop } = cellScrollState;\n\n ctx.save();\n ctx.beginPath();\n\n if (activeCellBound.scrollEnable) {\n ctx.translate(0, scrollBarScrollTop);\n\n drawRect(ctx, {\n x: x + width - cellScrollBarWidth - cellScrollBarPaddingX,\n y: y + cellScrollBarPaddingY,\n width: cellScrollBarWidth,\n height: scrollBarHeight,\n fill: scrollBarBg,\n radius: cellScrollBarWidth / 2,\n });\n\n ctx.restore();\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y + 1, width, height - 1);\n ctx.clip();\n ctx.translate(0, -contentScrollTop);\n }\n\n drawCellContent(ctx, {\n x: x + 0.5,\n y: y + 0.5,\n width,\n height,\n rowIndex: activeRowIndex,\n columnIndex,\n // The content is translated by contentScrollTop above, so the pointer is\n // shifted into content space for renderers that hit-test while drawing\n hoverCellPosition:\n hoverRowIndex === activeRowIndex && hoverColumnIndex === columnIndex && hoverCellPosition\n ? [hoverCellPosition[0], hoverCellPosition[1] + contentScrollTop]\n : null,\n getCellContent,\n isActive: true,\n imageManager,\n spriteManager,\n theme,\n });\n\n ctx.restore();\n ctx.restore();\n};\n\nconst getVisibleCollaborators = (\n collaborators: ICollaborator,\n visibleRegion: IVisibleRegion,\n freezeColumnCount: number,\n getCellContent: (cell: ICellItem) => ICell,\n getLinearRow: (rowNumber: number) => ILinearRow\n) => {\n const groupedCollaborators = groupBy(collaborators, 'activeCellId');\n\n // through visible region to find the cell that has collaborators and get the real coordinate\n const { startColumnIndex, stopColumnIndex, startRowIndex, stopRowIndex } = visibleRegion;\n\n const visibleCells = [];\n const columnIndices = [\n ...Array.from({ length: freezeColumnCount }, (_, i) => i),\n ...Array.from(\n { length: stopColumnIndex - Math.max(freezeColumnCount, startColumnIndex) + 1 },\n (_, i) => Math.max(freezeColumnCount, startColumnIndex) + i\n ),\n ];\n\n for (const i of columnIndices) {\n for (let j = startRowIndex; j <= stopRowIndex; j++) {\n const realIndex = getLinearRow(j).realIndex;\n const cell = getCellContent([i, realIndex]);\n if (!cell?.id) {\n continue;\n }\n const visibleCell = groupedCollaborators[cell.id];\n if (visibleCell) {\n const newCell = cloneDeep(visibleCell);\n newCell[0].activeCell = [i, realIndex];\n visibleCells.push(newCell);\n }\n }\n }\n\n return visibleCells;\n};\n\n// TODO optimize the performance\nexport const drawCollaborators = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const {\n collaborators,\n scrollState,\n coordInstance,\n activeCellBound,\n theme,\n real2RowIndex,\n getCellContent,\n visibleRegion,\n getLinearRow,\n } = props;\n const { scrollTop, scrollLeft } = scrollState;\n const { themeKey } = theme;\n\n const { freezeColumnCount, freezeRegionWidth, rowInitSize, containerWidth, containerHeight } =\n coordInstance;\n\n if (!collaborators?.length) return;\n\n ctx.save();\n\n const visibleCells = getVisibleCollaborators(\n collaborators,\n visibleRegion,\n freezeColumnCount,\n getCellContent,\n getLinearRow\n );\n\n for (let i = 0; i < visibleCells.length; i++) {\n // for conflict cell, we'd like to show the latest collaborator\n const conflictCollaborators = visibleCells[i].sort((a, b) => b.timeStamp - a.timeStamp);\n const { activeCell, borderColor } = conflictCollaborators[0];\n if (!activeCell) {\n continue;\n }\n const [columnIndex, _rowIndex] = activeCell;\n const rowIndex = real2RowIndex(_rowIndex);\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const y = coordInstance.getRowOffset(rowIndex) - scrollTop;\n const width = coordInstance.getColumnWidth(columnIndex);\n const height =\n activeCellBound?.columnIndex === columnIndex && activeCellBound?.rowIndex === _rowIndex\n ? activeCellBound.height\n : coordInstance.getRowHeight(rowIndex);\n\n ctx.save();\n ctx.beginPath();\n\n const isFreezeRegion = columnIndex < freezeColumnCount;\n\n // clip otherwise collaborator will be rendered outside the cell\n ctx.rect(\n isFreezeRegion ? 0 : freezeRegionWidth,\n rowInitSize,\n isFreezeRegion ? freezeRegionWidth + 1 : containerWidth - freezeRegionWidth,\n containerHeight - rowInitSize\n );\n ctx.clip();\n\n drawRect(ctx, {\n x: x + 0.5,\n y: y + 0.5,\n width,\n height: height,\n stroke: hexToRGBA(contractColorForTheme(borderColor, themeKey)),\n radius: 2,\n });\n\n ctx.restore();\n }\n ctx.restore();\n};\n\nexport const drawSearchCursor = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const {\n theme,\n scrollState,\n coordInstance,\n real2RowIndex,\n getLinearRow,\n searchCursor,\n imageManager,\n spriteManager,\n getCellContent,\n } = props;\n\n if (!searchCursor) return;\n\n const [searchColumnIndex, searchRowIndex] = searchCursor;\n\n const { scrollTop, scrollLeft } = scrollState;\n const { fontSizeSM, fontFamily } = theme;\n const {\n freezeColumnCount,\n freezeRegionWidth,\n containerWidth,\n containerHeight,\n columnCount,\n rowInitSize,\n } = coordInstance;\n const activeLinearRowIndex = real2RowIndex(searchRowIndex);\n const linearRow = getLinearRow(activeLinearRowIndex);\n\n if (searchColumnIndex >= columnCount || linearRow?.type !== LinearRowType.Row) return;\n\n const isFreezeRegion = searchColumnIndex < freezeColumnCount;\n const x = coordInstance.getColumnRelativeOffset(searchColumnIndex, scrollLeft);\n const y = coordInstance.getRowOffset(activeLinearRowIndex) - scrollTop;\n\n const width = coordInstance.getColumnWidth(searchColumnIndex);\n const height = coordInstance.getRowHeight(activeLinearRowIndex);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n isFreezeRegion ? 0 : freezeRegionWidth,\n rowInitSize,\n isFreezeRegion ? freezeRegionWidth + 1 : containerWidth - freezeRegionWidth,\n containerHeight - rowInitSize\n );\n ctx.clip();\n\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n\n drawRect(ctx, {\n x: x + 1,\n y: y + 1,\n width: width - 1,\n height: height - 1,\n fill: theme.searchCursorBg,\n radius: 0.5,\n });\n\n ctx.save();\n ctx.beginPath();\n\n drawCellContent(ctx, {\n x: x + 0.5,\n y: y + 0.5,\n width,\n height,\n rowIndex: searchRowIndex,\n columnIndex: searchColumnIndex,\n getCellContent,\n isActive: false,\n imageManager,\n spriteManager,\n theme,\n });\n\n ctx.restore();\n ctx.restore();\n};\n\nexport const drawSearchResult = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps,\n result?: [number, number]\n) => {\n const {\n theme,\n scrollState,\n coordInstance,\n real2RowIndex,\n getLinearRow,\n imageManager,\n spriteManager,\n getCellContent,\n selection,\n } = props;\n\n if (!result) return;\n\n const [searchColumnIndex, searchRowIndex] = result;\n\n const { scrollTop, scrollLeft } = scrollState;\n const { fontSizeSM, fontFamily, searchTargetIndexBg, searchTargetIndexSelectedBg } = theme;\n const {\n freezeColumnCount,\n freezeRegionWidth,\n containerWidth,\n containerHeight,\n columnCount,\n rowInitSize,\n } = coordInstance;\n const activeLinearRowIndex = real2RowIndex(searchRowIndex);\n const linearRow = getLinearRow(activeLinearRowIndex);\n\n if (searchColumnIndex >= columnCount || linearRow?.type !== LinearRowType.Row) return;\n\n const isFreezeRegion = searchColumnIndex < freezeColumnCount;\n const x = coordInstance.getColumnRelativeOffset(searchColumnIndex, scrollLeft);\n const y = coordInstance.getRowOffset(activeLinearRowIndex) - scrollTop;\n\n const width = coordInstance.getColumnWidth(searchColumnIndex);\n const height = coordInstance.getRowHeight(activeLinearRowIndex);\n const { isCellSelected, isRowSelected } = checkIfRowOrCellSelected(\n selection,\n searchRowIndex,\n searchColumnIndex\n );\n const isColumnSelected =\n selection.isColumnSelection && selection.includes([searchColumnIndex, searchColumnIndex]);\n const fill =\n isCellSelected || isRowSelected || isColumnSelected\n ? searchTargetIndexSelectedBg\n : searchTargetIndexBg;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n isFreezeRegion ? 0 : freezeRegionWidth,\n rowInitSize,\n isFreezeRegion ? freezeRegionWidth + 1 : containerWidth - freezeRegionWidth,\n containerHeight - rowInitSize\n );\n ctx.clip();\n\n ctx.font = `${fontSizeSM}px ${fontFamily}`;\n\n drawRect(ctx, {\n x: x + 1,\n y: y + 1,\n width: width - 1,\n height: height - 1,\n fill,\n radius: 0.5,\n });\n\n ctx.save();\n ctx.beginPath();\n\n drawCellContent(ctx, {\n x: x + 0.5,\n y: y + 0.5,\n width,\n height,\n rowIndex: linearRow.realIndex,\n columnIndex: searchColumnIndex,\n getCellContent,\n isActive: false,\n imageManager,\n spriteManager,\n theme,\n });\n\n ctx.restore();\n ctx.restore();\n};\n\nexport const getVisibleSearchTargetIndex = (\n searchHitIndex: { fieldId: string; recordId: string }[],\n visibleRegion: IVisibleRegion,\n freezeColumnCount: number,\n getCellContent: (cell: ICellItem) => ICell,\n getLinearRow: (rowNumber: number) => ILinearRow\n) => {\n const { startColumnIndex, stopColumnIndex, startRowIndex, stopRowIndex } = visibleRegion;\n\n const searchCells = [];\n const columnIndices = [\n ...Array.from({ length: freezeColumnCount }, (_, i) => i),\n ...Array.from(\n { length: stopColumnIndex - Math.max(freezeColumnCount, startColumnIndex) + 1 },\n (_, i) => Math.max(freezeColumnCount, startColumnIndex) + i\n ),\n ];\n\n const searchCellIds = searchHitIndex?.map((item) => `${item.recordId}-${item.fieldId}`) || [];\n\n for (const i of columnIndices) {\n for (let j = startRowIndex; j <= stopRowIndex; j++) {\n const line = getLinearRow(j);\n const { realIndex } = line;\n const cell = getCellContent([i, realIndex]);\n\n if (!cell?.id) {\n continue;\n }\n\n if (searchCellIds.includes(cell.id)) {\n searchCells.push([i, realIndex]);\n }\n }\n }\n\n return searchCells as [number, number][];\n};\n\nexport const drawSearchTargetIndex = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const { getCellContent, coordInstance, visibleRegion, searchHitIndex, getLinearRow } = props;\n\n const { freezeColumnCount } = coordInstance;\n\n if (!searchHitIndex?.length) return;\n\n const searchCellIds = getVisibleSearchTargetIndex(\n searchHitIndex,\n visibleRegion,\n freezeColumnCount,\n getCellContent,\n getLinearRow\n );\n\n for (let i = 0; i < searchCellIds.length; i++) {\n drawSearchResult(ctx, props, searchCellIds[i]);\n }\n};\n\nexport const drawFillPreview = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const {\n selection,\n mouseState,\n coordInstance,\n scrollState,\n theme,\n isFilling,\n isFillEnabled,\n real2RowIndex,\n getLinearRow,\n } = props;\n if (!isFilling || !isFillEnabled) return;\n const { isCellSelection, ranges } = selection;\n if (!isCellSelection) return;\n const [start, end] = ranges;\n const startCol = Math.min(start[0], end[0]);\n const endCol = Math.max(start[0], end[0]);\n const topRow = Math.min(start[1], end[1]);\n const bottomRow = Math.max(start[1], end[1]);\n const hoverLinear = getLinearRow(mouseState.rowIndex);\n const targetRealRow = hoverLinear.realIndex;\n const { scrollLeft, scrollTop } = scrollState;\n const startX = coordInstance.getColumnRelativeOffset(startCol, scrollLeft);\n const endX =\n coordInstance.getColumnRelativeOffset(endCol, scrollLeft) +\n coordInstance.getColumnWidth(endCol);\n let startY: number | null = null;\n let endY: number | null = null;\n\n if (Number.isFinite(targetRealRow) && targetRealRow > bottomRow) {\n startY = coordInstance.getRowOffset(real2RowIndex(bottomRow + 1)) - scrollTop;\n endY =\n coordInstance.getRowOffset(real2RowIndex(targetRealRow)) +\n coordInstance.getRowHeight(real2RowIndex(targetRealRow)) -\n scrollTop;\n } else if (Number.isFinite(targetRealRow) && targetRealRow < topRow) {\n startY = coordInstance.getRowOffset(real2RowIndex(targetRealRow)) - scrollTop;\n endY =\n coordInstance.getRowOffset(real2RowIndex(topRow - 1)) +\n coordInstance.getRowHeight(real2RowIndex(topRow - 1)) -\n scrollTop;\n }\n\n if (startY != null && endY != null) {\n const width = endX - startX;\n const height = endY - startY;\n drawRect(ctx, {\n x: startX + 0.5,\n y: startY + 0.5,\n width,\n height,\n fill: hexToRGBA(theme.interactionLineColorHighlight, 0.12),\n stroke: theme.interactionLineColorHighlight,\n });\n }\n};\n\nexport const drawFillHandler = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const {\n coordInstance,\n scrollState,\n selection,\n isSelecting,\n isEditing,\n theme,\n activeCellBound,\n isFillEnabled,\n real2RowIndex,\n getLinearRow,\n } = props;\n\n if (!isFillEnabled || isEditing || isSelecting) return;\n\n const { scrollTop, scrollLeft } = scrollState;\n const { freezeColumnCount, freezeRegionWidth, rowInitSize, containerWidth, containerHeight } =\n coordInstance;\n const maxRange = calculateMaxRange(selection);\n\n if (maxRange == null) return;\n\n const [columnIndex, realRowIndex] = maxRange;\n const { cellBg, cellLineColorActived } = theme;\n const isFreezeRegion = columnIndex < freezeColumnCount;\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const linearRowIndex = real2RowIndex(realRowIndex);\n const y = coordInstance.getRowOffset(linearRowIndex) - scrollTop;\n const width = coordInstance.getColumnWidth(columnIndex);\n const defaultHeight = coordInstance.getRowHeight(linearRowIndex);\n const isSingleCell =\n selection.isCellSelection && isEqual(selection.ranges[0], selection.ranges[1]);\n const isSameAsActive =\n isSingleCell &&\n activeCellBound &&\n activeCellBound.columnIndex === columnIndex &&\n activeCellBound.rowIndex === realRowIndex &&\n getLinearRow(linearRowIndex).type === LinearRowType.Row;\n const height = isSameAsActive && activeCellBound ? activeCellBound.height : defaultHeight;\n\n ctx.save();\n ctx.beginPath();\n if (!isFreezeRegion) {\n ctx.rect(\n freezeRegionWidth,\n rowInitSize,\n containerWidth - freezeRegionWidth,\n containerHeight - rowInitSize\n );\n ctx.clip();\n }\n\n drawRect(ctx, {\n x: x + width - fillHandlerSize / 2 - 0.5,\n y: y + height - fillHandlerSize / 2 - 0.5,\n width: fillHandlerSize,\n height: fillHandlerSize,\n stroke: cellLineColorActived,\n fill: cellBg,\n });\n\n ctx.restore();\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const drawRowHeader = (ctx: CanvasRenderingContext2D, props: IRowHeaderDrawerProps) => {\n const {\n x,\n y,\n width,\n height,\n displayIndex,\n theme,\n isHover,\n isChecked,\n rowControls,\n rowControlPaddingX,\n spriteManager,\n rowIndexVisible,\n commentCount,\n } = props;\n\n const {\n cellBg,\n cellBgHovered,\n cellBgSelected,\n cellLineColor,\n rowHeaderTextColor,\n iconSizeXS,\n staticWhite,\n iconBgSelected,\n } = theme;\n let fill = cellBg;\n\n if (isChecked) {\n fill = cellBgSelected;\n } else if (isHover) {\n fill = cellBgHovered;\n }\n\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill,\n });\n drawLine(ctx, {\n x,\n y,\n points: [0, 0, width, 0],\n stroke: cellLineColor,\n });\n drawLine(ctx, {\n x,\n y,\n points: [0, height, width, height],\n stroke: cellLineColor,\n });\n const halfSize = iconSizeXS / 2;\n\n ctx.font = `${10}px ${theme.fontFamily}`;\n\n if (commentCount) {\n const offsetX = getCommentCountOffsetX(width, theme, rowControlPaddingX, rowControls);\n if (offsetX != null) {\n drawCommentCount(ctx, {\n x: x + offsetX - halfSize,\n y: y + rowHeadIconPaddingTop,\n count: commentCount,\n theme,\n });\n }\n }\n\n if (isChecked || isHover || !rowIndexVisible) {\n for (let i = 0; i < rowControls.length; i++) {\n const { type, icon } = rowControls[i];\n const offsetX = getRowControlOffsetX(width, theme, rowControlPaddingX, rowControls.length, i);\n\n if (type === RowControlType.Spacer) continue;\n\n if (type === RowControlType.Checkbox) {\n drawCheckbox(ctx, {\n x: x + offsetX - halfSize,\n y: y + rowHeadIconPaddingTop,\n size: iconSizeXS,\n stroke: isChecked ? staticWhite : rowHeaderTextColor,\n fill: isChecked ? iconBgSelected : undefined,\n isChecked,\n });\n } else {\n if (isChecked && !isHover && rowIndexVisible && type === RowControlType.Expand) continue;\n if (!commentCount || type !== RowControlType.Expand) {\n spriteManager.drawSprite(ctx, {\n sprite: icon || spriteIconMap[type],\n x: x + offsetX - halfSize,\n y: y + rowHeadIconPaddingTop,\n size: iconSizeXS,\n theme,\n });\n }\n }\n }\n return;\n }\n\n drawSingleLineText(ctx, {\n x: x + width / 2,\n y: y + cellVerticalPaddingMD + 1,\n text: displayIndex,\n textAlign: 'center',\n fill: rowHeaderTextColor,\n });\n};\n\nexport const drawCommentCount = (\n ctx: CanvasRenderingContext2D,\n props: {\n x: number;\n y: number;\n count: number;\n theme: IGridTheme;\n }\n) => {\n const { theme } = props;\n const { commentCountBg, commentCountTextColor } = theme;\n drawRect(ctx, {\n ...props,\n x: props.x,\n y: props.y,\n width: 18,\n height: 16,\n stroke: commentCountBg,\n radius: 3,\n fill: commentCountBg,\n });\n\n drawSingleLineText(ctx, {\n ...props,\n x: props.x + 9,\n y: props.y + 3.5,\n text: props.count > 99 ? '99+' : props.count.toString(),\n textAlign: 'center',\n verticalAlign: 'middle',\n fontSize: 10,\n fill: commentCountTextColor,\n });\n};\n\nexport const drawColumnHeader = (ctx: CanvasRenderingContext2D, props: IFieldHeadDrawerProps) => {\n const { x, y, width, height, theme, fill, column, hasMenu, spriteManager } = props;\n const { name, icon, description, hasMenu: hasColumnMenu, isPrimary } = column;\n const {\n cellLineColor,\n columnHeaderBg,\n iconFgCommon,\n columnHeaderNameColor,\n fontSizeSM,\n iconSizeXS,\n } = theme;\n let maxTextWidth = width - columnHeadPadding * 2;\n let iconOffsetX = columnHeadPadding;\n const hasMenuInner = hasMenu && hasColumnMenu;\n\n drawRect(ctx, {\n x: x + 0.5,\n y,\n width: width - 0.5,\n height,\n fill: fill ?? columnHeaderBg,\n });\n drawLine(ctx, {\n x,\n y,\n points: [0, height, width, height, width, 0],\n stroke: cellLineColor,\n });\n\n if (isPrimary) {\n maxTextWidth = maxTextWidth - iconSizeXS - columnHeadPadding;\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Lock,\n x: x + iconOffsetX,\n y: y + (columnHeadHeight - iconSizeXS) / 2,\n size: iconSizeXS,\n theme,\n });\n iconOffsetX += iconSizeXS + columnHeadPadding / 2;\n }\n\n if (icon) {\n maxTextWidth = maxTextWidth - iconSizeXS;\n spriteManager.drawSprite(ctx, {\n sprite: icon,\n x: x + iconOffsetX,\n y: y + (columnHeadHeight - iconSizeXS) / 2,\n size: iconSizeXS,\n theme,\n });\n iconOffsetX += iconSizeXS + columnHeadPadding / 2;\n }\n\n if (hasMenuInner) {\n maxTextWidth = maxTextWidth - columnHeadMenuSize - columnHeadPadding;\n drawRoundPoly(ctx, {\n points: [\n {\n x: x + width - columnHeadPadding - columnHeadMenuSize,\n y: y + columnHeadHeight / 2 - columnHeadMenuSize / 4,\n },\n {\n x: x + width - columnHeadPadding,\n y: y + columnHeadHeight / 2 - columnHeadMenuSize / 4,\n },\n {\n x: x + width - columnHeadPadding - columnHeadMenuSize / 2,\n y: y + columnHeadHeight / 2 + columnHeadMenuSize / 4,\n },\n ],\n radiusAll: 1,\n fill: iconFgCommon,\n });\n }\n\n if (description) {\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Description,\n x: hasMenuInner\n ? x + width - 2 * iconSizeXS - columnHeadPadding\n : x + width - iconSizeXS - columnHeadPadding,\n y: y + (columnHeadHeight - iconSizeXS) / 2,\n size: iconSizeXS,\n theme,\n });\n\n maxTextWidth = maxTextWidth - iconSizeXS - columnHeadPadding;\n }\n\n drawMultiLineText(ctx, {\n x: x + iconOffsetX,\n y: y + cellVerticalPaddingMD,\n text: name,\n maxLines: Math.floor((height - cellVerticalPaddingMD) / cellTextLineHeight),\n lineHeight: cellTextLineHeight,\n fontSize: fontSizeSM,\n maxWidth: maxTextWidth,\n fill: columnHeaderNameColor,\n });\n};\n\nexport const drawGridHeader = (ctx: CanvasRenderingContext2D, props: IGridHeaderDrawerProps) => {\n const {\n x,\n y,\n width,\n height,\n theme,\n rowControls,\n rowControlPaddingX,\n isChecked,\n isMultiSelectionEnable,\n } = props;\n const {\n iconSizeXS,\n staticWhite,\n columnHeaderBg,\n cellLineColor,\n rowHeaderTextColor,\n iconBgSelected,\n } = theme;\n const halfSize = iconSizeXS / 2;\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill: columnHeaderBg,\n });\n drawLine(ctx, {\n x,\n y,\n points: [0, height, width, height],\n stroke: cellLineColor,\n });\n\n if (isMultiSelectionEnable && rowControls.some((item) => item.type === RowControlType.Checkbox)) {\n const offsetX = getRowControlCheckboxOffsetX({\n width,\n theme,\n rowControls,\n rowControlPaddingX,\n });\n drawCheckbox(ctx, {\n x: x + offsetX - halfSize + 0.5,\n y: y + height / 2 - halfSize,\n size: iconSizeXS,\n stroke: isChecked ? staticWhite : rowHeaderTextColor,\n fill: isChecked ? iconBgSelected : undefined,\n isChecked,\n });\n }\n};\n\nexport const drawColumnHeaders = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps,\n renderRegion: RenderRegion\n // eslint-disable-next-line sonarjs/cognitive-complexity\n) => {\n const {\n visibleRegion,\n coordInstance,\n columns,\n theme,\n spriteManager,\n mouseState,\n scrollState,\n selection,\n rowControls,\n rowControlPaddingX,\n isInteracting,\n isColumnHeaderMenuVisible,\n isMultiSelectionEnable,\n } = props;\n const { startColumnIndex: originStartColumnIndex, stopColumnIndex: originStopColumnIndex } =\n visibleRegion;\n const {\n containerWidth,\n freezeRegionWidth,\n rowInitSize,\n columnInitSize,\n freezeColumnCount,\n pureRowCount,\n } = coordInstance;\n const { scrollLeft } = scrollState;\n const { fontSizeSM, fontFamily } = theme;\n const { isColumnSelection, isRowSelection, ranges: selectionRanges } = selection;\n const { type: hoverRegionType, columnIndex: hoverColumnIndex } = mouseState;\n const isFreezeRegion = renderRegion === RenderRegion.Freeze;\n const startColumnIndex = isFreezeRegion ? 0 : Math.max(freezeColumnCount, originStartColumnIndex);\n const stopColumnIndex = isFreezeRegion\n ? Math.max(freezeColumnCount - 1, 0)\n : originStopColumnIndex;\n const endRowIndex = pureRowCount - 1;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n isFreezeRegion ? 0 : freezeRegionWidth + 1,\n 0,\n isFreezeRegion ? freezeRegionWidth + 1 : containerWidth - freezeRegionWidth,\n rowInitSize + 1\n );\n ctx.clip();\n ctx.font = `normal ${fontSizeSM}px ${fontFamily}`;\n\n for (let columnIndex = startColumnIndex; columnIndex <= stopColumnIndex; columnIndex++) {\n const column = columns[columnIndex];\n const finalTheme = column?.customTheme ? { ...theme, ...column.customTheme } : theme;\n const { columnHeaderBgHovered, columnHeaderBgSelected } = finalTheme;\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const isActive = isColumnSelection && selection.includes([columnIndex, columnIndex]);\n const isHover =\n !isInteracting &&\n [RegionType.ColumnHeader, RegionType.ColumnHeaderMenu].includes(hoverRegionType) &&\n hoverColumnIndex === columnIndex;\n let fill = undefined;\n\n if (isActive) {\n fill = columnHeaderBgSelected;\n } else if (isHover) {\n fill = columnHeaderBgHovered;\n }\n\n column &&\n drawColumnHeader(ctx, {\n x: x + 0.5,\n y: 0.5,\n width: columnWidth,\n height: rowInitSize,\n column: column,\n fill,\n hasMenu: isColumnHeaderMenuVisible,\n theme: finalTheme,\n spriteManager,\n });\n }\n\n const isChecked = isRowSelection && isEqual(selectionRanges[0], [0, endRowIndex]);\n drawGridHeader(ctx, {\n x: 0,\n y: 0.5,\n width: columnInitSize + 1.5,\n height: rowInitSize,\n theme,\n rowControls,\n rowControlPaddingX,\n isChecked,\n isMultiSelectionEnable,\n });\n\n ctx.restore();\n};\n\nexport const drawAppendRow = (ctx: CanvasRenderingContext2D, props: IAppendRowDrawerProps) => {\n const { x, y, width, height, theme, isHover, coordInstance, spriteManager } = props;\n const { appendRowBgHovered, iconSizeSM, cellBg, cellLineColor } = theme;\n const { columnInitSize } = coordInstance;\n const halfIconSize = iconSizeSM / 2;\n\n ctx.save();\n ctx.beginPath();\n drawRect(ctx, {\n x: x + 0.5,\n y: y + 0.5,\n width,\n height,\n fill: isHover ? appendRowBgHovered : cellBg,\n });\n drawRect(ctx, {\n x,\n y: y + height,\n width,\n height: 1,\n fill: cellLineColor,\n });\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Add,\n x: x + columnInitSize / 2 - halfIconSize + 0.5,\n y: y + height / 2 - halfIconSize + 0.5,\n size: iconSizeSM,\n theme,\n });\n ctx.restore();\n};\n\nexport const drawAppendColumn = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const { coordInstance, theme, mouseState, scrollState, isColumnAppendEnable, spriteManager } =\n props;\n const { scrollLeft, scrollTop } = scrollState;\n const { totalWidth, totalHeight } = coordInstance;\n const { type: hoverRegionType } = mouseState;\n\n if (!isColumnAppendEnable) return;\n\n const { iconSizeSM, columnHeaderBg, cellLineColor, columnHeaderBgHovered } = theme;\n const isHover = hoverRegionType === RegionType.AppendColumn;\n const x = totalWidth - scrollLeft;\n\n drawRect(ctx, {\n x: x + 1,\n y: 0.5,\n width: columnAppendBtnWidth,\n height: totalHeight - scrollTop,\n fill: isHover ? columnHeaderBgHovered : columnHeaderBg,\n });\n drawLine(ctx, {\n x: x + 0.5,\n y: columnHeadHeight + 0.5,\n points: [0, 0, 0, totalHeight - scrollTop - columnHeadHeight],\n stroke: cellLineColor,\n });\n\n const halfIconSize = iconSizeSM / 2;\n spriteManager.drawSprite(ctx, {\n sprite: GridInnerIcon.Add,\n x: x + columnAppendBtnWidth / 2 - halfIconSize + 0.5,\n y: columnHeadHeight / 2 - halfIconSize + 0.5,\n size: iconSizeSM,\n theme,\n });\n};\n\nexport const drawColumnResizeHandler = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps\n) => {\n const {\n theme,\n scrollState,\n coordInstance,\n isColumnResizable,\n columnResizeState,\n hoveredColumnResizeIndex,\n } = props;\n const { columnIndex: resizeColumnIndex } = columnResizeState;\n const isHover = isColumnResizable && hoveredColumnResizeIndex > -1;\n const isResizing = resizeColumnIndex > -1;\n\n if (!isHover && !isResizing) return;\n\n const { scrollLeft } = scrollState;\n const { rowInitSize } = coordInstance;\n const { columnResizeHandlerBg } = theme;\n let x = 0;\n\n if (isResizing) {\n const columnWidth = coordInstance.getColumnWidth(resizeColumnIndex);\n x = coordInstance.getColumnRelativeOffset(resizeColumnIndex, scrollLeft) + columnWidth;\n } else {\n const realColumnWidth = coordInstance.getColumnWidth(hoveredColumnResizeIndex);\n x =\n coordInstance.getColumnRelativeOffset(hoveredColumnResizeIndex, scrollLeft) + realColumnWidth;\n }\n\n drawRect(ctx, {\n x: x - columnResizeHandlerWidth / 2 + 0.5,\n y: columnResizeHandlerPaddingTop + 0.5,\n width: columnResizeHandlerWidth,\n height: rowInitSize - columnResizeHandlerPaddingTop * 2,\n fill: columnResizeHandlerBg,\n radius: 3,\n });\n};\n\nexport const drawColumnDraggingRegion = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps\n) => {\n const { columns, theme, mouseState, scrollState, dragState, coordInstance } = props;\n const { columnDraggingPlaceholderBg, interactionLineColorHighlight } = theme;\n const { type, isDragging, ranges: draggingRanges, delta } = dragState;\n const { containerHeight } = coordInstance;\n const { x } = mouseState;\n const { scrollLeft } = scrollState;\n\n if (!isDragging || type !== DragRegionType.Columns) return;\n\n const draggingColIndex = draggingRanges[0][0];\n drawRect(ctx, {\n x: x - delta,\n y: 0.5,\n width: columns[draggingColIndex].width as number,\n height: containerHeight,\n fill: columnDraggingPlaceholderBg,\n });\n\n const targetColumnIndex = getDropTargetIndex(coordInstance, mouseState, scrollState, type);\n const finalX = coordInstance.getColumnRelativeOffset(targetColumnIndex, scrollLeft);\n\n drawRect(ctx, {\n x: finalX - 0.5,\n y: 0.5,\n width: 2,\n height: containerHeight,\n fill: interactionLineColorHighlight,\n });\n};\n\nexport const drawRowDraggingRegion = (ctx: CanvasRenderingContext2D, props: ILayoutDrawerProps) => {\n const { theme, mouseState, scrollState, dragState, coordInstance } = props;\n const { columnDraggingPlaceholderBg, interactionLineColorHighlight } = theme;\n const { type, isDragging, ranges: draggingRanges, delta } = dragState;\n const { containerWidth } = coordInstance;\n const { scrollTop } = scrollState;\n const { y } = mouseState;\n\n if (!isDragging || type !== DragRegionType.Rows) return;\n\n const draggingRowIndex = draggingRanges[0][0];\n drawRect(ctx, {\n x: 0.5,\n y: y - delta,\n width: containerWidth,\n height: coordInstance.getRowHeight(draggingRowIndex),\n fill: columnDraggingPlaceholderBg,\n });\n\n const targetRowIndex = getDropTargetIndex(coordInstance, mouseState, scrollState, type);\n const offsetY = coordInstance.getRowOffset(targetRowIndex);\n const finalY = offsetY - scrollTop;\n\n drawRect(ctx, {\n x: 0.5,\n y: finalY - 0.5,\n width: containerWidth,\n height: 2,\n fill: interactionLineColorHighlight,\n });\n};\n\nexport const drawColumnFreezeHandler = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps\n) => {\n const { coordInstance, mouseState, scrollState, columnFreezeState, theme } = props;\n const { isFreezing, targetIndex } = columnFreezeState;\n const { type, x, y } = mouseState;\n\n if (type !== RegionType.ColumnFreezeHandler && !isFreezing) return;\n\n const { scrollLeft } = scrollState;\n const { interactionLineColorHighlight } = theme;\n const { containerHeight, freezeRegionWidth } = coordInstance;\n const hoverX = isFreezing ? x : freezeRegionWidth;\n\n if (isFreezing) {\n const targetX = coordInstance.getColumnRelativeOffset(targetIndex + 1, scrollLeft);\n drawRect(ctx, {\n x: targetX - 1,\n y: 0,\n width: 2,\n height: containerHeight,\n fill: interactionLineColorHighlight,\n });\n }\n\n drawRect(ctx, {\n x: hoverX - columnFreezeHandlerWidth / 2,\n y: y - columnFreezeHandlerHeight / 2,\n width: columnFreezeHandlerWidth,\n height: columnFreezeHandlerHeight,\n fill: interactionLineColorHighlight,\n radius: 4,\n });\n drawRect(ctx, {\n x: hoverX - 1,\n y: 0,\n width: 2,\n height: containerHeight,\n fill: interactionLineColorHighlight,\n });\n};\n\nconst setVisibleImageRegion = (props: ILayoutDrawerProps) => {\n const { imageManager, coordInstance, visibleRegion, getLinearRow } = props;\n const { startColumnIndex, stopColumnIndex, startRowIndex, stopRowIndex } = visibleRegion;\n const realStartRowIndex = getLinearRow(startRowIndex).realIndex;\n const realStopRowIndex = getLinearRow(stopRowIndex).realIndex;\n const { freezeColumnCount } = coordInstance;\n imageManager?.setWindow(\n {\n x: startColumnIndex,\n y: realStartRowIndex,\n width: stopColumnIndex - startColumnIndex,\n height: realStopRowIndex - realStartRowIndex,\n },\n freezeColumnCount\n );\n};\n\nexport const drawFreezeRegionDivider = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps,\n dividerRegion: DividerRegion\n) => {\n const { theme, coordInstance, scrollState, height } = props;\n const { interactionLineColorCommon } = theme;\n const { scrollLeft } = scrollState;\n const { freezeRegionWidth, containerHeight } = coordInstance;\n const isTop = dividerRegion === DividerRegion.Top;\n\n const startY = isTop ? 0 : containerHeight;\n const endY = isTop ? containerHeight : height;\n\n if (scrollLeft === 0) {\n return drawRect(ctx, {\n x: freezeRegionWidth,\n y: startY + 0.5,\n width: 1,\n height: endY - startY,\n fill: interactionLineColorCommon,\n });\n }\n\n ctx.save();\n ctx.beginPath();\n\n ctx.shadowColor = interactionLineColorCommon;\n ctx.shadowBlur = 5;\n ctx.shadowOffsetX = 3;\n ctx.strokeStyle = interactionLineColorCommon;\n\n ctx.moveTo(freezeRegionWidth + 0.5, startY);\n ctx.lineTo(freezeRegionWidth + 0.5, endY);\n ctx.stroke();\n\n ctx.restore();\n};\n\nexport const drawColumnHeadersRegion = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps\n) => {\n const { columnHeaderHeight } = props;\n\n if (columnHeaderHeight === 0) return;\n\n [RenderRegion.Freeze, RenderRegion.Other].forEach((r) => drawColumnHeaders(ctx, props, r));\n drawAppendColumn(ctx, props);\n};\n\nexport const drawColumnStatistics = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps,\n renderRegion: RenderRegion\n // eslint-disable-next-line sonarjs/cognitive-complexity\n) => {\n const {\n coordInstance,\n columns,\n theme,\n height,\n visibleRegion,\n mouseState,\n scrollState,\n columnStatistics,\n groupCollection,\n getLinearRow,\n } = props;\n\n if (columnStatistics == null) return;\n\n const { scrollLeft, scrollTop } = scrollState;\n let { startColumnIndex, stopColumnIndex } = visibleRegion;\n const { startRowIndex, stopRowIndex } = visibleRegion;\n const { type, columnIndex: hoverColumnIndex, rowIndex: hoverRowIndex } = mouseState;\n const { rowInitSize, containerHeight, containerWidth, freezeRegionWidth, freezeColumnCount } =\n coordInstance;\n const {\n fontSizeXS,\n fontFamily,\n columnHeaderBg,\n groupHeaderBgTertiary,\n groupHeaderBgSecondary,\n groupHeaderBgPrimary,\n columnStatisticBgHoveredPrimary,\n columnStatisticBgHoveredSecondary,\n columnStatisticBgHoveredTertiary,\n } = theme;\n const isFreezeRegion = renderRegion === RenderRegion.Freeze;\n const y = containerHeight + 0.5;\n\n startColumnIndex = isFreezeRegion ? 0 : Math.max(freezeColumnCount, startColumnIndex);\n stopColumnIndex = isFreezeRegion ? Math.max(freezeColumnCount - 1, 0) : stopColumnIndex;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n isFreezeRegion ? 0 : freezeRegionWidth,\n rowInitSize,\n isFreezeRegion ? freezeRegionWidth : containerWidth - freezeRegionWidth,\n height\n );\n ctx.clip();\n ctx.font = `${fontSizeXS}px ${fontFamily}`;\n\n const { groupColumns } = groupCollection ?? {};\n\n for (let columnIndex = startColumnIndex; columnIndex <= stopColumnIndex; columnIndex++) {\n const x = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const isFirstColumn = columnIndex === 0;\n const isColumnHovered = columnIndex === hoverColumnIndex;\n const column = columns[columnIndex];\n\n if (column == null) continue;\n\n const { id: columnId, name, statisticLabel } = column;\n\n if (groupColumns != null) {\n const bgList = [groupHeaderBgTertiary, groupHeaderBgSecondary, groupHeaderBgPrimary].slice(\n -groupColumns.length\n );\n const hoverBgList = [\n columnStatisticBgHoveredTertiary,\n columnStatisticBgHoveredSecondary,\n columnStatisticBgHoveredPrimary,\n ].slice(-groupColumns.length);\n\n for (let rowIndex = startRowIndex; rowIndex <= stopRowIndex; rowIndex++) {\n const linearRow = getLinearRow(rowIndex);\n const rowHeight = coordInstance.getRowHeight(rowIndex);\n const { type: linearRowType } = linearRow;\n const y = coordInstance.getRowOffset(rowIndex) - scrollTop;\n\n if (linearRowType === LinearRowType.Group) {\n const { id, depth } = linearRow;\n const text = columnStatistics[columnId ?? name]?.[id];\n\n const labelWidth = isFirstColumn\n ? Math.min(\n drawSingleLineText(ctx, {\n maxWidth: columnWidth,\n text: text ?? statisticLabel?.label ?? 'Summary',\n needRender: false,\n fontSize: fontSizeXS,\n }).width + cellHorizontalPadding,\n columnWidth\n )\n : columnWidth - 1;\n\n drawStatisticCell(ctx, {\n x: isFirstColumn ? x + columnWidth - labelWidth : x + 1,\n y: y + 1,\n textOffsetY: columnStatisticHeight / 2 - 2,\n width: labelWidth,\n height: rowHeight - 1,\n text,\n defaultLabel: statisticLabel?.label,\n bgColor: isFirstColumn && text ? bgList[depth] : undefined,\n hoverBgColor: hoverBgList[depth],\n isHovered:\n isColumnHovered && rowIndex === hoverRowIndex && type === RegionType.GroupStatistic,\n theme,\n });\n }\n }\n }\n\n const text = columnStatistics[columnId ?? name]?.total;\n\n drawStatisticCell(ctx, {\n x,\n y: y + 1,\n textOffsetY: cellVerticalPaddingMD,\n width: columnWidth,\n height: columnStatisticHeight,\n text,\n bgColor: columnHeaderBg,\n isHovered: isColumnHovered && type === RegionType.ColumnStatistic,\n showAlways: statisticLabel?.showAlways,\n defaultLabel: statisticLabel?.label,\n theme,\n });\n }\n\n ctx.restore();\n};\n\nexport const drawStatisticCell = (\n ctx: CanvasRenderingContext2D,\n props: IGroupStatisticDrawerProps\n) => {\n const {\n x,\n y,\n width,\n height,\n text,\n textOffsetY,\n isHovered,\n showAlways,\n theme,\n defaultLabel,\n bgColor,\n hoverBgColor,\n } = props;\n const { rowHeaderTextColor, columnStatisticBgHoveredPrimary, fontSizeXS } = theme;\n\n if (text || isHovered || showAlways || bgColor) {\n drawRect(ctx, {\n x,\n y,\n width,\n height,\n fill: isHovered ? (hoverBgColor ?? columnStatisticBgHoveredPrimary) : bgColor,\n });\n }\n\n const textProp: Omit<ISingleLineTextProps, 'text'> = {\n x: x + 0.5,\n y: y + (textOffsetY ?? 0.5),\n textAlign: 'right',\n maxWidth: width - cellHorizontalPadding / 2,\n fill: rowHeaderTextColor,\n fontSize: fontSizeXS,\n };\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n\n if (isHovered || showAlways) {\n !text && drawSingleLineText(ctx, { ...textProp, text: defaultLabel || 'Summary' });\n }\n\n if (text) {\n ctx.fillStyle = rowHeaderTextColor;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n ctx.fillText(\n text,\n x + width - cellHorizontalPadding,\n y + (textOffsetY ?? 0.5) + fontSizeXS / 2\n );\n }\n\n ctx.restore();\n};\n\nexport const drawColumnStatisticsRegion = (\n ctx: CanvasRenderingContext2D,\n props: ILayoutDrawerProps\n) => {\n const { coordInstance, theme, columnStatistics, height } = props;\n const { containerWidth } = coordInstance;\n const { cellLineColor } = theme;\n const y = height - columnStatisticHeight + 0.5;\n\n if (columnStatistics == null) return;\n\n [RenderRegion.Freeze, RenderRegion.Other].forEach((r) => drawColumnStatistics(ctx, props, r));\n\n drawLine(ctx, {\n x: 0,\n y,\n points: [0, 0, containerWidth, 0],\n stroke: cellLineColor,\n });\n};\n\nexport const computeShouldRerender = (current: ILayoutDrawerProps, last?: ILayoutDrawerProps) => {\n if (last == null) return true;\n return !(\n current.theme === last.theme &&\n current.columns === last.columns &&\n current.getLinearRow === last.getLinearRow &&\n current.real2RowIndex === last.real2RowIndex &&\n current.getCellContent === last.getCellContent &&\n current.coordInstance === last.coordInstance &&\n current.visibleRegion === last.visibleRegion &&\n current.forceRenderFlag === last.forceRenderFlag &&\n current.hoverCellPosition === last.hoverCellPosition\n );\n};\n\nexport const drawCacheContent = (\n cacheCanvas: HTMLCanvasElement | undefined,\n props: ICacheDrawerProps\n) => {\n if (!cacheCanvas) return;\n\n const { containerWidth, containerHeight, pixelRatio, shouldRerender, draw } = props;\n const width = Math.ceil(containerWidth * pixelRatio);\n const height = Math.ceil(containerHeight * pixelRatio);\n\n if (cacheCanvas.width !== width || cacheCanvas.height !== height) {\n cacheCanvas.width = width;\n cacheCanvas.height = height;\n }\n\n const cacheCtx = cacheCanvas.getContext('2d');\n if (cacheCtx == null) return;\n\n if (shouldRerender) {\n cacheCtx.clearRect(0, 0, width, height);\n cacheCtx.save();\n\n if (pixelRatio !== 1) {\n cacheCtx.scale(pixelRatio, pixelRatio);\n }\n\n cacheCtx.beginPath();\n cacheCtx.rect(0, 0, containerWidth, containerHeight);\n cacheCtx.clip();\n }\n\n draw(cacheCtx);\n\n if (shouldRerender) {\n cacheCtx.restore();\n }\n};\n\nexport const drawGrid = (\n mainCanvas: HTMLCanvasElement,\n cacheCanvas: HTMLCanvasElement,\n props: ILayoutDrawerProps,\n lastProps?: ILayoutDrawerProps\n) => {\n const { coordInstance, scrollState, height: originHeight, columnStatistics } = props;\n const { isScrolling } = scrollState;\n const { containerWidth } = coordInstance;\n\n if (containerWidth === 0 || originHeight === 0) return;\n\n const pixelRatio = Math.ceil(window.devicePixelRatio ?? 1);\n const width = Math.ceil(containerWidth * pixelRatio);\n const height = Math.ceil(originHeight * pixelRatio);\n const shouldRerender = isScrolling || computeShouldRerender(props, lastProps);\n\n if (mainCanvas.width !== width || mainCanvas.height !== height) {\n mainCanvas.width = width;\n mainCanvas.height = height;\n mainCanvas.style.width = containerWidth + 'px';\n mainCanvas.style.height = originHeight + 'px';\n }\n\n const mainCtx = mainCanvas.getContext('2d');\n if (mainCtx == null) return;\n\n mainCtx.clearRect(0, 0, width, height);\n mainCtx.save();\n\n if (pixelRatio !== 1) {\n mainCtx.scale(pixelRatio, pixelRatio);\n }\n\n mainCtx.beginPath();\n mainCtx.rect(0, 0, containerWidth, originHeight);\n mainCtx.clip();\n\n drawCacheContent(cacheCanvas, {\n containerWidth,\n containerHeight: originHeight,\n pixelRatio,\n shouldRerender,\n draw: (cacheCtx) => {\n drawCells(mainCtx, cacheCtx, { ...props, shouldRerender });\n },\n });\n\n mainCtx.save();\n mainCtx.setTransform(1, 0, 0, 1, 0, 0);\n mainCtx.drawImage(cacheCanvas, 0, 0, width, height);\n mainCtx.restore();\n\n drawColumnHeadersRegion(mainCtx, props);\n\n drawFreezeRegionDivider(mainCtx, props, DividerRegion.Top);\n\n drawCollaborators(mainCtx, props);\n\n drawSearchTargetIndex(mainCtx, props);\n\n drawSearchCursor(mainCtx, props);\n\n drawColumnStatisticsRegion(mainCtx, props);\n\n drawActiveCell(mainCtx, props);\n\n drawFillPreview(mainCtx, props);\n\n columnStatistics != null && drawFreezeRegionDivider(mainCtx, props, DividerRegion.Bottom);\n\n // Fill handle for vertical drag-fill\n drawFillHandler(mainCtx, props);\n\n drawColumnResizeHandler(mainCtx, props);\n\n drawRowDraggingRegion(mainCtx, props);\n\n drawColumnDraggingRegion(mainCtx, props);\n\n drawColumnFreezeHandler(mainCtx, props);\n\n setVisibleImageRegion(props);\n\n mainCtx.restore();\n};\n","import { Input } from '../../../../grid-adapter/ui';\nimport type { ChangeEvent, ForwardRefRenderFunction, KeyboardEvent, RefObject } from 'react';\nimport { useState, useRef, useImperativeHandle, forwardRef, useMemo } from 'react';\nimport AutoSizeTextarea from 'react-textarea-autosize';\nimport { Key } from 'ts-keycode-enum';\nimport { useContentDir } from '../../../../grid-adapter/hooks';\nimport { GRID_DEFAULT } from '../../configs';\nimport type { ILinkCell, INumberCell, ITextCell } from '../../renderers';\nimport { CellType } from '../../renderers';\nimport type { IEditorRef, IEditorProps } from './EditorContainer';\n\nconst { rowHeight: defaultRowHeight } = GRID_DEFAULT;\n\nconst TextEditorBase: ForwardRefRenderFunction<\n IEditorRef<ITextCell | INumberCell>,\n IEditorProps<ITextCell | INumberCell | ILinkCell>\n> = (props, ref) => {\n const { cell, rect, style, theme, isEditing, onChange } = props;\n const { cellLineColorActived } = theme;\n const { width, height } = rect;\n const { displayData, type } = cell;\n const needWrap = (cell as ITextCell)?.isWrap;\n const inputRef = useRef<HTMLInputElement | HTMLTextAreaElement>(null);\n const [value, setValueInner] = useState(displayData);\n const contentDir = useContentDir();\n\n useImperativeHandle(ref, () => ({\n focus: () => inputRef.current?.focus(),\n setValue: (value: string | number | null | undefined) => setValueInner(String(value ?? '')),\n saveValue,\n }));\n\n const saveValue = () => {\n if (value === displayData || !isEditing) return;\n if (type === CellType.Number) {\n onChange?.(Number(value));\n } else {\n onChange?.(typeof value === 'string' ? value.trim() : value);\n }\n };\n\n const onChangeInner = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const value = e.target.value;\n setValueInner(value);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n const { keyCode, shiftKey } = event;\n if (keyCode === Key.Enter && !shiftKey) {\n event.preventDefault();\n }\n if (keyCode === Key.Enter && shiftKey) {\n event.stopPropagation();\n }\n };\n\n const attachStyle = useMemo(() => {\n const style: React.CSSProperties = {\n width: width + 4,\n minHeight: height + 4,\n height: needWrap ? 'auto' : height + 4,\n marginLeft: -2,\n marginTop: -2,\n textAlign: type === CellType.Number ? 'right' : 'start',\n };\n if (height > defaultRowHeight) {\n style.paddingBottom = height - defaultRowHeight;\n }\n return style;\n }, [type, height, width, needWrap]);\n\n return (\n <>\n {needWrap ? (\n <div\n style={{\n ...style,\n ...attachStyle,\n paddingBottom: 16,\n border: `2px solid ${cellLineColorActived}`,\n }}\n className=\"relative rounded-md bg-background\"\n >\n <AutoSizeTextarea\n ref={inputRef as RefObject<HTMLTextAreaElement>}\n dir={contentDir}\n className=\"w-full resize-none rounded border-none bg-background px-2 pt-1 text-[13px] leading-[1.4rem] focus-visible:outline-none\"\n value={value}\n minRows={2}\n maxRows={5}\n onBlur={saveValue}\n onKeyDown={onKeyDown}\n onChange={onChangeInner}\n />\n <div className=\"absolute bottom-[2px] start-0 w-full rounded-b-md bg-background pb-[2px] pe-1 text-end text-xs text-slate-400 dark:text-slate-600\">\n Shift + Enter\n </div>\n </div>\n ) : (\n <Input\n ref={inputRef as RefObject<HTMLInputElement>}\n dir={contentDir}\n style={{\n border: `2px solid ${cellLineColorActived}`,\n ...style,\n ...attachStyle,\n }}\n value={value}\n className=\"cursor-text border-2 text-[13px]\"\n onChange={onChangeInner}\n onBlur={saveValue}\n onMouseDown={(e) => e.stopPropagation()}\n />\n )}\n </>\n );\n};\n\nexport const TextEditor = forwardRef(TextEditorBase);\n","/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { getRandomString } from '../../../../grid-adapter/core';\nimport { useUiDirection } from '../../../../grid-adapter/ui';\nimport { clamp } from 'lodash';\nimport type { CSSProperties, ForwardRefRenderFunction } from 'react';\nimport { useEffect, useRef, useMemo, useImperativeHandle, forwardRef } from 'react';\nimport type { IGridTheme } from '../../configs';\nimport { useKeyboardSelection } from '../../hooks';\nimport type { IInteractionLayerProps } from '../../InteractionLayer';\nimport {\n SelectionRegionType,\n type IActiveCellBound,\n type ICellItem,\n type IRectangle,\n type IScrollState,\n} from '../../interface';\nimport type { CombinedSelection } from '../../managers';\nimport type { ICell, IInnerCell } from '../../renderers/cell-renderer/interface';\nimport { CellType } from '../../renderers/cell-renderer/interface';\nimport { isPrintableKey, shouldForwardPasteToGrid } from '../../utils';\nimport { BooleanEditor } from './BooleanEditor';\nimport { RatingEditor } from './RatingEditor';\nimport { SelectEditor } from './SelectEditor';\nimport { TextEditor } from './TextEditor';\n\nexport interface IEditorContainerProps extends Pick<\n IInteractionLayerProps,\n | 'theme'\n | 'coordInstance'\n | 'scrollToItem'\n | 'real2RowIndex'\n | 'getCellContent'\n | 'onUndo'\n | 'onRedo'\n | 'onCopy'\n | 'onPaste'\n | 'onDelete'\n | 'onRowAppend'\n | 'onRowExpand'\n | 'scrollBy'\n | 'disableEnterMoveDown'\n> {\n isEditing?: boolean;\n scrollState: IScrollState;\n activeCell: ICellItem | null;\n selection: CombinedSelection;\n activeCellBound: IActiveCellBound | null;\n setActiveCell: React.Dispatch<React.SetStateAction<ICellItem | null>>;\n setSelection: React.Dispatch<React.SetStateAction<CombinedSelection>>;\n setEditing: React.Dispatch<React.SetStateAction<boolean>>;\n onChange?: (cell: ICellItem, cellValue: IInnerCell) => void;\n onContextMenu?: () => void;\n}\n\nexport interface IEditorRef<T extends IInnerCell = IInnerCell> {\n focus?: () => void;\n setValue?: (data: T['data']) => void;\n saveValue?: () => void;\n}\n\nexport interface IEditorProps<T extends IInnerCell = IInnerCell> {\n cell: T;\n rect: IRectangle & { editorId: string };\n theme: IGridTheme;\n style?: CSSProperties;\n isEditing?: boolean;\n isScrolling?: boolean;\n initialSearch?: string;\n setEditing?: React.Dispatch<React.SetStateAction<boolean>>;\n onChange?: (value: unknown) => void;\n}\n\nexport interface IEditorContainerRef {\n focus?: () => void;\n saveValue?: () => void;\n}\n\nconst NO_EDITING_CELL_TYPES = new Set([CellType.Boolean, CellType.Rating]);\n\nexport const EditorContainerBase: ForwardRefRenderFunction<\n IEditorContainerRef,\n IEditorContainerProps\n> = (props, ref) => {\n const {\n theme,\n isEditing,\n coordInstance,\n scrollState,\n activeCell,\n selection,\n activeCellBound,\n scrollToItem,\n onUndo,\n onRedo,\n onCopy,\n onPaste,\n onChange,\n onDelete,\n onRowExpand,\n onContextMenu,\n setEditing,\n setActiveCell,\n setSelection,\n real2RowIndex,\n getCellContent,\n scrollBy,\n disableEnterMoveDown,\n } = props;\n const { scrollLeft, scrollTop, isScrolling } = scrollState;\n const { rowIndex, realRowIndex, columnIndex } = useMemo(() => {\n const [columnIndex, realRowIndex] = activeCell ?? [-1, -1];\n return {\n rowIndex: real2RowIndex(realRowIndex) ?? -1,\n realRowIndex,\n columnIndex,\n };\n }, [activeCell, real2RowIndex]);\n const cellContent = useMemo(() => {\n return getCellContent([columnIndex, realRowIndex]) as IInnerCell;\n }, [columnIndex, realRowIndex, getCellContent]);\n const { type: cellType, readonly, editorWidth } = cellContent;\n const enableReadonlyCustomEditor = Boolean(readonly && cellContent.readonlyCustomEditor);\n const editingEnable = Boolean(\n (!readonly && isEditing && activeCell) || enableReadonlyCustomEditor\n );\n const width = editorWidth ?? coordInstance.getColumnWidth(columnIndex);\n const height = activeCellBound?.height ?? coordInstance.getRowHeight(rowIndex);\n const editorRef = useRef<IEditorRef | null>(null);\n const defaultFocusRef = useRef<HTMLInputElement | null>(null);\n const editorId = useMemo(() => `editor-container-${getRandomString(8)}`, []);\n const initialSearchRef = useRef<string>('');\n\n useImperativeHandle(ref, () => ({\n focus: () => editorRef.current?.focus?.(),\n saveValue: () => editorRef.current?.saveValue?.(),\n }));\n\n useEffect(() => {\n if ((cellContent as ICell).type === CellType.Loading) return;\n if (!activeCell || isEditing) return;\n editorRef.current?.setValue?.(cellContent.data);\n }, [cellContent, activeCell, isEditing]);\n\n useEffect(() => {\n if (selection.type === SelectionRegionType.None) return;\n // Row header selection clears activeCell; keep its clipboard target available.\n if (activeCell && (cellType as CellType) === CellType.Loading) return;\n\n initialSearchRef.current = '';\n\n requestAnimationFrame(() => {\n // Don't steal focus from dialogs/modals/sheets — unless this grid itself lives inside it\n const dialog = document.activeElement?.closest('[role=\"dialog\"]');\n if (dialog && !dialog.contains(defaultFocusRef.current)) return;\n // Linked grids synchronize row selections without a user interaction.\n // Only hand off row-selection focus if this grid already owns it.\n const grid = defaultFocusRef.current?.closest('[data-t-grid-container]');\n if (!activeCell && !grid?.contains(document.activeElement)) return;\n (editorRef.current || defaultFocusRef.current)?.focus?.();\n });\n }, [cellType, activeCell, selection, isEditing]);\n\n useKeyboardSelection({\n editorRef,\n isEditing,\n activeCell,\n selection,\n coordInstance,\n onUndo,\n onRedo,\n onDelete,\n onRowExpand,\n setEditing,\n setActiveCell,\n setSelection,\n scrollToItem,\n scrollBy,\n disableEnterMoveDown,\n });\n\n const editorStyle = useMemo(\n () =>\n (editingEnable\n ? { pointerEvents: 'auto', minWidth: width, minHeight: height }\n : { pointerEvents: 'none', opacity: 0, width: 0, height: 0 }) as React.CSSProperties,\n [editingEnable, height, width]\n );\n\n const uiDir = useUiDirection();\n const rect = useMemo(() => {\n const { rowInitSize, columnInitSize, containerWidth, containerHeight } = coordInstance;\n const x = clamp(\n coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft),\n columnInitSize,\n containerWidth - width\n );\n const y = clamp(\n coordInstance.getRowOffset(rowIndex) - scrollTop,\n rowInitSize,\n containerHeight - height\n );\n\n return {\n x,\n y,\n width,\n height,\n editorId,\n };\n }, [coordInstance, rowIndex, columnIndex, width, height, scrollLeft, scrollTop, editorId]);\n\n const EditorRenderer = useMemo(() => {\n if (readonly && !enableReadonlyCustomEditor) return null;\n\n const onChangeInner = (value: unknown) => {\n if (readonly) return;\n onChange?.([columnIndex, realRowIndex], {\n ...cellContent,\n data: value,\n } as IInnerCell);\n };\n\n const { customEditor } = cellContent;\n\n if (customEditor) {\n return customEditor(\n {\n rect,\n theme,\n style: editorStyle,\n cell: cellContent as IInnerCell,\n isEditing,\n isScrolling,\n setEditing,\n onChange: onChangeInner,\n initialSearch: initialSearchRef.current,\n },\n editorRef\n );\n }\n\n switch (cellType) {\n case CellType.Text:\n case CellType.Link:\n case CellType.Number: {\n return (\n <TextEditor\n ref={editorRef}\n rect={rect}\n theme={theme}\n style={editorStyle}\n cell={cellContent}\n isEditing={isEditing}\n onChange={onChangeInner}\n />\n );\n }\n case CellType.Boolean:\n return (\n <BooleanEditor\n ref={editorRef}\n rect={rect}\n theme={theme}\n cell={cellContent}\n onChange={onChangeInner}\n />\n );\n case CellType.Rating:\n return (\n <RatingEditor\n ref={editorRef}\n rect={rect}\n theme={theme}\n cell={cellContent}\n onChange={onChangeInner}\n />\n );\n case CellType.Select:\n return (\n <SelectEditor\n ref={editorRef}\n rect={rect}\n theme={theme}\n cell={cellContent}\n style={editorStyle}\n isEditing={isEditing}\n initialSearch={initialSearchRef.current}\n setEditing={setEditing}\n onChange={onChangeInner}\n />\n );\n default:\n return null;\n }\n }, [\n readonly,\n enableReadonlyCustomEditor,\n cellContent,\n cellType,\n onChange,\n columnIndex,\n realRowIndex,\n rect,\n theme,\n editorStyle,\n isEditing,\n isScrolling,\n setEditing,\n ]);\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (!activeCell || isEditing) return;\n if (!isPrintableKey(event.nativeEvent)) return;\n if (NO_EDITING_CELL_TYPES.has(cellType)) return;\n\n const key = event.key;\n if (key && key.length === 1) {\n initialSearchRef.current = key;\n } else {\n initialSearchRef.current = '';\n }\n\n setEditing(true);\n editorRef.current?.setValue?.(null);\n };\n\n const onPasteInner = (e: React.ClipboardEvent) => {\n if (selection.type === SelectionRegionType.None) return;\n if (\n !shouldForwardPasteToGrid({\n isEditing: Boolean(isEditing),\n eventTarget: e.target,\n hiddenFocusEl: defaultFocusRef.current,\n })\n ) {\n return;\n }\n if (isEditing) {\n e.preventDefault();\n setEditing(false);\n }\n onPaste?.(selection, e);\n };\n\n const onCopyInner = (e: React.ClipboardEvent) => {\n if (isEditing || selection.type === SelectionRegionType.None) return;\n onCopy?.(selection, e);\n };\n\n const onContextMenuInner = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!onContextMenu) return;\n // Portalled content (the expand dialog) bubbles through React but is not over the cell\n if (!e.currentTarget.contains(e.target as Node)) return;\n // An open editor keeps its native context menu. Otherwise whatever editor DOM\n // is under the pointer (readonly preview, expand button) sits over the active\n // cell, which the stage cannot see, so the right-click belongs to the grid.\n if (isEditing && !enableReadonlyCustomEditor) return;\n // Text selected inside the editor keeps the native menu so it can be copied\n const textSelection = window.getSelection();\n if (\n textSelection &&\n !textSelection.isCollapsed &&\n e.currentTarget.contains(textSelection.anchorNode)\n ) {\n return;\n }\n e.preventDefault();\n onContextMenu();\n };\n\n return (\n <div\n id={editorId}\n className=\"click-outside-ignore pointer-events-none absolute start-0 top-0 w-full\"\n >\n <div\n // The grid pins itself to dir=\"ltr\" so its column geometry and\n // `scrollLeft` stay put, but a cell editor is a panel like any other and\n // reads with the rest of the interface. Position stays physical — it is\n // measured off that same LTR frame — while everything drawn inside the\n // box follows the document again.\n dir={uiDir}\n className=\"absolute z-10\"\n style={{\n top: rect.y,\n left: rect.x,\n minWidth: width,\n minHeight: height,\n }}\n onKeyDown={onKeyDown}\n onPaste={onPasteInner}\n onCopy={onCopyInner}\n onContextMenu={onContextMenuInner}\n >\n {EditorRenderer}\n <input className=\"size-0 opacity-0\" ref={defaultFocusRef} />\n </div>\n </div>\n );\n};\n\nexport const EditorContainer = forwardRef(EditorContainerBase);\n","/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\nimport { MagicAi, Square } from '../../../grid-adapter/icons';\nimport { useMemo } from 'react';\nimport type { ICellItem, IColumnLoading, IScrollState } from '../interface';\nimport type { CoordinateManager } from '../managers';\n\nexport interface ILoadingIndicatorProps {\n cellLoadings: ICellItem[];\n columnLoadings: IColumnLoading[];\n coordInstance: CoordinateManager;\n scrollState: IScrollState;\n real2RowIndex: (index: number) => number;\n}\n\nexport const LoadingIndicator = (props: ILoadingIndicatorProps) => {\n const { cellLoadings, columnLoadings, coordInstance, scrollState, real2RowIndex } = props;\n\n // Deduplicate cellLoadings to prevent duplicate React keys\n // This can happen when backend returns duplicate {recordId, fieldId} entries\n const uniqueCellLoadings = useMemo(() => {\n const seen = new Set<string>();\n return cellLoadings.filter(([columnIndex, realRowIndex]) => {\n const key = `${columnIndex}-${realRowIndex}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n }, [cellLoadings]);\n\n if (!uniqueCellLoadings.length && !columnLoadings.length) return null;\n\n const { scrollLeft, scrollTop } = scrollState;\n const { rowInitSize, freezeColumnCount, freezeRegionWidth, containerWidth, containerHeight } =\n coordInstance;\n\n return (\n <div className=\"pointer-events-none absolute start-0 top-0\">\n {columnLoadings.map(({ index, progress, onCancel }) => {\n const columnWidth = coordInstance.getColumnWidth(index);\n const columnOffset = coordInstance.getColumnRelativeOffset(index, scrollLeft);\n const isFreeze = index < freezeColumnCount;\n\n const isColumnVisible =\n isFreeze ||\n (columnOffset + columnWidth - 24 >= freezeRegionWidth && columnOffset <= containerWidth);\n\n if (!isColumnVisible) return null;\n\n return (\n <div\n key={`loading-${index}`}\n className=\"absolute rounded-sm\"\n style={{\n left: columnOffset,\n top: 0,\n width: columnWidth,\n height: 24,\n }}\n >\n <div\n className=\"pointer-events-auto absolute end-1 top-1 cursor-pointer rounded-full bg-background\"\n onClick={onCancel}\n >\n <div\n className=\"absolute end-0 top-0 flex size-6 items-center justify-center rounded-full\"\n style={{\n background: `conic-gradient(currentColor ${progress * 360}deg, rgba(0,0,0,0.1) 0deg)`,\n }}\n >\n <div className=\"absolute inset-1 animate-ping rounded-full bg-foreground/15\" />\n <div className=\"flex size-5 items-center justify-center rounded-full bg-background\">\n <Square className=\"size-3\" />\n </div>\n </div>\n </div>\n </div>\n );\n })}\n\n {uniqueCellLoadings.map(([columnIndex, realRowIndex]) => {\n if (realRowIndex >= coordInstance.pureRowCount) return null;\n const rowIndex = real2RowIndex(realRowIndex);\n if (rowIndex == null) return null;\n\n const rowHeight = coordInstance.getRowHeight(rowIndex);\n const rowOffset = coordInstance.getRowOffset(rowIndex);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const columnOffset = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n\n const y = rowOffset - scrollTop;\n const isFreeze = columnIndex < freezeColumnCount;\n const isColumnVisible =\n isFreeze ||\n (columnOffset + columnWidth - 24 >= freezeRegionWidth && columnOffset <= containerWidth);\n const isRowVisible = y >= rowInitSize - 4 && y <= containerHeight - rowInitSize + 4;\n\n if (!isColumnVisible || !isRowVisible) return null;\n\n return (\n <div\n key={`loading-${columnIndex}-${realRowIndex}`}\n className=\"absolute rounded-sm\"\n style={{\n left: columnOffset,\n top: rowOffset - scrollTop,\n width: columnWidth,\n height: rowHeight,\n }}\n >\n <div className=\"absolute end-1 top-1 rounded-full bg-background\">\n <div className=\"absolute inset-1 animate-ping rounded-full bg-amber-500/30\" />\n <div className=\"absolute inset-0 animate-[spin_1.2s_linear_infinite] rounded-full border-2 border-dotted border-transparent border-t-amber-500\" />\n <div className=\"size-6 p-1\">\n <MagicAi className=\"size-4 text-amber-500\" />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","const labels: { [key: string]: string } = {\n 'aiError.title': '单元格提交失败', 'aiError.retry': '重试', 'aiError.dismiss': '关闭',\n};\nexport const useTranslation = () => ({ t: (key: string) => labels[key] ?? key });\n","/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\nimport { AlertCircle, RefreshCcw, X } from '../../../grid-adapter/icons';\nimport { Button, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../../grid-adapter/ui';\nimport { useTranslation } from '../../../grid-adapter/i18n';\nimport type { ICellError, IScrollState } from '../interface';\nimport type { CoordinateManager } from '../managers';\n\nexport interface IErrorIndicatorProps {\n cellErrors: ICellError[];\n coordInstance: CoordinateManager;\n scrollState: IScrollState;\n real2RowIndex: (index: number) => number;\n}\n\nexport const ErrorIndicator = (props: IErrorIndicatorProps) => {\n const { cellErrors, coordInstance, scrollState, real2RowIndex } = props;\n const { t } = useTranslation();\n\n if (!cellErrors.length) return null;\n\n const { scrollLeft, scrollTop } = scrollState;\n const { rowInitSize, freezeColumnCount, freezeRegionWidth, containerWidth, containerHeight } =\n coordInstance;\n\n return (\n <TooltipProvider delayDuration={100}>\n <div className=\"pointer-events-none absolute start-0 top-0\">\n {cellErrors.map(({ cellItem, errorMsg, onRetry, onDismiss }) => {\n const [columnIndex, realRowIndex] = cellItem;\n if (realRowIndex >= coordInstance.pureRowCount) return null;\n const rowIndex = real2RowIndex(realRowIndex);\n if (rowIndex == null) return null;\n const rowHeight = coordInstance.getRowHeight(rowIndex);\n const rowOffset = coordInstance.getRowOffset(rowIndex);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const columnOffset = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n\n const y = rowOffset - scrollTop;\n const isFreeze = columnIndex < freezeColumnCount;\n const isColumnVisible =\n isFreeze ||\n (columnOffset + columnWidth - 24 >= freezeRegionWidth &&\n columnOffset <= containerWidth);\n const isRowVisible = y >= rowInitSize - 4 && y <= containerHeight - rowInitSize + 4;\n\n if (!isColumnVisible || !isRowVisible) return null;\n\n const key = `error-${columnIndex}-${realRowIndex}`;\n\n return (\n <div\n key={key}\n className=\"absolute\"\n style={{\n left: columnOffset,\n top: rowOffset - scrollTop,\n width: columnWidth,\n height: rowHeight,\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"pointer-events-auto absolute end-1 top-1 cursor-pointer\">\n <div className=\"relative flex size-6 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/30\">\n <AlertCircle className=\"size-4 text-red-500\" />\n </div>\n </div>\n </TooltipTrigger>\n <TooltipContent\n side=\"bottom\"\n align=\"end\"\n className=\"pointer-events-auto max-w-[280px]\"\n >\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">{t('aiError.title')}</p>\n <p className=\"break-words text-xs text-muted-foreground\">{errorMsg}</p>\n <div className=\"flex gap-2 pt-1\">\n {onRetry && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n className=\"h-6 text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onRetry();\n }}\n >\n <RefreshCcw className=\"me-1 size-3\" />\n {t('aiError.retry')}\n </Button>\n )}\n {onDismiss && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n className=\"h-6 text-xs\"\n onClick={(e) => {\n e.stopPropagation();\n onDismiss();\n }}\n >\n <X className=\"me-1 size-3\" />\n {t('aiError.dismiss')}\n </Button>\n )}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n </div>\n );\n })}\n </div>\n </TooltipProvider>\n );\n};\n","import { inRange } from './range';\n\ninterface IScrollbarMetrics {\n track: number;\n content: number;\n offset: number;\n thickness: number;\n minThumb: number;\n}\n\n// How far around an 8px thumb a finger still grabs it\nexport const THUMB_TOUCH_SLOP = 20;\n\n// Scroll per pixel of finger travel for a touch that grabs the thumb, or null when it misses.\n// `along` is measured from the track's start, `across` from the scrollbar's outer edge.\nexport const getThumbDragRatio = (\n { track, content, offset, thickness, minThumb }: IScrollbarMetrics,\n along: number,\n across: number\n): number | null => {\n if (thickness <= 0) return null;\n const thumb = Math.min(track, Math.max(minThumb, (track * track) / content));\n const travel = track - thumb;\n if (travel <= 0) return null;\n const thumbStart = (offset / (content - track)) * travel;\n const onThumb = inRange(\n along,\n thumbStart - THUMB_TOUCH_SLOP,\n thumbStart + thumb + THUMB_TOUCH_SLOP\n );\n const nearBar = inRange(across, -THUMB_TOUCH_SLOP, thickness + THUMB_TOUCH_SLOP);\n return onThumb && nearBar ? (content - track) / travel : null;\n};\n","import { cn } from '../../grid-adapter/ui';\nimport type {\n ForwardRefRenderFunction,\n MutableRefObject,\n ReactNode,\n RefObject,\n UIEvent,\n} from 'react';\nimport { useMemo, useRef, useCallback, forwardRef, useImperativeHandle, useEffect } from 'react';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport { Scroller } from 'scroller';\nimport { useIsTouchDevice } from '../../grid-adapter/hooks';\nimport type { IGridProps } from './Grid';\nimport { getHorizontalRangeInfo, getVerticalRangeInfo, useEventListener } from './hooks';\nimport type { ILinearRow, IScrollState } from './interface';\nimport type { CoordinateManager } from './managers';\nimport type { ITimeoutID } from './utils';\nimport { getWheelDelta } from './utils';\nimport { getThumbDragRatio } from './utils/scrollbar';\nimport { cancelTimeout, requestTimeout } from './utils/utils';\n\nexport interface ScrollerProps extends Pick<\n IGridProps,\n | 'smoothScrollX'\n | 'smoothScrollY'\n | 'scrollBarVisible'\n | 'onScrollChanged'\n | 'onVisibleRegionChanged'\n> {\n coordInstance: CoordinateManager;\n containerWidth: number;\n containerHeight: number;\n scrollWidth: number;\n scrollHeight: number;\n containerRef: MutableRefObject<HTMLDivElement | null>;\n rootRef: RefObject<HTMLDivElement | null>;\n left?: number;\n top?: number;\n scrollEnable?: boolean;\n scrollState: IScrollState;\n getLinearRow: (index: number) => ILinearRow;\n setScrollState: React.Dispatch<React.SetStateAction<IScrollState>>;\n}\n\nexport interface ScrollerRef {\n scrollTo: (sl?: number, st?: number) => void;\n scrollBy: (deltaX: number, deltaY: number) => void;\n}\n\n// The vertical bar's `scrollbar-min-thumb` floor; the horizontal bar has none\nconst VERTICAL_MIN_THUMB = 32;\n\ninterface IThumbDrag {\n el: HTMLDivElement;\n pos: 'clientX' | 'clientY';\n scroll: 'scrollLeft' | 'scrollTop';\n start: number;\n origin: number;\n ratio: number;\n}\n\nconst grabThumb = (\n el: HTMLDivElement | null,\n vertical: boolean,\n touch: Touch\n): IThumbDrag | null => {\n if (!el) return null;\n // Overlay scrollbars (iOS) take no room and have no thumb to grab\n const thickness = vertical ? el.offsetWidth - el.clientWidth : el.offsetHeight - el.clientHeight;\n if (thickness <= 0) return null;\n const rect = el.getBoundingClientRect();\n const pos = vertical ? 'clientY' : 'clientX';\n const scroll = vertical ? 'scrollTop' : 'scrollLeft';\n const metrics = vertical\n ? { track: el.clientHeight, content: el.scrollHeight, minThumb: VERTICAL_MIN_THUMB }\n : { track: el.clientWidth, content: el.scrollWidth, minThumb: 0 };\n const origin = el[scroll];\n const ratio = getThumbDragRatio(\n { ...metrics, offset: origin, thickness },\n touch[pos] - (vertical ? rect.top : rect.left),\n vertical ? rect.right - touch.clientX : rect.bottom - touch.clientY\n );\n return ratio == null ? null : { el, pos, scroll, start: touch[pos], origin, ratio };\n};\n\nconst InfiniteScrollerBase: ForwardRefRenderFunction<ScrollerRef, ScrollerProps> = (props, ref) => {\n const {\n coordInstance,\n containerWidth,\n containerHeight,\n scrollWidth,\n scrollHeight,\n left = 0,\n top = 0,\n containerRef,\n rootRef,\n smoothScrollX,\n smoothScrollY,\n scrollBarVisible,\n scrollEnable = true,\n scrollState,\n getLinearRow,\n setScrollState,\n onScrollChanged,\n onVisibleRegionChanged,\n } = props;\n\n useImperativeHandle(ref, () => ({\n scrollTo: (sl?: number, st?: number) => {\n if (horizontalScrollRef.current && sl != null) {\n horizontalScrollRef.current.scrollLeft = sl;\n }\n if (verticalScrollRef.current && st != null) {\n const el = verticalScrollRef.current;\n const scrollableHeight = el.scrollHeight - el.clientHeight;\n let virtaulOffsetY = 0;\n if (scrollableHeight > 0 && scrollHeight > el.scrollHeight + 5) {\n const prog = st / (scrollHeight - el.clientHeight);\n const actualScrollTop = scrollableHeight * prog;\n virtaulOffsetY = actualScrollTop - st;\n }\n verticalScrollRef.current.scrollTop = st + virtaulOffsetY;\n }\n },\n scrollBy: (deltaX: number, deltaY: number) => {\n horizontalScrollRef.current?.scrollBy(deltaX, 0);\n verticalScrollRef.current?.scrollBy(0, deltaY);\n },\n }));\n\n const isTouchDevice = useIsTouchDevice();\n\n const scrollerRef = useRef<Scroller | null>(null);\n const horizontalScrollRef = useRef<HTMLDivElement | null>(null);\n const verticalScrollRef = useRef<HTMLDivElement | null>(null);\n const resetScrollingTimeoutID = useRef<ITimeoutID | null>(null);\n const offsetY = useRef(0);\n const lastScrollTop = useRef(0);\n const thumbDrag = useRef<IThumbDrag | null>(null);\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n const onScroll = (e: UIEvent<HTMLDivElement>, direction: 'horizontal' | 'vertical') => {\n if (!verticalScrollRef.current || !horizontalScrollRef.current) {\n return;\n }\n const el = e.target as HTMLElement;\n const { scrollTop: newScrollTop, scrollLeft } = el;\n const { rowInitSize, columnInitSize } = coordInstance;\n\n let scrollProps: { [key: string]: number } = {};\n\n if (direction === 'vertical') {\n const delta = lastScrollTop.current - newScrollTop;\n const scrollableHeight = el.scrollHeight - el.clientHeight;\n lastScrollTop.current = newScrollTop;\n\n if (\n scrollableHeight > 0 &&\n (Math.abs(delta) > 2000 || newScrollTop === 0 || newScrollTop === scrollableHeight) &&\n scrollHeight > el.scrollHeight + 5\n ) {\n const prog = newScrollTop / scrollableHeight;\n const recomputed = (scrollHeight - el.clientHeight) * prog;\n offsetY.current = recomputed - newScrollTop;\n }\n const scrollTop = newScrollTop + offsetY.current;\n const rowIndex = coordInstance.getRowStartIndex(scrollTop);\n const rowOffset = coordInstance.getRowOffset(rowIndex);\n\n scrollProps = {\n scrollTop: !smoothScrollY ? rowOffset - rowInitSize : scrollTop,\n };\n }\n\n if (direction === 'horizontal') {\n const colIndex = coordInstance.getColumnStartIndex(scrollLeft);\n const colOffset = coordInstance.getColumnOffset(colIndex);\n scrollProps = {\n scrollLeft: !smoothScrollX ? colOffset - columnInitSize : scrollLeft,\n };\n }\n\n const { startRowIndex, stopRowIndex } = getVerticalRangeInfo(\n coordInstance,\n scrollProps.scrollTop ?? scrollState.scrollTop\n );\n const { startColumnIndex, stopColumnIndex } = getHorizontalRangeInfo(\n coordInstance,\n scrollProps.scrollLeft ?? scrollState.scrollLeft\n );\n\n const realStartRowIndex = getLinearRow(startRowIndex).realIndex;\n const realStopRowIndex = getLinearRow(stopRowIndex).realIndex;\n\n onVisibleRegionChanged?.({\n x: startColumnIndex,\n y: realStartRowIndex,\n width: stopColumnIndex - startColumnIndex,\n height: realStopRowIndex - realStartRowIndex,\n });\n onScrollChanged?.(\n scrollProps.scrollLeft ?? scrollState.scrollLeft,\n scrollProps.scrollTop ?? scrollState.scrollTop\n );\n\n setScrollState((prev) => {\n return {\n ...prev,\n ...scrollProps,\n isScrolling: true,\n };\n });\n resetScrollingDebounced();\n };\n\n const resetScrolling = useCallback(() => {\n setScrollState((prev) => ({ ...prev, isScrolling: false }));\n resetScrollingTimeoutID.current = null;\n }, [setScrollState]);\n\n const resetScrollingDebounced = useCallback(() => {\n if (resetScrollingTimeoutID.current !== null) {\n cancelTimeout(resetScrollingTimeoutID.current);\n }\n resetScrollingTimeoutID.current = requestTimeout(resetScrolling, 200);\n }, [resetScrolling]);\n\n const scrollHandler = useCallback((deltaX: number, deltaY: number) => {\n if (horizontalScrollRef.current) {\n horizontalScrollRef.current.scrollLeft = horizontalScrollRef.current.scrollLeft + deltaX;\n }\n if (verticalScrollRef.current) {\n const realDeltaY = deltaY;\n verticalScrollRef.current.scrollTop = verticalScrollRef.current.scrollTop + realDeltaY;\n }\n }, []);\n\n const mobileScrollHandler = useCallback((scrollLeft: number, scrollTop: number) => {\n if (horizontalScrollRef.current) {\n horizontalScrollRef.current.scrollLeft = scrollLeft;\n }\n if (verticalScrollRef.current) {\n verticalScrollRef.current.scrollTop = scrollTop;\n }\n }, []);\n\n const onWheel = useCallback(\n (event: Event) => {\n if (!scrollEnable) return;\n event.preventDefault();\n const [fixedDeltaX, fixedDeltaY] = getWheelDelta({\n event: event as WheelEvent,\n pageHeight: coordInstance.containerHeight - coordInstance.rowInitSize - 1,\n lineHeight: coordInstance.rowHeight,\n });\n scrollHandler(fixedDeltaX, fixedDeltaY);\n },\n [scrollEnable, scrollHandler, coordInstance]\n );\n\n const onTouchStart = useCallback((e: TouchEvent) => {\n if (scrollerRef.current) {\n scrollerRef.current.doTouchStart(e.changedTouches, e.timeStamp);\n }\n }, []);\n\n const onTouchMove = useCallback((e: TouchEvent) => {\n e.preventDefault();\n if (scrollerRef.current) {\n scrollerRef.current.doTouchMove(e.changedTouches, e.timeStamp);\n }\n }, []);\n\n const syncScroller = useCallback(() => {\n if (horizontalScrollRef.current && verticalScrollRef.current) {\n scrollerRef.current?.scrollTo(\n horizontalScrollRef.current.scrollLeft,\n verticalScrollRef.current.scrollTop\n );\n }\n }, []);\n\n const onTouchEnd = useCallback(\n (e: TouchEvent) => {\n if (scrollerRef.current) {\n syncScroller();\n scrollerRef.current.doTouchEnd(e.timeStamp);\n }\n },\n [syncScroller]\n );\n\n // A finger rarely lands on an 8px scrollbar: on touch, a touch near a thumb drags it, ahead of\n // the canvas's own panning; anywhere else the grid's touch handling is untouched.\n const onThumbTouchStart = useCallback(\n (e: TouchEvent) => {\n if (!scrollBarVisible || e.touches.length !== 1) return;\n const touch = e.touches[0];\n const drag =\n grabThumb(verticalScrollRef.current, true, touch) ??\n grabThumb(horizontalScrollRef.current, false, touch);\n if (!drag) return;\n thumbDrag.current = drag;\n // Halts a fling still gliding: the canvas never sees this touch to stop it\n syncScroller();\n e.preventDefault();\n e.stopPropagation();\n },\n [scrollBarVisible, syncScroller]\n );\n\n const onThumbTouchMove = useCallback((e: TouchEvent) => {\n const drag = thumbDrag.current;\n if (!drag) return;\n e.preventDefault();\n e.stopPropagation();\n drag.el[drag.scroll] = drag.origin + (e.touches[0][drag.pos] - drag.start) * drag.ratio;\n }, []);\n\n // The canvas's own panning starts from where the thumb left the grid, not from before the drag\n const onThumbTouchEnd = useCallback(\n (e: TouchEvent) => {\n if (!thumbDrag.current) return;\n thumbDrag.current = null;\n e.stopPropagation();\n syncScroller();\n },\n [syncScroller]\n );\n\n useEffect(() => {\n if (!isTouchDevice) return;\n\n const options = {\n scrollingX: true,\n scrollingY: true,\n animationDuration: 200,\n };\n\n scrollerRef.current = new Scroller(mobileScrollHandler, options);\n }, [mobileScrollHandler, isTouchDevice]);\n\n useEffect(() => {\n if (scrollerRef.current) {\n scrollTo({});\n scrollerRef.current.setDimensions(containerWidth, containerHeight, scrollWidth, scrollHeight);\n }\n }, [containerHeight, containerWidth, scrollWidth, scrollHeight]);\n\n const placeholderElements: ReactNode[] = useMemo(() => {\n let h = 0;\n let key = 0;\n const res = [];\n\n while (h < scrollHeight) {\n const curH = Math.min(5000000, scrollHeight - h);\n res.push(<div key={key++} style={{ width: 0, height: curH }} />);\n h += curH;\n }\n return res;\n }, [scrollHeight]);\n\n useEventListener('wheel', onWheel, containerRef.current, false);\n useEventListener('touchstart', onTouchStart, containerRef.current, false);\n useEventListener('touchmove', onTouchMove, containerRef.current, false);\n useEventListener('touchend', onTouchEnd, containerRef.current, false);\n\n const gridRoot = isTouchDevice ? rootRef.current : null;\n useEventListener('touchstart', onThumbTouchStart, gridRoot, false, true);\n useEventListener('touchmove', onThumbTouchMove, gridRoot, false, true);\n useEventListener('touchend', onThumbTouchEnd, gridRoot, false, true);\n useEventListener('touchcancel', onThumbTouchEnd, gridRoot, false, true);\n\n // The track margins keep each thumb half the grid card's 8px corner radius from its ends, so a\n // rounded corner never cuts it.\n return (\n <>\n <div\n ref={horizontalScrollRef}\n className={cn(\n 'scrollbar scrollbar-thumb-foreground/35 hover:scrollbar-thumb-foreground/50 scrollbar-thumb-rounded-md scrollbar-h-2 [&::-webkit-scrollbar-track]:mx-1 absolute bottom-[2px] start-0 h-4 cursor-pointer overflow-y-hidden overflow-x-scroll will-change-transform',\n !scrollBarVisible && 'opacity-0 pointer-events-none'\n )}\n style={{\n left,\n width: containerWidth - left,\n }}\n onScroll={(e) => onScroll(e, 'horizontal')}\n >\n <div\n className=\"absolute\"\n style={{\n width: scrollWidth,\n height: 1,\n }}\n />\n </div>\n <div\n ref={verticalScrollRef}\n className={cn(\n 'scrollbar scrollbar-thumb-foreground/35 hover:scrollbar-thumb-foreground/50 scrollbar-thumb-rounded-md scrollbar-w-2 scrollbar-min-thumb [&::-webkit-scrollbar-track]:my-1 absolute end-[2px] w-4 cursor-pointer overflow-x-hidden overflow-y-scroll will-change-transform',\n !scrollBarVisible && 'opacity-0 pointer-events-none'\n )}\n style={{\n top,\n height: containerHeight - top,\n }}\n onScroll={(e) => onScroll(e, 'vertical')}\n >\n <div className=\"flex w-px shrink-0 flex-col\">{placeholderElements}</div>\n </div>\n </>\n );\n};\n\nexport const InfiniteScroller = forwardRef(InfiniteScrollerBase);\n","import type { ForwardRefRenderFunction, MutableRefObject, ReactNode, UIEvent } from 'react';\nimport { useMemo, useRef, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport { GRID_DEFAULT } from './configs';\nimport { useEventListener } from './hooks';\nimport type { IActiveCellBound } from './interface';\nimport { getWheelDelta } from './utils/utils';\n\nexport interface CellScrollerProps {\n containerRef: MutableRefObject<HTMLDivElement | null>;\n style?: React.CSSProperties;\n scrollEnable?: boolean;\n activeCellBound: IActiveCellBound;\n setCellScrollTop: React.Dispatch<React.SetStateAction<number>>;\n}\n\nexport interface CellScrollerRef {\n reset: () => void;\n}\n\nconst { cellScrollBarPaddingY } = GRID_DEFAULT;\n\nconst CellScrollerBase: ForwardRefRenderFunction<CellScrollerRef, CellScrollerProps> = (\n props,\n ref\n) => {\n const { containerRef, style, scrollEnable, activeCellBound, setCellScrollTop } = props;\n const { height: containerHeight, totalHeight: scrollHeight } = activeCellBound;\n\n const verticalScrollRef = useRef<HTMLDivElement | null>(null);\n const offsetY = useRef(0);\n const lastScrollTop = useRef(0);\n\n useImperativeHandle(ref, () => ({\n reset: () => {\n if (verticalScrollRef.current) {\n verticalScrollRef.current.scrollTop = 0;\n setCellScrollTop(0);\n }\n },\n }));\n\n const onScroll = (e: UIEvent<HTMLDivElement>) => {\n if (!verticalScrollRef.current) return;\n\n const el = e.target as HTMLElement;\n const { scrollTop: newScrollTop } = el;\n const delta = lastScrollTop.current - newScrollTop;\n const scrollableHeight = el.scrollHeight - el.clientHeight;\n lastScrollTop.current = newScrollTop;\n\n if (\n scrollableHeight > 0 &&\n (Math.abs(delta) > 2000 || newScrollTop === 0 || newScrollTop === scrollableHeight) &&\n scrollHeight > el.scrollHeight + 5\n ) {\n const prog = newScrollTop / scrollableHeight;\n const recomputed = (scrollHeight - el.clientHeight) * prog;\n offsetY.current = recomputed - newScrollTop;\n }\n const scrollTop = newScrollTop + offsetY.current;\n\n setCellScrollTop(scrollTop);\n };\n\n const scrollHandler = useCallback((deltaY: number) => {\n if (verticalScrollRef.current) {\n const realDeltaY = deltaY;\n verticalScrollRef.current.scrollTop = verticalScrollRef.current.scrollTop + realDeltaY;\n }\n }, []);\n\n const onWheel = useCallback(\n (event: Event) => {\n if (!scrollEnable) return;\n event.preventDefault();\n const [, fixedDeltaY] = getWheelDelta({\n event: event as WheelEvent,\n });\n scrollHandler(fixedDeltaY);\n },\n [scrollEnable, scrollHandler]\n );\n\n const placeholderElements: ReactNode[] = useMemo(() => {\n let h = 0;\n let key = 0;\n const res = [];\n\n while (h < scrollHeight) {\n const curH = Math.min(5000000, scrollHeight - h);\n res.push(<div key={key++} style={{ width: 0, height: curH }} />);\n h += curH;\n }\n return res;\n }, [scrollHeight]);\n\n useEventListener('wheel', onWheel, containerRef.current, false);\n\n return (\n <div\n ref={verticalScrollRef}\n className=\"scrollbar scrollbar-thumb-rounded-sm scrollbar-w-2 absolute w-[10px] cursor-pointer overflow-x-hidden overflow-y-scroll opacity-0 will-change-transform\"\n style={{\n ...style,\n height: containerHeight - cellScrollBarPaddingY * 2,\n }}\n onScroll={onScroll}\n >\n <div className=\"flex shrink-0 flex-col\">{placeholderElements}</div>\n </div>\n );\n};\n\nexport const CellScroller = forwardRef(CellScrollerBase);\n","import type { FC } from 'react';\nimport { useRef, useLayoutEffect, useMemo } from 'react';\nimport type { IVisibleRegion } from './hooks';\nimport type { IInteractionLayerProps } from './InteractionLayer';\nimport { RegionType } from './interface';\nimport type {\n ILinearRow,\n ICellItem,\n IPosition,\n IDragState,\n IMouseState,\n IColumnResizeState,\n ICellPosition,\n IActiveCellBound,\n IColumnFreezeState,\n} from './interface';\nimport type { CombinedSelection } from './managers';\nimport { drawGrid } from './renderers';\n\nexport interface IRenderLayerProps extends Pick<\n IInteractionLayerProps,\n | 'theme'\n | 'width'\n | 'height'\n | 'columns'\n | 'commentCountMap'\n | 'rowControls'\n | 'rowControlPaddingX'\n | 'imageManager'\n | 'spriteManager'\n | 'scrollState'\n | 'coordInstance'\n | 'columnStatistics'\n | 'groupCollection'\n | 'rowIndexVisible'\n | 'searchCursor'\n | 'searchHitIndex'\n | 'highlightedRowIndex'\n | 'collaborators'\n | 'columnHeaderHeight'\n | 'isMultiSelectionEnable'\n | 'getCellContent'\n> {\n isEditing?: boolean;\n isFilling?: boolean;\n isFillEnabled?: boolean;\n visibleRegion: IVisibleRegion;\n activeCell: ICellItem | null;\n activeCellBound: IActiveCellBound | null;\n dragState: IDragState;\n mouseState: IMouseState;\n columnFreezeState: IColumnFreezeState;\n selection: CombinedSelection;\n isSelecting: boolean;\n isInteracting?: boolean;\n forceRenderFlag: string;\n hoverCellPosition: ICellPosition | null;\n hoveredColumnResizeIndex: number;\n columnResizeState: IColumnResizeState;\n isColumnFreezable?: boolean;\n isRowAppendEnable?: boolean;\n isColumnResizable?: boolean;\n isColumnAppendEnable?: boolean;\n isColumnHeaderMenuVisible?: boolean;\n real2RowIndex: (index: number) => number;\n getLinearRow: (index: number) => ILinearRow;\n}\n\nexport const RenderLayer: FC<React.PropsWithChildren<IRenderLayerProps>> = (props) => {\n const {\n theme,\n width,\n height,\n columns,\n commentCountMap,\n isEditing,\n rowControls,\n rowControlPaddingX,\n visibleRegion,\n imageManager,\n spriteManager,\n activeCell,\n activeCellBound,\n collaborators,\n searchCursor,\n searchHitIndex,\n highlightedRowIndex,\n dragState,\n scrollState,\n columnFreezeState,\n hoverCellPosition,\n mouseState: originMouseState,\n selection,\n isSelecting,\n isInteracting: _isInteracting,\n coordInstance,\n forceRenderFlag,\n groupCollection,\n rowIndexVisible,\n columnStatistics,\n columnResizeState,\n columnHeaderHeight,\n hoveredColumnResizeIndex,\n isColumnFreezable,\n isRowAppendEnable,\n isColumnResizable,\n isColumnAppendEnable,\n isMultiSelectionEnable,\n isColumnHeaderMenuVisible,\n getCellContent,\n real2RowIndex,\n getLinearRow,\n isFilling,\n isFillEnabled,\n } = props;\n const { containerWidth } = coordInstance;\n const { x, y, columnIndex, rowIndex, type, isOutOfBounds } = originMouseState;\n const isInteracting = _isInteracting || type === RegionType.ColumnFreezeHandler;\n\n const mainCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const lastPropsRef = useRef<IRenderLayerProps>(undefined);\n\n const cacheCanvas = useMemo(() => {\n const canvas = document.createElement('canvas');\n canvas.style.opacity = '0';\n canvas.style.position = 'fixed';\n return canvas;\n }, []);\n\n const mouseState: IMouseState = useMemo(() => {\n return {\n type,\n rowIndex,\n columnIndex,\n isOutOfBounds,\n x: 0,\n y: 0,\n };\n }, [columnIndex, rowIndex, type, isOutOfBounds]);\n\n const mousePosition: IPosition | null = useMemo(() => {\n if (!isInteracting) return null;\n return { x, y };\n }, [x, y, isInteracting]);\n\n // Draw before paint so the canvas always matches the DOM overlays (editor, selection) of\n // the same commit. A passive effect can let one frame show a hidden editor's stale cell.\n useLayoutEffect(() => {\n const mainCanvas = mainCanvasRef.current;\n if (mainCanvas == null) return;\n const lastProps = lastPropsRef.current;\n const props = {\n theme,\n width,\n height,\n columns,\n commentCountMap,\n isEditing,\n rowControls,\n rowControlPaddingX,\n visibleRegion,\n imageManager,\n spriteManager,\n activeCell,\n activeCellBound,\n collaborators,\n searchCursor,\n searchHitIndex,\n highlightedRowIndex,\n dragState,\n scrollState,\n columnFreezeState,\n hoverCellPosition,\n mouseState: mousePosition ? { ...mouseState, ...mousePosition } : mouseState,\n selection,\n isFilling,\n isFillEnabled,\n isSelecting,\n isInteracting,\n coordInstance,\n forceRenderFlag,\n groupCollection,\n rowIndexVisible,\n columnStatistics,\n columnResizeState,\n columnHeaderHeight,\n hoveredColumnResizeIndex,\n isColumnFreezable,\n isRowAppendEnable,\n isColumnResizable,\n isColumnAppendEnable,\n isColumnHeaderMenuVisible,\n isMultiSelectionEnable,\n getCellContent,\n real2RowIndex,\n getLinearRow,\n };\n lastPropsRef.current = props;\n drawGrid(mainCanvas, cacheCanvas, props, lastProps);\n }, [\n theme,\n width,\n height,\n columns,\n commentCountMap,\n isEditing,\n rowControls,\n rowControlPaddingX,\n visibleRegion,\n imageManager,\n spriteManager,\n activeCell,\n activeCellBound,\n collaborators,\n searchCursor,\n searchHitIndex,\n highlightedRowIndex,\n dragState,\n mouseState,\n scrollState,\n columnFreezeState,\n mousePosition,\n selection,\n isFilling,\n isFillEnabled,\n isSelecting,\n isInteracting,\n coordInstance,\n forceRenderFlag,\n groupCollection,\n rowIndexVisible,\n columnStatistics,\n columnResizeState,\n columnHeaderHeight,\n hoverCellPosition,\n hoveredColumnResizeIndex,\n isColumnFreezable,\n isRowAppendEnable,\n isColumnResizable,\n isColumnAppendEnable,\n isColumnHeaderMenuVisible,\n isMultiSelectionEnable,\n cacheCanvas,\n getCellContent,\n real2RowIndex,\n getLinearRow,\n ]);\n\n return (\n <canvas\n ref={mainCanvasRef}\n className=\"pointer-events-none\"\n style={{\n width: containerWidth,\n height,\n backgroundColor: theme.cellBg,\n }}\n />\n );\n};\n","/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\nimport { isEqual } from 'lodash';\nimport type { Dispatch, ForwardRefRenderFunction, RefObject, SetStateAction } from 'react';\nimport {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n useMemo,\n useLayoutEffect,\n} from 'react';\nimport { useMouse } from 'react-use';\nimport type { CellScrollerRef } from './CellScroller';\nimport { CellScroller } from './CellScroller';\nimport type { IEditorContainerRef } from './components';\nimport { EditorContainer } from './components';\nimport type { IGridTheme } from './configs';\n\nimport {\n GRID_DEFAULT,\n DEFAULT_MOUSE_STATE,\n DEFAULT_DRAG_STATE,\n DEFAULT_COLUMN_RESIZE_STATE,\n} from './configs';\nimport type { IGridProps } from './Grid';\nimport {\n useSelection,\n useAutoScroll,\n useColumnResize,\n useColumnFreeze,\n useEventListener,\n} from './hooks';\nimport { useDrag } from './hooks/useDrag';\nimport { useVisibleRegion } from './hooks/useVisibleRegion';\nimport type {\n IActiveCellBound,\n ICellItem,\n ICellPosition,\n ICellRegionWithData,\n IInnerCell,\n ILinearRow,\n IMouseState,\n IRectangle,\n IRowControlItem,\n IScrollState,\n IRange,\n} from './interface';\nimport {\n RegionType,\n LinearRowType,\n DragRegionType,\n MouseButtonType,\n SelectionRegionType,\n DraggableType,\n SelectableType,\n} from './interface';\nimport type { CoordinateManager, ImageManager, SpriteManager, CombinedSelection } from './managers';\nimport type { IBaseCellRenderer, ICell } from './renderers';\nimport { CellRegionType, CellType, getCellRenderer } from './renderers';\nimport { RenderLayer } from './RenderLayer';\nimport type { IRegionData } from './utils';\nimport { BLANK_REGION_DATA, flatRanges, getRegionData, inRange } from './utils';\n\nconst { columnAppendBtnWidth, columnHeadHeight } = GRID_DEFAULT;\n\nexport interface IInteractionLayerProps extends Omit<\n IGridProps,\n | 'freezeColumnCount'\n | 'rowCount'\n | 'rowHeight'\n | 'style'\n | 'smoothScrollX'\n | 'smoothScrollY'\n | 'onVisibleRegionChanged'\n> {\n theme: IGridTheme;\n width: number;\n height: number;\n forceRenderFlag: string;\n rowControls: IRowControlItem[];\n mouseState: IMouseState;\n scrollState: IScrollState;\n imageManager: ImageManager;\n spriteManager: SpriteManager;\n coordInstance: CoordinateManager;\n activeCell: ICellItem | null;\n activeCellBound: IActiveCellBound | null;\n real2RowIndex: (index: number) => number;\n getLinearRow: (index: number) => ILinearRow;\n setActiveCell: Dispatch<SetStateAction<ICellItem | null>>;\n setMouseState: Dispatch<SetStateAction<IMouseState>>;\n scrollBy: (deltaX: number, deltaY: number) => void;\n scrollToItem: (position: [columnIndex: number, rowIndex: number]) => void;\n onFillSelection?: (selectionRanges: [IRange, IRange], targetEndRealRowIndex: number) => void;\n}\n\nexport interface IInteractionLayerRef {\n isEditing: () => boolean;\n resetState: () => void;\n setSelection: (selection: CombinedSelection) => void;\n}\n\n// Renderers may opt into hover-position tracking per cell, so only cells with\n// clickable parts (e.g. text containing links) trigger repaints on mouse move\nconst needsHoverPositionFor = (\n renderer: Pick<IBaseCellRenderer<never>, 'needsHoverPosition'>,\n cell: ICell\n) => {\n const { needsHoverPosition } = renderer;\n return typeof needsHoverPosition === 'function'\n ? needsHoverPosition(cell as never)\n : Boolean(needsHoverPosition);\n};\n\nexport const InteractionLayerBase: ForwardRefRenderFunction<\n IInteractionLayerRef,\n IInteractionLayerProps\n> = (props, ref) => {\n const {\n theme,\n width,\n height,\n columns,\n commentCountMap,\n draggable,\n selectable,\n rowControls,\n rowControlPaddingX,\n mouseState,\n scrollState,\n imageManager,\n spriteManager,\n coordInstance,\n columnStatistics,\n forceRenderFlag,\n rowIndexVisible,\n disableEnterMoveDown,\n groupCollection,\n isMultiSelectionEnable,\n activeCellBound: _activeCellBound,\n columnHeaderHeight,\n collapsedGroupIds,\n collaborators,\n isRowClickSelectionEnabled,\n searchCursor,\n searchHitIndex,\n highlightedRowIndex,\n activeCell,\n getLinearRow,\n real2RowIndex,\n setActiveCell,\n setMouseState,\n scrollToItem,\n scrollBy,\n getCellContent,\n onUndo,\n onRedo,\n onCopy,\n onPaste,\n onDelete,\n onRowAppend,\n onRowExpand,\n onRowOrdered,\n onCellEdited,\n onCellDblClick,\n onSelectionChanged,\n onColumnFreeze,\n onColumnFreezeFailed,\n onColumnAppend,\n onColumnResize,\n onColumnOrdered,\n onContextMenu,\n onGroupHeaderContextMenu,\n onItemHovered,\n onItemClick,\n onColumnHeaderClick,\n onColumnHeaderDblClick,\n onColumnHeaderMenuClick,\n onColumnStatisticClick,\n onCollapsedGroupChanged,\n onFillSelection,\n onRowControlClick,\n onRowRangeSelected,\n onDragStart: _onDragStart,\n } = props;\n\n useImperativeHandle(ref, () => ({\n isEditing: () => isEditing,\n resetState,\n setSelection: (selection: CombinedSelection) => {\n const { type, ranges } = selection;\n\n switch (type) {\n case SelectionRegionType.Cells: {\n const activeCell = ranges[0];\n setActiveCell(activeCell);\n scrollToItem(activeCell);\n break;\n }\n case SelectionRegionType.Columns: {\n const activeCell = [ranges[0][0], 0] as ICellItem;\n setActiveCell(activeCell);\n scrollToItem(activeCell);\n break;\n }\n default: {\n setActiveCell(null);\n break;\n }\n }\n setSelection(selection);\n },\n }));\n\n const stageRef = useRef<HTMLDivElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const editorContainerRef = useRef<IEditorContainerRef>(null);\n const cellScrollerRef = useRef<CellScrollerRef | null>(null);\n const prevActiveCellRef = useRef<ICellItem | null>(null);\n const hoveredRegionRef = useRef<IRegionData>(BLANK_REGION_DATA);\n const previousHoveredRegionRef = useRef<IRegionData>(BLANK_REGION_DATA);\n const isFillingRef = useRef(false);\n const fillSelectionRef = useRef<CombinedSelection | null>(null);\n\n // react-use types the ref as non-nullable while React 19 useRef(null) yields RefObject<T | null>\n const mousePosition = useMouse(stageRef as RefObject<Element>);\n const [cellScrollTop, setCellScrollTop] = useState(0);\n const [hoverCellPosition, setHoverCellPosition] = useState<ICellPosition | null>(null);\n const [cursor, setCursor] = useState('default');\n const [isEditing, setEditing] = useState(false);\n\n const { containerHeight, freezeColumnCount } = coordInstance;\n const { scrollTop, scrollLeft, isScrolling } = scrollState;\n const { type: regionType } = mouseState;\n const isRowAppendEnable = onRowAppend != null;\n const isColumnFreezable = onColumnFreeze != null;\n const isColumnResizable = onColumnResize != null;\n const isColumnAppendEnable = onColumnAppend != null;\n const isColumnHeaderMenuVisible = onColumnHeaderMenuClick != null;\n\n const visibleRegion = useVisibleRegion(coordInstance, scrollState, forceRenderFlag);\n const {\n columnResizeState,\n hoveredColumnResizeIndex,\n setHoveredColumnResizeIndex,\n setColumnResizeState,\n onColumnResizeStart,\n onColumnResizeChange,\n onColumnResizeEnd,\n } = useColumnResize(coordInstance, scrollState);\n const {\n selection,\n isSelecting,\n setSelection,\n onSelectionStart,\n onSelectionChange,\n onSelectionEnd,\n onSelectionClick,\n onSelectionContextMenu,\n } = useSelection({\n selectable,\n coordInstance,\n isMultiSelectionEnable,\n isRowClickSelectionEnabled,\n getLinearRow,\n setActiveCell,\n onSelectionChanged,\n onRowControlClick,\n onRowRangeSelected,\n });\n const { dragState, setDragState, onDragStart, onDragChange, onDragEnd } = useDrag(\n coordInstance,\n scrollState,\n selection,\n draggable\n );\n const { columnFreezeState, onColumnFreezeStart, onColumnFreezeMove, onColumnFreezeEnd } =\n useColumnFreeze(coordInstance, scrollState);\n\n const { isDragging, type: dragType } = dragState;\n const { isFreezing } = columnFreezeState;\n const isResizing = columnResizeState.columnIndex > -1;\n const { isCellSelection, ranges: selectionRanges } = selection;\n const isInteracting = isSelecting || isDragging || isResizing || isFreezing;\n const [activeColumnIndex, activeRowIndex] = activeCell ?? [];\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n const getPosition = (point?: { x: number; y: number }) => {\n const x = point?.x ?? mousePosition.elX;\n const y = point?.y ?? mousePosition.elY;\n const { freezeRegionWidth, totalWidth, rowInitSize, columnInitSize, columnCount } =\n coordInstance;\n const rowIndex =\n y < 0 ? -Infinity : y <= rowInitSize ? -1 : coordInstance.getRowStartIndex(scrollTop + y);\n const columnIndex =\n x < 0\n ? -Infinity\n : scrollLeft + x > totalWidth && scrollLeft + x < totalWidth + columnAppendBtnWidth\n ? -2\n : x <= freezeRegionWidth\n ? x <= columnInitSize\n ? -1\n : coordInstance.getColumnStartIndex(x)\n : coordInstance.getColumnStartIndex(scrollLeft + x);\n\n return { x, y, rowIndex, columnIndex: Math.min(columnIndex, columnCount - 1) };\n };\n\n const getHoverCellPosition = (mouseState: IMouseState) => {\n const { rowIndex, columnIndex, x, y } = mouseState;\n const { realIndex, type } = getLinearRow(rowIndex);\n const isCellRange = columnIndex > -1 && type === LinearRowType.Row;\n\n if (isCellRange) {\n const cell = getCellContent([columnIndex, realIndex]);\n const cellRenderer = getCellRenderer(cell.type);\n\n if (\n needsHoverPositionFor(cellRenderer, cell) ||\n (cellRenderer.needsHoverPositionWhenActive &&\n activeCell &&\n isEqual(activeCell, [columnIndex, realIndex]))\n ) {\n const offsetX = coordInstance.getColumnOffset(columnIndex);\n return [\n columnIndex < freezeColumnCount ? x - offsetX : x - offsetX + scrollLeft,\n y - coordInstance.getRowOffset(rowIndex) + scrollTop,\n ] as ICellPosition;\n }\n }\n return null;\n };\n\n const { onAutoScroll, onAutoScrollStop } = useAutoScroll({\n coordInstance,\n scrollBy,\n });\n\n const activeCellBound = useMemo(() => {\n if (_activeCellBound == null) return null;\n return {\n ..._activeCellBound,\n scrollTop: _activeCellBound.scrollEnable ? cellScrollTop : 0,\n };\n }, [_activeCellBound, cellScrollTop]);\n\n const getMouseState = (point?: { x: number; y: number }) => {\n const position = getPosition(point);\n const { x, y } = position;\n const { totalHeight, totalWidth } = coordInstance;\n const isOutOfBounds =\n scrollLeft + x > totalWidth + columnAppendBtnWidth ||\n (scrollTop + y > totalHeight && !inRange(y, containerHeight, height));\n const regionData = getRegionData({\n position,\n dragState,\n selection,\n isSelecting,\n columnResizeState,\n columnStatistics,\n coordInstance,\n scrollState,\n rowControls,\n rowControlPaddingX,\n isFreezing,\n isOutOfBounds,\n isColumnResizable,\n isColumnAppendEnable,\n isMultiSelectionEnable,\n isColumnHeaderMenuVisible,\n isColumnFreezable,\n activeCellBound,\n activeCell,\n columns,\n height,\n theme,\n getLinearRow,\n real2RowIndex,\n isFillEnabled: onFillSelection != null,\n });\n\n hoveredRegionRef.current = regionData;\n const { x: _x, y: _y, width: _w, height: _h, ...rest } = regionData;\n\n return {\n ...position,\n isOutOfBounds,\n ...rest,\n };\n };\n\n const setCursorStyle = (regionType: RegionType) => {\n if (isScrolling) return;\n if (isFreezing) return setCursor('grab');\n if (isDragging) return setCursor('grabbing');\n\n switch (regionType) {\n case RegionType.AppendRow: {\n if (activeCell != null) return;\n return setCursor('pointer');\n }\n case RegionType.AppendColumn:\n case RegionType.GroupStatistic:\n case RegionType.ColumnStatistic:\n case RegionType.ColumnHeaderMenu:\n case RegionType.ColumnDescription:\n case RegionType.ColumnPrimaryIcon:\n case RegionType.RowGroupControl:\n case RegionType.RowHeaderExpandHandler:\n return setCursor('pointer');\n case RegionType.ColumnFreezeHandler:\n return setCursor('grab');\n case RegionType.AllCheckbox:\n case RegionType.RowHeaderCheckbox: {\n if (\n [SelectableType.None, SelectableType.Column, SelectableType.Cell].includes(\n selectable as SelectableType\n )\n ) {\n return setCursor('not-allowed');\n }\n return setCursor('pointer');\n }\n case RegionType.RowHeaderDragHandler: {\n if (draggable === DraggableType.Column || draggable === DraggableType.None) {\n return setCursor('not-allowed');\n }\n return setCursor('grabbing');\n }\n case RegionType.ColumnResizeHandler:\n return setCursor('ew-resize');\n case RegionType.FillHandler:\n return setCursor('crosshair');\n default:\n setCursor('default');\n }\n };\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n const onClick = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const bounds = event.currentTarget.getBoundingClientRect();\n const mouseState = getMouseState({\n x: event.clientX - bounds.left,\n y: event.clientY - bounds.top,\n });\n onSelectionClick(event, mouseState);\n const { type, rowIndex: hoverRowIndex, columnIndex } = mouseState;\n const isCellRegion = type === RegionType.Cell || type === RegionType.ActiveCell;\n const wasCellRegion = regionType === RegionType.Cell || regionType === RegionType.ActiveCell;\n // A held click selects the cell before mouseup, so the click sees ActiveCell while the\n // last committed mouse region is still Cell. Rating and checkbox icons must apply anyway.\n const selectionCaughtUp = isCellRegion && wasCellRegion && regionType !== type;\n if (regionType !== type && !selectionCaughtUp) return;\n\n const { realIndex: rowIndex } = getLinearRow(hoverRowIndex);\n\n switch (type) {\n case RegionType.AppendRow: {\n if (activeCell != null) {\n setSelection(selection.reset());\n return setActiveCell(null);\n }\n const linearRow = getLinearRow(hoverRowIndex - 1);\n onRowAppend?.(linearRow.realIndex);\n return;\n }\n case RegionType.AppendColumn:\n return onColumnAppend?.();\n case RegionType.RowHeaderExpandHandler:\n return onRowExpand?.(rowIndex);\n case RegionType.ColumnIcon:\n case RegionType.ColumnHeader:\n return onColumnHeaderClick?.(columnIndex, {\n x: coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft),\n y: 0,\n width: coordInstance.getColumnWidth(columnIndex),\n height: columnHeadHeight,\n });\n case RegionType.ColumnHeaderMenu:\n return onColumnHeaderMenuClick?.(columnIndex, {\n x: coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft),\n y: 0,\n width: coordInstance.getColumnWidth(columnIndex),\n height: columnHeadHeight,\n });\n case RegionType.GroupStatistic:\n case RegionType.ColumnStatistic: {\n const { x, y, width, height } = hoveredRegionRef.current;\n return onColumnStatisticClick?.(columnIndex, {\n x,\n y,\n width,\n height,\n });\n }\n case RegionType.Cell:\n case RegionType.ActiveCell: {\n const cell = getCellContent([columnIndex, rowIndex]) as IInnerCell;\n const cellRenderer = getCellRenderer(cell.type);\n const onCellClick = cellRenderer.onClick;\n const isActive =\n isEqual(prevActiveCellRef.current, activeCell) &&\n isEqual(activeCell, [columnIndex, rowIndex]);\n\n // A held press selects the cell before this click sees the committed region.\n // Rating, checkbox, and detected text URLs still have to apply on that press.\n const textHasLink =\n cell.type === CellType.Text && 'links' in cell && Boolean(cell.links?.length);\n if (\n selectionCaughtUp &&\n cell.type !== CellType.Boolean &&\n cell.type !== CellType.Rating &&\n !textHasLink\n ) {\n return;\n }\n\n // The move that precedes a click may not have flushed hoverCellPosition yet.\n // Rating and checkbox icons still have to hit-test this click's coordinates.\n const clickCellPosition = getHoverCellPosition(mouseState) ?? hoverCellPosition;\n if (onCellClick && clickCellPosition) {\n onCellClick(\n cell as never,\n {\n width: coordInstance.getColumnWidth(columnIndex),\n height: coordInstance.getRowHeight(hoverRowIndex),\n theme,\n hoverCellPosition: clickCellPosition,\n activeCellBound,\n isActive,\n },\n (cellRegion: ICellRegionWithData) => {\n const { type, data } = cellRegion;\n\n if (type === CellRegionType.Update) {\n return onCellEdited?.([columnIndex, rowIndex], {\n ...cell,\n data,\n } as IInnerCell);\n }\n\n if (type === CellRegionType.ToggleEditing) {\n return setEditing(true);\n }\n }\n );\n }\n return;\n }\n case RegionType.RowGroupControl: {\n const { rowIndex } = mouseState;\n const linearRow = getLinearRow(rowIndex);\n if (linearRow.type !== LinearRowType.Group) return;\n const { id } = linearRow;\n\n if (collapsedGroupIds == null) {\n return onCollapsedGroupChanged?.(new Set([id]));\n }\n\n if (collapsedGroupIds.has(id)) {\n const newCollapsedGroupIds = new Set(collapsedGroupIds);\n newCollapsedGroupIds.delete(id);\n return onCollapsedGroupChanged?.(newCollapsedGroupIds);\n }\n return onCollapsedGroupChanged?.(new Set([...collapsedGroupIds, id]));\n }\n }\n\n const { type: clickRegionType, ...rest } = hoveredRegionRef.current;\n onItemClick?.(clickRegionType, rest, [columnIndex, rowIndex]);\n };\n\n const onDblClick = () => {\n const mouseState = getMouseState();\n const { type, rowIndex, columnIndex } = mouseState;\n const { realIndex } = getLinearRow(rowIndex);\n if (\n [RegionType.Cell, RegionType.ActiveCell].includes(type) &&\n isEqual(selectionRanges[0], [columnIndex, realIndex])\n ) {\n const cell = getCellContent([columnIndex, realIndex]) as IInnerCell;\n if (cell.readonly) return onCellDblClick?.([columnIndex, realIndex]);\n editorContainerRef.current?.focus?.();\n return setEditing(true);\n }\n if (\n [RegionType.ColumnHeader, RegionType.ColumnIcon].includes(type) &&\n isEqual(selectionRanges[0], [columnIndex, columnIndex])\n ) {\n return onColumnHeaderDblClick?.(columnIndex, {\n x: coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft),\n y: 0,\n width: coordInstance.getColumnWidth(columnIndex),\n height: columnHeadHeight,\n });\n }\n };\n\n const onSmartClick = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n const eventDetail = event.detail;\n\n if (eventDetail === 1) {\n onClick(event);\n }\n\n if (eventDetail === 2) {\n onDblClick();\n }\n };\n\n const onMouseDown = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n event.preventDefault();\n if (event.button === MouseButtonType.Right) return;\n const mouseState = getMouseState();\n setMouseState(mouseState);\n const { rowIndex: hoverRowIndex, columnIndex, type } = mouseState;\n const { realIndex: rowIndex } = getLinearRow(hoverRowIndex);\n\n // Start fill-drag only when clicking the fill handler\n if (type === RegionType.FillHandler && onFillSelection) {\n isFillingRef.current = true;\n fillSelectionRef.current = selection;\n setEditing(false);\n editorContainerRef.current?.saveValue?.();\n return;\n }\n if (\n !(\n isCellSelection &&\n isEqual(selectionRanges[0], [columnIndex, rowIndex]) &&\n type === RegionType.Cell\n )\n ) {\n setEditing(false);\n editorContainerRef.current?.saveValue?.();\n }\n onDragStart(mouseState, (type, ranges) => {\n if (type === DragRegionType.Columns) {\n _onDragStart?.(type, flatRanges(ranges));\n }\n if (type === DragRegionType.Rows) {\n const originRealIndexs = flatRanges(ranges).map((index) => getLinearRow(index).realIndex);\n _onDragStart?.(type, originRealIndexs);\n }\n });\n onColumnFreezeStart(mouseState);\n prevActiveCellRef.current = activeCell;\n onSelectionStart(event, mouseState);\n isColumnResizable && onColumnResizeStart(mouseState);\n };\n\n const onCellPosition = (mouseState: IMouseState) => {\n const { columnIndex, rowIndex, type } = mouseState;\n const { realIndex } = getLinearRow(rowIndex);\n const cell = getCellContent([columnIndex, realIndex]);\n const cellRenderer = getCellRenderer(cell.type);\n const { needsHover, needsHoverWhenActive, needsHoverPositionWhenActive } = cellRenderer;\n const needsHoverPosition = needsHoverPositionFor(cellRenderer, cell);\n const isActive = type === RegionType.ActiveCell;\n if ((needsHoverPosition || (needsHoverPositionWhenActive && isActive)) && hoverCellPosition) {\n const region = cellRenderer.checkRegion?.(cell as never, {\n width: coordInstance.getColumnWidth(columnIndex),\n height: coordInstance.getRowHeight(rowIndex),\n theme,\n isActive,\n activeCellBound,\n hoverCellPosition,\n }) ?? { type: CellRegionType.Blank };\n const { type } = region;\n\n if (type === CellRegionType.Hover) {\n const { x, y, width, height, ...extraData } = region.data as IRectangle & {\n [key: string]: unknown;\n };\n const offsetX = coordInstance.getColumnOffset(columnIndex);\n const offsetY = coordInstance.getRowOffset(rowIndex);\n onItemHovered?.(\n RegionType.CellValue,\n {\n x:\n columnIndex < coordInstance.freezeColumnCount\n ? x + offsetX\n : x + offsetX - scrollLeft,\n y: y + offsetY - scrollTop,\n width,\n height,\n },\n [columnIndex, realIndex],\n extraData\n );\n }\n\n return type !== CellRegionType.Blank ? setCursor('pointer') : undefined;\n }\n if (needsHover || (needsHoverWhenActive && isActive)) {\n setCursor('pointer');\n }\n };\n\n const onMouseMove = () => {\n const mouseState = getMouseState();\n const hoverCellPosition = getHoverCellPosition(mouseState);\n setHoverCellPosition(() => hoverCellPosition);\n setMouseState(() => mouseState);\n setCursorStyle(mouseState.type);\n onCellPosition(mouseState);\n if (isFillingRef.current) onAutoScroll(mouseState);\n if (isSelecting) onAutoScroll(mouseState);\n if (isDragging) onAutoScroll(mouseState, dragType);\n if (!isFillingRef.current) onSelectionChange(mouseState);\n onColumnResizeChange(mouseState, (newWidth, columnIndex) => {\n onColumnResize?.(columns[columnIndex], newWidth, columnIndex);\n });\n onDragChange(mouseState);\n onColumnFreezeMove(mouseState);\n if (!isInteracting && !isEqual(hoveredRegionRef.current, previousHoveredRegionRef.current)) {\n const { type, ...rest } = hoveredRegionRef.current;\n const { columnIndex, rowIndex } = mouseState;\n onItemHovered?.(type, rest, [columnIndex, getLinearRow(rowIndex).realIndex]);\n }\n previousHoveredRegionRef.current = { ...hoveredRegionRef.current };\n };\n\n const onMouseUp = () => {\n const mouseState = getMouseState();\n setMouseState(mouseState);\n onAutoScrollStop();\n let didFill = false;\n\n if (isFillingRef.current) {\n const selectionSnapshot = fillSelectionRef.current;\n if (selectionSnapshot?.isCellSelection) {\n const [start, end] = selectionSnapshot.serialize();\n const minRow = Math.min(start[1], end[1]);\n const maxRow = Math.max(start[1], end[1]);\n const { realIndex: targetRealRow } = getLinearRow(mouseState.rowIndex);\n if (Number.isFinite(targetRealRow) && targetRealRow > maxRow) {\n onFillSelection?.([start, end] as [IRange, IRange], targetRealRow);\n const startCol = Math.min(start[0], end[0]);\n const endCol = Math.max(start[0], end[0]);\n const startRow = Math.min(start[1], end[1]);\n const finalStart: IRange = [startCol, startRow];\n const finalEnd: IRange = [endCol, targetRealRow];\n setSelection(selection.set(SelectionRegionType.Cells, [finalStart, finalEnd]));\n didFill = true;\n } else if (Number.isFinite(targetRealRow) && targetRealRow < minRow) {\n onFillSelection?.([start, end] as [IRange, IRange], targetRealRow);\n const startCol = Math.min(start[0], end[0]);\n const endCol = Math.max(start[0], end[0]);\n const finalStart: IRange = [startCol, targetRealRow];\n const finalEnd: IRange = [endCol, maxRow];\n setSelection(selection.set(SelectionRegionType.Cells, [finalStart, finalEnd]));\n didFill = true;\n }\n }\n isFillingRef.current = false;\n fillSelectionRef.current = null;\n }\n onDragEnd(mouseState, (ranges, dropIndex) => {\n if (dragType === DragRegionType.Columns) {\n onColumnOrdered?.(flatRanges(ranges), dropIndex);\n }\n if (dragType === DragRegionType.Rows) {\n const { type: prevType } = getLinearRow(dropIndex - 1);\n const { type, realIndex } = getLinearRow(dropIndex);\n const originRealIndexs = flatRanges(ranges).map((index) => getLinearRow(index).realIndex);\n\n if (\n (prevType === LinearRowType.Row && type === LinearRowType.Append) ||\n (prevType === LinearRowType.Group && type === LinearRowType.Row && realIndex !== 0)\n ) {\n return onRowOrdered?.(originRealIndexs, realIndex + 1);\n }\n\n onRowOrdered?.(originRealIndexs, realIndex);\n }\n if (!didFill) {\n setActiveCell(null);\n setSelection(selection.reset());\n }\n setCursor('default');\n });\n onColumnFreezeEnd(\n (columnCount: number) => {\n onColumnFreeze?.(columnCount);\n setMouseState(DEFAULT_MOUSE_STATE);\n },\n () => {\n onColumnFreezeFailed?.();\n setMouseState(DEFAULT_MOUSE_STATE);\n }\n );\n onSelectionEnd();\n onColumnResizeEnd();\n };\n\n const onMouseLeave = () => {\n if (isInteracting) return;\n const { type, ...rest } = BLANK_REGION_DATA;\n onItemHovered?.(type, rest, [-Infinity, -Infinity]);\n setMouseState(DEFAULT_MOUSE_STATE);\n setHoveredColumnResizeIndex(-1);\n };\n\n const onContextMenuInner = (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n if (event.cancelable) event.preventDefault();\n const mouseState = getMouseState();\n const { type, x, y, rowIndex } = mouseState;\n\n if (type === RegionType.RowGroupHeader || type === RegionType.RowGroupControl) {\n const linearRow = getLinearRow(rowIndex);\n\n if (linearRow.type !== LinearRowType.Group) return;\n\n const { id: groupId } = linearRow;\n return onGroupHeaderContextMenu?.(groupId, { x, y });\n }\n\n if (onContextMenu) {\n onSelectionContextMenu(mouseState, (selection, position) =>\n onContextMenu(selection, position)\n );\n }\n };\n\n const onEditorContextMenu = () => {\n const { x, y } = getPosition();\n onContextMenu?.(selection, { x, y });\n };\n\n const resetState = () => {\n setActiveCell(null);\n setDragState(DEFAULT_DRAG_STATE);\n setMouseState(DEFAULT_MOUSE_STATE);\n setSelection(selection.reset());\n setHoveredColumnResizeIndex(-1);\n setColumnResizeState(DEFAULT_COLUMN_RESIZE_STATE);\n };\n\n useEventListener('mousemove', onMouseMove, isInteracting ? window : stageRef.current, true);\n useEventListener('mouseup', onMouseUp, isInteracting ? window : stageRef.current, true);\n\n const onClickAway = useCallback(() => {\n setEditing(false);\n editorContainerRef.current?.saveValue?.();\n }, [setEditing]);\n\n useEffect(() => {\n const handler = (event: Event) => {\n const el = containerRef.current;\n if (!el) return;\n const target = event.target as HTMLElement | null;\n if (el.contains(target)) return;\n if (target?.closest('.click-outside-ignore')) return;\n onClickAway();\n };\n document.addEventListener('mousedown', handler);\n document.addEventListener('touchstart', handler);\n return () => {\n document.removeEventListener('mousedown', handler);\n document.removeEventListener('touchstart', handler);\n };\n }, [containerRef, onClickAway]);\n\n useLayoutEffect(() => {\n if (activeColumnIndex == null || activeRowIndex == null) return;\n cellScrollerRef.current?.reset();\n }, [activeColumnIndex, activeRowIndex]);\n\n return (\n <div\n ref={containerRef}\n style={{\n width,\n height,\n cursor,\n }}\n className=\"absolute\"\n >\n <div\n ref={stageRef}\n data-t-grid-stage\n className=\"size-full\"\n onClick={onSmartClick}\n onMouseDown={onMouseDown}\n onMouseLeave={onMouseLeave}\n onContextMenu={onContextMenuInner}\n >\n <RenderLayer\n theme={theme}\n width={width}\n height={height}\n columns={columns}\n commentCountMap={commentCountMap}\n columnStatistics={columnStatistics}\n coordInstance={coordInstance}\n rowControls={rowControls}\n rowControlPaddingX={rowControlPaddingX}\n imageManager={imageManager}\n spriteManager={spriteManager}\n visibleRegion={visibleRegion}\n collaborators={collaborators}\n searchCursor={searchCursor}\n searchHitIndex={searchHitIndex}\n highlightedRowIndex={highlightedRowIndex}\n activeCellBound={activeCellBound}\n activeCell={activeCell}\n mouseState={mouseState}\n scrollState={scrollState}\n dragState={dragState}\n selection={selection}\n groupCollection={groupCollection}\n forceRenderFlag={forceRenderFlag}\n rowIndexVisible={rowIndexVisible}\n columnResizeState={columnResizeState}\n columnFreezeState={columnFreezeState}\n columnHeaderHeight={columnHeaderHeight}\n hoverCellPosition={hoverCellPosition}\n hoveredColumnResizeIndex={hoveredColumnResizeIndex}\n isRowAppendEnable={isRowAppendEnable}\n isColumnFreezable={isColumnFreezable}\n isColumnResizable={isColumnResizable}\n isColumnAppendEnable={isColumnAppendEnable}\n isColumnHeaderMenuVisible={isColumnHeaderMenuVisible}\n isEditing={isEditing}\n isSelecting={isSelecting}\n isInteracting={isInteracting}\n isMultiSelectionEnable={isMultiSelectionEnable}\n getCellContent={getCellContent}\n real2RowIndex={real2RowIndex}\n getLinearRow={getLinearRow}\n isFilling={isFillingRef.current}\n isFillEnabled={onFillSelection != null}\n />\n </div>\n\n {activeCellBound?.scrollEnable && (\n <CellScroller\n ref={cellScrollerRef}\n style={{\n top: coordInstance.getRowOffset(activeCellBound.rowIndex) + 4,\n left:\n coordInstance.getColumnRelativeOffset(activeCellBound.columnIndex + 1, scrollLeft) -\n 10,\n }}\n containerRef={containerRef}\n activeCellBound={activeCellBound}\n setCellScrollTop={setCellScrollTop}\n scrollEnable={regionType === RegionType.ActiveCell}\n />\n )}\n\n <EditorContainer\n ref={editorContainerRef}\n theme={theme}\n isEditing={isEditing}\n selection={selection}\n activeCell={activeCell}\n scrollState={scrollState}\n coordInstance={coordInstance}\n activeCellBound={activeCellBound}\n disableEnterMoveDown={disableEnterMoveDown}\n onCopy={onCopy}\n onPaste={onPaste}\n onUndo={onUndo}\n onRedo={onRedo}\n onDelete={onDelete}\n onChange={onCellEdited}\n onRowExpand={onRowExpand}\n onContextMenu={onEditorContextMenu}\n setEditing={setEditing}\n setSelection={setSelection}\n setActiveCell={setActiveCell}\n getCellContent={getCellContent}\n real2RowIndex={real2RowIndex}\n scrollToItem={scrollToItem}\n scrollBy={scrollBy}\n />\n </div>\n );\n};\n\nexport const InteractionLayer = forwardRef(InteractionLayerBase);\n","import { useRef, type PropsWithChildren, type PointerEvent } from 'react';\n\n/** React 18/19 pointer events replace the legacy react-hammerjs wrapper. */\nexport default function Touch({ children, onTap }: PropsWithChildren<{\n onTap: (event: { changedPointers: { offsetX: number; offsetY: number }[] }) => void;\n}>) {\n const start = useRef<{ x: number; y: number; time: number } | null>(null);\n function down(event: PointerEvent<HTMLDivElement>) {\n start.current = { x: event.clientX, y: event.clientY, time: Date.now() };\n }\n function up(event: PointerEvent<HTMLDivElement>) {\n const previous = start.current; start.current = null;\n if (!previous || Math.hypot(event.clientX - previous.x, event.clientY - previous.y) > 10 || Date.now() - previous.time > 600) return;\n const bounds = event.currentTarget.getBoundingClientRect();\n onTap({ changedPointers: [{ offsetX: event.clientX - bounds.left, offsetY: event.clientY - bounds.top }] });\n }\n return <div onPointerDown={down} onPointerUp={up} onPointerCancel={() => { start.current = null; }}>{children}</div>;\n}\n","import type { Dispatch, FC, SetStateAction } from 'react';\nimport { useRef } from 'react';\nimport ReactHammer from '../../grid-adapter/touch';\nimport {\n DEFAULT_COLUMN_RESIZE_STATE,\n DEFAULT_DRAG_STATE,\n DEFAULT_FREEZE_COLUMN_STATE,\n DEFAULT_MOUSE_STATE,\n GRID_DEFAULT,\n type IGridTheme,\n} from './configs';\nimport type { IGridProps } from './Grid';\nimport { useSelection, useVisibleRegion } from './hooks';\nimport { LinearRowType, RegionType, SelectionRegionType } from './interface';\nimport type {\n ICellItem,\n ICellRegionWithData,\n IInnerCell,\n ILinearRow,\n IMouseState,\n IRange,\n IRowControlItem,\n IScrollState,\n} from './interface';\nimport type { CoordinateManager, ImageManager, SpriteManager } from './managers';\nimport { emptySelection } from './managers';\nimport { CellRegionType, getCellRenderer } from './renderers';\nimport { RenderLayer } from './RenderLayer';\nimport { getColumnStatisticData, inRange } from './utils';\n\nexport interface ITouchLayerProps extends Omit<\n IGridProps,\n | 'style'\n | 'rowCount'\n | 'rowHeight'\n | 'smoothScrollX'\n | 'smoothScrollY'\n | 'freezeColumnCount'\n | 'onCopy'\n | 'onPaste'\n | 'onRowOrdered'\n | 'onColumnResize'\n | 'onColumnOrdered'\n | 'onColumnHeaderDblClick'\n | 'onColumnHeaderMenuClick'\n | 'onVisibleRegionChanged'\n> {\n theme: IGridTheme;\n width: number;\n height: number;\n forceRenderFlag: string;\n mouseState: IMouseState;\n scrollState: IScrollState;\n imageManager: ImageManager;\n spriteManager: SpriteManager;\n coordInstance: CoordinateManager;\n rowControls: IRowControlItem[];\n real2RowIndex: (index: number) => number;\n getLinearRow: (index: number) => ILinearRow;\n setMouseState: Dispatch<SetStateAction<IMouseState>>;\n setActiveCell: Dispatch<SetStateAction<ICellItem | null>>;\n}\n\nconst { columnAppendBtnWidth, columnHeadHeight } = GRID_DEFAULT;\n\nexport const TouchLayer: FC<ITouchLayerProps> = (props) => {\n const {\n width,\n height,\n theme,\n columns,\n columnStatistics,\n coordInstance,\n scrollState,\n collaborators,\n searchCursor,\n highlightedRowIndex,\n mouseState,\n rowControls,\n rowControlPaddingX,\n imageManager,\n spriteManager,\n forceRenderFlag,\n rowIndexVisible,\n groupCollection,\n collapsedGroupIds,\n columnHeaderHeight,\n getCellContent,\n getLinearRow,\n real2RowIndex,\n setActiveCell,\n setMouseState,\n onRowAppend,\n onRowExpand,\n onColumnAppend,\n onColumnHeaderClick,\n onSelectionChanged,\n onColumnStatisticClick,\n onCollapsedGroupChanged,\n } = props;\n const hasAppendRow = onRowAppend != null;\n const hasAppendColumn = onColumnAppend != null;\n const { scrollTop, scrollLeft } = scrollState;\n const {\n totalHeight,\n containerHeight,\n freezeRegionWidth,\n totalWidth,\n columnInitSize,\n rowCount,\n rowInitSize,\n } = coordInstance;\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const visibleRegion = useVisibleRegion(coordInstance, scrollState, forceRenderFlag);\n\n const { selection, setSelection } = useSelection({\n coordInstance,\n getLinearRow,\n setActiveCell,\n onSelectionChanged,\n });\n\n const getRangeByPosition = (x: number, y: number) => {\n const rowIndex =\n y < 0 ? -Infinity : y <= rowInitSize ? -1 : coordInstance.getRowStartIndex(scrollTop + y);\n const columnIndex =\n x < 0\n ? -Infinity\n : scrollLeft + x > totalWidth && scrollLeft + x < totalWidth + columnAppendBtnWidth\n ? -2\n : x <= freezeRegionWidth\n ? x <= columnInitSize\n ? -1\n : coordInstance.getColumnStartIndex(x)\n : coordInstance.getColumnStartIndex(scrollLeft + x);\n\n return [columnIndex, rowIndex];\n };\n\n // Highlight the clicked area to enhance the user experience\n const onTapStyleEffect = (mouseState: IMouseState) => {\n setMouseState(mouseState);\n setTimeout(() => setMouseState(DEFAULT_MOUSE_STATE), 500);\n };\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n const onTap = (e: { changedPointers: { offsetX: number; offsetY: number; layerX?: number; layerY?: number }[] }) => {\n const pointerEvent = e.changedPointers[0];\n const x = pointerEvent?.offsetX ?? pointerEvent?.layerX;\n const y = pointerEvent?.offsetY ?? pointerEvent?.layerY;\n const [columnIndex, rowIndex] = getRangeByPosition(x, y);\n const posInfo = { x, y, rowIndex, columnIndex, isOutOfBounds: false };\n\n // Tap the column statistic\n const statisticBoundData = getColumnStatisticData({\n columnStatistics,\n scrollState,\n coordInstance,\n getLinearRow,\n position: { x, y, rowIndex, columnIndex },\n height,\n });\n if (statisticBoundData != null) {\n const { type, ...rest } = statisticBoundData;\n return onColumnStatisticClick?.(columnIndex, { ...rest });\n }\n\n // Tap the column header\n if (rowIndex === -1 && columnIndex > -1) {\n onTapStyleEffect({ ...posInfo, type: RegionType.ColumnHeader });\n return onColumnHeaderClick?.(columnIndex, {\n x: coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft),\n y: 0,\n width: coordInstance.getColumnWidth(columnIndex),\n height: columnHeadHeight,\n });\n }\n\n // Tap the append column button\n if (hasAppendColumn && rowIndex >= -1 && columnIndex === -2) {\n onTapStyleEffect({ ...posInfo, type: RegionType.AppendColumn });\n return onColumnAppend?.();\n }\n\n // Tap the append row button\n if (hasAppendRow && rowIndex === rowCount - 1 && columnIndex >= -1) {\n onTapStyleEffect({ ...posInfo, type: RegionType.AppendRow });\n return onRowAppend?.();\n }\n\n // Tap the row\n if (rowIndex >= 0) {\n const linearRow = getLinearRow(rowIndex);\n\n if (linearRow.type === LinearRowType.Group && x < rowInitSize) {\n const { id } = linearRow;\n if (collapsedGroupIds == null) return onCollapsedGroupChanged?.(new Set([id]));\n if (collapsedGroupIds.has(id)) {\n const newCollapsedGroupIds = new Set(collapsedGroupIds);\n newCollapsedGroupIds.delete(id);\n return onCollapsedGroupChanged?.(newCollapsedGroupIds);\n }\n return onCollapsedGroupChanged?.(new Set([...collapsedGroupIds, id]));\n }\n\n if (scrollTop + y > totalHeight && !inRange(y, containerHeight, height)) {\n return;\n }\n\n let isPreview = false;\n\n // Tap the cell\n if (columnIndex >= 0) {\n const cell = getCellContent([columnIndex, rowIndex]) as IInnerCell;\n const cellRenderer = getCellRenderer(cell.type);\n const onCellClick = cellRenderer.onClick;\n\n if (onCellClick) {\n const offsetX = coordInstance.getColumnOffset(columnIndex);\n onCellClick(\n cell as never,\n {\n width: coordInstance.getColumnWidth(columnIndex),\n height: coordInstance.getRowHeight(rowIndex),\n theme,\n hoverCellPosition: [\n columnIndex < coordInstance.freezeColumnCount\n ? x - offsetX\n : x - offsetX + scrollLeft,\n y - coordInstance.getRowOffset(rowIndex) + scrollTop,\n ],\n activeCellBound: null,\n isActive: false,\n },\n (cellRegion: ICellRegionWithData) => {\n const { type } = cellRegion;\n\n if (type === CellRegionType.Preview) {\n isPreview = true;\n }\n }\n );\n }\n\n if (isPreview) return;\n }\n\n const range = [0, rowIndex];\n setActiveCell(range as IRange);\n setSelection(selection.set(SelectionRegionType.Cells, [range, range] as IRange[]));\n onTapStyleEffect({ ...posInfo, type: RegionType.Cell });\n onRowExpand?.(linearRow.realIndex);\n }\n };\n\n return (\n <ReactHammer onTap={onTap}>\n <div ref={containerRef} style={{ width, height }}>\n <RenderLayer\n theme={theme}\n width={width}\n height={height}\n columns={columns}\n columnStatistics={columnStatistics}\n collaborators={collaborators}\n searchCursor={searchCursor}\n highlightedRowIndex={highlightedRowIndex}\n coordInstance={coordInstance}\n rowControls={rowControls}\n rowControlPaddingX={rowControlPaddingX}\n imageManager={imageManager}\n spriteManager={spriteManager}\n visibleRegion={visibleRegion}\n rowIndexVisible={rowIndexVisible}\n groupCollection={groupCollection}\n activeCell={null}\n activeCellBound={null}\n mouseState={mouseState}\n scrollState={scrollState}\n dragState={DEFAULT_DRAG_STATE}\n selection={emptySelection}\n isSelecting={false}\n forceRenderFlag={forceRenderFlag}\n columnHeaderHeight={columnHeaderHeight}\n columnFreezeState={DEFAULT_FREEZE_COLUMN_STATE}\n columnResizeState={DEFAULT_COLUMN_RESIZE_STATE}\n hoverCellPosition={null}\n hoveredColumnResizeIndex={-1}\n isRowAppendEnable={hasAppendRow}\n isColumnAppendEnable={hasAppendColumn}\n getCellContent={getCellContent}\n real2RowIndex={real2RowIndex}\n getLinearRow={getLinearRow}\n />\n </div>\n </ReactHammer>\n );\n};\n","/* eslint-disable jsx-a11y/no-static-element-interactions, jsx-a11y/no-noninteractive-tabindex */\nimport { uniqueId } from 'lodash';\nimport type { CSSProperties, ForwardRefRenderFunction } from 'react';\nimport { useState, useRef, useMemo, useCallback, useImperativeHandle, forwardRef } from 'react';\nimport { LoadingIndicator, ErrorIndicator } from './components';\nimport type { IGridTheme } from './configs';\nimport { gridTheme, GRID_DEFAULT, DEFAULT_SCROLL_STATE, DEFAULT_MOUSE_STATE } from './configs';\nimport { useResizeObserver } from './hooks';\nimport type { ScrollerRef } from './InfiniteScroller';\nimport { InfiniteScroller } from './InfiniteScroller';\nimport type { IInteractionLayerRef } from './InteractionLayer';\nimport { InteractionLayer } from './InteractionLayer';\nimport type {\n IRectangle,\n IScrollState,\n ICellItem,\n IGridColumn,\n IMouseState,\n IPosition,\n IRowControlItem,\n IColumnStatistics,\n ICollaborator,\n IGroupPoint,\n ILinearRow,\n IGroupCollection,\n DragRegionType,\n IColumnLoading,\n IRange,\n ICellError,\n} from './interface';\nimport {\n RegionType,\n RowControlType,\n DraggableType,\n SelectableType,\n LinearRowType,\n} from './interface';\nimport type { ISpriteMap, CombinedSelection, IIndicesMap } from './managers';\nimport { CoordinateManager, SpriteManager, ImageManager } from './managers';\nimport { getCellRenderer, type ICell, type IInnerCell } from './renderers';\nimport { TouchLayer } from './TouchLayer';\nimport { getMaxFreezeColumnCount, getRowControlExtraWidth, measuredCanvas } from './utils';\n\nexport interface IGridExternalProps {\n theme?: Partial<IGridTheme>;\n customIcons?: ISpriteMap;\n rowControls?: IRowControlItem[];\n rowControlPaddingX?: number;\n smoothScrollX?: boolean;\n smoothScrollY?: boolean;\n scrollBufferX?: number;\n scrollBufferY?: number;\n scrollBarVisible?: boolean;\n rowIndexVisible?: boolean;\n collaborators?: ICollaborator;\n // [rowIndex, colIndex]\n searchCursor?: [number, number] | null;\n searchHitIndex?: { fieldId: string; recordId: string }[];\n // a row marked apart from the selection, e.g. the record open in the side panel\n highlightedRowIndex?: number | null;\n\n /**\n * Indicates which areas can be dragged, including rows, columns or no drag\n * - 'all': Allow drag of rows, columns and cells (default)\n * - 'none': Disable drag for all areas\n * - 'row': Allow row drag only\n * - 'column': Allow column drag only\n */\n draggable?: DraggableType;\n\n /**\n * Indicates which areas can be selected, including row selection,\n * column selection, cell selection, all areas, or no selection\n * - 'all': Allow selection of rows, columns and cells (default)\n * - 'none': Disable selection for all areas\n * - 'row': Allow row selection only\n * - 'column': Allow column selection only\n * - 'cell': Allow cell selection only\n */\n selectable?: SelectableType;\n\n /**\n * Whether to allow multiple selection operations, including rows, columns and cells\n * If true, allow multiple selection of rows/columns/cells (default)\n * If false, disable multiple selection operations\n * @type {boolean}\n */\n isMultiSelectionEnable?: boolean;\n isRowClickSelectionEnabled?: boolean;\n\n /**\n * Keep the cursor on the active cell after Enter instead of moving to the next\n * row, so the caller can follow a record that re-positions on edit.\n */\n disableEnterMoveDown?: boolean;\n\n groupCollection?: IGroupCollection | null;\n collapsedGroupIds?: Set<string> | null;\n groupPoints?: IGroupPoint[] | null;\n\n onUndo?: () => void;\n onRedo?: () => void;\n onCopy?: (selection: CombinedSelection, e: React.ClipboardEvent) => void;\n onPaste?: (selection: CombinedSelection, e: React.ClipboardEvent) => void;\n onDelete?: (selection: CombinedSelection) => void;\n onCellEdited?: (cell: ICellItem, newValue: IInnerCell) => void;\n onCellDblClick?: (cell: ICellItem) => void;\n onSelectionChanged?: (selection: CombinedSelection) => void;\n onVisibleRegionChanged?: (rect: IRectangle) => void;\n onCollapsedGroupChanged?: (collapsedGroupIds: Set<string>) => void;\n onColumnFreeze?: (freezeColumnCount: number) => void;\n onColumnFreezeFailed?: () => void;\n onColumnAppend?: () => void;\n onRowExpand?: (rowIndex: number) => void;\n onRowAppend?: (targetIndex?: number) => void;\n onRowOrdered?: (dragRowIndexCollection: number[], dropRowIndex: number) => void;\n onColumnOrdered?: (dragColIndexCollection: number[], dropColIndex: number) => void;\n onColumnResize?: (column: IGridColumn, newSize: number, colIndex: number) => void;\n onColumnHeaderClick?: (colIndex: number, bounds: IRectangle) => void;\n onColumnHeaderDblClick?: (colIndex: number, bounds: IRectangle) => void;\n onColumnHeaderMenuClick?: (colIndex: number, bounds: IRectangle) => void;\n onColumnStatisticClick?: (colIndex: number, bounds: IRectangle) => void;\n onContextMenu?: (selection: CombinedSelection, position: IPosition) => void;\n onGroupHeaderContextMenu?: (groupId: string, position: IPosition) => void;\n onScrollChanged?: (scrollLeft: number, scrollTop: number) => void;\n onDragStart?: (type: DragRegionType, dragIndexs: number[]) => void;\n\n /**\n * Triggered when the mouse hovers over the every type of region\n */\n onItemHovered?: (\n type: RegionType,\n bounds: IRectangle,\n cellItem: ICellItem,\n data?: unknown\n ) => void;\n\n /**\n * Triggered when the mouse clicks the every type of region\n */\n onItemClick?: (type: RegionType, bounds: IRectangle, cellItem: ICellItem) => void;\n\n /**\n * Triggered when user drags the fill handle downward to auto-fill cells\n * Only vertical fill is supported. Provides current selection ranges and the target end real row index\n */\n onFillSelection?: (selectionRanges: [IRange, IRange], targetEndRealRowIndex: number) => void;\n\n /**\n * Triggered when user clicks a row control (checkbox, expand, drag)\n * For checkbox: checked indicates the state after click (true = selected, false = deselected)\n */\n onRowControlClick?: (rowIndex: number, type: RowControlType, checked: boolean) => void;\n\n /**\n * Triggered when user shift+clicks to select a range of rows\n * Provides the row ranges selected (can be used to fetch recordIds via API)\n */\n onRowRangeSelected?: (ranges: IRange[]) => void;\n}\n\nexport interface IGridProps extends IGridExternalProps {\n columns: IGridColumn[];\n commentCountMap?: Record<string, number>;\n freezeColumnCount?: number;\n rowCount: number;\n rowHeight?: number;\n style?: CSSProperties;\n isTouchDevice?: boolean;\n columnHeaderHeight?: number;\n columnStatistics?: IColumnStatistics;\n getCellContent: (cell: ICellItem) => ICell;\n}\n\nexport interface IGridRef {\n resetState: () => void;\n forceUpdate: () => void;\n getActiveCell: () => ICellItem | null;\n getRowOffset: (rowIndex: number) => number;\n setSelection: (selection: CombinedSelection) => void;\n getScrollState: () => IScrollState;\n scrollBy: (deltaX: number, deltaY: number) => void;\n scrollTo: (scrollLeft?: number, scrollTop?: number) => void;\n scrollToItem: (position: [columnIndex: number, rowIndex: number]) => void;\n setActiveCell: (cell: ICellItem | null) => void;\n getCellIndicesAtPosition: (x: number, y: number) => ICellItem | null;\n getContainer: () => HTMLDivElement | null;\n getCellBounds: (cell: ICellItem) => IRectangle | null;\n getFreezeColumnState: () => {\n effectiveFreezeColumnCount: number;\n maxFreezeColumnCount: number;\n };\n setCellLoading: (cells: ICellItem[]) => void;\n setColumnLoadings: (columnLoadings: IColumnLoading[]) => void;\n setCellErrors: (cellErrors: ICellError[]) => void;\n isEditing: () => boolean | undefined;\n}\n\nconst {\n scrollBuffer,\n appendRowHeight,\n groupHeaderHeight,\n cellScrollBuffer,\n columnAppendBtnWidth,\n columnStatisticHeight,\n rowHeight: defaultRowHeight,\n columnWidth: defaultColumnWidth,\n columnHeadHeight: defaultColumnHeaderHeight,\n} = GRID_DEFAULT;\n\nconst GridBase: ForwardRefRenderFunction<IGridRef, IGridProps> = (props, forwardRef) => {\n const {\n columns,\n commentCountMap,\n groupCollection,\n collapsedGroupIds,\n draggable = DraggableType.All,\n selectable = SelectableType.All,\n columnStatistics,\n freezeColumnCount: _freezeColumnCount = 1,\n rowCount: originRowCount,\n rowHeight = defaultRowHeight,\n rowControls = [{ type: RowControlType.Checkbox }],\n rowControlPaddingX = 0,\n theme: customTheme,\n isTouchDevice,\n smoothScrollX = true,\n smoothScrollY = true,\n scrollBufferX = scrollBuffer,\n scrollBufferY = scrollBuffer,\n scrollBarVisible = true,\n rowIndexVisible = true,\n isMultiSelectionEnable = true,\n isRowClickSelectionEnabled = true,\n disableEnterMoveDown = false,\n style,\n customIcons,\n collaborators,\n searchCursor,\n searchHitIndex,\n highlightedRowIndex,\n groupPoints,\n columnHeaderHeight = defaultColumnHeaderHeight,\n getCellContent,\n onUndo,\n onRedo,\n onCopy,\n onPaste,\n onDelete,\n onRowAppend,\n onRowExpand,\n onRowOrdered,\n onCellEdited,\n onCellDblClick,\n onColumnAppend,\n onColumnResize,\n onColumnOrdered,\n onDragStart,\n onContextMenu,\n onSelectionChanged,\n onVisibleRegionChanged,\n onColumnFreeze,\n onColumnFreezeFailed,\n onColumnHeaderClick,\n onColumnHeaderDblClick,\n onColumnHeaderMenuClick,\n onColumnStatisticClick,\n onCollapsedGroupChanged,\n onGroupHeaderContextMenu,\n onItemHovered,\n onItemClick,\n onScrollChanged,\n onFillSelection,\n onRowControlClick,\n onRowRangeSelected,\n } = props;\n\n useImperativeHandle(forwardRef, () => ({\n resetState: () => interactionLayerRef.current?.resetState(),\n forceUpdate: () => setForceRenderFlag(uniqueId('grid_')),\n getActiveCell: () => activeCell,\n setSelection: (selection: CombinedSelection) => {\n interactionLayerRef.current?.setSelection(selection);\n },\n getRowOffset: (rowIndex: number) => {\n const { scrollTop } = scrollState;\n const realRowIndex = real2RowIndex(rowIndex);\n return coordInstance.getRowOffset(realRowIndex) - scrollTop;\n },\n scrollBy,\n scrollTo,\n scrollToItem,\n setActiveCell,\n getScrollState: () => scrollState,\n getCellIndicesAtPosition: (x: number, y: number): ICellItem | null => {\n const { scrollLeft, scrollTop } = scrollState;\n\n const rowIndex = coordInstance.getRowStartIndex(scrollTop + y);\n const columnIndex = coordInstance.getColumnStartIndex(scrollLeft + x);\n\n const { type, realIndex } = getLinearRow(rowIndex);\n if (type !== LinearRowType.Row) return null;\n\n return [columnIndex, realIndex];\n },\n getContainer: () => containerRef.current,\n getFreezeColumnState: () => ({\n effectiveFreezeColumnCount,\n maxFreezeColumnCount,\n }),\n setCellLoading: (cells: ICellItem[]) => {\n setCellLoadings(cells);\n },\n setColumnLoadings: (columnLoadings: IColumnLoading[]) => {\n setColumnLoadings(columnLoadings);\n },\n setCellErrors: (cellErrors: ICellError[]) => {\n setCellErrors(cellErrors);\n },\n getCellBounds: (cell: ICellItem) => {\n const [columnIndex, _rowIndex] = cell;\n const rowIndex = real2RowIndex(_rowIndex);\n const { scrollLeft, scrollTop } = scrollState;\n\n const columnOffsetX = coordInstance.getColumnRelativeOffset(columnIndex, scrollLeft);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n\n if (columnOffsetX == null || columnWidth == null) {\n return null;\n }\n\n const rowOffsetY = coordInstance.getRowOffset(rowIndex);\n const rowHeight = coordInstance.getRowHeight(rowIndex);\n\n if (rowOffsetY == null || rowHeight == null) {\n return null;\n }\n\n return {\n x: columnOffsetX,\n y: rowOffsetY - scrollTop,\n width: columnWidth,\n height: rowHeight,\n };\n },\n isEditing: () => {\n return interactionLayerRef.current?.isEditing();\n },\n }));\n\n const hasAppendRow = onRowAppend != null;\n const hasAppendColumn = onColumnAppend != null;\n const rowControlCount = rowControls.length;\n const totalWidth = columns.reduce(\n (prev, column) => prev + (column.width || defaultColumnWidth),\n hasAppendColumn ? scrollBufferX + columnAppendBtnWidth : scrollBufferX\n );\n\n const [forceRenderFlag, setForceRenderFlag] = useState(uniqueId('grid_'));\n const [mouseState, setMouseState] = useState<IMouseState>(DEFAULT_MOUSE_STATE);\n const [scrollState, setScrollState] = useState<IScrollState>(DEFAULT_SCROLL_STATE);\n // Plain state, not rAF state: leaving editing and moving the active cell must commit together,\n // otherwise the edited cell is painted for a frame in its expanded non-editing layout.\n const [activeCell, setActiveCell] = useState<ICellItem | null>(null);\n const [cellLoadings, setCellLoadings] = useState<ICellItem[]>([]);\n const [columnLoadings, setColumnLoadings] = useState<IColumnLoading[]>([]);\n const [cellErrors, setCellErrors] = useState<ICellError[]>([]);\n const scrollerRef = useRef<ScrollerRef | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const interactionLayerRef = useRef<IInteractionLayerRef | null>(null);\n const { ref, width, height } = useResizeObserver<HTMLDivElement>();\n\n const [activeColumnIndex, activeRowIndex] = activeCell ?? [];\n const hoverRegionType = mouseState.type;\n const hasColumnStatistics = columnStatistics != null;\n const containerHeight = hasColumnStatistics ? height - columnStatisticHeight : height;\n const columnCount = columns.length;\n const freezeColumnCount = Math.min(_freezeColumnCount, columnCount);\n\n const theme = useMemo(() => ({ ...gridTheme, ...customTheme }), [customTheme]);\n const { iconSizeMD } = theme;\n\n const columnInitSize = useMemo(() => {\n if (!rowIndexVisible && !rowControlCount) return 0;\n return (\n Math.max(rowControlCount, 2) * iconSizeMD +\n getRowControlExtraWidth(theme, rowControlPaddingX) * 2\n );\n }, [rowControlCount, rowIndexVisible, iconSizeMD, theme, rowControlPaddingX]);\n\n const maxFreezeColumnCount = useMemo(() => {\n if (width <= 0) {\n return freezeColumnCount;\n }\n\n return getMaxFreezeColumnCount({\n containerWidth: width,\n columnInitSize,\n columnCount,\n getColumnWidth: (index) => columns[index]?.width || defaultColumnWidth,\n });\n }, [freezeColumnCount, columnInitSize, columnCount, columns, width]);\n\n const effectiveFreezeColumnCount = Math.min(freezeColumnCount, maxFreezeColumnCount);\n\n const defaultRowsInfo = useMemo(() => {\n return {\n linearRows: [],\n real2LinearRowMap: null,\n pureRowCount: originRowCount,\n rowCount: hasAppendRow ? originRowCount + 1 : originRowCount,\n rowHeightMap: hasAppendRow ? { [originRowCount]: appendRowHeight } : undefined,\n };\n }, [hasAppendRow, originRowCount]);\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n const groupRowsInfo = useMemo(() => {\n if (!groupPoints?.length) return null;\n let rowIndex = 0;\n let totalIndex = 0;\n let currentValue: unknown = null;\n let collapsedDepth = Number.MAX_VALUE;\n const linearRows: ILinearRow[] = [];\n const rowHeightMap: IIndicesMap = {};\n const real2LinearRowMap: Record<number, number> = {};\n\n groupPoints.forEach((point) => {\n const { type } = point;\n if (type === LinearRowType.Group) {\n const { id, value, depth, isCollapsed } = point;\n const isSubGroup = depth > collapsedDepth;\n\n if (isCollapsed) {\n collapsedDepth = Math.min(collapsedDepth, depth);\n if (isSubGroup) return;\n } else if (!isSubGroup) {\n collapsedDepth = Number.MAX_VALUE;\n } else {\n return;\n }\n\n rowHeightMap[totalIndex] = groupHeaderHeight;\n linearRows.push({\n id,\n type: LinearRowType.Group,\n depth,\n value,\n realIndex: rowIndex,\n isCollapsed: Boolean(isCollapsed),\n });\n currentValue = value;\n totalIndex++;\n }\n if (type === LinearRowType.Row) {\n const count = point.count;\n\n for (let i = 0; i < count; i++) {\n real2LinearRowMap[rowIndex + i] = totalIndex + i;\n linearRows.push({\n type: LinearRowType.Row,\n displayIndex: i + 1,\n realIndex: rowIndex + i,\n });\n }\n\n rowIndex += count;\n totalIndex += count;\n\n if (hasAppendRow) {\n rowHeightMap[totalIndex] = appendRowHeight;\n linearRows.push({\n type: LinearRowType.Append,\n value: currentValue,\n realIndex: rowIndex - 1,\n });\n totalIndex++;\n }\n }\n });\n\n return {\n linearRows,\n real2LinearRowMap,\n pureRowCount: rowIndex,\n rowCount: totalIndex,\n rowHeightMap,\n };\n }, [groupPoints, hasAppendRow]);\n\n const { rowCount, pureRowCount, rowHeightMap, linearRows, real2LinearRowMap } = useMemo(() => {\n return { ...defaultRowsInfo, ...groupRowsInfo };\n }, [defaultRowsInfo, groupRowsInfo]);\n\n const getLinearRow = useCallback(\n (index: number) => {\n if (!linearRows.length) {\n return (\n index >= pureRowCount\n ? {\n type: LinearRowType.Append,\n realIndex: index - 1,\n value: null,\n }\n : {\n type: LinearRowType.Row,\n displayIndex: index + 1,\n realIndex: index,\n }\n ) as ILinearRow;\n }\n return linearRows[index] ?? { realIndex: -2 };\n },\n [linearRows, pureRowCount]\n );\n\n const real2RowIndex = useCallback(\n (index: number) => {\n if (real2LinearRowMap == null) return index;\n return real2LinearRowMap[index];\n },\n [real2LinearRowMap]\n );\n\n const columnWidthMap = useMemo(() => {\n return columns.reduce(\n (acc, column, index) => ({\n ...acc,\n [index]: column.width || defaultColumnWidth,\n }),\n {}\n );\n }, [columns]);\n\n const coordInstance = useMemo<CoordinateManager>(() => {\n return new CoordinateManager({\n rowHeight,\n columnWidth: defaultColumnWidth,\n pureRowCount,\n rowCount,\n columnCount,\n freezeColumnCount: effectiveFreezeColumnCount,\n containerWidth: width,\n containerHeight,\n rowInitSize: columnHeaderHeight,\n columnInitSize,\n rowHeightMap,\n columnWidthMap,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rowHeight, pureRowCount, rowCount, rowHeightMap, columnHeaderHeight]);\n\n const totalHeight = coordInstance.totalHeight + scrollBufferY;\n\n useMemo(() => {\n coordInstance.refreshColumnDimensions({ columnInitSize, columnCount, columnWidthMap });\n setForceRenderFlag(uniqueId('grid_'));\n }, [coordInstance, columnInitSize, columnCount, columnWidthMap]);\n\n useMemo(() => {\n coordInstance.containerWidth = width;\n coordInstance.containerHeight = containerHeight;\n coordInstance.freezeColumnCount = effectiveFreezeColumnCount;\n setForceRenderFlag(uniqueId('grid_'));\n }, [coordInstance, width, containerHeight, effectiveFreezeColumnCount]);\n\n const activeCellBound = useMemo(() => {\n if (activeColumnIndex == null || activeRowIndex == null) {\n return null;\n }\n\n const cell = getCellContent([activeColumnIndex, activeRowIndex]);\n const cellRenderer = getCellRenderer(cell.type);\n const originWidth = coordInstance.getColumnWidth(activeColumnIndex);\n const originHeight = coordInstance.getRowHeight(real2RowIndex(activeRowIndex));\n\n if (cellRenderer?.measure && measuredCanvas?.ctx != null) {\n const { width, height, totalHeight } = cellRenderer.measure(cell as never, {\n theme,\n ctx: measuredCanvas.ctx,\n width: originWidth,\n height: originHeight,\n });\n return {\n rowIndex: activeRowIndex,\n columnIndex: activeColumnIndex,\n width,\n height,\n totalHeight,\n scrollTop: 0,\n scrollEnable: totalHeight > height,\n };\n }\n return {\n rowIndex: activeRowIndex,\n columnIndex: activeColumnIndex,\n width: originWidth,\n height: originHeight,\n totalHeight: originHeight,\n scrollTop: 0,\n scrollEnable: false,\n };\n }, [activeColumnIndex, activeRowIndex, coordInstance, theme, getCellContent, real2RowIndex]);\n\n const scrollEnable =\n hoverRegionType !== RegionType.None &&\n !(hoverRegionType === RegionType.ActiveCell && activeCellBound?.scrollEnable);\n\n const spriteManager = useMemo(\n () => new SpriteManager(customIcons, () => setForceRenderFlag(uniqueId('grid_'))),\n [customIcons]\n );\n\n const imageManager = useMemo<ImageManager>(() => {\n const imgManager = new ImageManager();\n imgManager.setCallback(() => setForceRenderFlag(uniqueId('grid_')));\n return imgManager;\n }, []);\n\n const scrollTo = useCallback((sl?: number, st?: number) => {\n scrollerRef.current?.scrollTo(sl, st);\n }, []);\n\n const scrollBy = useCallback((deltaX: number, deltaY: number) => {\n scrollerRef.current?.scrollBy(deltaX, deltaY);\n }, []);\n\n const scrollToItem = useCallback(\n (position: [columnIndex: number, rowIndex: number]) => {\n try {\n const {\n containerHeight,\n containerWidth,\n freezeRegionWidth,\n freezeColumnCount,\n rowInitSize,\n } = coordInstance;\n const { scrollTop, scrollLeft } = scrollState;\n const [columnIndex, _rowIndex] = position;\n const rowIndex = real2RowIndex(_rowIndex);\n const isFreezeColumn = columnIndex < freezeColumnCount;\n\n if (!isFreezeColumn) {\n const offsetX = coordInstance.getColumnOffset(columnIndex);\n const columnWidth = coordInstance.getColumnWidth(columnIndex);\n const deltaLeft = Math.min(offsetX - scrollLeft - freezeRegionWidth, 0);\n const deltaRight = Math.max(offsetX + columnWidth - scrollLeft - containerWidth, 0);\n const sl = scrollLeft + deltaLeft + deltaRight;\n if (sl !== scrollLeft) {\n const scrollBuffer =\n deltaLeft < 0 ? -cellScrollBuffer : deltaRight > 0 ? cellScrollBuffer : 0;\n scrollTo(sl + scrollBuffer);\n }\n }\n\n const rowHeight = coordInstance.getRowHeight(rowIndex);\n const offsetY = coordInstance.getRowOffset(rowIndex);\n const deltaTop = Math.min(offsetY - scrollTop - rowInitSize, 0);\n const deltaBottom = Math.max(offsetY + rowHeight - scrollTop - containerHeight, 0);\n const st = scrollTop + deltaTop + deltaBottom;\n if (st !== scrollTop) {\n scrollTo(undefined, st);\n }\n } catch (error) {\n console.error('scrollToItem error', error);\n }\n },\n [coordInstance, scrollState, scrollTo, real2RowIndex]\n );\n\n const onMouseDown = () => {\n containerRef.current?.focus();\n };\n\n const { rowInitSize } = coordInstance;\n\n return (\n // The grid keeps a left-to-right frame even under an RTL UI: column order,\n // freeze offsets and the horizontal scroller's `scrollLeft` are all\n // left-anchored, and RTL `scrollLeft` semantics differ per browser.\n // Mirroring the column order is a separate, much larger change; cell text\n // still follows its own content direction on the canvas.\n <div dir=\"ltr\" className=\"size-full\" style={style} ref={ref}>\n <div\n data-t-grid-container\n ref={containerRef}\n tabIndex={0}\n className=\"relative outline-none\"\n onMouseDown={onMouseDown}\n >\n {isTouchDevice ? (\n <TouchLayer\n width={width}\n height={height}\n theme={theme}\n columns={columns}\n commentCountMap={commentCountMap}\n mouseState={mouseState}\n scrollState={scrollState}\n rowControls={rowControls}\n rowControlPaddingX={rowControlPaddingX}\n collaborators={collaborators}\n searchCursor={searchCursor}\n searchHitIndex={searchHitIndex}\n highlightedRowIndex={highlightedRowIndex}\n imageManager={imageManager}\n spriteManager={spriteManager}\n coordInstance={coordInstance}\n columnStatistics={columnStatistics}\n collapsedGroupIds={collapsedGroupIds}\n columnHeaderHeight={columnHeaderHeight}\n forceRenderFlag={forceRenderFlag}\n rowIndexVisible={rowIndexVisible}\n groupCollection={groupCollection}\n getLinearRow={getLinearRow}\n real2RowIndex={real2RowIndex}\n getCellContent={getCellContent}\n setMouseState={setMouseState}\n setActiveCell={setActiveCell}\n onDelete={onDelete}\n onRowAppend={onRowAppend}\n onRowExpand={onRowExpand}\n onCellEdited={onCellEdited}\n onContextMenu={onContextMenu}\n onColumnAppend={onColumnAppend}\n onColumnHeaderClick={onColumnHeaderClick}\n onColumnStatisticClick={onColumnStatisticClick}\n onCollapsedGroupChanged={onCollapsedGroupChanged}\n onSelectionChanged={onSelectionChanged}\n />\n ) : (\n <InteractionLayer\n ref={interactionLayerRef}\n width={width}\n height={height}\n theme={theme}\n columns={columns}\n commentCountMap={commentCountMap}\n draggable={draggable}\n selectable={selectable}\n isRowClickSelectionEnabled={isRowClickSelectionEnabled}\n collaborators={collaborators}\n searchCursor={searchCursor}\n searchHitIndex={searchHitIndex}\n highlightedRowIndex={highlightedRowIndex}\n rowControls={rowControls}\n rowControlPaddingX={rowControlPaddingX}\n imageManager={imageManager}\n spriteManager={spriteManager}\n coordInstance={coordInstance}\n columnStatistics={columnStatistics}\n collapsedGroupIds={collapsedGroupIds}\n columnHeaderHeight={columnHeaderHeight}\n isMultiSelectionEnable={isMultiSelectionEnable}\n disableEnterMoveDown={disableEnterMoveDown}\n activeCell={activeCell}\n mouseState={mouseState}\n scrollState={scrollState}\n activeCellBound={activeCellBound}\n forceRenderFlag={forceRenderFlag}\n rowIndexVisible={rowIndexVisible}\n groupCollection={groupCollection}\n getLinearRow={getLinearRow}\n real2RowIndex={real2RowIndex}\n getCellContent={getCellContent}\n setMouseState={setMouseState}\n setActiveCell={setActiveCell}\n scrollToItem={scrollToItem}\n scrollBy={scrollBy}\n onUndo={onUndo}\n onRedo={onRedo}\n onCopy={onCopy}\n onPaste={onPaste}\n onDelete={onDelete}\n onDragStart={onDragStart}\n onRowAppend={onRowAppend}\n onRowExpand={onRowExpand}\n onRowOrdered={onRowOrdered}\n onCellEdited={onCellEdited}\n onCellDblClick={onCellDblClick}\n onContextMenu={onContextMenu}\n onColumnAppend={onColumnAppend}\n onColumnResize={onColumnResize}\n onColumnOrdered={onColumnOrdered}\n onColumnHeaderClick={onColumnHeaderClick}\n onColumnStatisticClick={onColumnStatisticClick}\n onColumnHeaderDblClick={onColumnHeaderDblClick}\n onColumnHeaderMenuClick={onColumnHeaderMenuClick}\n onCollapsedGroupChanged={onCollapsedGroupChanged}\n onGroupHeaderContextMenu={onGroupHeaderContextMenu}\n onSelectionChanged={onSelectionChanged}\n onColumnFreeze={onColumnFreeze}\n onColumnFreezeFailed={onColumnFreezeFailed}\n onItemHovered={onItemHovered}\n onItemClick={onItemClick}\n onFillSelection={onFillSelection}\n onRowControlClick={onRowControlClick}\n onRowRangeSelected={onRowRangeSelected}\n />\n )}\n </div>\n\n <InfiniteScroller\n ref={scrollerRef}\n coordInstance={coordInstance}\n top={rowInitSize}\n left={columnInitSize}\n containerWidth={width}\n containerHeight={containerHeight}\n scrollWidth={totalWidth}\n scrollHeight={totalHeight}\n smoothScrollX={smoothScrollX}\n smoothScrollY={smoothScrollY}\n scrollBarVisible={scrollBarVisible}\n containerRef={containerRef}\n rootRef={ref}\n scrollState={scrollState}\n scrollEnable={scrollEnable}\n getLinearRow={getLinearRow}\n setScrollState={setScrollState}\n onScrollChanged={onScrollChanged}\n onVisibleRegionChanged={onVisibleRegionChanged}\n />\n\n <LoadingIndicator\n cellLoadings={cellLoadings}\n columnLoadings={columnLoadings}\n coordInstance={coordInstance}\n scrollState={scrollState}\n real2RowIndex={real2RowIndex}\n />\n\n <ErrorIndicator\n cellErrors={cellErrors}\n coordInstance={coordInstance}\n scrollState={scrollState}\n real2RowIndex={real2RowIndex}\n />\n </div>\n );\n};\n\nexport const Grid = forwardRef(GridBase);\n"],"mappings":"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a,CAAC;CAIxB,sBAAsB;EACpB,MAAM,aAAa,cAAc;EACjC,IAAI,cAAc,MAAM;EACxB,MAAM,YAAY,aAAa;EAC/B,MAAM,QAAQ;GACZ;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,YAAY,gBAAgB;IAAE,GAAG;IAAY,GAAG;GAAc,IAAI;GAClE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;EACA,aAAa,UAAU;EACvB,SAAS,YAAY,aAAa,OAAO,SAAS;CACpD,GAAG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,OACE,oBAAC,UAAD;EACE,KAAK;EACL,WAAU;EACV,OAAO;GACL,OAAO;GACP;GACA,iBAAiB,MAAM;EACzB;CACD,CAAA;AAEL;;;AClMA,MAAM,EAAE,sBAAA,wBAAsB,kBAAA,uBAAqB;AAyCnD,MAAM,yBACJ,UACA,SACG;CACH,MAAM,EAAE,uBAAuB;CAC/B,OAAO,OAAO,uBAAuB,aACjC,mBAAmB,IAAa,IAChC,QAAQ,kBAAkB;AAChC;AAEA,MAAa,wBAGR,OAAO,QAAQ;CAClB,MAAM,EACJ,OACA,OACA,QACA,SACA,iBACA,WACA,YACA,aACA,oBACA,YACA,aACA,cACA,eACA,eACA,kBACA,iBACA,iBACA,sBACA,iBACA,wBACA,iBAAiB,kBACjB,oBACA,mBACA,eACA,4BACA,cACA,gBACA,qBACA,YACA,cACA,eACA,eACA,eACA,cACA,UACA,gBACA,QACA,QACA,QACA,SACA,UACA,aAC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CnC;CACF;CAEA,OACE,oBAACC,OAAD;EAAoB;EAClB,UAAA,oBAAC,OAAD;GAAK,KAAK;GAAc,OAAO;IAAE;IAAO;GAAO;GAC7C,UAAA,oBAAC,aAAD;IACS;IACA;IACC;IACC;IACS;IACH;IACD;IACO;IACN;IACF;IACO;IACN;IACC;IACA;IACE;IACA;IACjB,YAAY;IACZ,iBAAiB;IACL;IACC;IACb,WAAW;IACX,WAAW;IACX,aAAa;IACI;IACG;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,mBAAmB;IACnB,0BAA0B;IAC1B,mBAAmB;IACnB,sBAAsB;IACN;IACD;IACD;GACf,CAAA;EACE,CAAA;CACM,CAAA;AAEjB;;;ACrGA,MAAM,EACJ,cACA,iBACA,mBACA,kBACA,sBACA,uBACA,WAAW,kBACX,aAAa,oBACb,kBAAkB,8BAChB;AAEJ,MAAM,YAA4D,OAAO,eAAe;CACtF,MAAM,EACJ,SACA,iBACA,iBACA,mBACA,YAAA,OACA,aAAA,OACA,kBACA,mBAAmB,qBAAqB,GACxC,UAAU,gBACV,YAAY,kBACZ,cAAc,CAAC,EAAE,MAAA,WAA8B,CAAC,GAChD,qBAAqB,GACrB,OAAO,aACP,eACA,gBAAgB,MAChB,gBAAgB,MAChB,gBAAgB,cAChB,gBAAgB,cAChB,mBAAmB,MACnB,kBAAkB,MAClB,yBAAyB,MACzB,6BAA6B,MAC7B,uBAAuB,OACvB,OACA,aACA,eACA,cACA,gBACA,qBACA,aACA,qBAAqB,2BACrB,gBACA,QACA,QACA,QACA,SACA,UACA,aACA,aACA,cACA,cACA,gBACA,gBACA,gBACA,iBACA,aACA,eACA,oBACA,wBACA,gBACA,sBACA,qBACA,wBACA,yBACA,wBACA,yBACA,0BACA,eACA,aACA,iBACA,iBACA,mBACA,uBACE;CAEJ,oBAAoB,mBAAmB;EACrC,kBAAkB,oBAAoB,SAAS,WAAW;EAC1D,mBAAmB,mBAAmB,SAAS,OAAO,CAAC;EACvD,qBAAqB;EACrB,eAAe,cAAiC;GAC9C,oBAAoB,SAAS,aAAa,SAAS;EACrD;EACA,eAAe,aAAqB;GACl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,MAAM,KAAK,YAAY,WAAW;GAClC,IAAI,OAAO,WACT,SAAS,KAAA,GAAW,EAAE;EAE1B,SAAS,OAAO;GACd,QAAQ,MAAM,sBAAsB,KAAK;EAC3C;CACF,GACA;EAAC;EAAe;EAAa;EAAU;CAAa,CACtD;CAEA,MAAM,oBAAoB;EACxB,aAAa,SAAS,MAAM;CAC9B;CAEA,MAAM,EAAE,gBAAgB;CAExB,OAME,qBAAC,OAAD;EAAK,KAAI;EAAM,WAAU;EAAmB;EAAY;EAAxD,UAAA;GACE,oBAAC,OAAD;IACE,yBAAA;IACA,KAAK;IACL,UAAU;IACV,WAAU;IACG;IAEZ,UAAA,gBACC,oBAAC,YAAD;KACS;KACC;KACD;KACE;KACQ;KACL;KACC;KACA;KACO;KACL;KACD;KACE;KACK;KACP;KACC;KACA;KACG;KACC;KACC;KACH;KACA;KACA;KACH;KACC;KACC;KACD;KACA;KACL;KACG;KACA;KACC;KACC;KACC;KACK;KACG;KACC;KACL;IACrB,CAAA,IAED,oBAAC,kBAAD;KACE,KAAK;KACE;KACC;KACD;KACE;KACQ;KACN;KACC;KACgB;KACb;KACD;KACE;KACK;KACR;KACO;KACN;KACC;KACA;KACG;KACC;KACC;KACI;KACF;KACV;KACA;KACC;KACI;KACA;KACA;KACA;KACH;KACC;KACC;KACD;KACA;KACD;KACJ;KACF;KACA;KACA;KACC;KACC;KACG;KACA;KACA;KACC;KACA;KACE;KACD;KACC;KACA;KACC;KACI;KACG;KACA;KACC;KACA;KACC;KACN;KACJ;KACM;KACP;KACF;KACI;KACE;KACC;IACrB,CAAA;GAEA,CAAA;GAEL,oBAAC,kBAAD;IACE,KAAK;IACU;IACf,KAAK;IACL,MAAM;IACN,gBAAgB;IACC;IACjB,aAAa;IACb,cAAc;IACC;IACA;IACG;IACJ;IACd,SAAS;IACI;IACC;IACA;IACE;IACC;IACO;GACzB,CAAA;GAED,oBAAC,kBAAD;IACgB;IACE;IACD;IACF;IACE;GAChB,CAAA;GAED,oBAAC,gBAAD;IACc;IACG;IACF;IACE;GAChB,CAAA;EACE;;AAET;AAEA,MAAa,OAAO,WAAW,QAAQ"}
|